Comment puis-je capturer le trafic réseau d'un seul processus?

77

J'aimerais examiner le trafic réseau géré par un seul processus, mais les simples captures réseau ne fonctionneront pas, car je suis confronté à un système aussi chargé (beaucoup d’autres flux se produisent simultanément). Existe-t-il un moyen d'isoler une capture tcpdump ou wireshark dans le trafic réseau d'un processus spécifique? (L'utilisation de netstat est insuffisante.)

    
posée Kees Cook 06.11.2010 - 07:56
la source

14 réponses

16

En effet, il existe un moyen d’utiliser les filtres Wireshark . Mais vous ne pouvez pas filtrer directement par nom de processus ou par PID (car ce ne sont pas des quantités réseau).

Vous devriez d'abord comprendre les protocoles et les ports utilisés par votre processus (La commande netstat du commentaire précédent fonctionne bien).

Utilisez ensuite Wireshark pour filtrer le port entrant (ou sortant) avec celui que vous venez de récupérer. Cela devrait isoler le trafic entrant et sortant de votre processus.

    
réponse donnée OpenNingia 06.11.2010 - 10:53
la source
104

Pour démarrer et surveiller un nouveau processus:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Pour surveiller un processus existant avec un PID connu:

strace -p $PID -f -e trace=network -s 10000
  • -f est pour "suivre les nouveaux processus"
  • -e définit un filtre
  • -s définit la limite de chaînes à plus de 32
  • -p prend l'identifiant du processus à attacher à
réponse donnée Clausi 10.11.2010 - 12:04
la source
47

Je sais que ce sujet est un peu ancien mais je pense que cela pourrait aider certains d’entre vous:

Si votre noyau le permet, il est très facile de capturer le trafic réseau d’un seul processus en exécutant ledit processus dans un espace de noms de réseau isolé et en utilisant également wireshark (ou d’autres outils réseau standard). p>

La configuration peut sembler un peu complexe, mais une fois que vous l'aurez compris et que vous vous y familiariserez, cela facilitera grandement votre travail.

Pour ce faire:

  • créer un espace de noms de réseau de test:

    ip netns add test
    
  • créez une paire d’interfaces réseau virtuelles (veth-a et veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • change l’espace de noms actif de l’interface veth-a:

    ip link set veth-a netns test
    
  • configurez les adresses IP des interfaces virtuelles:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • configurez le routage dans l'espace de noms de test:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • activer ip_forward et établir une règle NAT pour transférer le trafic entrant depuis l’espace de noms que vous avez créé (vous devez ajuster l’interface réseau et l’adresse IP SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
    

    (Vous pouvez également utiliser la règle MASQUERADE si vous préférez)

  • enfin, vous pouvez exécuter le processus que vous souhaitez analyser dans le nouvel espace de noms, ainsi que wireshark:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Vous devrez surveiller l’interface veth-a.

réponse donnée felahdab 19.07.2014 - 13:39
la source
13
netstat -taucp | grep <pid or process name>

Cela montrera les connexions d’une application, y compris le port utilisé.

    
réponse donnée Oli 06.11.2010 - 10:15
la source
9

Je suis arrivé à un problème similaire et j'ai été en mesure de le régler en fonction de cette réponse par ioerror , en utilisant NFLOG comme décrit ici :

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap

Ensuite, vous pouvez créer le processus en question à partir d’un compte utilisateur qui ne fait rien d’autre - et voilà, vous venez d’isoler et de capturer le trafic d’un seul processus.

Je voulais juste publier dans le cas où cela aiderait quelqu'un.

    
réponse donnée szymon 06.04.2014 - 16:49
la source
9

Juste une idée: est-il possible de lier votre application à une adresse IP différente? Si oui, vous pouvez utiliser les suspects habituels ( tcpdump , etc.)

Outils pour les applications qui ne sont pas capables de se lier à une autre adresse IP:

lien

  

fixsrcip est un outil permettant de lier les sockets client TCP et UDP sortants ( IPv4 ) à des adresses IP source spécifiques sur hôtes multi-hébergés

lien

  

force_bind vous permet de forcer la liaison sur une adresse IP et / ou un port spécifique. Il fonctionne avec IPv4 et IPv6 .

    
réponse donnée Clausi 10.11.2010 - 13:33
la source
5

Ceci est un piratage sale, mais je suggérerais une destination ou un journal avec iptables pour un UID donné. par exemple:

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 

Cela pourrait aussi être intéressant de regarder quelque chose comme '--log-tcp-sequence', '--log-tcp-options', '--log-ip-options', '--log-uid' pour cette log cible. Bien que je soupçonne que cela vous aidera seulement à traiter un pcap qui inclut une tonne d’autres données.

La cible NFLOG peut être utile si vous souhaitez marquer des paquets et que certains paquets marqués seront envoyés via un socket netlink à un processus de votre choix. Je me demande si cela serait utile pour pirater quelque chose avec wireshark et votre application spécifique s'exécutant en tant qu'utilisateur spécifique?

    
réponse donnée ioerror 12.12.2010 - 10:50
la source
4

Vous pouvez essayer le traçage - lien

Il fait exactement ce que vous voulez, vous pouvez lui donner un identifiant de processus ou un programme à exécuter.

    
réponse donnée pjf 01.04.2014 - 14:51
la source
4

Essayez d'exécuter le processus qui vous intéresse sous strace :

strace ping www.askubuntu.com

Il vous donnera des informations très détaillées sur ce que fait votre processus. Comme un processus peut ouvrir n'importe quel port, vous pouvez manquer quelque chose en utilisant un filtre prédéfini.

Une autre approche consisterait à utiliser une machine virtuelle dépouillée ou une machine de test sur votre réseau et à y placer votre processus de manière isolée. Ensuite, vous pouvez simplement utiliser Wireshark pour tout récupérer depuis cette machine. Vous serez presque sûr que le trafic que vous capturerez sera pertinent.

    
réponse donnée user5883 10.11.2010 - 10:54
la source
3

En s'appuyant sur la réponse par ioerror Je pense que vous pouvez utiliser iptables --uid-owner pour définir un marqueur sur le trafic, puis vous pouvez demander à wireshark de capturer uniquement le trafic avec ce marqueur. Vous pourrez peut-être utiliser un DSCP (marqueur de services différentiels), un identifiant de flux ou un marqueur qos.

Ou bien vous pouvez utiliser ceci pour envoyer ces paquets à une interface différente, puis capturer uniquement sur cette interface.

    
réponse donnée poolie 12.12.2010 - 11:23
la source
2

le bogue Nailshark 1184 est cette fonctionnalité. Il n'est pas encore implémenté.
Copié à partir de l’utilisateur cmanynard at ask.wireshark.org

    
réponse donnée JamesThomasMoon1979 15.01.2015 - 05:35
la source
2

J'ai écrit une application C qui fait ce qui est décrit dans la réponse géniale ci-dessus par felahdab!

Voir ici: reps gnubat nsntrace

    
réponse donnée Jonas Danielsson 15.07.2016 - 13:24
la source
0

peut-être que iptables et ulog peuvent fonctionner? Non pas que je possède une recette exacte, mais je pense que iptables peut correspondre à des processus, une fois appariés, vous pouvez utiliser ulog.

    
réponse donnée chesty 06.11.2010 - 09:30
la source
-1

Je pense que vous pouvez créer un script shell pour parcourir en boucle l'exécution de netstat et la consigner dans un fichier texte. Quelque chose comme (étapes très rudes):

echo "press q to quit"
while [ <q is not pressed>]
do
    'netstat -taucp | grep <pid or process name> 1>>logfile.txt'
done

Je ne suis pas un programmeur, donc je ne peux pas l'affiner. Mais quelqu'un peut commencer là où je me suis arrêté et créer un script de travail pour vous.

    
réponse donnée tinhed 10.11.2010 - 07:59
la source

Lire d'autres questions sur les étiquettes