LINUX.ORG.RU

python: собрать последовательность сообщений из pcap файлов

 , , ,


1

1

Приветствую,

Есть задача парсить pcap файлы (с помощью питон-библиотеки dpkt), извлечь TLS-сессии и собрать последовательноти типов сообщений. Поскольку имеются разные версии TLS, то последовательности сообщений могут варъироваться.

Очень упрощенный пример:

- TLS сессия как правило начинается с handshake-ов между клиентом и сервером, т.е. первое сообщение с ID=22 - далее сообщение ChangeCipher c ID=20 - клиент и сервер обо всем договорились, началась передача криптованных данных в TLS сообщениях с ID=23

То есть скрипт должен пропарсить весь pcap и построить как бы граф сообщений: 22->20->23

Но в реальности это может быть значительно более длинный граф, в зависимости от приложения, версий TLS и пр.

Изначально коды этих сообщений я предполагал складывать в список (list).

Но поскольку в одном pcap куча сессий _одного_ приложения, то необходимо как-то отличать «граф» сессий друг от друга.

Что можно использовать вместо списка для данной задачи?

Спасибо!

★★

... необходимо как-то отличать «граф» сессий друг от друга. Что можно использовать вместо списка для данной задачи?

Не только коды «складывать» в list, но и «маркер» сессии. А фильтр - дело техники.

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

Не только коды «складывать» в list, но и «маркер» сессии. А фильтр - дело техники.

Спасибо, это идея. То есть что-то вроде:

{ '#', '22', '20', '23', '#', '22, '21' }

где '#' обозначает начало данных для сессии.

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

Нет, конечно. Может я не понял, что надо, но

packets = [
    {
        'id': 22,
        'session': 1,
        'data': ...
    },
    {
        'id': 20,
        'session': 1,
        'data': ...
    },
    {
        'id': 23,
        'session': 1,
        'data': ...
    },
    {
        'id': 22,
        'session': 2,
        'data': ...
    },
    {
        'id': 21,
        'session': 2,
        'data': ...
    },
    ...
]

session_1 = filter(lambda x: x['session'] == 1, packets)
vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

Спасибо!

Я питон начал изучать недавно. То что вы показали — это список словарей, т.е. каждый элемент списка - словарь?

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

Да, это список словарей.

Я питон начал изучать недавно.

Может лучше посмотреть на готовые библиотеки - scapy, pcapy, pyshark? Вполне, что там для требуемого анализа уже что-то есть.

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

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

anonymous
()
Ответ на: комментарий от anonymous

Костыль, конечно же, писать на C и делать обвязку на питоне, иначе лагать будет...

Не нужны эти извращения в питоне.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

Ты че, совсем? Это же сложно, ошибок наляпать на ровном месте как нефиг делать. Нужно, конечно же, запускать готовые проверенные утилиты на C и парсить их вывод.

t184256 ★★★★★
()

pcap пишется последовательно, реордеринга там нет, если ты в него не влез руками. Если по какой-то причине у тебя все же что-то не то с pcap, то лучше взять reordercap из wireshark. По TLS ты не сможешь понять что происходит. Максимум SEQ/ACK + таймстэмп из pcap файла для ретрансмитов.

«Граф» режут по five tuple всегда. Вообще возьми tshark и напиши для него lua скрипт. Это сильно проще, чем говнякать на тормозном питоне процессинг пакетов.

xpahos ★★★★★
()
Ответ на: комментарий от xpahos

pcap пишется последовательно, реордеринга там нет

Если pcap был «снят» в точке между клиентом и сервером, то ничто не гарантирует последовательность пакетов. TCP только гарантирует это на стороне получателя, а по пути пакет может быть фрагментирован, out-of-order, потерян и пр.

Я так это понимаю.

«Граф» режут по five tuple всегда. Вообще возьми tshark и напиши для него lua скрипт.

Интересная идея. А чем это много лучше «тормозного» питона? Мне не нужна космическая скорость скрипта, dpkt от питона знает много протоколов.

Мне действительно интересно, я не флейма ради :)

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

Если pcap был «снят» в точке между клиентом и сервером, то ничто не гарантирует последовательность пакетов. TCP только гарантирует это на стороне получателя, а по пути пакет может быть фрагментирован, out-of-order, потерян и пр.

TCP это гарантирует уже на стадии чтения sk_buff и взаимодействия с юзерспейсом. И на клиенте, и на сервере и на роутере последовательность не будет отличаться от того, что читала сетевая карта и записал pcap. pcap это фактически то, что кэпчерит BPF скрипт и передает через raw сокет.

А чем это много лучше «тормозного» питона? Мне не нужна космическая скорость скрипта, dpkt от питона знает много протоколов.

Ну кроме скорости tshark уже умеет значительно больше протоколов. Фактически все, что сейчас используется, включая HTTP/3.

xpahos ★★★★★
()
Ответ на: комментарий от xpahos

Ну кроме скорости tshark уже умеет значительно больше протоколов. Фактически все, что сейчас используется, включая HTTP/3.

wireshark уже многое умеет, например посмотрите меню Statistics->Conversations, Statistics->FlowGraph и т.д. Можно ли в LUA скрипте получить доступ к этим результатам анализа пакета и воспользоваться API экспортируемым wireshark/tshark?

cruz7 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.