La auditoría de Linux puede ayudar. Al menos localizará a los usuarios y procesos que realizan conexiones de red de datagramas. Los paquetes UDP son datagramas.
Primero, instale el auditd
marco en su plataforma y asegúrese de que auditctl -l
devuelva algo, incluso si dice que no hay reglas definidas.
Luego, agregue una regla para ver la llamada del sistema socket()
y etiquétela para encontrarla más tarde ( -k
). Necesito suponer que está en una arquitectura de 64 bits, pero puede sustituirla b32
en lugar de la b64
que no está.
auditctl -a exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
Tiene que elegir entre las páginas man y los archivos de encabezado para construir esto, pero lo que captura es esencialmente esta llamada al sistema: socket(PF_INET, SOCK_DGRAM|X, Y)
donde el tercer parámetro no está especificado pero con frecuencia es cero. PF_INET
es 2 y SOCK_DGRAM
es 2. Se usarían conexiones TCP SOCK_STREAM
que establecerían a1=1
. ( SOCK_DGRAM
en el segundo parámetro se puede ORar con SOCK_NONBLOCK
o SOCK_CLOEXEC
, de ahí la &=
comparación). Esta -k SOCKET
es nuestra palabra clave que queremos usar al buscar pistas de auditoría más adelante. Puede ser cualquier cosa, pero me gusta que sea simple.
Deje pasar unos momentos y revise las pistas de auditoría. Opcionalmente, puede forzar un par de paquetes haciendo ping a un host en la red, lo que provocará una búsqueda de DNS, que utiliza UDP, que debería disparar nuestra alerta de auditoría.
ausearch -i -ts today -k SOCKET
Y aparecerá una salida similar a la siguiente sección. Lo estoy abreviando para resaltar las 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
En el resultado anterior, podemos ver que el ping
comando provocó que se abriera el socket. Entonces podría ejecutar strace -p 14510
el proceso, si todavía se estaba ejecutando. El ppid
(ID de proceso principal) también aparece en caso de que sea un script que genera mucho el problema secundario.
Ahora, si tiene mucho tráfico UDP, esto no será lo suficientemente bueno y tendrá que recurrir a OProfile o SystemTap , que actualmente están más allá de mi experiencia.
Esto debería ayudar a reducir las cosas en el caso general.
Cuando haya terminado, elimine la regla de auditoría utilizando la misma línea que usó para crearla, solo sustitúyala -a
por -d
.
auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
Puede usar netstat, pero necesita los indicadores correctos, y solo funciona si el proceso que envía los datos aún está activo. No encontrará los rastros de algo que cobró vida brevemente, envió tráfico UDP y luego desapareció. También requiere privilegios de raíz local. Eso dijo:
Aquí estoy comenzando un ncat en mi host local, enviando tráfico UDP al puerto 2345 en una máquina (inexistente) 10.11.12.13:
Aquí hay algunos resultados de tcpdump que prueban que el tráfico va:
Aquí está el bit útil , usando netstat con el indicador -a (para ver los detalles del puerto) y el indicador -p para ver los detalles del ID del proceso. Es la bandera -p que requiere privilegios de root:
Como puede ver, el pid 9152 tiene una conexión abierta al puerto 2345 en el host remoto especificado. Netstat también lo ejecuta útilmente a través de ps y me dice que el nombre del proceso es
ncat
.Esperemos que sea de alguna utilidad.
fuente
grep -w 57550
porque múltiples procesos podrían estar haciendo búsquedas DNS en el mismo servidor. Su método no los distinguiría.Tuve exactamente el mismo problema y desafortunadamente
auditd
no hizo mucho por mí.Tenía tráfico de algunos de mis servidores que se dirigía a las direcciones DNS de Google,
8.8.8.8
y8.8.4.4
. Ahora, mi administrador de red tiene un TOC leve y quería limpiar todo el tráfico innecesario ya que tenemos nuestros cachés DNS internos. Quería deshabilitar el puerto de salida 53 para todos excepto los servidores de caché.Entonces, después de fallar con
auditctl
, cavo ensystemtap
. Se me ocurre el siguiente script:Luego simplemente ejecuta:
Este es el resultado que obtuve:
¡Eso es! Después de cambiar
resolv.conf
esos PID no recogí los cambios.Espero que esto ayude :)
fuente
Aquí hay una opción de systemtap, usando las sondas netfilter disponibles en stap verson 1.8 y posteriores. Ver también
man probe::netfilter.ip.local_out
.fuente
Usaría un sniffer de red como tcpdump o wireshark para ver las solicitudes de DNS. El contenido de la consulta puede dar una idea de qué programa los emite.
fuente
Tenga en cuenta que cuando se usa autitctl, nscd, por ejemplo, usa un parámetro ligeramente diferente en la llamada del sistema de socket, al hacer una consulta DNS:
Por lo tanto, para asegurarse de capturar esas consultas además de las que se mencionaron anteriormente, puede agregar un filtro adicional, con el mismo nombre si lo desea:
Aquí 2050 es un OR bit a bit de SOCK_DGRAM (2) y SOCK_NONBLOCK (2048).
Luego, la búsqueda encontrará ambos filtros con la misma clave
SOCKET
:Los valores hexadecimales para las constantes de socket que encontré aquí: https://golang.org/pkg/syscall/#pkg-constants
Como no tengo puntos de reputación que comentar, agregué esto.
fuente