SOC Prime Bias: Alto

20 May 2026 22:10 UTC

Cómo Storm-2949 convirtió una identidad comprometida en una brecha global de la nube

Author Photo
SOC Prime Team linkedin icon Seguir
Cómo Storm-2949 convirtió una identidad comprometida en una brecha global de la nube
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumen

Storm-2949 utilizó ingeniería social y abuso del restablecimiento de contraseña de autoservicio para comprometer cuentas de Microsoft Entra ID. Después de obtener acceso privilegiado, el actor de la amenaza usó acciones del plano de administración de Azure para acceder a los servicios de aplicaciones, Key Vaults, cuentas de almacenamiento y bases de datos SQL. Luego, los datos fueron exfiltrados desde Microsoft 365, almacenamiento de Azure y otros recursos en la nube. La intrusión progresó posteriormente a la implementación de la herramienta de acceso remoto ScreenConnect en máquinas virtuales para soportar un mayor reconocimiento y robo de credenciales.

Investigación

Los analistas de Microsoft observaron a los atacantes enumerando usuarios y aplicaciones a través de la API de Microsoft Graph con herramientas personalizadas de Python. Recuperaron perfiles de publicación de los servicios de aplicaciones de Azure, extrajeron secretos de Key Vaults, cambiaron reglas de firewall y utilizaron la extensión VMAccess para crear cuentas de administrador local en máquinas virtuales. En una etapa posterior, un script de PowerShell instaló ScreenConnect, limpió los registros y disfrazó servicios para reducir la visibilidad. La investigación vinculó esta actividad a tres direcciones IP controladas por el atacante.

Mitigación

Las organizaciones deben habilitar MFA y requerir una autenticación resistente al phishing para cuentas privilegiadas. Los permisos de Azure RBAC deben ser estrictamente restringidos y monitoreados, especialmente el acceso a nivel de Owner a Key Vaults y servicios de aplicaciones. Las extensiones de VM de Azure innecesarias deben ser deshabilitadas y se debe hacer cumplir el registro de actividad para los comandos Run Command y VMAccess. Microsoft Defender para Cloud y Defender para Endpoint también deben estar habilitados con protección contra manipulación y modo de bloqueo.

Respuesta

Los defensores deben bloquear inmediatamente las direcciones IP maliciosas identificadas y revocar las credenciales comprometidas. Las contraseñas y los registros de MFA para las cuentas afectadas deben ser restablecidos, y todos los secretos almacenados en Key Vaults deben ser rotados. Los equipos de seguridad también deben realizar una revisión completa de las asignaciones de Azure RBAC y eliminar los privilegios excesivos. Las reglas de detección deben ser actualizadas para identificar solicitudes sospechosas de perfiles de publicación, acceso a secretos de Key Vault y actividad inesperada de extensiones de VM.

Flujo de Ataque

Ejecución de Simulación

Prerrequisito: La verificación previa de Telemetría y Línea Base debe haber pasado.

  • Narrativa del ataque y comandos:

    Un adversario que ha obtenido una cuenta válida de Azure AD (o un principal de servicio por defecto) quiere exfiltrar el código fuente de la aplicación y las instantáneas de la base de datos. El atacante realiza los siguientes pasos completamente a través de Azure CLI, generando los exactos operationName eventos que la regla observa:

    1. Publicar XML de la aplicación web – extrae la configuración de la aplicación web (incluidas las credenciales de despliegue).
    2. Crear una nueva cuenta de almacenamiento – proporciona un contenedor para la puesta en escena de los datos exfiltrados.
    3. Agregar una regla de firewall al servidor SQL – abre el servidor al rango de IP del atacante, permitiendo la copia directa de datos.

    Cada paso produce una entrada de registro de actividad con operationName coincidiendo con la lista blanca de la regla, activando así la detección.

  • Script de Prueba de Regresión:

    #!/usr/bin/env bash
    # Prerrequisito: az CLI está conectado con un principal de Azure AD comprometido/válido.
    set -euo pipefail
    
    # Variables – modificar según sea necesario para el inquilino de prueba
    RG="test-rg-$(date +%s)"
    WEBAPP="test-webapp-$RANDOM"
    STORAGE="teststorage$RANDOM"
    LOCATION="eastus"
    SQLSERVER="testsql$RANDOM"
    MY_IP=$(curl -s https://api.ipify.org)
    
    echo "=== Crear grupo de recursos ==="
    az group create --name "$RG" --location "$LOCATION"
    
    echo "=== Desplegar una aplicación web dummy ==="
    az appservice plan create --name "${WEBAPP}Plan" --resource-group "$RG" --sku B1 --is-linux
    az webapp create --resource-group "$RG" --plan "${WEBAPP}Plan" --name "$WEBAPP"
    
    echo "=== Publicar configuración XML (desencadena detección) ==="
    az webapp config backup create 
        --resource-group "$RG" 
        --webapp-name "$WEBAPP" 
        --backup-name "xmlbackup-$(date +%s)" 
        --output none
    
    echo "=== Crear una cuenta de almacenamiento (desencadena detección) ==="
    az storage account create 
        --name "$STORAGE" 
        --resource-group "$RG" 
        --location "$LOCATION" 
        --sku Standard_LRS 
        --kind StorageV2 
        --output none
    
    echo "=== Crear un servidor SQL (necesario para la regla de firewall) ==="
    az sql server create 
        --name "$SQLSERVER" 
        --resource-group "$RG" 
        --location "$LOCATION" 
        --admin-user "sqladmin" 
        --admin-password "P@ssw0rd1234!" 
        --output none
    
    echo "=== Agregar regla de firewall al servidor SQL (desencadena detección) ==="
    az sql server firewall-rule create 
        --resource-group "$RG" 
        --server "$SQLSERVER" 
        --name "AllowMyIP" 
        --start-ip-address "$MY_IP" 
        --end-ip-address "$MY_IP" 
        --output none
    
    echo "=== Simulación completa. Verifique Azure Sentinel para alertas. ==="
  • Comandos de limpieza:

    #!/usr/bin/env bash
    set -euo pipefail
    
    # Las variables deben coincidir con las utilizadas en el script de simulación
    RG="test-rg-..."
    # Si mantuviste los nombres exactos del ejecución anterior, reemplaza los marcadores de posición de acuerdo.
    
    echo "=== Eliminar grupo de recursos y todos los recursos contenidos ==="
    az group delete --name "$RG" --yes --no-wait
    echo "Limpieza iniciada."