Reconocimiento post-explotacion del cluster SQL/Azure + hallazgos Cloudflare
Este documento consolida (1) la reconstruccion tecnica del incidente sobre el host
DB8 / SQLCLUSLEALTAD, (2) los hallazgos de la auditoria de Cloudflare sobre el
perimetro web de MLG, y (3) el plan de hardening con estatus operativo para irlo cerrando punto
por punto.
DB8
Windows Server 2022 en Azure, cluster SQL.
Donde estamos ahora
xp_cmdshell, SQL Agent job, CLR) o acceso directo al host via 22/3389 con
credenciales comprometidas. SQL injection clasica desde app web es la hipotesis menos sustentada con la evidencia
disponible hoy.
MLGAZURE\sqlservice pertenece a BUILTIN\Administrators — viola
principio de privilegios minimos y amplifico el impacto del compromiso.
AuthorizationFailed), pero el token
debe tratarse como secreto comprometido y la managed identity debe revisarse.
Secuencia tecnica reconstruida
La siguiente cronologia se basa en timestamps de los archivos de salida generados por el atacante.
Fingerprint de infraestructura Azure
Se consulta metadata local de la VM y se confirma que el host es DB8, Windows Server 2022,
dentro del resource group bases_de_datos, con IP privada 10.160.20.160 y discos
asociados al cluster.
Extraccion y analisis de managed identity
Se obtiene un bearer token valido para https://management.azure.com/ desde el servicio local
de metadata de Azure (IMDS) y se inspeccionan sus claims (tenant, app id, object id, alcance).
Intento de pivot a Azure Resource Manager
Con el token anterior se prueban llamadas a ARM para leer la suscripcion y la VM. La respuesta es
AuthorizationFailed: el token se obtuvo con exito pero la identidad no tenia RBAC suficiente.
Reconocimiento local del servidor
Se enumeran variables de entorno, usuarios, grupos, privilegios, administradores locales, procesos, puertos y servicios para medir escalacion lateral y permanencia.
Validacion de telemetria y endpoints internos
Se verifican eventos de seguridad, puertos abiertos y respuestas HTTP/WinRM. SQL Server
1433 estaba accesible en el host; 5985 aparecia presente como servicio pero no
expuesto externamente en la comprobacion final registrada.
Hallazgos confirmados — host / Azure
- Hubo ejecucion de comandos en el sistema operativo, no solo actividad dentro del motor SQL.
- Los comandos se ejecutaron bajo la cuenta
MLGAZURE\sqlservice. - Esa cuenta pertenecia a
BUILTIN\Administrators, incrementando el impacto del compromiso. - La identidad administrada de la VM fue explotada para obtener un token valido de Azure Management.
- Se intento usar ese token para enumerar recursos de Azure, pero RBAC limito el alcance.
- El objetivo inmediato fue reconocimiento y expansion de acceso, no destruccion observable.
Hallazgos de la auditoria de Cloudflare
Revision del perimetro web de MLG en Cloudflare durante y alrededor de la ventana del incidente.
POST-GET en programa-mas.com.mx.
Alcance real: el skip afectaba solo la fase Super Bot Fight Mode (SBFM), no todo el WAF. La expresion con OR evaluaba verdadero siempre → SBFM inactivo en todo el trafico. Corregido a method in {POST GET PATCH OPTIONS}: reactiva SBFM en metodos inusuales sin romper integraciones API de socios.
mlg.com.mx, mlg-labs.com.mx, mrewards.com.mx (plan Pro): se desplego el Cloudflare Managed Ruleset en cada una. OWASP Core pendiente de activar con tuning.
mlgmarketplace.com.
Intentos a /.env, /.git/HEAD, .htpasswd, /user/login. Acciones: (1) regla custom de bloqueo dirigido a paths sensibles; (2) flip global del managed ruleset log→block APLICADO; (3) rate limiting managed_challenge en login POST. En monitoreo 2h.
mlg-transfer.com.mx.
Intentos a /.env, web.config, metrics,
app/settings.py, wp-login.php — mayormente en block (firewallCustom), pero confirma
reconocimiento activo sobre esta zona.
mlg.com.mx sin evidencia de SQLi en esta muestra.
Solo se observaron bloqueos a crawlers/bots en la ventana revisada.
_acme-challenge en redrewards.com.mx).
Hipotesis de acceso inicial
UNION SELECT, WAITFOR DELAY, trazas de consultas
manipuladas ni evidencia directa de explotacion a nivel aplicacion web en los artefactos del host.
- Mas probable: explotacion de una capacidad de ejecucion de comandos ya expuesta desde SQL
o desde una integracion administrativa. Ejemplos a validar:
xp_cmdshell, SQL Agent job abusado, procedimiento CLR, herramienta de administracion expuesta o credenciales de servicio comprometidas. - Tambien posible: acceso directo al host por un servicio expuesto como SSH Bitvise
(
22), RDP (3389) o credenciales reutilizadas. - Menos sustentado por este set: SQL injection pura desde una aplicacion web. Solo seria viable si una app externa llegaba al motor y permitia ejecutar OS commands o procedimientos peligrosos, no demostrado aqui.
Checklist de hardening (marcar conforme se complete)
-
Cambio de passwords SQL Rotar credenciales de todas las cuentas de SQL Server, incluyendoCritico
say cuentas de servicio/aplicacion. -
Cambiar puerto SQL por defecto Mover SQL Server fuera del puertoAlto
1433por defecto y actualizar reglas de firewall/NSG en consecuencia. -
Desactivar el shell / xp_cmdshellCompletado DeshabilitarCritico
xp_cmdshelly cualquier via de ejecucion de comandos de sistema operativo desde SQL Server. Confirmado como realizado por el equipo. -
Revision de usuarios y permisos (privilegio minimo) Auditar cuentas locales/SQL, remover aCritico
sqlservicedeBUILTIN\Administratorsy aplicar principio de privilegios minimos en todo el host. -
Rotacion de IP del servidor Cambiar la IP publica/privada expuesta del servidor comprometido para cortar continuidad de acceso conocido por el atacante.Alto
-
Revocar / rotar managed identity y token expuesto Tratar el bearer token de Azure Management extraido como secreto comprometido; rotar o recrear la managed identity de la VM.Critico
-
Auditar SQL Agent jobs, linked servers y modulos CLR Revisar jobs programados, linked servers y ensamblados CLR que pudieron ser usados como via de ejecucion.Alto
-
Cerrar/restringir SSH Bitvise, RDP y WinRM al host Limitar por IP/VPN el acceso aAlto
22,3389y5985; deshabilitar lo que no se use. -
Preservar evidencia antes de limpiar Memory dump, logs de Windows Security (4688), logs de SQL Server y Bitvise antes de reinicios o remediacion agresiva.Medio
Checklist de hardening perimetral
-
Correlacionar logs de Cloudflare con la ventana del incidente (01:18–02:58 UTC)Completado Analisis de eventos firewall/WAF en la ventana. Durante el incidente Cloudflare BLOQUEO scanning automatizado, destacandoCritico
34.26.40.160(GCP, 22 hits) contra mlg-transfer.com.mx probando/files../.env(path traversal),/host.key,/app/settings.py,/web.config,/wp-login.php. Marketplace: scanning + FP de guias PDF. mlg.com.mx: solo crawlers. NO hay evidencia de un exploit web exitoso que llegara al backend SQL → refuerza que el vector de DB8 no fue web via Cloudflare, sino acceso directo al host (SSH/RDP) o capa SQL. IPs de scanning quedan como IOCs a bloquear. -
Endurecer mlgmarketplace.com — log→block aplicadoCompletado El WAF managed estaba desplegado en modoCritico
logglobal (no bloqueaba). (1) Se agrego regla custom de bloqueo dirigido a paths sensibles (/.env,/.git,/.htpasswd,/.htaccess,/.aws,/.ssh/,wp-config,web.config,settings.py). (2) Flip globallog→blockdel managed ruleset APLICADO (26 reglas deshabilitadas preservadas). Baseline: 5 paths clave en 200, 0 bloqueos firewallManaged. En monitoreo activo 2h (3 checkpoints). -
Confirmar bloqueo sostenido en mlg-transfer.com.mxCompletado Proteccion en capas verificada: reglaCritico
BLOCKED BY COUNTRYactiva (bloquea no-MX con excepciones controladas por lista$transfer) + Managed WAF desplegado y en modoenforcing(no log) con OWASP. Sin regresiones. -
Corregir regla customCritico
POST-GETen programa-mas.com.mxCompletado Alcance real: elskipsolo afectaba la fase Super Bot Fight Mode (SBFM), no todo el WAF. La expresionORevaluaba verdadero siempre, dejando SBFM inactivo en el 100% del trafico. Corregido amethod in {POST GET PATCH OPTIONS}: preserva exencion en metodos comunes (no rompe integraciones API de socios) y reactiva SBFM en metodos inusuales. Version 6. -
Habilitar WAF en mlg.com.mx, mlg-labs.com.mx y mrewards.com.mxCompletado Las tres zonas son planCritico
Pro(no Free), asi que el WAF administrado si estaba disponible. Se desplego elCloudflare Managed Rulesetcomo entrypoint en la fase managed de cada zona. Se dejo OWASP Core Ruleset SIN activar de momento por su riesgo de falsos positivos sin tuning previo. -
Auditar todas las reglas custom de la cuenta por logica invertidaCompletado Barrido de las 41 zonas (16 con reglas custom, 24 reglas skip/allow). Resultado: elAlto
POST-GETera el principal offender (ya corregido). Se detectaron 3 hallazgos nuevos (ver items abajo). El resto de whitelists de IP/bot estan bien construidas. -
Rate limiting de login en mlgmarketplace.comCompletado Regla creada en faseMedio
http_ratelimit:managed_challengeal exceder 10 POST a/loginpor IP en 60s (mitigacion 600s). Anti brute-force / credential stuffing sin bloqueo duro (usuarios reales pasan el challenge). -
[NUEVO] Corregir skip always-trueAlto
ALLOW ACCESSen mlgdev.mx Expresion(method eq OPTIONS) or GET or POST or PUT or DELETE= practicamente siempre verdadera → salta el ruleset custom para casi todo el trafico. Zona dev (riesgo menor). Requiere entender intencion antes de corregir. -
[NUEVO] Revisar skip por referer en freestylelibretienda.com.mx (POP UP) Skip de WAF basado enMedio
http.referer(header spoofeable = bypass) y con condiciones malformadas. Tienda viva; corregir con cuidado para no romper el popup desppopups.com. -
[NUEVO] Revisar skip amplio por pais en programa-mascc.com.mx (Trafico) ReglaMedio
(ip.geoip.country eq "MX")salta el WAF para TODO el trafico mexicano. Muy amplio; evaluar si es intencional o reducir alcance. -
[NUEVO] Investigar FP de guias PDF en mlgmarketplace.com Requests US aMedio
/Archivos/Guias/*.pdfy/MarketplaceApi/Archivos/Guias/*.pdfbloqueados porfirewallCustom(pre-existente, ajeno al flip). Verificar si es un socio de logistica legitimo y ajustar excepcion. -
Extender rate limiting a otras zonas con login Marketplace ya cubierto. Zonas de banca/financieras (programa-mas HSBC, mlg-transfer, rewardsplusscotia) PENDIENTES de OK: sus integraciones de socios (Ascenda/Masterbase/Scotia) podrian hacer POST programaticos a login y un challenge los romperia.Medio
-
Verificar cobertura de Turnstile en formularios criticos restantes Confirmar que los 8 widgets existentes cubren todos los logins/forms sensibles (MLG, HSBC Programa-Mas, MLG AI Control Center) y detectar huecos.Medio
Registro de cambios aplicados en produccion
Cada cambio incluye zona, IDs exactos, valor previo, valor nuevo y como revertir. Referencia para rollback ante cualquier regresion. Cuenta Cloudflare MLG CUBICA (5ba85d2fa77808497762e59fd374c35e). Todos los cambios de esta sesion: 2026-08-30 noche (CST).
POST-GET
c8f4e2d6b6c1bcce5d826eed4afe38e7 · ruleset custom 373ea7f7d4054f1bb363c3752c682372 · rule cedc108122e04e4692c76e64d245f4b1
(method ne "POST") or (method ne "GET") or (method ne "PATCH") or (method ne "OPTIONS")(http.request.method in {"POST" "GET" "PATCH" "OPTIONS"}) · version 6http_request_firewall_managed con execute del Managed Ruleset efb7b8c949ac4650a09736fc376e9aee. Nuevos entrypoints: mlg.com.mx dc4db95268fe47468da000fe8867271e (zona d2d4a77bad7f6d41dc06f13d81365a73); mlg-labs.com.mx bc4bdc99f1d84f55adb842ee623c56a0 (zona 5a328f0efa2243607f9b0c618f32e9b4); mrewards.com.mx 86e4371bd99e4ddca032b66fb36a1869 (zona 166563261788752ba6d4236bf06557b1).
390d924f736473b7968e78e5d9ac0e24 · ruleset custom 61ee9c4ecca7450b85a69c012ed4b130 · nueva rule 3e2fcaa0e95a44e69d4bff24748bd995
block si path contiene /.env /.git /.htpasswd /.htaccess /.aws /.ssh/ wp-config web.config settings.py3e2fcaa0e95a44e69d4bff24748bd995.390d924f736473b7968e78e5d9ac0e24 · managed entrypoint 63912fb723da45f49edee06d8c6947f0 · rule 7098c7c082ce463dbd90dff10d43040b
overrides.action: "log" (no bloqueaba)overrides.action: "block" (26 reglas disabled preservadas)overrides.action a "log". Monitoreo activo 3 checkpoints.390d924f736473b7968e78e5d9ac0e24 · fase http_ratelimit · ruleset 7229a2b4f5c941029b57045d32dd6f2c
managed_challenge si >10 POST a /login por IP en 60s (mitigacion 600s)