tcpdump : grepable 출력을 얻는 방법?


13

어플라이언스에서 tcpdump 만 사용할 수있는 문제를 해결하려고합니다. tcpdump를 사용하여 웹 트래픽을 필터링하고 특정 문자열이 포함 된 트래픽 만 표시하려고합니다.

나는 다음을한다 :

tcpdump -nei eth0 -X | grep "something interesting"

출력은 16 바이트 pr 행을 가진 hexview입니다. 데이터가 여러 줄로 표시 되므로이 데이터를 잡을 수 없습니다.

tcpdump가 캡처 된 데이터를 한 줄에 표시하는 방법이 있습니까? 그러면 grep을 사용하여 흥미로운 패킷을 찾을 수 있습니다.


1
글쎄, 나는 이것을 지금 테스트 할 수 없지만 여러 줄이 있다면 당신은 할 수 있습니다 | tr -d '\ n'또는 grep -C 3 : 전후에 일부 줄을 가져 오기
barlop

@barlop, grep -C 일종의 작동하지만 신뢰할 수 없습니다. 헤더의 줄 수를 알 수 없으므로 일치하는 줄 아래에 줄이 표시되지 않습니다. tr 명령은 모든 출력을 1 행으로 변환하므로 비트가 너무 많습니다.
개는 고양이 세계를 먹는다

다음은 grep이 아니지만 tcpdump는 정규 표현식없이 본질적으로 grep 인 16 진수로 문자열을 일치시킬 수 있습니다. 오프셋을 지정할 수 있습니다. 나는이 파일에 아래 두었다 한 (windump으로 수행하지만 그 때문에 tcpdump를 가정 tcpdump를 그냥 윈도우 버전의) tcpdump를 -nXr zfile "TCP [32 : 4] = 0x47455420"
barlop을

tcpdump -nei eth0 -X | grep --line-buffered "something interesting"무의미한 이유로 내 유효한 작업 답변이 삭제되었습니다.
sjas

답변:


11

를 사용할 수없는 ngrep사용자 awk를 위해 tcpdump패킷 내용 의 출력을 grepable 로 만드는 방법을 소개합니다.

먼저 tcpdump -x작업을 제시하기 위해에서 제공 한 일부 샘플 출력 :

$ tcpdump -xr dump.pcap 2>/dev/null
12:04:59.590664 IP 10.17.14.93.51009 > 239.194.1.9.51009: UDP, length 370
        0x0000:  4500 018e 0000 4000 fa11 7625 0a11 0e5d
        0x0010:  efc2 0109 c741 c741 017a 6f28 1120 2020
        0x0020:  3337 3030 3039 3031 3835 3635 3430 3130
...

그리고 이것은 출력을 파이프 할 수 있는 복사 및 붙여 넣기 가능한 awk스크립트입니다

awk '{ if (match($0, /^[0-9]/, _)) { printf (NR == 1 ? "%s " : "\n%s "), $0; fflush() } else { sub(/^\s+0x[0-9a-z]+:\s+/, " "); gsub(" ", ""); printf "%s", $0 } } END { print ""; fflush() }'

다음과 같은 grepable 출력을 얻으려면

12:04:59.590664 IP 10.17.14.93.51009 > 239.194.1.9.51009: UDP, length 370 4500018e00004000fa1176250a...
12:04:59.590798 IP 10.17.14.113.51011 > 239.194.1.11.51011: UDP, length 370 4500018e00004000fa11760f...
...

아래는 위 스크립트의 주석이 달린 버전입니다.

awk '
{
    # if this is a header line
    if (match($0, /^[0-9]/, _)) 
    {
        # print the header, but:

        # except for the first line,
        # we need to insert a newline,
        # as the preceding data lines
        # have been stripped of theirs

        # we also append a space to
        # separate header info from the
        # data that will get appended
        printf (NR == 1 ? "%s " : "\n%s "), $0
        # enforce line-buffering
        fflush()
    }
    # otherwise it is a data line
    else 
    {
        # remove the data address
        sub(/^\s+0x[0-9a-z]+:\s+/, " ");
        # remove all spaces
        gsub(" ", "");
        # print w/o newline
        printf "%s", $0 
    }
}
END
{
    # print final newline, as
    # the preceding data lines
    # have been stripped of theirs
    print ""
    # enforce line-buffering
    fflush()
}'

2

로부터 tcpdump맨 :

-A      Print each packet (minus its link level header) in ASCII.  Handy
        for capturing web pages.

-s 0옵션을 사용하여 전체 패킷이 표시되는지 확인하십시오.


고마워하지만 웹 페이지에 줄 바꿈이있는 곳마다 데이터가 여러 줄로 표시됩니다. 헤더 (및 나머지 데이터)를 grepped 출력과 연결하는 데 문제가 있습니다.
개 고양이 세계 먹고

난 그냥 왜 도구라고 AWK의 실현 병동
개 고양이 세계 먹고

1

당신은 ngrep명령을 보고 싶을 수도 있습니다 :

ngrep -W single -d eth0 'regex to match' 'port 80'

어디:

  • -W single 한 줄 형식을 지정합니다
  • regex to match 특정 문자열을 포함하는 패킷 만 덤프하는 것을 의미합니다.
  • 'port 80' 포트 80에서 또는 포트 80으로 패킷을 스니핑하는 pcap 필터입니다.

1
오는 Ngrep 사용하려면,하지만 그런 도구가없는 것 - 그것은 어플라이언스는 ...이다
개는 고양이 세계 먹을

ngrep는 굉장합니다. 어느 호스트가 호스트로 HTTP 트래픽을 생성하고 있는지 몇 시간 동안 검색했습니다. 단일 sudo ngrep "GET .."로 답변을 분 안에 발견했습니다.
Bartosz Bilicki

0

출력이 16 진인 이유는 -X플래그입니다. 시험:

tcpdump -ni eth1 | grep something_interesting

cli에 바로 읽을 수있는 출력을 덤프합니다.


예. 그러나 패킷의 내용은 포함하지 않습니다.
RalfFriedl

0

awk 스크립트를 사용하여 원하는 작업을 수행 할 수 없었으며 ngrep이 USB를 통한 이더넷에서 작동하지 않으므로 tcpdump의 출력 라인을 결합하는 작은 C 프로그램을 작성하여 grep 가능합니다. 그것은에서의 https://gitlab.com/dargaud/TcpDumpJoin

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