Sniff soquete de domínio UNIX

9

Eu sei que algum processo está gravando em 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 no soquete? Eu tentei com:

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

mas apenas liste o proprietário do soquete. Gostaria de saber quem está escrevendo / lendo neste soquete e também gostaria de farejar os dados. Isso é possível?

dangonfast
fonte

Respostas:

4

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

No Linux, lsof depende /proc/net/unixpara recuperar as informações sobre soquetes de domínio UNIX. Essa interface lista todos os soquetes ligados, mas não controla os pontos de extremidade. Assim, você pode ver quais soquetes existem, mas não pode ver o que está conectado a eles. Em algum lugar onde essas informações são rastreadas, elas devem ser rastreadas, caso contrário 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 de cheirar é um pouco mais interessante, mas não menos decepcionante. O que eu quis dizer com "não é fácil" é que não existe nenhum gancho para entrar e capturar esses dados. O analógico mais próximo é usar o tcpdump ou o Wireshark, e ambos usam o libpcap para realizar o trabalho pesado. Embora a rede (AF_INET) e o domínio UNIX (AF_UNIX) sejam criados usando a socket()chamada de função, ambos usados connect()para se conectar, usar read()e write()processar dados, eles são manipulados por diferentes subsistemas do kernel. Isso tem o efeito colateral lamentável de que o libpcap não foi projetado para funcionar com soquetes de domínio UNIX.

Há um lado um pouco menos sombrio do problema. Dê uma olhada na página de manual recv(2). Esta é uma chamada de sistema de nível inferior que read()utiliza. Existe um sinalizador para recv()chamado MSG_PEEK. Isso permitiria detectar o tráfego que passava por um soquete de domínio UNIX. Portanto, esse é o lado positivo, o lado obscuro é que, até onde eu sei, não existe nenhum aplicativo atual projetado para fazer isso. Então você está olhando para algum esforço de desenvolvimento.

Eu realmente gostaria que foi uma simples resposta agradável de F'YEAH para ambas as partes da sua pergunta.

Scott Pack
fonte
11

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

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

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

Michael Hampton
fonte
3

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

$> 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.

Anton Valqk
fonte
funciona perfeitamente #
3150 JSmyth
-1

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

Não há duplicação de saída, nenhuma saída cíclica. Erro do comentário anterior ".sock.socat"

srvf
fonte
2
Embora isso possa ser um comando útil, por favor, adicione um pouco de explicação / clarificação (e como é que diferente de esta resposta ?)
HBruijn
Eu sinto Muito. Não há duplicação de saída, nenhuma saída cíclica. Erro do comentário anterior ".sock.socat"
srvf 21/02/19