Hace unos días veíamos como hacer un bypass del UAC de Windows 7 y Windows 10 aprovechándose de WinSxS y hoy hablaremos de un concepto similar, que se aprovecha de la posibilidad de hacer un hijacking (o secuestro) del fichero Ole32.dll en .NET Framework. En el repositorio GitHub de Fuzzysecurity se puede encontrar más información sobre este tipo de vía para realizar un bypass del UAC (Control de Cuentas de Usuario) en Windows. La verdad es que es muy similar al que comentamos en el artículo anterior, pero tiene ciertos detalles que debemos revisar.
Tenemos tres elementos fundamentales para entender este bypass de UAC. Antes de explicarlos, hay que ver cuál será el vector utilizado para llevar a cabo esta elevación de privilegio en Windows 7 y Windows 10.
Conceptos generales de este bypass UAC
Para entender este entorno, el atacante estará conectado a través de una sesión remota, ya que habrá vulnerado algún tipo de proceso de la máquina y tendrá una shell, un meterpreter o algo similar. Teniendo en cuenta que la máquina tiene una configuración de UAC que viene por defecto en Windows a partir de Windows 7 en adelante -, y que la identidad del proceso del vulnerado corresponde con la de un usuario del grupo de administradores, se podrá llevar a cabo el bypass.
El objetivo está claro, aprovechar está sesión remota, dónde no hay privilegio administrativo, para hacer un bypass de UAC y conseguir ejecutar en un contexto de integridad alta o de SYSTEM. El atacante necesitará utilizar tres elementos que enumeramos a continuación:
Como se puede ver en la imagen siguiente, hay una DLL llamada ole32.dll, que no es encontrada dentro de la ruta del framework de .NET. Esto quiere decir, que, si pudiéramos escribir en esa ruta, se podría provocar la ejecución de dicha DLL, cuando de nuevo se invocase mmc gpedit.msc, o cualquier perfil o complemento *.msc que llame a dicha DLL.
En el caso de Windows 10, la ruta no sería v2.0 del framework, sino que al menos la v4.0, pero también se echaría en falta la DLL. Según, Fuzzysecurity (@FuzzySec), la DLL MFC42LOC.dll podría también funcionar bien y provocar el bypass, pero no terminaron de hacerlo funcionar. En el caso de ole32.dll sí funcionó correctamente.
Hijacking a ole32.dll
Para conocer la versión del framework .NET que se está utilizando se puede ejecutar esta instrucción en Powershell. En mi caso, en Windows 7 me devolvió la versión 2.0, mientras que en Windows 10 la 4.0.
En este código, se puede ver cómo se utiliza el objeto $IFileOperation para mover la DLL almacenada en el directorio temporal, que se almacena en la variable $DLLPath. Este objeto tiene privilegios para copiar la DLL de un directorio no privilegiado a otro que sí, tal y como se puede ver en el código. Por último, se invoca la instrucción mmc.exe gpedit.msc, provocando que se encuentre la DLL almacenada en el path de .NET, en esta ocasión ole32.dll.
PoC: Metasploit y Powershell unidos
Para realizar la prueba de concepto de este bypass de UAC, el escenario que hemos propuesto aquí es el siguiente:
Si miramos el provider de funciones de Powershell encontramos la función Bypass-UAC ya cargada en memoria tras descargarla del repositorio de GitHub. Es decir, podremos ejecutar el bypass desde esta función.
Ahora, simplemente debemos invocar a la función e indicarle que DLL queremos ejecutar. Además, debemos tener claro que deberemos disponer de un handler para recibir la sesión.
Esto es importante, ya que si no no podremos capturar la nueva sesión con privilegio o integridad alta.
Como se puede ver, un Bypass de UAC, el cual nos permite escalar privilegios en un sistema Windows 7 o Windows 10. Queremos recordar algún post anterior, como el bypass UAC Fileless o el módulo de Metasploit que se implementó con la técnica Fileless, la cual es mucho mejor a la hora de pasar desapercibido en el sistema comprometido. Recuerda, todos estos bypass dejan de funcionar si tienes fortificado Windows y no en su configuración de UAC por defecto.
Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”
Figura 1: Cómo saltarse el control de cuentas de usuario (UAC) en Windows 7 y Windows 10 con Hijacking OLE32.DLL y .NET |
Tenemos tres elementos fundamentales para entender este bypass de UAC. Antes de explicarlos, hay que ver cuál será el vector utilizado para llevar a cabo esta elevación de privilegio en Windows 7 y Windows 10.
Conceptos generales de este bypass UAC
Para entender este entorno, el atacante estará conectado a través de una sesión remota, ya que habrá vulnerado algún tipo de proceso de la máquina y tendrá una shell, un meterpreter o algo similar. Teniendo en cuenta que la máquina tiene una configuración de UAC que viene por defecto en Windows a partir de Windows 7 en adelante -, y que la identidad del proceso del vulnerado corresponde con la de un usuario del grupo de administradores, se podrá llevar a cabo el bypass.
Figura 2: Un Windows 7 o Windows 10 con Máxima Seguridad debería tener UAC en "Modo Windows Vista" |
El objetivo está claro, aprovechar está sesión remota, dónde no hay privilegio administrativo, para hacer un bypass de UAC y conseguir ejecutar en un contexto de integridad alta o de SYSTEM. El atacante necesitará utilizar tres elementos que enumeramos a continuación:
1. Masquerade-PEB, el cual se encargará de spoofear el proceso explorer.exe. El objetivo es que el objeto COM sea engañado.
2. Invoke-IFileOperation, el cual expone los métodos del objeto COM de IFileOperation a Powershell. Desde aquí se podrán realizar acciones que, generalmente, no se podrían realizar como, por ejemplo, mover una DLL de una ubicación no protegida a una sí protegida.
3. Emit-Yamabiko. Esta función escrita en Powershell escribe una DLL maliciosa en disco. En esta DLL podríamos tener, perfectamente, un Meterpreter, el cual al ser ejecutado por el proceso padre que se esté ejecutando con integridad alta, lograría darnos el control de máquina en un contexto de integridad alta, es decir, con privilegio.Este bypass funciona con Windows x32 y x64 y desde Windows 7 a Windows 10. La idea del bypass radica en que cuando mmc.exe es ejecutado con un perfil concreto, por ejemplo, gpedit.msc o services.msc, se realiza una serie de búsquedas en disco sobre una DLL, la cual no es encontrada.
Figura 3: Repositorio GitHub de FuzzySecurity |
Como se puede ver en la imagen siguiente, hay una DLL llamada ole32.dll, que no es encontrada dentro de la ruta del framework de .NET. Esto quiere decir, que, si pudiéramos escribir en esa ruta, se podría provocar la ejecución de dicha DLL, cuando de nuevo se invocase mmc gpedit.msc, o cualquier perfil o complemento *.msc que llame a dicha DLL.
Figura 4: DLL de ole32.dll no encontrada |
En el caso de Windows 10, la ruta no sería v2.0 del framework, sino que al menos la v4.0, pero también se echaría en falta la DLL. Según, Fuzzysecurity (@FuzzySec), la DLL MFC42LOC.dll podría también funcionar bien y provocar el bypass, pero no terminaron de hacerlo funcionar. En el caso de ole32.dll sí funcionó correctamente.
Hijacking a ole32.dll
Para conocer la versión del framework .NET que se está utilizando se puede ejecutar esta instrucción en Powershell. En mi caso, en Windows 7 me devolvió la versión 2.0, mientras que en Windows 10 la 4.0.
[System.Reflection.Assembly]::GetExecutingAssembly().ImageRuntimeVersion.En primer lugar, se impersonaliza el proceso explorer.exe con la ejecución de Masquerade-PEB. Una vez logrado esto, se prepara la DLL maliciosa o que contiene el código que queremos ejecutar. Se utiliza el directorio temporal, accesible desde $env:temp. Aquí se genera la DLL, la cual será copiada aprovechando la opción de auto elevado (Autoelevate) de los objetos COM en Windows y la posibilidad de utilizar Invoke-IFileOperation para exponer el objeto a Powershell.
Figura 5: Código para mover la DLL a un directorio privilegiado e invocación de gpedic.msc |
En este código, se puede ver cómo se utiliza el objeto $IFileOperation para mover la DLL almacenada en el directorio temporal, que se almacena en la variable $DLLPath. Este objeto tiene privilegios para copiar la DLL de un directorio no privilegiado a otro que sí, tal y como se puede ver en el código. Por último, se invoca la instrucción mmc.exe gpedit.msc, provocando que se encuentre la DLL almacenada en el path de .NET, en esta ocasión ole32.dll.
PoC: Metasploit y Powershell unidos
Para realizar la prueba de concepto de este bypass de UAC, el escenario que hemos propuesto aquí es el siguiente:
- Partimos de una sesión de Metasploit, a través del payload de Powershell.
- Cargamos dinámicamente en memoria la función Bypass-UAC.ps1 desde el Github de Fuzzysecurity.
- Hemos subido una DLL con un Meterpreter a la máquina. Esto se puede generar fácilmente con Metasploit.
Figura 6: Sesión no privilegiada en la máquina objetivo |
Si miramos el provider de funciones de Powershell encontramos la función Bypass-UAC ya cargada en memoria tras descargarla del repositorio de GitHub. Es decir, podremos ejecutar el bypass desde esta función.
Figura 7: Repositorio de funciones cargadas en memoria |
Ahora, simplemente debemos invocar a la función e indicarle que DLL queremos ejecutar. Además, debemos tener claro que deberemos disponer de un handler para recibir la sesión.
Figura 8: Invocación de bypass |
Esto es importante, ya que si no no podremos capturar la nueva sesión con privilegio o integridad alta.
Figura 9: Sesión elevada a SYSTEM |
Como se puede ver, un Bypass de UAC, el cual nos permite escalar privilegios en un sistema Windows 7 o Windows 10. Queremos recordar algún post anterior, como el bypass UAC Fileless o el módulo de Metasploit que se implementó con la técnica Fileless, la cual es mucho mejor a la hora de pasar desapercibido en el sistema comprometido. Recuerda, todos estos bypass dejan de funcionar si tienes fortificado Windows y no en su configuración de UAC por defecto.
Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”
Este comentario ha sido eliminado por el autor.
ResponderEliminarEXCELENT
ResponderEliminar