Простой HTTP сниффер на Perl c графическим интерфейсом

6 июня 2012

Решил вот написать свой HTTP сниффер. Не то, чтобы существующие решения, всякие там FireBug, Wireshark, tcpdump и urlsnarf, плохо работали. Просто какие-то они не совсем удобные или не всегда делают то, что мне действительно нужно.

Ну как «решил написать» — как обычно пишутся программы на Perl. Я взял модули Net::Pcap и Sniffer::HTTP, набросал графический интерфейс в wxFormBuilder и связал сии компоненты синей изолентой с помощью пары сотен строк кода. В результате получилась такая программа:

Мой HTTP сниффер

Так сниффер, который я условно назвал HttpSniff, выглядит в Xubuntu (CLI версия также предусмотрена). Слева отображается запрос, справа — ответ сервера, внизу представлен лог всех HTTP запросов. Если запросов посылается много, лишние можно скрыть с помощью фильтров:

HttpSniff, запущенный под Windows

На данном скриншоте программа запущена уже под Windows, что как бы намекает на ее кроссплатформенность. Обратите внимание, что проверка, соответствует ли хост правилу фильтрации, производится следующим образом:

$host .= '$';
for my $hp(@{$hp_list}) {
  $host_match = ($hp->{host} eq '*')||(index($host,$hp->{host}) == 0);
  # ...
}

В итоге строке «1.2.3.» соответсвуют все хосты в подсети 1.2.3/24, а строке «1.2.3.4» — как адрес 1.2.3.4, так и 1.2.3.49. Если требуется указать точный адрес, его следует ввести с долларом на конце, например «1.2.3.4$». Костыль, наверное, но пока программа работает так.

Для запуска сниффера вам потребуются библиотека wxWidgets, установку которой я уже как-то описывал, а также несколько модулей, названия которых вы можете посмотреть в начале скрипта. Если не ошибаюсь, все модули, кроме Net::Pcap, без проблем устанавливаются с помощью утилиты cpan.

Под FreeBSD модуль Net::Pcap устанавливается так:

pkg_add -r p5-Net-Pcap

Под Debian/Ubuntu:

sudo apt-get install libnet-pcap-perl

Под Windows придется установить WinPcap. Из дистрибутивов Perl я бы рекомендовал CitrusPerl, поскольку с ним в комплекте идет wxPerl. Модуль Net::Pcap под Windows ставится так:

ppm install http://www.bribes.org/perl/ppm/Net-Pcap.ppd

Следует обратить внимание на несколько «особенностей» в работе HttpSniff. Во-первых, HTTPS запросы он не перехватывает — это вам не FireBug. Зато он умеет отслеживать запросы, посылаемые Flash, чем могут похвастаться не все браузеры. Во-вторых, я замечал, что при большом объеме трафика (скажем, при включенных торрентах) сниффер может «терять» часть запросов. Я так и не смог понять, как решить эту проблему.

Наконец, сниффер основан на модуле Sniffer::HTTP, который на данный момент, вообще-то говоря, еще сыроват. Во время работы он не только сыпет всякие варнинги, но и порой бросает такие исключения:

Can't call method "scheme" on an undefined value at ... line 251

По этой причине мне пришлось обернуть вызов метода handle_eth_packet в eval. Других косяков я пока не замечал. В целом, сниффер работает вполне сносно.

Полную версию исходников к посту можно скачать здесь.

Дополнение: Также вас может заинтересовать заметка Перехват сетевого трафика при помощи библиотеки libpcap.

Метки: , , , , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.