Categories: Perl

http-sniffer/

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

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

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

На данном скриншоте программа запущена уже под 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 .

admin

Share
Published by
admin
Tags: Perl

Recent Posts

vim-commands/

Самое главное — побороть боязнь белого листа. Я всегда говорю это себе, когда нужно начать…

1 месяц ago

firefox-thunderbird-en-ru-dict/

По не вполне ясным причинам, Firefox умеет проверять орфографию либо только в русских, либо только…

1 месяц ago

perl-hacks/

Около месяца собирал разные «хаки» на языке программирования Perl. Эта подборка наглядно демонстрирует, как в…

1 месяц ago

perl-cy-check/

C недавних пор я стал увлекаться SEO. Порой передо мной встает задача быстро проверить индекс…

1 месяц ago

which-cms-perl/

Недавно написал несколько скриптов, позволяющих автоматически определять, какая CMS (Content Management System, система управления контентом)…

1 месяц ago

smtp-descr/

Я так подозреваю, что среди вас найдется те, кто скажет, что этот пост боян и…

1 месяц ago