
Preuve de concept d'exploit pour l'escalade de privilèges locale sous Windows (CVE-2023-21746) abusant de l'authentification locale NTLM pour obtenir les privilèges SYSTEM via l'accès aux partages SMB et le détournement de DLL.
Une vulnérabilité d'élévation de privilèges locaux (LPE) sous Windows a été signalée à Microsoft le 9 septembre 2022 par Andrea Pierini (@decoder_it) et Antonio Cocomazzi (@splinter_code). Cette vulnérabilité permettrait à un attaquant disposant d'un compte à faibles privilèges sur un hôte de lire/écrire des fichiers arbitraires avec les privilèges SYSTEM.
Bien que la vulnérabilité en elle-même ne permette pas d'exécuter directement des commandes en tant que SYSTEM, on peut la combiner avec plusieurs vecteurs pour atteindre ce résultat. De manière opportune, le 13 février, un autre PoC d'élévation de privilèges a été publié par BlackArrowSec, qui abuse du service StorSvc, permettant à un attaquant d'exécuter du code en tant que SYSTEM tant qu'il peut écrire un fichier DLL dans n'importe quel répertoire du PATH.
Le PoC LocalPotato exploite une faille dans un cas particulier de l'authentification NTLM appelé authentification locale NTLM pour tromper un processus privilégié afin qu'il authentifie une session que l'attaquant démarre contre le serveur SMB local. En conséquence, l'attaquant se retrouve avec une connexion qui lui donne accès à tous les partages avec les privilèges du processus trompé, y compris les partages spéciaux comme C$ ou ADMIN$.
Le processus suivi par l'exploit est le suivant :
En disposant d'une connexion privilégiée aux partages SMB, l'attaquant peut lire ou écrire des fichiers sur la machine cible à n'importe quel endroit. Bien que cela ne nous permette pas d'exécuter des commandes directement contre la machine vulnérable, nous combinerons cela avec un vecteur d'attaque différent pour atteindre cet objectif.
Notez que la vulnérabilité se trouve dans le protocole NTLM plutôt que dans le serveur SMB, donc ce même vecteur d'attaque pourrait théoriquement être utilisé contre tout service qui utilise l'authentification via NTLM. En pratique, cependant, certaines précautions doivent être prises lors de la sélection du protocole à attaquer. Le PoC utilise le serveur SMB pour éviter certaines protections supplémentaires en place pour d'autres protocoles contre des vecteurs d'attaque similaires et met même en œuvre un contournement rapide pour que l'exploit fonctionne contre le serveur SMB. Article de l'auteur original de l'exploit - (https://decoder.cloud/2023/02/13/localpotato-when-swapping-the-context-leads-you-to-system/)
Jusqu'à présent, nous avons utilisé LocalPotato pour écrire des fichiers arbitraires sur la machine cible. Pour obtenir un shell privilégié, nous devons encore trouver comment utiliser l'écriture arbitraire pour exécuter une commande.
Récemment, un autre vecteur d'élévation de privilèges a été découvert, où un attaquant pourrait détourner une DLL manquante pour exécuter des commandes arbitraires avec les privilèges SYSTEM. Le seul problème avec ce vecteur était qu'un attaquant devrait écrire une DLL dans le PATH du système pour le déclencher. Par défaut, le PATH de Windows n'inclut que des répertoires que seuls les comptes privilégiés peuvent écrire. Bien qu'il soit possible de trouver des machines où l'installation d'applications spécifiques a modifié la variable PATH et rendu la machine vulnérable, le vecteur d'attaque ne s'applique qu'à des scénarios particuliers. Combiner cette attaque avec LocalPotato nous permet de surmonter cette restriction et d'obtenir un exploit d'élévation de privilèges pleinement fonctionnel.
StorSvc et détournement de DLL Comme découvert par BlackArrowSec (https://github.com/blackarrowsec/redteam-research/tree/26e6fc0c0d30d364758fa11c2922064a9a7fd309/LPE via StorSvc), un attaquant peut envoyer un appel RPC à la méthode "SvcRebootToFlashingMode" fournie par le service "StorSvc", ce qui déclenchera à son tour une tentative de chargement d'une DLL manquante appelée "SprintCSP.dll". Si vous n'êtes pas familier avec RPC, considérez-le comme une API qui expose des fonctions afin qu'elles puissent être utilisées à distance. Dans ce cas, le service StorSvc expose la méthode SvcRebootToFlashingMode, que toute personne ayant accès à la machine peut appeler. Puisque StorSvc s'exécute avec les privilèges SYSTEM, créer SprintCSP.dll quelque part dans le PATH permettra son chargement à chaque fois qu'un appel à SvcRebootToFlashingMode est effectué.
Compilation de l'exploit Lien de l'exploit - (https://github.com/decoder-it/LocalPotato) Pour utiliser cet exploit, vous devez d'abord compiler les deux fichiers fournis :
Commençons par traiter "RpcClient.exe". Comme mentionné précédemment, nous devrons modifier l'exploit en fonction de la version Windows de la machine cible. Pour ce faire, nous devrons modifier les premières lignes de "LPE via StorSvc\RpcClient\RpcClient\storsvc_c.c" afin que le système d'exploitation correct soit choisi. Cela configurera l'exploit pour utiliser l'identifiant d'interface RPC correct. Maintenant que le code a été corrigé, ouvrons une invite de commande développeur et construisons le projet en exécutant la commande suivante : Commandes : C:\LPE via StorSvc\RpcClient> msbuild RpcClient.sln C:\LPE via StorSvc\RpcClient> move x64\Debug\RpcClient.exe C:\Users\user\Desktop\ (L'exécutable compilé se trouvera sur votre bureau.)
Maintenant, pour compiler "SprintCSP.dll", nous devons seulement modifier la fonction "DoStuff()" dans "C:\LPE via StorSvc\SprintCSP\SprintCSP\main.c" afin qu'elle exécute une commande qui nous accorde un accès privilégié à la machine. Pour simplifier, nous ferons en sorte que la DLL ajoute notre utilisateur actuel au groupe Administrateurs. Nous pouvons également obtenir un reverse shell de cette cible vers notre machine. Nous compilons maintenant la DLL en exécutant la commande suivante et déplaçons le résultat vers notre bureau : Commandes : C:\LPE via StorSvc\SprintCSP> msbuild SprintCSP.sln C:\LPE via StorSvc\SprintCSP> move x64\Debug\SprintCSP.dll C:\Users\user\Desktop\
Nous sommes maintenant prêts à lancer l'exploit. Assurez-vous d'avoir l'exploit "LocalPotato.exe", le fichier "RpcClient.exe" et le fichier "SprintCSP.dll".
Détection et atténuation
Détection Maintenant que nous avons compris comment fonctionne l'exploit localpotato et comment il peut être enchaîné avec le service StorSvc pour exécuter du code en tant que SYSTEM, il est temps de voir comment cela peut être détecté dans le système et comment prévenir de telles attaques.
Règle YARA : Comme cette attaque implique un exécutable s'exécutant dans le terminal en ligne de commande avec des arguments, deux moyens courants de détecter cette activité seraient d'utiliser l'outil de correspondance de motifs YARA pour détecter les motifs de fichiers et d'examiner les événements générés par l'exécution de cet outil de piratage localpotato.exe. Comme l'attaque utilise l'outil de piratage connu sous le nom de localpotato.exe, nous pouvons créer une règle YARA pour détecter la présence de cet outil dans le système en utilisant YARA ou d'autres outils de détection comme THOR pour scanner l'hôte. (La règle YARA est jointe dans ce dépôt, cette règle minimale recherche des motifs de chaînes courants dans l'exécutable localpotato).
Règle Sigma : SIGMA est un langage de signature générique utilisé pour écrire des règles de détection basées sur les motifs trouvés dans les journaux d'événements. Afin de détecter localpotato dans le réseau, il est attendu d'avoir une surveillance centralisée des journaux activée en place. La règle SIGMA suivante est tirée du dépôt officiel SIGMA (https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_hktl_localpotato.yml).
Nous pouvons utiliser ces règles sigma pour les convertir dans l'outil de détection / surveillance en place et rechercher dans les journaux d'événements pour chasser les attaques potentielles.
Atténuation