Писать http сниффер

Я хотел бы написать программу для извлечения URL-адресов веб-сайтов, посещаемых системой (IP-адрес) посредством захвата пакета. Я думаю, что этот URL-адрес будет находиться в разделе данных (то есть не в любом из заголовков - ethernet / ip / tcp-udp).. (Такие программы иногда называют http sniffers, я не должен использовать какой-либо доступный инструмент). Как новичок, я только что прошел через эту основную программу сниффера: sniffex.c.. Может кто-нибудь сказать, пожалуйста, в каком направлении я должен продолжать..

6 ответов

Решение

Примечание. В приведенной ниже информации предположим, что GET также включает в себя POST и другие методы HTTP.

Это определенно будет намного больше работы, чем просмотр одного пакета, но если вы захватите весь поток, вы сможете получить его из отправленных заголовков HTTP.

Попробуйте посмотреть заголовок Host, если он есть, а также то, что фактически запрашивает GET. GET может быть либо полным URL, либо просто именем файла на сервере.

Также обратите внимание, что это не имеет ничего общего с получением доменного имени с IP-адреса. Если вы хотите доменное имя, вы должны копаться в данных.

Быстрый пример на моей машине от Wireshark:

GET http://www.google.ca HTTP/1.1
Host: www.google.ca
{other headers follow}

Другой пример, не из браузера, а только с путем в GET:

GET /ccnet/XmlStatusReport.aspx HTTP/1.1
Host: example.com

Во втором примере фактический URL-адрес: http://example.com/ccnet/XmlStatusReport.aspx

Нет, информации недостаточно. Один IP-адрес может соответствовать любому количеству доменных имен, и каждый из этих доменов может иметь буквально бесконечное количество URL-адресов.

Тем не менее, посмотрите на gethostbyaddr(3), чтобы увидеть, как выполнить обратный просмотр DNS на ip, чтобы хотя бы получить каноническое имя для этого ip.

Обновление: после того как вы отредактировали вопрос, у @aehiilrs гораздо лучший ответ.

То, что вы можете захотеть, это обратный поиск DNS. Для этого позвоните gethostbyaddr.

Посмотрите на PasTmon. http://pastmon.sourceforge.net/

Я исследовал что-то подобное и столкнулся с этим. Надеюсь, что это может быть хорошим началом, если вы используете Linux - Justniffer.

http://justniffer.sourceforge.net/

Существует также хороший скрипт для захвата трафика http, который поможет вам получить информацию из HTTP-запросов.

Если вы используете Linux, вы можете добавить фильтр в iptables, чтобы добавить новое правило, которое ищет пакеты, содержащие HTTP-запросы на получение и получение URL-адреса.

Так что правило будет выглядеть так.

Для каждого пакета, идущего на порт 80 от localhost -> проверьте, содержит ли пакет запрос GET -> получить URL-адрес и сохранить его

Этот подход должен работать во всех случаях, даже для заголовков HTTPS.

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