2009-08-13 22:44:50 +0000 2009-08-13 22:44:50 +0000
82
82

Quel est le moyen le plus simple de renifler les données de trafic TCP sous Linux ?

Je veux un moyen simple de montrer toutes les données TCP (pas les en-têtes TCP ou quoi que ce soit d'autre) passant par n'importe quelle interface de ma boîte Linux.

Par exemple, je veux une commande magique qui si je le fais :

magic_commmand_I_want port=1234

alors s'il y avait un serveur qui écoutait sur le port 1234 de ma machine, et que quelqu'un l'a fait :

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

Alors la commande magique s'imprimerait simplement :

hello

J'ai essayé “tcpdump”, “ethereal”, “tethereal”, “tshark”, et d'autres, mais la façon de les obtenir n'est pas évidente :

  • ne pas afficher les adresses IP ou autres métadonnées
  • n'afficher que les “données” envoyées, pas les paquets individuels et leurs en-têtes
  • imprimer les données telles quelles, pas en hexadécimal, et pas avec des marqueurs de décalage de paquets
  • renifler tout le trafic réseau (qu'il soit sur eth0 ou eth1 ou lo, etc. ..)

Oui, vous pourriez probablement enchaîner un ensemble de commandes unix pour faire cela, mais ce n'est pas très facile à retenir pour la prochaine fois :)

Si vous avez un exemple simple d'une ligne de commande exacte qui fait cela, c'est ce que j'aimerais.

Réponses (7)

109
109
109
2009-08-14 17:05:54 +0000

Mise à jour:

Comme indiqué par Michal dans les commentaires : A partir de la version 1.3 de tcpflow, l'option -e est utilisée pour spécifier le nom du scanner. L'erreur “Invalid scanner name ‘8983’” s'affiche donc. La commande correcte est

sudo tcpflow -i any -C -J port 1234

(-J a également été changé en -g dans la dernière version)


Merci à yves de m'avoir indiqué tcpflow “. Voici la ligne de commande :

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

Cela fait tout ce que je veux

  • affiche les données octet par octet telles qu'elles sont
  • n'affiche aucune autre métadonnée
  • écoute sur toutes les interfaces (donc il capture les données provenant de l'intérieur de la machine et de l'extérieur)

Le ”-C“ lui dit de se vider sur la console au lieu d'un fichier. Le ”-e“ active les couleurs pour que le client->serveur et le serveur->client soient visuellement distincts.

J'ai installé tcpflow en faisant simplement

sudo apt-get install tcpflow
30
30
30
2009-08-13 22:48:27 +0000

socat est l'outil que vous demandez. Il peut servir de mandataire :

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

alors votre application doit connecter le port 4444 au lieu de se connecter directement à 1234

-v l'option est que socat imprime tout ce qu'il reçoit sur l'erreur standard (stderr).

Mise à jour :

Si socat n'est pas disponible sur votre machine, vous pouvez toujours l'émuler de cette façon avec netcat :

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

caveats : cette option est unidirectionnelle. la deuxième instance de netcat imprimera toute réponse de votre serveur sur la sortie standard. Vous pouvez toujours le faire :

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
20
20
20
2009-08-13 22:47:06 +0000

Essayez Wireshark . C'est un excellent analyseur de protocole ciblé à la fois pour Linux et Windows.

13
13
13
2009-08-14 15:04:28 +0000

tcpflow est ce que vous voulez. Extrait de la page de manuel :

DESCRIPTION tcpflow est un programme qui capture les données transmises dans le cadre de connexions TCP (flux), et stocke les données d'une manière pratique pour l'analyse ou le débogage du protocole. Un programme comme tcpdump(4) montre un résumé des paquets vus sur le fil, mais ne stocke généralement pas les données qui sont effectivement transmises. En revanche, tcpflow reconstruit les flux de données réels et stocke chaque flux dans un fichier séparé pour une analyse ultérieure. tcpflow comprend les numéros de séquence TCP et reconstruira correctement les flux de données indépendamment des retransmissions ou des livraisons hors service.

tcpflow stocke toutes les données saisies dans des fichiers dont les noms sont de la forme

192.168.101.102.02345-010.011.012.013.45103

où le contenu du fichier ci-dessus serait des données transmises de l'hôte 192.168.101.102 port 2345, à l'hôte 10.11.12.13 port 45103.

Établissez une connexion entre votre application et votre serveur. Lorsque la connexion est établie, tcpflow est toujours capable de capturer des données à partir de celle-ci. Par exemple :

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

Chaque donnée sera stockée dans un fichier nommé 127.000.000.001.48842-127.000.000.001.05555.

Vous pouvez toujours rediriger ce fichier sur la sortie standard avec l'option -Cs . Lisez la page de manuel pour jouer avec l'expression afin de régler les paquets que vous voulez que tcpflow capture.

2
2
2
2009-08-13 23:15:48 +0000

ngrep c'est très bien pour ça. Il prend une chaîne BPF et une chaîne optionnelle à rechercher dans les paquets, puis il affiche le contenu du paquet à l'écran dans un format très utile. Il peut également transférer le contenu du paquet dans un fichier pcap_dump que vous pourrez examiner de plus près dans Wireshark plus tard.

0
0
0
2009-08-13 23:08:00 +0000

Regardez Chaosreader . Bien qu'il fasse un peu plus que ce que vous demandez et de façon légèrement différente, vous pourriez probablement en modifier le code pour faire ce que vous voulez.

-1
-1
-1
2009-08-13 22:47:31 +0000

Peut-être pouvez-vous rédiger une enveloppe pour tcpdump, par exemple, qui supprimera toutes les informations redondantes