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

79

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 machine 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 sur ma machine et que quelqu'un faisait:

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

Ensuite, la commande magique afficherait simplement:

hello

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

  • 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
  • affiche les données telles quelles, pas en hexadécimal, ni avec des marqueurs de décalage de paquet
  • sniff tout le trafic réseau (que ce soit sur eth0 ou eth1 ou lo , etc ...)

Oui, vous pouvez probablement enchaîner un ensemble canalisé de commandes unix pour le faire, 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 je voudrais.

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

Réponses:

106

Mise à jour:

Comme l'a souligné Michal dans les commentaires: À partir de tcpflow version 1.3, l'option -e est utilisée pour spécifier le nom du scanner. Ainsi, l'erreur "Nom de scanner non valide '8983'" est imprimée. La commande correcte est

sudo tcpflow -i any -C -J port 1234

(a également -Jété remplacé par -gdans la dernière version)


Merci à Yves pour m'avoir signalé " 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 de données à l'octet à l'entrée
  • n'affiche aucune autre métadonnée
  • é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 vider la console à la place d'un fichier. Le " -e" active les couleurs afin que client-> serveur et serveur-> client soient visuellement distincts.

J'ai installé tcpflow simplement en faisant

sudo apt-get install tcpflow
Dustin Boswell
la source
2
Sensationnel. tcpflow est génial, merci! M'a sauvé une tonne de douleur que je ressentais avec WireShark. Wireshark, tcpdump, etc. ont beaucoup trop d’informations et ne font pas ce que demande la question initiale. tcpflow est parfait pour cela.
Russ
10
A partir de tcpflow version 1.3, l’ -eoption est utilisée pour spécifier le nom du scanner. Ainsi, l'erreur "Nom de scanner non valide '8983'" est imprimée. Le bon commandement estsudo tcpflow -i any -C -J port 1234
Michal Kováč
6
Notez que cela -Ja été changé en -gdans la dernière version.
tvon
2
Quelqu'un doit expliquer aux auteurs de l'outil ce que signifie l'expression "compatibilité ascendante"!
Sridhar Sarnobat
Il imprime "des choses" deux fois, pour moi. Pourquoi donc ? lpaste.net/3984129577801744384
user1198559
29

socat est l'outil que vous demandez. Il peut agir en tant que proxy:

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

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

L'option -v permet à socat d'imprimer 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

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

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
yves Baumes
la source
Supposons que je n'ai pas le contrôle sur le client et le serveur (ou que je ne veuille pas l'arrêter), de sorte que je ne peux pas changer le port impliqué ni intercepter le trafic. Alors quoi?
20

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

Kevin Boyd
la source
3
Mon expérience est que l'interface est vraiment nul sur Linux.
Joe Phillips
zut, tu y es avant moi, +1 sur Wirehark
Pouvez-vous donner un exemple de ligne de commande?
Jetez un coup d'oeil à ce lien wiki.wireshark.org/Outils Il donne une liste des outils en ligne de commande pour Wirehark. Attention à Dumpcap.
Kevin Boyd
13

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 les stocke de manière pratique pour l'analyse de protocole ou le débogage. Un programme comme tcpdump (4) affiche un résumé des paquets vus sur le réseau, mais ne stocke généralement pas les données réellement 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 non conformes.

tcpflow stocke toutes les données capturées dans des fichiers portant le nom du formulaire

192.168.101.102.02345-010.011.012.013.45103

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

Configurez une connexion de votre application à votre serveur. Lorsque la connexion est opérationnelle, 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

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 et syntoniser les paquets que vous voulez que tcpflow capture.

Yves Baumes
la source
2

ngrepc'est très bien pour ça. Il faut une chaîne BPF et une chaîne facultative pour rechercher dans les paquets, puis affiche le contenu du paquet à l’écran dans un format très utile. En option, il copie également un fichier pcap_dump que vous pourrez examiner plus en détail ultérieurement dans Wireshark.

Hobbs
la source
0

Jetez un coup d'œil à Chaosreader . 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.

Andrew Y
la source
-1

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

dimba
la source