Offline zmena SID History

24. mája 2015 | Michael Grafnetter

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?

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:

Výsledok je potom nasledovný:

Sid History

Príkaz je súčasťou PowerShell modulu DSInternals, ktorý nájdete v sekcii Na stiahnutie. 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.

Tags: , , ,

2 comments on “Offline zmena SID History

  1. Ondrej Zilinec píše:

    Ahoj, pekny clanok. Vyskusam danu aplikaciu a dam vediet 🙂

  2. Kraus píše:

    hezký modul, ale při pokusu o zapsání sidHistory dle tohoto návodu dává zpravu The database comes from a different OS. Try defragmenting it first by running the ‚esentutl /d
    ntds.dit‘ command.
    Použito v testovacím prostředí na W2012R2 vše v defaultním nastavení.
    Po použití esentutl , funguje OK.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená.