tcpdump를 사용하는 http 헤더의 사람이 읽을 수있는 형식


69

Linux 컴퓨터에서 Apache (포트 80에서 수신 대기)에서 Tomcat (포트 4080)으로 전송 된 HTTP 헤더를보고 싶습니다.

에 따르면 위키 백과 ,

헤더 필드는 일반 텍스트 문자열 형식의 콜론으로 구분 된 이름-값 쌍입니다.

다음 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 명령 만 알고 있지만 대부분의 경우 충분합니다.

편집 : 더 반응이 좋도록 모든 단계에서 버퍼를 제거하도록 수정했습니다. 펄을 필요로하고 당신이 그없는 경우 stdbuf 지금은 비록, 그래서 원래 버전을 사용 : 편집 : 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}로 인해 펄이 라인 버퍼링됩니다.
  • s /.*? (GET | HTTP / [0-9.] * | POST) / \ n $ 1 / g 는 모든 새로운 요청 또는 응답이 시작되기 전에 개행을 추가합니다

1
잘 작동합니다. 해당 tcpdump 표현식의 작동 방식에 대한 자세한 내용을 추가해 주시겠습니까?
Vivek Thomas

1
parens의 'ip'부분은 여기에 설명되어 있습니다 : 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 4080제공합니다 E..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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.