Анонимное сканирование портов при помощи hping3

Для реализации понадобится уверенные знания работы TCP/IP и желание понять. В результате мы получим возможность сканировать удаленную машину на открытые порты от чужого адреса по следующией схеме (картинка из мануала по nmap):



image

Теоретическое введение

Как можно увидеть на википедии, каждому отправляемому IP пакету назначается его номер (правда фрагментированные пакеты имеют один номер), хранимый в специальном 16ти битном поле. При переполнении поля счет начинается с нуля. Сделав 2 замера номеров сетевого пакета можно судить о сетевой активности наблюдаемого компьютера.
Установка TCP соединения происходит по схеме «тройного рукопожатия». Клиент посылает серверу пакет с установленным флагом SYN, сигнализирующим предложение создать соединение. В случае, если серверу удается создать socket для соединения, то он ответит клиенту пакетом с встречным предложением SYN и запросом на подтверждение ACK (где в свою очередь клиент подтверждает свое желание о создании TCP соединения пакетом с флагом ACK). В случае, если сервер отказывает в соединении, он отсылает клиенту отказ в виде пакета с флагом RST, на что свою очередь клиент грустно отмалчивается. Базируясь на этом различии мы и построим сканирование открытых портов от чужого имени.

Практика

Как заметил уважаемый vanaf, метод будет работать если сканируемый и сканирующий хосты находятся в одной подсети или если в разных то сканирующий и подставной хосты должны находятся в одной подсети. 
Для реализации мы будем использовать один из основных инструментов специалиста по компьютерной безопасностиhping3. В схеме участвуют 3 машины, условно названные атакующей, целевой и подставной, от имени которой мы будем вести сканирование. В роли подставной машины необходимо выбрать такую, которая генерирует минимальное количество трафика (в идеале не генерирует вовсе). Для того, что бы узнать эту интимную подробность подставной машины, мы будем общаться с ней и наблюдать за изменением номеров пакетов. В идеале, номер пакета при каждой нашей коммуникацией с ней должен возрастать на единицу, что означает что за этот промежуток времени она не вела больше коммуникаций. Для этого запустим hping следующим образом:

root@Atom:~# hping3 -r 192.168.2.140
HPING 192.168.2.140 (eth0 192.168.2.140): NO FLAGS are set, 40 headers + 0 data bytes
len=46 ip=192.168.2.140 ttl=128 id=25378 sport=0 flags=RA seq=0 win=0 rtt=0.2 ms
len=46 ip=192.168.2.140 ttl=128 id=+1 sport=0 flags=RA seq=1 win=0 rtt=0.3 ms
len=46 ip=192.168.2.140 ttl=128 id=+1 sport=0 flags=RA seq=2 win=0 rtt=0.2 ms
len=46 ip=192.168.2.140 ttl=128 id=+1 sport=0 flags=RA seq=3 win=0 rtt=0.2 ms
len=46 ip=192.168.2.140 ttl=128 id=+1 sport=0 flags=RA seq=4 win=0 rtt=0.2 ms
^C
--- 192.168.2.140 hping statistic ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.3 ms


Ключ -r говорит hping3 показывать прирост номера пакета. Как видим, с каждой нашей коммуникацией он растет на 1, то есть свободен от лишнего общения. Поставим этот процесс на бесконечный «ping» для мониторинга изменения id пакета. 
Далее, нам надо на целевую машину отправить предложение установить TCP соединение, причем предложение составленное специфическим образом: в поле источника пакета установим адрес подставной машины, на которую и будут идти ответы. Если указанный порт на целевой машине закрыт, то она пошлет подставной машине отказ (RST), что проигнорирует подставная машина. Если же порт открыт. то целевая машина пошлет встречное предложение установить соединение (SYN + ACK), на что подставная машина будет вынуждена ответить отказом, то есть пакетом с флагом (RST). Именно здесь мы обнаружим, что наша ранее отдыхающая машина кому-то что-то сказала именно в тот момент, когда мы отослали предложение на соединение от ее имени. Для избежания случайностей, эксперимент повторяется.
Послать запрос на соединение от чужого имени можно следующим образом:

root@Atom:~# hping3 -c 1 -S -a 192.168.2.140 192.168.2.1 -p 5222
HPING 192.168.2.1 (eth0 192.168.2.1): S set, 40 headers + 0 data bytes

--- 192.168.2.1 hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss

Где: -c 1 означает посылку только одного пакета;
-S установить флаг SYN
-a 192.168.2.140 в роли источника пакета установить адрес 192.168.2.140 (адрес подставной машины в нашем случае)
192.168.2.1 адрес целевой машины
-p 5222 целевой TCP порт

Ответа на пакет мы не получили потому что он ушел подставной машине вероятно вынуждать ее ответить отказом, что мы и обнаружим.
В случае, если порт открыт, мы увидим следующую картину:

len=46 ip=192.168.2.140 ttl=128 id=+1 sport=0 flags=RA seq=4 win=0 rtt=0.2 ms
len=46 ip=192.168.2.140 ttl=128 id=+1 sport=0 flags=RA seq=5 win=0 rtt=0.2 ms
len=46 ip=192.168.2.140 ttl=128 id=+2 sport=0 flags=RA seq=6 win=0 rtt=0.2 ms
len=46 ip=192.168.2.140 ttl=128 id=+1 sport=0 flags=RA seq=7 win=0 rtt=0.2 ms
len=46 ip=192.168.2.140 ttl=128 id=+1 sport=0 flags=RA seq=8 win=0 rtt=0.2 ms


Видите на 3й строке что подставная машина в тот самым момент успела пообщаться с кем-то еще? Скорее всего это отказ (RST) на предложение о взаимности (SYN + ACK), так подставная машина на самом деле не слала SYN. Для верности эксперимент повторяется.
Для удобства можно использовать ключи -i для задачи временного интервала и -p ++ увеличения порта на 1 с каждым пакетом.

Заключение

Этим же методом можно и забанить ничего не подозревающую подставную машину, если на целевой стоит система обнаружения вторжений. 
Это лишь один из множества впечатляющих применений hping3. Им можно пинговать когда icmp запрещен (он посылает пакет по TCP по умолчанию на нулевой порт). Так же может использоваться для передачи файлов даже через строго настроенные фаерволлы (хоть через пинг), работать как traceroute не только на основе icmp, но и UDP и TCP, помогает определить удаленную ОС, может быть весьма специфичным трояном и многое многое другое. Очень рекомендую познакомится с ним поближе. 

UPD:
Аналогичный трюк можно сделать при помощи nmap:nmap.org/book/idlescan.html