Como a Storm-2949 transformou uma identidade comprometida em uma violação ampla na nuvem
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
A Storm-2949 usou engenharia social e abuso de Redefinição de Senha de Autoatendimento para comprometer contas do Microsoft Entra ID. Após obter acesso privilegiado, o ator da ameaça usou ações do plano de gerenciamento do Azure para acessar App Services, Key Vaults, contas de Armazenamento e bancos de dados SQL. Os dados foram então exfiltrados do Microsoft 365, armazenamento do Azure e outros recursos em nuvem. A intrusão progrediu posteriormente para o implante da ferramenta de acesso remoto ScreenConnect em máquinas virtuais para apoiar maior reconhecimento e roubo de credenciais.
Investigação
Analistas da Microsoft observaram os atacantes enumerando usuários e aplicativos através da API Microsoft Graph com ferramentas Python personalizadas. Eles recuperaram perfis de publicação dos Azure App Services, extraíram segredos dos Key Vaults, alteraram regras de firewall e usaram a extensão VMAccess para criar contas de administrador local em máquinas virtuais. Em um estágio posterior, um script PowerShell instalou o ScreenConnect, limpou logs e disfarçou serviços para reduzir a visibilidade. A investigação vinculou esta atividade a três endereços IP controlados pelos atacantes.
Mitigação
As organizações devem habilitar a MFA e exigir autenticação resistente a phishing para contas privilegiadas. As permissões Azure RBAC devem ser rigorosamente restringidas e monitoradas, especialmente o acesso de nível de Proprietário a Key Vaults e App Services. Extensões Azure VM desnecessárias devem ser desabilitadas, e o registro em log deve ser aplicado para atividades de Run Command e VMAccess. O Microsoft Defender para Cloud e Defender para Endpoint também devem ser habilitados com proteção contra adulteração e modo de bloqueio.
Resposta
Os defensores devem bloquear imediatamente os endereços IP maliciosos identificados e revogar as credenciais comprometidas. As senhas e registros de MFA para contas afetadas devem ser redefinidos, e todos os segredos armazenados em Key Vaults devem ser rotacionados. As equipes de segurança também devem realizar uma revisão completa das atribuições Azure RBAC e remover privilégios excessivos. As regras de detecção devem ser atualizadas para identificar solicitações de perfil de publicação suspeitas, acesso a segredos do Key Vault e atividade inesperada de extensão de VM.
Fluxo de Ataque
Detecções
Uso Suspeito de Invoke-RestMethod (via powershell)
Ver
Possível Azure Vault Foi Contatado Por Processo Incomum (via dns_query)
Ver
IOCs (IP de Origem) para detectar: Como a Storm-2949 transformou uma identidade comprometida em uma violação em toda a nuvem
Ver
IOCs (IP de Destino) para detectar: Como a Storm-2949 transformou uma identidade comprometida em uma violação em toda a nuvem
Ver
Detecção de Operações do Plano de Gerenciamento do Azure para Exfiltração de Dados [Logs de Atividade Azure]
Ver
Execução de Simulação
Pré-requisito: O Check de Pré-voo de Telemetria & Baseline deve ter sido aprovado.
-
Narrativa do Ataque & Comandos:
Um adversário que obteve uma conta válida do Azure AD (ou principal de serviço padrão) deseja exfiltrar o código-fonte de aplicações e snapshots de bancos de dados. O atacante realiza os seguintes passos completamente via Azure CLI, gerando o exato
operationNameeventos que a regra monitora:- Publicar XML de Aplicativo Web – extrai a configuração do Aplicativo Web (incluindo credenciais de implantação).
- Criar uma nova Conta de Armazenamento – fornece um container para estagiar dados exfiltrados.
- Adicionar uma regra de firewall ao servidor SQL – abre o servidor para o intervalo de IP do atacante, permitindo cópia direta de dados.
Cada etapa produz uma entrada no Log de Atividade com
operationNamecorrespondendo à lista de permissões da regra, assim acionando a detecção. -
Script de Teste de Regressão:
#!/usr/bin/env bash # Pré-requisito: o CLI az está logado com um principal Azure AD comprometido/válido. set -euo pipefail # Variáveis – modifique conforme necessário para o inquilino de teste 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 "=== Criar grupo de recursos ===" az group create --name "$RG" --location "$LOCATION" echo "=== Implantar um Aplicativo Web de teste ===" 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 configuração XML (aciona detecção) ===" az webapp config backup create --resource-group "$RG" --webapp-name "$WEBAPP" --backup-name "xmlbackup-$(date +%s)" --output none echo "=== Criar uma Conta de Armazenamento (aciona detecção) ===" az storage account create --name "$STORAGE" --resource-group "$RG" --location "$LOCATION" --sku Standard_LRS --kind StorageV2 --output none echo "=== Criar um Servidor SQL (necessário para a regra de firewall) ===" az sql server create --name "$SQLSERVER" --resource-group "$RG" --location "$LOCATION" --admin-user "sqladmin" --admin-password "P@ssw0rd1234!" --output none echo "=== Adicionar regra de firewall ao Servidor SQL (aciona detecção) ===" 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 "=== Simulação completa. Verifique alertas no Azure Sentinel. ===" -
Comandos de Limpeza:
#!/usr/bin/env bash set -euo pipefail # Variáveis devem coincidir com aquelas usadas no script de simulação RG="test-rg-..." # Se você manteve os nomes exatos da execução anterior, substitua os locais reservados de acordo. echo "=== Excluir grupo de recursos e todos os recursos contidos ===" az group delete --name "$RG" --yes --no-wait echo "Limpeza iniciada."