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 /* порт закрыт */

Назад на стр. 060-078-1  Содержание  Вперед на стр. 060-078-3