
BOF pour usurper TrustedInstaller via déclenchement de l'API DISM et usurpation de thread
BOF pour usurper l'identité de TrustedInstaller via le déclenchement de l'API DISM et l'usurpation de thread.
Élève un Beacon Cobalt Strike d'un contexte administrateur vers NT AUTHORITY\SYSTEM avec le SID NT SERVICE\TrustedInstaller dans les groupes du jeton. Cela vous donne la possibilité de modifier des fichiers, des clés de registre et d'autres objets qui sont la propriété de TrustedInstaller (c'est-à-dire des choses pour lesquelles le simple fait d'avoir SYSTEM peut ne pas suffire).
La plupart des approches publiques pour devenir TrustedInstaller démarrent le service TrustedInstaller directement via le Gestionnaire de contrôle des services (par exemple sc start TrustedInstaller ou StartServiceW). Cela fonctionne, mais interagir avec SCM est bien compris par les défenseurs et couramment journalisé.
trustme adopte une approche différente :
Charge dismapi.dll et exécute une vérification d'intégrité DISM. L'API DISM (DismCheckImageHealth) provoque en interne le démarrage de TrustedInstaller.exe comme effet secondaire des opérations de la pile de maintenance. La session DISM est maintenue ouverte afin que TrustedInstaller ne se ferme pas avant que nous puissions l'utiliser.
Parcourt la liste des processus à l'aide de NtGetNextProcess. Au lieu de OpenProcess ou CreateToolhelp32Snapshot, nous énumérons les handles de processus indirectement via NtGetNextProcess et effectuons une correspondance par nom d'image via NtQueryInformationProcess(ProcessImageFileName).
Usurpe un thread TrustedInstaller via NtImpersonateThread. De même, nous parcourons les threads avec NtGetNextThread plutôt que de les ouvrir par TID. Une fois que nous trouvons un thread utilisable, nous l'usurpons et enregistrons le jeton résultant auprès de Beacon avec BeaconUseToken.
SeDebugPrivilege doit être disponible dans le jeton (c'est le cas par défaut pour les comptes administrateurs, le BOF l'active automatiquement)Vous avez besoin de beacon.h du dépôt bof_template de Cobalt Strike dans le même répertoire que trustme.c.
MinGW (Linux/macOS) :
x86_64-w64-mingw32-gcc -c trustme.c -o trustme.x64.o -masm=intel -Wall
MSVC (Windows, à partir de l'invite x64 Native Tools) :
cl.exe /c /GS- /Fo"trustme.x64.o" trustme.c
trustme.x64.o (et/ou trustme.x86.o) dans le même répertoire que trustme.cnatrustme.cna dans Cobalt Strike via le Script Managerbeacon> trustme
[+] SeDebugPrivilege activé
[*] Vérification d'intégrité DISM terminée, TrustedInstaller devrait être en cours d'exécution
[*] TrustedInstaller.exe trouvé (PID : 31337)
[+] Usurpation de thread réussie (identité : SYSTEM)
[+] Jeton appliqué à la session Beacon
[+] Fonctionne maintenant en tant que TrustedInstaller. Utilisez 'rev2self' pour revenir en arrière.
beacon> shell whoami /groups | findstr TrustedInstaller
NT SERVICE\TrustedInstaller Groupe bien connu S-1-5-80-956008885-... Activé par défaut, Groupe activé, Propriétaire du groupe
beacon> rev2self
Nettoyage. La session DISM est fermée, dismapi.dll est libéré du processus beacon, et les handles sont relâchés. Le jeton d'usurpation persiste dans la session Beacon jusqu'à ce que vous exécutiez rev2self.