L'objectif de ce défi est d'explorer un annuaire LDAP afin de dénicher une information confidentielle dissimulée dans les attributs d'un objet. La cible est identifiée par l'adresse IP 10.0.10.56.
Générer un clé API pour l'utiliser par la suite afin de pouvoir télécharger le certificat VPN par la suite.
Après activation du tunnel VPN fourni par la plateforme du challenge.
une première vérification de la connectivité brute est effectuée :
ping -c 3 10.0.10.56
PS Vous pourrez pinger l'IP mais vous n'aurez plus accès à Internet car vous serez dans un réseau isolé après avoir activé le tunnel VPN.
Pour comprendre à quel type de serveur LDAP nous faisons face, nous interrogeons la racine de l'annuaire (Root DSE) afin de récupérer les contextes de nommage (Naming Contexts) :
ldapsearch -x -H ldap://10.0.10.56 -s base -b "" namingContexts defaultNamingContext
Retour du serveur :
defaultNamingContext: DC=ctfcorp,DC=local namingContexts: DC=ctfcorp,DC=local
L'analyse de cette réponse indique que la cible n'est pas un simple serveur LDAP générique, mais un contrôleur de domaine Active Directory (AD) dont la racine exacte est DC=ctfcorp,DC=local.
Les serveurs Active Directory rejettent fréquemment les requêtes globales anonymes ou basées uniquement sur une adresse IP sans point d'entrée valide, provoquant des erreurs de type NameErr: DSID-0310021F (NO_OBJECT).
Pour s'aligner sur la configuration attendue par le serveur, il est nécessaire d'associer l'adresse IP au nom de domaine interne de l'infrastructure.
Modification du fichier /etc/hosts de la machine d'attaque :
sudo nano /etc/hosts
Ajout de la ligne suivante :
10.0.10.56 ctfcorp.local
Une fois le domaine résolu et le véritable Base DN identifié, nous exécutons une requête de recherche sur l'ensemble de l'arborescence (-b "DC=ctfcorp,DC=local"). Le filtre (objectClass=*) permet d'extraire tous les objets sans distinction La liste serais trop long pour pouvoir voir le flag donc je vais ajouter l’argument grep à ma commande.
Pour isoler directement la chaîne du flag, la sortie est filtrée via grep :
ldapsearch -x -H ldap://ctfcorp.local -b "DC=ctfcorp,DC=local" "(objectClass=*)" | grep "404CTF"
Résultat obtenu :
description: Joueurs 404CTF 2026
description: 404CTF{M4r13_Cur13_3st_Un3_Pr0!}
sn: 404CTF Player
displayName: 404-debug - 404CTF Player
L'information cachée se trouvait dans l'attribut description d'un compte utilisateur nommé 404-debug.
404CTF{M4r13_Cur13_3st_Un3_Pr0!}