hacktricks/network-services-pentesting/5353-udp-multicast-dns-mdns.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

8 KiB

Información Básica

Multicast DNS (mDNS) es un protocolo de configuración cero que permite realizar operaciones similares a DNS en la red local en ausencia de un servidor DNS convencional unicast. El protocolo utiliza la misma API, formatos de paquetes y semántica de operación que DNS, lo que permite resolver nombres de dominio en la red local. DNS Service Discovery (DNS-SD) es un protocolo que permite a los clientes descubrir una lista de instancias nombradas de servicios (como test._ipps._tcp.local o linux._ssh._tcp.local) en un dominio utilizando consultas DNS estándar. DNS-SD se utiliza con mayor frecuencia en conjunto con mDNS, pero no depende de él. Ambos son utilizados por muchos dispositivos IoT, como impresoras de red, Apple TVs, Google Chromecast, dispositivos de almacenamiento conectados a la red (NAS) y cámaras.
Puerto predeterminado: 5353/UDP

PORT     STATE SERVICE
5353/udp open  zeroconf

Cómo funciona mDNS

Los dispositivos utilizan mDNS cuando la red local carece de un servidor DNS unicast convencional. Para resolver un nombre de dominio para una dirección local utilizando mDNS, el dispositivo envía una consulta DNS para un nombre de dominio que termina con .local a la dirección multicast 224.0.0.251 (para IPv4) o FF02::FB (para IPv6). También se puede utilizar mDNS para resolver nombres de dominio globales (no .local), pero las implementaciones de mDNS deben desactivar este comportamiento de forma predeterminada. Las solicitudes y respuestas de mDNS utilizan UDP y el puerto 5353 como puerto de origen y destino.

Las respuestas de mDNS contienen varias banderas importantes, incluyendo un valor de Tiempo de vida (TTL) que indica cuántos segundos el registro es válido. El envío de una respuesta con TTL=0 significa que el registro correspondiente debe ser eliminado. Otra bandera importante es el bit QU, que denota si la consulta es una consulta unicast o no. Si el bit QU no está establecido, el paquete es una consulta multicast (QM). Debido a que es posible recibir consultas unicast fuera del enlace local, las implementaciones seguras de mDNS siempre deben verificar que la dirección de origen en el paquete coincida con el rango de direcciones de subred local.

Cómo funciona DNS-SD

DNS-SD permite a los clientes descubrir servicios disponibles en la red. Para utilizarlo, los clientes envían consultas DNS estándar para registros de puntero (PTR), que asignan el tipo de servicio a una lista de nombres de instancias específicas de ese tipo de servicio.

Para solicitar un registro PTR, los clientes utilizan la forma de nombre "<Servicio>.<Dominio>". La parte <Servicio> es el nombre del servicio precedido por "_" (por ejemplo, _ipps, _printer o _ipp) y _tcp o _udp. La parte <Dominio> es ".local".
Los respondedores devuelven los registros PTR que apuntan a los registros de servicio (SRV) y texto (TXT) acompañantes. Aquí hay un ejemplo de un registro PTR:

  _ipps._tcp.local: type PTR, class IN, test._ipps._tcp.local

La parte del registro PTR a la izquierda de los dos puntos es su nombre, y la parte a la derecha es el registro SRV al que apunta el registro PTR. El registro SRV lista el host y el puerto de destino donde se puede acceder a la instancia del servicio. Por ejemplo, la siguiente imagen muestra un registro SRV "test._ipps._tcp.local" en Wireshark en el host ubuntu.local y el puerto 8000:

Por lo tanto, el nombre del registro SRV es similar al registro PTR precedido por el nombre de la <Instancia> (en este caso, test). El registro TXT tiene el mismo nombre que el registro SRV y contiene la información necesaria cuando la dirección IP y el número de puerto (contenidos en el registro SRV) de un servicio no son suficientes para identificarlo.

Enumeración

nmap

nmap -Pn -sUC -p5353 192.168.1.2

Starting Nmap 6.46 (http://nmap.org) at 2015-01-01 10:30 GMT
Nmap scan report for 192.168.1.2
PORT     STATE SERVICE
5353/udp open  zeroconf
| dns-service-discovery:
|   9/tcp workstation
|     Address=192.168.1.2
|   22/tcp ssh
|     Address=192.168.1.2
|   22/tcp sftp-ssh
|     Address=192.168.1.2
|   445/tcp smb
|     Address=192.168.1.2

Enumeración de Red

Se puede aprender mucho sobre la red local simplemente enviando solicitudes mDNS y capturando tráfico multicast mDNS.

Se puede utilizar la herramienta Pholus para enviar solicitudes mDNS (-rq) en la red local y capturar tráfico multicast mDNS (durante -stimeout 10 segundos):

sudo python3 pholus3.py eth0 -rq -stimeout 10

Ataques

Abuso de la fase de sondeo mDNS

Cuando un respondedor mDNS comienza o cambia su conectividad, pregunta a la red local si hay algún recurso con el nombre que planea usar. Si la respuesta contiene el registro en cuestión, el host de sondeo debe elegir un nuevo nombre. Si se producen 15 conflictos en 10 segundos, el host debe esperar al menos cinco segundos antes de cualquier intento adicional. Además, si pasa un minuto durante el cual el host no puede encontrar un nombre sin usar, informa un error al usuario.

El siguiente comando de línea de comandos evitará que cualquier nuevo dispositivo obtenga un nuevo nombre, ya que indicará que cualquier nombre ya está en uso:

sudo python pholus.py eth0 -afre -stimeout 1000

Spoofing/MitM

El ataque más interesante que se puede realizar sobre este servicio es realizar un MitM en la comunicación entre el cliente y el servidor real. Podría ser posible obtener archivos sensibles (MitM la comunicación con la impresora) o incluso credenciales (autenticación de Windows).
Para obtener más información, consulte:

{% content-ref url="../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md" %} spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md {% endcontent-ref %}

Referencias

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥