
Scanner automatisé pour découvrir les candidats au détournement d'ordre de recherche de DLL dans les exécutables Windows, doté d'une analyse de la table d'importation, d'une énumération des modules en cours d'exécution et d'un hooking d'API via Microsoft Detours.
DLL Hijack SCanner - Un outil pour générer des pistes et automatiser la découverte de candidats pour le détournement de l'ordre de recherche de DLL
Ce dépôt héberge le fichier projet Visual Studio pour l'outil (DLLHSC), le fichier projet pour la fonctionnalité de hooking d'API (detour), le fichier projet pour la charge utile et enfin les exécutables compilés pour les architectures x86 et x64 (dans la section release de ce dépôt). Le code a été écrit et compilé avec Visual Studio Community 2019.
Si vous choisissez de compiler l'outil à partir des sources, vous devrez compiler les projets DLLHSC, detour et payload. DLLHSC implémente la fonctionnalité principale de cet outil. Le projet detour génère une DLL utilisée pour hooker les API. Et le projet payload génère la DLL utilisée comme preuve de concept pour vérifier si l'exécutable testé peut la charger via le détournement de l'ordre de recherche. La charge utile générée doit être placée dans le même répertoire que DLLHSC et detour, nommée payload32.dll pour l'architecture x86 et payload64.dll pour l'architecture x64.
L'outil implémente 3 modes de fonctionnement expliqués ci-dessous.
Charge l'image exécutable en mémoire, analyse la table d'importation puis remplace toute DLL référencée dans la table d'importation par une DLL de charge utile.
L'outil place dans le répertoire de l'application uniquement un module (DLL) qui n'est pas présent dans le répertoire de l'application, n'appartient pas à WinSxS et n'appartient pas aux KnownDLLs.
La DLL de charge utile, lors de son exécution, crée un fichier dans le chemin suivant :
C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSC.tmp comme preuve
d'exécution. L'outil lance l'application et signale si la DLL de charge utile
a été exécutée en vérifiant si le fichier temporaire existe. Comme certains
exécutables importent des fonctions depuis les DLL qu'ils chargent, des boîtes de
message d'erreur peuvent apparaître lorsque la DLL fournie ne parvient pas à exporter ces
fonctions et ne satisfait donc pas les dépendances de l'image fournie. Cependant,
les boîtes de message indiquent que la DLL pourrait être un bon candidat pour l'exécution
de la charge utile si les dépendances sont satisfaites. Dans ce cas, une analyse
supplémentaire est nécessaire. Le titre de ces boîtes de message peut contenir les chaînes :
Ordinal Not Found ou Entry Point Not Found. DLLHSC recherche les fenêtres
contenant ces chaînes, les ferme dès qu'elles apparaissent et
signale les résultats.
Crée un processus avec l'image exécutable fournie, énumère les modules chargés dans l'espace d'adressage de ce processus et signale les résultats après application de filtres.
L'outil signale uniquement les modules chargés depuis le répertoire System et qui n'appartiennent pas aux KnownDLLs. Les résultats sont des pistes nécessitant une analyse supplémentaire. L'analyste peut alors placer les modules signalés dans le répertoire de l'application et vérifier si l'application charge le module fourni à la place.
Hooke les API LoadLibrary et LoadLibraryEx via Microsoft Detours et signale les modules chargés au moment de l'exécution.
Chaque fois que l'application scannée appelle LoadLibrary et LoadLibraryEx,
l'outil intercepte l'appel et écrit le module demandé dans le fichier
C:\Users\%USERNAME%\AppData\Local\Temp\DLLHSCRTLOG.tmp. Si
LoadLibraryEx est spécifiquement appelée avec le drapeau
LOAD_LIBRARY_SEARCH_SYSTEM32, aucune sortie n'est écrite dans le fichier. Après
que toutes les interceptions sont terminées, l'outil lit le fichier et affiche les
résultats. Les modules intéressants pour une analyse plus approfondie sont ceux qui
n'existent pas dans la clé de registre KnownDLLs, les modules qui n'existent pas dans le
répertoire System et les modules sans chemin complet (pour ces modules, le chargeur
applique l'ordre de recherche normal).
Si vous choisissez de compiler l'outil à partir des sources, il est recommandé de le faire avec Visual Studio 2019. Pour que l'outil fonctionne correctement, les projets DLLHSC, detour et payload doivent être compilés pour la même architecture puis placés dans le même répertoire. Veuillez noter que la DLL générée par le projet payload doit être renommée en payload32.dll pour l'architecture 32 bits ou payload64.dll pour l'architecture 64 bits.
Le menu d'aide pour cette application
NAME
dllhsc - DLL Hijack SCanner
SYNOPSIS
dllhsc.exe -h
dllhsc.exe -e <chemin de l'image exécutable> (-l|-lm|-rt) [-t secondes]
DESCRIPTION
DLLHSC scanne une image exécutable donnée pour détecter du détournement de DLL et signale les résultats
Il nécessite des privilèges élevés
OPTIONS
-h, --help
afficher ce menu d'aide et quitter
-e, --executable-image
image exécutable à scanner
-l, --lightweight
analyser la table d'importation, tenter de lancer une charge utile et signaler les résultats
-lm, --list-modules
lister les modules chargés qui n'existent pas dans le répertoire de l'application
-rt, --runtime-load
afficher les modules chargés au moment de l'exécution en hookant les API LoadLibrary et LoadLibraryEx
-t, --timeout
nombre de secondes à attendre pour vérifier les éventuelles fenêtres d'erreur popup - par défaut 10 secondes
Cette section fournit des exemples sur la façon d'exécuter DLLHSC et les résultats qu'il rapporte. Pour cela, l'utilitaire légitime Microsoft OleView.exe (MD5: D1E6767900C85535F300E08D76AAC9AB) a été utilisé. Pour de meilleurs résultats, il est recommandé de scanner l'image exécutable fournie dans son répertoire d'installation.
Le drapeau -l analyse la table d'importation de l'exécutable fourni, applique des filtres et tente d'armer les modules importés en plaçant une DLL de charge utile dans le répertoire courant de l'application. L'exécutable scanné peut afficher une boîte d'erreur lorsque les dépendances pour la DLL de charge utile (fonctions exportées) ne sont pas satisfaites. Dans ce cas, une boîte de message d'erreur apparaît. DLLHSC vérifie par défaut pendant 10 secondes si une boîte de message a été ouverte, ou pendant autant de secondes que spécifié par l'utilisateur avec le drapeau -t. Une boîte de message d'erreur indique que si les dépendances sont satisfaites, le module peut être armé.
La capture d'écran suivante montre la boîte de message d'erreur générée lorsque OleView.dll charge la DLL de charge utile :

L'outil attend un délai maximum de 10 secondes ou -t secondes pour s'assurer que l'initialisation du processus est terminée et que toute boîte de message a été générée. Il détecte ensuite la boîte de message, la ferme et signale le résultat :

Le drapeau -lm lance l'exécutable fourni et affiche les modules qu'il charge qui n'appartiennent ni à la liste KnownDLLs ni aux dépendances WinSxS. Ce mode vise à donner une idée des DLL pouvant être utilisées comme charge utile et existe uniquement pour générer des pistes pour l'analyste.

Le drapeau -rt affiche les modules que l'image exécutable fournie charge dans son espace d'adressage lorsqu'elle est lancée en tant que processus. Ceci est réalisé en hookant les API LoadLibrary et LoadLibraryEx via Microsoft Detours.

Pour tout retour d'information sur cet outil, veuillez utiliser la section GitHub Issues.