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

Настройка Mercurial по HTTPS

Иногда mercurial, при скачивании и комитах ругается на https. Особенно на самоподписанные сертификаты. Чтобы заработал…

2 недели ago

Компиляция libvirt в Ubuntu

Компиляция libvirt Подробнее

2 недели ago

Ошибка libvirt permission denied: решение

Если возникает ошибка libvirt destroy lxc permission denied , при попытке остановить контейнер: _x000D_# virsh…

2 недели ago

Настройка редиректа в NGINX

Файлы с примерами редиректа для nginx Подробнее

2 недели ago

Включение gzip в NGINX

Как включить gzip сжатие в Nginx ? Подробнее

2 недели ago

Удаление postinst-скрипта в Linux

Иногда возникает ситуация, когда криво настроенные пакеты не устанавливаются в системе. У меня это произошло…

2 недели ago