В настоящее время я пытаюсь решить задачу «Захватить флаг», которая заключается в попытке повысить привилегии, воспользовавшись эксплойтом в скрипте bash.
Сначала скрипт делает следующее, чтобы получить все сокеты с протоколом TCP в состоянии LISTEN:
output=$($_netstat -ntpl 2> /dev/null | $_egrep '^t')
а затем он анализирует вывод за строкой. Одна из вещей, которую он делает для каждой строки:
if [[ "$cur_syn" == "0" || "$max_syn" != "$cur_syn" ]]
then continue
fi
$cur_syn
- это значение Recv-Q
возвращаемое netstat, а $max_syn
- это значение столбца Send-Q
.
Таким образом, только сокет, который находится в состоянии LISTEN и с Recv-Q!= 0 и Recv-Q == Send-Q пройдет эти проверки.
Человек netstat
утверждает, что:
Recv-Q
Установлено: Количество байтов, не скопированных пользовательской программой, подключенной к этому сокету. Прослушивание: начиная с ядра 2.6.18, этот столбец содержит текущее отставание синхронизации.
а также
Send-Q
Установлено: Количество байтов, не подтвержденных удаленным хостом. Прослушивание: начиная с ядра 2.6.18, этот столбец содержит максимальный размер журнала ожидания синхронизации.
Дело в том, что мне кажется, что я не могу создать сокет с Send-Q, отличным от 0.
Если моя интерпретация верна, значение Send-Q для сокета, который прослушивает, является максимальным размером backlog, который является параметром backlog
в функции listen(2) Си. Но даже когда я создаю сокет прослушивающего сервера с резервом размера 3, netstat
все равно сообщает Send-Q как 0! Что я делаю неправильно?
К вашему сведению, мне удалось внести изменения в Recv-Q
, подключив несколько клиентов к сокету сервера, который получил SIGSTOP. Recv-Q
поднимается до maximum size of the syn backlog + 1
, а затем все соединения отклоняются. Но увы, Send-Q
остается без изменений.