รูปแบบที่มนุษย์อ่านได้สำหรับส่วนหัว 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
Zoredache

คำตอบ:


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'

มัน จำกัด การตัดแพ็คเก็ตที่ 10Kb และรู้เพียงคำสั่ง GET, POST และ HEAD แต่ควรจะเพียงพอในกรณีส่วนใหญ่

แก้ไข : แก้ไขเพื่อกำจัดบัฟเฟอร์ในทุกขั้นตอนเพื่อให้ตอบสนองได้ดียิ่งขึ้น แม้ว่าตอนนี้ต้องการ Perl และ stdbuf ดังนั้นโปรดใช้เวอร์ชันดั้งเดิมหากคุณไม่มี: แก้ไข : เปลี่ยนเป้าหมายสคริปต์พอร์ตจาก 80 เป็น 4080 เพื่อรับฟังทราฟฟิกที่ผ่าน apache ไปแล้วแทนการรับส่งข้อมูลภายนอกโดยตรงที่มาถึงพอร์ต 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 run line-buffered
  • ตัวกรองมายากล 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' ใน parens ถูกอธิบายไว้ที่นี่ตัวอย่างเช่น: stackoverflow.com/questions/11757477/ …
Kibber

คุณเพิ่งช่วยฉันปวดหัวมาก น่าเสียดายที่ฉันทำได้เพียง +1
Aaron Dobbing

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ได้รับผลลัพธ์เดียวกัน
Adam Matan

2
-Xโดยไม่ต้องลอง
Flup

tcpdump -s 0 -A dst port 4080E..e..@.?.$bb...b....:......w........Q.....G..1.b..HEAD /dapper_serving/AdMonkey?ping=1 HTTP/1.0จะช่วยให้
Adam Matan

... ซึ่งเป็นสิ่งที่ใกล้เคียงกับสิ่งที่คุณต้องการ อ่านจาก 'HEAD' - นี่คือเพย์โหลด HTTP หากคุณใช้ไปอย่างแน่นอน-s 0และไม่มีอะไรหลังจากHTTP/1.0นั้นก็ไม่มีส่วนหัว HTTP ในคำขอ
Flup

ขอบคุณ มีวิธีพิมพ์เฉพาะส่วนหัวของข้อความหรือไม่?
Adam Matan

-1

ลองใช้http://justniffer.sourceforge.net/ เป็นเครื่องมือที่ดีกว่าหรือ Wireshark พร้อมตัวเลือก "Follow TCP Flow" มีเพียงตัวเลือกที่ดีกว่า tcpdump เพื่อดูส่วนหัว (ร้องขอ / ตอบกลับ)


1
อาจเพิ่มตัวอย่างรวมถึงวิธีการทำงานนี้
vikas027

บางทีคุณสามารถอ่าน man page ได้? justniffer.sourceforge.net/#!/man_page
Danila Ladner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.