Интерактивный интерпретатор: взаимодействие с удалённым сетевым устройством
В данном тексте описывается использование интерактивного интерпретатора для взаимодействия с удалёнными сетевыми устройствами. В примере используется Python-интерпретатор для создания нового сокета и подключения к удаленному хосту Metasploitable2 через порт 21. После успешного подключения, можно использовать функцию recv() для получения данных от сервера.
Если попытаться подключиться к порту 443, который не принимает соединения, Python-интерпретатор выдаст ошибку. Однако даже если порт открыт, это не гарантирует получение информации о сервере. Это можно увидеть при подключении к порту 80, где сервер принимает соединение, но не предоставляет информацию о себе.
Для автоматического сбора информации о серверах используется функция select(), которая позволяет определить, готов ли сокет к чтению. На основе этого можно решить, следует ли пытаться получить данные от сервера или нет.
Пример кода демонстрирует использование функции select() для определения готовности сокета к чтению перед попыткой получения данных. Также представлен скрипт на Python, который автоматизирует процесс сканирования портов и сбора информации о сервисах на удалённых хостах. ### Работа с секретами
В этом руководстве используется скрипт на Python, который работает с сокетами. Скрипт перебирает все указанные целевые адреса портов и пытается установить TCP-соединение с каждым из них. Если соединение установлено и получены данные от целевой службы, эти данные выводятся в консоль. Если не удаётся установить соединение с удалённым портом, скрипт переходит к следующему адресу порта в цикле. Аналогично, если соединение установлено, но не получено никаких данных, соединение закрывается, и скрипт продолжает сканирование со следующим значением в списке.
Dmitry — это простой, но эффективный инструмент для подключения к сетевым службам, работающим на удалённых портах. В этом руководстве показано, как использовать Dmitry для сбора признаков служб, чтобы определить и идентифицировать службы, связанные с открытыми портами.
Чтобы использовать Dmitry для сбора признаков, вам необходимо иметь доступ к системе с работающими сетевыми службами, предоставляющими открытую информацию, на удалённом компьютере. Приведённый пример использует Metasploitable2 для выполнения этой задачи. Для получения дополнительной информации о настройке Metasploitable2 см. руководство «Установка Metasploitable2».
Как обсуждалось в руководстве по сканированию портов, Dmitry можно использовать для быстрого сканирования 150 наиболее распространённых портов служб. Это можно сделать с помощью опции -p
:
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
Эта опция сканирования портов является обязательной для использования Dmitry для сбора признаков. Также можно позволить Dmitry собирать любые доступные признаки при попытке подключения к этим 150 портам. Это делается с помощью опций -b
и -p
.
root@KaliLinux:~# dmitry -pb 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
>> 220 (vsFTPd 2.3.4)
22/tcp open
>> SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1
23/tcp open
>> ???? ??#??'
25/tcp open
>> 220 metasploitable.localdomain ESMTP Postfix (Ubuntu)
53/tcp open
80/tcp open
111/tcp open
139/tcp open
Portscan Finished: Scanned 150 ports, 141 ports were in state closed
Dmitry представляет собой очень простой инструмент командной строки, который может выполнять задачи сбора признаков с минимальными накладными расходами. Вместо указания портов, для которых нужно попытаться собрать признаки, Dmitry может автоматизировать этот процесс, пытаясь собрать признаки только на небольшом наборе предварительно определённых и часто используемых портов. Признаки, полученные от служб, работающих на этих адресах портов, будут отображаться в консоли после завершения скрипта.
Nmap имеет встроенный движок сценариев (NSE), который можно использовать для считывания признаков из сетевых служб, запущенных на удалённых портах. Это руководство показывает, как использовать Nmap NSE для сбора признаков сервисов, чтобы идентифицировать сервисы, связанные с открытыми портами на целевой системе.
Для использования Nmap NSE для сбора признаков вам потребуется доступ к системе, на которой запущены сетевые службы с открытой информацией, на удалённом компьютере. Пример использует Metasploitable2 для этой цели. Дополнительную информацию о настройке Metasploitable2 можно найти в руководстве «Установка Metasploitable2».
Сценарии NSE в Nmap можно вызвать, используя опцию --script
, за которой следует имя сценария. Для этого конкретного сценария будет использоваться полное сканирование соединения (-sT
), поскольку признаки могут быть собраны только путём установления полного TCP-соединения. Этот сценарий будет использовать тот же порт, что и запрос сканирования Nmap.
root@KaliLinux:~# nmap -sT 172.16.36.135 -p 22 --script=banner
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-19 04:56 EST
Nmap scan report for 172.16.36.135
Host is up (0.00036s latency).
PORT STATE SERVICE
22/tcp open ssh
|_banner: SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1
MAC Address: 00:0C:29:3D:84:32 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds
В приведённом примере сканируется порт 22 системы Metasploitable2. Помимо указания того, что порт открыт, Nmap также использует сценарий признаков для сбора признаков, связанных с этим портом. Опцию --notation
можно использовать для применения той же процедуры к диапазону портов.
root@KaliLinux:~# nmap -sT 172.16.36.135 -p 1-100 --script=banner
Starting Nmap 6.25 ( http://nmap.org ) at 2013-12-19 04:56 EST
Nmap scan report for 172.16.36.135
Host is up (0.0024s latency).
Not shown: 94 closed ports
PORT STATE SERVICE
21/tcp open ftp
|_banner: 220 (vsFTPd 2.3.4)
22/tcp open ssh
|_banner: SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1
23/tcp open telnet
|_banner: \xFF\xFD\x18\xFF\xFD \xFF\xFD#\xFF\xFD'
25/tcp open smtp
|_banner: 220 metasploitable.localdomain ESMTP Postfix (Ubuntu)
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 10.26 seconds
Другой вариант для сбора признаков — использование сценариев NSE в Nmap. Это может эффективно упростить процесс сбора информации двумя способами: во-первых, поскольку Nmap Уже существует в вашем наборе инструментов, часто используется для исследования целей и сервисов; кроме того, процесс извлечения признаков может выполняться параллельно с этими сканированиями. Сканирование TCP-соединений с дополнительными сценариями и параметрами признаков может выполнять задачи перечисления сервисов и сбора признаков.
Amap — это инструмент для отображения приложений, который можно использовать для считывания признаков с сетевых устройств, работающих на удалённом порту. В этом секрете показано, как использовать Amap для получения признаков сервиса, чтобы идентифицировать и определять открытые порты на целевой системе.
Чтобы использовать Amap для сбора признаков сервиса, вам необходимо иметь доступ к удалённой системе с открытым информационным сервисом при подключении к клиентскому устройству. Пример использует Metasploitable2 для выполнения этой задачи. Для получения дополнительной информации о настройке Metasploitable2 обратитесь к разделу «Установка Metasploitable2» в главе 1.
Опция -B
в Amap может использоваться для запуска приложения в режиме признаков. Это заставляет его собирать признаки для определённых IP-адресов и номеров портов. Amap может собирать признаки отдельных сервисов, указывая удалённый IP-адрес и номер службы.
root@KaliLinux:~# amap -B 172.16.36.135 21
amap v5.4 (www.thc.org/thc-amap) started at 2013-12-19 05:04:58 - BANNER mode
Banner on 172.16.36.135:21/tcp : 220 (vsFTPd 2.3.4)\r\n
amap v5.4 finished at 2013-12-19 05:04:58
В этом примере Amap извлекает признаки сервиса с системы Metasploitable2 172.16.36.135
через порт 21. Эту команду также можно изменить для сканирования диапазона портов. Чтобы выполнить сканирование по всем возможным портам TCP, необходимо охватить все возможные адреса портов. Определённая часть заголовка TCP, которая включает исходный и целевой адреса портов, имеет длину 16 бит, каждый из которых может быть равен 1 или 0. Таким образом, всего существует 65536 возможных адресов портов TCP. Чтобы просканировать всё возможное адресное пространство, необходимо предоставить диапазон от 1 до 65535.
root@KaliLinux:~# amap -B 172.16.36.135 1-65535
amap v5.4 (www.thc.org/thc-amap) started at 2014-01-24 15:54:28 - BANNER mode
Banner on 172.16.36.135:22/tcp : SSH-2.0-OpenSSH_4.7p1 Debian- 8ubuntu1\n
Banner on 172.16.36.135:21/tcp : 220 (vsFTPd 2.3.4)\r\n
Banner on 172.16.36.135:25/tcp : 220 metasploitable.localdomain ESMTP Postfix (Ubuntu)\r\n
...
amap v5.4 finished at 2014-01-24 15:54:35
Вывод Amap предоставляет некоторую бесполезную и избыточную информацию, которую можно удалить. Особенно полезно удалить метаданные сканирования (Banner
) и повторяющиеся IP-адреса во всём сканировании. Чтобы удалить метаданные сканирования, мы должны использовать grep
для поиска определённого ключевого слова в выводе, которое уникально для конкретного вывода и не присутствует в метаданных сканирования. Здесь мы можем использовать grep
для поиска слова on
.
root@KaliLinux:~# amap -B 172.16.36.135 1-65535 | grep "on"
Banner on 172.16.36.135:22/tcp : SSH-2.0-OpenSSH_4.7p1 Debian- 8ubuntu1\n
Banner on 172.16.36.135:23/tcp : #'
Banner on 172.16.36.135:21/tcp : 220 (vsFTPd 2.3.4)\r\n
Banner on 172.16.36.135:25/tcp : 220 metasploitable.localdomain ESMTP Postfix (Ubuntu)\r\n
...
Мы можем разделить каждую строку вывода с помощью двоеточия (:
) и сохранить поля 2–5, удалив слово Banner
, а также повторяющиеся IP-адреса из вывода.
root@KaliLinux:~# amap -B 172.16.36.135 1-65535 | grep "on" | cut -d ":" -f 2-5
21/tcp : 220 (vsFTPd 2.3.4)\r\n
22/tcp : SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1\n
1524/tcp : root@metasploitable/#
25/tcp : 220 metasploitable.localdomain ESMTP Postfix (Ubuntu)\r\n
...
Принцип работы Amap на нижнем уровне для выполнения задач извлечения признаков такой же, как и у других обсуждаемых инструментов. Amap перебирает список целевых адресов портов, пытается установить соединение с каждым портом, а затем принимает любые возвращаемые признаки, отправленные через соединение между службой и портом.
Хотя извлечение признаков является ценным источником информации, идентификация сервисов становится всё менее важной по сравнению с обнаружением версий в характеристиках сервисов. Nmap обладает функцией идентификации сервисов, которая представляет собой нечто большее, чем просто механизм извлечения признаков. Этот секрет показывает, как использовать Nmap для анализа на основе анализа ответов для выполнения идентификации сервисов.
Для использования Nmap для идентификации сервисов вам потребуется доступ к сетевой службе, работающей на удалённой системе, которую можно исследовать. Приведённый пример использует Metasploitable2 для этой цели. Для получения дополнительных сведений о настройке Metasploitable2 см. раздел «Установка Metasploitable2» в первой главе.
Чтобы понять эффективность функций Nmap, мы должны рассмотреть сервисы, которые не предоставляют самораскрывающуюся информацию о сервисах. Используя Netcat, подключитесь к системе Metasploitable2 через TCP 80. Nmap и Amap: сканирование портов и определение сервисов
В данном тексте описывается использование утилит Nmap и Amap для сканирования портов и определения сервисов на удалённом хосте.
Nmap — это утилита с открытым исходным кодом, которая используется для сканирования сети и определения открытых портов, служб и версий программного обеспечения. Она может использоваться для аудита безопасности, обнаружения уязвимостей и других задач.
Amap (THC-Amap) — это ещё одна утилита для сканирования портов, которая похожа на Nmap, но имеет некоторые отличия в функциональности и возможностях.
В тексте приводятся примеры использования Nmap и Amap для определения сервисов на удаленном хосте с IP-адресом 172.16.36.135. В первом примере показано, как использовать Nmap для сканирования порта 80 и определения сервиса Apache HTTPD версии 2.2.8. Во втором примере показано, как использовать Amap для идентификации сервисов на одном порту или нескольких портах.
Также в тексте упоминается, что Nmap и Amap используют сложные методы сканирования и анализа ответов для определения сервисов. Они могут отправлять различные запросы и анализировать ответы, чтобы определить тип сервиса и его версию.
Текст также содержит информацию о том, что результаты сканирования могут быть неточными, и рекомендуется проверять их вручную. Для создания запроса IP-уровня мы должны присвоить объекту IP
переменной i
. С помощью функции display
можно проверить конфигурацию объекта. Обычно в качестве адреса отправки и получения используется адрес обратной связи 127.0.0.1
, поэтому его нужно заменить на целевой адрес.
Снова вызвав функцию display
, мы увидим, что изменился не только целевой адрес, но и Scapy автоматически обновил исходный IP-адрес на адрес, связанный с используемым интерфейсом. Теперь у нас есть успешно созданный запрос IP-уровня. Поскольку мы создали запрос IP-уровня, мы можем приступить к созданию запроса ICMP-уровня.
Для создания запроса ICMP-уровня используем тот же метод, что и для IP-уровня: присваиваем объект ICMP
переменной ping
. Конфигурацию по умолчанию можно проверить с помощью функции dispaly
. Обычно тип ICMP уже установлен как echo-request
.
Поскольку мы создали запросы IP и ICMP уровней, нам нужно объединить их, чтобы создать полный запрос. Это делается путём наложения одного слоя на другой.
Теперь, когда запрос создан, мы можем передать его функции sr1
для анализа ответа.
После передачи запроса функция sr1
начинает отправку пакетов. После завершения отправки она ожидает ответа и анализирует его. Ответ представляет собой новый объект, который можно отобразить с помощью функции display
.
Тот же запрос можно создать без отдельного создания и наложения каждого уровня. Вместо этого мы можем использовать однострочную команду, вызывая функцию напрямую и передавая ей соответствующие параметры.
При отправке запроса на Linux-систему ответ будет иметь TTL (время жизни пакета) равное 64. При отправке того же запроса на Windows-систему TTL будет равен 128.
Этот тест можно легко выполнить в Python:
from scapy.all import *
ans = sr1(IP(dst="172.16.36.135")/ICMP())
if int(ans[IP].ttl) <= 64:
print("Host is Linux")
else:
print("Host is Windows")
Если значение TTL меньше или равно 64, то предполагается, что устройство работает под управлением Linux/Unix операционной системы. Если значение больше 64, предполагается, что устройство может работать под управлением Windows операционной системы. Весь процесс можно автоматизировать с помощью скрипта на Python. В запросе представлен текст на английском языке технической направленности из области разработки и тестирования программного обеспечения.
STRING: "snmp.exe" STRING: "snmptrap.exe" STRING: "TPAutoConnect.exe" STRING: "alg.exe" STRING: "cmd.exe" STRING: "postgres.exe" STRING: "freeSSHd 1.2.0" STRING: "CesarFTP 0.99g" STRING: "VMware Tools" STRING: "Python 2.7.1" STRING: "WebFldrs XP" STRING: "VMware Tools"
Кроме того, список запущенных процессов и установленных приложений можно найти в выходных данных. Эта информация очень полезна при перечислении сервисов, работающих на целевой системе, а также при выявлении потенциальных уязвимостей.
Принцип работы
В отличие от Onesixtyone, SNMPwalk не только может обнаруживать использование стандартных строк SNMP-групп, но и может собирать большое количество информации с целевой системы с помощью этой конфигурации. Это достигается путём последовательного использования запросов SNMP GETNEXT и использования этих запросов для взлома всей доступной информации в системе.
4.14 Сканирование брандмауэра
Оценивая ответ на пакетную инъекцию, мы можем определить, фильтруется ли удалённый порт брандмауэром. Чтобы полностью понять этот процесс, мы можем использовать Scapy для выполнения этой задачи на уровне пакетов.
Подготовка
Чтобы использовать Scapy для обнаружения брандмауэров, вам необходимо запустить удалённую систему сетевых служб. Кроме того, вам потребуется реализовать некоторые механизмы фильтрации. Это можно сделать с помощью автономного устройства брандмауэра или на основе хоста, например, Windows Firewall. Изменяя настройки фильтрации брандмауэрного устройства, вы сможете изменить ответ на внедряемые пакеты.
Шаги
Для эффективного определения того, фильтруется ли TCP-порт, необходимо отправить пакеты SYN и ACK на целевой порт. На основе ответов на эти внедряемые пакеты мы сможем определить, фильтрует ли порт. Эти два пакета могут вызвать четыре различных комбинации ответов. Мы обсудим каждую ситуацию, что она означает для фильтрации целевого порта и как её протестировать. Вот четыре возможных комбинации ответов:
| | SYN | ACK | | | --- | --- | | 1 | Нет ответа | RST | Состояние фильтрации, запрет на подключение | | 2 | SYN + ACK/RST | Нет ответа | Состояние фильтрации, запретить исходящее соединение | | 3 | SYN + ACK/RST | RST | Без фильтрации, SYN получает ACK, порт открыт, иначе закрыт | | 4 | Нет ответа | Нет ответа | Без состояния фильтрации |
В первом сценарии мы должны рассмотреть конфигурацию, в которой SYN-запрос не получает ответа, а ACK-запрос получает RST-ответ. Для проверки этого мы сначала должны отправить пакет ACK TCP на целевой порт. Чтобы отправить пакет TCP ACK на любой заданный порт, мы сначала должны создать запрос уровня, начиная с создания IP-слоя:
root@KaliLinux:~# scapy Welcome to Scapy (2.2.0)
>>> i = IP()
>>> i.display()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= ip
chksum= None
src= 127.0.0.1
dst= 127.0.0.1
\options\
>>> i.dst = "172.16.36.135"
>>> i.display()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= ip
chksum= None
src= 172.16.36.180
dst= 172.16.36.135
\options\
Чтобы создать IP-слой запроса, мы присваиваем IP
объект переменной i
. Вызывая функцию display
, мы определяем атрибуты объекта. Обычно адреса отправки и получения устанавливаются на адрес обратной связи, 127.0.0.1. Эти значения можно изменить, установив i.dst
в строку желаемого целевого адреса. Повторно вызывая функцию dislay
, мы видим, что не только обновляется целевой адрес, но также автоматически обновляется исходный IP-адрес, связанный с выбранным интерфейсом. Теперь, когда у нас есть созданный IP-слой, мы можем создать TCP-слой.
>>> t = TCP()
>>> t.display()
###[ TCP ]###
sport= ftp_data
dport= http
seq= 0
ack= 0
dataofs= None
reserved= 0
flags= S
window= 8192
chksum= None
urgptr= 0
options= {}
>>> t.dport = 22
>>> t.flags = 'A'
>>> t.display()
###[ TCP ]###
sport= ftp_data
dport= ssh
seq= 0
ack= 0
dataofs= None
reserved= 0
flags= A
window= 8192
chksum= None
urgptr= 0
options= {}
Чтобы создать TCP-уровень запроса, мы используем ту же технику, что и для IP-уровня. Здесь TCP
объект присваивается переменной t
. Как упоминалось ранее, значения по умолчанию можно определить, вызвав функцию display
. Здесь мы видим, что порт назначения по умолчанию — HTTP-порт 80. Для нашего первоначального сканирования мы оставляем TCP без изменений. Теперь, когда мы создали TCP и IP слои, нам нужно объединить их, чтобы создать запрос.
>>> request = (i/t)
>>> request.display()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= tcp
chksum= None
src= 172.16.36.180
dst= 172.16.36.135
\options\
###[ TCP ]###
sport= ftp_data
dport= ssh
seq= 0
ack= 0
dataofs= None
reserved= 0
flags= A
window= 8192
chksum= None
urgptr= 0
options= {}
Мы объединяем IP и TCP слои, разделяя переменные косой чертой. Эти слои затем присваиваются новой переменной, которая представляет весь запрос. Впоследствии мы можем вызвать функцию dispaly
, чтобы просмотреть конфигурацию запроса. После создания запроса его можно передать функции sr1
для анализа ответа:
>>> response = sr1(request,timeout=1)
..Begin emission:
.........Finished to send 1 packets.
....*
Received 16 packets, got 1 answers, remaining 0 packets
>>> response.display()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 40
id= 0
flags= DF
frag= 0L
ttl= 63
proto= tcp
chksum= 0x9974
src= 172.16.36.135
dst= 172.16.36.180
\options\
###[ TCP ]###
sport= ssh
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
reserved= 0L
flags= R
window= 0
chksum= 0xe5b
urgptr= 0
options= {}
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00'
Тот же запрос можно выполнить без создания и объединения каждого слоя. Вместо этого мы используем одну команду, передавая соответствующие параметры:
>>> response = sr1(IP(dst="172.16.36.135")/TCP(dport=22,flags='A'),timeout=1)
..Begin emission: **Необходимо перевести текст с английского языка на русский.**
...Закончил отправку 1 пакета.
....*
Получено 15 пакетов, получено 1 ответов, осталось 0 пакетов
>>> ответ
<IP версия=4L ihl=5L tos=0x0 len=40 id=0 flags=DF frag=0L ttl=63 протокол=tcp chksum=0x9974 src=172.16.36.135 dst=172.16.36.180 параметры=[] |<TCP sport=ssh dport=ftp_data seq=0 ack=0 dataofs=5L зарезервировано=0L flags=R window=0 chksum=0xe5b urgptr=0 |<Padding нагрузка='\x00\x00\x00\x00\x00\x00' |>>>
Следует обратить внимание, что в этом конкретном сценарии ответ на внедряемый пакет ACK — это пакет RST. Следующим шагом теста является внедрение пакета SYN таким же образом.
>>> ответ = sr1(IP(dst="172.16.36.135")/TCP(dport=22,flags='S'),timeout=1,verbose =1)
Начало передачи:
Завершено отправление 1 пакетов.
Получено 9 пакетов, получен 0 ответов, остался 1 пакет
После отправки пакета SYN запроса таким же способом не было получено никакого ответа, и функция разорвала соединение по истечении времени ожидания. Эта комбинация ответов указывает на то, что произошло фильтрование пакетов по состоянию. Сокет отбросил пакет SYN-запроса, отказавшись от всех входящих соединений, но не отфильтровал пакет ACK, чтобы гарантировать, что исходящие соединения и продолжающийся обмен данными всё ещё существуют. Эту комбинацию ответов можно протестировать в Python, чтобы подтвердить наличие фильтрации портов по состоянию:
root@KaliLinux:~# python
Python 2.7.3 (default, Jan 2 2013, 16:53:07)
[GCC 4.7.2] on linux2
Введите «помощь», «авторское право», «кредиты» или «лицензия» для получения дополнительной информации.
>>> из scapy.all import *
>>> ACK_ответ = sr1(IP(dst="172.16.36.135")/TCP(dport=22,flags='A'),timeout=1,verbose =0)
>>> SYN_ответ = sr1(IP(dst="172.16.36.135")/TCP(dport=22,flags='S'),timeout=1,verbose =0)
>>> если ((ACK_ответ == Нет) или (SYN_ответ == Нет)) и не ((ACK_ответ ==Нет) и (SYN_ответ == Нет)):
... печать "Фильтрация по состоянию включена"
... Фильтрация по состоянию включена
>>> выход()
Используя Scapy для генерации каждого запроса, тест можно использовать для оценки этих ответов, чтобы определить, принимаются ли ответы на запросы ACK или SYN (но не на все). Этот тест эффективен для определения этого сценария и следующего сценария, в котором принимается ответ на инъекцию SYN, а не ACK.
Инъекция SYN получила ответ SYN+ACK или RST+ACK, но инъекция ACK не получила ответа, также указывая на наличие фильтрации по состоянию. Остальная часть теста такая же. Сначала отправьте пакет ACK на целевой порт.
>>> ответ = sr1(IP(dst="172.16.36.135")/TCP(dport=22,flags='A'),timeout=1,verbose =1)
Начало передачи:
Завершено отправление 1 пакета.
Получен 16 пакетов, получен 0 ответов, остался 1 пакет
В этом сценарии можно выполнить точно такой же тест, и если один из двух запросов на внедрение получил ответ, тест показывает, что существует фильтрация по состоянию.
root@KaliLinux:~# python
Python 2.7.3 (default, Jan 2 2013, 16:53:07)
[GCC 4.7.2] on linux2
Введите «помощь», «авторское право», «кредиты» или «лицензия» для получения дополнительной информации.
>>> из scapy.all import *
>>> ACK_ответ = sr1(IP(dst="172.16.36.135")/TCP(dport=22,flags='A'),timeout=1,verbose =0)
>>> SYN_ответ = sr1(IP(dst="172.16.36.135")/TCP(dport=22,flags='S'),timeout=1,verbose =0)
>>> если ((ACK_ответ == Нет) или (SYN_ответ == Нет)) и не ((ACK_ответ ==Нет) и (SYN_ответ == Нет)):
... печать "Фильтрация по состоянию включена"
... Фильтрация по состоянию включена
>>> выход()
Комбинация ответов указывает на то, что фильтрация по состоянию выполняется для пакетов ACK, и любой соответствующий контексту внешний пакет ACK будет отброшен. Однако попытка входящего соединения указывает на то, что порт не полностью отфильтровывается.
Другой возможный сценарий заключается в том, что инъекции SYN и ACK получили ожидаемые ответы. В этом случае нет никакой формы фильтрации. Чтобы выполнить тест для этой ситуации, мы сначала выполняем инъекцию ACK, затем анализируем ответ:
>>> ответ =
sr1(IP(dst="172.16.36.135")/TCP(dport=22,flags='A'),timeout=1,verbose=1)
Начало передачи:
Завершено отправление 1 пакета.
Получено 5 пакетов, получен 1 ответ, осталось 0 пакетов
>>> ответ.отобразить()
###[ IP ]###
версия= 4L
ihl= 5L
tos= 0x0
len= 40
id= 0
флаги= DF
frag= 0L
ttl= 64
протокол= tcp
chksum= 0x9974
src= 172.16.36.135
dst= 172.16.36.180
\параметры\
###[ TCP ]###
sport= ssh
dport= ftp_data
seq= 0
ack= 0
dataofs= 5L
зарезервировано= 0L
флаги= R
window= 0
chksum= 0xe5b
urgptr= 0
параметры= {}
###[ Padding ]###
нагрузка= '\x00\x00\x00\x00\x00\x00'
Если пакет не был отфильтрован, внешний пакет ACK отправляется на целевой порт и должен генерировать ответный пакет RST. Этот пакет RST указывает на то, что пакет ACK не соответствует контексту и намеревается разорвать соединение. После отправки инъекции ACK мы можем отправить инъекцию SYN на тот же порт.
>>> ответ =
sr1(IP(dst="172.16.36.135")/TCP(dport=22,flags='S'),timeout=1,verbose =1)
Начало передачи:
Завершено отправление 1 пакета.
Получено 4 пакета, получен 1 ответ, осталось 0 пакетов
>>> ответ.отобразить()
###[ IP ]###
версия= 4L
ihl= 5L
tos= 0x0
len= 44
id= 0
флаги= DF
frag= 0L
ttl= 64
протокол= tcp
chksum= 0x9970
src= 172.16.36.135
dst= 172.16.36.180
\параметры\
###[ TCP ]###
sport= ssh
dport= ftp_data
seq= 1147718450
ack= 1
dataofs= 6L
зарезервировано= 0L
флаги= SA
window= 5840
chksum= 0xd024
urgptr= 0
параметры= [('MSS', 1460)]
###[ Padding ]### **В ситуации, когда порт не отфильтрован и открыт, возвращается SYN+ACK ответ.**
Следует обратить внимание, что значение атрибута `flags` является переменной типа `long`, значение которой равно 18. Это значение можно легко преобразовать в переменную типа `int` с помощью функции `int`. Значение 18 представляет собой десятичное значение последовательности битовых флагов TCP. Десятичное значение флага SYN равно 2, а десятичное значение ACK — 16.
Если предположить, что состояние не фильтруется, мы можем оценить преобразование целочисленного значения `flags` TCP, чтобы проверить, открыт ли порт в Python.
**Мы можем выполнить аналогичный тест, чтобы определить, закрыт ли нефильтрованный порт.** Нефильтрованный закрытый порт активирует RST и ACK. Как и раньше, ACK равен 16, RST равен 4. Поэтому преобразование целочисленных значений `flags` для нефильтрованного закрытого порта должно быть равно 20:
Аналогичным образом, если ни один из пакетов не получает ответа, это означает, что порт либо не имеет состояния фильтрации, либо хост не работает. Однако попытка реализовать это на практике приводит к ошибке, поскольку Python не может получить доступ к атрибуту `__getitem__` объекта `NoneType`. Чтобы избежать этой проблемы, необходимо сначала проверить отсутствие ответов.
Этот завершённый тестовый сценарий впоследствии можно интегрировать в единый функциональный скрипт. Этот скрипт принимает два параметра: целевой IP-адрес и порт, который нужно протестировать. Затем он внедряет пакеты ACK и SYN. Текст технической направленности из области разработки и тестирования программного обеспечения:
Если есть ответ, он будет сохранён для оценки. Затем выполняются четыре теста, чтобы определить, существует ли фильтрация на порту. Сначала выполняется тест, чтобы определить, не было ли получено никакого ответа. Если это так, вывод будет означать, что удалённый хост разбился или порт имеет бесстатусную фильтрацию и отбрасывает весь трафик. Если получен какой-либо запрос, выполняется тест, чтобы определить, был ли принят какой-либо инжектированный ответ, а не все. Если да, то вывод покажет, что на порту есть статусная фильтрация. Наконец, если оба инжекта получили ответ, порт будет идентифицирован как фильтрующий состояние, и будет оцениваться TCP-флаг, чтобы определить, открыт или закрыт порт.
В локальной файловой системе создаётся скрипт, после чего необходимо обновить права доступа к файлу, чтобы разрешить выполнение скрипта. Команда chmod может использоваться для обновления этих разрешений, после чего скрипт можно выполнить, вызвав его напрямую и передав ожидаемые параметры:
После создания скрипта в локальной файловой системе необходимо обновить разрешения файла, чтобы позволить скрипту выполняться. Команда `chmod` может быть использована для изменения этих разрешений. После этого скрипт может быть выполнен путём прямого вызова и передачи ожидаемых параметров:
root@KaliLinux:# chmod 777 ACK_FW_detect.py
root@KaliLinux:# ./ACK_FW_detect.py
Usage - ./ACK_FW_detect.py [Target-IP] [Target Port]
Example - ./ACK_FW_detect.py 10.0.0.5 443
Example will determine if filtering exists on port 443 of host 10.0.0.5
root@KaliLinux:# ./ACK_FW_detect.py 172.16.36.135 80
Port is unfiltered and open
root@KaliLinux:# ./ACK_FW_detect.py 172.16.36.134 22
Host is either unstatefully filtered or is down
**Принцип работы**
SYN и ACK TCP-флаги играют ключевую роль в установлении состояния соединения в сети. SYN-запрос позволяет установить новое TCP-соединение, а ACK-ответ применяется для поддержания соединения до его закрытия. Порт отвечает на один из этих типов пакетов, но не на другой, поэтому может существовать фильтрация, основанная на состоянии сеанса для ограничения трафика. Определив эту ситуацию, мы можем сделать вывод о наличии фильтрации состояния на порту.
Nmap имеет упрощённую функцию обнаружения фильтрации брандмауэра, основанную на ACK-ответе на обнаружение фильтрации на порту. Эта функция может использоваться для проверки одного порта или последовательности нескольких портов, чтобы определить состояние фильтрации.
**Подготовка**
Чтобы использовать Nmap для выполнения обнаружения фильтрации брандмауэром, вам необходимо запустить удалённую систему с работающим сетевым сервисом. Кроме того, вы должны реализовать некоторые механизмы фильтрации. Это можно сделать с помощью отдельного устройства брандмауэра или на основе хоста, такого как Windows Firewall. Изменяя ответы на инжектированные пакеты, которые проходят через устройство брандмауэра, вы можете настроить фильтрацию.
**Шаги операции**
Для выполнения сканирования брандмауэра Nmap с использованием ACK, Nmap следует вызывать с указанным IP-адресом, целевым портом и опцией `-sA`.
Через сканирование на локальном компьютере в сети с системой Metasploitable2, трафик не проходит через брандмауэр, и ответ указывает, что порт TCP 22 не фильтруется. Однако при выполнении того же сканирования на удалённом IP-адресе `packtpub.com`, порт 22 фильтруется. Выполняя то же сканирование без указания порта, оценка фильтрации портов может быть выполнена на 1000 наиболее часто используемых портов Nmap.
На локальном компьютере в сети с Metasploit2 система не защищена никаким брандмауэром. Ответ показывает, что все порты не фильтруются. При выполнении того же сканирования в домене `packtpub.com` все порты, кроме TCP-порта 80, который является местом развёртывания веб-приложения, определяются как фильтруемые. Обратите внимание, что в выводе отображаются только нефильтрованные порты при сканировании диапазона портов.
Чтобы выполнить сканирование всех возможных портов TCP, необходимо перебрать все возможные адреса портов. Определение исходного и целевого адресов портов в заголовке TCP составляет 16 бит, каждый из которых может иметь значение 1 или 0. Таким образом, всего существует 65536 возможных адресов портов TCP. Чтобы просканировать всё возможное адресное пространство, необходимо предоставить диапазон от 1 до 65535. **Работа Nmap**
Помимо множества функций, предоставляемых Nmap, он также может использоваться для идентификации фильтрации брандмауэра. Это означает, что Nmap использует те же методы, которые обсуждались в Scapy, для выполнения этой идентификации брандмауэров. Комбинация SYN и ACK пакетов отправляется на целевой порт, и анализ ответа используется для определения состояния фильтрации.
**4.18 Идентификация брандмауэра с помощью Metasploit**
Metasploit имеет вспомогательный модуль сканирования, который можно использовать для многопоточного анализа сетевых портов на основе анализа ответов SYN/ACK, чтобы определить, фильтруется ли порт.
**Подготовка**
Чтобы использовать Metasploit для идентификации брандмауэра, вам необходимо запустить удалённую систему с сетевыми службами. Кроме того, вам нужно реализовать некоторые механизмы фильтрации. Это можно сделать с помощью отдельного устройства брандмауэра или на основе хоста, например, Windows Firewall. Изменяя настройки фильтрации на устройстве брандмауэра, вы должны быть в состоянии изменить ответ на внедряемые пакеты.
**Шаги операции**
Для использования модуля сканирования ACK Metasploit для идентификации брандмауэра и фильтрации, сначала запустите консоль MSF с терминала Kali, а затем используйте команду «use» для выбора необходимого вспомогательного модуля.
root@KaliLinux:~# msfconsole
\ ,__,
\ (oo)____
(__) )\
||--|| *
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]
msf > use auxiliary/scanner/portscan/ack msf auxiliary(ack) > show options
Module options (auxiliary/scanner/portscan/ack):
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. 22- 25,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
После выбора модуля вы можете использовать команду «show options», чтобы подтвердить или изменить конфигурацию сканирования. Эта команда отображает таблицу с четырьмя столбцами, включая имя, текущие настройки, обязательные и описание. В столбце «имя» перечислены имена каждой настраиваемой переменной. Столбец «текущие настройки» содержит текущую конфигурацию любой заданной переменной. В столбце «обязательные» указано, является ли значение обязательным для любой данной переменной. Столбец описания описывает функцию каждой переменной. Значение любой заданной переменной можно изменить с помощью команды «set», указав новое значение в качестве параметра.
msf auxiliary(ack) > set PORTS 1-100 PORTS => 1-100 msf auxiliary(ack) > set RHOSTS 172.16.36.135 RHOSTS => 172.16.36.135 msf auxiliary(ack) > set THREADS 25 THREADS => 25 msf auxiliary(ack) > show options
Module options (auxiliary/scanner/portscan/ack):
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-100 yes Ports to scan (e.g. 22- 25,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 25 yes The number of concurrent threads
TIMEOUT 500 yes The reply read timeout in milliseconds
В этом примере значение RHOSTS было изменено на IP-адрес системы, которую мы хотим сканировать. Кроме того, количество потоков было изменено на 20. Значение THREADS определяет количество текущих задач, выполняемых в фоновом режиме. Определение количества потоков включает в себя поиск баланса между ускорением задачи и предотвращением чрезмерного использования системных ресурсов. Для большинства систем 20 потоков могут быть достаточно быстрыми и относительно разумными. После проверки необходимых переменных можно выполнить сканирование.
msf auxiliary(ack) > run
[] Scanned 1 of 1 hosts (100% complete) [] Auxiliary module execution completed
Этот пример показывает только информацию о сканировании источника, которая указывает количество просканированных систем и завершение выполнения модуля. Отсутствие вывода связано с тем, что ответы, связанные с SYN и ACK инъекциями, напрямую достигают другого порта, поскольку система Metasploitable2 не имеет брандмауэра. Вместо этого, если мы выполним такое же сканирование на packtpub.com, изменив значение RHOSTS на соответствующий IP-адрес, мы получим ненужный вывод. Поскольку этот хост находится за брандмауэром, изменения в ответах от нефильтрованных портов включают в себя:
msf auxiliary(ack) > set RHOSTS 83.166.169.228 RHOSTS => 83.166.169.228 msf auxiliary(ack) > show options
Module options (auxiliary/scanner/portscan/ack):
Name Current Setting Required
| Параметр | Значение | Примечание | Описание |
| --- | --- | --- | --- |
| BATCHSIZE | 256 | да | Количество хостов для сканирования за один раз. |
| INTERFACE | нет | — | Имя интерфейса. |
| PORTS | 1–100 | да | Порты для сканирования (например, 22–25, 80, 110–900). |
| RHOSTS | 83.166.169.228 | да | Целевой диапазон адресов или CIDR-идентификатор. |
| SNAPLEN | 65535 | да | Число байт для захвата. |
| THREADS | 25 | да | Количество одновременных потоков. |
| TIMEOUT | 500 | да | Таймаут ожидания ответа в миллисекундах.
msf auxiliary(ack) > run [] TCP UNFILTERED 83.166.169.228:80 [] Сканирован 1 из 1 хостов (100% выполнено) [*] Выполнение вспомогательного модуля завершено
Metasploit имеет вспомогательный модуль, который может выполнять распознавание межсетевого экрана с использованием различных техник, которые обсуждались ранее. Однако Metasploit также предоставляет некоторые функции для анализа контекста межсетевого экрана, которые могут быть использованы для сбора другой информации и даже эксплуатации.
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.