TrollDump
- Injecte une DLL managée x64 dans un processus managé/non managé x64 (le processus doit avoir une interface graphique car nous obtenons son handle de fenêtre) via setwindowshook
- Ici, en tant que TROLL, nous injectons dans la fenêtre masquée de taskmgr pour effectuer un dump de lsass non détecté (voir la section Cas de test ci-dessous)
- La DLL injecteuse et la DLL injectée sont la même DLL, donc aucune DLL supplémentaire n'est requise
- Le niveau d'intégrité du processus cible doit être identique ou inférieur à celui du processus injecteur
Crédits (amélioration/réécriture du projet)
Projet d'origine : https://github.com/enkomio/ManagedInjector
- porté le code pour injecter dans des binaires 64 bits ---> le projet d'origine ne permet l'injection de DLL que dans des binaires 32 bits
- supprimé la logique IPC car elle était envahissante
- créé un code squelette pour exécuter directement votre payload dans la fonction RunOnRemoteProcess() au lieu de l'ancienne méthode alambiquée
- le projet utilise toujours DLLExport pour faire exporter des fonctions par une DLL .NET
- Notez que ce n'est pas une dépendance du projet mais plutôt un post-traitement. DLLExport modifiera votre DLL .NET finale pour exporter une fonction.
- Vous pouvez faire l'exportation des fonctions manuellement si vous le souhaitez https://blog.xpnsec.com/rundll32-your-dotnet/
Compilation
- Téléchargez le projet et compilez la solution en X64, Release
- Aucune dépendance externe requise
Utilisation
> Requires High Integrity depending on use case
> [System.Reflection.Assembly]::LoadFrom("C:\Users\public\TrollDump.dll")
> [TrollDump.ForFun]::Main("C:\windows\system32\taskmgr.exe")
- Dans cette POC, nous effectuons un dump de lsass, vous pouvez exécuter toute « logique de fonction exportée par la DLL » que vous souhaitez en modifiant la fonction RunOnRemoteProcess() et en recompilant.
- Comme mentionné précédemment, le code sert de squelette pour l'injection de DLL, ce que vous choisissez de faire ensuite peut être aisément écrit en code managé C#.
Cas de test
- Win 2019 build 17763.737 avec les derniers correctifs Windows Defender
- à la fois l'injection de DLL et le dump de lsass
- Autres AV (non nommés)
- l'injection de DLL fonctionne correctement
- évidemment, que le dump de lsass fonctionne ou non dépend de si l'AV autorise taskmgr à dumper lsass
- Non testé sur des EDR -> je soupçonne que l'injection de DLL devrait toujours fonctionner sur certains EDR
OPSEC
- La DLL doit être présente sur le disque, elle doit donc être obscurcie
- La DLL ne doit être utilisée que pour faire l'injection, le payload réel ne doit jamais être intégré dans la DLL et doit être chargé de manière réflective
- Évidemment, injecter le CLR dans un processus non managé est suspect, mais bon !
- setwindowshook, bien qu'étant une technique classique, est le plus souvent associé au keylogging, pas à notre cas d'utilisation
- On peut être très créatif avec le processus GUI dans lequel on souhaite injecter (si lancé en tant que système, on peut aussi injecter dans dwm.exe)
Liste de souhaits - Le projet a été réalisé pendant le week-end et je n'ai ni le temps ni l'intention de poursuivre ce qui suit :
- Injecter dans un processus sans interface graphique (gui-less)
- actuellement pour setwindowshook, cela utilise WH_CALLWNDPROC, vous pouvez le modifier pour utiliser WH_GETMESSAGE mais le processus cible doit exécuter une boucle de messages (GetMessage())
- si vous pouvez trouver un binaire non GUI qui implémente une boucle de messages (je soupçonne que c'est peu probable), vous pouvez alors aussi injecter dans des binaires sans GUI
- il est courant que les processus GUI exécutent GetMessage()
- Entièrement réflectif et sans nécessité de le déposer sur le disque
- Sur la base de setwindowshook, il semble que la DLL doive être sur le disque ?
- j'ai essayé d'utiliser des délégués C# pour passer un pointeur de fonction à exécuter à la place de la fonction exportée de la DLL et cela n'a pas fonctionné (c'est la technique classique de keylogger en C# pour un processus local, mais nous faisons un processus distant)
- vous pouvez essayer en intégrant d'autres techniques, je pense que c'est faisable
- Taskmgr se lancera automatiquement en High Integrity même si notre processus actuel est Medium (donc techniquement, si nous injectons une DLL dedans, c'est un contournement de l'UAC)
- L'injection semble bien fonctionner selon les résultats de retour de l'API WIN
- Cependant, taskmgr ne parvient pas à appeler la fonction exportée
Avertissement
Ne doit être utilisé qu'à des fins éducatives !