Как написать сниффер слоя 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-трафик, сохранит его, а через год он "найдет" секретный ключ сервера, он все равно не сможет расшифровать ваш трафик.