Вопрос или проблема
Существует инструмент под названием Visual RoundTrip Analyzer (VRTA) для MS-Windows, который показывает все SYN и SYN-ACK, а также другие компоненты веб-страницы и время их обработки. Я знаю, что в большинстве веб-браузеров есть аналогичный инструмент для проверки производительности во время работы в интернете. Существует ли независимый инструмент в GNU/Linux, который может предоставить такую же информацию? Я использую Debian и хотел бы получить что-то с выводом в виде SYNK и ACK.
Как видно, я ищу что-то подобное в виде отдельной утилиты.
Вы можете отслеживать сетевой трафик с помощью Scapy, который может захватывать и анализировать весь веб-трафик (и сделать многое другое), чтобы визуализировать время для каждого запроса и ответа. Вы даже можете инициировать различные запросы прямо из Scapy, чтобы исключить зависимость от браузера. Некоторые примеры такого использования можно увидеть на демонстрационной странице. Например (приведенный пример):
Классическое сканирование SYN можно инициализировать, выполнив следующую команду в Scapy:
>>> sr1(IP(dst="72.14.207.99")/TCP(dport=80,flags="S"))
Вышеуказанная команда отправит один SYN-пакет на 80 порт Google и завершит работу после получения единственного ответа:
Начало эмиссии: .Завершено отправлено 1 пакет.
* Получено 2 пакета, 1 ответ, осталось 0 пакетов <IP версия=4L ihl=5L tos=0x20 len=44 id=33529 flags= frag=0L ttl=244 proto=TCP chksum=0x6a34 src=72.14.207.99 dst=192.168.1.100 options=// | <TCP sport=www dport=ftp-data seq=2487238601L ack=1 dataofs=6L reserved=0L flags=SA window=8190 chksum=0xcdc7 urgptr=0 options=[('MSS', 536)] | <Padding load='V\xf7' |>>>
Из приведенного выше вывода можно увидеть, что Google вернул флаг “SA” или SYN-ACK, указывающий на открытый порт.
Используйте любой из следующих форматов для сканирования портов с 400 по 443 на системе:
>>> sr(IP(dst="192.168.1.1")/TCP(sport=666,dport=(440,443),flags="S"))
или
>>> sr(IP(dst="192.168.1.1")/TCP(sport=RandShort(),dport=[440,441,442,443],flags="S"))
Для быстрого просмотра ответов просто запросите сводку собранных пакетов:
>>> ans,unans = _
>>> ans.summary()
IP / TCP 192.168.1.100:ftp-data > 192.168.1.1:440 S ======> IP / TCP 192.168.1.1:440 > 192.168.1.100:ftp-data RA / Padding
IP / TCP 192.168.1.100:ftp-data > 192.168.1.1:441 S ======> IP / TCP 192.168.1.1:441 > 192.168.1.100:ftp-data RA / Padding
IP / TCP 192.168.1.100:ftp-data > 192.168.1.1:442 S ======> IP / TCP 192.168.1.1:442 > 192.168.1.100:ftp-data RA / Padding
IP / TCP 192.168.1.100:ftp-data > 192.168.1.1:https S ======> IP / TCP 192.168.1.1:https > 192.168.1.100:ftp-data SA / Padding
Вышеуказанное будет отображать пары стимулов/ответов для ответов на запросы. Мы можем отобразить только информацию, которая нас интересует, используя простой цикл:
>>> ans.summary( lambda(s,r): r.sprintf("%TCP.sport% \t %TCP.flags%") )
440 RA
441 RA
442 RA
https SA
Даже лучше, можно создать таблицу с помощью функции make_table() для отображения информации о нескольких объектах:
>>> ans,unans = sr(IP(dst=["192.168.1.1","yahoo.com","slashdot.org"])/TCP(dport=[22,80,443],flags="S"))
Начало эмиссии:
.......*.**.......Завершено отправлено 9 пакетов.
**.*.*..*..................
Получено 362 пакета, 8 ответов, осталось 1 пакета
>>> ans.make_table(
... lambda(s,r): (s.dst, s.dport,
... r.sprintf("{TCP:%TCP.flags%}{ICMP:%IP.src% - %ICMP.type%}")))
66.35.250.150 192.168.1.1 216.109.112.135
22 66.35.250.150 - dest-unreach RA -
80 SA RA SA
443 SA SA SA
Приведенный выше пример даже выведет тип ICMP-ошибки, если ICMP-пакет был получен в ответ вместо ожидаемого TCP.
Для более крупных сканирований мы можем заинтересоваться выводом только определенных ответов. Пример ниже будет отображать только пакеты с установленным флагом “SA”:
>>> ans.nsummary(lfilter = lambda (s,r): r.sprintf("%TCP.flags%") == "SA")
0003 IP / TCP 192.168.1.100:ftp_data > 192.168.1.1:https S ======> IP / TCP 192.168.1.1:https > 192.168.1.100:ftp_data SA
В случае, если мы хотим провести экспертный анализ ответов, можем воспользоваться следующей командой, чтобы указать, какие порты открыты:
>>> ans.summary(lfilter = lambda (s,r): r.sprintf("%TCP.flags%") == "SA",prn=lambda(s,r):r.sprintf("%TCP.sport% is open"))
https is open
Снова, для более крупных сканирований мы можем создать таблицу открытых портов:
>>> ans.filter(lambda (s,r):TCP in r and r[TCP].flags&2).make_table(lambda (s,r):
... (s.dst, s.dport, "X"))
66.35.250.150 192.168.1.1 216.109.112.135
80 X - X
443 X X X
Если вышеуказанные методы окажутся недостаточными, Scapy включает функцию report_ports(), которая не только автоматизирует SYN-сканирование, но и генерирует вывод в LaTeX с собранными результатами:
>>> report_ports("192.168.1.1",(440,443))
Начало эмиссии:
...*.**Завершено отправлено 4 пакета.
*
Получено 8 пакетов, 4 ответа, осталось 0 пакетов
'\\begin{tabular}{|r|l|l|}\n\\hline\nhttps & открытый & SA \\\\\n\\hline\n440
& закрытый & TCP RA \\\\\n441 & закрытый & TCP RA \\\\\n442 & закрытый &
TCP RA \\\\\n\\hline\n\\hline\n\\end{tabular}\n'
Ответ или решение
Для выполнения сетевого анализа в GNU/Linux, аналогичного Visual RoundTrip Analyzer (VRTA) на платформе MS-Windows, вы можете использовать мощный инструмент под названием Scapy. Этот инструмент позволяет захватывать и анализировать сетевой трафик, что позволяет вам визуализировать время каждого запроса и ответа, включая флаги SYN и SYN-ACK.
Установка Scapy
Scapy может быть установлен из репозиториев Debian с помощью следующей команды:
sudo apt-get install python3-scapy
Основные функции Scapy
-
Отправка SYN-пакетов: С помощью Scapy вы можете отправлять SYN-пакеты к целевому адресу и видеть ответы. Пример команды для отправки SYN-пакета:
from scapy.all import * response = sr1(IP(dst="192.168.1.1")/TCP(dport=80, flags="S"))
В этом примере отправляется SYN-пакет на порт 80, а ответ будет проанализирован.
-
Анализ ответов: Scapy предоставляет возможность анализировать полученные ответы. Например, если вы получите флаги SYN-ACK, это будет означать, что порт открыт:
if response[TCP].flags == "SA": print("Порт открыт")
-
Обработка множественных запросов: Вы можете отправлять SYN-пакеты сразу на несколько портов и собирать результаты:
ans, unans = sr(IP(dst="192.168.1.1")/TCP(dport=[80, 443], flags="S")) ans.summary(lambda s, r: r.sprintf("%TCP.sport% \t %TCP.flags%"))
-
Отчет о результатах: Scapy может автоматически генерировать отчеты о состоянии портов, которые могут быть предназначены для дальнейшего анализа. Это позволяет вам быстро определить, какие порты открыты, а какие закрыты.
Пример использования
Вот пример того, как можно использовать Scapy для отправки SYN-запросов на несколько портов и анализа ответов:
from scapy.all import *
# Определите IP-адрес целевого хоста
target_host = "192.168.1.1"
# Выполните SYN-сканирование на портах 440-443
ans, unans = sr(IP(dst=target_host)/TCP(dport=range(440, 444), flags="S"))
# Подведите итоги по ответам
print("Результаты сканирования:")
ans.make_table(lambda s, r: (s.dport, r.sprintf("%TCP.flags%"), r.sprintf("%IP.src%")))
С помощью этого кода вы сможете получить таблицу с состоянием портов и флагами TCP (например, SYN, SYN-ACK и т.д.).
Заключение
Scapy является мощным и гибким инструментом для анализа сетевого трафика в GNU/Linux и позволяет производить сложные сетевые операции, такие как SYN-сканирование, с возможностью последующего анализа ответов. Он предоставляет все необходимые функции для самостоятельного анализа сетевого трафика, не завися от браузеров или других приложений.