Surveillance du trafic HTTP à l'aide de tcpdump

42

J'utilise actuellement le trafic HTTP pour surveiller le trafic HTTP entre un serveur et un serveur Web tcpdump. Cela fonctionne bien, mais j'aimerais supprimer certaines données superflues dans la sortie (je connais environ tcpflowet wireshark, mais elles ne sont pas facilement disponibles dans mon environnement).

De la tcpdumppage de manuel:

Pour imprimer tous les paquets HTTP IPv4 depuis et vers le port 80, c’est-à-dire n’imprimer que les paquets contenant des données, mais pas, par exemple, les paquets SYN et FIN et les paquets ACK uniquement.

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Cette commande

sudo tcpdump -A src example.com et le port tcp 80 et (((ip [2: 2] - ((ip [0] & 0xf) << 2)) - - ((tcp [12] & 0xf0) >> 2) )! = 0) '

fournit la sortie suivante:

19: 44: 03.529413 IP 192.0.32.10.http> 10.0.1.6.52369: drapeaux [P.], seq 918827135: 918827862, ack 351213824, gagner 4316, options [nop, nop, TS val 4093273405 ecr. 869959372], longueur 727

E ..... @ ....... .... P..6.0 ......... D ...... __ .. e = 3 ...__ HTTP / 1.1 200 OK Serveur: Apache / 2.2.3 (Red Hat) Content-Type: text / html; charset = UTF-8 Date: samedi 14 novembre 2009 18:35:22 GMT Age: 7149
Longueur du contenu: 438

<HTML> <HEAD> <TITLE> Exemple de page Web </ TITLE> </ HEAD> <body>
<p> Vous avez atteint cette page Web ... </ p> </ BODY> </ HTML>

C'est presque parfait, sauf pour la partie en surbrillance. Qu'est-ce que c'est, fin - plus important encore - comment puis-je m'en débarrasser? Peut-être que c'est juste un petit ajustement de l'expression à la fin de la commande?

otto.poellath
la source

Réponses:

39

tcpdump imprime des paquets complets. Les "ordures" que vous voyez sont en réalité des en-têtes de paquets TCP.

vous pouvez certainement masser la sortie avec, par exemple, un script Perl, mais pourquoi ne pas utiliser tshark, la version textuelle de wireshark à la place?

tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

il prend les mêmes arguments que tcpdump (même bibliothèque), mais puisqu'il s'agit d'un analyseur, il peut effectuer une inspection en profondeur des paquets afin que vous puissiez affiner davantage vos filtres, c'est-à-dire

tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -R'http.request.method == "GET" || http.request.method == "HEAD"'

Aleksandar Ivanisevic
la source
1
Merci - après avoir essayé toutes les suggestions, tshark semble être le meilleur outil pour ce travail. J'utilise actuellement "tshark -d tcp.port == 8070, http -R 'http.request ou http.response'". Maintenant, si seulement je pouvais faire en sorte que tshark "suive le flux TCP" comme le ferait Wirehark (on me pose souvent beaucoup de questions, mais je n'ai toujours pas trouvé la réponse). "-V" affiche des informations sur les paquets TCP et IP, etc., ce qui ne m'intéresse pas. Mais je suppose que je peux supprimer cela à l'aide d'un script.
otto.poellath
4
Vous pouvez également rechercher « GET » dans un filtre de capture en faisant correspondre les valeurs ASCII pour chaque caractère: tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420. Il y a quelque temps, j'ai ajouté une page au site Web Wireshark qui vous permettait de créer des filtres de capture correspondant à la chaîne: wireshark.org/tools/string-cf.html
Gerald Combs le
18

jetez un oeil à ngrep - il peut vous être utile.

comme référence pour les autres httpry [le serveur semble être en panne maintenant, mais j'espère que c'est temporaire] et tshark sont également utiles pour l'analyse de protocole passive - une première pour http, ensuite - pour beaucoup plus.

pQd
la source
2
+1 pour ngrep. Outil très utile.
tylerl
ngrep et httpry semblent vraiment utiles, mais ngrep n'est pas au courant de HTTP et AFAIK, httpry ne fonctionne qu'avec des en-têtes HTTP et ne peut pas afficher les données utiles.
otto.poellath
@sapporo - sure - ngrep est agnostique selon les protocoles, mais vous pouvez ajouter le filtre pcap "port 80" et obtenir .. dans la plupart des cas, le trafic http uniquement.
pQd
Merci, ngrep est 100000x mieux que tcpdump
Daniel W.
5

Essayez httpry ou justniffer

Justniffer fonctionne bien sur les paquets TCP réorganisant les retrasmissions et la fragmentation IP

Mole24
la source
1
Merci! justniffer est ce que je cherchais (je pense que c'est le seul outil mentionné qui est très simple et qui mesure la durée de la demande).
Gkop
1

Je suggérerais d'utiliser une ligne de commande tcpdump insensée qui stocke tout dans un fichier pcap pour le post-traitement. Selon ce que vous envisagez de diagnostiquer avec précision, tcpflow est très utile pour réorganiser les communications de manière cohérente aux fins d'analyse.

Vous trouverez d'autres informations utiles, notamment certaines utilisations de httpry, à l' adresse suivante : http://taosecurity.blogspot.com/2008/06/logging-web-traffic-with-httpry.html

ScottZ
la source
0

Le serveur Web que vous utilisez ne produit-il pas de journaux? Ce serait certainement un meilleur moyen de surveiller le trafic HTTP. Il existe une pléthore d’outils pour analyser les données et tout serveur Web compétent devrait produire des journaux fiables.

JamesHannah
la source
4
Clairement. J'imagine qu'il y avait déjà pensé, cependant. Il est parfois utile de surveiller les données réellement envoyées entre les points A et B.
tylerl
0

Il existe sur le marché plusieurs outils spécialement conçus pour surveiller le trafic HTTP. Fiddler2 ( http://www.fiddler2.org ) et HTTP Debugger Pro sont des exemples de tels outils.


la source
4
Merci pour vos suggestions. Malheureusement, les deux outils ne semblent fonctionner que sous Windows. Je n'en avais pas parlé, mais je recherche quelque chose qui fonctionne sous Linux.
otto.poellath le