Veja o gráfico do texto tcpdump

0

Eu salvei alguns dados do tcpdump usando

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

então eu tenho saída assim:

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

é claro que substituí parte de IP's por xxx .

Agora, a parte mais interessante - eu fui DDoSed por alguém e capturei todo o ataque ao despejo, mas quero ver o gráfico deste incidente. Infelizmente, como eu não usei -w com tcpdump minha saída não é binária e Wireshark se recusa a importar arquivo - ele tenta ler dados hexadecimais com não existe.

Existe uma maneira de forçar o Wireshark a carregar este dump sem detalhes de pacotes, converter meu arquivo ou usar outro programa para imprimir gráficos para mim?

    
por Bielecki 11.09.2017 / 20:55

2 respostas

1

Se você estiver interessado apenas no registro de data e hora dos pacotes, poderá fazer um snapshot de um único pacote em hexadecimal e replicá-lo, alterando apenas o timestamp, usando text2pcap , que geralmente está no mesmo pacote que wireshark.

Por exemplo, usei tcpdump -XX para capturar alguns pacotes artibrary e escolhi um tcp curto do dump ascii:

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                           ......

Você pode filtrar isso com um pouco de awk para obter o despejo no formato desejado por text2pcap , a saber:

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

Defina a variável mypacket para o resultado:

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'

Em seguida, use outro awk para tomar o tempo da coluna 1 de cada linha do arquivo de dados e prefixar o mesmo pacote, dizendo ao programa de conversão para extrair este registro de data e hora no formato fornecido e convertê-lo em formato pcap. para wireshark.

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

Observe o final "." na opção -t . É necessário preservar as frações de segundos no timestamp.

    
por 12.09.2017 / 17:45
1

O texto pode ser convertido em PCAP, na medida em que isso seja possível a partir da informação limitada presente na saída tcpdump , por exemplo

#!/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, '' );
}

embora seja necessário mais código para manipular adequadamente os timestamps que rolam para o dia seguinte (ou, oops, para alguma data posterior?) e para apropriadamente pacotes falsos com as dicas dadas na saída tcpdump (por exemplo, criar um quadro , faça IP (com os endereços IP), faça um pacote TCP ou UDP do tamanho e portas corretos, o que dizer do ARP e de outros protocolos, etc etc etc ).

Para em vez de pacotes por segundo a partir dos timestamps sem o barulho do PCAP, pode-se primeiro usar um script 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";

Em seguida, alimente a saída tcpdump convertida em R para plotagem (eu falsifiquei um registro de data e hora de um dia subsequente, pois todos vocês são do mesmo segundo):

$ 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')
> 
    
por 12.09.2017 / 18:40