it-swarm-pt.tech

Qual é a maneira mais fácil de farejar TCP dados de tráfego no Linux?

Eu quero uma maneira simples de mostrar todos os dados TCP (não os cabeçalhos TCP ou qualquer outra coisa) passando por qualquer interface na minha caixa Linux.

Por exemplo, eu quero um comando mágico que, se eu fizer:

magic_commmand_I_want port=1234

então, se houvesse um servidor escutando na porta 1234 na minha máquina, e alguém fez:

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a Host/port

Então o comando mágico seria apenas imprimir:

hello

Eu tentei "tcpdump", "Ethereal", "tethereal", "tshark" e outros, mas não é óbvio como você os leva a:

  • não mostrar endereços IP ou outros metadados
  • mostra apenas os "dados" enviados, não pacotes individuais e seus cabeçalhos
  • imprimir os dados como estão, não em hexadecimais e não com marcadores de deslocamento de pacotes
  • sniff all tráfego de rede (seja em eth ou eth1 ou lo, etc ...)

Sim, você provavelmente poderia juntar um conjunto de comandos unix para fazer isso, mas isso não é muito fácil de lembrar para a próxima vez :)

Se você tem um exemplo simples de uma linha de comando exata que faz isso, é o que eu gostaria.

77
Dustin Boswell

Atualização:

Como apontado por Michal nos comentários: A partir do tcpflow versão 1.3, a opção -e é usada para especificar o nome do scanner. Então o erro "Invalid scanner name '8983'" é impresso. O comando correto é

Sudo tcpflow -i any -C -J port 1234

(também -J foi alterado para -g na última versão)


Obrigado a yves por me apontar para " tcpflow ". Aqui está a linha do comando:

tcpflow -i any -C -e port 1234  # as root, or with Sudo

Isso faz tudo que eu quero

  • exibe os dados byte-by-by como ele vem
  • não exibe outros metadados
  • escuta em todas as interfaces (para capturar dados vindos de dentro e fora da máquina)

O "-C" diz para despejar para o console em vez de um arquivo. O "-e" ativa as cores para que o cliente-> servidor e servidor-> cliente sejam visualmente distintos.

Eu instalei o tcpflow simplesmente fazendo

Sudo apt-get install tcpflow
104
Dustin Boswell

socat é a ferramenta que você está pedindo. Pode atuar como um proxy:

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

então seu aplicativo deve conectar a porta 4444 em vez de se conectar diretamente a 1234

Opção -v é para socat imprimir tudo o que recebe no erro padrão (stderr).

Atualizar:

Se socat não estiver disponível em sua máquina, você ainda pode emular dessa maneira com o netcat:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

advertências: esta opção é unidirecional. a segunda instância do netcat imprimirá qualquer resposta do seu servidor para a saída padrão. Você ainda pode fazer então:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
29
yves Baumes

Tente Wireshark . É um excelente analisador de protocolo voltado para Linux e Windows.

20
Kevin Boyd

tcpflow é o que você quer. Extrair da página man:

DESCRIÇÃO
tcpflow é um programa que captura dados transmitidos como parte de TCP conexões (fluxos) e armazena os dados de uma maneira conveniente para análise de protocolo ou depuração. = Um programa como o tcpdump (4) mostra um resumo dos pacotes vistos na conexão, mas geralmente não armazena os dados que estão realmente sendo transmitidos. Em contraste, o tcpflow reconstrói os fluxos de dados reais e armazena cada fluxo em um arquivo separado para análise posterior. O tcpflow entende TCP números de sequência e reconstrói corretamente os fluxos de dados, independentemente de retransmissões ou entrega fora de ordem.

o tcpflow armazena todos os dados capturados em arquivos que possuem nomes do formulário

192.168.101.102.02345-010.011.012.013.45103

onde o conteúdo do arquivo acima seria dados transmitidos da porta 2345 do Host 192.168.101.102 para a porta 45103 do Host 10.11.12.13.

Configure uma conexão do seu aplicativo para o seu servidor. Quando a conexão está ativa e funcionando, o tcpflow ainda é capaz de capturar dados dela Por exemplo:

$ Sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

Todos os dados serão armazenados em um arquivo denominado 127.000.000.001.48842-127.000.000.001.05555.

Você ainda pode redirecionar isso na saída padrão com a opção -Cs. Leia a página de manual para brincar com a expressão para ajustar os pacotes que você deseja que o tcpflow capture.

13
yves Baumes

ngrep é muito bom para isso. Ele pega uma string BPF e uma string opcional para procurar dentro dos pacotes e, em seguida, despeja o conteúdo do pacote para a tela em um formato bastante útil. Opcionalmente também copia para um arquivo pcap_dump que você pode examinar mais de perto no Wireshark mais tarde.

2
hobbs

Dê uma olhada em Chaosreader . Embora faça um pouco mais do que você pede e um pouco diferente, provavelmente você poderia modificar o código dele para fazer o que quiser.

0
Andrew Y