Retour à l'accueil
ROOT‑ME · Défi : Service réseau

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é.

ROOT‑ME LDAP null bind ldapsearch Annuaire

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émentValeur
Hôtechallenge01.root-me.org
ProtocoleLDAP
Port54013
Base DNdc=challenge01,dc=root-me,dc=org
Validations17 508 (5%)
Énoncé Root‑Me
Capture d'écran de l'énoncé Root-Me
Le défi « LDAP — null bind » sur Root‑Me (15 pts, niveau facile).

Vocabulaire clé

LDAP
Lightweight Directory Access Protocol — protocole d’interrogation d’annuaires hiérarchiques (utilisateurs, groupes, machines).
DN (Distinguished Name)
Nom unique d’un objet dans l’annuaire, lu de droite à gauche (ex: uid=sabu,ou=anonymous,dc=...).
Bind
Étape d’authentification avant toute lecture. Un bind avec DN vide et mot de passe vide est un null bind (anonyme).
Base DN
Point de départ de la recherche dans l’arbre LDAP.
inetOrgPerson
Classe d’objet standard pour décrire une personne (nom, email, téléphone…).
ldapsearch
Outil en ligne de commande (paquet 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 bindIdentifiantMot de passeDroits
Bind authentifiéDN d’un utilisateurMot de passeSelon 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. »

⚠️ Vulnérabilité : si l’administrateur autorise le bind anonyme et laisse trop d’attributs lisibles, n’importe qui peut énumérer les utilisateurs, emails, groupes… sans compte.

Ordinogramme du null bind

Flux d’une requête LDAP anonyme 1. Client envoie bind avec DN vide et mot de passe vide 2. Serveur LDAP 3. Vérification des autorisations anonymes (ACL) 4. Si ACL permissives → accès en lecture publique 5. Client énumère les entrées (utilisateurs, emails…)

Méthodologie

Installation de l’outil

Installation
# 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 :

Commande
ldapsearch -x -H "ldap://challenge01.root-me.org:54013" -b "dc=challenge01,dc=root-me,dc=org"
Résultat — Accès insuffisant
Capture montrant le résultat Insufficient access
Le serveur accepte le bind anonyme, mais refuse de lister toute la zone. Les ACL bloquent la lecture de la racine.

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 :

Branche cible
ou=anonymous,dc=challenge01,dc=root-me,dc=org

Requête ciblée — la branche anonymous

Commande
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 :

Syntaxe alternative
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

Sortie complète de la requête
Capture de la sortie ldapsearch complète
On découvre la branche ou=anonymous et l’utilisateur sabu.

Extrait de la réponse :

Sortie
# 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
AttributValeurInterprétation
dnuid=sabu,ou=anonymous,...Compte de l’intrus
objectClassinetOrgPersonFiche personne (nom, email…)
uidsabuIdentifiant (référence à Sabu / Anonymous)
mailsabu@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.

Filtrage sur l’email uniquement
Capture montrant le filtre sur l'attribut mail
On peut aussi filtrer directement l’attribut mail avec "(objectClass=inetOrgPerson)" mail.

🏁 Flag

L’adresse email à soumettre est :

Flag final (partiellement masqué)
sabu@***.org

(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

  1. Désactiver le bind anonyme (OpenLDAP) :
    olcDisallows: bind_anon
    olcRequires: authc
  2. ACL restrictives : lecture limitée aux attributs publics nécessaires, jamais userPassword ni données RH.
  3. Ne pas exposer LDAP sur Internet : VPN, firewall, LDAPS (636) uniquement.
  4. 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.

Q1Que signifie « null bind » dans LDAP ?+
→ Une connexion anonyme avec un DN vide et un mot de passe vide.
Q2Quelle option de ldapsearch spécifie la base de recherche ?+
-b
Q3Pourquoi la première requête sur la racine a‑t‑elle échoué ?+
→ Les ACL du serveur bloquent la lecture de la racine, mais pas des sous‑branches.
Q4Quelle classe d’objet est utilisée pour décrire une personne avec un email ?+
inetOrgPerson
Q5Quelle est la principale mesure de sécurité contre ce type de vulnérabilité ?+
→ Désactiver le bind anonyme et restreindre les ACL.