텍스트 tcpdump 다이어그램 참조

텍스트 tcpdump 다이어그램 참조

tcpdump를 사용하여 일부 덤프를 저장했습니다.

tcpdump -n -i eth0 -tttt -Q in > "dump01.dump"

그래서 나는 다음과 같은 결과를 얻습니다.

20:39:12.808672 IP 94.xx.xxx.202.49183 > 151.xx.xx.xx.61479: UDP, length 104
20:39:12.835025 IP 213.xx.xx.25.51197 > 151.xx.xx.xx.61479: Flags [P.], seq 4125053309:4125053343, ack 1004545214, win 194, length 34
20:39:12.936971 IP 222.xxx.xxx.182.59953 > 151.xx.xx.xx.61479: UDP, length 287
20:39:12.948822 IP 195.xx.xxx.30.62384 > 151.xx.xx.xx.61479: UDP, length 101
20:39:12.987527 IP 79.xxx.xxx.216.56394 > 151.xx.xx.xx.443: Flags [P.], seq 700421627:700422382, ack 377141587, win 257, length 755
20:39:12.988554 IP 79.xxx.xxx.216.55621 > 151.xx.xx.xx.443: Flags [P.], seq 3192357072:3192357827, ack 3940752659, win 260, length 755
20:39:12.989291 IP 79.xxx.xxx.216.56517 > 151.xx.xx.xx.443: Flags [P.], seq 3172129891:3172130644, ack 3568957121, win 257, length 753
20:39:12.990879 IP 79.xxx.xxx.216.56394 > 151.xx.xx.xx.443: Flags [.], seq 755:2207, ack 1, win 257, length 1452
20:39:12.991845 IP 79.xxx.xxx.216.56394 > 151.xx.xx.xx.443: Flags [P.], seq 2207:3465, ack 1, win 257, length 1258
20:39:12.992794 IP 79.xxx.xxx.216.56254 > 151.xx.xx.xx.443: Flags [P.], seq 1723903877:1723904632, ack 3204952387, win 260, length 755

물론 IP의 일부를 xxx.

이제 더 흥미로운 부분은 누군가에 의해 DDoS를 당했고 덤프에서 전체 공격을 캡처했지만 이 이벤트의 그래프를 보고 싶습니다. 불행하게도 나는 그것을 사용하지 않기 때문에 -wtcpdump출력은 바이너리가 아니며 Wireshark는 파일 가져오기를 거부합니다. 존재하지 않는 16진수 데이터를 읽으려고 시도합니다.

Wireshark에서 패킷 세부 정보 없이 덤프를 로드하거나, 파일을 변환하거나, 다른 프로그램을 사용하여 그래프를 인쇄하도록 하는 방법이 있습니까?

답변1

패킷의 타임스탬프에만 관심이 있는 경우 16진수를 사용하여 단일 패킷의 스냅샷을 복사하고 타임스탬프만 변경할 수 있습니다. 타임스탬프 text2pcap는 일반적으로 Wireshark와 동일한 패킷에 있습니다.

예를 들어, tcpdump -XX일부 아티팩트 패킷을 캡처하고 ASCII 덤프에서 짧은 TCP 패킷을 선택한 적이 있습니다.

16:51:27.374569 IP 192.168.0.21.nut > 192.168.0.20.53910: Flags [R.] ...
    0x0000:  b827 0099 9999 80ee 7399 9999 0800 4500  ................
    0x0010:  0028 06e4 4000 4006 b272 c0a8 0015 c0a8  .(..@[email protected]......
    0x0020:  0014 0da5 d296 0000 0000 ee15 7872 5014  ............xrP.
    0x0030:  0000 e792 0000                           ......

awk를 통해 필터링하여 원하는 형식의 덤프를 얻을 수 있습니다 text2pcap. 즉:

awk '$1~/0x/ { $0 = substr($0,1,50); for(i=2;i<=9;i++)s = s $i }
     END     { gsub(/../,"& ",s); print "0000 " s }'

mypacket결과로 변수를 설정합니다 .

mypacket='0000  b8 27 00 99 99 99 80 ee 73 99 99 99 08 00 45 00 00 28 06 e4 40 00 40 06 b2 72 c0 a8 00 15 c0 a8 00 14 0d a5 d2 96 00 00 00 00 ee 15 78 72 50 14 00 00 e7 92 00 00'

그런 다음 다른 awk를 사용하여 데이터 파일의 각 행의 열 1에서 시간을 가져와 동일한 패킷에 추가하고 변환기에 이 타임스탬프를 주어진 형식으로 추출하여 Wireshark 형식에 적합한 pcap로 변환하도록 지시합니다.

awk <dump -v mypacket="$mypacket" '
 /79\.xxx\.xxx\.216/ { print $1 " " mypacket }' |
text2pcap -t '%H:%M:%S.' - out.pcap

-t옵션 의 마지막 "."에 유의하십시오 . 타임스탬프의 초 수를 보존해야 합니다.

답변2

출력에 존재하는 제한된 정보가 가능한 경우 텍스트를 PCAP로 변환할 수 있습니다 tcpdump.

#!/usr/bin/env perl
use 5.14.0;
use warnings;
use Time::Piece;

# get this from CPAN
use File::PCAP::Writer ();
my $fpw = File::PCAP::Writer->new( { fname => 'out.pcap' } );

# read tcpdump output from files or standard input
shift @ARGV if @ARGV == 1 and $ARGV[0] eq '-';
while (readline) {
    my ( $stamp, $usec ) = $_ =~ m/^(\d\d:\d\d:\d\d) [.] (\d+) \s IP \s /ax;

    # blindly assume packets all from the same day that is today
    my $now = localtime;
    $stamp = $now->ymd . ' ' . $stamp;

    my $epoch = Time::Piece->strptime( $stamp, "%Y-%m-%d %H:%M:%S" )->epoch;

    # fake an empty packet. this gets timestamps into Wireshark,
    # which may suffice to only graph packets per time
    $fpw->packet( $epoch, $usec, 0, 0, '' );
}

다음 날(또는 도대체 다음 날짜로?)로 롤링되는 타임스탬프를 적절하게 처리하고 출력에 제공된 힌트를 기반으로 패킷을 적절하게 위조하려면 tcpdump(예: 프레임 만들기, IP 만들기(IP 사용) 주소), 올바른 크기와 포트의 TCP 또는 UDP 패킷 만들기, ARP 및 기타 프로토콜은 어떻습니까?잠깐 잠깐 잠깐 잠깐).

PCAP 번거로움이 없는 초당 패킷 타임스탬프의 경우 먼저 epoch-to-packets-seen-in-that-second 스크립트를 사용할 수 있습니다.

#!/usr/bin/env perl
use 5.14.0;
use warnings;
use Time::Piece;

# start epoch
my $day = 1505199600;

my $counter   = 0;
my $prev_secs = -1;
my $prev_ts;

shift @ARGV if @ARGV == 1 and $ARGV[0] eq '-';
while (readline) {
    my ($hhmmss) = $_ =~ m/^(\d\d:\d\d:\d\d) [.] /ax;
    my $secs = Time::Piece->strptime( $hhmmss, "%H:%M:%S" )->epoch;

    # KLUGE assume next day
    $day += 86400 if $secs < $prev_secs;
    my $timestamp = $day + $secs;

    if ( defined $prev_ts and $timestamp != $prev_ts ) {
        say "$prev_ts $counter";
        $counter = 0;
    }

    $counter++;
    $prev_secs = $secs;
    $prev_ts   = $timestamp;
}

say "$prev_ts $counter";

그런 다음 tcpdump변환된 출력을 R에 입력하여 플로팅합니다(모든 출력이 동일한 초에서 나온 것이므로 다음 날의 타임스탬프를 위조했습니다).

$ head -1 dumptext 
20:39:12.808672 IP 94.xx.xxx.202.49183 > 151.xx.xx.xx.61479: UDP, length 104
$ tail -1 dumptext 
00:31:18.123456 IP 79.xxx.xxx.216.56254 > 151.xx.xx.xx.443: Flags [P.], seq 1723903877:1723904632, ack 3204952387, win 260, length 755
$ perl torrr dumptext > dataforr
$ cat dataforr 
1505273952 10
1505287878 1
$ R
> x=read.table("dataforr")
> x
          V1 V2
1 1505273952 10
2 1505287878  1
> names(x)=c('date','packets')
> x$date=strptime(x$date,"%s")
> x
                 date packets
1 2017-09-12 20:39:12      10
2 2017-09-13 00:31:18       1
> plot(x,type='l')
> 

관련 정보