
Simula el cargador PE de Windows para identificar vulnerabilidades de secuestro de DLL, genera DLLs armadas con payloads de shellcode y detecta bypasses de auto-elevación de UAC.
Siofra es una herramienta diseñada para identificar y explotar vulnerabilidades de secuestro de DLL en programas de Windows. Es capaz de simular el cargador de Windows para ofrecer visibilidad sobre todas las dependencias (y las vulnerabilidades correspondientes) de un PE en disco o, alternativamente, de un archivo de imagen en memoria correspondiente a un proceso activo. Más significativamente, la herramienta tiene la capacidad de generar fácilmente DLL para explotar este tipo de vulnerabilidades mediante la infección de PE con creación dinámica de shellcode. Estas DLL infectadas conservan el código (DllMain, funciones exportadas) así como los recursos de una DLL para preservar sin problemas la funcionalidad de la aplicación que las carga, al mismo tiempo que permiten al investigador especificar un payload ejecutable para ejecutarlo como un proceso separado o cargarlo en el objetivo como módulo. Además, la herramienta contiene métodos automatizados para combinar los criterios de auto-elevación de UAC con la funcionalidad mencionada para buscar vulnerabilidades de omisión de UAC.
En la actualidad, existe un número muy elevado de vulnerabilidades que esta herramienta expone. Al probar esta herramienta, solo encontré unas pocas aplicaciones que no eran vulnerables entre cientos contra las que la probé. Tenga en cuenta que estas vulnerabilidades pueden explotarse a pesar de SafeDllSearchMode. Un error común resulta de confundir el "directorio actual" (corregido con SafeDllSearchMode) con el "directorio de la aplicación" (la carpeta que contiene el propio .exe). La gran mayoría de las vulnerabilidades de secuestro de DLL presentes actualmente en los programas de Windows provienen del directorio de la aplicación (que aparece primero en el orden de búsqueda de Windows). A continuación se enumeran algunos aspectos destacados en la salida producida por el escáner de la herramienta. La última vez que se probaron estas vulnerabilidades fue a mediados de julio de 2017.
Siofra64.exe --mode file-scan -f "c:\Program Files\Internet Explorer\iexplore.exe" --enum-dependency --dll-hijack
======== c:\Program Files\Internet Explorer\iexplore.exe [64-bit PE] ======== iexplore.exe USER32.dll [KnownDLL] win32u.dll [Base] api-ms-win-core-privateprofile-l1-1-1.dll [API set] kernel32.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] msvcrt.dll [KnownDLL] api-ms-win-downlevel-shell32-l1-1-0.dll [API set] shcore.dll [KnownDLL] RPCRT4.dll [KnownDLL] combase.dll [KnownDLL] bcryptPrimitives.dll [Base] ADVAPI32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] iertutil.dll [!]
[!] Module iertutil.dll vulnerable at c:\Program Files\Internet Explorer\iertutil.dll (real path: C:\WINDOWS\system32\iertutil.dll)
Siofra64.exe --mode file-scan -f "c:\Program Files\Windows Defender\MpCmdRun.exe" --enum-dependency --dll-hijack
======== c:\Program Files\Windows Defender\MpCmdRun.exe [64-bit PE] ======== MpCmdRun.exe msvcrt.dll [KnownDLL] KERNEL32.dll [KnownDLL] OLEAUT32.dll [KnownDLL] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] combase.dll [KnownDLL] RPCRT4.dll [KnownDLL] bcryptPrimitives.dll [Base] ADVAPI32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] OLE32.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] USER32.dll [KnownDLL] win32u.dll [Base] SspiCli.dll [!] mpclient.dll [!] CRYPT32.dll [Base] MSASN1.dll [Base] WINTRUST.dll [Base]
[!] Module SspiCli.dll vulnerable at c:\Program Files\Windows Defender\SspiCli.dll (real path: C:\WINDOWS\system32\SspiCli.dll)
Siofra64.exe --mode file-scan -f "c:\WINDOWS\System32\wbem\wmiprvse.exe" --enum-dependency --dll-hijack
======== c:\WINDOWS\System32\wbem\wmiprvse.exe [64-bit PE] ======== wmiprvse.exe msvcrt.dll [KnownDLL] FastProx.dll [!] wbemcomn.dll [!] bcrypt.dll [!] WS2_32.dll [KnownDLL] api-ms-win-eventing-obsolete-l1-1-0.dll [API set] sechost.dll [KnownDLL] RPCRT4.dll [KnownDLL] api-ms-win-core-heap-obsolete-l1-1-0.dll [API set] kernel32.dll [KnownDLL] NCObjAPI.DLL [!]
[!] Module wbemcomn.dll vulnerable at c:\WINDOWS\System32\wbem\wbemcomn.dll (real path: C:\WINDOWS\system32\wbemcomn.dll) [!] Module bcrypt.dll vulnerable at c:\WINDOWS\System32\wbem\bcrypt.dll (real path: C:\WINDOWS\system32\bcrypt.dll) [!] Module NCObjAPI.DLL vulnerable at c:\WINDOWS\System32\wbem\NCObjAPI.DLL (real path: C:\WINDOWS\system32\NCObjAPI.DLL)
Siofra64.exe --mode file-scan -f "c:\WINDOWS\System32\SearchProtocolHost.exe" --enum-dependency --dll-hijack --explicit-loadlibrary
======== c:\WINDOWS\System32\SearchProtocolHost.exe [64-bit PE] ======== SearchProtocolHost.exe msvcrt.dll [KnownDLL] TQUERY.DLL [!] OLEAUT32.dll [KnownDLL] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] combase.dll [KnownDLL] RPCRT4.dll [KnownDLL] api-ms-win-core-heap-obsolete-l1-1-0.dll [API set] kernel32.dll [KnownDLL] bcryptPrimitives.dll [Base] cryptdll.dll [!] api-ms-win-security-lsalookup-l2-1-1.dll [API set] advapi32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] api-ms-win-shell-namespace-l1-1-0.dll [API set] windows.storage.dll [Base] api-ms-win-shlwapi-winrt-storage-l1-1-1.dll [API set] shlwapi.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] USER32.dll [KnownDLL] win32u.dll [Base] api-ms-win-appmodel-state-l1-2-0.dll [API set] kernel.appcore.dll [Base] api-ms-win-shcore-path-l1-1-0.dll [API set] shcore.dll [KnownDLL] api-ms-win-power-base-l1-1-0.dll [API set] powrprof.dll [Base] profapi.dll [Base] msfte.dll [Potential explicit Unicode] [!] msTracer.dll [Potential explicit Unicode] [!] Msidle.dll [Potential explicit Unicode] [!] winhttp.dll [Potential explicit Unicode] [!]
[!] Module msfte.dll vulnerable at C:\WINDOWS\system32\msfte.dll (real path: Unknown) [!] Module msTracer.dll vulnerable at C:\WINDOWS\system32\msTracer.dll (real path: Unknown)
Las capacidades de esta herramienta se pueden dividir en 3 categorías separadas, cada una correspondiente a uno de los modos de ejecución de la herramienta.
Cuando está en modo de infección, la herramienta es capaz de generar copias infectadas de archivos DLL tanto de 32 como de 64 bits. Estos archivos infectados pueden secuestrar el flujo de ejecución de una aplicación objetivo cuando se cargan durante la inicialización del proceso, provocando que se cargue una DLL de payload o que se ejecute un ejecutable de payload antes de la ejecución del punto de entrada de la aplicación objetivo.
Cuando está en modo de escaneo de archivos, se le puede proporcionar a la herramienta una ruta de archivo ejecutable o una carpeta (que se buscará en busca de archivos ejecutables, opcionalmente con recursividad) cuyas importaciones de PE, importaciones de carga diferida, API sets, dependencias de ensamblados y bibliotecas cargadas explícitamente se enumerarán y procesarán de forma recursiva para determinar la ruta en la que se cargará cada una durante la inicialización del proceso en tiempo de ejecución. Con esta información, la herramienta puede identificar los módulos vulnerables al secuestro. Durante el procesamiento de PE y la simulación del cargador, la herramienta es capaz de manejar: 1. Módulos importados mediante la sección principal de importaciones del PE. 2. Módulos importados mediante carga diferida. 3. Resolución de dependencias de ensamblados WinSxS (se analiza el recurso de manifiesto del PE, se extraen los IDs de dependencia de ensamblados y se identifica la ruta del módulo WinSxS mediante una implementación personalizada). 4. Módulos cargados explícitamente, importados mediante LoadLibrary en tiempo de ejecución. 5. Resolución de API sets de todos los tipos de importación anteriores. Esto se logra mediante una implementación personalizada de un analizador para las estructuras de datos no documentadas que se encuentran en ApiSetSchema.dll (tenga en cuenta que solo se han probado las versiones 2, 4 y 6). 6. Búsqueda de módulos importados específicos por nombre. 7. Identificación de componentes de Windows que pueden aprovecharse para ataques de omisión de UAC (los criterios de auto-elevación de UAC se aplican a un PE objetivo específico de forma automatizada y luego se usan junto con un ataque de secuestro si está presente). 8. Detectar y filtrar automáticamente las dependencias de módulos que no son vulnerables según: * KnownDLLs * Estado de DLL exento ("Base"). Kernelbase.dll, ntdll.dll, etc. * Mecanismo de seguridad de anulación de manifiesto (utilizado por Microsoft en sysprep.exe)
Cuando está en modo de escaneo de memoria, la herramienta puede enumerar nombres/IDs de procesos locales o se le puede proporcionar un ID de proceso para escanear. En lugar de analizar el archivo de imagen correspondiente al PID dado en disco, la herramienta enumerará los módulos actualmente cargados en el proceso e identificará cuáles de ellos pueden ser vulnerables al secuestro. Esto es útil en los casos en que un ejecutable en disco está empaquetado/ofuscado y sus importaciones no pueden identificarse mediante el análisis del encabezado PE.
Para mostrar la información de uso de la herramienta, basta con ejecutarla sin parámetros (salida mostrada a continuación). Es muy importante utilizar la compilación adecuada de la herramienta (32 o 64 bits) para el objetivo deseado, dependiendo de si se trata de un archivo PE de 32 bits o de 64 bits. Del mismo modo, la versión de 32 bits de la herramienta solo puede enumerar y/o tener como objetivo procesos de 32 bits (Wow64 en un sistema operativo x64) y la versión de 64 bits solo puede enumerar y/o tener como objetivo procesos de 64 bits. Este principio se aplica tanto al escaneo (Siofra64.exe omitirá PE de 32 bits y Siofra32.exe omitirá PE de 64 bits) como a la infección de PE. Siofra32.exe debe usarse para infectar DLL de 32 bits y Siofra64.exe debe usarse para infectar DLL de 64 bits.
Cuando la versión de 32 bits de la herramienta se ejecuta en sistemas x64, la redirección de ruta Wow64 está explícitamente deshabilitada por la herramienta, lo que significa que si se apuntara a \Windows\System32\notepad.exe sería un PE de 64 bits (y por lo tanto debería usarse \Windows\Syswow64\notepad.exe en su lugar). Del mismo modo, si se apuntara a \Program Files\Common Files\microsoft shared\MSInfo\msinfo32.exe sería un PE de 64 bits y, por lo tanto, debería usarse \Program Files (x86)\Common Files\microsoft shared\MSInfo\msinfo32.exe en su lugar.
Uso de Siofra versión 1.13: Siofra32.exe --mode [Modos admitidos: "file-scan", "mem-scan" e "infect"] -v [Opcional. Nivel de verbosidad de salida] Niveles de verbosidad: 0 - Sin salida 1 - Solo estado crítico de éxito/error (predeterminado) 2 - Detalles de estado adicionales para éxito/error, incluidos PE descartados 3 - Todo Modo de escaneo de archivos: -f [Archivo o directorio a escanear] -r [Opcional. Escaneo recursivo] --signed [Opcional. Procesar solo binarios firmados] --delayload [Opcional. Incluir importaciones de carga diferida en la lista de dependencias] --explicit-loadlibrary [Opcional. Incluir importaciones potencialmente explícitas en la lista de dependencias (estas son cadenas *.dll que pueden haber sido llamadas mediante LoadLibrary(Ex)A/W] --auto-elevate [Opcional. Escanear solo binarios de auto-elevación] Modo de escaneo de memoria: --pid [ID del proceso objetivo a escanear. Cuando no se especifica, se enumerará una lista de nombres/PIDs de procesos de 32 o 64 bits (correspondiente a la versión de 32 o 64 bits de esta herramienta)] Cualquier modo de escaneo: --enum-dependency [Enumerar dependencias] --show-unmapped-apiset [Opcional. Incluir API sets que no se asignaron a un módulo en la salida (ignorado por defecto)] --dll-hijack [Enumerar vulnerabilidades de secuestro de DLL] --find-module [Opcional. Escanear dependencias de un módulo específico. Tenga en cuenta que esto excluye KnownDLLs] Modo de infección: -f [Archivo DLL a infectar] -o [Archivo de salida] --payload-path [Ruta de la DLL que se cargará en la DLL infectada en tiempo de ejecución, o ruta del ejecutable que se lanzará en tiempo de ejecución] --payload-type [El tipo de payload especificado en la ruta del payload parásito. Puede ser "process" (generalmente indica un exe) o "library" (generalmente indica una DLL)]
Escaneo de toda la unidad de inicio en busca de programas de 32 bits vulnerables al secuestro de DLL mediante importaciones estándar o de carga diferida a través de sus encabezados PE.
Siofra32.exe --mode file-scan -f "C:/" -r --enum-dependency --dll-hijack --delayload
Escaneo de la carpeta de la aplicación Windows Defender en una versión x64 de Windows en busca de módulos vulnerables cargados mediante la tabla de importaciones estándar en su encabezado PE.
Siofra64.exe --mode file-scan -f "C:\Program Files\Windows Defender" -r --enum-dependency --dll-hijack
Escaneo del programador de actualizaciones de Java de 32 bits en una versión x64 de Windows en busca de módulos vulnerables cargados a través de cualquier canal conocido (importaciones estándar o de carga diferida, WinSxS, LoadLibrary).
Siofra32.exe --mode file-scan -f "C:\Program Files (x86)\Common Files\Java\Java Update\jusched.exe" --enum-dependency --dll-hijack --delayload --explicit-loadlibrary
Escaneo de la carpeta de Windows (y todas sus subcarpetas) en busca de módulos vulnerables (importados mediante la tabla de importaciones estándar en el encabezado PE) en programas de 64 bits que podrían usarse para un ataque de omisión de UAC (firmados por Microsoft con un manifiesto de auto-elevación).
Siofra64.exe --mode file-scan -f "C:\Windows" -r --enum-dependency --dll-hijack --auto-elevate --signed
Infección de una copia de 32 bits de WININET.dll (copiada de \Windows\SysWOW64\WININET.dll a .\WININET_original.dll) con un implante que lanzará un nuevo proceso de notepad cuando se cargue durante la inicialización del proceso por un programa vulnerable. Es importante tener en cuenta que simplemente cargar una copia infectada de esta DLL (por ejemplo, mediante LoadLibrary) no activará el payload. Las DLL infectadas solo están diseñadas para funcionar en el contexto de un módulo vulnerable cargado mediante la sección de importaciones estándar de su proceso anfitrión.
Siofra32.exe --mode infect -f WININET_original.dll -o WININET.dll --payload-type process --payload-path c:\windows\system32\notepad.exe
Infección de una copia de 64 bits de USERENV.dll (copiada de \Windows\System32\USERENV.dll a .\USERENV_original.dll) con un implante que cargará una DLL de payload hipotética almacenada en C:\Payload.dll. Es importante tener en cuenta que todas las DLL cargadas por un proceso de 64 bits deben ser DLL de 64 bits, y todas las DLL cargadas por un proceso de 32 bits deben ser DLL de 32 bits. Por lo tanto, en este escenario hipotético, Payload.dll necesitaría ser un archivo PE de 64 bits para que el implante en USERENV.dll pudiera cargarla correctamente.
Siofra64.exe --mode infect -f USERENV_original.dll -o USERENV.dll --payload-type library --payload-path "C:\Payload.dll"
He decidido hacer parte de esta herramienta de código abierto para ayudar a otros investigadores de seguridad a comprender los detalles técnicos de este proyecto. Específicamente, he proporcionado el código fuente en ensamblador de uno de los shellcodes de implante de 64 bits (para la infección de DLL de PE de 64 bits cuando se especifica un tipo de payload "process").
Los detalles sobre otros aspectos técnicos de la herramienta y los detalles del sistema operativo relacionados con el cargador/orden de búsqueda de Windows, UAC, WinSxS, etc. se pueden encontrar en el PDF de este proyecto.
Siofra está licenciado bajo la licencia GPL 3. Consulte LICENSE.MD para más detalles.
Forrest Williams - [email protected] / [email protected]