
Découverte, validation et confirmation automatisées du détournement de DLL. Transformer des erreurs de configuration locales en chemins d’attaque armés et confirmés.
Découverte, validation et confirmation automatisées du détournement de DLL
Transformer les mauvaises configurations locales en chemins d'attaque confirmés et exploitables.
DLLHijackHunter est un outil automatisé de détection de détournement de DLL sous Windows qui va au-delà de l'analyse statique. Il découvre, valide et confirme les opportunités de détournement de DLL grâce à un pipeline en plusieurs phases :
La plupart des outils de détournement de DLL s'arrêtent à « cette DLL pourrait être détournable ». DLLHijackHunter tente de la valider, de la recouper avec des renseignements d'exploitation connus et de confirmer les chemins d'exécution réels lorsque c'est possible.
flowchart TB
subgraph Phase1["Phase 1 : Découverte"]
SE["Moteur statique<br/>Services, tâches, démarrage,<br/>COM, clés Run"]
AE["Moteur AutoElevate<br/>Manifeste + contournement UAC COM"]
PE["Analyseur PE<br/>Tables d'imports, chargements différés,<br/>manifestes, exports"]
ETW["Moteur ETW<br/>Surveillance en temps réel<br/>des chargements de DLL"]
SO["Calculateur d'ordre<br/>de recherche"]
end
subgraph Phase2["Phase 2 : Pipeline de filtrage"]
direction LR
HG["Portes dures<br/>(élimination du binaire)"]
SG["Portes souples<br/>(ajustement de confiance)"]
end
subgraph Phase3["Phase 3 : Vérification du chargement (--verify-load)"]
LP["LoadProbe<br/>Test de chargement en processus enfant<br/>DLL sonde placée et retirée"]
end
subgraph Phase4["Phase 4 : Canari"]
CB["Générateur de DLL canari"]
TE["Exécuteur de déclenchement"]
VF["Vérification"]
end
subgraph Phase5["Phase 5 : Sortie"]
SC["Notateur par niveaux"]
RC["Rapport console"]
RJ["Rapport JSON"]
RH["Rapport HTML"]
end
SE --> PE --> SO
AE --> PE
ETW --> SO
SO --> Phase2
HG --> SG
Phase2 --> Phase3
Phase3 --> Phase4
CB --> TE --> VF
Phase4 --> Phase5Les entrées IFEO Debugger sont énumérées et le binaire référencé est analysé pour ses imports de DLL, mais il n'existe pas de type de détournement IFEO/contournement KnownDLL dédié — ceux-ci ne sont pas présentés comme des détections autonomes.
DLLHijackHunter inclut une découverte dédiée des contournements UAC :
System32 et SysWOW64 à la recherche d'EXE avec <autoElevate>true</autoElevate> dans les manifestes intégrésHKLM\SOFTWARE\Classes\CLSID à la recherche d'objets COM avec Elevation\Enabled=1SetDllDirectory ou SetDefaultDllDirectories, simule le chemin d'attaque « copier l'EXE dans un dossier inscriptible + déposer la DLL »Resources/hijacklibs.json. Une correspondance augmente la confiance et relie le résultat à sa page de référence HijackLibs ; l'absence de correspondance ne signifie rien. Le jeu de données est piloté par les données — actualisez-le en retéléchargeant https://hijacklibs.net/api/hijacklibs.json sur cette ressource (aucune modification de code requise). Jeu de données © le projet HijackLibs et ses contributeurs.PATH inscriptibles et génère des candidats de détournement pour une carte organisée de services Windows natifs connus pour rechercher des DLL manquantes dans le PATHLe pipeline réduit les faux positifs en deux étapes :
Portes dures
api-ms-*, ext-ms-*)Users / Authenticated Users / Everyone, plus les comptes de service sous-administrateurs sans fuite comme LOCAL SERVICE/NETWORK SERVICE) dispose de droits d'écriture effectifs. De manière cruciale, ceci est calculé indépendamment du jeton sous lequel l'outil s'exécute, donc une exécution élevée ne rend pas System32/Program Files inscriptibles. C'est ce qui rend les exécutions élevées significatives pour le triage LPE.Portes souples
LoadLibraryExAu lieu de deviner, DLLHijackHunter tente de prouver que les détournements fonctionnent :
sequenceDiagram
participant H as DLLHijackHunter
participant B as Générateur de DLL canari
participant T as Exécuteur de déclenchement
participant V as Binaire victime
H->>B: Construire la DLL canari
B->>B: Extraire le canari précompilé<br/>(ou compiler un proxy avec MSVC)
B-->>H: canary.dll + chemin du fichier de confirmation
H->>H: Placer la DLL au chemin de détournement
H->>T: Déclencher l'exécution du binaire
T->>V: Démarrer le service / exécuter la tâche / activer COM
V->>V: Charge la DLL canari
V-->>H: Écrit le fichier de confirmation<br/>PID, privilège, niveau d'intégrité
H->>H: Enregistrer : CONFIRMÉ
H->>H: Nettoyer la DLL canariLa DLL canari :
%ProgramData%\DLLHijackHunter\canary_<hash>.confirm), donc un seul binaire sert chaque candidat. Le scanner calcule le même hash depuis le chemin de déploiement et interroge ce fichier.Les binaires intégrés sont construits à partir du code source auditable dans src/DLLHijackHunter/Resources/canary_src.c et peuvent être régénérés avec Resources/build_canary.bat (nécessite la chaîne d'outils MSVC C++ ; le scanner ne l'exige pas).
Exception de proxy fonctionnel : Lorsqu'un détournement d'ordre de recherche cible une DLL qui existe et expose des exports, maintenir l'hôte en vie après confirmation nécessite un proxy de transfert d'exports, compilé par DLL avec MSVC (
cl.exe, localisé viavswhere/vcvarsall). Si aucune chaîne d'outils n'est présente, le canari précompilé est utilisé à la place — il confirme toujours le chargement (DllMain se déclenche) mais ne transfère pas les exports, donc le processus hôte peut planter après l'enregistrement de la confirmation. Les candidats DLL fantômes et autres sans exports ne nécessitent aucun compilateur.
Signature : Les canaris intégrés ne sont pas signés. Les signer avec un certificat de code (pour qu'ils se chargent sous des politiques plus strictes et soient attribuables) nécessite un certificat de signature et est laissé comme étape au moment de la publication pour le mainteneur.
Les canaris proxy/transfert d'exports sont expérimentaux et au mieux. Certaines cibles peuvent ne pas se charger correctement ou se comporter de manière inattendue selon :
Cela signifie qu'un canari proxy échoué ne signifie pas toujours que le chemin de détournement sous-jacent est impossible.
--verify-load)Une vérification optionnelle, pour utilisateur standard, qui se situe entre le pipeline de filtrage et la phase canari. Pour chaque candidat applicable, elle écrit brièvement une DLL sonde bénigne à la position de détournement inscriptible, puis demande au vrai chargeur Windows — dans un processus enfant de courte durée — de résoudre la DLL par nom. Là où le chargeur résout détermine le verdict :
.local/ordre de recherche pour ntdll.dll que KnownDLLs rend inexploitable).Notes de conception et de sécurité :
LOAD_LIBRARY_SEARCH, donc il n'est appliqué qu'aux candidats Fantôme / Ordre de recherche / Chargement latéral. Les candidats .local, PATH et AppInit/AppCert utilisent des mécanismes différents et sont signalés comme Ignorés.# Triage utilisateur standard avec ordre de recherche vérifié par le chargeur (pas de canari, pas d'ETW)
.\DLLHijackHunter.exe --lpe-only --no-canary --no-etw --verify-load
git clone https://github.com/ghostvectoracademy/DLLHijackHunter.git
cd DLLHijackHunter
# Build (fichier unique autonome)
dotnet publish src/DLLHijackHunter/DLLHijackHunter.csproj `
-c Release -r win-x64 --self-contained `
-p:PublishSingleFile=true -o ./publish
# Ou utilisez le script de build
.\build.ps1
# Analyse agressive complète (recommandé, nécessite admin)
.\DLLHijackHunter.exe --profile aggressive
# Analyse sûre (aucun dépôt de fichier, aucun déclenchement)
.\DLLHijackHunter.exe --profile safe
# Analyse ciblée sur le contournement UAC
.\DLLHijackHunter.exe --profile uac-bypass
# Cibler un binaire spécifique
.\DLLHijackHunter.exe --target "C:\Program Files\MyApp\app.exe"
# Cibler par nom de fichier (correspondance partielle)
.\DLLHijackHunter.exe --target notepad.exe
# Résultats confirmés uniquement
.\DLLHijackHunter.exe --profile redteam --format json -o report.json
DLLHijackHunter — Détection automatisée de détournement de DLL
Options :
-p, --profile <profile> Profil d'analyse [défaut : aggressive]
aggressive | strict | safe | redteam | uac-bypass
-o, --output <path> Chemin du fichier de sortie (détection automatique du format)
-f, --format <format> Format de sortie [défaut : console]
console | json | html
-t, --target <target> Cibler un binaire, un répertoire ou un nom de fichier spécifique
--min-confidence <value> Seuil de confiance minimum 0-100. Lorsqu'omis, le seuil de
chaque profil s'applique ; le passer écrase celui-ci.
--no-canary Désactiver la confirmation par canari
--no-etw Désactiver la découverte d'exécution ETW
--verify-load Vérifier l'ordre de recherche avec le vrai chargeur (voir ci-dessous).
Utilisateur standard ; écrit de manière transitoire une sonde bénigne.
--confirmed-only Afficher uniquement les résultats confirmés par canari
--lpe-only Chasse LPE stricte : ignorer System32/Program Files, afficher
uniquement les vulnérabilités inscriptibles par utilisateur standard
--log-file <path> Écrire un journal d'analyse de diagnostic dans un fichier
-v, --verbose Sortie verbeuse
Note :
--min-confidencen'est traité comme un remplacement que lorsque vous le passez explicitement. Sinon, le seuil du profil sélectionné est utilisé (par ex.safe= 50 %,strict= 80 %).
Chaque résultat reçoit des signaux de confiance et d'impact qui sont combinés en un niveau de priorisation final.
Les considérations d'impact typiques incluent :
L'exécution confirmée du canari doit être traitée comme le signal de validation le plus fort.
Plafonnement par niveau : les niveaux Élevé et Confirmé sont réservés aux résultats soutenus par un signal de preuve — un canari déclenché, une observation de chargement d'exécution ETW ou une correspondance documentée avec la base de connaissances. Une correspondance d'ordre de recherche purement statique, aussi propre soit-elle, est plafonnée en haut du niveau Moyen et annotée Statique uniquement afin que les heuristiques non vérifiées ne se présentent jamais comme à haute confiance.
Parce que l'inscriptibilité est évaluée relative à l'attaquant, les exécutions élevées et utilisateur standard sont toutes deux significatives :
--lpe-only (et --no-canary si un compilateur n'est pas disponible) — chaque résultat survivant est réellement inscriptible par un principal non privilégié.DLLHijackHunter est conçu pour la recherche en sécurité défensive, la validation en laboratoire, l'audit et la simulation d'équipe rouge dans des environnements autorisés.
Utilisez-le uniquement sur des systèmes et réseaux que vous possédez ou pour lesquels vous êtes explicitement autorisé à évaluer.
DLLHijackHunter prend en charge :
Flux de travail recommandé :
MIT
Développé par ProjectMerai.
| Type | Description | Furtivité | Statut |
|---|
| Fantôme | La DLL n'existe nulle part sur le disque | Élevée | Implémenté |
| Ordre de recherche | Placer la DLL plus tôt dans l'ordre de recherche Windows | Élevée | Implémenté |
| Chargement latéral | Abuser du chargement par une application légitime de DLL depuis son répertoire | Élevée | Implémenté (chemin AutoElevate copie-vers-temp) |
| Redirection .local | Détournement via la redirection de répertoire .local | Élevée | Implémenté |
| PATH d'environnement | Exploitation de répertoires inscriptibles dans le PATH système | Élevée | Implémenté (carte service/DLL organisée) |
| DLL AppInit | Abus de la clé de registre AppInit_DLLs | Faible | Implémenté |
| DLL AppCert | Abus de la clé de registre AppCertDLLs (chargée dans chaque appelant CreateProcess/WinExec) | Faible | Implémenté |
| CWD | Détournement du répertoire de travail courant | Faible | Prévu — actuellement non produit par aucun chemin de découverte |
| Fonctionnalité | DLLHijackHunter | Robber | DLLSpy | WinPEAS | Procmon |
|---|
| Découverte automatisée | ✅ | ✅ | ✅ | ✅ | ❌ |
| Détection de DLL fantôme | ✅ | ❌ | ✅ | ❌ | ✅ |
| Analyse de l'ordre de recherche | ✅ | ❌ | ❌ | ❌ | ❌ |
| Vérification d'inscriptibilité ACL | ✅ | Partielle | ❌ | Basique | ❌ |
| Surveillance temps réel ETW | ✅ | ❌ | ❌ | ❌ | ✅ |
| Confirmation par canari | ✅¹ | ❌ | ❌ | ❌ | ❌ |
| Vérification d'élévation de privilèges | ✅ | ❌ | ❌ | ❌ | ❌ |
| Découverte de contournement UAC | ✅ | ❌ | ❌ | ❌ | ❌ |
| Réduction des faux positifs | ✅² | Aucune | Basique | Aucune | Aucune |
| Vérification de persistance au redémarrage | ✅³ | ❌ | ❌ | ❌ | ❌ |
| Génération de DLL proxy | ✅⁴ | ❌ | ❌ | ❌ | ❌ |
| Notation de confiance | ✅ | ❌ | ❌ | ❌ | ❌ |
| Déclenchement automatique (svc/tâche/COM) | ✅⁵ | ❌ | ❌ | ❌ | ❌ |
| Rapports HTML/JSON | ✅ | ❌ | ❌ | TXT | ❌ |
| Corrélation de renseignements sur les menaces | ✅⁶ | ❌ | ❌ | ❌ | ❌ |
| Exploits PATH automatisés | ✅ | ❌ | ❌ | ❌ | ❌ |
| Analyse ciblée spécifique | ✅ | ❌ | ❌ | ❌ | ✅ |
| Binaire autonome | ✅ | ❌ | ❌ | ✅ | ❌ |
| Profil | Cas d'utilisation | Canari | ETW | Contournement UAC | Confiance min. | Déclencheurs |
|---|
| aggressive | Audit complet, environnements de laboratoire | ✅ | ✅ | ✅ | 15 % | Services, tâches, COM |
| strict | Résultats à haute confiance uniquement | ✅ | ✅ | ❌ | 80 % | Services, tâches |
| safe | Systèmes de production, lecture seule | ❌ | ❌ | ❌ | 50 % | Aucun |
| redteam | Exploitable confirmé uniquement | ✅ | ✅ | ❌ | 50 % | Services, tâches, COM |
| uac-bypass | Vecteurs de contournement UAC uniquement | ❌ | ❌ | ✅ | 20 % | AutoElevate uniquement |