
Escáner automatizado para descubrir candidatos de secuestro de orden de búsqueda de DLL en ejecutables de Windows, con análisis de tabla de importaciones, enumeración de módulos en tiempo de ejecución y enganche de API mediante Microsoft Detours.
DLL Hijack SCanner: una herramienta para generar pistas y automatizar el descubrimiento de candidatos para el secuestro del orden de búsqueda de DLL
Este repositorio alberga el archivo de proyecto de Visual Studio para la herramienta (DLLHSC), el archivo de proyecto para la funcionalidad de hooking de API (detour), el archivo de proyecto para el payload y, por último pero no menos importante, los ejecutables compilados para arquitectura x86 y x64 (en la sección de lanzamientos de este repositorio). El código fue escrito y compilado con Visual Studio Community 2019.
Si eliges compilar la herramienta desde el código fuente, necesitarás compilar los proyectos DLLHSC, detour y payload. DLLHSC implementa la funcionalidad principal de esta herramienta. El proyecto detour genera una DLL que se utiliza para hookear APIs. Y el proyecto payload genera la DLL que se utiliza como prueba de concepto para verificar si el ejecutable probado puede cargarla mediante secuestro del orden de búsqueda. El payload generado debe colocarse en el mismo directorio que DLLHSC y detour, con el nombre payload32.dll para arquitectura x86 y payload64.dll para arquitectura x64.
La herramienta implementa 3 modos de operación que se explican a continuación.
Carga la imagen del ejecutable en memoria, analiza la tabla de importación y luego reemplaza cualquier DLL referenciada en la tabla de importación con una DLL de payload.
La herramienta coloca en el directorio de la aplicación solo un módulo (DLL) que no está presente en el directorio de la aplicación, no pertenece a WinSxS y no pertenece a las KnownDLLs.
La DLL de payload al ejecutarse, crea un archivo en la siguiente ruta:
C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSC.tmp como prueba de
ejecución. La herramienta inicia la aplicación e informa si la DLL de payload
fue ejecutada verificando si el archivo temporal existe. Como algunos
ejecutables importan funciones de las DLL que cargan, pueden aparecer cuadros
de mensaje de error cuando la DLL proporcionada no exporta esas funciones y,
por lo tanto, no cumple con las dependencias de la imagen proporcionada. Sin embargo,
los cuadros de mensaje indican que la DLL puede ser un buen candidato para la ejecución
del payload si se cumplen las dependencias. En este caso, se requiere un análisis
adicional. El título de estos cuadros de mensaje puede contener las cadenas:
Ordinal Not Found o Entry Point Not Found. DLLHSC busca ventanas
que contengan estas cadenas, las cierra tan pronto como aparecen e
informa los resultados.
Crea un proceso con la imagen ejecutable proporcionada, enumera los módulos que se cargan en el espacio de direcciones de este proceso e informa los resultados después de aplicar filtros.
La herramienta solo informa los módulos cargados desde el directorio System y que no pertenecen a las KnownDLLs. Los resultados son pistas que requieren un análisis adicional. El analista puede entonces colocar los módulos informados en el directorio de la aplicación y verificar si la aplicación carga el módulo proporcionado en su lugar.
Hooking de las APIs LoadLibrary y LoadLibraryEx mediante Microsoft Detours e informa de los módulos que se cargan en tiempo de ejecución.
Cada vez que la aplicación escaneada llama a LoadLibrary y LoadLibraryEx,
la herramienta intercepta la llamada y escribe el módulo solicitado en el archivo
C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSCRTLOG.tmp. Si
LoadLibraryEx se llama específicamente con la bandera
LOAD_LIBRARY_SEARCH_SYSTEM32, no se escribe ninguna salida en el archivo. Después
de que todas las intercepciones hayan terminado, la herramienta lee el archivo e imprime los
resultados. Son de interés para un análisis posterior los módulos que no existen
en la clave de registro KnownDLLs, los módulos que no existen en el directorio
System y los módulos sin ruta completa (para estos módulos el cargador
aplica el orden de búsqueda normal).
Si decides compilar la herramienta desde el código fuente, se recomienda hacerlo en Visual Studio 2019. Para que la herramienta funcione correctamente, los proyectos DLLHSC, detour y payload deben compilarse para la misma arquitectura y luego colocarse en el mismo directorio. Tenga en cuenta que la DLL generada desde el proyecto payload debe renombrarse a payload32.dll para arquitectura de 32 bits o payload64.dll para arquitectura de 64 bits.
El menú de ayuda para esta aplicación
NOMBRE
dllhsc - DLL Hijack SCanner
SINOPSIS
dllhsc.exe -h
dllhsc.exe -e <ruta de la imagen ejecutable> (-l|-lm|-rt) [-t segundos]
DESCRIPCIÓN
DLLHSC escanea una imagen ejecutable dada en busca de secuestro de DLL e informa los resultados
Requiere privilegios elevados
OPCIONES
-h, --help
muestra este menú de ayuda y sale
-e, --executable-image
imagen ejecutable a escanear
-l, --lightweight
analiza la tabla de importación, intenta lanzar un payload e informa los resultados
-lm, --list-modules
lista los módulos cargados que no existen en el directorio de la aplicación
-rt, --runtime-load
muestra los módulos cargados en tiempo de ejecución mediante hooking de las APIs LoadLibrary y LoadLibraryEx
-t, --timeout
número de segundos a esperar para verificar cualquier ventana de error emergente - por defecto 10 segundos
Esta sección proporciona ejemplos de cómo puedes ejecutar DLLHSC y los resultados que informa. Para este propósito, se utilizó la utilidad legítima de Microsoft OleView.exe (MD5: D1E6767900C85535F300E08D76AAC9AB). Para obtener mejores resultados, se recomienda que la imagen ejecutable proporcionada se escanee dentro de su directorio de instalación.
La bandera -l analiza la tabla de importación del ejecutable proporcionado, aplica filtros e intenta armar los módulos importados colocando una DLL de payload en el directorio actual de la aplicación. El ejecutable escaneado puede mostrar un cuadro de error cuando no se cumplen las dependencias de la DLL de payload (funciones exportadas). En este caso, aparece un cuadro de mensaje de error. DLLHSC verifica por defecto durante 10 segundos si se abrió un cuadro de mensaje, o durante tantos segundos como especifique el usuario con la bandera -t. Un cuadro de mensaje de error indica que si se cumplen las dependencias, el módulo puede ser armado.
La siguiente captura de pantalla muestra el cuadro de mensaje de error generado cuando OleView.dll carga la DLL de payload:

La herramienta espera un tiempo máximo de 10 segundos o -t segundos para asegurarse de que la inicialización del proceso haya finalizado y se haya generado cualquier cuadro de mensaje. Luego detecta el cuadro de mensaje, lo cierra e informa el resultado:

La bandera -lm lanza el ejecutable proporcionado e imprime los módulos que carga que no pertenecen a la lista de KnownDLLs ni son dependencias de WinSxS. Este modo tiene como objetivo dar una idea de las DLL que pueden usarse como payload y solo existe para generar pistas para el analista.

La bandera -rt imprime los módulos que la imagen ejecutable proporcionada carga en su espacio de direcciones cuando se lanza como un proceso. Esto se logra mediante hooking de las APIs LoadLibrary y LoadLibraryEx a través de Microsoft Detours.

Para cualquier comentario sobre esta herramienta, utilice la sección de Issues de GitHub.