Investigadores de Check Point Research han descubierto un fallo importante en Windows DNS Server. Esta vulnerabilidad, apodada SIGRed, permite la ejecución remota de código y afecta a todas las ediciones de Windows Server desde 2003 a 2019.
SIGRed, al que se le ha asignado el identificador CVE-2020-1350, se puede ejecutar a través de una petición DNS maliciosa. Dado que el servicio DNS tiene privilegios elevados (SYSTEM), explotado de forma correcta, un atacante podría llegar a adquirir permisos de Administrador de Dominio, lo que afectaría a toda la infraestructura de una empresa. Una característica especialmente peligrosa es su naturaleza de gusano, una vez ha comprometido un servidor puede buscar nuevos objetivos y de esta forma propagarse sin control por toda la red. En consecuencia, tiene una puntuación CVSS de 10.
Algunas consideraciones necesarias para comprender cómo funciona el ataque:
DNS funciona a través de UDP y TCP en el puerto 53.
Un mensaje DNS, ya sea consulta o respuesta, tiene un límite de 512 bytes en UDP y 65.535 bytes en TCP.
La naturaleza de DNS es jerárquica y descentralizada. Si un servidor DNS no conoce la respuesta a una consulta recibida, la reenviará a un servidor DNS superior en jerarquía.
Windows utiliza como cliente DNS dnsapi.dll y como servidor DNS dns.exe.
El escenario para explotar SIGRed tiene que ver con cómo el servidor DNS trata una respuesta para una consulta reenviada:
El registro NS de un sitio web malicioso, que indica qué servidor DNS tiene autoridad para ese dominio, apunta al servidor DNS del atacante.
El servidor DNS víctima, al no tener la respuesta cuando consulta para el sitio web malicioso, realizará una nueva consulta a otro DNS (por ejemplo 8.8.8.8 de Google o 1.1.1.1 de Cloudfare), que responderán con el NS del atacante y será cacheado por la víctima.
Cuando se solicite un subdominio de la web maliciosa, la víctima hará una consulta al NS malicioso. Por defecto, la consulta se realizaría vía UDP.
El atacante devuelve una respuesta truncada con el indicador TC, indicando que dicha respuesta es demasiado larga para ser transmitida mediante UDP.
La víctima realizará nuevamente la consulta a través de TCP.
El atacante responderá con el exploit.Captura de paquetes del servidor DNS víctima realizando peticiones al DNS malicioso
Para poder explotar la vulnerabilidad, el tamaño de la respuesta TCP tiene que superar los 64 KB. Con este fin, nos fijamos en la función dns.exe!SigWireRead.
Código desensamblado de la función dns.exe!SigWireRead
Podemos observar que la función RR_AllocateEx calcula la memoria necesaria para alojar el Resource Record, esperando como parámetros registros de 16 bits. Esto significa que si pasamos un resultado mayor a 65.535 bytes (o 64 KB, el tamaño máximo de la respuesta TCP) podríamos provocar un integer overflow. Considerando que esta dirección de memoria asignada es pasada a memcpy como búfer de destino, podríamos llegar a tener un heap buffer overflow controlado.
Con el propósito de aprovechar esta vulnerabilidad es necesario utilizar la compresión mediante punteros en la respuesta del servidor DNS malicioso, que una vez es descomprimida por la víctima permite obtener un valor superior a los 65.535 bytes necesarios que mencionamos previamente.
Microsoft ha confirmado que no ha detectado una explotación activa de SIGRed en estos momentos y en su parche de seguridad de julio ha solucionado este problema. Desde Hispasec Sistemas recomendamos aplicar las últimas actualizaciones de Windows Server para mitigar el impacto de esta vulnerabilidad.