the_open_door
café
ESEN
← Volver al índice

DLL Hijacking

Un programa de Windows casi nunca contiene todo su código: carga funciones desde DLL en tiempo de ejecución. El DLL hijacking consiste en colocar una DLL maliciosa donde el programa la buscará antes que la legítima, de modo que sea nuestro código el que se cargue dentro de su proceso. Si ese proceso corre con privilegios (un servicio como SYSTEM, una app de administrador), heredamos su nivel de privilegio; si lo lanza otro usuario, ejecutamos código en su contexto.

Mecanismo

Cuando una aplicación pide una DLL por nombre (sin ruta absoluta), Windows la busca siguiendo un orden fijo (el search order): el directorio del ejecutable, System32, System, el directorio de Windows, el directorio actual y, por último, los directorios del PATH. El hijacking aprovecha dos huecos de ese orden:

La DLL maliciosa solo necesita exportar el punto de entrada DllMain y ejecutar el payload al cargarse:

// x86_64-w64-mingw32-gcc hijack.c -shared -o legit.dll
#include <windows.h>
BOOL WINAPI DllMain(HINSTANCE h, DWORD reason, LPVOID r) {
    if (reason == DLL_PROCESS_ATTACH)
        system("cmd.exe /c net localgroup administrators <user> /add");
    return TRUE;
}

Cómo detectarlo

La forma limpia de encontrar candidatos es con Procmon (Sysinternals): se filtra por Result is NAME NOT FOUND y Path ends with .dll, y aparecen todas las DLL que un proceso privilegiado busca y no encuentra, con la ruta exacta donde las espera. Después se comprueba si alguno de esos directorios es escribible:

icacls "C:\Program Files\Vuln App"

Herramientas como PowerUp (Find-ProcessDLLHijack) y winPEAS automatizan parte de la búsqueda. No confundir con el hijack de LD_LIBRARY_PATH de Linux (misma idea, distinto sistema) ni con el abuso de DnsAdmins (caso concreto donde el propio servicio DNS carga una DLL a demanda).

Defensa. Los desarrolladores deben cargar las DLL con ruta absoluta y llamar a SetDefaultDllDirectories para endurecer el search order; los administradores, evitar directorios de aplicación escribibles y mantener el software actualizado (las DLL fantasma suelen ser restos de versiones viejas). Relacionado con permisos de servicio inseguros y unquoted service path.