Людський читаний формат для заголовків http із tcpdump


69

Я хотів би переглянути заголовки HTTP, надіслані з Apache (прослуховування через порт 80) на Tomcat (на порт 4080) на машині Linux.

За даними Вікіпедії ,

Поля заголовка - розділені двокрапкою пари імен-значень у форматі рядка з чітким текстом.

Я спробував кілька варіантів наступної tcpdumpкоманди:

$ sudo tcpdump -lnX dst port 4080 -c 10

11:29:28.605894 IP SOME_IP.33273 > SOME_IP.4080: P 0:49(49) ack 1 win 23 <nop,nop,timestamp 1191760962 509391143>
    0x0000:  4500 0065 3a9f 4000 3f06 0084 628a 9ec4  E..e:.@.?...b...
    0x0010:  628a 9c97 81f9 0ff0 9e87 eee0 144b 90e1  b............K..
    0x0020:  8018 0017 fb43 0000 0101 080a 4708 d442  .....C......G..B
    0x0030:  1e5c b127 4845 4144 202f 6461 7070 6572  .\.'HEAD./dapper
    0x0040:  5f73 6572 7669 6e67 2f41 644d 6f6e 6b65  _serving/AdMonke
    0x0050:  793f                                     y?

Результат завжди був однаковий - дивна суміш гріш і англійських слів (наприклад HEAD).

Як я можу переглянути заголовки у читаному для людини форматі?


Tcpdump показує весь пакет. Сюди входять заголовки IP та TCP. AFAIK, ви не можете відображати лише корисну навантаження TCP.
Зоредаче

Відповіді:


93

Ось один-лайнер, який я придумав для відображення заголовків HTTP запиту та відповідей tcpdump(що має працювати і для вашого випадку):

sudo tcpdump -A -s 10240 'tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | egrep --line-buffered "^........(GET |HTTP\/|POST |HEAD )|^[A-Za-z0-9-]+: " | sed -r 's/^........(GET |HTTP\/|POST |HEAD )/\n\1/g'

Він обмежує скорочення пакету на 10 Кбіт і знає лише команди GET, POST та HEAD, але цього в більшості випадків має бути достатньо.

EDIT : модифікуйте його, щоб позбутися буферів на кожному кроці, щоб зробити його більш чутливим. Потрібно Perl і stdbuf зараз, тому використовуйте оригінальну версію, якщо у вас немає таких: EDIT : Змінено цілі порту сценарію з 80 на 4080, щоб насправді слухати трафік, який вже пройшов через апаш, а не прямий зовнішній трафік, що надходить до порту 80:

sudo stdbuf -oL -eL /usr/sbin/tcpdump -A -s 10240 "tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" | egrep -a --line-buffered ".+(GET |HTTP\/|POST )|^[A-Za-z0-9-]+: " | perl -nle 'BEGIN{$|=1} { s/.*?(GET |HTTP\/[0-9.]* |POST )/\n$1/g; print }'

Деякі пояснення:

  • sudo stdbuf -oL -eL робить tcpdump запуск лінійно-буферним
  • магічний фільтр tcpdump детально пояснюється тут: https://stackoverflow.com/questions/11757477/understanding-tcpdump-filter-bit-masking
  • grep шукає будь-які лінії з GET, HTTP / або POST; або будь-які рядки, схожі на заголовок (літери та цифри, що супроводжуються двокрапкою)
  • BEGIN {$ | = 1} призводить до запуску perl-буфера
  • s /.*? (GET | HTTP / [0-9.] * | POST) / \ n $ 1 / g додає новий рядок перед початком кожного нового запиту чи відповіді

1
Чудово працює. Не могли б ви додати більше інформації про те, як працює цей вираз tcpdump?
Vivek Thomas

1
деталь 'ip' у паренах пояснюється тут, наприклад: stackoverflow.com/questions/11757477/…
Kibber

Ви просто врятували мені стільки головного болю. Сором я можу лише +1.
Аарон Доббінг

19

Ви можете отримати щось близьке до того, що хочете, використовуючи -A, наприклад,

E....c@.@...
.....Ng.d.P..Ch.).....s.......
.A...u.BHEAD / HTTP/1.1
User-Agent: curl/7.29.0
Host: www.google.com
Accept: */*

Не забудьте використати, -s 0щоб переконатися, що ви отримали весь пакет.

Крім того, ви можете використовувати wiresharkдля інтерактивного перегляду заголовків.


1
Спробував -Aі -s 0, отримав такий же вихід.
Адам Матан

2
Спробуйте без -X.
Flup

tcpdump -s 0 -A dst port 4080дає E..e..@.?.$bb...b....:......w........Q.....G..1.b..HEAD /dapper_serving/AdMonkey?ping=1 HTTP/1.0.
Адам Матан

... що є чимось близьким до того, що ви хочете. Читайте з "HEAD" - це корисна навантаження HTTP. Якщо ви напевно використовували -s 0і після цього нічого HTTP/1.0немає, у запиті немає заголовків HTTP.
Flup

Дякую. Чи є спосіб друкувати лише заголовки тексту, не двійкові корисні навантаження?
Адам Матан

-1

Спробуйте скористатися http://justniffer.sourceforge.net/ Це кращий інструмент або Wireshark з опцією "Дотримуйтесь TCP Flow", є просто багато кращих варіантів, ніж tcpdump, щоб побачити заголовки (запити / відповіді)


1
Можливо, додайте також приклад того, як
налагодити

Можливо, ви можете прочитати сторінку чоловіка? justniffer.sourceforge.net/#!/man_page
Даніла
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.