Spôsobov, ako sa dá hacknúť doménový kontrolér, ak útočník získa fyzický prístup k jeho systémovému disku, existuje veľa. Za zmienku stojí napríklad podvrhnutie SID History, o ktorom som nedávno písal, alebo notoricky známe nahradenie nástroja Klávesnica na obrazovke príkazovým riadkom. Zo všetkých druhov útokov sa mi najviac páči offline úprava Active Directory databázy. Možnosť takéhoto zásahu do DC je známa už dávno, veď aj kvôli tomu vznikla funkcia Read-Only Domain Controller. Na druhú stranu, keďže je štruktúra Active Directory databázy veľmi komplikovaná a takmer nulovo zdokumentovaná, neexistujú skoro žiadne verejne dostupné nástroje pomocou ktorých by sa dal takýto útok realizovať. Tie, ktoré poznám, sa výhradne sústredia na už spomínanú úpravu SID History. Preto som sa rozhodol vytvoriť powershellovský príkaz Set-ADDBPrimaryGroup, ktorý slúži na offline zmenu členstva v skupinách.

VAROVANIE: Funkcionalita modulu DSInternals nie je podporovaná firmou Microsoft a preto nie je určený pre produkčné nasadenie. Jeho nesprávne použitie môže spôsobiť nevratné poškodenie doménového kontroléru alebo negatívne ovplyvniť bezpečosť domény.

Realizácia útoku

Predpokladajme, že v AD už máme neprivilegovaný účet, napríklad April, ktorý je členom skupiny Domain Users a my by sme ho radi zaradili do skupiny Domain Admins. To môžeme spraviť dvomi cestami, buď modifikáciou atribútu member na skupine alebo atribútu primaryGroupId na používateľskom účte. Ja som si zvolil tú druhú možnosť, pretože je jednoduchšia.

Potrebujeme ešte poznať RID cieľovej skupiny. Z dokumentácie ľahko dohľadáme, že skupina Domain Admins má RID 512, Domain Users 513 a Domain Controllers 516. Použiť by sme samozrejme mohli RID ľubovoľnej globálnej a univerzálnej skupiny, ktorá je v doméne účtu April.

Na zapnutom DC nám potom stačí spustiť túto sekvenciu príkazov:

Import-Module .\DSInternals
Stop-Service ntds -Force
$db = 'C:\Windows\NTDS\ntds.dit'
Set-ADDBPrimaryGroup -DBPath $db -SamAccountName 'April' -PrimaryGroupId 512 -Verbose
Start-Service ntds

Výsledok môžeme overiť pohľadom do konzole Active Directory Users and Computers:

primary_group

Pri offline prístupe na disk (boot z flashky či pripojenie HDD/VHD do iného PC) samozrejme nie sú nutné príkazy na zastavenie a spustenie služby Active Directory Domain Services (ntds).

Po nábehu služby ntds sa zmena členstva v skupinách automaticky zreplikuje na ostatné doménové kontroléry. Pokiaľ to nie je žiadúce chovanie, stačí spustiť príkaz Set-ADDBPrimaryGroup s prepínačom -SkipMetaUpdate a zmena ostane len na napadnutom DC. Zníži sa tým šanca na odhalenie útoku.

Poznámky

  • Príkaz Set-ADDBPrimaryGroup vie vyhľadať účty používateľov a počítačov na základe loginu, SIDu, GUIDu a LDAP distinguished name (DN).
  • Existencia RIDu skupiny zatiaľ nie je kontrolovaná. Je tak možné zadať akékoľvek číslo od 1 do 230. Nepodporuje tak novú funkciu Windows Server 2012, ktorá umožňuje odomknúť 31. bit, ale to snáď nikto nebude potrebovať.
  • Príkaz k svojmu behu vyžaduje aspoň PowerShell 3.
  • Úprava súboru ntds.dit je možná len z tej istej verzie Windows (napríklad 6.1), z ktorej pochádza tento súbor. Je to spôsobené tým, že každá nová verzia Windows mierne upravuje formát ESE databázy. Riešením by bolo distribuovať s mojiím PowerShell modulom aj rôzne verzie systémovej knižnice esent.dll, ale to by bolo hrubé porušenie licenčnýh podmienok.
  • Použitie tohto nástroja je možné výhradne na výskumné a testovacie účely. Neručím za žiadne škody, ktoré by mohli vzniknúť jeho využitím.

Získanie programu

Príkaz Set-ADDBPrimaryGroup je súčasťou poslednej verzie môjho PowerShell modulu DSInternals, ktorý si môžete bezplatne stiahnuť.