Cet article va détailler la méthodologie permettant l’obtention de compte du domaine Active Directory par attaque de rétro-passage LDAP sur des imprimantes.

Note : Cet article est aussi disponible en anglais 🇬🇧.

Objectif 🥅

Dans le contexte d’un test d’intrusion d’infrastructure interne où l’auditeur n’aurait pas réussi à obtenir un compte du domaine Active Directory (AD), — attaque MitM infructueuse, pas d’énumération anonyme via LDAP / SMB… — l’attaque par rétro-passage LDAP peut permettre de récupérer un premier accès à l’AD.

Concept 💡

Un scénario mettant en œuvre un telle attaque pourrait être le suivant :

  1. Scan réseau à la recherche d’imprimantes ;
  2. Des WebUIs avec le compte par défaut sont présentes (très probable) et permettent donc à l’attaquant d’accéder à l’interface d’administration de l’imprimante ;
  3. Un compte LDAP est configuré (moyennement probable) afin de permettre l’utilisation de fonctionnalités telles que l’annuaire de contact (envoie par courriel à l’adresse désignée du document numérisé) ;
  4. Le mot de passe du compte LDAP n’est pas affiché (très probable) ;
  5. L’attaquant va modifier l’adresse IP du serveur LDAP pour la remplacer par celle d’une machine sous son contrôle ;
  6. L’attaquant va faire en sorte de déclencher une tentative de connexion ;
  7. L’imprimante va alors envoyer les identifiants du compte LDAP à la machine sous le contrôle de l’attaquant.

La problématique de l’écoute 👂

Approche naïve — pas de négociation, pas de chocolat 🍫

D’aucun pourrait naïvement supposer, qu’il suffit de positionner un connecteur réseau en écoute pour recevoir lesdits identifiants à l’aide d’outils comme netcat ou ncat.

sudo ncat -lvp 389

Une très vieille imprimante, une imprimante fâcheusement vulnérable ou mal configurée pourrait utiliser un algorithme d’authentification LDAP rudimentaire et envoyer les identifiants en clair directement, mais cela est heureusement peu répandu et c’est de moins en moins le cas. Dans un tel cas, l’utilisation d’un connecteur réseau pourrait suffire.

Toutefois, cela sera insuffisant dans une grande majorité des cas. En effet, comme nous le verrons par la suite, il existe de nombreuses méthodes d’authentification LDAP. Si celle configurée par défaut dans l’imprimante n’est pas une méthode simple alors les seules données que nous recevrons seront probablement une tentative de négociation d’algorithmes. Par exemple, dans le cadre de SASL, la négociation échouera et nous n’aurons aucun identifiant à nous mettre sous la dent.

écoute simple à l’aide d’un connecteur réseau lorsque l’authentification SASL est utilisée

Il est aisément concevable qu’un simple connecteur réseau ne permettra pas d’émuler ou d’implémenter le protocole d’authentification LDAP et de négocier la méthode d’authentification à utiliser.

Cependant, il est regrettable de constater qu’il existe de très nombreux articles sur internet qui se contentent de s’arrêter à ce point précis — Attaque par rétro-passage LDAP avec nc — alors que celui-ci n’a que très peu de chance de fonctionner en réalité.

Responder : la réponse ? ↪️

Afin d’être plus efficace, le plus intéressant serait d’être en mesure de pouvoir réutiliser un outil faisant office de serveur LDAP.

La bibliothèque Impacket n’offre pas un serveur LDAP. C’est cependant le cas de l’outil responder.

sudo responder -I <interface>

Le serveur LDAP est intégré à responder ainsi que beaucoup d’autres protocoles qui sont automatiquement en écoute au lancement de l’outil et affichent les tentatives d’authentification reçues. Simple et efficace me direz-vous ? Si vous me le permettez, je vais nuancer votre enthousiasme.

Malheureusement pour nous, la négociation de la méthode d’authentification va fonctionner correctement et aboutir à l’utilisation d’un mécanisme sûr.
En résultera que nous ne récupérerons que l’empreinte d’un défi d’authentification et non pas un mot de passe en clair.

Par exemple, nous récupérons une empreinte NTLVMv1-SSP.

capture d’une empreinte NTVMv1-SSP

Il existe plusieurs possibilités :

Mais, ne serait-il pas significativement plus simple de pouvoir récupérer le mot de passe en clair directement ? Question rhétorique, la réponse est évidemment : oui.

Méthodes d’authentification LDAP 🔐

Ma connaissance du protocole LDAP n’étant absolument pas pointue, je ne garantis pas la complétude ou la véracité des informations suivantes.

Pour autant que je sache, on retrouve deux grandes familles de méthodes d’authentification pour LDAP.

La famille SIMPLE, qui n’est pas sécurisée du tout, supporte un mode anonyme et un mode non authentifié, mais cela ne nous intéresse pas, car nous n’aurions pas d’identifiant à récupérer dans ce cas de figure, sans mentionner que si l’AD supportait la connexion anonyme, nous pourrions en profiter pour consulter la base LDAP et tenter des attaques sur les comptes.
Enfin, cette famille comporte aussi un mode envoyant un nom d’utilisateur et un mot de passe. Ce qui aurait pu nous intéresser si cette famille simple était supportée. Or, il y a de grandes chances que l’imprimante ne supporte pas cette famille par soucis de sécurité, et si c’était le cas, nous aurions pu récupérer le mot de passe en clair avec nc et ne pas avoir besoin de lire cet article rébarbatif jusqu’ici.

L’autre famille est SASL, et là encore l’étendue de mon savoir à ce sujet n’est pas très vaste. Grossièrement, SASL est un cadriciel d’authentification qui permet de « dissocier les mécanismes d’authentification des protocoles d’application, ce qui permet en théorie d’utiliser tout mécanisme d’authentification pris en charge par SASL dans n’importe quel protocole d’application utilisant SASL » (traduction de Wikipedia – SASL).
Sans prendre plus de temps à décrire chaque méthode, voilà ce qu’il faut retenir : nous voulons cibler le mode PLAIN ou LOGIN. Le mode PLAIN permet l’envoie du mot de passe en clair, et le mode LOGIN est une variante obsolète qui a été remplacée par PLAIN.

  • SIMPLE
    • anonyme
    • non authentifié
    • utilisateur / mot de passe
  • SASL
    • GSSAPI
    • Kerberos 5, Kerberos 4
    • NTLM
    • DIGEST-MD5
    • EXTERNAL
    • TLS, IPC
    • PLAIN
    • LOGIN

Nous allons donc essayer de déployer un serveur LDAP qui ne prétendra ne supporter que PLAIN et LOGIN lors de la négociation SASL.

Déploiement d’un serveur LDAP véreux 🐛

D’une part, il existe des solutions comme glauth qui permettent de configurer un serveur LDAP à l’aide d’un simple fichier de configuration INI. Seulement, il est difficile (voir impossible) de configurer une méthode non sécurisée.

D’autre par, il y a bien sûr les vrais serveurs LDAP complets comme OpenLDAP mais qui sont complexes à configurer et déployer.

Nous avons besoin de la puissance de configuration d’OpenLDAP mais nous voudrions la simplicité de déploiement de glauth (pas passer des heures à la configuration et à pourrir notre système).

Fort heureusement pour nous, il existe un compromis : un conteneur docker incluant un serveur OpenLDAP spécifiquement configuré pour notre besoin.

pedrojosenavasperez/ldap-passback-docker

Celui-ci va par exemple désactiver l’authentification anonyme et activer l’authentification PLAIN.

Pour les cas particuliers où il serait impossible d’utiliser Docker, j’en ai adapté une version pour Vagrant (machine virtuelle).

noraj/ldap-passback-vagrant

Revenons à nos moutons, pour déployer le conteneur docker après avoir cloné le dépôt git, rien de plus simple :

docker buildx build -t ldap-passback .
docker run --rm -ti -p 389:389 ldap-passback

Interception avec tshark 🦈 — Capturez les tous 🕸️

C’est bien beau d’avoir un serveur, notre finalité reste de capturer le mot de passe en clair et il parait peu probable que le serveur journalise les secrets, tout au plus, il peut peut-être journaliser l’identifiant.

C’est là que tshark — la version en ligne de commande de WireShark — rentre en jeu. Il suffit d’écouter sur l’interface réseau tout le trafic LDAP et de n’extraire que les tentatives d’authentification utilisant des authentifiants en clair.

entrypoint.sh

tshark -i any -f "port 389" \
  -Y "ldap.protocolOp == 0 && ldap.simple" \
  -e ldap.name -e ldap.simple -Tjson

On capturera donc des trames comme ci-dessous :

  {
    "_index": "packets-2023-09-20",
    "_type": "doc",
    "_score": null,
    "_source": {
      "layers": {
        "ldap.name": [
          "za.tryhackme.com\\svcLDAP"
        ],
        "ldap.simple": [
          "tryhackmeldappass1@"
        ]
      }
    }
  }

Vous pouvez dorénavant crier « Victoire ».

Où pratiquer ? 🏃

Il est possible de s’exercer à la pratique de cette attaque dans le laboratoire virtuel proposé par TryHackMe :
TryHackMe – Breaching Active Directory – Task 4.

Pistes de sécurisation 🛡️

Voici quelques conseils simples pour sécuriser sa machine cracheuse d’encre et de papier (comprendre imprimante) :

  • Changer le mot de passe par défaut du compte administrateurs
  • En cas d’utilisation d’un compte LDAP, configurer une méthode d’authentification robuste
  • Veiller à ce que le compte LDAP de l’imprimante ait des droits restreints sur le domaine
  • Dans une moindre mesure, sécuriser l’interface d’administration de l’imprimante en restreignant son accès au réseau ou adresses IP des administrateurs et en activant le HTTPS pour empêcher le MiTM

À propos de l’auteur 📝

Article écrit par Alexandre ZANNI alias noraj, Ingénieur en Test d’Intrusion chez ACCEIS.