Могу ли я использовать tcpdump для получения HTTP-запросов, заголовка ответа и тела ответа?

Я использую tcpdump для получения данных HTTP, выполнив следующую команду:

sudo tcpdump -A -s 1492 dst port 80

Результат вышеуказанной команды:

  1. Заголовки, я думаю, заголовки запросов и ответов.
  2. Нечитаемые данные.
  3. URL GET /modules/mod_news_pro_gk1/cache/stories.ilbalad.ajayeb.strange-tractor.jpg.

Мне нужен более четкий результат, например, читаемый запрос> заголовок ответа> тело ответа и т. Д. Как мне отфильтровать мои результаты?


person kimo    schedule 23.01.2011    source источник
comment
HTTP-ответы могут быть сжаты или разбиты на части, и получение их необработанного текста может не дать того, что вам нужно (нечитаемые данные). Вероятно, вам нужно более полно объяснить, что вы хотите делать и что позволяет ваша среда (например, нельзя ли просто использовать HTTP-прокси, например Charles или Fiddler)?   -  person EricLaw    schedule 24.01.2011
comment
как вы запускали tcpdump на ОС Android? Вы каким-то образом встраиваете команду в свое приложение или запускаете ее на ПК, подключенном к телефону Android?   -  person faizal    schedule 25.07.2014
comment
@faizal - вы должны установить двоичный файл tcpdump на устройство, после чего вы можете запустить его с самого устройства. Используйте эту ссылку, чтобы узнать, как установить tcpdump на устройство Android: gadgetcat.wordpress.com/2011/09/11/tcpdump-on-android   -  person kimo    schedule 26.07.2014


Ответы (3)


Существуют фильтры tcpdump для HTTP GET и HTTP POST (или для обоих плюс тело сообщения):

  • Запустите man tcpdump | less -Ip examples, чтобы увидеть несколько примеров

  • Вот фильтр tcpdump для HTTP GET (GET = 0x47, 0x45, 0x54, 0x20):

    sudo tcpdump -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
    
  • Вот фильтр tcpdump для HTTP POST (POST = 0x50, 0x4f, 0x53, 0x54):

    sudo tcpdump -s 0 -A 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
    
  • Отслеживайте HTTP-трафик, включая заголовки запросов и ответов и тело сообщения (источник):

    tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
    tcpdump -X -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
    

Для получения дополнительной информации об изменении битов в заголовке TCP см .: Генератор фильтра захвата с сопоставлением строк (ссылка на объяснение Сакэ Блока).

person paulz    schedule 17.05.2013
comment
Я не знала о less -Ip - какая экономия времени - person n611x007; 07.11.2013
comment
Я хотел бы увидеть объяснение этих вызовов tcpdump - person tmc; 31.01.2014
comment
Можно ли использовать фильтр для HTTP GET и POST вместе? - person Jim Ho; 04.02.2016
comment
Это колдовство. Кто-нибудь, пожалуйста, объясните, как это работает. - person ; 14.07.2017
comment
openshell.com/ - person jmunsch; 14.12.2018
comment
Что такое фильтр для PUT и DELETE? Я пробовал с PUT 'tcp [((tcp [12: 1] & 0xf0) ›› 2): 4] = 0x50555420' и 'tcp [((tcp [12: 1] & 0xf0) ›› 2): 4] = 0x44454c455445 'для PUT и DELETE соответственно, для PUT он работает, но почему-то не работает для DELETE. Я что-то упускаю? - person Praveen Patel; 17.10.2019
comment
0x504f5354 - это POST в кодировке ASCII, записанное в шестнадцатеричном формате. Аналогично 0x47455420, это GET (с конечным пробелом). Вышеупомянутые вызовы используют тот факт, что в протоколе HTTP запрос начинается с метода HTTP, поэтому, сравнивая первое 32-битное слово с этими шестнадцатеричными значениями, мы можем легко проверить, соответствует ли запрос заданному методу HTTP. - person Per Lundberg; 09.03.2020
comment
Добавил кое-что из этого в пост, чтобы его было немного легче понять. - person Per Lundberg; 09.03.2020

Я бы порекомендовал использовать Wireshark, в котором есть опция «Follow TCP Stream», которая позволяет очень легко увидеть полную запросы и ответы для конкретного TCP-соединения. Если вы предпочитаете использовать командную строку, вы можете попробовать tcpflow, инструмент, предназначенный для захвата и восстановления содержимое TCP-потоков.

В других вариантах можно использовать прокси-сервер отладки HTTP, например Charles или Fiddler, как предлагает EricLaw. Они имеют то преимущество, что они имеют особую поддержку HTTP, чтобы упростить работу с различными типами кодировок, а также другие функции, такие как сохранение запросов для их воспроизведения или редактирование запросов.

Вы также можете использовать такой инструмент, как Firebug (Firefox), Web Inspector (Safari, Chrome и другие браузеры на основе WebKit) или Opera Dragonfly, все из которых предоставляют некоторую возможность просматривать заголовки и тела запросов и ответов (хотя большинство из них не позволяет вам видеть точный поток байтов, а вместо этого то, как браузеры анализируют запросы).

И, наконец, вы всегда можете создавать запросы вручную, используя что-то вроде telnet, netcat или socat, чтобы подключиться к порту 80 и ввести запрос вручную, или с помощью такого инструмента, как htty, чтобы упростить создание запроса и проверку ответа.

person Brian Campbell    schedule 23.01.2011
comment
Большое спасибо за ваш ответ, Мозг. Я использую tcpdump в ОС Android :) поэтому я ограничен использованием tcpdump, наверняка я могу получить заголовки, а также запрос ссылки, мне также нужно получить тело, любую помощь, любой скрипт преобразования Perl или что-то в этом роде? - person kimo; 24.01.2011
comment
@kimo В этом случае я бы рекомендовал использовать tcpdump -w outfile ... для сброса необработанных пакетов в файл, а затем скопировать его на свой компьютер и использовать Wireshark для его анализа. Wireshark может открыть дамп пакета, декодировать поток TCP и распаковать содержимое HTTP (я предполагаю, что причина его нечитаемости в том, что он сжат). - person Brian Campbell; 24.01.2011
comment
Спасибо, Брайан, я постараюсь реализовать это решение, в любом случае лучше переместить файл на ПК, потому что я должен фильтровать данные, чтобы получить нужные запросы, а это непросто сделать в системе Android. - person kimo; 25.01.2011
comment
Брайан: Думаю, мы пытаемся сказать вот что. Как мы можем добиться этого с помощью Busy Box. У меня такие же ограничения на устройствах Android. - person Heavy Gray; 23.11.2013
comment
@JamesAndino Да, на устройстве Android я бы рекомендовал использовать tcpdump -w outfile, затем скопировать его на машину с Wireshark и использовать Wireshark для просмотра дампа. - person Brian Campbell; 23.11.2013
comment
Существует надстройка Firefox под названием Live HTTP Headers. это даст вам полный HTTP-запрос и ответ. Он также доступен для Chrome. - person SKWebDev; 25.03.2015

Вот еще один вариант: Chaosreader

Поэтому мне нужно отладить приложение, которое отправляет XML в стороннее приложение. Я нашел замечательный небольшой Perl-скрипт, который выполняет всю тяжелую работу - вы просто забиваете его в выходной файл tcpdump, и он выполняет все манипуляции и выводит все, что вам нужно ...

Скрипт называется chaosreader0.94. См. http://www.darknet.org.uk/2007/11/chaosreader-trace-tcpudp-sessions-from-tcpdump/.

Это сработало, как угощение, я сделал следующее:

tcpdump host www.blah.com -s 9000 -w outputfile; perl chaosreader0.94 outputfile
person thinker007    schedule 20.05.2012