Come Storm-2949 ha trasformato un’identità compromessa in una violazione su tutta la nuvola
Detection stack
- AIDR
- Alert
- ETL
- Query
Sommario
Storm-2949 ha utilizzato l’ingegneria sociale e l’abuso del ripristino password self-service per compromettere gli account Microsoft Entra ID. Dopo aver ottenuto l’accesso privilegiato, l’attore della minaccia ha usato azioni del piano di gestione di Azure per raggiungere App Services, Key Vaults, account di Storage e database SQL. I dati sono stati poi esfiltrati da Microsoft 365, Azure Storage e altre risorse cloud. L’intrusione successivamente è progredita con il dispiegamento dello strumento di accesso remoto ScreenConnect su macchine virtuali per supportare ulteriori riconoscimenti e furti di credenziali.
Indagine
Gli analisti di Microsoft hanno osservato gli attaccanti enumerare utenti e applicazioni tramite l’API Microsoft Graph con strumenti Python personalizzati. Hanno recuperato profili di pubblicazione da Azure App Services, estratto segreti dai Key Vaults, modificato le regole del firewall e utilizzato l’estensione VMAccess per creare account amministratore locali su macchine virtuali. In una fase successiva, uno script PowerShell ha installato ScreenConnect, cancellato i registri e mascherato i servizi per ridurre la visibilità. L’indagine ha collegato questa attività a tre indirizzi IP controllati dagli attaccanti.
Mitigazione
Le organizzazioni dovrebbero abilitare MFA e richiedere autenticazione resistente al phishing per gli account privilegiati. I permessi di Azure RBAC dovrebbero essere strettamente limitati e monitorati, specialmente l’accesso a livello di Proprietario a Key Vaults e App Services. Le estensioni Azure VM non necessarie dovrebbero essere disabilitate e la registrazione dovrebbe essere applicata per l’attività di Run Command e VMAccess. Microsoft Defender for Cloud e Defender for Endpoint dovrebbero anche essere abilitati con protezione dai manomissioni e modalità di blocco.
Risposta
I difensori dovrebbero immediatamente bloccare gli indirizzi IP malevoli identificati e revocare le credenziali compromesse. Le password e le registrazioni MFA per gli account interessati dovrebbero essere resettate, e tutti i segreti memorizzati nei Key Vaults dovrebbero essere ruotati. I team di sicurezza dovrebbero anche effettuare una revisione completa delle assegnazioni di Azure RBAC e rimuovere i privilegi eccessivi. Le regole di rilevamento dovrebbero essere aggiornate per identificare richieste di profili di pubblicazione sospette, accesso ai segreti dei Key Vault e attività di estensione VM inaspettate.
Flusso di Attacco
Rilevamenti
Uso Sospetto di Invoke-RestMethod (via powershell)
Visualizza
Possibile Vault di Azure Contattato da Processo Inusuale (via dns_query)
Visualizza
IOC (SourceIP) da rilevare: Come Storm-2949 ha trasformato un’identità compromessa in una violazione su scala cloud
Visualizza
IOC (DestinationIP) da rilevare: Come Storm-2949 ha trasformato un’identità compromessa in una violazione su scala cloud
Visualizza
Rilevamento delle Operazioni di Piano di Gestione di Azure per Esfiltrazione Dati [Log di Attività di Azure]
Visualizza
Esecuzione di Simulazione
Prerequisito: Il Controllo Pre-volo di Telemetria e Baseline deve essere superato.
-
Narrazione dell’Attacco & Comandi:
Un avversario che ha ottenuto un account Azure AD valido (o un service principal predefinito) vuole esfiltrare il codice sorgente delle applicazioni e gli snapshot del database. L’attaccante esegue i seguenti passaggi interamente tramite Azure CLI, generando esattamente
operationNameeventi che la regola controlla:- Pubblica Web App XML – estrae la configurazione della Web App (incluse le credenziali di distribuzione).
- Crea un nuovo Account di Storage – fornisce un contenitore per mettere in scena i dati esfiltrati.
- Aggiungi una regola di firewall al server SQL – apre il server all’intervallo IP dell’attaccante, consentendo la copia diretta dei dati.
Ogni passaggio produce un’entrata di Log di Attività con
operationNamecorrispondente alla whitelist della regola, attivando così il rilevamento. -
Script di Test di Regressione:
#!/usr/bin/env bash # Prerequisito: az CLI è connesso con un principal Azure AD compromesso/valido. set -euo pipefail # Variabili – modificare come necessario per il tenant di test 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 "=== Crea gruppo di risorse ===" az group create --name "$RG" --location "$LOCATION" echo "=== Distribuisci una Web App fittizia ===" 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 "=== Pubblica configurazione XML (attiva il rilevamento) ===" az webapp config backup create --resource-group "$RG" --webapp-name "$WEBAPP" --backup-name "xmlbackup-$(date +%s)" --output none echo "=== Crea un Account di Storage (attiva il rilevamento) ===" az storage account create --name "$STORAGE" --resource-group "$RG" --location "$LOCATION" --sku Standard_LRS --kind StorageV2 --output none echo "=== Crea un Server SQL (necessario per la regola del firewall) ===" az sql server create --name "$SQLSERVER" --resource-group "$RG" --location "$LOCATION" --admin-user "sqladmin" --admin-password "P@ssw0rd1234!" --output none echo "=== Aggiungi regola di firewall al server SQL (attiva il rilevamento) ===" 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 "=== Simulazione completata. Controllare Azure Sentinel per gli avvisi. ===" -
Comandi per la Pulizia:
#!/usr/bin/env bash set -euo pipefail # Le variabili devono corrispondere a quelle utilizzate nello script di simulazione RG="test-rg-..." # Se hai mantenuto gli esatti nomi dall'esecuzione precedente, sostituire di conseguenza i segnaposto. echo "=== Elimina gruppo di risorse e tutte le risorse contenute ===" az group delete --name "$RG" --yes --no-wait echo "Pulizia avviata."