DLL Hijacking Bypass de UAC en Windows 10
DLL Hijacking Bypass de UAC en Windows 10

DLL Hijacking: PoC Bypass de UAC en Windows 10

DLL Hijacking es una técnica popular para ejecutar payloads maliciosas. Esta publicación describe un bypass de UAC a través del abuso de una carpeta de confianza (system32).

Pero primero, comprendamos el mecanismo de carga de DLL por cualquier aplicación.

1. Qué es DLL Hijacking

DLL significa Dynamic Link Library, que es un archivo de biblioteca que contiene el código y los datos a los que se puede acceder y usar dinámicamente por más de una aplicación al mismo tiempo. Microsoft introdujo la DLL para implementar el concepto de biblioteca compartida que promueve la reutilización de código y el uso eficiente de la memoria.

En un concepto muy español diríamos que el término Secuestro de DLL es más preciso, y esto implica que una DLL tome el control de una DLL legítima.

Bueno, para mantenerlo bastante reforzado el concepto, el DLL Hijacking generalmente ocurre colocando una DLL maliciosa en algunos lugares especiales. Esto hace que el sistema operativo cargue el .dll malicioso en lugar del legítimo. Básicamente es una buena manera de escalar tus privilegios locales en una máquina con Windows si identificas un proceso privilegiado o un ejecutable que se ejecuta en un contexto privilegiado, que carga descuidadamente los archivos .dlls.

2. Identificar Vector de Ataque

A principios de esta semana @jfmaes lanzó una herramienta llamada TrustJack basada en el método desarrollado (DLL Hijacking por ruta relativa) por @Wietze. Puedes leer la publicación completa en este enlace.

En resumen, Windows considera su propia carpeta (C:\Windows) como una carpeta confiable y tiene algo llamado “elevación de privilegios automática“. Lo que básicamente significa que Windows ejecutará automáticamente el proceso en esta carpeta con privilegios elevados. Esto es bastante bueno, pero desafortunadamente, los usuarios normales no pueden escribir en estas carpetas, por lo que el usuario normal no puede colocar las DLL allí sin tener que pasar el UAC primero. Pero aquí es donde se pone interesante …

Microsoft no tuvo en cuenta las carpetas con un espacio final, ya que no puede crear dichas carpetas mediante una convención normal. Esto es lo que significa a los ojos de Microsoft. (observa el espacio final)

C:\Windows\ == C:\Windows .

Curiosamente, usando el CMD también podrías crear esta carpeta si los escribes correctamente, por ejemplo, mkdir "c:\Windows \" está totalmente bien. El truco es el siguiente…

Si logras crear carpetas con barras diagonales finales, Windows las interpretará como si la barra diagonal final no estuviera allí (el espacio ya lo está), ahora Windows la considera “confiable” y tú tienes acceso completo a esta carpeta, lo que te permite escribir lo que quieras allí y ejecutarlo con elevación de privilegios automático. Por suerte, hay un par de herramientas que nos permiten realizar esta prueba de concepto.

3. Obteniendo un bypass

Trustjack es un programa en C# que hace lo siguiente:

  • Crea una carpeta c:\Windows \System32, observa el espacio entre Windows y el \.
  • Copia el binario de la carpeta legítima System32 en esta carpeta
  • Copia tu DLL en la carpeta
  • Inicia el binario (iniciará tu DLL)

Lo que sigue es descargarlo y compilarlo. A continuación se muestra el enlace de descarga y la captura de compilación.

Dark Mode

Es posible que falte fody 2.0, ejecuta la restauración del paquete NuGet para corregirlo (haz clic con el botón derecho en la solución ‘TrustJacker‘ y selecciona ‘restaurar los paquetes NuGet‘)

Compilar Trustjack
Compilar Trustjack

Para usar Trustjack de manera efectiva, usa la lista en el sitio web de Wietzes para elegir tu objetivo y compilar una DLL para ejecutar un comando de tu elección. Aquí hay un ejemplo:

Candidatos para DLL Hijack
Candidatos para DLL Hijack

computerdefaults.exe lanzará cualquiera de los archivos DLL desde su respectivo punto de entrada (Secur32.dll, DllMain), por lo que necesitaremos una DLL con un método DLLMain que ejecute el CMD con privilegios.

Para esta prueba (CMD con privilegios), puedes usar esta otra herramienta (CMDLL) para compilar un DDL de ejemplo.

DLL básico para mostrar un CMD.

Compilar CMDLL
Compilar CMDLL

4. TrustJack en Acción

Una vez compilada la herramienta TrustJacker, obtendremos un binario (por ejemplo, POPTHATSHELLBOI.exe). Puedes ver los parámetros disponibles con el siguiente comando:

POPTHATSHELLBOI.exe -h

Entonces, el modo de ejecución es el siguiente:

POPTHATSHELLBOI.exe --dllpath=[ruta_dll] --binary=[binario_shell]
  • ruta_dll: Es la ruta que contiene el archivo .DLL. En este ejemplo he tomado la .DLL compilada por CMDLL y la he renombrado Secur32.dll). Para una mejor visualización, he copiado el archivo .dll en la misma ruta que el ejecutable.
  • binario_shell: Es el binario a ejecutar. En este ejemplo he tomado ComputerDefaults.exe.
DLL Hijacking con TrustJack
DLL Hijacking con TrustJack

Entonces, esto es lo que sucede: Se creará una carpeta adicional en C:\Windows, una con espacio adicional (no podrás notar visualmente la diferencia entre las 2 carpetas C:\Windows). No te preocupes, este es el comando para eliminarlo de manera segura más adelante:

POPTHATSHELLBOI.exe -c

Retomando lo anterior… El archivo .dll (Secur32.dll) será copiado en C:\Windows\System32. Al ejecutar el binario .exe (ComputerDefaults.exe), éste llamará al archivo .dll asociado (Secur32.dll) y ejecutará el método que abrirá el programa cmd.exe con privilegios administrativos. Recordemos que este archivo Secur32.dll fue “secuestrado”, al ser reemplazado luego de la compilación de CMDLL.

Confirmemos lo sucedido. Este comando muestra los privilegios de seguridad del usuario actual.

whoami /priv
Comando Privilegios de seguridad del usuario actual.
Comando Privilegios de seguridad del usuario actual.

Como se puede apreciar en la imagen de arriba, hay muchos más privilegios que la ejecución del mismo comando en una consola CMD normal (sin privilegios). Puedes notar la diferencia a continuación:

Escalada de Privilegios con DLL Hijacking
Escalada de Privilegios con DLL Hijacking

5. Seguridad de UAC

El Control de Cuentas de Usuario (UAC) se introdujo en Windows Vista como una característica de seguridad, solicitando a los usuarios confirmación mediante un aviso antes de que un proceso que se ejecuta con privilegios normales se eleve a privilegios más altos. Después de que los usuarios se quejaron de inundarse con mensajes UAC al realizar tareas arbitrarias, Microsoft introdujo la elevación automática en Windows 7, que eleva automáticamente ciertos procesos si se encuentran en directorios confiables (como c:\windows\system32).

Es discutible si se trata de una vulnerabilidad de seguridad adecuada. De cualquier manera, esto nos proporciona un excelente medio a través del cual el secuestro de DLL puede hacerse mucho más poderoso.

Configuración de Control de Cuentas de Usuario
Configuración de Control de Cuentas de Usuario

Las carpetas de Windows con espacios finales no se pueden crear por medios normales y, por lo tanto, deben ser raras y siempre sospechosas. Si configuras el modo UAC en ‘Notificarme siempre‘, un nivel superior al predeterminado, evitarás que esta y otras técnicas similares de omisión de UAC tengan éxito.

Gracias por quedarte conmigo a través de esta publicación no tan corta que resume bastante bien el ejemplo construido por @Wietze y @Jean_Maes_1994.

Mi Carro Close (×)

Tu carrito está vacío
Ver tienda