Bypass UAC en Windows 7 usando DLL Hijacking con NET Code Profiler Otro más en 2017

Bypass UAC en Windows 7 usando DLL Hijacking con NET Code Profiler Otro más en 2017


Los bypasses sobre UAC est�n cayendo casi semanalmente. Es cierto que Microsoft no los considera una vulnerabilidad, pero pueden ayudar en un pentest bastante, ya que, si el proceso comprometido pertenece a un usuario del grupo administrador, tendr�amos una puerta abierta a lograr ejecutar c�digo con el m�ximo privilegio. En esta ocasi�n, el bypass de UAC ha sido descubierto por el investigador Stefan Kanthak.

Figura 1: ByPass UAC en Windows 7 usando DLL Hijacking con .NET Code Profiler

Como el propio investigador comenta en su publicaci�n realizada a trav�s de Seclists, todas las versiones de .NET Framework pueden cargar un objeto COM como Code Profiler, el cual se habilita a trav�s de dos variables de entorno. Como indica Microsoft, un Profiler DLL es una librer�a de v�nculo din�mica no administrada, la cual se ejecuta sin restricciones de c�digo gestionado. La �nica limitaci�n sobre el Profiler DLL la impone el sistema operativo sobre el usuario que ejecuta la aplicaci�n.

Figura 2: Publicaci�n del Bypass UAC en Seclist

Cuando las comprobaciones de variables de entorno existen se resuelven de forma satisfactoria, se instancia el generador de perfiles. Al final, la t�cnica utilizada por el investigador ha sido un DLL Hijack de una forma interesante. La t�cnica consiste en habilitar las variables de entorno COR_ENABLE_PROFILING y COR_PROFILER.

Figura 3: Detalles en el proyecto UACME

Sabiendo que eventvwr.msc y secpol.msc est�n escritas en .NET y en su ejecuci�n, si las variables de entorno anteriores est�n habilitadas, har�n uso de c�digo no administrado, se puede lograr un bypass de UAC. La t�cnica ha sido validada en Windows 7, como se puede ver en el proyecto UACMe.

�C�mo conseguimos el bypass de UAC?

Realmente es sencillo. Lo primero es habilitar las variables de entorno. COR_ENABLE_PROFILING a 1, para habilitarla. COR_PROFILER deber� apuntar a una clave de registro, un CLSID. En otras palabras, el CLSID se encontrar� en HKCUSoftwareClassesCLSID[ID del CLSID]. El ID del CLSID da igual el que se ponga, por ejemplo 44444444-4444-4444-4444-444444444444. Ahora, hay que pensar que el valor de clave CLSID que tenemos que crear debe apuntar a una ruta d�nde tendremos el c�digo, en forma de DLL, que se quiere ejecutar.

Figura 4: Creaci�n del CLSID apuntando a la DLL que usar� COR_PROFILER 

Cuando desde una cmd.exe ejecutemos "start mmc.exe eventvwr.msc", la Microsoft Management Console se arrancar� y cargar� el complemento del visor de eventos. Como las variables de entorno, mencionadas anteriormente est�n habilitadas, se utilizar� c�digo no administrador, la cual ser� nuestra DLL. Como la instrucci�n "mmc.exe eventvwr.msc" se ejecuta en un contexto de integridad alto y �sta es la que carga el c�digo de la DLL, �ste tambi�n se ejecutar� con el mismo nivel de integridad alto, realizando de este modo el bypass de UAC.

PoC: Consiguiendo el bypass

Antes de empezar, vamos a resumir el proceso con este pseudoc�digo:
1. Configurar variables de entorno: 
a. Set COR_ENABLE_PROFILING=1
b. Set COR_PROFILER={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
2. Crear la DLL con c�digo que nos interese ejecutar. En este caso, se puede utilizar msfvenom de la siguiente manera:
msfvenom �p [payload] �b �x00x0dx0a� �f dll �o [ruta salida DLL]. 
3. Crear el hive del registro para apuntar a la DLL que nos interese, que la hemos creado en el paso anterior. En la imagen se puede ver un ejemplo de lo que tenemos que crear, lo cual, l�gicamente, lo podr�amos crear por l�nea de comandos. 
4. Cuando se ejecuta una aplicaci�n .NET, la cual detecta que tiene la variable de entorno COR_ENABLE_PROFILING habilitado mirar� qu� valor tiene la variable COR_PROFILER. Al recoger el valor de la segunda variable de entorno el proceso consulta la ruta HKCUSoftwareClassesCLSID y comprueba si la clave existe.
Figura 5: Como la hemos creado antes, existe y devuelve el valor de la clave
5. La DLL se ejecutar� por el proceso que lo invoque. 
6. El truco est� en que si es un proceso con integridad alta qui�n consulta estos valores, tendremos c�digo nuestro ejecut�ndose con privilegio. Por esta raz�n, se deber� ejecutar start mmc.exe eventvwr.msc para lograr la ejecuci�n de c�digo privilegiada.
Cuando lanzamos la instrucci�n "start mmc.exe eventvwr.msc" encontramos un messagebox en el que se nos indica el nivel de integridad del proceso y se abre una cmd.exe. Este interfaz de comandos ya se est� ejecutando con un privilegio alto, debido a que es el eventvwr.msc realmente el que la ha invocado.

Figura 6: Interfaz de comandos ejecutado con nivel de integridad alto

En la siguiente imagen, se puede ver el contexto de integridad en el que se est�n ejecutando los procesos. Como se puede ver, tenemos una cmd.exe con integridad media, esta es desde d�nde desembocamos todo el proceso.

Figura 7: Nivel de Integridad "High" por haber autoelevado el mmc.exe

Despu�s vemos el mmc.exe con integridad alta y sin notificar UAC, ya que el eventvwr est� autoelevado y, por �ltimo, tenemos una nueva cmd.exe creada por mmc.exe con integridad alta. Aqu� tenemos el bypass UAC. Por �ltimo, os dejamos un video para que ve�is el proceso en funcionamiento y c�mo funciona este bypass de UAC.

Figura 8: PoC en v�deo de Bypass UAC usando DDL Hijacking con .NET Code Profiler

Hay que indicar que el bypass de UAC podr�a ser aprovechado a trav�s, por ejemplo, de una sesi�n de Meterpreter y lograr conseguir ejecutar c�digo en un contexto elevado en proyecto de Ethical Hacking. Sin duda, interesante t�cnica y de sencilla explotaci�n.

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

download file now