ADSelfService Plus, histoire d’une 0-day

Avant de rentrer dans le vif du sujet, quelques mots sur ADSelfService Plus.

ADSelfService Plus est une solution de gestion de mot de passe en libre-service dans un environnement Active Directory.

Ce logiciel aide les utilisateurs du domaine à effectuer en libre-service la réinitialisation de leur mot de passe ainsi que le déverrouillage de leur compte.

Ce logiciel est réputé et utilisé par un très grand nombre de clients de part le monde :

https://www.manageengine.com/products/self-service-password/customers.html?topMenu

Il était une fois…

un matin de septembre 2019 où j’ai voulu réinitialiser mon mot de passe à l’aide de ADSelfService Plus. Je l’avais déjà fait une fois et cela avait fonctionné sauf que ce jour là le serveur hébergeant la solution était down….

Au lieu d’obtenir une erreur Windows classique, j’avais eu une fenêtre d’erreur HTTP.

Tiens ? Cela m’a surpris, je pensais qu’il s’agissait d’une application avec une GUI Windows mais non je venais de comprendre qu’il s’agissait d’une application de type mini-browser web présentant des pages HTML. Cela m’a d’autant plus intrigué qu’en scrutant les processus Windows, j’avais noté qu’ADSelfService Plus tournait sous l’utilisateur Local System, intéressant.

Je me suis aussitôt dit que s’il existait une vulnérabilité sur ce logiciel, cela pourrait servir pour de l’élévation de privilèges.

Du coup j’ai regardé côté réseau quel nom de domaine et protocole cherchait à joindre le client ADSelfservice Plus. Un coup de netstat et c’était réglé, j’avais le FQDN avec le protocole, du HTTPS.

Avec ces éléments je me suis demandé comment allait réagir le client ADSelfService Plus si au lieu de lui présenter son véritable serveur je lui présentais un « fake » serveur ?

Rien de plus simple sous Linux et Python que de lancer un mini serveur Web. En revanche je me suis dit que j’allais avoir du mal à générer un certificat SSL valide identique à celui du vrai serveur… il détecterait forcément une anomalie.

Je me suis dit, tant pis, faisons un certificat SSL autosigné et on verra. Bien m’en a pris, vous allez comprendre pourquoi 🙂

Je passe sous silence le fait qu’il m’a aussi fallu lancé un fake DNS serveur zappant toutes les requêtes DNS sauf celle correspondant au serveur hébergeant ADSelfservice Plus ; le but étant de rediriger les « bonnes » requêtes DNS vers mon fake ADSelfService Web serveur.

Voila j’avais tout ce qui me fallait pour lancer un test.

Le pré-requis pour cette attaque était simplement d’avoir un accès physique à un PC équipé d’ADSelfService Plus.

  • Je débranche le câble réseau du PC victime
  • Je place un câble croisé entre ce PC et une bécane sous Kali
  • Sous Kali je lance mon fake DNS serveur et mon fake ADSelfService Plus Web Serveur
  • Sur le PC victime je demande à ADSelfService Plus de réinitialiser mon mot de passe
  • Sur Kali je vois les requêtes DNS passées et celles pour ADSelfService Plus partent bien vers mon fake Web serveur, super !
  • Paf, sur le PC victime le client ADSelfService Plus est berné mais me toque une erreur de certificat SSL. Normal me direz-vous, mince…

Et oui c’est normal cette erreur de certificat SSL car justement j’ai généré un certificat SSL auto-signé.

Et là je me suis dit…vu que le client ADSelfService tourne sous Local System, cette fenêtre d’alerte de certificat SSL, elle tourne aussi sous Local System, y aurait pas moyen de lancer un shell ?

Alors j’ai cliqué sur « Afficher le certificat », puis dans l’onglet « Détails » :

Qu’est-ce qu’on voit en bas de cet onglet « Détails » ?

« Copier dans un fichier… » et voila le tour est joué, il n’y avait plus qu’à lancer un invite de commandes dans la fenêtre « Enregistrer sous… » pour se retrouver dans un shell avec les droits « Local System » !


C’est dingue je me suis dit que non seulement je pouvais élever mes privilèges mais qu’au final c’était bien plus grave.

En effet cette vulnérabilité permettait de tout faire : créer une backdoor, insérer un malware, exfiltrer des données utilisateurs le tout sans même avoir besoin de s’authentifier sur le poste de travail.

Et oui le bonus avec ADSelfService Plus c’est qu’il est accessible directement sur la mire d’authentification !

Wahou !

C’était si facile que je me suis dit que cette vulnérabilité devait déjà être connue de l’éditeur, référencée en tant que CVE quelque part, que je n’avais pas la dernière version du logiciel, etc… et bien que nenni !

Je me suis donc rapproché de l’éditeur et comme c’est de plus en plus souvent le cas, il dispose d’un programme de Bug Bounty et j’ai ainsi déclaré un nouveau « bug » :

Au bout de quelques mois (heum…), l’éditeur m’a répondu, le 16 mars 2020 exactement, en me remerciant et en publiant une mise à jour, la build 5814 avec une petite mention sur cette vulnérabilité, « A vulnerability issue in the ADSelfService Plus login agent has been fixed » :

https://www.manageengine.com/products/self-service-password/release-notes.html

Moralité, je passe souvent un temps considérable à déterrer de nouvelles vulnérabilités mais parfois c’est si simple, il n’y a qu’à se pencher pour en trouver.

Fin