1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-kali-linux-network-scanning-cookbook-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
ch3.md 120 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 20:48 483ccac

Третья глава. Сканирование портов

Автор: Justin Hutchens

Переводчик: Flydragon

Протокол: CC BY-NC-SA 4.0

Следующим шагом после определения цели атаки является идентификация открытых портов на целевой системе. Открытые порты соответствуют сетевым сервисам, работающим на компьютере и подключённым к сети. Ошибки программирования или уязвимости в реализации могут привести к тому, что эти сервисы будут иметь уязвимости, которые иногда могут позволить полностью скомпрометировать систему. Чтобы определить возможные векторы атак, необходимо сначала перечислить все открытые порты на удалённых системах в рамках проекта. Эти открытые порты могут быть доступны через потоки UDP или TCP.

TCP и UDP — это транспортные протоколы. TCP чаще используется и обеспечивает ориентированное на соединение взаимодействие. UDP — это протокол, ориентированный на передачу данных без установления соединения, который иногда используется для передачи сервисов, где скорость передачи данных важнее целостности данных. Техника тестирования на проникновение, называемая сканированием портов, используется для перечисления этих сервисов. В отличие от обсуждения хоста обнаружения в предыдущей главе, эти методы должны предоставлять достаточно информации, чтобы определить, связан ли сервис с данным портом на устройстве или сервере.

Прежде чем обсуждать конкретные секреты, мы сначала обсудим некоторые основные принципы работы портов, которые вам следует понять.

3.1. Сканирование портов UDP

Поскольку TCP является более распространённым транспортным протоколом, службы UDP часто игнорируются. Хотя службы UDP по своей сути имеют тенденцию к игнорированию, они всё же могут быть перечислены и использованы для полного понимания инструментария любой заданной цели. Сканирование UDP обычно является сложным, трудоёмким и занимает много времени. Эта глава будет включать в себя три секрета о том, как выполнять сканирование UDP в Kali. Понимание сканирования UDP важно, поскольку оно может быть выполнено двумя различными способами. Один из методов будет подчёркивать первый секрет, он зависит только от ответа ICMP «порт недоступен». Этот тип сканирования предполагает, что любой UDP-порт, не привязанный к определённому сервису, вернёт ответ ICMP «порт недоступен». Таким образом, отсутствие такого ответа указывает на наличие сервиса. Хотя этот метод может быть очень эффективным в некоторых случаях, он также может давать неточные результаты, если хост не генерирует ответ «порт недоступен» или если ответ «порт недоступен» ограничен скоростью или фильтруется брандмауэром. Альтернативный метод будет объяснён во втором и третьем секретах и включает использование специфических для сервиса зондов для попытки инициировать ответ, указывающий на то, что ожидаемый сервис работает на целевом порту. Этот метод очень эффективен, но также очень трудоёмок.

3.2. Сканирование TCP

В этой главе будет обсуждаться несколько различных методов сканирования TCP. Эти методы включают скрытое сканирование, сканирование с подключением и сканирование зомби. Для понимания принципов этих методов сканирования важно понимать, как работает TCP при установлении и поддержании соединений. TCP — это ориентированный на подключение протокол, и данные могут передаваться через TCP только после того, как соединение установлено между двумя системами. Этот процесс обычно использует трёхстороннее рукопожатие для обозначения процесса установления соединения. Это содержимое косвенно относится к трём шагам процесса:

Рисунок 3-2-1: Процесс трёхстороннего рукопожатия TCP

Сканирование SYN пакета отправляется с устройства, желающего установить соединение, и содержит порт устройства. Если служба, связанная с принимающим портом, получает соединение, она отправит пакет TCP, содержащий флаги SYN и ACK. Соединение устанавливается только тогда, когда запрашивающая система отвечает пакетом TCP ACK. Этот трёхэтапный процесс устанавливает сеанс TCP между двумя системами. Все механизмы сканирования портов TCP выполняют различные вариации этого процесса для идентификации активных служб на удалённом хосте.

И сканирование с подключением, и скрытое сканирование легко понять. Сканирование с подключением устанавливает полное TCP-соединение для каждого сканируемого порта. То есть для каждого порта сканирования выполняется трёхстороннее рукопожатие. Если соединение успешно установлено, порт можно считать открытым. В качестве альтернативы скрытое сканирование не устанавливает полного соединения. Скрытое сканирование также называется сканированием SYN или полуоткрытым сканированием. Для каждого сканируемого порта отправляется один пакет SYN, направленный на целевой порт, и все порты, отвечающие пакетами SYN+ACK, считаются работающими активными службами. Поскольку исходная система не отправляет окончательный пакет ACK, соединение устанавливается только наполовину. Это называется скрытым сканированием, потому что журналы системы будут регистрировать только установленные соединения и не будут регистрировать какие-либо следы сканирования.

Последний метод сканирования TCP, обсуждаемый в этой главе, называется сканированием зомби. Цель сканирования зомби состоит в том, чтобы отобразить все открытые порты на удалённой системе, не оставляя никаких следов взаимодействия с системой. Принцип работы сканирования зомби довольно сложен. Процесс выполнения сканирования зомби требует соблюдения следующих шагов:

  1. Рассматривайте удалённую систему как своего зомби. Эта система должна соответствовать следующим характеристикам:

    • Система ограничена и не взаимодействует с другими системами в сети.
    • Система использует увеличивающийся порядковый номер IPID.
  2. Отправьте пакет SYN+ACK зомби-хосту и запишите начальный номер IPID.

  3. Подделайте исходный адрес пакета в пакете IP как IP-адрес зомби-хоста и отправьте его на целевой хост.

  4. Произойдёт одно из следующих событий в зависимости от состояния порта цели:

    • Если порт открыт, целевой хост ответит пакетом SYN+ACK, полагая, что зомби-хост отправил предыдущий запрос SYN. Здесь зомби-хост ответит RST пакетом на неожиданный пакет SYN+ACK и увеличит значение IPID на 1.
    • Если порт закрыт, целевой хост отправит RST-ответ зомби-хосту, полагая, что зомби-хост отправил предыдущий SYN-запрос. Если это значение увеличивается на 1, то последующие порты цели закрыты. Если это значение увеличится на 2, то порт цели открыт.
  5. Отправьте ещё один пакет SYN+ACK на зомби-хост и получите последний номер IPID в возвращённом RST-ответе. Если это значение увеличилось на 1, порт цели закрыт. Если оно увеличилось на 2, порт цели открыт.

Следующий рисунок показывает взаимодействие, которое происходит, когда зомби-хост используется для сканирования открытого порта.

Рисунок 3-2-2: Взаимодействие при сканировании зомби открытого порта

Чтобы выполнить сканирование зомби, первоначальный запрос SYN+SCK должен быть отправлен на зомби-систему, чтобы получить возвращаемый номер IPID в RST-пакете. Затем поддельный SYN-пакет отправляется на цель с исходным IP-адресом зомби-системы. Если порт открыт, цель ответит пакетом SYN+ACK. Поскольку это не фактический запрос SYN, отправленный зомби-системой, цель будет рассматривать его как неожиданный и ответит RST-запросом, увеличивая номер IPID на 1. Наконец, зомби-системе следует отправить ещё один SYN+ACK-запрос, который вернёт RST-пакет и снова увеличит номер IPID. Увеличение номера IPID на 2 указывает на то, что все события произошли и порт цели открыт. Напротив, если порт цели закрыт, произойдёт другой набор событий, в результате чего номер IPID RST-ответа увеличится только на 1.

На следующем рисунке показано взаимодействие, происходящее при сканировании закрытого порта с помощью зомби-хоста.

Рисунок 3-3-3: Взаимодействие при сканировании зомби закрытого порта

Если порт цели закрыт, RST-запрос является ответом на поддельный SYN-запрос зомби-хоста. Поскольку RST-запрос не был подделан, номер IPID зомби-системы не увеличится. Таким образом, последний номер IPID в возвращаемом RST-запросе увеличится только на 1. Этот процесс можно выполнить для каждого порта, который вы хотите просканировать, и он может использоваться для отображения открытых портов удалённой системы без оставления каких-либо следов сканирования.

3.3. Сканирование портов UDP с использованием Scapy

Scapy можно использовать для создания и внедрения пользовательских пакетов в сеть. В этом секрете Scapy будет использоваться для сканирования активных служб UDP. Это можно сделать, отправив пустые пакеты UDP на целевой порт и определив порты, которые не отвечают ICMP недоступностью порта, чтобы указать на работающие службы.

Подготовка

Для использования Scapy для сканирования UDP необходимо иметь сервер, работающий с UDP-сервисами. В этом примере мы будем использовать экземпляр Metasploitable2 для выполнения задачи. Дополнительную информацию о настройке Metasploitable2 см. в секрете «Установка Metasploitable2» в первой главе.

Кроме того, этот раздел также требует дополнительной информации о написании сценариев, см. первую главу «Использование текстовых редакторов VIM и Nano».

Шаги операции

Используя Scapy, мы можем быстро понять принцип работы сканирования UDP. Чтобы подтвердить, работает ли какая-либо служба на данном порту, нам нужно заставить сервер ответить. Это сложно, так как многие службы UDP отвечают только на запросы, специфичные для службы. Знание любой конкретной службы облегчит положительное распознавание этой службы. Однако существует несколько общих приёмов, которые можно использовать для определения того, работает ли служба на заданном порту UDP, и точность неплохая. Мы будем использовать Scapy для применения этой техники, которая заключается в обнаружении недоступности порта ICMP для закрытых портов. Чтобы отправить UDP-запрос на любой заданный порт, нам сначала нужно создать некоторые слои запроса, и первым слоем, который нам нужно построить, является слой IP. Слой, нам нужно присвоить объекту IP переменную i. С помощью вызова функции display мы можем определить конфигурацию свойств объекта. Обычно и адрес отправки, и адрес получения устанавливаются равными адресу возврата, 127.0.0.1. Эти значения можно изменить, задав i.dst как строковое значение адреса, который мы хотим просканировать. При повторном вызове функции dislay мы видим, что не только обновился целевой адрес, но и автоматически обновился исходный IP-адрес, связанный с интерфейсом по умолчанию. Теперь, когда у нас есть запрос IP-слоя, мы можем создать UDP-слой.

>>> u = UDP() 
>>> u.display() 
###[ UDP ]###  
    sport= domain  
    dport= domain  
    len= None  
    chksum= None 

Для создания запроса UDP-слоя мы используем ту же технику, что и для IP-слоя. В этом случае объект UDP присваивается переменной u. Как упоминалось ранее, значения по умолчанию для портов источника и назначения — «domain». Вы, наверное, уже догадались, что это означает порт 53, связанный с DNS-службой. DNS — это распространённая служба, которую обычно можно найти в сетевых системах. Чтобы убедиться в этом, мы можем напрямую обратиться к имени и номеру переменной, чтобы получить её значение. Затем мы можем изменить атрибут, установив новое значение порта назначения.

>>> u.dport = 123 
>>> u.display() 
###[ UDP ]###
    sport= domain  
    dport= ntp  
    len= None  
    chksum= None 

В приведённом выше примере порт назначения установлен на 123, что является портом NTP. Поскольку мы создали слои IP и UDP, нам необходимо сложить эти слои, чтобы сформировать запрос.

>>> request = (i/u) 
>>> request.display() 
###[ IP ]###  
    version= 4  
    ihl= None  
    tos= 0x0  
    len= None  
    id= 1  
    flags=   
    frag= 0  
    ttl= 64  
    proto= udp  
    chksum= None  
    src= 172.16.36.180  
    dst= 172.16.36.135  
    \options\ 
###[ UDP ]###     
    sport= domain     
    dport= ntp     
    len= None     
    chksum= None

Мы можем сложить слои IP и UDP, разделив переменные косой чертой. Этим слоям затем присваивается новая переменная, которая представляет весь запрос. Впоследствии мы можем вызвать функцию dispaly, чтобы просмотреть конфигурацию запроса. После того как запрос создан, его можно передать функции sr1 для анализа ответа:

>>> response = sr1(request) 
Begin emission: 
......Finished to send 1 packets. 
....*
Received 11 packets, got 1 answers, remaining 0 packets 
>>> response.display() 
###[ IP ]###  
    version= 4L  
    ihl= 5L  
    tos= 0xc0  
    len= 56  
    id= 63687  
    flags=   
    frag= 0L  
    ttl= 64  
    proto= icmp  
    chksum= 0xdfe1  
    src= 172.16.36.135  
    dst= 172.16.36.180  
    \options\ 
###[ ICMP ]###     
    type= dest-unreach     
    code= port-unreachable     
    chksum= 0x9e72     
    unused= 0 
###[ IP in ICMP ]###        
    version= 4L        
    ihl= 5L        
    tos= 0x0        
    len= 28        
    id= 1        
    flags=         
    frag= 0L        
    ttl= 64        
    proto= udp        
    chksum= 0xd974        
    src= 172.16.36.180        
    dst= 172.16.36.135        
    \options\
###[ UDP in ICMP ]###           
    sport= domain           
    dport= ntp           
    len= 8           
    chksum= 0x5dd2 

Тот же запрос можно выполнить без построения и наложения каждого слоя. Вместо этого мы используем одну команду, вызывая функцию напрямую и передавая соответствующие параметры:

>>> sr1(IP(dst="172.16.36.135")/UDP(dport=123)) 
..Begin emission: 
...*Finished to send 1 packets.

Received 6 packets, got 1 answers, remaining 0 packets 
<IP  version=4L ihl=5L tos=0xc0 len=56 id=63689 flags= frag=0L ttl=64 proto=icmp chksum=0xdfdf src=172.16.36.135 dst=172.16.36.180 options=[] |<ICMP  type=dest-unreach code=port-unreachable chksum=0x9e72 unused=0 |<IPerror  version=4L ihl=5L tos=0x0 len=28 id=1 flags= frag=0L ttl=64 proto=udp chksum=0xd974 src=172.16.36.180 dst=172.16.36.135 options=[] |<UDPerror  sport=domain dport=ntp len=8 chksum=0x5dd2 |>>>>

Обратите внимание, что ответ на этот запрос включает пакет ICMP, тип которого указывает на то, что хост недоступен, а код указывает на недоступность порта. Этот ответ обычно возвращается, когда порт UDP закрыт. Теперь мы должны попытаться изменить запрос так, чтобы он отправлял пакеты на соответствующий удалённый сервер на реальный порт службы. Для этого мы изменим порт назначения на 53 и отправим запрос ещё раз:

>>> response = sr1(IP(dst="172.16.36.135")/UDP(dport=53),timeout=1,verbo se=1) 
Begin emission: 
Finished to send 1 packets.

Received 8 packets, got 0 answers, remaining 1 packets

Когда тот же запрос отправляется на реальную службу, ответа не получено. Это связано с тем, что служба DNS работает на порту UDP 53 системы и отвечает только на запросы, связанные со службой. Это различие можно использовать для сканирования ответов ICMP, определяя потенциальные службы путём сканирования портов, которые не отвечают:

#!/usr/bin/python

import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

from scapy.all import * 
import time 
import sys

if len(sys.argv) != 4:   
    print "Usage - ./udp_scan.py [Target-IP] [First Port] [Last Port]"   
    print "Example - ./udp_scan.py 10.0.0.5 1 100"   
    print "Example will UDP port scan ports 1 through 100 on 10.0.0.5" 
sys.exit()

ip = sys.argv[1] 
start = int(sys.argv[2]) 
end = int(sys.argv[3])

for port in range(start,end):   
    ans = sr1(IP(dst=ip)/UDP(dport=port),timeout=5,verbose=0)   
    time.sleep(1)   
    if ans == None:      
        print port   
    else:      
        pass 

Приведённый выше скрипт на Python отправляет запросы UDP на последовательность первых ста портов на указанный целевой IP-адрес. Здесь не было получено никакого ответа, поэтому порт можно считать открытым. Запустив этот скрипт, мы сможем идентифицировать все порты, которые не возвращают ICMP. Невозможно определить основной язык текста запроса, так как он содержит фрагменты на разных языках.

Перевод:

Недостижимые порты:

root@KaliLinux:~# chmod 777 udp_scan.py 
root@KaliLinux:~# ./udp_scan.py
Usage - ./udp_scan.py [Target-IP] [First Port] [Last Port]
Example - ./udp_scan.py 10.0.0.5 1 100
Пример будет сканировать порты UDP от 1 до 100 на 10.0.0.5
root@KaliLinux:~ # ./udp_scan.py 172.16.36.135 1 100
53
68
69

Таймаут составляет 5 секунд для приёма ICMP недоступных портов. Даже при наличии большего окна приёма ответов, такой способ сканирования иногда ненадёжен. Именно поэтому сканирование с помощью UDP зондирования является более эффективным решением.

Принцип работы

В этом секрете сканирование UDP определяет недостижимые порты путём идентификации портов, которые не отвечают ICMP недостижимым ответом. Этот процесс занимает много времени, поскольку ответы ICMP обычно ограничены по скорости. Иногда для систем, которые не генерируют такие ответы, этот метод может быть ненадёжным, и ICMP часто фильтруется брандмауэрами. Альтернативный подход заключается в использовании специфических для службы зондов для запроса положительных ответов. Эта техника будет продемонстрирована в следующих двух секретах.

3.4 Nmap UDP сканирование

Nmap имеет возможность выполнять удалённое сканирование системы с использованием UDP. Сканирование UDP в Nmap более сложное и использует инъекцию специфичных для службы запросов для запроса положительных ответов, чтобы подтвердить существование указанной службы и идентифицировать активные службы. В этом секрете показано, как использовать Nmap для сканирования одного порта, нескольких портов или даже нескольких систем.

Подготовка

Для использования Nmap для выполнения сканирования UDP вам потребуется удалённая система, которая предоставляет сетевые услуги UDP. В данном примере мы используем экземпляр Metasploitable2 для выполнения задачи. Для получения дополнительной информации о настройке Metasploitable2 обратитесь к секрету «Установка Metasploitable2» в первой главе.

Шаги операции

Сканирование UDP обычно является сложным, затратным по времени и утомительным процессом. Многие системы ограничивают ответы ICMP хост недоступен, и увеличение количества сканируемых портов или времени, необходимого для сканирования большого количества систем, может значительно увеличить общее время сканирования. К счастью, разработчики Nmap создали более сложные и эффективные инструменты для идентификации служб UDP на удалённых системах. Чтобы использовать Nmap для сканирования UDP, необходимо использовать опцию -sU и указать IP-адрес хоста, который вы хотите просканировать.

root@KaliLinux:~# nmap -sU 172.16.36.135

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:04 EST
Nmap scan report for 172.16.36.135
Host is up (0.0016s latency).
Not shown: 993 closed ports
PORT     STATE         SERVICE
53/udp   open          domain
68/udp   open|filtered dhcpc
69/udp   open|filtered tftp
111/udp  open          rpcbind
137/udp  open          netbios-ns
138/udp  open|filtered netbios-dgm
2049/udp open          nfs
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 1043.91 seconds

Хотя Nmap использует специфические для различных служб нагрузки для запроса ответов UDP портов, по умолчанию требуется значительное количество времени для сканирования 1000 портов без указания конкретных портов с помощью других параметров. Из метаданных сканирования видно, что сканирование по умолчанию занимает почти 20 минут. В качестве альтернативы мы можем сократить необходимое время сканирования, используя следующие параметры для целевого сканирования:

root@KaliLinux:~# nmap 172.16.36.135 -sU -p 53


Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:05 EST
Nmap scan report for 172.16.36.135
Host is up (0.0010s latency).
PORT   STATE SERVICE
53/udp open  domain
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 13.09 seconds

Если мы укажем конкретные порты для сканирования, время, необходимое для сканирования UDP, можно значительно сократить. Это достигается путём выполнения сканирования UDP и использования опции -p для указания портов. В следующем примере мы сканируем только порт 53, пытаясь обнаружить службу DNS. Можно также указать несколько портов для сканирования, например:

root@KaliLinux:~# nmap 172.16.36.135 -sU -p 1-100

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:06 EST
Nmap scan report for 172.16.36.135
Host is up (0.00054s latency).
Not shown: 85 open|filtered ports
PORT   STATE  SERVICE
8/udp  closed unknown
15/udp closed unknown
28/udp closed unknown
37/udp closed time
45/udp closed mpm
49/udp closed tacacs
53/udp open   domain
56/udp closed xns-auth
70/udp closed gopher
71/udp closed netrjs-1
74/udp closed netrjs-4
89/udp closed su-mit-tg
90/udp closed dnsix
95/udp closed supdup
96/udp closed dixie
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 23.56 seconds

В этом примере сканирование выполняется на первых 100 портах. Это делается с помощью символа тире и указания первого и последнего портов. Nmap затем запускает несколько процессов, одновременно сканируя множество портов между этими двумя значениями. В некоторых случаях анализ UDP должен выполняться на нескольких системах. Можно использовать символ тире и определить диапазон последнего IP-адреса, чтобы просканировать диапазон хостов.

root@KaliLinux:~# nmap 172.16.36.0-255 -sU -p 53

Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-17 21:08 EST
Nmap scan report for 172.16.36.1
Host is up (0.00020s latency).
PORT   STATE  SERVICE
53/udp closed domain
MAC Address: 00:50:56:C0:00:08 (VMware)

Nmap scan report for 172.16.36.2
Host is up (0.039s latency).
PORT   STATE  SERVICE
53/udp closed domain
MAC Address: 00:50:56:FF:2A:8E (VMware)

Nmap scan report for 172.16.36.132
Host is up (0.00065s latency).
PORT   STATE  SERVICE
53/udp closed domain
MAC Address: 00:0C:29:65:FC:D2 (VMware)

Nmap scan report for 172.16.36.135
Host is up (0.00028s latency).
PORT   STATE SERVICE
53/udp open  domain
MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 256 IP addresses (6 hosts up) scanned in 42.81 seconds

Этот пример сканирует все активные хосты в диапазоне 172.16.36.0/24. Каждый хост сканируется для определения, работает ли служба DNS на порту 53. Другой альтернативой для сканирования нескольких хостов является использование списка IP-адресов. Для этого используется опция -iL и указывается путь к файлу с именами хостов или полный путь к файлу в том же каталоге. Пример последнего случая:

root@KaliLinux:~# nmap -iL iplist.txt -sU -p 123

Starting Nmap 6.25 (
``` Этот пример показывает выполнение сканирования для определения того, работает ли служба NTP на порту 123 в текущем каталоге с файлом iplist.txt на любых системах.

### Принцип работы

Хотя Nmap всё ещё содержит множество вызовов, связанных с UDP-сканированием, он остаётся крайне эффективным решением, поскольку использует наиболее эффективные и быстрые методы для идентификации активных служб.

## 3.5. Metasploit UDP-сканирование

Metasploit имеет вспомогательный модуль, который можно использовать для сканирования определённых стандартных портов UDP. Этот секрет показывает, как использовать этот вспомогательный модуль для сканирования одной или нескольких систем, на которых запущена служба UDP.

### Подготовка

Для использования Metasploit для UDP-сканирования вам нужен удалённый сервер, на котором запущена служба UDP. В этом примере мы используем экземпляр Metasploitable2 для выполнения задачи. Для получения дополнительной информации о настройке Metasploitable2 см. секрет «Установка Metasploitable2» в первой главе.

### Шаги

Перед определением модуля, который будет запущен, необходимо открыть Metasploit. Чтобы открыть его в Kali, мы выполняем команду msfconsole в сеансе терминала.

root@KaliLinux:~# msfconsole

cowsay++


< metasploit >

    \   ,__,       
     \  (oo)____           
        (__)    )\           
           ||--|| *

Large pentest? List, sort, group, tag and search your hosts and services in Metasploit Pro -- type 'go_pro' to launch it now.

   =[ metasploit v4.6.0-dev [core:4.6 api:1.0] 
  • -- --=[ 1053 exploits - 590 auxiliary - 174 post
  • -- --=[ 275 payloads - 28 encoders - 8 nops

msf > use auxiliary/scanner/discovery/udp_sweep msf auxiliary(udp_sweep) > show options

Module options (auxiliary/scanner/discovery/udp_sweep):

Name       Current Setting  Required  Description   
----       ---------------  --------  ----------   
BATCHSIZE  256              yes       The number of hosts to probe in each set   
CHOST                       no        The local client address   
RHOSTS                      yes       The target address range or CIDR identifier   
THREADS    1                yes       The number of concurrent threads

Чтобы запустить UDP-модуль сканирования в Metasploit, мы вызываем команду use с относительным путём к модулю. После выбора модуля вы можете использовать команду show options, чтобы подтвердить или изменить конфигурацию сканирования. Эта команда отображает таблицу из четырёх столбцов, включая имя, текущие настройки, обязательные и описание. Столбец имени указывает имя каждой настраиваемой переменной. Текущий столбец настроек перечисляет текущую конфигурацию любой заданной переменной. Обязательный столбец указывает, является ли значение обязательным для любой данной переменной. Столбец описания описывает функцию каждой переменной. Значение любой заданной переменной можно изменить с помощью команды set, указав новое значение в качестве параметра.

msf auxiliary(udp_sweep) > set RHOSTS 172.16.36.135 RHOSTS => 172.16.36.135 msf auxiliary(udp_sweep) > set THREADS 20 THREADS => 20 msf auxiliary(udp_sweep) > show options

Module options (auxiliary/scanner/discovery/udp_sweep):

Name       Current Setting  Required  Description   
----       ---------------  --------  ----------   
BATCHSIZE  256              yes       The number of hosts to probe in each set   
CHOST                       no        The local client address   
RHOSTS     172.16.36.135    yes       The target address range or CIDR identifier   
THREADS    20               yes       The number of concurrent threads

В приведённом выше примере значение RHOSTS было изменено на IP-адрес удалённой системы, которую мы хотим просканировать. Кроме того, количество потоков было изменено на 20. Значение THREADS определяет количество текущих задач, выполняемых в фоновом режиме. Определение количества потоков включает поиск баланса между ускорением задачи и предотвращением чрезмерного использования системных ресурсов. Для большинства систем 20 потоков могут быть достаточно быстрыми и относительно разумными. После изменения необходимых переменных вы можете снова использовать команду show options для проверки. Как только необходимая конфигурация проверена, сканирование может быть выполнено.

msf auxiliary(udp_sweep) > run

[] Sending 12 probes to 172.16.36.135->172.16.36.135 (1 hosts) [] Discovered Portmap on 172.16.36.135:111 (100000 v2 TCP(111), 100000 v2 UDP(111), 100024 v1 UDP(36429), 100024 v1 TCP(56375), 100003 v2 UDP(2049), 100003 v3 UDP(2049), 100003 v4 UDP(2049), 100021 v1 UDP(34241), 100021 v3 UDP(34241), 100021 v4 UDP(34241), 100003 v2 TCP(2049), 100003 v3 TCP(2049), 100003 v4 TCP(2049), 100021 v1 TCP(50333), 100021 v3 TCP(50333), 100021 v4 TCP(50333), 100005 v1 UDP(47083), 100005 v1 TCP(57385), 100005 v2 UDP(47083), 100005 v2 TCP(57385), 100005 v3 UDP(47083), 100005 v3 TCP(57385)) [*]


(METASPLOITABLE:<00>:U :METASPLOITABLE:<03>:U :METASPLOITABLE:<20>:U :__MSBROWSE__:<01>:G :WORKGROUP:<00>:G :WORKGROUP:<1d>:U :WORKGROUP:<1e>:G :00:00:00:00:00:00)

**Обнаружен DNS на 172.16.36.135:53 (BIND 9.4.2)**

*Обнаружено 1 из 1 хостов (100% выполнено)*

*Завершено выполнение вспомогательного модуля*

В Metasploit команда run используется для выполнения выбранного вспомогательного модуля. В приведённом выше примере команда run выполняет UDP-сканирование указанного IP-адреса. Модуль udp_sweep также можно использовать с символом дефиса, чтобы выполнить сканирование последовательности адресов.*


msf auxiliary(udp_sweep) > set RHOSTS 172.16.36.1-10
RHOSTS => 172.16.36.1-10
msf auxiliary(udp_sweep) > show options

Module options (auxiliary/scanner/discovery/udp_sweep):

    Name       Current Setting  Required  Description   
    ----       ---------------  --------  ----------   
    BATCHSIZE  256              yes       The number of hosts to probe in each set   
    CHOST                       no        The local client address   
    RHOSTS     172.16.36.1-10   yes       The target address range or CIDR identifier   
    THREADS    20               yes       The number of concurrent threads

msf auxiliary(udp_sweep) > run

[*] Sending 12 probes to 172.16.36.1->172.16.36.10 (10 hosts)
[*] Discovered NetBIOS on 172.16.36.1:137 (MACBOOKPRO-3E0F:<00>:U :00:50:56:c0:00:08)
[*] Discovered NTP on 172.16.36.1:123 (NTP v4 (unsynchronized))
[*] Discovered DNS on 172.16.36.2:53 (BIND 9.3.6-P1-RedHat-9.3.6-20. P1.el5_8.6)
[*] Scanned 10 of 10 hosts (100% complete)
[*] Auxiliary module execution completed

В приведённом примере UDP-сканирование выполняется для 10 IP-адресов хостов, которые заданы переменной RHOSTS. Аналогично, переменная RHOSTS может использоваться с нотацией CIDR для определения диапазона сети, например:

msf auxiliary(udp_sweep) > set RHOSTS 172.16.36.0/24
RHOSTS => 172.16.36.0/24
msf auxiliary(udp_sweep) > show options

Module options (auxiliary/scanner/discovery/udp_sweep):

   Name       Current Setting  Required  Description   
   ----       ---------------  --------  ----------   
   BATCHSIZE  256              yes       The number of hosts to probe in each set   
   CHOST                       no        The local client address   
   RHOSTS     172.16.36.0/24   yes       The target address range or CIDR identifier   
   THREADS    20               yes       The number of concurrent threads

msf auxiliary(udp_sweep) > run

[*] Sending 12 probes to 172.16.36.0->172.16.36.255 (256 hosts)
[*] Discovered Portmap on 172.16.36.135:111 (100000 v2 TCP(111), 100000 v2 UDP(111), 100024 v1 UDP(36429), 100024 v1 TCP(56375), 100003 v2 UDP(2049), 100003 v3 UDP(2049), 100003 v4 UDP(2049), 100021 v1 UDP(34241), 100021 v3 UDP(34241), 100021 v4 UDP(34241), 100003 v2 TCP(2049), 100003 v3 TCP(2049), 100003 v4 TCP(2049), 100021 v1 TCP(50333), 100021 v3 TCP(50333), 100021 v4 TCP(50333), 100005 v1 UDP(47083), 100005 v1 TCP(57385), 100005 v2 UDP(47083), 100005 v2 TCP(57385), 100005 v3 UDP(47083), 100005 v3 TCP(57385))
[*] Discovered NetBIOS on 172.16.36.135:137 (METASPLOITABLE:<00>:U :METASPLOITABLE:<03>:U :METASPLOITABLE:<20>:U :__MSBROWSE__:<01>:G :WORKGROUP:<00>:G :WORKGROUP:<1d>:U :WORKGROUP:<1e>:G :00:00:00:00:00:00)
[*] Discovered NTP on 172.16.36.1:123 (NTP v4 (unsynchronized))
[*] Discovered NetBIOS on 172.16.36.1:137 (MACBOOKPRO-3E0F:<00>:U :00:50:56:c0:00:08) [*] Discovered DNS on 172.16.36.0:53 (BIND 9.3.6-P1-RedHat-9.3.6-20. P1.el5_8.6)

[*] Discovered DNS on 172.16.36.2:53 (BIND 9.3.6-P1-RedHat-9.3.6-20. P1.el5_8.6)
[*] Discovered DNS on 172.16.36.135:53 (BIND 9.4.2)
[*] Discovered DNS on 172.16.36.255:53 (BIND 9.3.6-P1-RedHat-9.3.6-20. P1.el5_8.6)
[*] Scanned 256 of 256 hosts (100% complete)
[*] Auxiliary module execution completed

Принцип работы

UDP-сканер в Metasploit проще, чем Nmap. Он ориентирован только на ограниченное количество сервисов, но более эффективен в обнаружении активных сервисов на портах и работает быстрее, чем другие доступные UDP-сканеры. Текст запроса:

标识为都被激活。ACK 为仅仅用于承认请求被接受,RST 为用于断开连接,因为端口不接受连接。作为替代,如果 SYN 封包发往崩溃的系统,或者防火墙过滤了这个请求,就可能接受不到任何信息。由于这个原因,在sr1 函数在脚本中使用时,应该始终使用timeout选项,来确保脚本不会在无响应的主机上挂起。

Перевод текста на русский язык:

Идентификаторы были активированы. ACK используется только для подтверждения того, что запрос был принят, RST используется для разрыва соединения, поскольку порт не принимает соединение. В качестве альтернативы, если SYN-пакет отправляется в систему, которая потерпела крах, или если этот запрос фильтруется брандмауэром, то, возможно, не будет получено никакой информации. По этой причине при использовании функции sr1 в сценарии всегда следует использовать опцию timeout, чтобы гарантировать, что сценарий не зависнет на хосте без ответа. Отчет о сканировании Nmap для 172.16.36.2

Хост в сети (задержка 0,00047 с). ПОРТ СОСТОЯНИЕ СЕРВИС 80/tcp закрыт http MAC-адрес: 00:50:56:FF:2A:8E (VMware)

Отчет о сканировании Nmap для 172.16.36.132

Хост в сети (задержка 0,00034 с). ПОРТ СОСТОЯНИЕ СЕРВИС 80/tcp закрытый http MAC-адрес: 00:0C:29:65:FC:D2 (VMware)

Отчёт о сканировании Nmap для 172.16.36.135

Хост в сети (задержка 0,00016 с). ПОРТ СОСТОЯНИЕ СЕРВИС 80/tcp открыт http MAC-адрес: 00:0C:29:3D:84:32 (VMware)

Nmap завершён: просканировано 4 IP-адреса (4 хоста в сети), время сканирования — 13,05 секунд.

Принцип работы

Принцип работы Nmap SYN-сканирования уже обсуждался. Однако Nmap имеет многопоточную функцию, которая используется для быстрого и эффективного выполнения такого рода сканирования.

Metasploit: скрытое сканирование

Помимо других уже обсуждённых инструментов, Metasploit имеет вспомогательные модули для SYN-сканирования. Этот секрет показывает, как использовать Metasploit для выполнения скрытого TCP-сканирования.

Подготовка

Чтобы использовать Metasploit для скрытого TCP-сканирования, вам нужен удалённый сервер, на котором работает TCP-сетевой сервис. В этом примере мы используем экземпляр Metasploitable2 для выполнения задачи. Для получения дополнительной информации о настройке Metasploitable2 см. раздел «Установка Metasploitable2» в первой главе.

Шаги операции

Metasploit имеет вспомогательный модуль, который может выполнять SYN-сканирование определённых TCP-портов. Чтобы запустить Metasploit в Kali, мы выполняем команду msfconsole в терминале.

root@KaliLinux:~# msfconsole 
IIIIII    dTb.dTb        _.---._
  II     4'  v  'B   .'"".'/|\`.""'.  
  II     6.     .P  :  .' / | \ `.  :  
  II     'T;. .;P'  '.'  /  |  \  `.'  
  II      'T; ;P'    `. /   |   \ .' 
IIIIII     'YvP'       `-.__|__.-'

I love shells --egypt

Using notepad to track pentests? Have Metasploit Pro report on hosts, services, sessions and evidence -- type 'go_pro' to launch it now.

       =[ metasploit v4.6.0-dev [core:4.6 api:1.0] 
+ -- --=[ 1053 exploits - 590 auxiliary - 174 post 
+ -- --=[ 275 payloads - 28 encoders - 8 nops

msf > use auxiliary/scanner/portscan/syn 
msf  auxiliary(syn) > show options

Module options (auxiliary/scanner/portscan/syn):
   
    Name       Current Setting  Required  Description   
    ----       ---------------  --------  ----------   
    BATCHSIZE  256              yes       The number of hosts to scan per set   
    INTERFACE                   no        The name of the interface   
    PORTS      1-10000          yes       Ports to scan (e.g. 2225,80,110-900)   
    RHOSTS                      yes       The target address range or CIDR identifier   
    SNAPLEN    65535            yes       The number of bytes to capture   
    THREADS    1                yes       The number of concurrent threads   
    TIMEOUT    500              yes       The reply read timeout in milliseconds 

Для выполнения SYN-сканирования в Metasploit необходимо вызвать команду use, указав относительный путь к вспомогательному модулю. После выбора модуля можно выполнить команду show options, чтобы подтвердить или изменить конфигурацию сканирования. Эта команда отображает таблицу из четырёх столбцов, включая name, current settings, required и description. Столбец name содержит имена всех настраиваемых переменных. Столбец current settings содержит текущую конфигурацию любой заданной переменной. Столбец required указывает, является ли значение обязательным для любой данной переменной. Столбец description описывает функцию каждой переменной. Значение любой заданной переменной можно изменить с помощью команды set, используя новое значение в качестве параметра.

msf  auxiliary(syn) > set RHOSTS 172.16.36.135 
RHOSTS => 172.16.36.135 
msf  auxiliary(syn) > set THREADS 20 
THREADS => 20 
msf  auxiliary(syn) > set PORTS 80 
PORTS => 80 
msf  auxiliary(syn) > show options

Module options (auxiliary/scanner/portscan/syn):

   Name       Current Setting  Required  Description   
   ----       ---------------  --------  ----------   
   BATCHSIZE  256              yes       The number of hosts to scan per set
   INTERFACE                   no        The name of the interface   
   PORTS      80               yes       Ports to scan (e.g. 2225,80,110-900)   
   RHOSTS     172.16.36.135    yes       The target address range or CIDR identifier   
   SNAPLEN    65535            yes       The number of bytes to capture   
   THREADS    20               yes       The number of concurrent threads   
   TIMEOUT    500              yes       The reply read timeout in milliseconds

В приведённом выше примере значение RHOSTS было изменено на IP-адрес удалённой системы, которую мы хотим сканировать. Кроме того, количество потоков было изменено на 20. Значение THREADS определяет количество текущих задач, выполняемых в фоновом режиме. Определение количества потоков включает в себя поиск баланса между ускорением задачи и чрезмерным использованием системных ресурсов. Для большинства систем 20 потоков могут быть достаточно быстрыми и относительно разумными. Значение PORTS установлено равным TCP-порту 80 (HTTP). После изменения необходимых переменных можно снова использовать команду show options для проверки. Как только необходимая конфигурация будет проверена, можно выполнить сканирование.

msf  auxiliary(syn) > run

[*] TCP OPEN 172.16.36.135:80 [*] Scanned 1 of 1 hosts (100% complete) 
[*] Auxiliary module execution completed

Команда run в Metasploit используется для запуска выбранного вспомогательного модуля. В приведённом примере команда run выполнила сканирование TCP SYN против порта 80. В приведённом тексте описывается выполнение TCP SYN сканирования на удалённом хосте с использованием инструмента Metasploit Framework.

В рамках сканирования выполняется проверка доступности различных портов на целевом IP-адресе. Сначала проверяется несколько конкретных портов, указанных в команде: 21, 22, 23, 25, 53, 80. Затем выполняется сканирование всех портов от 0 до 65535. В результате сканирования обнаруживаются открытые порты на целевом хосте.

Также в тексте упоминается возможность сканирования последовательности IP-адресов с помощью указания начального и конечного значений через тире. **CIDR identifier**  
   SNAPLEN    65535            yes       Количество байт для захвата   
   THREADS    20               yes       Количество одновременных потоков   
   TIMEOUT    500              yes       Время ожидания ответа в миллисекундах

msf auxiliary(syn) > run

[*] TCP OPEN 172.16.36.135:80 
[*] Сканировано 256 из 256 хостов (100% завершено) 
[*] Выполнение вспомогательного модуля завершено

В этом примере выполнение вспомогательного модуля TCP SYN-сканирования происходит на порту 80 всех адресов, заданных переменной RHOST. Переменная RHOSTS может использовать нотацию CIDR для определения диапазона сети.

msf  auxiliary(syn) > set RHOSTS 172.16.36.0/24 
RHOSTS => 172.16.36.0/24 
msf  auxiliary(syn) > show options

Module options (auxiliary/scanner/portscan/syn):

   Name       Current Setting  Required  Description   
   ----       ---------------  --------  ----------   
   BATCHSIZE  256              yes       The number of hosts to scan per set   
   INTERFACE                   no        The name of the interface   
   PORTS      80               yes       Ports to scan (e.g. 2225,80,110-900)   
   RHOSTS     172.16.36.0/24   yes       The target address range or CIDR identifier   
   SNAPLEN    65535            yes       The number of bytes to capture   
   THREADS    20               yes       The number of concurrent threads   
   TIMEOUT    500              yes       The reply read timeout in milliseconds
   
msf  auxiliary(syn) > run

[*] TCP OPEN 172.16.36.135:80 
[*] Сканировано 256 из 256 хостов (100% завершено) 
[*] Выполнение вспомогательного модуля завершено

Принцип работы

Metasploit SYN-сканирование использует тот же базовый принцип, что и другие инструменты SYN-сканирования. Для каждого сканируемого порта отправляется SYN-пакет. SYN+ACK-пакеты используются для идентификации активных служб. Metasploit может быть более привлекательным, поскольку он имеет интерактивную консоль управления и является инструментом, который знаком большинству пентестеров.

7.9 Скрытое сканирование с помощью hping3

Помимо методов разведки, которые мы изучили ранее, hping3 также можно использовать для выполнения сканирования портов. Этот раздел демонстрирует, как использовать hping3 для выполнения скрытого TCP-сканирования.

Подготовка

Чтобы использовать hping3 для скрытого TCP-сканирования, вам нужен удалённый сервер, на котором работает TCP-сетевая служба. В этом примере мы используем экземпляр Metasploitable2 для выполнения задачи. Для получения дополнительной информации о настройке Metasploitable2 см. раздел «Установка Metasploitable2» в первой главе.

Шаги

Помимо методов разведки, которые мы изучили ранее, hping3 также можно использовать для выполнения сканирования портов. Чтобы использовать hping3 для сканирования портов, нам нужно указать номер порта для сканирования с помощью опции --scan.

root@KaliLinux:~# hping3 172.16.36.135 --scan 80 -S 
Scanning 172.16.36.135 (172.16.36.135), port 80 
1 ports to scan, use -V to see all the replies 
+----+-----------+---------+---+-----+-----+-----+ 
|port| serv name |  flags  |ttl| id  | win | len | 
+----+-----------+---------+---+-----+-----+-----+   
   80 http       : .S..A...  64     0  5840    46 
All replies received. Done. 
Not responding ports: 

В приведённом выше примере SYN-сканирование выполняется на указанном IP-адресе для TCP-порта 80. Опция -S указывает на то, что в пакетах, отправляемых удалённой системе, активирован флаг TCP. Таблица показывает свойства полученных ответных пакетов. Из вывода видно, что был получен ответ SYN+ACK, поэтому целевой порт 80 открыт. Кроме того, мы можем сканировать несколько портов, вводя список номеров портов, разделенных пробелами, например:

root@KaliLinux:~# hping3 172.16.36.135 --scan 22,80,443 -S 
Scanning 172.16.36.135 (172.16.36.135), port 22,80,443 
3 ports to scan, use -V to see all the replies
+----+-----------+---------+---+-----+-----+-----+ 
|port| serv name |  flags  |ttl| id  | win | len | 
+----+-----------+---------+---+-----+-----+-----+   
   22 ssh        : .S..A...  64     0  5840    46   
   80 http       : .S..A...  64     0  5840    46 
All replies received. Done. 
Not responding ports: 

Из приведённого выше вывода сканирования видно, что отображаются только результаты, связанные с получением ответов SYN+ACK. Следует отметить, что ответ, связанный с отправкой запроса SYN на порт 443, не отображается. Из вывода можно увидеть, что мы можем увеличить уровень детализации, используя опцию -v, чтобы просмотреть все ответы. Кроме того, можно сканировать диапазон портов, передавая первый и последний номера портов, например:

root@KaliLinux:~# hping3 172.16.36.135 --scan 0-100 -S 
Scanning 172.16.36.135 (172.16.36.135), port 0-100 
101 ports to scan, use -V to see all the replies 
+----+-----------+---------+---+-----+-----+-----+ 
|port| serv name |  flags  |ttl| id  | win | len | 
+----+-----------+---------+---+-----+-----+-----+   
   21 ftp        : .S..A...  64     0  5840    46   
   22 ssh        : .S..A...  64     0  5840    46   
   23 telnet     : .S..A...  64     0  5840    46   
   25 smtp       : .S..A...  64     0  5840    46   
   53 domain     : .S..A...  64     0  5840    46   
   80 http       : .S..A...  64     0  5840    46 
All replies received. Done. 
Not responding ports: 

Этот пример показывает, что сканирование 100 портов достаточно для обнаружения служб на системе Metasploitable2. Однако для сканирования всех возможных TCP-портов необходимо просканировать все возможные номера портов. Определённая часть заголовка TCP, которая определяет исходный и целевой номера портов, составляет 16 бит. Каждый бит может быть либо 1, либо 0. Таким образом, существует 2 ** 16 или 65 536 возможных номеров TCP-портов. Для сканирования всего возможного адресного пространства необходимо предоставить диапазон номеров портов от 0 до 65 535, например:

root@KaliLinux:~#
``` ```
+----+-----------+---------+---+-----+-----+-----+
|port| serv name |  flags  |ttl| id  | win | len |
+----+-----------+---------+---+-----+-----+-----+   
   21 ftp        : .S..A...  64     0  5840    46   
   22 ssh        : .S..A...  64     0  5840    46   
   23 telnet     : .S..A...  64     0  5840    46   
   25 smtp       : .S..A...  64     0  5840    46   
   53 domain     : .S..A...  64     0  5840    46  
  111 sunrpc     : .S..A...  64     0  5840    46 
 1099 rmiregistry: .S..A...  64     0  5840    46 
 1524 ingreslock : .S..A...  64     0  5840    46 
 2121 iprop      : .S..A...  64     0  5840    46 
 8180            : .S..A...  64     0  5840    46 
34789            : .S..A...  64     0  5840    46  
  512 exec       : .S..A...  64     0  5840    46  
  513 login      : .S..A...  64     0  5840    46  
  514 shell      : .S..A...  64     0  5840    46 
 3632 distcc     : .S..A...  64     0  5840    46 
 5432 postgresql : .S..A...  64     0  5840    46 
56375            : .S..A...  64     0  5840    46   
   80 http       : .S..A...  64     0  5840    46  
  445 microsoft-d: .S..A...  64     0  5840    46 
 2049 nfs        : .S..A...  64     0  5840    46 
 6667 ircd       : .S..A...  64     0  5840    46
 6697            : .S..A...  64     0  5840    46 
57385            : .S..A...  64     0  5840    46  
  139 netbios-ssn: .S..A...  64     0  5840    46 
 6000 x11        : .S..A...  64     0  5840    46 
 3306 mysql      : .S..A...  64     0  5840    46 
 5900            : .S..A...  64     0  5840    46 
 8787            : .S..A...  64     0  5840    46 
50333            : .S..A...  64     0  5840    46 
 8009            : .S..A...  64     0  5840    46 
``` В запросе представлен текст, описывающий работу с сетевыми пакетами и протоколами TCP/IP. Основной язык текста запроса — русский.

Вот перевод текста на русский язык:

В выводе скрипта мы видим четыре пакета. Первый пакет — это отправленный SYN-запрос, второй пакет — полученный в ответ SYN+ACK, третий пакет — отправленный ACK в ответ, после чего получен RST-пакет, который является ответом на последний ACK. Последний пакет показывает, что при установлении соединения возникла проблема. В Scapy возможно установить три рукопожатия, но для этого необходимо настроить локальную таблицу IP. Особенно, если вы удалите TSR-пакеты, отправленные на удаленную систему, вы сможете установить рукопожатие. Используя механизм фильтрации таблицы IP, мы можем удалить RST-пакеты и установить три рукопожатия без вмешательства в работу всей системы (хотя эта конфигурация не рекомендуется по функциональным причинам). Чтобы продемонстрировать успешное установление полного трехкратного рукопожатия, мы используем Netcat для создания TCP-сервера. Затем мы пытаемся подключиться к открытому порту 4444 с помощью Scapy.

Пример:

На Ubuntu мы запускаем Netcat на порту 4444:

admin@ubuntu:~$ nc -lvp 4444 listening on [any] 4444 ...


В этом примере мы запускаем сервер на TCP-порту 4444. Мы можем изменить предыдущий скрипт, чтобы попытаться подключиться к серверу Netcat на порте 4444.

#!/usr/bin/python

import logging logging.getLogger("scapy.runtime").setLevel(logging.ERROR) from scapy.all import *

response = sr1(IP(dst="172.16.36.135")/TCP(dport=4444,flags='S')) reply = sr1(IP(dst="172.16.36.135")/TCP(dport=4444,flags='A',ack=(response[TCP].seq + 1)))


Этот скрипт отправляет SYN-запрос на открытый порт. После получения SYN+ACK ответа отправляется ACK-ответ. Чтобы проверить, прерывается ли соединение из-за RST-пакета, генерируемого системой, этот скрипт должен быть запущен после запуска Wireshark для захвата пакетов. Мы используем фильтр Wireshark, чтобы изолировать пакеты, связанные с попыткой подключения. Используемый фильтр: `tcp && (ip.src == 172.16.36.135 || ip.dst == 172.16.36.135)`. Фильтр предназначен только для отображения TCP-трафика, исходящего от или направленного к сканируемой системе. Например:

Теперь, когда мы точно определили проблему, мы можем создать фильтр, который позволит нам удалить системные RST-пакеты. Этот фильтр можно создать, изменив локальную таблицу IP:
> Изменение локальной таблицы IP таким образом блокирует все исходящие RST-ответы и изменяет способ обработки TCP/IP транзакций между целевым сервером и нашей системой. Убедитесь, что стандартные правила iptables удалены после выполнения этой процедуры или используйте следующую команду для обновления iptables.

iptables --flush


root@KaliLinux:# iptables -A OUTPUT -p tcp --tcp-flags RST RST -d 172.16.36.135 -j DROP root@KaliLinux:# iptables --list Chain INPUT (policy ACCEPT) target prot opt source destination

Chain FORWARD (policy ACCEPT) target prot opt source destination

Chain OUTPUT (policy ACCEPT) target prot opt source destination
DROP tcp -- anywhere 172.16.36.135 tcp flags:RST/RST Для того чтобы выполнить сканирование TCP-соединений в Metasploit, необходимо использовать вспомогательные модули.

Чтобы это сделать, нужно вызвать команду use с относительным путём к вспомогательному модулю. После того как модуль выбран, можно выполнить команду show options для подтверждения или изменения конфигурации сканирования. Эта команда отображает таблицу из четырёх столбцов: «Name», «Current Setting», «Required» и «Description». В столбце «Name» перечислены имена всех настраиваемых переменных. В столбце «Current Settings» указаны текущие настройки каждой переменной. Столбец «Required» показывает, является ли значение переменной обязательным. В столбце «Description» описывается функция каждой переменной.

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

Например, чтобы настроить сканирование TCP-соединения, выполните следующие шаги:

  1. Выберите вспомогательный модуль с помощью команды use: msf auxiliary(tcp) > use auxiliary/scanner/portscan/tcp
  2. Подтвердите или измените конфигурацию сканирования с помощью команды show options.
  3. Измените значение переменной RHOSTS на IP-адрес удалённой системы, которую вы хотите просканировать.
  4. Измените количество потоков на 20 с помощью команды set THREADS 20.
  5. Проверьте конфигурацию с помощью команды show options.
  6. Выполните сканирование с помощью команды run.

Также можно настроить сканирование портов в диапазоне, указав первый и последний порты через тире. Например:

msf auxiliary(tcp) > set PORTS 0-100 PORTS => 0-100 Значение параметра THREADS определяет количество текущих задач, выполняемых в фоновом режиме.

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

Хотя сканирование идентифицировало несколько устройств на целевой системе, мы не можем гарантировать, что все устройства были обнаружены, если только не были просканированы все возможные адреса портов.

Часть TCP-заголовка, определяющая исходный и целевой адреса, имеет длину 16 бит. Каждый бит может иметь значение 1 или 0. Таким образом, существует 2 ** 16 или 65536 возможных адресов TCP-портов.

Для сканирования всего адресного пространства необходимо предоставить диапазон портов от 0 до 65535, например:

msf auxiliary(tcp) > set PORTS 0-65535
PORTS => 0-65535 
msf auxiliary(tcp) > show options

Module options (auxiliary/scanner/portscan/tcp):

   Name         Current Setting  Required  Description   
   ----         ---------------  --------  ----------   
   CONCURRENCY  10               yes       The number of concurrent ports to check per host
   PORTS        0-65535          yes       Ports to scan (e.g. 2225,80,110-900)   
   RHOSTS       172.16.36.135    yes       The target address range or CIDR identifier   
   THREADS      20               yes       The number of concurrent threads   
   TIMEOUT      1000             yes       The reply read timeout in milliseconds 
   
msf auxiliary(tcp) > run

[*] 172.16.36.135:25 - TCP OPEN 
[*] 172.16.36.135:23 - TCP OPEN 
[*] 172.16.36.135:22 - TCP OPEN 
[*] 172.16.36.135:21 - TCP OPEN 
[*] 172.16.36.135:53 - TCP OPEN 
[*] 172.16.36.135:80 - TCP OPEN 
[*] 172.16.36.135:111 - TCP OPEN 
[*] 172.16.36.135:139 - TCP OPEN 
[*] 172.16.36.135:445 - TCP OPEN 
[*] 172.16.36.135:514 - TCP OPEN 
[*] 172.16.36.135:513 - TCP OPEN 
[*] 172.16.36.135:512 - TCP OPEN 
[*] 172.16.36.135:1099 - TCP OPEN 
[*] 172.16.36.135:1524 - TCP OPEN 
[*] 172.16.36.135:2049 - TCP OPEN 
[*] 172.16.36.135:2121 - TCP OPEN 
[*] 172.16.36.135:3306 - TCP OPEN 
[*] 172.16.36.135:3632 - TCP OPEN 
[*] 172.16.36.135:5432 - TCP OPEN 
[*] 172.16.36.135:5900 - TCP OPEN 
[*] 172.16.36.135:6000 - TCP OPEN 
[*] 172.16.36.135:6667 - TCP OPEN 
[*] 172.16.36.135:6697 - TCP OPEN 
[*] 172.16.36.135:8009 - TCP OPEN 
[*] 172.16.36.135:8180 - TCP OPEN 
[*] 172.16.36.135:8787 - TCP OPEN 
[*] 172.16.36.135:34789 - TCP OPEN 
[*] 172.16.36.135:50333 - TCP OPEN 
[*] 172.16.36.135:56375 - TCP OPEN 
[*] 172.16.36.135:57385 - TCP OPEN
[*] Scanned 1 of 1 hosts (100% complete) 
[*] Auxiliary module execution completed

В этом примере все открытые порты удалённой системы были идентифицированы путём сканирования всех возможных адресов TCP-портов. Мы также можем настроить сканирование, используя запись через косую черту для сканирования последовательности адресов.

msf auxiliary(tcp) > set RHOSTS 172.16.36.0-255 
RHOSTS => 172.16.36.0-255 
msf auxiliary(tcp) > show options

Module options (auxiliary/scanner/portscan/tcp):

   Name         Current Setting  Required  Description   
   ----         ---------------  --------  ----------  
   CONCURRENCY  10               yes       The number of concurrent ports to check per host    
   PORTS        80               yes       Ports to scan (e.g. 2225,80,110-900)   
   RHOSTS       172.16.36.0-255  yes       The target address range or CIDR identifier   
   THREADS      20               yes       The number of concurrent threads   
   TIMEOUT      1000             yes       The reply read timeout in milliseconds
   
msf auxiliary(tcp) > run

[*] Scanned 026 of 256 hosts (010% complete) 
[*] Scanned 056 of 256 hosts (021% complete) 
[*] Scanned 078 of 256 hosts (030% complete)
[*] Scanned 103 of 256 hosts (040% complete) 
[*] 172.16.36.135:22 - TCP OPEN 
[*] 172.16.36.135:80 - TCP OPEN 
[*] 172.16.36.132:22 - TCP OPEN 
[*] Scanned 128 of 256 hosts (050% complete) 
[*] Scanned 161 of 256 hosts (062% complete) 
[*] 172.16.36.180:22 - TCP OPEN 
[*] 172.16.36.180:80 - TCP OPEN 
[*] Scanned 180 of 256 hosts (070% complete) 
[*] Scanned 206 of 256 hosts (080% complete) 
[*] Scanned 232 of 256 hosts (090% complete) 
[*] Scanned 256 of 256 hosts (100% complete) 
[*] Auxiliary module execution completed

В этом примере сканирование соединений выполняется на 80 порту всех хостов в диапазоне адресов, указанном переменной RHOST. Аналогично, RHOSTS можно использовать для определения диапазона сети с помощью записи через косую черту. Сканирование (например, 2225,80,110-900)

RHOSTS 172.16.36.0/24 да Целевой адресный диапазон или идентификатор CIDR
THREADS 20 да Количество одновременных потоков
TIMEOUT 1000 да Время ожидания ответа в миллисекундах

msf auxiliary(tcp) > run

[] Сканировано 038 из 256 хостов (014% выполнено)
[
] Сканировано 053 из 256 хостов (020% выполнено)
[] Сканировано 080 из 256 хостов (031% выполнено)
[
] Сканировано 103 из 256 хостов (040% выполнено)
[] 172.16.36.135:80 — TCP OPEN
[
] 172.16.36.135:22 — TCP OPEN
[] 172.16.36.132:22 — TCP OPEN
[
] Сканировано 138 из 256 хостов (053% выполнено)
[] Сканировано 157 из 256 хостов (061% выполнено)
[
] 172.16.36.180:22 — TCP OPEN
[] 172.16.36.180:80 — TCP OPEN
[
] Сканировано 182 из 256 хостов (071% выполнено)
[] Сканировано 210 из 256 хостов (082% выполнено)
[
] Сканировано 238 из 256 хостов (092% выполнено)
[] Сканировано 256 из 256 хостов (100% выполнено)
[
] Выполнение вспомогательного модуля завершено

Принцип работы

Принцип работы вспомогательного модуля Metasploit для сканирования TCP-соединений такой же, как и у любого другого инструмента для сканирования TCP-соединений. Использование Metasploit для выполнения такого сканирования имеет свои преимущества, поскольку оно позволяет сократить общее количество необходимых инструментов.

Дмитрий: сканирование TCP-соединений

Ещё одним инструментом, который можно использовать для сканирования удалённых систем на наличие открытых TCP-портов, является Dmitry. В отличие от Nmap и Metasploit, Dmitry представляет собой очень простой инструмент, с помощью которого можно быстро и легко выполнить сканирование без необходимости настройки. Этот секрет показывает, как использовать Dmitry для сканирования TCP-соединений.

Подготовка

Для использования Dmitry для сканирования TCP-соединений вам потребуется удалённый сервер, на котором запущен TCP-сетевой сервис. В этом примере мы используем экземпляр Metasploitable2 для выполнения задачи. Для получения дополнительной информации о настройке Metasploitable2 см. секрет «Установка Metasploitable2» в первой главе.

Порядок действий

Dmitry — это универсальный инструмент, который может использоваться для сканирования целевых систем на предмет открытых TCP-соединений. Его функциональность ограничена, но он прост в использовании и эффективен. Чтобы просмотреть доступные параметры Dmitry, мы запускаем программу в терминале без каких-либо параметров:

root@KaliLinux:~# dmitry 
Deepmagic Information Gathering Tool 
"There be some deep magic going on"

Usage: dmitry [-winsepfb] [-t 0-9] [-o %host.txt] host
  -o   Save output to %host.txt or to file specified by -o file  
  -i   Perform a whois lookup on the IP address of a host  
  -w   Perform a whois lookup on the domain name of a host 
  -n   Retrieve Netcraft.com information on a host 
  -s   Perform a search for possible subdomains
  -e   Perform a search for possible email addresses 
  -p   Perform a TCP port scan on a host 
* -f   Perform a TCP port scan on a host showing output reporting filtered ports 
* -b   Read in the banner received from the scanned port 
* -t 0-9 Set the TTL in seconds when scanning a TCP port ( Default 2 ) 
*Requires the -p flagged to be passed 

Как видно из вывода, опция -p используется для выполнения сканирования портов TCP. Чтобы реализовать это, мы используем IP-адрес сканируемой системы. Dmitry имеет 150 предварительно настроенных портов, которые он будет сканировать. Он покажет любые обнаруженные открытые порты среди этих портов. Рассмотрим следующий пример:

root@KaliLinux:~# dmitry -p 172.16.36.135 
Deepmagic Information Gathering
Tool "There be some deep magic going on"

ERROR: Unable to locate Host Name for 172.16.36.135 
Continuing with limited modules 
HostIP:172.16.36.135 
HostName:

Gathered TCP Port information for 172.16.36.135 
--------------------------------

 Port    State
 
21/tcp    open 
22/tcp    open 
23/tcp    open 
25/tcp    open 
53/tcp    open 
80/tcp    open 
111/tcp    open 
139/tcp    open

Portscan Finished: Scanned 150 ports, 141 ports were in state closed 

Сканирование портов TCP в Dmitry не настраивается. Однако это быстрый и эффективный способ доступа к распространённым сервисам на отдельном хосте. Мы также можем использовать опцию -o, чтобы указать имя файла и сохранить результаты сканирования Dmitry в текстовый файл.

root@KaliLinux:~# dmitry -p 172.16.36.135 -o output 
root@KaliLinux:~# ls Desktop  output.txt 
root@KaliLinux:~# cat output.txt 
ERROR: Unable to locate 
Host Name for 172.16.36.135 
Continuing with limited modules 
HostIP:172.16.36.135 
HostName:

Gathered TCP Port information for 172.16.36.135 
--------------------------------

 Port    State 
21/tcp    open 
22/tcp    open 
23/tcp    open 
25/tcp    open
53/tcp    open 
80/tcp    open 
111/tcp    open 
139/tcp    open

Portscan Finished: Scanned 150 ports, 141 ports were in state closed

Принцип работы

Определение того, как работает механизм сканирования TCP-соединений, аналогично определению других инструментов. Основное преимущество Dmitry по сравнению с другими инструментами заключается в его простоте и отсутствии необходимости управлять несколькими конфигурациями, как в случае с Nmap и Metasploit. Мы можем легко запустить Dmitry, указав режим ответа и передав ему IP-адрес. Он может быстро просканировать 150 распространённых портов и показать все открытые значения портов.

Сканирование TCP-порта с помощью Netcat

Поскольку Netcat — это сетевой инструмент для управления и подключения сокетов, его можно легко преобразовать в инструмент сканирования TCP-портов. Этот секрет демонстрирует, как использовать Netcat для сканирования TCP-соединения.

Подготовка

Чтобы использовать Netcat для сканирования TCP-соединений, вам потребуется удалённый сервер с запущенным TCP-сервисом. В этом примере мы будем использовать экземпляр Metasploitable2. Дополнительную информацию о настройке Metasploitable2 можно найти в секрете «Установка Metasploitable2» в первой главе.

Порядок действий

Netcat — это мощный и универсальный сетевой инструмент, который можно использовать в различных целях. Netcat ### Один из наиболее эффективных способов использования — это выполнение сканирования портов.

Чтобы определить параметры использования, nc следует вызывать с опцией -h:

root@KaliLinux:~# nc -h 
[v1.10-40] 
connect to somewhere:  nc [-options] hostname port[s] [ports] ... 
listen for inbound:  nc -l -p port [-options] [hostname] [port] 
options:  
  -c shell commands  as `-e'; use /bin/sh to exec [dangerous!!]
  -e filename    program to exec after connect [dangerous!!]  
  -b      allow broadcasts  
  -g gateway    source-routing hop point[s], up to 8  
  -G num      source-routing pointer: 4, 8, 12, ...  
  -h      this cruft  
  -i secs      delay interval for lines sent, ports scanned  
  -k                      set keepalive option on socket 
  -l      listen mode, for inbound connects  
  -n      numeric-only IP addresses, no DNS 
  -o file      hex dump of traffic  -p port      local port number  
  -r      randomize local and remote ports  
  -q secs      quit after EOF on stdin and delay of secs 
  -s addr      local source address 
  -T tos      set Type Of Service 
  -t      answer TELNET negotiation 
  -u      UDP mode 
  -v      verbose [use twice to be more verbose] 
  -w secs      timeout for connects and final net reads 
  -z      zero-I/O mode [used for scanning] 
port numbers can be individual or ranges: lo-hi [inclusive]; hyphens in port names must be backslash escaped (e.g. 'ftp\-data'). 

Как показывает вывод, опция -z может быть эффективно использована для сканирования. Чтобы просканировать целевой порт TCP 80 на системе, мы используем опцию -n, чтобы указать используемый IP-адрес, опцию -v для подробного вывода и опцию -z для сканирования:

root@KaliLinux:~# nc -nvz 172.16.36.135 80 
(UNKNOWN) [172.16.36.135] 80 (http) open 
root@KaliLinux:~# nc -nvz 172.16.36.135 443 
(UNKNOWN) [172.16.36.135] 443 (https) : Connection refused

Попытка сканирования открытого порта приведёт к возврату IP-адреса, адреса порта и состояния порта. Отказ в соединении при сканировании закрытого порта будет явно выражен. Мы можем автоматизировать этот процесс, например:

root@KaliLinux:~# for x in $(seq 20 30); do nc -nvz 172.16.36.135 $x; done 
(UNKNOWN) [172.16.36.135] 20 (ftp-data) : Connection refused 
(UNKNOWN) [172.16.36.135] 21 (ftp) open
(UNKNOWN) [172.16.36.135] 22 (ssh) open 
(UNKNOWN) [172.16.36.135] 23 (telnet) open 
(UNKNOWN) [172.16.36.135] 24 (?) : Connection refused 
(UNKNOWN) [172.16.36.135] 25 (smtp) open 
(UNKNOWN) [172.16.36.135] 26 (?) : Connection refused 
(UNKNOWN) [172.16.36.135] 27 (?) : Connection refused 
(UNKNOWN) [172.16.36.135] 28 (?) : Connection refused 
(UNKNOWN) [172.16.36.135] 29 (?) : Connection refused 
(UNKNOWN) [172.16.36.135] 30 (?) : Connection refused

Передав вывод в STDOUT, а затем отфильтровав его, мы сможем выделить строки, предоставляющие информацию об открытых портах. Мы даже можем сделать это более кратко, просто извлекая необходимую нам информацию. Если сканируется один хост, мы можем использовать третье и четвёртое поля:

root@KaliLinux:~# for x in $(seq 20 30); do nc -nvz 172.16.36.135 $x; done 2>&1 | grep open | cut -d " " -f 3-4 
21 (ftp) 
22 (ssh) 
23 (telnet) 
25 (smtp) 

Используя функцию cut с разделителем пробелов, мы можем разделить эти строки после указания полей, которые нужно вывести. Однако есть ещё один эффективный способ — указать диапазон портов в Netcat вместо передачи инструмента в цикл. Netcat автоматически покажет открытые порты при передаче значения адреса порта:

root@KaliLinux:~# nc 172.16.36.135 -nvz 20-30 
(UNKNOWN) [172.16.36.135] 25 (smtp) open 
(UNKNOWN) [172.16.36.135] 23 (telnet) open 
(UNKNOWN) [172.16.36.135] 22 (ssh) open 
(UNKNOWN) [172.16.36.135] 21 (ftp) open

Однако, как и раньше, нам нужно передать его в STDOUT, чтобы передать его функции cut. Показывая поля с 2 по 4, мы можем ограничить вывод IP-адресом, номером порта и соответствующей службой:

root@KaliLinux:~# nc 172.16.36.135 -nvz 20-30 2>&1 | cut -d " " -f 2-4 
[172.16.36.135] 25 (smtp) 
[172.16.36.135] 23 (telnet) 
[172.16.36.135] 22 (ssh) 
[172.16.36.135] 21 (ftp)

Мы можем использовать функцию цикла в bash для сканирования нескольких последовательностей адресов хостов с помощью Netcat и извлечения той же информации, чтобы определить, на каких хостах открыты порты.

root@KaliLinux:~# for x in $(seq 0 255); do nc 172.16.36.$x -nvz 80 2>&1 | grep open | cut -d " " -f 2-4; done
[172.16.36.135] 80 (http) 
[172.16.36.180] 80 (http)

Принцип работы

Выполнение сканирования TCP-соединения происходит путём полного трёхкратного рукопожатия и установления соединения со всеми сканируемыми портами удалённой системы. Состояние порта зависит от успешности установления соединения. Если соединение установлено, порт считается открытым, если соединение не может быть успешно установлено, порт считается закрытым. Увеличение IPID в пакетах

В пакетах происходит увеличение IPID. Если обнаружен хост с увеличивающимся IPID и этот хост не взаимодействует с другими сетевыми системами, его можно использовать для идентификации открытых портов на других системах. Мы можем отправить серию IP-пакетов и проанализировать ответы, чтобы определить последовательность IPID удалённой системы.

>>> reply1 = sr1(IP(dst="172.16.36.134")/TCP(flags="SA"),timeout=2,verbo se=0) 
>>> reply2 = sr1(IP(dst="172.16.36.134")/TCP(flags="SA"),timeout=2,verbo se=0)
>>> reply1.display()

###[ IP ]###  
    version= 4L  
    ihl= 5L  
    tos= 0x0  
    len= 40  
    id= 61  
    flags=
    frag= 0L 
    ttl= 128 
    proto= tcp 
    chksum= 0x9938 
    src= 172.16.36.134
    dst= 172.16.36.180 
    \options\ 
###[ TCP ]###  
    sport= http   
    dport= ftp_data  
    seq= 0    
    ack= 0 
    dataofs= 5L  
    reserved= 0L  
    flags= R   
    window= 0     
    chksum= 0xe22 
    urgptr= 0  
    options= {}
###[ Padding ]###  
    load= '\x00\x00\x00\x00\x00\x00' 
>>> reply2.display()
###[ IP ]### 
    version= 4L 
    ihl= 5L
    tos= 0x0  
    len= 40 
    id= 62 
    flags= 
    frag= 0L 
    ttl= 128
    proto= tcp 
    chksum= 0x992d 
    src= 172.16.36.134 
    dst= 172.16.36.180
    \options\ 
###[ TCP ]###   
    sport= http    
    dport= ftp_data 
    seq= 0   
    ack= 0    
    dataofs= 5L  
    reserved= 0L 
    flags= R   
    window= 0   
    chksum= 0xe22   
    urgptr= 0  
    options= {}
###[ Padding ]###  
    load= '\x00\x00\x00\x00\x00\x00'

Если мы отправим два IP-пакета на автономную систему Windows, мы сможем обнаружить значение целочисленного идентификатора (ID) в ответе. Обратите внимание, что ID первого запроса равен 61, а второго — 62. Этот хост действительно имеет увеличивающийся IPID, и предполагается, что он независим. Его можно использовать в качестве эффективного зомби для сканирования. Чтобы выполнить сканирование зомби, необходимо отправить начальный SYN+ACK на систему зомби, чтобы определить текущее значение RST IPID в ответ. Затем отправьте поддельный SYN-запрос на цель сканирования с исходным IP-адресом зомби. Если порт открыт, цель сканирования ответит SYN+ACK зомби. Поскольку зомби фактически не отправлял начальный SYN, он будет интерпретировать SYN+ACK как неизвестный источник и отправит RST. Таким образом, IPID увеличивается на 1. Наконец, следует отправить ещё один SYN+ACK пакет на зомби, который ответит RST и увеличит IPID ещё на 1. IPID увеличился на 2 по сравнению с начальным ответом, указывая на то, что все эти события произошли, и порт цели сканирования открыт.

С другой стороны, если порт закрыт, произойдёт другая серия событий, которая приведёт только к тому, что последний RST увеличится на 1 по сравнению с предыдущим. Если порт цели сканирования закрыт, RST будет отправлен на систему зомби в ответ на поддельный SYN. Поскольку RST не вызывает никакого ответа, значение IPID системы зомби не меняется. Поэтому, в ответ на SYN+ACK, последний RST, отправленный на систему сканирования, увеличит IPID только на 1.

Чтобы упростить этот процесс, ниже приведён скрипт на Python, который идентифицирует доступные системы зомби и выполняет сканирование зомби на целевой системе.

#!/usr/bin/python 
import logging 
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) 
from scapy.all import *

def ipid(zombie):   
    reply1 = sr1(IP(dst=zombie)/TCP(flags="SA"),timeout=2,verbose=0)   
    send(IP(dst=zombie)/TCP(flags="SA"),verbose=0)   
    reply2 = sr1(IP(dst=zombie)/TCP(flags="SA"),timeout=2,verbose=0)   
    if reply2[IP].id == (reply1[IP].id + 2):      
        print "IPID sequence is incremental and target appears to be        idle.  ZOMBIE LOCATED"      
        response = raw_input("Do you want to use this zombie to perform        a scan? (Y or N): ")      
        if response == "Y":         
            target = raw_input("Enter the IP address of the target           system: ")         
            zombiescan(target,zombie)   
    else:      
        print "Either the IPID sequence is not incremental or the target        is not idle.  NOT A GOOD ZOMBIE"

def zombiescan(target,zombie):   
    print "\nScanning target " + target + " with zombie " + zombie   print "\n---------Open Ports on Target--------\n"   
    for port in range(1,100):      
        try:         
            start_val = sr1(IP(dst=zombie)/TCP(flags="SA",dport=port),tim          eout=2,verbose=0)         
            send(IP(src=zombie,dst=target)/TCP(flags="S",dport=port),verbose=0)         
            end_val = sr1(IP(dst=zombie)/TCP(flags="SA"),timeout=2,verbo          se=0)         
            if end_val[IP].id == (start_val[IP].id + 2):           
                print port     
        except:      
            pass

print "-----------Zombie Scan Suite------------\n" 
print "1 - Identify Zombie Host\n" 
print "2 - Perform Zombie Scan\n" ans = raw_input("Select an Option (1 or 2): ") 
if ans == "1":   
    zombie = raw_input("Enter IP address to test IPID sequence: ")   
    ipid(zombie) 
else:   
    if ans == "2":  
        zombie = raw_input("Enter IP address for zombie system: ")      
        target = raw_input("Enter IP address for scan target: ")      
        zombiescan(target,zombie)

При выполнении скрипта пользователь получит несколько вариантов выбора. С помощью опции 1 мы можем сканировать или оценивать последовательность IPID цели, чтобы определить, является ли хост доступным зомби. Предполагается, что хост независим и имеет увеличивающуюся последовательность IPID. Последовательность, хост можно использовать в качестве зомби. Также пользователю будет задан вопрос, хочет ли он использовать зомби для выполнения сканирования. Если сканирование было выполнено, то процесс, описанный ранее, будет выполнен для каждого адреса из первых 100 адресов TCP-порта. Вот как это происходит:

root@KaliLinux:~# ./zombie.py 
-----------Zombie Scan Suite-----------

1 - Identify Zombie Host
2 - Perform Zombie Scan

Select an Option (1 or 2): 1 
Enter IP address to test IPID sequence: 172.16.36.134 
IPID sequence is incremental and target appears to be idle.  ZOMBIE LOCATED 
Do you want to use this zombie to perform a scan? (Y or N): Y 
Enter the IP address of the target system: 172.16.36.135

Scanning target 172.16.36.135 with zombie 172.16.36.134

---------Open Ports on Target-------

21 
22 
23 
25 
53 
80

Принцип работы

Сканирование зомби — это скрытный способ перечисления открытых портов целевой системы, который не оставляет никаких следов взаимодействия. Мы отправляем поддельные запросы на целевую систему и обычные запросы на систему зомби, а затем оцениваем ответ системы зомби по значению IPID, чтобы сопоставить открытые порты целевой системы.

3.18 Сканирование зомби с помощью Nmap

Как и в предыдущем секрете, понимание принципа работы сканирования зомби может быть очень полезным при написании собственных скриптов. В Nmap есть ещё один эффективный режим сканирования, который можно использовать для сканирования зомби. Этот секрет показывает, как использовать Nmap для сканирования зомби.

Подготовка

Чтобы использовать Nmap для сканирования зомби, вам нужны две удалённые системы: одна с запущенным TCP-сервером, а другая с последовательностью IPID, которая увеличивается. В этом примере Metasploitable2 используется в качестве цели сканирования, а WindowsXP — в качестве зомби с увеличивающейся последовательностью IPID. Для получения дополнительной информации о том, как настроить системы в локальной экспериментальной среде, обратитесь к секретам «Установка Metasploitable2» и «Установка Windows-сервера» в первой главе. Кроме того, для этого раздела также требуется использовать текстовый редактор для записи скрипта в файловую систему, например VIM или Nano. Для получения дополнительных сведений о написании скриптов обратитесь к секрету «Использование текстового редактора (VIM или Nano)» в первой главе.

Шаги операции

Сканирование зомби можно выполнить с помощью параметра в Nmap. Однако мы можем использовать Metasploit для быстрого поиска любых доступных вариантов зомби, сканируя весь диапазон адресов и оценивая последовательность PIPD, вместо использования сканирования зомби Nmap. Для этого нам нужно использовать команду msfconsole, чтобы открыть Metasploit, и вспомогательный модуль последовательности IPID, вот так:

root@KaliLinux:~# msfconsole  
+-------------------------------------------------------+  
|  METASPLOIT by Rapid7                                 |  
+---------------------------+---------------------------+
|      __________________   |                           |  
|  ==c(______(o(______(_()  | |""""""""""""|======[***  |  
|             )=\           | |  EXPLOIT   \            |  
|            // \\          | |_____________\_______    |  
|           //   \\         | |==[msf >]============\   |  
|          //     \\        | |______________________\  |  
|         // RECON \\       | \(@)(@)(@)(@)(@)(@)(@)/   |  
|        //         \\      |  *********************    |  
+---------------------------+---------------------------+  
|      o O o                |        \'\/\/\/'/         |  
|              o O          |         )======(          |  
|                 o         |       .'  LOOT  '.        |  
| |^^^^^^^^^^^^^^|l___      |      /    _||__   \       |  
| |    PAYLOAD     |""\___, |     /    (_||_     \      |  
| |________________|__|)__| |    |     __||_)     |     |  
| |(@)(@)"""**|(@)(@)**|(@) |    "       ||       "     |  
|  = = = = = = = = = = =  |     '--------------'      |  
+---------------------------+---------------------------+

Using notepad to track pentests? Have Metasploit Pro report on hosts, services, sessions and evidence -- type 'go_pro' to launch it now.

       =[ metasploit v4.6.0-dev [core:4.6 api:1.0] 
+ -- --=[ 1053 exploits - 590 auxiliary - 174 post 
+ -- --=[ 275 payloads - 28 encoders - 8 nops

msf > use auxiliary/scanner/ip/ipidseq 
msf  auxiliary(ipidseq) > show options

Module options (auxiliary/scanner/ip/ipidseq):

   Name       Current Setting  Required  Description   
   ----       ---------------  --------  ----------   
   INTERFACE                   no        The name of the interface   
   RHOSTS                      yes       The target address range or CIDR identifier   
   RPORT      80               yes       The target port
   SNAPLEN    65535            yes       The number of bytes to capture   
   THREADS    1                yes       The number of concurrent threads   
   TIMEOUT    500              yes       The reply read timeout in milliseconds 

Этот вспомогательный модуль можно использовать для сканирования в диапазоне адресов хоста или сети, которые можно определить с помощью CIDR-нотации. Чтобы ускорить сканирование, мы можем установить переменную THREADS на разумное количество одновременных задач, вот так:

msf  auxiliary(ipidseq) > set RHOSTS 172.16.36.0/24 
RHOSTS => 172.16.36.0/24 
msf  auxiliary(ipidseq) > set THREADS 25 
THREADS => 25 
msf  auxiliary(ipidseq) > show options

Module options (auxiliary/scanner/ip/ipidseq):

   Name       Current Setting  Required  Description   
   ----       ---------------  --------  ----------   INTERFACE                   no        The name of the interface   
   RHOSTS     172.16.36.0/24   yes       The

*Примечание: в тексте запроса присутствуют фрагменты кода на языке Python, однако они не были включены в результат перевода.* **target address range or CIDR identifier**  
   RPORT      80               yes       целевой порт   
   SNAPLEN    65535            yes       количество байт для захвата   
   THREADS    25               yes       количество одновременных потоков   
   TIMEOUT    500              yes       время ожидания ответа в миллисекундах 

Как только для всех необходимых переменных заданы разумные значения, мы можем использовать команду `show options`, чтобы ещё раз проверить конфигурацию сканирования. После сканирования IPID-последовательности можно выполнить команду `run`.

msf auxiliary(ipidseq) > run

[] Класс последовательности IPID узла 172.16.36.1: случайный [] Класс последовательности IPID узла 172.16.36.2: возрастающий! [] Просканировано 026 из 256 узлов (010% выполнено) [] Просканировано 052 из 256 узлов (020% выполнено) [] Просканировано 077 из 256 узлов (030% выполнено) [] Просканировано 103 из 256 узлов (040% выполнено) [] Просканировано 128 из 256 узлов (050% выполнено) [] Класс последовательности IPID узла 172.16.36.134: возрастающий! [] Класс последовательности IPID узла 172.16.36.135: все нули [] Просканировано 154 из 256 узлов (060% выполнено) [] Просканировано 180 из 256 узлов (070% выполнено) [] Просканировано 205 из 256 узлов (080% выполнено) [] Просканировано 231 из 256 узлов (090% выполнено) [] Просканировано 256 из 256 узлов (100% выполнено) [*] Выполнение вспомогательного модуля завершено


Поскольку модуль сканирования IPID-последовательностей проходит по всему предоставленному диапазону сети, он определяет шаблоны последовательностей IPID обнаруженных хостов и показывает, какие из них являются нулевыми, случайными или возрастающими. Идеальным кандидатом для сканирования с помощью зомби является хост с возрастающей последовательностью IPID, который не подвергается значительному влиянию со стороны других хостов в сети. Как только мы обнаружим независимый хост с возрастающим IPID, мы сможем использовать опцию `-sI` в Nmap и указать IP-адрес хоста-зомби для выполнения сканирования с использованием зомби.

root@KaliLinux:~# nmap 172.16.36.135 -sI 172.16.36.134 -Pn -p 0-100

Starting Nmap 6.25 ( http://nmap.org ) at 2014-01-26 14:05 CST I dle scan using zombie 172.16.36.134 (172.16.36.134:80); Class: Incremental Nmap scan report for 172.16.36.135 Host is up (0.045s latency). Not shown: 95 closed|filtered ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 23/tcp open telnet 25/tcp open smtp 53/tcp open domain 80/tcp open
http MAC Address: 00:0C:29:3D:84:32 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 2.75 seconds


В приведённом выше примере сканирование с использованием зомби выполняется на первых 100 TCP-портах цели `172.16.36.135`. Независимый хост `172.16.36.134` используется в качестве зомби, а опция `-Pn` предотвращает попытки Nmap просканировать цель с помощью ping. В этом примере мы идентифицируем и перечисляем все открытые порты, но напрямую не взаимодействуем с целью сканирования. Вместо этого поддельные пакеты отправляются на цель сканирования, и прямое взаимодействие происходит только между системой сканирования и хостом-зомби.

### Принцип работы

Базовый механизм сканирования с использованием зомби аналогичен примеру Scapy, обсуждавшемуся в предыдущем секрете. Однако использование режима сканирования с использованием зомби в Nmap позволяет нам быстро выполнять такие задачи с помощью известного интегрированного инструмента.
1
https://api.gitlife.ru/oschina-mirror/wizardforcel-kali-linux-network-scanning-cookbook-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-kali-linux-network-scanning-cookbook-zh.git
oschina-mirror
wizardforcel-kali-linux-network-scanning-cookbook-zh
wizardforcel-kali-linux-network-scanning-cookbook-zh
master