Định dạng có thể đọc được của con người cho các tiêu đề http với tcpdump


69

Tôi muốn xem các tiêu đề HTTP được gửi từ Apache (nghe trên cổng 80) đến Tomcat (trên cổng 4080) trong máy Linux.

Theo Wikipedia ,

Các trường tiêu đề là các cặp tên-giá trị được phân tách bằng dấu hai chấm ở định dạng chuỗi văn bản rõ ràng.

Tôi đã thử một số biến thể của tcpdumplệnh sau :

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

Kết quả luôn giống nhau - một sự pha trộn kỳ lạ giữa những từ vô nghĩa và từ tiếng Anh (ví dụ HEAD).

Làm cách nào tôi có thể xem các tiêu đề ở định dạng có thể đọc được?


Tcpdump hiển thị toàn bộ gói. Điều này bao gồm các tiêu đề IP và TCP. AFAIK, bạn không thể chỉ hiển thị tải trọng TCP.
Zoredache

Câu trả lời:


93

Đây là một lớp lót tôi đã đưa ra để hiển thị các tiêu đề HTTP yêu cầu và phản hồi bằng cách sử dụng tcpdump(cũng nên hoạt động cho trường hợp của bạn):

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'

Nó giới hạn cắt gói tin ở mức 10Kb và chỉ biết các lệnh GET, POST và HEAD, nhưng điều đó là đủ trong phần lớn các trường hợp.

EDIT : sửa đổi nó để loại bỏ bộ đệm ở mỗi bước để làm cho nó phản ứng nhanh hơn. Cần có Perl và stdbuf ngay bây giờ, vì vậy hãy sử dụng phiên bản gốc nếu bạn không có: EDIT : Đã thay đổi mục tiêu cổng tập lệnh từ 80 đến 4080, để thực sự lắng nghe lưu lượng đã đi qua apache, thay vì lưu lượng truy cập bên ngoài trực tiếp đến cổng 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 }'

Một số giải thích:

  • sudo stdbuf -oL -eL làm cho tcpdump chạy bộ đệm
  • bộ lọc ma thuật tcpdump được giải thích chi tiết tại đây: https://stackoverflow.com/questions/11757477/under Hiểu-tcpdump-filter-bit-masking
  • grep đang tìm kiếm bất kỳ dòng nào với GET, HTTP / hoặc POST; hoặc bất kỳ dòng nào trông giống như một tiêu đề (chữ cái và số được theo sau bởi dấu hai chấm)
  • BEGIN {$ | = 1} khiến perl chạy bộ đệm dòng
  • s /.*? (NHẬN | HTTP / [0-9.] * | POST) / \ n $ 1 / g thêm một dòng mới trước khi bắt đầu mỗi yêu cầu hoặc phản hồi mới

1
Công trình tuyệt vời. Bạn có thể vui lòng thêm chi tiết về cách hoạt động của biểu thức tcpdump không?
Vivek Thomas

1
phần 'ip' trong parens được giải thích ở đây, ví dụ: stackoverflow.com/questions/11757477/iêu
Kibber

Bạn vừa cứu tôi rất đau đầu. Thật xấu hổ tôi chỉ có thể +1.
Aaron Dobbing

19

Bạn có thể nhận được một cái gì đó gần với những gì bạn muốn bằng cách sử dụng -A, ví dụ

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

Hãy nhớ sử dụng -s 0để đảm bảo bạn nhận được toàn bộ gói.

Ngoài ra, bạn có thể sử dụng wiresharkđể xem các tiêu đề tương tác.


1
Đã thử -A-s 0, có cùng một đầu ra.
Adam Matan

2
Hãy thử mà không có -X.
Flup

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

... đó là một cái gì đó gần với những gì bạn muốn. Đọc từ 'ĐẦU' - đây là tải trọng HTTP. Nếu bạn chắc chắn đã sử dụng -s 0và không có gì sau HTTP/1.0đó, không có tiêu đề HTTP trong yêu cầu.
Flup

cảm ơn. Có cách nào để chỉ in các tiêu đề văn bản, sans tải trọng nhị phân không?
Adam Matan

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.