В процессе создания инструмента для извлечения информации из файлов pcap, я столкнулся с ситуацией, когда время обработки было медленным, а расход памяти рос. В поиске различных способов использованием Scapy я научился профилировать код Python.
Еще по теме: Сканер Wi-Fi сетей на Scapy Python
Способы чтения pcap-файлов на Python используя Scapy
Чтение файла .pcap с помощью Scapy обычно выполняется с использованием функции rdpcap(). Эта функция читает весь файл и загружает его в память. В зависимости от размера файла, который вы пытаетесь прочитать, это может занять много памяти.
Маленький пример скрипта с использованием этой функции занимал значительное количество времени, поэтому я решил найти другую альтернативу. Я начал тестировать PcapReader(). Он в плане потребления памяти, но у него есть свои особенности.
Итак предлагаю две версии скрипта для выполнения одной и той же задачи. Оба скрипта открывают pcap, считывают все пакеты и извлекают урлы в текстовый файл. Поведение одинаковое, но время выполнения и потребление памяти немного отличаются.
Использование rdpcap():
Документация Scapy объясняет, что rdpcap() — это способ чтения фалов pcap. Эта функция читает весь файл и загружает его в память. Если файл достаточно большой, возможны некоторые проблемы с производительностью.
Первая версия скрипта, которую я использовал, была похожа на приведенную ниже. Я оставил использование memory_profiler, так как полагался на него для сравнения этого скрипта с другой альтернативой. Больше информации о профилировании памяти Python будет представлено в следующей статье.
Здесь представлен пример скрипта с использованием rdpcap()
Использование PcapReader():
Scapy также имеет другую функцию для чтения pcap — PcapReader(). Она позволяет итерировать по захваченным пакетам в файле и разбирать их. Файл не загружается полностью в память. Это немного более эффективно по памяти.
Здесь представлен пример скрипта с использованием PcapReader()
Выходные данные: URL-адреса
Я скачал несколько pcap-файлов с Malware Traffic Analysis и сравнил их выводы. Изначально я тестировал с двумя файлами.
Скрипты принимают 2 параметра на вход, путь к входному файлу и путь к выходному файлу. Я рекомендую создать виртуальное окружение Python и установить необходимые библиотеки для тестирования.
Пример запуска скриптов:
1 2 3 4 |
python pcap_parsing_rdpcap.py --pcap pcaps/2021-04-16-TA551-Ursnif-traffic.pcap --output output/Ursnif_rdpcap.txt python pcap_parsing_pcapreader.py --pcap pcaps/2021-04-16-TA551-Ursnif-traffic.pcap --output output/Ursnif_rdpcap.txt python pcap_parsing_rdpcap.py --pcap pcaps/2021-07-12-Trickbot-gtag-rob106-infection-traffic.pcap --output output/rob106_rdpcap.txt python pcap_parsing_pcapreader.py --pcap pcaps/2021-07-12-Trickbot-gtag-rob106-infection-traffic.pcap --output output/rob106_pcapreader.txt |
Один из простых способов проверить соответствие выводов — это сравнить хеши файлов:
1 2 3 4 5 |
shasum output/* 225a0313dc9ad93749f5a132682e1d8a14359463 output/Ursnif_pcapread.txt 225a0313dc9ad93749f5a132682e1d8a14359463 output/Ursnif_rdpcap.txt e1c005b2f0b929390d2c77ad0fba5c7a893df4ea output/rob106_pcapread.txt e1c005b2f0b929390d2c77ad0fba5c7a893df4ea output/rob106_rdpcap.txt |
Заключение
Оба способа чтения PCAP и извлечения урлов кажутся достаточно хорошими. Тем не менее, при работе с большими файлами .pcap возникают некоторые проблемы при использовании rdpcap().
Ищите различные подходы для решения проблемы, особенно если производительность и потребление памяти являются ограничениями. Начните с малых шагов и продолжайте итерационно, пока система не сможет достичь того, что вам необходимо.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Создание бэкдора на Python
- Как написать сканер портов на Python
- Как конвертировать JSON в CSV на Python