Monitorizar resoluciones de nombres DNS fácilmente con PassiveDNS
PassiveDNS es una pequeña herramienta de tipo sniffer encargada de recopilar registros DNS de una manera pasiva, permitiendo conocer qué IPs realizan qué solicitudes DNS. Muy útil a la hora de conocer qué IPs están infectadas con determinado malware o simplemente detectar resoluciones de DNS sospechosas y su frecuencia. Combinarlo con aplicaciones tipo Nagios o Icinga puede ser algo muy practico también.
PassiveDNS utiliza libpcap y por lo tanto BPF para filtrar únicamente el tráfico DNS, por lo que no tiene impacto en el rendimiento del equipo.
PassiveDNS puede usarse también directamente sobre archivos pcap y como demonio. Tiene varias opciones que nos permiten filtrar la captura y controlar como queremos el reporte de solicitudes DNS. Por defecto no incluye duplicados si no han pasado 24 horas. Si por el contrario se quiere conocer la frecuencia de resoluciones, se puede configurar que simplemente espere un segundo para introducir duplicados, lógicamente esta manera de monitorizar las resoluciones incremental el tamaño del fichero de logs.
Se debe recordar que al utilizar contenedores (Docker, LXCE, etc), este tipo de aplicaciones pueden no funcionar o hacerlo solo parcialmente. Dependerá de la tecnología en uso y su configuración.
Proyecto: https://github.com/gamelinux/passivedns
Dependencias para compilar passivedns: libpcap-dev, openssl-dev y ldns-devel.
Compilación de PassiveDNS.
git clone git://github.com/gamelinux/passivedns.git cd passivedns/ autoreconf --install ./configure make ./src/passivedns
Sintaxis de PassiveDNS.
USAGE: $ passivedns [options] OPTIONS: -i <iface> Network device <iface> (default: eth0). -r <file> Read pcap <file>. -H <hostname> Choose hostname to print in record. -l <file> Logfile normal queries (default: /var/log/passivedns.log). -L <file> Logfile for SRC Error queries (default: /var/log/passivedns.log). -y Log to syslog (uses local7 syslog facility). -Y Log NXDOMAIN to syslog. -d <delimiter> Delimiter between fields in log file (default: ||). -f <fields> Choose which fields to print (default: -f SMcsCQTAtn). -s <file> Print stats on signal (SIGUSR1) to this file. -b 'BPF' Berkley Packet Filter (default: 'port 53'). -p <file> Name of pid file (default: /var/run/passivedns.pid). -S <mem> Soft memory limit in MB (default: 256). -C <sec> Seconds to cache DNS objects in memory (default: 43200). -P <sec> Seconds between printing duplicate DNS info (default 86400). -X <flags> Manually set DNS RR Types to care about (default: -X 46CDNPRS). -N Set interface to non promisc. mode. -u <uid> User ID to drop privileges to. -g <gid> Group ID to drop privileges to. -T <dir> Directory to chroot into. -D Run as daemon. -V Show version and exit. -h This help message. FIELDS: H: YMD-HMS Stamp S: Timestamp(s) M: Timestamp(ms) c: Client IP s: Server IP C: Class Q: Query T: Type A: Answer t: TTL p: Protocol n: Count h: hostname L: QueryLength l: AnswerLength FLAGS: * For Record Types: 4:A 6:AAAA C:CNAME D:DNAME N:NAPTR O:SOA L:LOC F:SPF I:HINFO P:PTR R:RP S:SRV T:TXT M:MX n:NS d:DNSEC H:SSHFP L also enables GPOS d enables DS, DNSKEY, NSEC, NSEC3, NSEC3PARAM, RRSIG * For Server Return Code (SRC) Errors: f:FORMERR s:SERVFAIL x:NXDOMAIN o:NOTIMPL r:REFUSED y:YXDOMAIN e:YXRRSET t:NXRRSET a:NOTAUTH z:NOTZONE
Ejemplo de uso de PassiveDNS en localhost.
./passivedns -D -u 1000 -g 1000 -N -L /var/log/reporte_DNS.log -l /var/log/reporte_DNS.log -f HcsQTAtn -X 46CDNPRSTMn -d
- Correr passiveDNS como usuario no privilegiado, en este caso el usuario von ID y GID 1000.
- No poner la tarjeta en modo promiscuo.
- Registrar resoluciones DNS en el archivo /var/log/reporte_DNS.log.
- PassiveDNS es arrancado en modo demonio.
Ejemplo de salida de PassiveDNS.
2018-04-07 21:21:31.231134||192.168.178.50||8.8.8.8||www.paypalobjects.com.edgekey.net.||CNAME||e3691.g.akamaiedge.net.||66||1 2018-04-07 21:21:31.231134||192.168.178.59||8.8.8.8||e3691.g.akamaiedge.net.||A||2.17.189.81||19||1 2018-04-07 21:22:04.512364||192.168.178.50||8.8.4.4||gplv3.fsf.org.||A||208.118.235.156||299||1 2018-04-07 21:22:13.815922||192.168.178.50||8.8.8.8||sdf-eu.org.||A||178.63.35.194||21599||1 2018-04-07 21:22:15.131702||192.168.178.54||8.8.4.4||tn.symcd.com.||CNAME||ocsp-ds.ws.symantec.com.edgekey.net.||2696||1 2018-04-07 21:22:15.131702||192.168.178.10||8.8.8.8||ocsp-ds.ws.symantec.com.edgekey.net.||CNAME||e8218.dscb1.akamaiedge.net.||6|| 1
NOTA: Se debe configurar la interfaz de loopback (-i lo) si se usa un software del tipo DNSCrypt para la resolución de DNS. Es posible ejecutar múltiples comandos passivedns sobre el mismo fichero de logs indicando en cada instancia una interfaz diferente.
Si se quisiera obtener duplicados, es decir, registrar todas las resoluciones de nombres, se puede configurar PassiveDNS para que escriba duplicados pasados un segundo. Este sería el comando anterior pero con la opción “-P 1”.
./passivedns -D -u 1000 -g 1000 -N -L /var/log/reporte_DNS.log -l /var/log/reporte_DNS.log -f HcsQTAtn -X 46CDNPRSTMn -d -P 1
Si se quiere una salida en columnas se puede echar mano del comando column.
tail /var/log/reporte_DNS.log | column -t -s '||' 2018-04-07 21:28:37.030611 192.168.178.50 8.8.8.8 fonts.googleapis.com. CNAME googleadapis.l.google.com. 3361 1 2018-04-07 21:28:37.030611 192.168.178.54 8.8.8.8 googleadapis.l.google.com. A 172.217.16.74 61 1 2018-04-07 21:28:37.047719 192.168.178.50 8.8.8.8 googleadapis.l.google.com. AAAA 2a00:1450:4005:80b::200a 108 1