Нам понадобятся уверенные познания протоколов TCP/IP или желание их понять. В итоге мы сможем сканировать удаленные компьютеры на наличие открытых портов от чужого адреса, ниже наведена схема (изображение из мануала nmap):
Теоретическое введение
Каждый отправляемый IP-пакет получает свой номер (информация на википедии - ru.wikipedia.org/wiki/IP-пакет#IP-.D0.BF.D0.B0.D0.BA.D0.B5.D1.82 ), правда фрагментированные пакеты нумеруются одним общим номером, который храниться в специальном 16-ти битном поле. При переполнении 16-ти битного поля счет начинается с нуля. Сделав 2 замера номеров сетевых пакетов можно судить о том, какая сетевая активность на наблюдаемом компьютере.
TCP-соединение устанавливается после «тройного рукопожатия». Клиент отсылает серверу пакет с флагом SYN, который сигнализирует о предложении установить соединение. Если серверу удастся создать socket для установки соединения, то он отвечает клиенту пакетом со встречным предложением SYN и с запросом на подтверждение - ACK (клиент в свою очередь должен подтвердить свое желание создать TCP-соединение отослав пакет с флагом ACK). Если же сервер отказывает в соединении, то он посылает клиенту отказ - пакет с флагом RST, на что в свою очередь клиент отмалчивается. Базируясь на этой схеме мы и совершим сканирование портов от чужого имени.
Практика
Метод будет работать при условии что сканируемый и сканирующий хосты из одной подсети, если же они находятся разных, то сканирующий и подставной хосты должны быть из одной подсети.
Для реализации можно использовать один из основных инструментов специалиста компьютерной безопасности - hping3 ( hping.org ). В схеме будут участвовать 3 хоста, условно называемые атакующим, целевым и подставным, от имени которого мы и будем производить сканирование. В роли подставного хоста нужно выбрать такой, который генерирует минимум трафика (в идеале ничего не генерирует). Для того, чтоб узнать эту информацию о подставном хосте, мы будем "общаться" с ним и следить за изменением нумерации пакетов. В идеале, номер пакета с каждой нашей коммуникацией с подставным хостом должен увеличиваться на единицу, что говорит о том, что в этот промежуток времени он не вел больше коммуникаций. Запустим hping с такими параметрами:
root@elimS:~# hping3 -r
172.16.1.
150
HPING172.16.1.
150 (eth0172.16.1.
150): NO FLAGS are set, 40 headers + 0 data bytes
len=46 ip=172.16.1.
150 ttl=128 id=25478 sport=0 flags=RA seq=0 win=0 rtt=0.1 ms
len=46 ip=172.16.1.
150 ttl=128 id=+1 sport=0 flags=RA seq=1 win=0 rtt=0.2 ms
len=46 ip=172.16.1.
150 ttl=128 id=+1 sport=0 flags=RA seq=2 win=0 rtt=0.1 ms
len=46 ip=172.16.1.
150 ttl=128 id=+1 sport=0 flags=RA seq=3 win=0 rtt=0.1 ms
len=46 ip=172.16.1.
150 ttl=128 id=+1 sport=0 flags=RA seq=4 win=0 rtt=0.1 ms
^C
---172.16.1.
150
hping statistic ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.1/0.1/0.2 ms
Ключ -r говорит что надо показать увеличение номера пакета. Как видно, с каждым соединением он увеличивается на 1, то есть наблюдаемый хост не производит лишнее общение. Установим этот процесс наблюдения на нескончаемый «ping» для наблюдения за изменениями id пакета.
Теперь, нам нужно отправить предложение о установке TCP-соединения на целевую машину, при это предложение должно быть составлено таким образом: в поле отправителя пакета укажем адрес подставного хоста, на который и будут отправляться ответы от сканируемого сервера. Если указанный порт на целевом хосте закрыт, то он пошлет подставному хосту отказ (RST), который подставной хост проигнорирует. Но если порт открыт, то целевой хост пошлет подставному хосту встречное предложение (пакет) о установке соединение (SYN + ACK), на что подставной хост будет вынужден послать отказ, то есть пакет с флагом (RST). Вот здесь мы и обнаружим, что наш ранее отдыхающий хост кому-то что-то сказал именно тогда, когда мы отослали пакет с предложением на соединение от его имени. Во избежания всяких случайностей, эксперимент можно повторить.
Послать запрос для соединения от чужого имени можно таким образом:
root@elimS:~# hping3 -c 1 -S -a
172.16.1.
150172.16.1.
1-p 5223
HPING172.16.1.
1(eth0
172.16.1.
1): S set, 40 headers + 0 data bytes---
172.16.1.
1hping statistic ---
1 packets transmitted, 0 packets received, 100% packet loss
Где: -c 1 значит отсылку только одного пакета;
-S говорить о установке флага SYN
-a 172.16.1.
150 в роли отправителя пакета указать адрес 172.16.1.
150 (адрес подставного хоста)
172.16.1.
1 адрес целевого хоста
-p 5223 целевой TCP порт
Ответ на пакет мы не получим так-как он ушел подставному хосту, который вероятно вынудит его ответить отказывающим в соединении пакетом, что мы и увидим.
Если порт открыт, мы видим такую картину:
len=46 ip=
172.16.1.
150ttl=128 id=+1 sport=0 flags=RA seq=4 win=0 rtt=0.1 ms
len=46 ip=172.16.1.
150ttl=128 id=+1 sport=0 flags=RA seq=5 win=0 rtt=0.1 ms
len=46 ip=172.16.1.
150ttl=128 id=+2 sport=0 flags=RA seq=6 win=0 rtt=0.1 ms
len=46 ip=172.16.1.
150ttl=128 id=+1 sport=0 flags=RA seq=7 win=0 rtt=0.1 ms
len=46 ip=172.16.1.
150ttl=128 id=+1 sport=0 flags=RA seq=8 win=0 rtt=0.1 ms
На 3-й строке видим что подставной хост в тот самый момент успел "пообщаться" с кем-то еще. Скорее всего это был отказ (RST) на пакет с предложением взаимности (SYN + ACK), так-как подставной хост в действительности не слал SYN. Для верности эксперимент можем повторить.
Можно использовать ключ -i для указания временного интервала, -p ++ увеличение порта на 1 с каждым последующим пакетом.
Заключение
Таким же методом возможно и забанить ничего не подозревающего подставного хоста, если на целевом хосте установлена система обнаружения вторжений.
Это один из множества впечатляющих применений утилиты hping3. Ею можно пинговать когда icmp-траффик запрещен (посылается пакет по TCP на нулевой порт). Можно даже использовать для передачи файлов через строго настроенные фаерволлы (хоть через ping), работать как с traceroute, но не только с помощью icmp, но TCP или UDP, можно определить удаленную Операционную Систему, может быть специфическим трояном и многое чего другого. Рекомендую познакомится с этой утилитой поближе.
P.S.: аналогичное сканированние можно сделать с помощью nmap: nmap.org/book/idlescan.html
Перепечатано отсюда: http://habrahabr.ru/blogs/infosecurity/106752/