M
MASTER LOYALTY GROUP Auditoria de seguridad — TI
Informe de incidente y hardening — actualizado

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.

Fecha del hallazgo: 30-ago-2026 Host: DB8 / SQLCLUSLEALTAD Estado: contencion en curso
Contingencia activa IA Autonoma escaneando...
Severidad Alta Compromiso del host y exposicion de token temporal.
Activo impactado VM DB8 Windows Server 2022 en Azure, cluster SQL.
Objetivo aparente Enumeracion y expansion de acceso Host, servicios, privilegios y control plane de Azure.
Destructividad observada No confirmada Sin evidencia de cifrado, borrado o sabotaje.
Estatus actual

Donde estamos ahora

Vector de entrada aun no confirmado. Hipotesis principal: capacidad de ejecucion de comandos ya expuesta desde SQL Server (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.
Cuenta de servicio con privilegios excesivos. MLGAZURE\sqlservice pertenece a BUILTIN\Administrators — viola principio de privilegios minimos y amplifico el impacto del compromiso.
Token de Azure Management fue extraido con exito. RBAC bloqueo el intento de enumeracion (AuthorizationFailed), pero el token debe tratarse como secreto comprometido y la managed identity debe revisarse.
Sin evidencia de destruccion o exfiltracion confirmada en este set. No hay cifrado, borrado masivo, ni trazas de exfiltracion de datos en los artefactos analizados hasta ahora.
Cadena del ataque observada

Secuencia tecnica reconstruida

La siguiente cronologia se basa en timestamps de los archivos de salida generados por el atacante.

19:18

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.

19:21 - 19:24

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).

19:37

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.

19:37 - 20:16

Reconocimiento local del servidor

Se enumeran variables de entorno, usuarios, grupos, privilegios, administradores locales, procesos, puertos y servicios para medir escalacion lateral y permanencia.

20:26 - 20:58

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

  1. Hubo ejecucion de comandos en el sistema operativo, no solo actividad dentro del motor SQL.
  2. Los comandos se ejecutaron bajo la cuenta MLGAZURE\sqlservice.
  3. Esa cuenta pertenecia a BUILTIN\Administrators, incrementando el impacto del compromiso.
  4. La identidad administrada de la VM fue explotada para obtener un token valido de Azure Management.
  5. Se intento usar ese token para enumerar recursos de Azure, pero RBAC limito el alcance.
  6. 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.

[RESUELTO] Regla custom 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.
[RESUELTO] WAF no habilitado — era Critical en Security Center. Zonas 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.
[RESUELTO] Probing/reconocimiento activo en 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.
Probing en 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.
Turnstile activo y desplegado. 8 widgets confirmados, incluyendo MLG, HSBC Programa-Mas y MLG AI Control Center - Login. Sin cambios manuales sospechosos en la cuenta durante la ventana revisada (solo automatizacion normal de _acme-challenge en redrewards.com.mx).

Hipotesis de acceso inicial

SQL injection no puede afirmarse como hecho con esta evidencia. No aparecen payloads de inyeccion, UNION SELECT, WAITFOR DELAY, trazas de consultas manipuladas ni evidencia directa de explotacion a nivel aplicacion web en los artefactos del host.
  1. 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.
  2. Tambien posible: acceso directo al host por un servicio expuesto como SSH Bitvise (22), RDP (3389) o credenciales reutilizadas.
  3. 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.
Plan de accion — SQL / Host / Azure

Checklist de hardening (marcar conforme se complete)

Avance0 / 0
  • Cambio de passwords SQL Rotar credenciales de todas las cuentas de SQL Server, incluyendo sa y cuentas de servicio/aplicacion.
    Critico
  • Cambiar puerto SQL por defecto Mover SQL Server fuera del puerto 1433 por defecto y actualizar reglas de firewall/NSG en consecuencia.
    Alto
  • Desactivar el shell / xp_cmdshellCompletado Deshabilitar xp_cmdshell y cualquier via de ejecucion de comandos de sistema operativo desde SQL Server. Confirmado como realizado por el equipo.
    Critico
  • Revision de usuarios y permisos (privilegio minimo) Auditar cuentas locales/SQL, remover a sqlservice de BUILTIN\Administrators y aplicar principio de privilegios minimos en todo el host.
    Critico
  • 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 a 22, 3389 y 5985; deshabilitar lo que no se use.
    Alto
  • 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
Plan de accion — Cloudflare

Checklist de hardening perimetral

Avance0 / 0
  • 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, destacando 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.
    Critico
  • Endurecer mlgmarketplace.com — log→block aplicadoCompletado El WAF managed estaba desplegado en modo log global (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 global log→block del managed ruleset APLICADO (26 reglas deshabilitadas preservadas). Baseline: 5 paths clave en 200, 0 bloqueos firewallManaged. En monitoreo activo 2h (3 checkpoints).
    Critico
  • Confirmar bloqueo sostenido en mlg-transfer.com.mxCompletado Proteccion en capas verificada: regla BLOCKED BY COUNTRY activa (bloquea no-MX con excepciones controladas por lista $transfer) + Managed WAF desplegado y en modo enforcing (no log) con OWASP. Sin regresiones.
    Critico
  • Corregir regla custom POST-GET en programa-mas.com.mxCompletado Alcance real: el skip solo afectaba la fase Super Bot Fight Mode (SBFM), no todo el WAF. La expresion OR evaluaba verdadero siempre, dejando SBFM inactivo en el 100% del trafico. Corregido a method in {POST GET PATCH OPTIONS}: preserva exencion en metodos comunes (no rompe integraciones API de socios) y reactiva SBFM en metodos inusuales. Version 6.
    Critico
  • Habilitar WAF en mlg.com.mx, mlg-labs.com.mx y mrewards.com.mxCompletado Las tres zonas son plan Pro (no Free), asi que el WAF administrado si estaba disponible. Se desplego el Cloudflare Managed Ruleset como 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.
    Critico
  • 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: el POST-GET era el principal offender (ya corregido). Se detectaron 3 hallazgos nuevos (ver items abajo). El resto de whitelists de IP/bot estan bien construidas.
    Alto
  • Rate limiting de login en mlgmarketplace.comCompletado Regla creada en fase http_ratelimit: managed_challenge al exceder 10 POST a /login por IP en 60s (mitigacion 600s). Anti brute-force / credential stuffing sin bloqueo duro (usuarios reales pasan el challenge).
    Medio
  • [NUEVO] Corregir skip always-true ALLOW ACCESS en 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.
    Alto
  • [NUEVO] Revisar skip por referer en freestylelibretienda.com.mx (POP UP) Skip de WAF basado en http.referer (header spoofeable = bypass) y con condiciones malformadas. Tienda viva; corregir con cuidado para no romper el popup de sppopups.com.
    Medio
  • [NUEVO] Revisar skip amplio por pais en programa-mascc.com.mx (Trafico) Regla (ip.geoip.country eq "MX") salta el WAF para TODO el trafico mexicano. Muy amplio; evaluar si es intencional o reducir alcance.
    Medio
  • [NUEVO] Investigar FP de guias PDF en mlgmarketplace.com Requests US a /Archivos/Guias/*.pdf y /MarketplaceApi/Archivos/Guias/*.pdf bloqueados por firewallCustom (pre-existente, ajeno al flip). Verificar si es un socio de logistica legitimo y ajustar excepcion.
    Medio
  • 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
Bitacora de cambios — trazabilidad y rollback

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).

CL-0130-ago ~23:21Reversible
programa-mas.com.mx — correccion regla POST-GET
Zona c8f4e2d6b6c1bcce5d826eed4afe38e7 · ruleset custom 373ea7f7d4054f1bb363c3752c682372 · rule cedc108122e04e4692c76e64d245f4b1
ANTES (method ne "POST") or (method ne "GET") or (method ne "PATCH") or (method ne "OPTIONS")
AHORA (http.request.method in {"POST" "GET" "PATCH" "OPTIONS"}) · version 6
Rollback: PATCH la rule restaurando la expresion ANTES.
CL-0230-ago ~23:24Reversible
WAF Managed Ruleset desplegado en 3 zonas (Pro)
Se creo entrypoint en fase http_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).
ANTES sin entrypoint en la fase managed (WAF no desplegado)
AHORA Managed Ruleset activo (acciones default)
Rollback: DELETE cada ruleset entrypoint listado (o disable de la rule execute).
CL-0330-ago ~23:29Reversible
mlgmarketplace.com — regla custom bloqueo paths sensibles
Zona 390d924f736473b7968e78e5d9ac0e24 · ruleset custom 61ee9c4ecca7450b85a69c012ed4b130 · nueva rule 3e2fcaa0e95a44e69d4bff24748bd995
AHORA block si path contiene /.env /.git /.htpasswd /.htaccess /.aws /.ssh/ wp-config web.config settings.py
Rollback: DELETE la rule 3e2fcaa0e95a44e69d4bff24748bd995.
CL-0430-ago ~23:33Monitoreo 2h
mlgmarketplace.com — flip Managed Ruleset log→block
Zona 390d924f736473b7968e78e5d9ac0e24 · managed entrypoint 63912fb723da45f49edee06d8c6947f0 · rule 7098c7c082ce463dbd90dff10d43040b
ANTES overrides.action: "log" (no bloqueaba)
AHORA overrides.action: "block" (26 reglas disabled preservadas)
Rollback: PATCH la rule regresando overrides.action a "log". Monitoreo activo 3 checkpoints.
CL-0530-ago ~23:39Reversible
mlgmarketplace.com — rate limiting login
Zona 390d924f736473b7968e78e5d9ac0e24 · fase http_ratelimit · ruleset 7229a2b4f5c941029b57045d32dd6f2c
AHORA managed_challenge si >10 POST a /login por IP en 60s (mitigacion 600s)
Rollback: DELETE la rule del ruleset ratelimit (o disable).