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


Je voudrais examiner le trafic réseau traité par un seul processus, mais les simples captures de réseau ne fonctionneront pas, car je suis confronté à un système très chargé (beaucoup d’autres flux se produisent simultanément). Y a-t-il un moyen d'isoler un tcpdump ou wireshark capturer dans le trafic réseau d'un seul processus spécifique? (En utilisant netstat Est insuffisant.)


78
2017-11-06 06:56


origine




Réponses:


En effet, il existe un moyen, en utilisant le Wireshark filtres 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 devez d'abord comprendre les protocoles et les ports utilisés par votre processus (la netstat commande dans le commentaire précédent fonctionne bien).

Ensuite, utilisez 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.


16
2017-11-06 09:53



Pour une simple connexion, cela est possible, mais je dois suivre DNS, HTTP, etc., qui passent tous rapidement, il n'y a donc pas de moyen simple d'utiliser simplement netstat et des filtres de capture réseau simples sur un ordinateur occupé. - Kees Cook
Ok, les ports publics HTTP et DNS sont utilisés par de nombreuses applications, mais le port privé correspondant est unique. Alors, pourquoi ne pas essayer de filtrer par le port privé? - OpenNingia
Parce que les petites demandes rapides ne seront pas vues par netstat; Je ne pourrai attraper que des connexions de longue durée. :( - Kees Cook
Et si le processus utilise des ports dynamiques au moment de l'exécution, vous ne pourrez pas utiliser les filtres de port statiques - user5883
Je pense que vous avez ici la meilleure réponse ... Malheureusement, un outil de détection de réseau fonctionne au niveau le plus bas de la pile réseau, essayant de tout attraper, il ignore complètement les processus exécutés sur le système d'exploitation. Il serait extrêmement difficile de déterminer l'origine d'un certain appel. Un renifleur de paquets peut éventuellement déterminer (via le numéro de port) un identifiant de processus mais ne peut pas déterminer quel processus a effectué une recherche DNS car celle-ci est complètement indépendante (c'est probablement la pile réseau qui a déclenché l'appel). Mais avec le filtrage et l’arrêt des autres processus, vous devriez pouvoir atteindre votre objectif. - Huygens


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 pour attacher à

106
2017-11-10 11:04



Ceci est utile car il peut être utilisé sans accès root ou avec des autorisations spéciales (sur certaines distributions Linux, de toute façon - sur Ubuntu, vous aurez peut-être besoin de permissions spéciales). - Robin Green
Cela est également utile, car il peut être exécuté sur un processus déjà lancé et est disponible sur pratiquement toutes les boîtes Linux. - zakmck


Je sais que ce sujet est un peu vieux 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 aussi wireshark (ou d'autres outils réseau standard) dans ledit espace de noms.

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

Pour ce faire:

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

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

    ip link add veth-a type veth peer name veth-b
    
  • changer l'espace de nommage actif de l'interface veth-a:

    ip link set veth-a netns test
    
  • configurer 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
    
  • configurer 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 provenant de 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.


48
2017-07-19 11:39



Excellente idée, mais méfiez-vous des "limitations". Comme il s'agit d'un espace de noms distinct, vous ne pouvez pas communiquer avec les processus locaux dans l'espace de noms par défaut à l'aide des adresses de bouclage ou des sockets de domaine UNIX. Ce dernier affecte la communication sur D-Bus. - Lekensteyn
@Lekensteyn vous pouvez toujours utiliser les sockets de domaine unix à travers les espaces de noms réseau. Le système de fichiers n'est pas isolé par eux. - randunel
@randunel J'aurais dû être plus précis à ce sujet. Ce que je voulais dire, c’est que les sockets de domaine Unix dans le «abstract socket namespace» (qui n’utilise pas le système de fichiers) ne sont pas directement accessibles entre les espaces de noms du réseau. Pour contourner ce problème, vous pouvez utiliser un proxy tel que socat. - Lekensteyn
Quelle adresse IP utilisez-vous avec le --to-source argument à iptables? Est-ce l'adresse IP de l'interface que vous passez à la -o option, une adresse IP que vous inventez, ou ??? J'ai essayé la version masquerade qui ne nécessite pas --to-source, comme décrit iciet ça a marché! - ntc2
Tout cela semble nécessiter un accès root. - simplegamer


netstat -taucp | grep <pid or process name>

Cela montrera les connexions effectuées par une application, y compris le port utilisé.


13
2017-11-06 09:15



Cela montrerait les connexions qui existent pour cet instant, mais il ne fournira pas un journal du trafic lui-même. - Kees Cook
Pas sûr du commentaire de Kees Cook. Un simple netstat affiche des informations sur les connexions pendant un instant, mais avec l'option -c, vous obtenez un instantané de cet état toutes les secondes (voir 'man netstat'). Peut-être qu'il n'a pas tout le trafic, mais n'est pas un instantané unique des connexions. - tremendows
Eh bien, j'en suis sûr. Cette volonté ne pas capturer tout le trafic réseau d'un processus. - Reinier Post


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.


9
2018-04-06 14:49





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:

http://freshmeat.net/projects/fixsrcip

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

http://freshmeat.net/projects/force_bind

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


9
2017-11-10 12:33



La plupart des applications ne prennent pas en charge la spécification de leur adresse IP source, mais cela pourrait être possible en utilisant un conteneur avec CLONE_NEWNET mais pas CLONE_NEWNS. - Kees Cook
Vous pouvez également créer un espace de noms de réseau et y exécuter votre application www.evolware.org/?p=293 - Flint


Ceci est un piratage sale, mais je suggérerais une destination ou un journal cible 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 cible de journal . 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?


5
2017-12-12 09:50



mais cela ne fonctionne que pour sortant, qu'en est-il de la question? - resultsway


Vous pouvez essayer le traçage - http://mutrics.iitis.pl/tracedump

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


4
2018-04-01 12:51



Joli projet, mais ... "Tracedump ne fonctionne actuellement que sur des hôtes Linux 32 bits" le tue malheureusement pour moi. - gertvdijk