Анализ протоколов - первое с чем сталкивается исследователь. Попробуем разобраться в том, какой инструментарий может нам в этом помочь. Рассмотрим простую задачу - есть pcap файл с HTTP страфиком (см. RFC2616). Мы хотим получить все пары (запрос, ответ) - startstring, заголовки и тела (заниматься разбором этих частей не будем) и использовать полученные данные в своём приложении на C/C++.
Wireshark
Первое, что приходит в голову - проект Wireshark (бывший Etheral). В нём вводится понятие "диссектор" - часть архитектуры wireshark, осуществляющая разбор какого-либо протокола и производящая в зависимости от получаемых в результате разбора данных какие-либо действия. Широкий набор диссекторов, входящий в поставку заполняет "дерево представления" - основная часть интерфейса wireshark. Диссекторы организованы в виде дерева - каждый новый диссектор может опираться на результат работы другого диссектора. Кроме того они "регистрируют" все разбираемые поля. Таким образом вышестоящие диссекторы могут пользоваться результатами нижестоящих.
Диссекторы могут быть реализованы как на "родном" для wireshark языке C/C++, так и на Lua, используя "мощный API". В первом случае - вам необходимо будет собирать диссектор вместе с wireshark, во втором - можно писать независимо и подключать модуль во время исполнения (ключ -X к tshark или через GUI пользователя).
К сожалению диссекторы тесно интегрированы с ядром wireshark. Вы не можете "оторвать" нужную вам часть и унести в свой проект. Всё усложняется лицензией - GPLv2. Проект активно развивается с 1998 года при поддержке сообщества.
Snort
Система обнаружения вторжений Snort развивается как продукт с открытым исходным кодом под лицензией GPLv2, написанный на C. В 2013 году выкуплена компанией Cisco.
Архитектура анализатора не очень удачна. Парсер состоит множества функций с префиксом Decode, которые заполняют огромную структуру Packet, имеющие поля на все случаи жизни. При добавлении нового протокола придется сделать шрапнельные правки, которые сломают бинарную совместимость библиотеки и изменят структуры данных.
Bro (binpac)
Проект bro - это сканер безопасности. Он имеет множество различных функциональностей, расширяем. Одной из составных частей является разбор трафика. В bro за это отвечают анализаторы (analyzer). Изначально они писались вручную, как и в wireshark. Затем был предложен инструмент binpac и специальный язык, с помощью которого можно описать протокол. На основе описания можно сгенерировать анализатор.
bro разрабатывается в Беркли при поддержке сообщества, грантов от крупных игроков индустрии безопасности и правительства США. Распространяется по лицензии BSD, что позволяет использовать его в коммерческих проектах.
Hilti (binpac++)
Очень молодой, но достаточно интересный проект от создателей bro. BinPAC++ - генератор анализаторов. С его помощью можно достаточно легко реализовать парсер протокола или формата файла. BinPAC++ используют инфраструктуру Hilti для компидляции описания на языке PAC2 в высокоэффективный нативный код, который может использоваться как статически, так и динамически. Результат разбора доступен из C приложения посредством специального интрефейса.
К сожалению проект только начал своё развитие. Что-то понять можно только изучая исходный код и скудную, но интересную информацию с официального сайта и из презентаций. Исходники доступны под BSD лицензией: git://git.icir.org/hilti Зеркало на github: https://github.com/rsmmr/hilti.git К сожалению исходники компилируются с помощью clang и libc++, что на gentoo не так-то просто сделать. НО Робин Соммер уже обо всем позаботился: https://github.com/rsmmr/install-clang.
Xplico (capanalisys)
Сам xplico зародился и развивается как open-source проект и его код доступен под лицензией GPLv2. В дереве исходных кодов имеется немало диссекторов. Архитектура не так стройна как у Wireshark, тем не менее они чуть более оторваны от остального кода проекта, будет проще "вынести" их в своё приложение. Но автор проекта пытается коммерцианализировать эту часть проекта, унося её в capanalysis. Судя по всему со временем диссекторы внутри самого xplico перестанут развиваться и дополнятся.
Выводы
Наиболее простым и удобным инструментом является Wireshark, но он не подойдёт если нужно "отойти в сторону" от pcap или унести диссекторы в своё приложение для этого придется отделять разбор протокола в отдельную часть. Наиболее перспективными кажутся идеи, положенные в основу binpac. Но к сожалению по нему не так много информации. Создаётся ощущение, что идеи развиваются в рамках проекта Hilti, но последний слишком сырой. Диссекторы Xplico перестают существовать как open-source проект.
Comments
comments powered by Disqus