Рейтинг:1

Извлечение данных приложения TCP из файла pcap

флаг us

Учитывая .pcap (или аналогичный) файл, я хотел бы выбрать одно TCP-соединение и вывести оба потока данных приложения (тот, от другой сверстник и один два другой одноранговый узел) в два отдельных файла на диске.

Предположим, что у меня есть .pcap файл, который, среди прочего, содержит полный TCP-поток (от SYN до финального FIN+ACK/RST) открытого текстового соединения HTTP/1.1. Я хотел бы иметь два результирующих файла с содержимым. Т.е. один файл имеет

ПОЛУЧИТЬ/HTTP/1.1\r\n
хост: foobar.com\r\n
\r\n

а в другом файле есть

HTTP/1.1 200 ок\r\n
длина содержимого: ...\r\n
... \р\п
\r\n
<html>...</html>

И я хочу, чтобы это был именно тот трафик данных приложения, который был бы виден/отправлен в пользовательском пространстве (от читать/записывать/Отправить/recv`/...). Что я хочу сделать с этим, так это сбросить некоторый трафик и использовать его для проверки моих синтаксических анализаторов для определенного сетевого протокола. Парсер должен просто иметь возможность прочитать один из этих файлов и попытаться проанализировать поток данных.


Как может выглядеть такой инструмент командной строки? Я не уверен, что это очень полезно, но я подумал, что это может прояснить, что я ищу, если я также приведу пример использования воображаемого инструмента, который может это сделать. Назовем воображаемый инструмент (это то, что я ищу) TCP-поток-извлечение. Я хотел бы назвать это чем-то вроде

### воображаемый пример использования инструмента, который я хотел бы найти :)

# дамп с 12345 по 23456
TCP-поток-извлечение \
    -i мои-захваченные-пакеты.pcap
    -s 127.0.0.1:12345 \ # адрес источника 127.0.0.1:12345
    -d 127.0.0.1:23456 \ # адрес назначения 127.0.0.1:23456
    -t '2021-01-28 09:12:00Z' \ # на тот момент соединение TCP было активным
    -w с порта-12345 на порт-23456

# дамп с 23456 по 12345
TCP-поток-извлечение \
    -i мои-захваченные-пакеты.pcap
    -s 127.0.0.1:23456 \ # адрес источника 127.0.0.1:12345
    -d 127.0.0.1:12345 \ # адрес назначения 127.0.0.1:23456
    -t '2021-01-28 09:12:00Z' \ # соединение TCP было на тот момент
    -w с порта-23456 на порт-12345
флаг jp
Вы хотите `tcpflow`
Рейтинг:1
флаг ru

Если вам необходимо сделать это вручную, вам необходимо удалить заголовки протоколов инкапсуляции. Однако в них есть свои тонкости и они могут быть не тривиальными:

  • Ethernet (L2): заголовок Ethernet (14 байтов) может включать или не включать тег 802.1q (перед Ethertype добавляются 4 байта; 0x0800= IPv4, 0x86dd= IPv6, 0x8100=802.1q), а полезная нагрузка Ethernet может сопровождаться или не сопровождаться FCS (4 байта).
  • IP (L3): базовый заголовок IPv4 составляет 20 байтов, IPv6 использует 40 байтов. У каждого есть опции или расширения - проверьте МГП поле для IPv4 (5 = без вариантов) или Следующий заголовок поле для IPv6 (6 указывает TCP, без расширения). Любой пакет может быть фрагментирован на несколько кадров L2 (IPv4: МФ установлен или Смещение фрагмента>0; IPv6 использует заголовок расширения 44). Каждый первый фрагмент включает заголовки L4, последующие фрагменты — нет.
  • TCP (L4): базовый заголовок сегмента TCP составляет 20 байт, но он также может включать параметры (Смещение данных>5). TCP прибегает к неупорядоченным доставленным сегментам (по Последовательность чисел), поэтому может потребоваться буферизация значительной части данных. Сегменты также могут поступать в двух экземплярах.

Я рекомендую использовать подходящий инструмент, например tcpflow, как предложил @AlexD.

флаг us
Спасибо, `tcpflow` - это именно то, что я искал! Да, отключение заголовков различных протоколов — это одно, самой сложной задачей было бы справиться с неупорядоченной доставкой и повторной доставкой пакетов.
Zac67 avatar
флаг ru
@JohannesWeiss Ах да, забыл об этом!

Ответить или комментировать

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