Cómo Storm-2949 convirtió una identidad comprometida en una brecha global de la nube
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
Detecciones
Uso sospechoso de Invoke-RestMethod (via powershell)
Ver
Posible Azure Vault fue contactado por un proceso poco común (via dns_query)
Ver
COIs (SourceIP) para detectar: Cómo Storm-2949 convirtió una identidad comprometida en una brecha en toda la nube
Ver
COIs (DestinationIP) para detectar: Cómo Storm-2949 convirtió una identidad comprometida en una brecha en toda la nube
Ver
Detección de operaciones del plano de administración de Azure para la exfiltración de datos [Registros de actividades de Azure]
Ver
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
operationNameeventos que la regla observa:- Publicar XML de la aplicación web – extrae la configuración de la aplicación web (incluidas las credenciales de despliegue).
- Crear una nueva cuenta de almacenamiento – proporciona un contenedor para la puesta en escena de los datos exfiltrados.
- 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
operationNamecoincidiendo 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."