як знайти потоки tcp без остаточної послідовності ack / fin у величезному файлі захоплення пакетів


2

У мене є величезний файл pcap, який містить велику кількість окремих потоків tcp. Але з них є кілька недійсних потоків, які не мають остаточної послідовності fin / ack. Чи є спосіб, коли я можу знайти саме ці потоки за допомогою дроту? Чи є інші інструменти, які дозволяють мені шукати pcaps таким чином?

Будь-яка допомога буде вдячна.


Чи всі вони напевно недійсні? Ви можете отримати незакриті сеанси завдяки нормальній поведінці, коли люди принаймні беруть участь.
Павло

принаймні в моєму сценарії вони недійсні. Я маю справу з пристроєм IPS, який займається цими точними послідовностями. Мені потрібна пін-точка конкретних потоків.
Вудсток

1
Я б це зробив назад, і використовував tcpdump для ідентифікації будь-яких потоків, які FIN-ACKed, а потім використовувати grep для фільтрації цих даних з виводу tcpdump, а потім шукати залишок для SYN-ACK. Але може бути і кращий спосіб, тому я зачекаю інших пропозицій.
Павло

Відповіді:


0

Наступна команда друкує кожне неповне половинне з'єднання.

tcpdump -r pcap-file 'tcp[tcpflags] & (tcp-syn|tcp-fin) > 0' | 
sed -r 's/^.*IP (.*) > (.*):.*$/\1 \2/'|sort|uniq -u

Підхід передбачає, що кожна пара розеток використовується лише один раз протягом усього сліду.

Пояснення

Для зв'язку між

IP_A:PORT_A <--> IP_B:PORT_B

tcpdump містить половинки

IP_A:PORT_A > IP_B:PORT_B, and
IP_B:PORT_B > IP_A:PORT_A

Для кожної половини дамп повинен містити два сегменти, що містять прапор SYN або FIN. Отже, що робить команда:

  1. Зберіть сегменти, які містять прапор SYN або FIN

    tcpdump -r pcap-file 'tcp[tcpflags] & (tcp-syn|tcp-fin) > 0

  2. Агрегуйте результат шляхом напівз'єднання, незалежно від фактичного прапора (SYN чи FIN)

    2.1. Сортувати за напівз’єднанням

    sed -r 's/^.*IP (.*) > (.*):.*$/\1 \2/'|sort

    2.2. Порахуйте сегменти, що беруть участь у кожному напівз’єднанні, і відфільтруйте всі половинні з'єднання, які правильно включають два сегменти

    uniq -u


0

Ось ще один спосіб зробити це за допомогою tshark. Ідея така ж, як і відповідь від @artistoex - різниця полягає в тому, що вона не розглядає кожне напівз'єднання для себе, а вихід - номер потоку TCP (від Wireshark / tshark), з яким може бути простіше працювати, коли ви хочете відкрити цей потік у Wireshark і продовжувати публікувати його там.

tshark -r pcap_file.pcap -R "tcp.flags & 0x03" -Tfields -etcp.stream | 
sort -n | uniq -c | awk -F ' ' '{ if ($1<4) print $1," ", $2 }'

Фільтр відображення робить те саме, що фільтр захоплення з іншої відповіді, він використовує той факт, що біти SYN та FIN є двома найменш значущими бітами в полі прапорців TCP, тож якщо обидва встановлені, це було б 0b11або 0x3. І- tcp.flagsполе поле з 0x3дасть ненульові значення, якщо встановлено будь-який прапор.

tsharkвиводить номер потоку TCP для кожного пакету тут. Ми сортуємо їх і підраховуємо унікальні числа. Останній крок роздруковує лише рядки, де кількість пакетів для цього потоку менше 4 (1 SYN та 1 FIN для кожного напівнапрямку).

Тоді ви можете відкрити Wireshark за допомогою

wireshark -r pcap-file -R "tcp.stream eq 1234"

де 1234 - з попередньої команди.

Гарненька? Я думаю що ні. Швидкий? Немає...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.