Простой 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 под Windows, которая не требует ничего, кроме WinPcap. О том, как делать такие сборки, я в свое время уже рассказывал.

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

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

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

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

Код сниффера, который был актуален на момент публикации этой заметки, вы можете скачать отсюда. Если же вас интересует самая свежая версия скрипта, можете скачать ее из репозитория на BitBucket. Там же вы можете послать пулл реквест или создать тикет в багтрекере.

Если вам понравилась эта заметка, вас может заинтересовать статья Анализ сетевого трафика с помощью Net::Pcap в блоге Владимира Леттиева, а также видеозапись доклада Douglas E. Miles Writing GUI Applications with wxPerl and XRC и презентация к нему.

Мне будет очень приятно, если вы попробуете сниффер, а затем сообщите в комментариях, работает ли он вообще и что вам понравилось или не понравилось в нем. Если при чтении заметки у вас возникли какие-то вопросы, я, как обычно, с радостью на них отвечу.

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

Метки: , , , , .

Подпишись через RSS, E-Mail, Google+, Facebook, Vk или Twitter!

Понравился пост? Поделись с другими: