Comment Storm-2949 a transformé une identité compromise en une violation à l’échelle du cloud
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Storm-2949 a utilisé l’ingénierie sociale et l’abus de la réinitialisation du mot de passe en libre-service pour compromettre les comptes Microsoft Entra ID. Après avoir obtenu un accès privilégié, l’acteur malveillant a utilisé des actions du plan de gestion Azure pour atteindre les Services d’application, les coffres de clés, les comptes de stockage et les bases de données SQL. Les données ont ensuite été exfiltrées à partir de Microsoft 365, du stockage Azure et d’autres ressources cloud. L’intrusion a ensuite progressé vers le déploiement de l’outil d’accès à distance ScreenConnect sur des machines virtuelles pour soutenir des reconnaissances supplémentaires et le vol de justificatifs.
Enquête
Les analystes de Microsoft ont observé les attaquants énumérant les utilisateurs et les applications via l’API Microsoft Graph avec des outils Python personnalisés. Ils ont récupéré les profils de publication des services App Azure, extrait des secrets des coffres de clés, modifié les règles de pare-feu et utilisé l’extension VMAccess pour créer des comptes administrateurs locaux sur des machines virtuelles. À une étape ultérieure, un script PowerShell a installé ScreenConnect, effacé les journaux et déguisé les services pour réduire la visibilité. L’enquête a lié cette activité à trois adresses IP contrôlées par les attaquants.
Atténuation
Les organisations devraient activer l’AMF et exiger une authentification résistante au phishing pour les comptes privilégiés. Les autorisations Azure RBAC devraient être strictement restreintes et surveillées, en particulier l’accès de niveau Propriétaire aux coffres de clés et aux services App. Les extensions de VM Azure inutiles devraient être désactivées, et la journalisation devrait être appliquée pour les activités de commande Run et VMAccess. Microsoft Defender for Cloud et Defender for Endpoint devraient également être activés avec une protection anti-sabotage et un mode de blocage.
Réponse
Les défenseurs devraient bloquer immédiatement les adresses IP malveillantes identifiées et révoquer les justificatifs compromis. Les mots de passe et les enregistrements AMF des comptes affectés devraient être réinitialisés, et tous les secrets stockés dans les coffres de clés devraient être renouvelés. Les équipes de sécurité devraient également effectuer une révision complète des affectations Azure RBAC et supprimer les privilèges excessifs. Les règles de détection devraient être mises à jour pour identifier les demandes de profil de publication suspectes, les accès aux secrets des coffres de clés, et les activités inattendues des extensions VM.
graph TB classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef operator fill:#ff9900 action_phishing[« <b>Action</b> – <b>T1566 Phishing</b><br/><b>Description</b>: L’acteur de la menace a envoyé des messages de phishing ciblés exploitant la réinitialisation de mot de passe en libre-service afin de pousser les utilisateurs à approuver des demandes MFA et divulguer des identifiants valides. »] class action_phishing action action_valid_accounts[« <b>Action</b> – <b>T1078 Comptes Valides</b><br/><b>Description</b>: Des identifiants compromis ont été utilisés pour se connecter à Microsoft Entra ID et aux abonnements Azure. »] class action_valid_accounts action action_account_manipulation[« <b>Action</b> – <b>T1098 Manipulation de Comptes</b><br/><b>Description</b>: L’attaquant a réinitialisé des mots de passe, supprimé des facteurs MFA existants et enregistré un authentificateur malveillant pour assurer la persistance. »] class action_account_manipulation action action_cloud_role_add[« <b>Action</b> – <b>T1098.003 Rôles Cloud Supplémentaires</b><br/><b>Description</b>: Des rôles privilégiés Azure RBAC ont été ajoutés aux comptes compromis. »] class action_cloud_role_add action action_cloud_account_discovery[« <b>Action</b> – <b>T1087.004 Découverte de Comptes Cloud</b><br/><b>Description</b>: Microsoft Graph API utilisée pour énumérer utilisateurs, applications et service principals. »] class action_cloud_account_discovery action action_cloud_group_discovery[« <b>Action</b> – <b>T1069.003 Découverte de Groupes Cloud</b><br/><b>Description</b>: Les groupes et affectations de rôles ont été listés pour cartographier les membres privilégiés. »] class action_cloud_group_discovery action action_cloud_service_discovery[« <b>Action</b> – <b>T1526 Découverte de Services Cloud</b><br/><b>Description</b>: Énumération des services Azure tels que App Service, Key Vault, Storage et SQL. »] class action_cloud_service_discovery action action_storage_object_discovery[« <b>Action</b> – <b>T1619 Découverte d’Objets de Stockage Cloud</b><br/><b>Description</b>: Les conteneurs blob Azure Storage ont été énumérés. »] class action_storage_object_discovery action action_keyvault_secret_access[« <b>Action</b> – <b>T1555.006 Accès aux Identifiants depuis les Coffres de Secrets</b><br/><b>Description</b>: Des secrets ont été extraits d’Azure Key Vault. »] class action_keyvault_secret_access action action_remote_services[« <b>Action</b> – <b>T1021.007 Services Distants Cloud</b><br/><b>Description</b>: Des identifiants valides ont été utilisés pour accéder aux ressources Azure. »] class action_remote_services action tool_screenconnect[« <b>Outil</b> – <b>Nom</b>: ScreenConnect (ConnectWise Control)<br/><b>Description</b>: Logiciel d’accès à distance installé sur des machines virtuelles compromises. »] class tool_screenconnect tool action_automated_collection[« <b>Action</b> – <b>T1119 Collecte Automatisée</b><br/><b>Description</b>: Des scripts Python ont téléchargé de grandes quantités de fichiers depuis OneDrive, SharePoint et Azure Storage. »] class action_automated_collection action action_scripting_interpreter[« <b>Action</b> – <b>T1059 Interpréteur de Commandes et de Scripts</b><br/><b>Description</b>: Exécution de scripts via des extensions de machines virtuelles Azure. »] class action_scripting_interpreter action action_indicator_removal[« <b>Action</b> – <b>T1070 Suppression d’Indicateurs</b><br/><b>Description</b>: Les journaux d’événements Windows et fichiers temporaires ont été supprimés. »] class action_indicator_removal action action_file_deletion[« <b>Action</b> – <b>T1070.004 Suppression de Fichiers</b><br/><b>Description</b>: Des artefacts ont été supprimés sur les machines virtuelles compromises. »] class action_file_deletion action action_obfuscation[« <b>Action</b> – <b>T1027.005 Fichiers ou Informations Obfusqués</b><br/><b>Description</b>: Les outils de sécurité ont été modifiés ou obfusqués. »] class action_obfuscation action action_defeat_defenses[« <b>Action</b> – <b>T1562.008 Contournement des Défenses</b><br/><b>Description</b>: Microsoft Defender a été désactivé et les journaux cloud ont été manipulés. »] class action_defeat_defenses action action_phishing –>|conduit_à| action_valid_accounts action_valid_accounts –>|conduit_à| action_account_manipulation action_account_manipulation –>|conduit_à| action_cloud_role_add action_cloud_role_add –>|conduit_à| action_cloud_account_discovery action_cloud_account_discovery –>|conduit_à| action_cloud_group_discovery action_cloud_group_discovery –>|conduit_à| action_cloud_service_discovery action_cloud_service_discovery –>|conduit_à| action_storage_object_discovery action_storage_object_discovery –>|conduit_à| action_keyvault_secret_access action_keyvault_secret_access –>|conduit_à| action_remote_services action_remote_services –>|utilise| tool_screenconnect tool_screenconnect –>|permet| action_automated_collection action_automated_collection –>|utilise| action_scripting_interpreter action_scripting_interpreter –>|permet| action_indicator_removal action_indicator_removal –>|inclut| action_file_deletion action_file_deletion –>|inclut| action_obfuscation action_obfuscation –>|soutient| action_defeat_defenses 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
Flux d’attaque
Détections
Usage suspect de Invoke-RestMethod (via powershell)
Voir
Un coffre Azure possible a été contacté par un processus rare (via dns_query)
Voir
IOC (SourceIP) pour détecter : Comment Storm-2949 a transformé une identité compromise en une violation cloud générale
Voir
IOC (DestinationIP) pour détecter : Comment Storm-2949 a transformé une identité compromise en une violation cloud générale
Voir
Détection des opérations du plan de gestion Azure pour l’exfiltration de données [Journaux d’activité Azure]
Voir
Exécution de simulation
Condition préalable : La vérification télémétrique et de référence doit avoir réussi.
-
Narrative d’attaque et commandes :
Un adversaire qui a obtenu un compte valide Azure AD (ou principal de service par défaut) veut exfiltrer le code source de l’application et les instantanés de la base de données. L’attaquant exécute les étapes suivantes entièrement via Azure CLI, générant exactement
operationNameles événements que règle surveille :- Publier l’application Web XML – extrait la configuration de l’application Web (y compris les justificatifs de déploiement).
- Créer un nouveau compte de stockage – fournit un conteneur pour la mise en scène des données exfiltrées.
- Ajouter une règle de pare-feu au serveur SQL – ouvre le serveur à la plage IP de l’attaquant, permettant la copie directe de données.
Chaque étape produit une entrée du journal d’activité avec
operationNamecorrespondant à la liste blanche de la règle, déclenchant ainsi la détection. -
Script de test de régression :
#!/usr/bin/env bash # Condition préalable : l'interface CLI az est connectée avec un principal Azure AD compromis/valide. set -euo pipefail # Variables – modifiez si nécessaire pour le locataire de 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 "=== Créer un groupe de ressources ===" az group create --name "$RG" --location "$LOCATION" echo "=== Déployer une application Web factice ===" 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 "=== Publier la configuration XML (déclenche la détection) ===" az webapp config backup create --resource-group "$RG" --webapp-name "$WEBAPP" --backup-name "xmlbackup-$(date +%s)" --output none echo "=== Créer un compte de stockage (déclenche la détection) ===" az storage account create --name "$STORAGE" --resource-group "$RG" --location "$LOCATION" --sku Standard_LRS --kind StorageV2 --output none echo "=== Créer un serveur SQL (nécessaire pour la règle de pare-feu) ===" az sql server create --name "$SQLSERVER" --resource-group "$RG" --location "$LOCATION" --admin-user "sqladmin" --admin-password "P@ssw0rd1234!" --output none echo "=== Ajouter une règle de pare-feu au serveur SQL (déclenche la détection) ===" 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 "=== Simulation terminée. Veuillez vérifier les alertes dans Azure Sentinel. ===" -
Commandes de nettoyage :
#!/usr/bin/env bash set -euo pipefail # Les variables doivent correspondre à celles utilisées dans le script de simulation RG="test-rg-..." # Si vous avez conservé les noms exacts de l'exécution précédente, veuillez remplacer les espaces réservés en conséquence. echo "=== Supprimer le groupe de ressources et toutes les ressources contenues ===" az group delete --name "$RG" --yes --no-wait echo "Nettoyage initié."