LDAP — null bind
Catégorie : Service réseau — Points : 15 — Difficulté : ⭐ (1/5) — Auteur : g0uZ (26 mai 2013)
Rédigé par SPECTRA MZ — exploitation d’un bind anonyme LDAP mal configuré.
Présentation du challenge
📜 ÉNONCÉ OFFICIEL
L'administrateur a besoin de vous, il semblerait qu'un des anonymous se soit installé dans une nouvelle branche de l'annuaire LDAP ; quelque part dans :
dc=challenge01,dc=root-me,dc=org
Retrouvez un accès à ses données et ramenez son adresse email.
| Élément | Valeur |
|---|---|
| Hôte | challenge01.root-me.org |
| Protocole | LDAP |
| Port | 54013 |
| Base DN | dc=challenge01,dc=root-me,dc=org |
| Validations | 17 508 (5%) |
Vocabulaire clé
uid=sabu,ou=anonymous,dc=...).ldap-utils) pour interroger un serveur LDAP.Théorie du bind LDAP
Principe
Avant de lire l’annuaire, le client doit s’authentifier : c’est le bind.
| Type de bind | Identifiant | Mot de passe | Droits |
|---|---|---|---|
| Bind authentifié | DN d’un utilisateur | Mot de passe | Selon les ACL |
| Null bind (anonyme) | "" (vide) | "" (vide) | Lecture publique (si mal configuré) |
La RFC 4513 précise : « A Bind request with a name of zero length and a password of zero length establishes an anonymous authorization state. »
Ordinogramme du null bind
Méthodologie
Installation de l’outil
# Fedora sudo dnf install openldap-clients # Debian / Kali sudo apt install ldap-utils
Première tentative — base donnée dans l’énoncé
On se connecte en null bind (-x sans -D/-w = anonyme) et on interroge la racine indiquée :
ldapsearch -x -H "ldap://challenge01.root-me.org:54013" -b "dc=challenge01,dc=root-me,dc=org"
Résultat : result: 50 Insufficient access — il faut viser une branche plus précise.
La clé est dans l’énoncé
Relisons bien :
« un des anonymous se soit installé dans une nouvelle branche »
En LDAP, une branche = une Organizational Unit (ou=). L’OU s’appelle donc très probablement :
ou=anonymous,dc=challenge01,dc=root-me,dc=org
Requête ciblée — la branche anonymous
ldapsearch -x -H "ldap://challenge01.root-me.org:54013" -b "ou=anonymous,dc=challenge01,dc=root-me,dc=org"
Équivalent avec la syntaxe -h / -p :
ldapsearch -x -h challenge01.root-me.org -p 54013 -D '' -w '' -b "ou=anonymous,dc=challenge01,dc=root-me,dc=org"
Cette fois, le serveur répond avec succès.
Analyse des réponses
ou=anonymous et l’utilisateur sabu.Extrait de la réponse :
# anonymous, challenge01.root-me.org dn: ou=anonymous,dc=challenge01,dc=root-me,dc=org objectClass: organizationalUnit ou: anonymous # sabu, anonymous, challenge01.root-me.org dn: uid=sabu,ou=anonymous,dc=challenge01,dc=root-me,dc=org objectClass: inetOrgPerson objectClass: shadowAccount uid: sabu mail: sabu@anonops.org
| Attribut | Valeur | Interprétation |
|---|---|---|
| dn | uid=sabu,ou=anonymous,... | Compte de l’intrus |
| objectClass | inetOrgPerson | Fiche personne (nom, email…) |
| uid | sabu | Identifiant (référence à Sabu / Anonymous) |
sabu@anonops.org | 🏁 L’adresse demandée |
L’intrus s’est créé une fiche inetOrgPerson dans sa propre OU, lisible en anonyme. L’email est en clair.
mail avec "(objectClass=inetOrgPerson)" mail.🏁 Flag
L’adresse email à soumettre est :
(Le flag complet est sabu@anonops.org ; les astérisques masquent la partie anonops pour préserver l’intérêt du challenge.)
Validez cette adresse sur la page du challenge Root‑Me.
Impact et remédiation
Impact
Un null bind trop permissif permet d’énumérer :
- Comptes et emails (phishing, credential stuffing) ;
- Groupes et structure interne de l’organisation ;
- Parfois des attributs sensibles (
userPassword, descriptions, téléphones).
Corrections
- Désactiver le bind anonyme (OpenLDAP) :
olcDisallows: bind_anon olcRequires: authc
- ACL restrictives : lecture limitée aux attributs publics nécessaires, jamais
userPasswordni données RH. - Ne pas exposer LDAP sur Internet : VPN, firewall, LDAPS (636) uniquement.
- Auditer :
ldapsearch -x -H ldap://ton-serveur -b "dc=..." "(objectClass=*)"depuis l’extérieur doit échouer.
Quiz – Validation des acquis
Clique sur une question pour révéler la réponse.
ldapsearch spécifie la base de recherche ?+-binetOrgPerson