Jedným z možných útokov na bezpečnosť Active Directory je podvrhnutie SID History. V Microsofte sú si toho plne vedomí a preto sú v Active Directory implementované 2 mechanizmy, ktoré zabraňujú efektívnemu zneužitiu SID History:

  • Hodnoty atribútu sIDHistory prichádzajúce z externých trustov sú vo východzom stave ignorované vďaka funkcii SID Filtering.
  • Atribút sIDHistory sa nedá len tak zmeniť na ľubovoľnú hodnotu ani pomocou konzoly Active Directory Users and Computers, ani cez PowerShell či nejaké API. Jediný podporovaný spôsob je použitie nástroja ADMT, ktorý vie prekopírovať existujúci SID z dôverovanej domény do SID History v dôverujúcej doméne.

Ako však zapísať do SID History akúkoľvek hodnotu a obísť tak druhý z uvedených mechanizmov?

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.

Existujúce riešenia

Možností je niekoľko a žiadna z nich nie je ideálna:

  1. Pridanie Samba 4 DC
    • Postup:
      1. Pridať do domény linuxový Samba 4 doménový kontrolér.
      2. Manuálne upraviť SID History v jeho LDAP databáze.
      3. Prereplikovať z neho túto zmenu na Windows Server doménový kontrolér.
      4. Odobrať linuxový doménový kontrolér z domény.
    • Nevýhody:
      • Nutnosť pridať nový DC, čo je nemalý zásah do domény a určite neostane bez povšimnutia.
      • Replikácia so Samba 4 nie vždy zafunguje úplne bezchybne, hlavne s najnovším Windows Server. To so sebou nesie riziko poškodenia doménových dát a preto toto riešenie nie je vhodné do produkcie.
  2. Offline úprava Active Directory databázy
    • Postup:
      1. Zastaviť službu Active Directory Domain Services.
      2. Zapísať hodnotu sIDHistory priamo do databázy (tzn. súboru ntds.dit) pomocou nástroja SHEdit alebo ESEAddSidHistory.
      3. Urobiť autoritatívne obnovenie dotknutých objektov.
      4. Znovu spustiť službu Active Directory Domain Services.
    • Nevýhody:
      • Tieto nástroje vedia vyhľadávať používateľov podľa GUID, ale už nie podľa loginu či LDAP cesty.
      • Prvý z nich podporuje maximálne Windows Server 2003.
      • Nevedia do SID History zapísať viac hodnôt.
      • Neupravia replikačné metadáta.
      • Hodnotu SID History im treba zadať v binárnej podobe.
      • K zmenám nepoužívajú východzí tranzakčný log, ale vytvoria si nový log v tempe.
      • Občas poškodia databázu.
  3. Online hack pomocou nástroja Mimikatz
    • Postup:
      1. Na bežiacom DC pustiť pod správcovským účtom mimikatz.
      2. Prideliť procesu právo na neobmedzený prístup do pamäte pomocou príkazu privilege::debug.
      3. Spustiť príkaz misc::addsid so správnymi parametrami.
    • Nevýhody:
      • Neumožňuje zapísať do SID History ľubovoľnú hodnotu, ale len SID existujúceho účtu vo foreste.
      • Vyžaduje lokálnu operáciu na spustenom DC.
      • Jeho funkcionalita je postavená na binárnom opatchovaní pamäte procesu lsass tak, aby funkcia DsAddSidHistory nevyžadovala prístupové údaje do domény, z ktorej sa kopíruje SID. To pravdepodobne prestane fungovať s najbližšou aktualizáciou, ktorá sa bude týkať Active Directory. Nehovoriac o tom, že takýto zásah zásah môže v lepšom prípade zhodiť DC, v tom horšom ho poškodiť.

Moje riešenie

Keďže všetky dostupné riešenia majú zásadné nedostatky, rozhodol som sa naprogramovať vlastný nástroj, Add-ADDBSidHistory, ktorý tiež robí offline modifikáciu databázy a má tieto vlastnosti:

  • Je spravený ako PowerShell 3+ príkaz a podporuje vstup cez pipeline.
  • Umožňuje do SID History zapísať ľubovoľnú hodnotu. Nové hodnoty SID History sú pridané k existujúcim, ak nie sú duplicitné.
  • Bezpečnostné objekty (používateľov, počítače a skupiny) vie vyhľadať na základe atribútov objectSid, objectGUID, sAMAccountName a distinguishedName. Pri vyhľadávaní na základe sAMAccountName odfiltruje zmazané a read-only objekty (kvôli GC). Ďalej využíva indexy, takže pracuje rýchlo aj nad databázou so 150K+ objektami.
  • Upraví replikačné metadáta (atribúty uSNChanged, whenChanged, replPropertyMetaData a globálny čítač HighestCommittedUsn). Toto východzie chovanie sa dá zmeniť pomocou prepínača -SkipMetaUpdate.
  • Umožňuje zadať cestu k tranzakčným logom, pokiaľ nie sú uložené v databázovom adresári.
  • Vie sa zotaviť z chybových stavov vďaka využitiu tranzakcií.
  • Príkaz funguje na Windows Server 2012 R2 a 2008 R2.

Príklad použitia:

Import-Module .\DSInternals
Stop-Service ntds -Force
Add-ADDBSidHistory -SamAccountName April -SidHistory 'S-1-5-21-1868298443-3554975232-1738066521-500' -DBPath 'C:\Windows\NTDS\ntds.dit'
Start-Service ntds

Výsledok je potom nasledovný:

Sid History

Príkaz je súčasťou PowerShell modulu DSInternals, ktorý nájdete v sekcii Projekty. Budem rád za akúkoľvek spätnú väzbu.

POZOR: Pred akýmkoľvek zásahom do AD databázy ju vždy najprv odzálohujte!

Plánované funkcie

Mám rozpracované aj ďalšie príkazy na offline manipuláciu s Active Directory databázou. Budú mať tieto možnosti:

  • Úprava používateľského atribútu primaryGroupId.
  • Autoritatívny restore objektov na úrovni jednotlivých atribútov.
  • Audit prítomnosti LM hashov, Kerberos DES/AES kľúčov a reverzibilne šifrovaných hesiel.
  • Výpis vlastností databázy, napríklad názov DC, doména, site, Invocation ID, DSA Epoch, highest commited USN,…
  • Výpis mapovania indexov na atribúty, napríklad INDEX_0015003 -> mail. To sa potom bude dať plne zužitkovať príkaz ntdsutil space usage.
  • Odstránenie niektorých závislostí, aby bolo možné príkazy spúšťať pod Windows PE 5.