
Implant Windows qui vole les identifiants RDP via le hooking d'API (Detours) et l'injection de DLL, capturant les noms d'utilisateur et mots de passe dans un fichier pour la post-exploitation en équipe rouge.
RDPCredentialStealer est un implant qui vole les identifiants fournis par les utilisateurs dans RDP en utilisant le hooking d'API avec Detours en C++
Essayons ceci :
Tout d'abord, je transfère la DLL du dépôt GitHub vers le chemin C:\Users\Public\Music :

Maintenant, j'ouvre une application Windows de connecteur RDP :

Et maintenant, j'exécute l'EXE présent dans le dépôt GitHub :

Et lorsque j'essaie d'accéder à un serveur rdp :

Je saisis l'utilisateur : s12User et le mot de passe : passwdtest
Et maintenant, je vérifie le fichier : C:\Users\Public\Music\RDPCreds.txt

RDPCredStealerDLL:
Ce code est une implémentation d'une technique de hooking en C++ utilisant la bibliothèque Detours. Il cible spécifiquement la fonction CredUnPackAuthenticationBufferW de la bibliothèque credui.dll, qui est responsable du dépaquetage des tampons d'authentification utilisés dans les opérations d'identification.
Décortiquons le code étape par étape : Les fichiers d'en-tête nécessaires sont inclus, tels que windows.h, wincred.h, detours.h, et d'autres. Un type de pointeur de fonction CredUnPackAuthenticationBufferW_t est défini, représentant la signature de la fonction originale CredUnPackAuthenticationBufferW. Le pointeur de fonction pCredUnPackAuthenticationBufferW est déclaré, qui sera utilisé pour stocker l'adresse de la fonction originale.
La fonction MyCredUnPackAuthenticationBufferW est implémentée, servant de hook pour la fonction originale. Elle est appelée lorsque la fonction hookée est invoquée. Cette fonction appelle d'abord la fonction originale en utilisant le pointeur de fonction stocké pCredUnPackAuthenticationBufferW. Ensuite, elle convertit le nom d'utilisateur et le mot de passe récupérés de chaînes larges (LPWSTR) en chaînes encodées en UTF-8 (std::string).
Enfin, elle ouvre un fichier en mode ajout et y écrit le nom d'utilisateur et le mot de passe.
La fonction DllMain sert de point d'entrée pour la DLL de hooking. Elle est appelée lorsque la DLL est chargée ou déchargée. Lorsque ul_reason_for_call est DLL_PROCESS_ATTACH, indiquant que la DLL est en cours de chargement, elle charge la bibliothèque credui.dll avec LoadLibraryA.
Ensuite, elle obtient l'adresse de la fonction originale CredUnPackAuthenticationBufferW en utilisant GetProcAddress. En cas de succès, elle démarre le processus de hooking en appelant DetourTransactionBegin, DetourUpdateThread et DetourAttach. Lorsque ul_reason_for_call est DLL_PROCESS_DETACH, indiquant que la DLL est en cours de déchargement, elle inverse le processus de hooking en appelant DetourTransactionBegin, DetourUpdateThread et DetourDetach.
Le but de ce code est de hooker la fonction CredUnPackAuthenticationBufferW et d'intercepter les identifiants qui lui sont transmis, permettant ainsi au code de hooking d'extraire et d'enregistrer le nom d'utilisateur et le mot de passe dans un fichier. Cette technique peut être utilisée de manière malveillante pour capturer des informations sensibles telles que les identifiants RDP, ce qui constitue un problème de sécurité important.
Inject.h
Ce code fournit des fonctions pour injecter une DLL (Dynamic Link Library) dans un processus cible sur le système d'exploitation Windows. Décortiquons le code et comprenons ses fonctionnalités :
Les fichiers d'en-tête nécessaires sont inclus, tels que windows.h, stdio.h et tlhelp32.h. Ces en-têtes fournissent les fonctions et les types de données requis pour interagir avec l'API Windows.
La fonction getPIDbyProcName prend un nom de processus en entrée et renvoie l'ID de processus (PID) correspondant. Elle utilise la fonction CreateToolhelp32Snapshot pour créer un instantané des processus en cours, puis parcourt l'instantané à l'aide des fonctions Process32FirstW et Process32NextW pour trouver le processus dont le nom correspond. Si trouvé, elle renvoie l'ID du processus ; sinon, elle renvoie 0.
La fonction DLLinjector prend un ID de processus (pid) et un chemin de DLL en entrée. Elle injecte la DLL spécifiée dans le processus cible. Voici comment cela fonctionne : a. Elle ouvre le processus cible avec OpenProcess et le flag PROCESS_ALL_ACCESS. b. Elle récupère le handle du module Kernel32 avec GetModuleHandleW. c. Elle obtient l'adresse de la fonction LoadLibraryW dans Kernel32 avec GetProcAddress. d. Elle alloue de la mémoire dans le processus cible avec VirtualAllocEx. e. Elle écrit le chemin de la DLL dans la mémoire allouée du processus cible avec WriteProcessMemory. f. Elle crée un thread distant dans le processus cible avec CreateRemoteThread et passe l'adresse de LoadLibraryW ainsi que la mémoire allouée comme paramètres. g. Si la création du thread réussit, elle renvoie true, indiquant que l'injection de la DLL a réussi. La fonction main n'est pas fournie dans cet extrait de code. Vous pouvez utiliser ces fonctions dans votre propre application pour injecter une DLL dans un processus cible en fournissant le nom du processus et le chemin de la DLL en entrée.
Veuillez noter que l'injection de DLL est une technique avec diverses applications, incluant à la fois des cas d'utilisation légitimes (comme le débogage et l'extension de fonctionnalités) et des fins malveillantes (comme l'injection de logiciels malveillants ou la modification du comportement d'un processus sans autorisation). Faites preuve de prudence et assurez-vous de disposer des autorisations et des droits légaux appropriés avant d'utiliser de telles techniques.