Exibe apenas a seção de dados do pacote

2

Estou tentando exibir apenas a seção de dados de um pacote udp usando o tcpdump. Em outras palavras, é alguma maneira de filtrar a seção de cabeçalho do pacote udp?

O comando abaixo

sudo tcpdump -Aq -i lo udp  port 1234 

retorna:

E..".J@[email protected]~.........v.....!HELLO

Como posso descartar a parte E..".J@[email protected]~.........v.....! ?

    
por Vicente Adolfo Bolea Sánchez 23.03.2014 / 11:14

3 respostas

4

Aqui estão algumas maneiras. Nos exemplos abaixo, estou usando echo para imprimir a string específica da sua resposta, mas você pode substituir o echo 'blah blah' | command por sudo tcpdump -Aq -i lo udp port 1234 | command .

  1. awk

    $ echo 'E..".J@[email protected]~.........v.....!HELLO' | awk -F'!' '{print $NF}'
    HELLO
    

    awk divide as linhas de entrada em campos dividindo o caractere dado como -F . Nesse caso, ! . $NF é uma variável especial que significa o último campo. Então, o comando acima, pega ! como o separador de campo e imprime o último campo, ou seja, o que vier depois do último ! .

  2. grep

    echo 'E..".J@[email protected]~.........v.....!HELLO' | grep -oP '!\K.+?$'
    

    O sinalizador -o faz com que grep imprima apenas a parte correspondida da linha e -P ativa Expressões regulares compatíveis com Perl, o que nos dá \K . O regex está procurando por um ! e a seqüência mais curta possível ( .+? , o ? faz com que ele procure o menor) até o final da linha ( $ ). O \K significa: descarte o que foi correspondido antes do \K . O resultado é que o ! (que é anterior ao \K ) é descartado e somente o HELLO é impresso.

  3. cut

    echo 'E..".J@[email protected]~.........v.....!HELLO' | cut -d'!' -f2
    

    cut é um utilitário que, bem, corta linhas. Neste caso, estou definindo o delimitador de campo como ! e imprimindo o segundo campo, o HELLO .

  4. perl

     echo 'E..".J@[email protected]~.........v.....!HELLO' | perl -pe 's/.+\!//'
    

    O -p significa "imprimir todas as linhas depois de aplicar o script fornecido com -e a ele". O próprio script usa o operador de substituição ( s/pattern/replacement/ ) para substituir tudo até o último ! (aqui, pois não há ? , o .+ corresponderá à maior cadeia possível) sem nada, deixando efetivamente apenas o HELLO .

por terdon 16.04.2014 / 10:51
4

Tente isso,

$ echo 'E..".J@[email protected]~.........v.....!HELLO' | grep -oP '!+.*' | sed 's/.\(.*\)//g'
HELLO
    
por Avinash Raj 16.04.2014 / 07:31
2

Com base na estrutura do pacote udp, você deve cortar a saída tcpdump de um local específico, em vez de procurar por um determinado caractere, que também pode mudar:

sudo tcpdump -Aq -i lo udp  port 1234 | cut -c29-

Por exemplo, enviando um pacote udp com o netcat:

echo "HELLO" | netcat -4u -w1 localhost 1234

esta é a saída do meu tcpdump (em hexadecimal e ascii):

sudo tcpdump -X -i lo udp port 1234

12:35:10.672236 IP localhost.36898 > localhost.1234: UDP, length 6
     0x0000:  4500 0022 ab0e 4000 4011 91ba 7f00 0001  E.."..@.@.......
     0x0010:  7f00 0001 9022 04d2 000e fe21 4845 4c4c  .....".....!HELL
     0x0020:  4f0a                                     O.

mas, enviando outra string, como:

echo "HELLOS" | netcat -4u -w1 localhost 1234

esta é a saída:

12:50:01.987211 IP localhost.45180 > localhost.1234: UDP, length 7
    0x0000:  4500 0023 3873 4000 4011 0455 7f00 0001  E..#8s@[email protected]....
    0x0010:  7f00 0001 b07c 04d2 000f fe22 4845 4c4c  .....|....."HELL
    0x0020:  4f53 0a                                  OS.

o caractere antes da string "HELLOS" é alterado, porque os 2 bytes precedentes à seção de data estão relacionados à soma de verificação do udp, e então mudam de acordo com o pacote enviado.

captura de tela do whireshark:

IP:

Pacote UDP:

e soma de verificação de 2 bytes:

    
por girardengo 16.04.2014 / 15:50