Автор: Justin Hutchens
Переводчик: Flydragon
Протокол: CC BY-NC-SA 4.0
Следующим шагом после определения цели атаки является идентификация открытых портов на целевой системе. Открытые порты соответствуют сетевым сервисам, работающим на компьютере и подключённым к сети. Ошибки программирования или уязвимости в реализации могут привести к тому, что эти сервисы будут иметь уязвимости, которые иногда могут позволить полностью скомпрометировать систему. Чтобы определить возможные векторы атак, необходимо сначала перечислить все открытые порты на удалённых системах в рамках проекта. Эти открытые порты могут быть доступны через потоки UDP или TCP.
TCP и UDP — это транспортные протоколы. TCP чаще используется и обеспечивает ориентированное на соединение взаимодействие. UDP — это протокол, ориентированный на передачу данных без установления соединения, который иногда используется для передачи сервисов, где скорость передачи данных важнее целостности данных. Техника тестирования на проникновение, называемая сканированием портов, используется для перечисления этих сервисов. В отличие от обсуждения хоста обнаружения в предыдущей главе, эти методы должны предоставлять достаточно информации, чтобы определить, связан ли сервис с данным портом на устройстве или сервере.
Прежде чем обсуждать конкретные секреты, мы сначала обсудим некоторые основные принципы работы портов, которые вам следует понять.
Поскольку TCP является более распространённым транспортным протоколом, службы UDP часто игнорируются. Хотя службы UDP по своей сути имеют тенденцию к игнорированию, они всё же могут быть перечислены и использованы для полного понимания инструментария любой заданной цели. Сканирование UDP обычно является сложным, трудоёмким и занимает много времени. Эта глава будет включать в себя три секрета о том, как выполнять сканирование UDP в Kali. Понимание сканирования UDP важно, поскольку оно может быть выполнено двумя различными способами. Один из методов будет подчёркивать первый секрет, он зависит только от ответа ICMP «порт недоступен». Этот тип сканирования предполагает, что любой UDP-порт, не привязанный к определённому сервису, вернёт ответ ICMP «порт недоступен». Таким образом, отсутствие такого ответа указывает на наличие сервиса. Хотя этот метод может быть очень эффективным в некоторых случаях, он также может давать неточные результаты, если хост не генерирует ответ «порт недоступен» или если ответ «порт недоступен» ограничен скоростью или фильтруется брандмауэром. Альтернативный метод будет объяснён во втором и третьем секретах и включает использование специфических для сервиса зондов для попытки инициировать ответ, указывающий на то, что ожидаемый сервис работает на целевом порту. Этот метод очень эффективен, но также очень трудоёмок.
В этой главе будет обсуждаться несколько различных методов сканирования TCP. Эти методы включают скрытое сканирование, сканирование с подключением и сканирование зомби. Для понимания принципов этих методов сканирования важно понимать, как работает TCP при установлении и поддержании соединений. TCP — это ориентированный на подключение протокол, и данные могут передаваться через TCP только после того, как соединение установлено между двумя системами. Этот процесс обычно использует трёхстороннее рукопожатие для обозначения процесса установления соединения. Это содержимое косвенно относится к трём шагам процесса:
Рисунок 3-2-1: Процесс трёхстороннего рукопожатия TCP
Сканирование SYN пакета отправляется с устройства, желающего установить соединение, и содержит порт устройства. Если служба, связанная с принимающим портом, получает соединение, она отправит пакет TCP, содержащий флаги SYN и ACK. Соединение устанавливается только тогда, когда запрашивающая система отвечает пакетом TCP ACK. Этот трёхэтапный процесс устанавливает сеанс TCP между двумя системами. Все механизмы сканирования портов TCP выполняют различные вариации этого процесса для идентификации активных служб на удалённом хосте.
И сканирование с подключением, и скрытое сканирование легко понять. Сканирование с подключением устанавливает полное TCP-соединение для каждого сканируемого порта. То есть для каждого порта сканирования выполняется трёхстороннее рукопожатие. Если соединение успешно установлено, порт можно считать открытым. В качестве альтернативы скрытое сканирование не устанавливает полного соединения. Скрытое сканирование также называется сканированием SYN или полуоткрытым сканированием. Для каждого сканируемого порта отправляется один пакет SYN, направленный на целевой порт, и все порты, отвечающие пакетами SYN+ACK, считаются работающими активными службами. Поскольку исходная система не отправляет окончательный пакет ACK, соединение устанавливается только наполовину. Это называется скрытым сканированием, потому что журналы системы будут регистрировать только установленные соединения и не будут регистрировать какие-либо следы сканирования.
Последний метод сканирования TCP, обсуждаемый в этой главе, называется сканированием зомби. Цель сканирования зомби состоит в том, чтобы отобразить все открытые порты на удалённой системе, не оставляя никаких следов взаимодействия с системой. Принцип работы сканирования зомби довольно сложен. Процесс выполнения сканирования зомби требует соблюдения следующих шагов:
Рассматривайте удалённую систему как своего зомби. Эта система должна соответствовать следующим характеристикам:
Отправьте пакет SYN+ACK зомби-хосту и запишите начальный номер IPID.
Подделайте исходный адрес пакета в пакете IP как IP-адрес зомби-хоста и отправьте его на целевой хост.
Произойдёт одно из следующих событий в зависимости от состояния порта цели:
Отправьте ещё один пакет 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. Этот процесс можно выполнить для каждого порта, который вы хотите просканировать, и он может использоваться для отображения открытых портов удалённой системы без оставления каких-либо следов сканирования.
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 часто фильтруется брандмауэрами. Альтернативный подход заключается в использовании специфических для службы зондов для запроса положительных ответов. Эта техника будет продемонстрирована в следующих двух секретах.
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
\ ,__,
\ (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]
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 имеет вспомогательные модули для 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 может быть более привлекательным, поскольку он имеет интерактивную консоль управления и является инструментом, который знаком большинству пентестеров.
Помимо методов разведки, которые мы изучили ранее, 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-соединения, выполните следующие шаги:
Также можно настроить сканирование портов в диапазоне, указав первый и последний порты через тире. Например:
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-портов, является 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 распространённых портов и показать все открытые значения портов.
Поскольку 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, чтобы сопоставить открытые порты целевой системы.
Как и в предыдущем секрете, понимание принципа работы сканирования зомби может быть очень полезным при написании собственных скриптов. В 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 позволяет нам быстро выполнять такие задачи с помощью известного интегрированного инструмента.
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.