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.
graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef operator fill:#ff9900 %% Nodes – Attack Steps action_phishing[«<b>Acción</b> – <b>T1566 Phishing</b><br/><b>Descripción</b>: El actor de la amenaza envió mensajes de phishing dirigidos que abusaron del restablecimiento de contraseña de autoservicio para persuadir a los usuarios de aprobar solicitudes MFA y revelar credenciales válidas.»] class action_phishing action action_valid_accounts[«<b>Acción</b> – <b>T1078 Cuentas Válidas</b><br/><b>Descripción</b>: Se usaron credenciales comprometidas para iniciar sesión en Microsoft Entra ID y suscripciones de Azure.»] class action_valid_accounts action action_account_manipulation[«<b>Acción</b> – <b>T1098 Manipulación de Cuentas</b><br/><b>Descripción</b>: El atacante restableció contraseñas, eliminó factores MFA existentes y registró un autenticador malicioso para mantener persistencia.»] class action_account_manipulation action action_cloud_role_add[«<b>Acción</b> – <b>T1098.003 Roles en la Nube Adicionales</b><br/><b>Descripción</b>: Se añadieron roles privilegiados de Azure RBAC a las cuentas comprometidas.»] class action_cloud_role_add action action_cloud_account_discovery[«<b>Acción</b> – <b>T1087.004 Descubrimiento de Cuentas en la Nube</b><br/><b>Descripción</b>: Se utilizó Microsoft Graph API para enumerar usuarios, aplicaciones y entidades de servicio.»] class action_cloud_account_discovery action action_cloud_group_discovery[«<b>Acción</b> – <b>T1069.003 Descubrimiento de Grupos en la Nube</b><br/><b>Descripción</b>: Se listaron grupos y asignaciones de roles para mapear membresías privilegiadas.»] class action_cloud_group_discovery action action_cloud_service_discovery[«<b>Acción</b> – <b>T1526 Descubrimiento de Servicios en la Nube</b><br/><b>Descripción</b>: Se realizó enumeración de servicios de Azure como App Service, Key Vault, Storage y SQL.»] class action_cloud_service_discovery action action_storage_object_discovery[«<b>Acción</b> – <b>T1619 Descubrimiento de Objetos de Almacenamiento en la Nube</b><br/><b>Descripción</b>: Se enumeraron contenedores blob en cuentas de Azure Storage para localizar datos de interés.»] class action_storage_object_discovery action action_keyvault_secret_access[«<b>Acción</b> – <b>T1555.006 Credenciales desde Almacenes de Contraseñas</b><br/><b>Descripción</b>: Se extrajeron secretos de Azure Key Vault, proporcionando acceso a credenciales adicionales.»] class action_keyvault_secret_access action action_remote_services[«<b>Acción</b> – <b>T1021.007 Servicios Remotos: Servicios en la Nube</b><br/><b>Descripción</b>: Se usaron credenciales legítimas para conectarse a recursos de Azure mediante interfaces de gestión nativas.»] class action_remote_services action tool_screenconnect[«<b>Herramienta</b> – <b>Nombre</b>: ScreenConnect (ConnectWise Control)<br/><b>Descripción</b>: Software de acceso remoto desplegado en máquinas virtuales comprometidas para habilitar control persistente.»] class tool_screenconnect tool action_automated_collection[«<b>Acción</b> – <b>T1119 Recolección Automatizada</b><br/><b>Descripción</b>: Scripts de Python descargaron grandes cantidades de archivos desde OneDrive, SharePoint y Azure Storage.»] class action_automated_collection action action_scripting_interpreter[«<b>Acción</b> – <b>T1059 Intérprete de Comandos y Scripts</b><br/><b>Subtécnicas</b>: Python (T1059.006), Windows Command Shell (T1059.003), Unix Shell (T1059.004)<br/><b>Descripción</b>: Scripts ejecutados mediante extensiones de Azure VM para ejecutar comandos, acceder a metadatos de instancias y exfiltrar datos.»] class action_scripting_interpreter action action_indicator_removal[«<b>Acción</b> – <b>T1070 Eliminación de Indicadores</b><br/><b>Descripción</b>: Se limpiaron registros de eventos de Windows y archivos temporales.»] class action_indicator_removal action action_file_deletion[«<b>Acción</b> – <b>T1070.004 Eliminación de Archivos</b><br/><b>Descripción</b>: Se eliminaron artefactos en VMs comprometidas para dificultar el análisis forense.»] class action_file_deletion action action_obfuscation[«<b>Acción</b> – <b>T1027.005 Archivos o Información Ofuscada</b><br/><b>Descripción</b>: Se modificaron o ofuscaron herramientas de seguridad para evadir detección.»] class action_obfuscation action action_defeat_defenses[«<b>Acción</b> – <b>T1562.008 Evasión de Defensas: Deshabilitar o Modificar Logs en la Nube</b><br/><b>Descripción</b>: Microsoft Defender AV fue deshabilitado y los registros en la nube fueron manipulados.»] class action_defeat_defenses action %% Sequential connections action_phishing –>|conduce_a| action_valid_accounts action_valid_accounts –>|conduce_a| action_account_manipulation action_account_manipulation –>|conduce_a| action_cloud_role_add action_cloud_role_add –>|conduce_a| action_cloud_account_discovery action_cloud_account_discovery –>|conduce_a| action_cloud_group_discovery action_cloud_group_discovery –>|conduce_a| action_cloud_service_discovery action_cloud_service_discovery –>|conduce_a| action_storage_object_discovery action_storage_object_discovery –>|conduce_a| action_keyvault_secret_access action_keyvault_secret_access –>|conduce_a| action_remote_services action_remote_services –>|usa| tool_screenconnect tool_screenconnect –>|habilita| action_automated_collection action_automated_collection –>|usa| action_scripting_interpreter action_scripting_interpreter –>|habilita| action_indicator_removal action_indicator_removal –>|incluye| action_file_deletion action_file_deletion –>|incluye| action_obfuscation action_obfuscation –>|apoya| action_defeat_defenses %% Styling assignments class action_phishing,action_valid_accounts,action_account_manipulation,action_cloud_role_add,action_cloud_account_discovery,action_cloud_group_discovery,action_cloud_service_discovery,action_storage_object_discovery,action_keyvault_secret_access,action_remote_services,action_automated_collection,action_scripting_interpreter,action_indicator_removal,action_file_deletion,action_obfuscation,action_defeat_defenses action class tool_screenconnect tool
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."