Prise de domaine Sniff UNIX

9

Je sais qu'un processus écrit sur un certain socket de domaine Unix ( /var/run/asterisk/asterisk.ctl), mais je ne connais pas le pid de l'expéditeur. Comment savoir qui écrit sur le socket? J'ai essayé avec:

sudo lsof /var/run/asterisk/asterisk.ctl

mais il suffit de répertorier le propriétaire de la prise. Je voudrais savoir qui écrit / lit sur ce socket, et je voudrais également renifler les données. Est-ce possible?

dangonfast
la source

Réponses:

4

Les réponses courtes sont non et pas faciles.

Sous Linux, lsof s'appuie sur /proc/net/unixpour récupérer les informations concernant les sockets de domaine UNIX. Cette interface répertorie tous les sockets liés, mais elle ne garde pas la trace des points de terminaison. Ainsi, vous pouvez voir les sockets existantes, mais vous ne pouvez pas voir ce qui leur est connecté. Quelque part, ces informations sont suivies, elles doivent l'être, sinon les connexions des sockets ne fonctionneraient pas. Je n'ai pas encore trouvé de mécanisme pour récupérer les informations de connexion.

La question du reniflement est un peu plus intéressante, mais non moins décevante. Ce que j'entendais par «pas facilement», c'est qu'il n'y a pas de crochet pour s'introduire et saisir ces données. L'analogue le plus proche utilise tcpdump ou Wireshark, qui utilisent tous deux libpcap pour faire le gros du travail. Alors que le réseau (AF_INET) et le domaine UNIX (AF_UNIX) sont tous deux créés à l'aide de l' socket()appel de fonction, les deux servent connect()à se connecter, à utiliser read()et write()à traiter les données, ils sont gérés par différents sous-systèmes du noyau. Cela a pour effet secondaire malheureux que libpcap n'est pas conçu pour fonctionner avec les sockets de domaine UNIX.

Il y a un côté un peu moins sombre du problème. Jetez un œil à la page de manuel de recv(2). Il s'agit d'un appel système de niveau inférieur qui read()utilise. Il existe un drapeau pour recv()appelé MSG_PEEK. Cela vous permettrait de renifler le trafic passant par un socket de domaine UNIX. Voilà donc le côté positif, le côté sombre est qu'à ma connaissance, il n'existe aucune application actuellement conçue pour le faire. Vous envisagez donc un effort de développement.

J'aimerais vraiment qu'il y ait une belle réponse simple de F'YEAH aux deux parties de votre question.

Scott Pack
la source
11

Oui, vous pouvez le faire. Tout ce dont vous avez besoin est SystemTap.

Considérez l'un des exemples de scripts systemtap qui imprimeront le PID et le nom du processus de tout programme qui lit ou écrit un inode spécifié (et votre socket de domaine Unix est exactement une telle chose).

Vous pouvez modifier trivialement ce script pour imprimer les données réelles lues / écrites; Je laisse le faire comme un exercice au lecteur.

Michael Hampton
la source
4

Je sais que cela ne répond pas à la question principale, mais je me suis retrouvé ici, à la recherche d'une simple communication sur une prise. J'ai décidé de poster pour d'autres comme moi. Voici comment je l'ai fait:

$> sudo socat -t100 -x -v UNIX-LISTEN: /var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT: /var/run/php5-fpm.sock

Vous pouvez supprimer -x et simplement laisser -v pour la communication ascii. J'espère que cela aide quelqu'un.

Anton Valqk
la source
fonctionne parfaitement
JSmyth
-1

socat -t100 UNIX-LISTEN: /tmp/file.sock,mode=777,reuseaddr,fork STDOUT

Il n'y a pas de duplication de sortie, pas de sortie cyclique. Erreur du commentaire précédent ".sock.socat"

srvf
la source
2
Bien que cela puisse être une commande utile, veuillez ajouter quelques explications / clarifications (et en quoi est-ce différent de cette réponse ?)
HBruijn
Je suis désolé. Il n'y a pas de duplication de sortie, pas de sortie cyclique. Erreur de commentaire précédent ".sock.socat"
srvf