Sniff soquete do domínio UNIX

7

Eu sei que algum processo está escrevendo para um determinado soquete de domínio unix ( /var/run/asterisk/asterisk.ctl ), mas não conheço o pid do remetente. Como posso descobrir quem está escrevendo para o soquete? Eu tentei com:

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

mas apenas lista o dono do socket. Gostaria de saber quem está escrevendo / lendo para esse soquete, e também gostaria de farejar os dados. Isso é possível?

    
por dangonfast 27.06.2013 / 02:08

3 respostas

4

As respostas curtas são não e não são fáceis.

No Linux, o lsof depende do /proc/net/unix para recuperar as informações sobre os soquetes do domínio UNIX. Essa interface lista todos os soquetes acoplados, mas não rastreia os nós de extremidade. Então você pode ver quais soquetes existem, mas não consegue ver o que está conectado a eles. Em algum lugar essas informações são rastreadas, elas devem ser rastreadas ou então as conexões dos soquetes não funcionariam. Ainda não encontrei nenhum mecanismo para recuperar as informações de conexão.

A questão do sniffing é um pouco mais interessante, mas não menos decepcionante. O que eu quis dizer com "não facilmente" é que não existe nenhum gancho para infiltrar e gravar esses dados. O analógico mais próximo é usar o tcpdump ou o Wireshark, ambos usam libpcap para fazer o trabalho pesado. Enquanto a rede (AF_INET) e o domínio UNIX (AF_UNIX) são criados usando a chamada da função socket() , ambos usam connect() para se conectarem, ambos usam read() e write() para processar dados, eles são manipulados pelo kernel diferente subsistemas. Isso tem o efeito colateral infeliz que a libpcap não foi projetada para trabalhar com soquetes de domínio UNIX.

Existe um lado um pouco menos sombrio do problema. Dê uma olhada na página do manual para recv(2) . Esta é uma chamada de sistema de nível inferior que o read() faz uso. Existe um sinalizador para recv() chamado MSG_PEEK . Isso permitiria que você cheirasse o tráfego passando por um soquete de domínio UNIX. Então esse é o lado bom, o lado negro é que, pelo que sei, não existe nenhum aplicativo atual projetado para isso. Então você está olhando para algum esforço de desenvolvimento.

Eu realmente gostaria que houvesse uma boa resposta simples de F'YEAH para ambas as partes da sua pergunta.

    
por 27.06.2013 / 03:35
9

Sim, você pode fazer isso. Tudo que você precisa é de systemtap.

Considere um dos scripts do systemtap de exemplo , que imprime o PID e o nome do processo de qualquer programa que leia ou escreva um inode especificado (e o seu soquete de domínio Unix é exatamente isso).

Você pode modificar este script para imprimir os dados reais que estão sendo lidos / gravados; Vou deixar isso como um exercício para o leitor.

    
por 27.06.2013 / 03:49
2

Eu sei que isso não está respondendo a pergunta principal, mas acabei aqui, procurando apenas farejar a comunicação em um soquete. Eu decidi postar para outras pessoas como eu. Aqui está como eu fiz:

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

Você pode remover -x e apenas deixar -v para comunicação ascii. Espero que ajude alguém.

    
por 04.05.2016 / 23:05

Tags