Tcpdump ile http başlıkları için insan tarafından okunabilir format


69

Bir Linux makinesinde Apache'den (80 numaralı bağlantı noktasını dinleyerek) Tomcat'a (4080 numaralı bağlantı noktasına) gönderilen HTTP başlıklarını görüntülemek istiyorum.

Wikipedia'ya göre ,

Başlık alanları, açık metin dizesi biçiminde iki nokta üst üste işaretli ad-değer çiftleridir.

Aşağıdaki tcpdumpkomutun bazı varyasyonlarını denedim :

$ 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?

Sonuç her zaman aynıydı - garip bir ve İngilizce kelimelerin tuhaf bir karışımı HEAD.

Başlıkları insan tarafından okunabilir bir biçimde nasıl görebilirim?


Tcpdump paketin tamamını gösterir. Buna IP ve TCP başlıkları da dahildir. AFAIK, sadece TCP yükünü görüntüleyemezsiniz.
Zoredache

Yanıtlar:


93

İşte, istek ve yanıt HTTP başlıklarını tcpdump(durumunuz için de işe yaraması gerekir) kullanarak görüntülemek için bulduğum bir liner :

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'

Paketi 10Kb'de keser ve yalnızca GET, POST ve HEAD komutlarını bilir, ancak çoğu durumda bu yeterli olacaktır.

EDIT : Her adımda tamponlardan kurtulmak için daha fazla tepki vermesi için değiştirildi. Gerçekte Perl ve stdbuf'a ihtiyaç duyuyorlar, bu yüzden eğer sizde yoksa orijinal sürümü kullanın: EDIT : Değiştirilmiş script portu, 80'den 4080'e, zaten apache'den geçen trafiği, limana gelen doğrudan dış trafik yerine dinlemek için dinlemeyi tercih etti. 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 }'

Bazı açıklamalar:

  • sudo stdbuf -oL -eL , tcpdump'ın satır arabelleğe alınmasını sağlar
  • tcpdump sihirli filtresi burada ayrıntılı olarak açıklanmaktadır: https://stackoverflow.com/questions/11757477/understanding-tcpdump-filter-bit-masking
  • grep, GET, HTTP / veya POST olan herhangi bir satır arıyor; veya bir başlığa benzeyen herhangi bir satır (harfleri ve rakamları iki nokta üst üste takip eder)
  • BEGIN {$ | = 1} , perl’in satır arabelleğe alınmasına neden oluyor
  • s /.*? (GET | HTTP / [0-9.] * | POST) / \ n $ 1 / g , her yeni istek veya yanıtın başlamasından önce yeni bir satır ekler

1
Harika çalışıyor. Lütfen tcpdump ifadesinin nasıl çalıştığı hakkında daha fazla ayrıntı ekleyebilir misiniz?
Vivek Thomas

1
parens 'ip' kısmı burada açıklanmaktadır, örneğin: stackoverflow.com/questions/11757477/…
Kibber

Az önce beni çok fazla baş ağrısı kurtardın. Utanç ben sadece +1 olabilir.
Aaron Dobbing

19

Kullanarak istediklerinize yakın bir şey elde edebilirsiniz -A, örneğin

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 0Tüm paketi aldığınızdan emin olmak için kullanmayı unutmayın .

Alternatif olarak wireshark, başlıkları etkileşimli olarak görüntülemek için kullanabilirsiniz .


1
Denendi -Ave -s 0aynı çıktıyı aldım.
Adam Matan

2
Olmadan deneyin -X.
Flup

tcpdump -s 0 -A dst port 4080verir E..e..@.?.$bb...b....:......w........Q.....G..1.b..HEAD /dapper_serving/AdMonkey?ping=1 HTTP/1.0.
Adam Matan

... istediğine yakın bir şey. 'HEAD' içinden okuyun - bu HTTP yüküdür. Kesinlikle kullandıysanız -s 0ve sonrasında hiçbir şey HTTP/1.0yoksa, istekte hiçbir HTTP başlığı yoktur.
Flup

Teşekkürler. Yalnızca metin başlıklarını yazdırmanın bir yolu var mı, ikili yükü müsaade ediyor mu?
Adam Matan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.