Presa del dominio UNIX sniff


9

So che alcuni processi stanno scrivendo su un certo socket di dominio unix ( /var/run/asterisk/asterisk.ctl), ma non conosco il pid del mittente. Come posso sapere chi sta scrivendo sul socket? Ho provato con:

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

ma elenca solo il proprietario del socket. Vorrei sapere chi sta scrivendo / leggendo su questo socket e vorrei anche annusare i dati. È possibile?

Risposte:


4

Le risposte brevi sono no e non facilmente.

Su Linux lsof fa affidamento sul /proc/net/unixrecupero delle informazioni relative ai socket di dominio UNIX. Questa interfaccia elenca tutti i socket associati, ma non tiene traccia degli endpoint. Quindi puoi vedere quali socket esistono, ma non puoi vedere cosa è collegato a loro. Da qualche parte queste informazioni vengono tracciate, devono essere tracciate altrimenti le connessioni socket non funzionerebbero. Devo ancora trovare alcun meccanismo per recuperare le informazioni sulla connessione.

La domanda sull'annusamento è leggermente più interessante, ma non meno deludente. Ciò che intendevo per "non facilmente" è che non esiste alcun hook per intrufolarsi e catturare quei dati. L'analogo più vicino sta usando tcpdump o Wireshark, entrambi usano libpcap per eseguire effettivamente il sollevamento pesante. Mentre la rete (AF_INET) e il dominio UNIX (AF_UNIX) sono entrambi creati utilizzando la socket()chiamata di funzione, entrambi utilizzano connect()per connettersi, utilizzare read()e write()per elaborare i dati, ma sono gestiti da diversi sottosistemi del kernel. Questo ha lo sfortunato effetto collaterale che libpcap non è progettato per funzionare con socket di dominio UNIX.

C'è un lato leggermente meno debole del problema. Dai un'occhiata alla pagina man di recv(2). Questa è una chiamata di sistema di livello inferiore che read()utilizza. Esiste un flag per recv()chiamato MSG_PEEK. Ciò consentirebbe di annusare il traffico che passa attraverso un socket di dominio UNIX. Quindi questo è il lato positivo, il lato oscuro è che, per quanto ne sappia, non esiste alcuna applicazione corrente progettata per farlo. Quindi stai guardando qualche sforzo di sviluppo.

Vorrei davvero che ci fosse una bella e semplice risposta di F'YEAH ad entrambe le parti della tua domanda.



4

So che questo non risponde alla domanda principale, ma sono finito qui, cercando solo di annusare la comunicazione su una presa. Ho deciso di pubblicare post per altri come me. Ecco come l'ho fatto:

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

Puoi rimuovere -x e lasciare -v per la comunicazione ASCII. Spero che aiuti qualcuno.


funziona perfettamente
JSmyth,

-1

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

Non c'è duplicazione dell'output, nessun output ciclico. Errore del commento precedente ".sock.socat"


2
Sebbene possa essere un comando utile, aggiungi qualche spiegazione / chiarimento (e in che modo differisce da questa risposta ?)
HBruijn,

Mi dispiace. Non c'è duplicazione dell'output, nessun output ciclico. Errore del commento precedente ".sock.socat"
srvf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.