Как написать сниффер слоя http

Я хочу написать сниффер уровня приложения (SMTP/ftp/http).

Исходя из моих поисков, первый (и, возможно, самый сложный!) Шаг - это собрать tcp-поток перехваченных соединений.

На самом деле, мне нужно что-то вроде опции "следовать TCP-потоку" в Wireshark, но мне нужен инструмент, который делает это на живом интерфейсе и автоматически. Как я знаю, Tshark может извлекать данные потоков TCP из сохраненных файлов pcap автоматически ( ссылка), но не из живых интерфейсов. Может ли Tshark сделать это на живых интерфейсах???

Как я знаю, TCPflow может делать именно то, что я хочу, однако он не может обрабатывать дефрагментацию IP и соединения SSL (я хочу проанализировать содержимое SSL в случае, если у меня есть закрытый ключ сервера).

Наконец, я также попробую брат сетевой монитор. Хотя он предоставляет список TCP-соединений (conn.log), я не смог получить содержимое TCP-соединений.

Любые предложения по поводу упомянутых инструментов или любого другого полезного инструмента приветствуются.

Заранее спасибо, Дэн.

2 ответа

Библиотека perl Net::Inspect может вам помочь. Он также поставляется с tcpudpflow, который может записывать потоки tcp и udp в отдельные файлы, аналогично tcpflow. Он работает с файлами pcap или может делать живые снимки. Библиотека обрабатывает фрагментацию IP. Он также поставляется с инструментом httpflow для извлечения HTTP-запросов и ответов (включая распаковку, кодирование по частям). В настоящее время он не обрабатывает SSL.

Как автор этой библиотеки, я не думаю, что извлечение потоков TCP - самая сложная часть, парсер HTTP (исключая распаковку, включая режим chunked) почти в два раза больше, чем IP и TCP вместе взятые.

Этот пример работает для повторной сборки данных приложения одного протокола:

tshark -Y "tcp.dstport == 80" -T fields -d tcp.port==80,echo -e echo.data

Он захватывает живые данные http, собирает их и выводит как необработанный шестнадцатеричный код.

Я могу добавить небольшой скрипт для разбора гекса в ascii, если хотите.

Я хочу проанализировать содержимое SSL в случае, если у меня есть закрытый ключ сервера

TL;DR: Этого нельзя сделать одним только инструментом захвата.

Почему нет: потому что каждый сеанс SSL генерирует новый секретный ключ разговора, и вы не можете расшифровать сеанс без этого ключа. Наличие закрытого ключа сервера недостаточно. Идея заключается в том, что если кто-то перехватит ваш SSL-трафик, сохранит его, а через год он "найдет" секретный ключ сервера, он все равно не сможет расшифровать ваш трафик.

Другие вопросы по тегам