Puppet est une chaine qui comprends 3 machines. Elle permet de se familiariser avec le C2 sliver, d’exploiter PrintNighmare afin d’effectuer une esacalade de privilège en local et enfin d’exploiter l’outil de management Puppet pour compromettre le DC.
Enumération des ports
La phase de reconnaissance initial permet d’identifier les vulnérabilités potentielles sur la machine Linux qui est probablement le serveur C2 au vu de la description du scénario.
|_ssl-date: TLS randomness does not represent time
31337/tcp open ssl/Elite?
Le scan nmap nous montre que plusieurs ports sont ouverts et en particulier le port 21 qui permet de s’authentifier en mode anonyme. En s’y connectant, on peut récupérer un fichier .cfg qui est le fichier de configuration permettant de se connecter à un serveur C2 en local.
En remplaçant l’adresse IP local par l’adresse de la machine Linux et en lançant le client sliver, il est possible de se connecter au serveur C2.
Sur ce dernier, on voit qu’on a un beacon qui est actif :
1 2 3 4 5
sliver > beacons ID Name Transport Hostname Username Operating System Last Check-In Next Check-In ========== ============= =========== ========== ==================== ================== =============== =============== 8ed5ce87 puppet-mtls mtls File01 PUPPET\Bruce.Smith windows/amd64 23s 8s
Printnighmare exploit
En accédant au beacon , après avoir lancé PrivescCheck.ps1, un script permettant d’analyser la configuration d’une machine windows afin d’identifier des mauvaises configurations pouvant permettre une escalade de privilèges.
Description : Package point and print will not be restricted to specific print servers
(default).
Policy : Package Point and print - Approved servers > PackagePointAndPrintServerList
Key : HKLM\SOFTWARE\Policies\Microsoft\Windows
NT\Printers\PackagePointAndPrint\ListOfServers
Value : N/A
Data : (null)
Default : (null)
Expected : N/A
Description : A list of approved Package Point and Print servers is not defined (default).
[*] Status: Vulnerable - Severity: High - Execution time: 00:00:00.127
Le script détecte alors les éléments suivants :
RestrictDriverInstallationToAdministrators 0 : Les utilisateurs non admins peuvent installer des drivers
NoWarningNoElevationOnInstall 1 : Pas de prompt UAC lors de l’installation de drivers
UpdatePromptSettings 1 : Pas de prompt UAC lors de la mise à jour de drivers
TrustedServers 0 : Aucun contrôle sur les serveurs autorisés
InForest 0 : Impression autorisée en dehors de
ServerList None : Pas de restriction de serveurs autorisés
PackagePointAndPrintOnly 0 : Non limité aux drivers vérifiés
L’ensemble de ces éléments permet d’affirmer que la machine est vulnérable a PrintNightmare, une vulnérabilité qui exploite le mécanisme de gestion des drivers d'imprimante (Point and Print) pour permettre l’exécution de code arbitraire avec des privilèges SYSTEM.
En effet, lorsqu’un utilisateur, même non administrateur, se connecte à une imprimante distante, le serveur peut lui pousser un driver. Si la configuration n’impose pas de restriction sur l’installation de ces derniers, un attaquant contrôlant un serveur d’impression peut pousser un driver malveillant qui va s’exécuter sur la machine cliente.
Ainsi, en utilisant un des exploit pour cette vulnérabilité (https://github.com/JohnHammond/CVE-2021-34527), il est possible d’ajouter un nouveau compte au groupe des administrateurs local.
SspiUacBypass désigne une technique d'élévation de privilèges qui coutourne l’UAC (User Account Control) en abusant du fonctionnement de la bibliothèque SSPI (Security Support Provider Interface) de Windows.
Le bypass UAC via SSPI Datagram exploite une particularité du protocole NTLM lorsqu’il est utilisé pour une authentification locale vers localhost. Lorsqu’un utilisateur membre du groupe Administrateur exécute un processus non élevé (c’est le comportement normal avec UAC activé), ce processus fonctionne avec un un token restreint : Il ne peut pas réaliser d’actions SYSTEM sans déclencher le prompt UAC
Cependant, lorsqu’un processus utilise NTLM en mode Datagram pour initier une connexion local et qu’il force le flag NTLMSSP_NEGOTIATE_LOCAL_CALL, le service lsass.exe qui gère cette authentification comme une authentification réseau ce qui permet de tromper LSA. Dans ce cas, il renvoi un token complet au lieu du token restreint car UAC ne filtre pas ce type d'authentification réseau.
Ainsi, en ajoutant SspiUacBypass aux extensions sliver, il est possible de l’exécuter directement sur une des sessions dont on dispose.
Cela permet de récupérer le hash du mot de passe du compte svc_puppet_win_t1 et de récupérer la liste des utilisateurs du domaine.
Accès SSH
Par la suite, avec le compte compromis, on peut accéder au dossier IT du DC ou l’on peut trouver une clé ssh pour accéder au serveur linux :
D’après les règles définies dans le firewall, les connexions ssh ne sont pas autorisé depuis les machines qui ne sont pas dans le réseau donc il faut d’abord faire du port forwardind afin de pouvoir y accéder :
Ensuite, comme la clé privé ssh n’est pas utilisable directement car elle a été généré pour une machine windows et que les machines Windows utilisent \r\n pour les fins de lignes alors que sous linux c’est \n seulement.
Pour résoudre cette erreur, il suffit d’exécuter la commande suivante :
1 2 3
┌──(kali㉿kali)-[~/ctf/vulnlab/puppet]
└─$ sed -i 's/\r$//' ed25519
Ensuite, comme la clé est protégé par une passphrase, il faut la casser cette dernière pour pouvoir l’utiliser :
On peut ensuite accéder au serveur :
Escalade de privilège avec puppet
Par la suite, on identifie que puppet peut être lancé avec des privilèges root : Une petite recherche sur GTFOBINS, nous permet de construire la commande suivante permettant de mettre le bit SUID sur bash :
On peut alors obtenir un accès root avec bash -p . Le -p indique à bash de ne pas abandonner l’UID effectif s’il est différent de l’UID réel.
Compromission du DC
Une fois root, on lister toutes les machines dont ont peut gérer la configuration avec puppet :
On voit alors que le DC est controlé par puppet ce qui signifie qu’en créant un fichier manifiest contenant des instructions pour le DC, on peut faire exécuter n’importe quoi sur le DC. Pour puppet, ce fichier est généralement /etc/puppet/code/environments/production/manifests/site.pp. Ainsi, en modifiant ce fichier (ou en le créant dans notre cas), et en y plaçant les commandes suivantes, on peut prendre le contrôle du DC.