SOC Prime Bias: Alto

20 May 2026 22:10 UTC

Come Storm-2949 ha trasformato un’identità compromessa in una violazione su tutta la nuvola

Author Photo
SOC Prime Team linkedin icon Segui
Come Storm-2949 ha trasformato un’identità compromessa in una violazione su tutta la nuvola
shield icon

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

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 operationName eventi che la regola controlla:

    1. Pubblica Web App XML – estrae la configurazione della Web App (incluse le credenziali di distribuzione).
    2. Crea un nuovo Account di Storage – fornisce un contenitore per mettere in scena i dati esfiltrati.
    3. 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 operationName corrispondente 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."