Stealth-сканирование портов
Pavel Martinov aka kurt
Xakep, номер #060, стр. 060-078-2
[ACK] acknowledgement:
Этот флаг сообщает о том, что ACK-поле содержит допустимое ACK-значение.
[PSH] push:
Если этот флаг включен, то TCP-модуль должен послать данные из сегмента к программе сразу, а не через буфер (если ты когда-нибудь пользовался телнетом, то поймешь, о чем я).
[RST] reset:
TCP-модуль посылает этот флаг, если возникли какие-нибудь проблемы с подключением.
[SYN] synchronize:
Этот флаг используется при подключении. Именно на этом флаге основан один из способов stealth-скана.
[FIN] finish:
С помощью FIN-флага отправитель хочет сообщить, что он закончил отправку данных. FIN-флаг закрывает установленное соединение.
Сознаюсь, я немного упростил назначения флагов, но пока хватит и этого. А тем, кто хочет углубиться в тему TCP-протокола, я предлагаю почитать RFC.
Все, на этом теория закончилась - дальше будет интереснее ;). Теперь перейдем непосредственно к теме статьи.
Scan, как он есть
Для начала рассмотрим самый простой способ скана, реализованного при помощи полноценного коннекта - connect() scan (nmap -sT). Допустим, хосту "А" необходимо соединиться с хостом "В". Вот как на самом деле это происходит (TCP connect):
1) A --SYN--> B /* А спрашивает В о соединении */
2) B --SYN/ACK--> A /* B отвечает А о возможности коннекта (SYN и ACK флаги)*/
3) A --ACK--> B /* A посылает B пакет с ACK флагом */
Если порт окажется закрытым, то соединение будет выглядеть так:
1) A --SYN--> B /* А посылает В пакет c SYN флагом */
2) B --RST--> A /* В отвечает А, что порт закрыт (RST флаг) */
Программная реализация connect() сканера довольно проста, т.к. все эти операции уже автоматически делаются самой функцией connect(). Отсюда такое большое количество сканеров, которые отличаются-то одним окном about.
SYN-сканирование или half-open
Фишка SYN-скана (nmap -sS) заключается в том, что при коннекте с машиной не происходит полноценного соединения (о чем и говорит название half-open - полуоткрытый). Поэтому на сканируемом сервере в обычных логах ничего не остается. К тому же такой способ меньше нагружает хост, чем при использовании функции connect(). Вот как выглядит SYN-скан на практике:
1) А --SYN--> B /* А посылает В запрос на коннект */
2) B --SYN/ACK--> A /* B отвечает А, что порт открыт */
3) - /* A ничего не посылает B */
Все очень просто: на 3 этапе хост "А" (т.е. мы) не посылает "В" пакета с ACK флагом. Отсюда и возникает этот неполный коннект. Но надо заметить, что далеко не всегда стоит полагаться на этот скан, т.к. уже довольно много утилит секут подобную фишку.
FIN-scan
Метод FIN-сканирования (nmap -sF) впервые предложил Uriel Maimon. Этот способ он подробно описал в 49 номере phrack (www.phrack.org/phrack/49/P49-15). Вся идея заключается в том, что не нужно делать вообще никакого соединения, а просто отослать пакет с флагом FIN. По стандарту (RFC 973), если порт закрыт, то ОС должна ответить пакетом с RST флагом, иначе она просто промолчит:
1) А --FIN--> B /* отсылаем FIN */
2) B --RST--> A /* порт закрыт */