Question Quel est le moyen le plus simple de sniffer 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 autre) passant par-dessus une interface de ma machine Linux.

Par exemple, je veux un ordre magique si je le fais:

magic_commmand_I_want port=1234

alors s'il y avait un serveur écoutant sur le port 1234 sur ma machine, et 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

Ensuite, la commande magique devrait simplement imprimer:

hello

J'ai essayé "tcpdump", "ethereal", "tethereal", "tshark", et d'autres, mais il n'est pas évident de savoir comment les amener à:

  • ne pas afficher les adresses IP ou autres métadonnées
  • affiche uniquement 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 à décalage de paquets
  • renifler tout le trafic réseau (que ce soit sur eth0 ou eth1 ou lo, etc...)

Oui, vous pourriez probablement assembler 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.


74


origine


tcpdump est la commande magique que vous voulez. Wireshark est une belle interface graphique au-dessus de la bibliothèque utilisée par tcpdump - Vinko Vrsalovic
Je sais que c'est une vieille question mais je suis curieux de savoir pourquoi l'utilisation de nc pour le "côté serveur" n'était pas non plus une option? "nc -l 1234" crée un serveur qui écoute sur le port 1234 et imprime tout ce qui lui est envoyé et ferme la connexion. Si vous souhaitez conserver la connexion active et ne pas vous déconnecter, vous pouvez ajouter l'option "-k". - StFS
@StFS parce qu'il veut renifler un port en cours d'exécution et nc se plaindre. - infoclogged


Réponses:


Mettre à jour: 

Comme souligné par Michal dans les commentaires: Depuis tcpflow version 1.3, l'option -e est utilisée pour spécifier le nom du scanner. Donc, l'erreur "Nom du scanner invalide '8983'" est imprimée. La commande correcte est

sudo tcpflow -i any -C -J port 1234

(aussi -J a été changé pour -g dans la dernière version)


Merci à yves de m'avoir montré "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 l'octet-by-octet de données tel qu'il se présente
  • n'affiche pas d'autres métadonnées
  • écoute sur toutes les interfaces (il capture donc les données provenant de la machine et de l'extérieur)

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

J'ai installé tcpflow simplement en faisant

sudo apt-get install tcpflow

101



Sensationnel. tcpflow est génial, merci! M'a sauvé un TONNE de la douleur que j'avais avec wireshark. Wireshark, tcpdump, etc. ont beaucoup trop d'informations et ne font pas réellement ce que demande la question d'origine. tcpflow est parfait pour cela. - Russ
De la version 1.3 de tcpflow -e L'option est utilisée pour spécifier le nom du scanner. Donc, l'erreur "Nom du scanner invalide '8983'" est imprimée. La commande correcte est sudo tcpflow -i any -C -J port 1234 - Michal Kováč
Notez que -J a été changé pour -g dans la dernière version (s). - tvon
Quelqu'un doit expliquer aux auteurs de l'outil ce que le terme "compatibilité descendante" signifie! - Sridhar-Sarnobat


socat est l'outil que vous demandez. Il peut agir comme un proxy:

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

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

L'option -v permet à socat d'imprimer tout ce qu'il reçoit sur l'erreur standard (stderr).

Mettre à jour:

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

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

mises en garde: cette option est unidirectionnelle. la seconde instance de netcat imprimera toute réponse de votre serveur à la sortie standard. Vous pouvez toujours le faire alors:

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

27



Supposons que je ne dispose pas de contrôle sur le client et le serveur, (ou je ne veux pas l'arrêter), donc je ne peux pas changer le port sont impliqués ou intercepter le trafic. Alors quoi?


Essayer Wireshark. C'est un excellent analyseur de protocole destiné à Linux et à Windows.


19



Mon expérience est que l'interface aspire vraiment Linux. - Joe Phillips
putain, vous êtes arrivé avant moi, +1 sur wireshark
Pouvez-vous donner un exemple de ligne de commande?
Regardez ce lien wiki.wireshark.org/Tools Il donne une liste des outils de ligne de commande pour wireshark. Attention à Dumpcap. - Kevin Boyd


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

LA DESCRIPTION
tcpflow est un programme qui   capture les données transmises dans le cadre de   Connexions TCP (flux) et magasins   les données d'une manière qui est pratique   pour l'analyse de protocole ou le débogage. UNE   programme comme tcpdump (4) montre un   résumé des paquets vus sur le fil,   mais généralement ne stocke pas les données   cela est en train d'être transmis. Dans   contraste, tcpflow reconstruit le   flux de données réels et stocke chacun   flux dans un fichier séparé pour plus tard   une analyse. tcpflow comprend TCP   numéros de séquence et seront correctement   reconstruire des flux de données indépendamment de   retransmissions ou hors service   livraison.

tcpflow stocke toutes les données capturées dans   les fichiers qui ont des noms de formulaire

192.168.101.102.02345-010.011.012.013.45103

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

Configurez une connexion de votre application à votre serveur. Lorsque la connexion est active, tcpflow est toujours capable d'en capturer les données Par exemple:

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

Toutes les données seront stockées dans un fichier nommé 127.000.000.001.48842-127.000.000.001.05555.

Vous pouvez toujours rediriger ceci sur la sortie standard avec l'option -Cs. Lisez la page de manuel pour jouer avec expression afin de régler les paquets que tcpflow doit capturer.


13





ngrep C'est très bien pour ça. Il faut une chaîne BPF et une chaîne facultative pour rechercher dans les paquets, puis vider le contenu du paquet pour le filtrer dans un format assez utile. Il peut également être ajouté à un fichier pcap_dump que vous pourrez examiner plus en détail ultérieurement dans Wireshark.


2





Jeter un coup d'œil à Lecteur de chaos. Bien que cela fasse un peu plus que ce que vous demandez et légèrement différemment, vous pourriez probablement en modifier le code pour faire ce que vous voulez.


0





Peut-être que vous pouvez écrire un wrapper pour tcpdump, par exemple, qui supprimera toutes les informations redondantes


-1