Eu tentei isso:
tcpdump -s 1500 -A -l -i eth0 '(port 6667) and (length > 74)'
Eu preciso apenas da parte ascii disso. Como faço para remover o resto?
Eu tentei isso:
tcpdump -s 1500 -A -l -i eth0 '(port 6667) and (length > 74)'
Eu preciso apenas da parte ascii disso. Como faço para remover o resto?
Respostas:
Como Josh sugere, o tcpflow pode imprimir apenas os dados do pacote TCP em um arquivo ou STDOUT. Você pode canalizar o tcpdump para o tcpflow assim:
tcpdump -i lo -l -w - port 23 | tcpflow -C -r -
Para visualizar apenas um lado da conversa, você pode usar filtros para o tcpdump, por exemplo dst port 23
.
tcpflow
como root?
Não tenho certeza sobre a sintaxe exata de tcpdump
... de fato, marquei esta pergunta como favorita porque gostaria de saber! Mas como uma solução alternativa, você pode tentar usar tcpflow
. Funciona essencialmente da mesma maneira, mas imprime muito melhor a saída ASCII; ele excluiu os cabeçalhos e imprimiu os pacotes sequencialmente como um fluxo, por isso é mais fácil ler e seguir às vezes do que tcpdump
.
Eu sinto que a solução mais elegante é apenas abandonar o tcpdump. Nenhum tubo de qualquer tipo:
tcpflow -c port 6667
E é isso.
Uma maneira rápida e suja de fazer isso é filtrar a saída através de strings:
tcpdump -nli eth0 '(port 6667) and (length > 74)' -s 0 -w - | strings
Às vezes, você não tem outras ferramentas e, para dar uma olhada rápida na carga, isso é suficiente. Não é bom se você precisar da carga exata para injeção ou de uma análise exata, é claro.
Se você precisar apenas da parte ASCII, poderá usar: tcpdump -s 1500 -A -l -i eth0 '(port 6667) and (length > 74)'|sed 's/\.//g'
ou com o ngrep:ngrep -d eth0 -lq . '(port 6667) and (length > 74)' |sed -rn '/^ /s/\.//gp'