🖧 Генерация TCP трафика на Linux |

🖧 Генерация TCP трафика на Linux

Мануал

Обзор

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

TCP-клиент

Протокол управления передачей (TCP) – это протокол транспортного уровня, который обеспечивает надежную и ориентированную на соединение связь между узлами по сети.

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

К таким протоколам относятся HTTP, RESP и SSH.

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

Например, инструмент командной строки wget способен генерировать HTTP-запросы и использует TCP в качестве протокола транспортного уровня.

🖧 В чем разница между curl и Wget?

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

В этом смысле инструмент командной строки wget не может считаться TCP-клиентом.

Это происходит потому, что опции команды касаются только HTTP, а не TCP.

Такие TCP-клиенты помогают диагностировать любые проблемы с сетевыми соединениями.

Например, HTTP-сервер может не отвечать на HTTP-запрос, даже если сетевое соединение не нарушено.

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

Кроме того, функция сканирования портов, предлагаемая большинством клиентских инструментов TCP, полезна для обнаружения любых неожиданно открытых портов.

Простой TCP-слушатель

Прежде чем мы начнем рассматривать различные TCP-клиенты, давайте настроим несколько TCP-слушателей.

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

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

ncat -l 8888 -k -c "printf 'HTTP/1.1 200 OK\n\nServer 1 date: $(date)\n\n'"

Приведенная выше команда запускает процесс ncat, который прослушивает порт 8888.

Затем при каждом соединении мы даем процессу команду printf ‘HTTP/1.1 200…’ с помощью опции -c.

Содержимое, которое мы возвращаем при каждом соединении, имитирует HTTP-сервер, который возвращает ответ при каждом соединении.

Наконец, опция -k настраивает сервер на одновременный прием нескольких соединений.

Затем в новом сеансе терминала мы запускаем другой процесс, который прослушивает TCP-пакеты на порту 8887:

ncat -l 8887 -k -c "printf 'HTTP/1.1 200 OK\n\nServer 2 date: $(date)\n\n'"

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

Мы можем быстро протестировать сервер, отправив HTTP-запрос на порт с помощью команды curl:

curl http://localhost:8888
Server 1 date: Sat Jan 20 03:49:14 GMT 2024

Примечательно, что причина, по которой мы не видим в ответе HTTP/1.1 200 OK, заключается в том, что это спецификация протокола HTTP, которая интерпретируется командой curl.

Отправка трафика с помощью команды nc

Команда nc – это универсальная команда TCP UDP-соединения.

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

Помимо работы в качестве клиента, команду nc можно использовать для запуска процесса прослушивания TCP-трафика, что очень похоже на команду ncat, которую мы рассматривали в предыдущем разделе.

Подключение к TCP-серверу

С помощью команды nc мы можем установить TCP-соединение с сервером.

В частности, мы передаем команде nc имя хоста и номер порта в качестве позиционных аргументов один и два, соответственно:

nc localhost 8888
HTTP/1.1 200 OK
Server 1 date: Sat Jan 20 03:49:14 GMT 2024

Приведенная выше команда отправляет запрос на соединение с TCP-сервером, который прослушивает порт 8888 на localhost.

После установления соединения мы получаем сообщение от сервера.

Обращает на себя внимание тот факт, что теперь мы видим HTTP-заголовки.

Это происходит потому, что nc является клиентом транспортного уровня и не интерпретирует HTTP-заголовки.

Другими словами, для команды nc эти HTTP-заголовки являются частью полезной нагрузки TCP и не несут никакой особой смысловой нагрузки.

Кроме того, мы видим, что команда возвращается не сразу.

Это потому, что в TCP и клиенту, и серверу нужно отправить пакет FIN, чтобы закрыть соединение.

Прерывание соединения

Чтобы отправить пакет FIN обратно на сервер, мы можем закрыть стандартный ввод nc с помощью CTRL+D.

Также можно указать nc автоматически закрыть соединение после ответа сервера с помощью опции -d:

nc -d localhost 8888

При использовании опции -d команда nc автоматически отправляет пакет FIN после успешного установления соединения.

Отправка трафика на несколько портов

Мы можем отправлять запросы TCP-соединений на несколько портов одного хоста, указывая диапазон номеров портов:

nc -v -d localhost 8885-8890
nc: connect to localhost (127.0.0.1) port 8885 (tcp) failed: Connection refused
nc: connect to localhost (127.0.0.1) port 8886 (tcp) failed: Connection refused
Connection to localhost (127.0.0.1) 8887 port [tcp/*] succeeded!
HTTP/1.1 200 OK
Server 2 date: Sat Jan 20 04:14:57 GMT 2024
Connection to localhost (127.0.0.1) 8888 port [tcp/*] succeeded!
HTTP/1.1 200 OK
Server date: Sat Jan 20 03:49:14 GMT 2024
nc: connect to localhost (127.0.0.1) port 8889 (tcp) failed: Connection refused
nc: connect to localhost (127.0.0.1) port 8890 (tcp) failed: Connection refused

В приведенной выше команде мы указываем nc отправить запрос TCP-соединения на порты между 8885 и 8890, включительно.

Кроме того, мы передали опцию -v, чтобы проверить ответ от других портов в этом диапазоне.

Из вывода видно, что только порты 8888 и 8887 отвечают на запрос соединения, в то время как остальные порты в этом диапазоне просто отказывают в соединении.

Сканирование портов

Обычно нас интересует только то, открыты ли порты, а не то, что они выдают при сканировании портов.

Для этого мы можем использовать опцию -z, которая просто проверяет, принимает ли порт TCP-соединение, не проверяя его ответ.

За кулисами команда nc посылает SYN-пакет на целевой порт и считает его открытым, если порт отвечает пакетом ACK.

Давайте снова запустим команду nc -z для диапазона портов 8885-8890:

nc -v -z localhost 8885-8890
...
nc: connect to localhost (127.0.0.1) port 8886 (tcp) failed: Connection refused
Connection to localhost (127.0.0.1) 8887 port [tcp/*] succeeded!
Connection to localhost (127.0.0.1) 8888 port [tcp/*] succeeded!
nc: connect to localhost (127.0.0.1) port 8889 (tcp) failed: Connection refused
...

Как и ожидалось, успешными оказались только запросы на подключение к портам 8887 и 8888.

Отправка трафика с помощью команды hping3

Команда hping3 – это более продвинутый клиент транспортного уровня. Как и команда ping, она может отправлять пакеты на цель и предоставлять диагностическую информацию.

hping3 тестирование правил фаервола

Однако команда hping3 может также отправлять пакеты TCP и UDP, в отличие от команды ping, которая отправляет пакет ICMP echo.

По сравнению с командой nc, hping3 предлагает больше возможностей для настройки TCP-пакетов.

Давайте рассмотрим несколько примеров.

hping3 – Сетевой сканирующий инструмент – Генератор пакетов

Установка

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

Например, в Ubuntu мы можем использовать команду apt-get install:

apt-get install -y hping3

Чтобы проверить установку, запустите команду hping3 -version и проверьте, успешно ли она выполняется:

hping3 --version
hping3 version 3.0.0-alpha-2

Базовое использование

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

hping3 -S -p 8888 localhost

В приведенной выше команде с помощью опции -p указывается порт для пинга.

Затем опция -S отправляет цель с SYN-пакетом, чтобы проверить, открыт ли порт.

Сканирование портов

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

Например, мы можем просканировать диапазон портов от 8885 до 8890 на localhost:

hping3 --scan 8885-8890 -S localhost
Scanning localhost (127.0.0.1), port 8885-8890
6 ports to scan, use -V to see all the replies
+----+-----------+---------+---+-----+-----+-----+
|port| serv name |  flags  |ttl| id  | win | len |
+----+-----------+---------+---+-----+-----+-----+
8887            : .S..A...  64     0 65495    44
8888            : .S..A...  64     0 65495    44
All replies received. Done.

Давайте разберем вывод команды.

Во-первых, команда сообщает нам, что всего для сканирования имеется шесть портов.

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

Для тех портов, которые не отображаются в таблице, это означает, что запросы на подключение не прошли.

Флуд

В hping3 есть флаг опции -flood, который, если его указать, может имитировать атаку SYN flood:

hping3 -S --flood -p 8888 localhost

В режиме flood hping3 генерирует огромное количество SYN-пакетов на цель.

Эта функция позволяет оценить устойчивость системы к потенциальной атаке SYN flood.

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

Поэтому статистика потерь пакетов всегда будет показывать 100 % потерь пакетов в режиме flood.

Крафтинг TCP-пакетов

Команда hping3 предлагает различные опции для настройки TCP-пакетов.

Например, опция -win позволяет установить размер окна в другие значения:

hping3 -S --win 512 -p 8888 localhost

Кроме того, мы можем установить различные TCP-флаги с помощью различных опций.

Например, опция -S, которую мы использовали, устанавливает TCP-флаг SYN на нашем пакете.

Чтобы установить флаг FIN, мы можем использовать опцию -F.

Полный список опций для установки различных флагов можно найти на man-странице hping3.

Настройка полей TCP-пакета

Еще одна мощная особенность команды hping3 заключается в том, что она предлагает опции, которые позволяют нам изменять поля TCP-пакетов.

Эти опции позволяют нам изучить поведение системы, когда она встречает пакеты с некорректными значениями.

Например, в каждом TCP-пакете есть поле контрольной суммы, которое сообщает получателю, поврежден ли полученный им пакет или нет.

Мы можем создать TCP-пакет с недействительным значением контрольной суммы, используя команду hping3 с параметром -b:

hping3 -b -p 8888 localhost

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

Обычно приемник отбрасывает TCP-пакеты, если они не прошли проверку контрольной суммы.

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

Кроме того, опции -M и -L позволяют установить порядковый номер TCP и номер TCP ack соответственно.

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

Заключение

В этой статье мы продемонстрировали два различных инструмента командной строки в Linux для генерации TCP-трафика.

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

Затем мы продемонстрировали шаги по настройке простого TCP-сервера, который слушает TCP-трафик.

Далее мы представили команду nc в качестве инструмента TCP-клиента, который может отправлять TCP-пакеты на цель.

Мы продемонстрировали ее базовое использование, а также возможность выполнения сканирования портов.

Наконец, мы продемонстрировали различные расширенные возможности hping3 в дополнение к его базовому использованию.

В частности, мы показали, что hping3 способен подстраивать различные поля в TCP-пакетах, что иначе было бы невозможно при использовании команды nc.

см. также:

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий