A auditoria do Linux pode ajudar. Pelo menos, localizará usuários e processos que fazem conexões de rede de datagrama. Pacotes UDP são datagramas.
Primeiro, instale a auditd
estrutura em sua plataforma e garanta que auditctl -l
retorne algo, mesmo que diga que nenhuma regra foi definida.
Em seguida, adicione uma regra para assistir à chamada do sistema socket()
e marque-a para facilitar a localização mais tarde ( -k
). Eu preciso assumir que você está em uma arquitetura de 64 bits, mas você pode substituir b32
no lugar do b64
se você não é.
auditctl -a exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
Você precisa escolher entre as páginas de manual e os arquivos de cabeçalho para criar isso, mas o que ele captura é essencialmente essa chamada de sistema:, socket(PF_INET, SOCK_DGRAM|X, Y)
onde o terceiro parâmetro não é especificado, mas frequentemente zero. PF_INET
é 2 e SOCK_DGRAM
é 2. As conexões TCP usariam o SOCK_STREAM
que definiria a1=1
. ( SOCK_DGRAM
no segundo parâmetro pode ser ORed com SOCK_NONBLOCK
ou SOCK_CLOEXEC
, portanto, a &=
comparação.) Essa -k SOCKET
é a nossa palavra-chave que queremos usar ao pesquisar trilhas de auditoria posteriormente. Pode ser qualquer coisa, mas eu gosto de simplificar.
Deixe alguns momentos para revisar as trilhas de auditoria. Opcionalmente, você pode forçar alguns pacotes executando o ping de um host na rede, o que causará uma pesquisa de DNS, que usa o UDP, que deve disparar nosso alerta de auditoria.
ausearch -i -ts today -k SOCKET
E uma saída semelhante à seção abaixo será exibida. Estou abreviando para destacar as partes importantes
type=SYSCALL ... arch=x86_64 syscall=socket success=yes exit=1 a0=2 a1=2 ... pid=14510 ... auid=zlagtime uid=zlagtime ... euid=zlagtime ... comm=ping exe=/usr/bin/ping key=SOCKET
Na saída acima, podemos ver que o ping
comando fez com que o soquete fosse aberto. Eu poderia então executar strace -p 14510
o processo, se ainda estivesse em execução. O ppid
(ID do processo pai) também é listado, caso seja um script que gera muito o filho problemático.
Agora, se você tiver muito tráfego UDP, isso não será bom o suficiente e você precisará recorrer ao OProfile ou SystemTap , ambos atualmente além dos meus conhecimentos.
Isso deve ajudar a restringir as coisas no caso geral.
Quando terminar, remova a regra de auditoria usando a mesma linha usada para criá-la, substitua apenas -a
por -d
.
auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
Você pode usar o netstat, mas precisa dos sinalizadores corretos e só funcionará se o processo que está enviando os dados ainda estiver ativo. Ele não encontra os vestígios de algo que surgiu brevemente, enviou tráfego UDP e desapareceu. Também requer privilégios de root local. Dito isto:
Aqui estou eu iniciando um ncat no meu host local, enviando tráfego UDP para a porta 2345 em uma máquina (inexistente) 10.11.12.13:
Aqui estão algumas saídas do tcpdump que provam que o tráfego está indo:
Aqui está a parte útil , usando netstat com o sinalizador -a (para ver detalhes da porta) e o sinalizador -p para ver os detalhes do ID do processo. É o sinalizador -p que requer privilégios de root:
Como você pode ver, o pid 9152 é apontado como tendo uma conexão aberta na porta 2345 no host remoto especificado. O Netstat também ajuda isso no ps e me diz o nome do processo
ncat
.Espero que seja de alguma utilidade.
fonte
grep -w 57550
porque vários processos poderiam estar fazendo pesquisas de DNS no mesmo servidor. Seu método não os distinguiria.Eu tinha exatamente o mesmo problema e, infelizmente
auditd
, não fez muito por mim.Eu tive tráfego de alguns dos meus servidores indo para endereços DNS do Google
8.8.8.8
e8.8.4.4
. Agora, meu administrador de rede tem TOC moderado e ele queria limpar todo o tráfego desnecessário, pois temos nossos caches DNS internos. Ele queria desativar a porta de saída 53 para todos, exceto para os servidores de cache.Então, depois de fracassar
auditctl
, eu apressosystemtap
. Eu venho com o seguinte script:Em seguida, basta executar:
Esta é a saída que eu tenho:
É isso aí! Depois de alterar
resolv.conf
esses PIDs, não recebemos as alterações.Espero que isto ajude :)
fonte
Aqui está uma opção systemtap, usando as sondas netfilter disponíveis no stap verson 1.8 e posterior. Veja também
man probe::netfilter.ip.local_out
.fonte
Eu usaria um sniffer de rede como tcpdump ou wireshark para visualizar as solicitações de DNS. O conteúdo da consulta pode dar uma idéia do programa que está sendo emitido.
fonte
Esteja ciente de que, ao usar o autitctl, o nscd, por exemplo, usa um parâmetro ligeiramente diferente na chamada do sistema de soquete, ao fazer uma consulta DNS:
Portanto, para ter certeza de capturar essas consultas, além das mencionadas acima, você pode adicionar um filtro adicional, com o mesmo nome, se desejar:
Aqui 2050 é um OR bit a bit de SOCK_DGRAM (2) e SOCK_NONBLOCK (2048).
Em seguida, a pesquisa encontrará os dois filtros com a mesma chave
SOCKET
:Os valores hexadecimais das constantes de soquete que encontrei aqui: https://golang.org/pkg/syscall/#pkg-constants
Como não tenho pontos de reputação para comentar, adicionei isso.
fonte