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

74

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

se houvesse um servidor escutando na porta 1234 da minha máquina, e alguém fez isso:

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 impresso:

hello

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

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

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

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

    

7 respostas

102

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 você por me indicar " tcpflow ". Aqui está a linha de comando:

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

Isso faz tudo que eu quero

  • exibe o byte por byte de dados da forma em
  • não exibe nenhum outro metadado
  • ouve 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 e o servidor e o servidor sejam visualmente distintos.

Eu instalei o tcpflow simplesmente fazendo

sudo apt-get install tcpflow
    
por 20.01.2017 / 06:03
27

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 conectar-se diretamente a 1234

A opção

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

Atualização:

Se o 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 isso:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
    
por 11.06.2013 / 17:46
20

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

    
por 01.12.2014 / 13:44
13

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

DESCRIPTION
tcpflow is a program that captures data transmitted as part of TCP connections (flows), and stores the data in a way that is convenient for protocol analysis or debugging. A program like tcpdump(4) shows a summary of packets seen on the wire, but usually doesn't store the data that's actually being transmitted. In contrast, tcpflow reconstructs the actual data streams and stores each flow in a separate file for later analysis. tcpflow understands TCP sequence numbers and will correctly reconstruct data streams regardless of retransmissions or out-of-order delivery.

tcpflow stores all captured data in files that have names of the form

192.168.101.102.02345-010.011.012.013.45103

where the contents of the above file would be data transmitted from host 192.168.101.102 port 2345, to host 10.11.12.13 port 45103.

Configure uma conexão do seu aplicativo para o seu servidor. Quando a conexão está ativa e funcionando, o tcpflow ainda consegue 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 chamado 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.

    
por 14.08.2009 / 17:04
2

ngrep é muito bom para isso. Ele pega uma string BPF e uma string opcional para procurar dentro dos pacotes e, em seguida, copia 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.

    
por 14.08.2009 / 01:15
0

Dê uma olhada no 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.

    
por 14.08.2009 / 01:08
-1

Talvez você possa escrever um wrapper para o tcpdump, por exemplo, que removerá todas as informações redundantes

    
por 14.08.2009 / 00:47