Réponse à incident AWS : de la clé divulguée au minage
Un incident AWS fictif analysé à partir des journaux : clé divulguée, reconnaissance, admin backdoor, GuardDuty supprimé, 320 objets S3 volés, minage GPU.
Scénario fictif. Tout ce qui figure dans cet article (l'entreprise, les personnes, le compte
111122223333, les clés, le bucket) est inventé. Les adresses IP proviennent des plages réservées à la documentation par la RFC 5737. Ce sont les données qui se cachent derrière le bouton Essayer un exemple de l'analyseur : vous pouvez donc reproduire chaque étape.
En bref. Le 14 septembre 2026 (fictif), la clé d'accès du développeur dev-marco est utilisée depuis un VPS sous Kali Linux. En 48 minutes, l'attaquant valide la clé, énumère le compte, crée un utilisateur administrateur backup-admin doté de sa propre clé et d'un mot de passe console, supprime GuardDuty dans deux régions, télécharge 320 objets depuis acme-customer-exports et lance huit instances GPU dans ap-southeast-1 qui minent pour un pool. Les journaux montrent tout. Le verdict est Signes de compromission, et la liste de remédiation doit couvrir deux clés, un utilisateur, une politique, deux détecteurs, huit instances et une évaluation des obligations de notification.
Les preuves
Le ZIP d'exemple reproduit de vrais exports :
| Source | Contenu |
|---|---|
Trail CloudTrail (arborescence S3, json.gz, plus un fichier digest) | 449 événements du 10 au 14 septembre, dont 325 événements de données S3 |
| VPC Flow Logs (livraison S3, avec ligne d'en-tête) | 2 335 enregistrements, eu-west-1 et ap-southeast-1 |
| Journaux d'accès au serveur S3 | 324 lignes pour acme-customer-exports |
Sortie de get-findings GuardDuty | 2 détections, exportées avant la suppression des détecteurs |
| Rapport d'identifiants IAM | 4 entrées, généré après l'incident |
Quatre journées calmes (du 10 au 13 septembre) fournissent la référence : ops-julia se connecte à la console avec MFA depuis l'adresse du bureau 198.51.100.24 ; dev-marco utilise la CLI avec sa clé à long terme depuis la même adresse ; un rôle de tâche ECS est assumé chaque jour.
Chronologie (UTC, 14 septembre 2026)
| Heure | Événement | Principal | Détection |
|---|---|---|---|
| 09:02:11 | sts:GetCallerIdentity depuis 203.0.113.77, le user agent contient kali | dev-marco (AKIA3EXAMPLEMARCO123) | Clé utilisée depuis une nouvelle adresse IP (élevée), outil offensif dans le user agent (élevée), GetCallerIdentity (faible) |
| 09:03–09:07 | 48 appels List/Describe/Get sur IAM, S3, EC2, Lambda, RDS, KMS, Organizations… dont 14 en AccessDenied | dev-marco | Rafale d'énumération d'API (moyenne), rafale d'erreurs AccessDenied (moyenne) |
| 09:07 | GuardDuty : Discovery:IAMUser/AnomalousBehavior, PenTest:IAMUser/KaliLinux | — | Détection GuardDuty ×2 (moyenne) |
| 09:08:40 | iam:CreateUser backup-admin | dev-marco | Utilisateur IAM créé (faible) |
| 09:08:52 | AttachUserPolicy AdministratorAccess → backup-admin | dev-marco | Politique administrateur attachée (élevée) |
| 09:09:05 | CreateAccessKey pour backup-admin → AKIA3EXAMPLEBKUP4567 | dev-marco | Clé d'accès créée pour un autre utilisateur (élevée) |
| 09:09:20 | CreateLoginProfile pour backup-admin, sans réinitialisation obligatoire | dev-marco | Mot de passe console défini pour un utilisateur (moyenne) |
| 09:12:12 / 09:12:43 | guardduty:DeleteDetector dans us-east-1 et eu-west-1 (Boto3) | backup-admin | GuardDuty désactivé ou affaibli ×2 (élevée) |
| 09:15:00–09:36:02 | ListObjects puis 320 GetObject sur acme-customer-exports | backup-admin | Téléchargement S3 massif : événements de données (élevée) et journaux d'accès (élevée) |
| 09:41:10 | CreateKeyPair ops-maint dans ap-southeast-1 | backup-admin | Paire de clés SSH créée (faible) |
| 09:42:05 | Groupe de sécurité ouvert sur 0.0.0.0/0 sur le port 22 | backup-admin | Groupe de sécurité ouvert sur Internet (moyenne) |
| 09:43:10 | Augmentation de quota pour « Running On-Demand P instances » | backup-admin | Augmentation de quota demandée (moyenne) |
| 09:44:10 / 09:46:10 | RunInstances 4× p3.8xlarge, 4× g4dn.12xlarge | backup-admin | Instances GPU lancées (élevée), nouvelle région (moyenne) |
| 09:50:31 | ConsoleLogin backup-admin, MFAUsed: No, Firefox sous Linux | backup-admin | Connexion à la console sans MFA (moyenne) |
| 09:52 → 12:01 | 8 interfaces maintiennent des connexions vers 192.0.2.150 sur les ports 3333 et 14444 | — | Ports de pools de minage (élevée), 1 040 enregistrements |
Le rapport d'identifiants ajoute une détection de configuration : backup-admin possède un mot de passe console et aucune MFA.
Le déroulé de l'investigation
1. Le verdict. Vingt-trois détections, dont plusieurs de sévérité élevée portant des signaux côté attaquant (anomalie d'accès, contournement des défenses, exfiltration, impact) : le verdict est « Signes de compromission ». Les principales raisons listées sont le user agent offensif, la clé utilisée depuis une nouvelle adresse IP, la politique administrateur, la clé créée pour un autre utilisateur et les deux suppressions de GuardDuty.
2. Le point d'entrée. Pivotez sur AKIA3EXAMPLEMARCO123 dans l'onglet « Entités » : quatre jours depuis 198.51.100.24 avec une CLI sous macOS, puis, à partir de 09:02, 203.0.113.77 avec une chaîne de build Kali. Le tout premier appel depuis la nouvelle adresse est GetCallerIdentity : l'ouverture classique d'une clé d'accès divulguée. La manière dont la clé a fuité (le scénario évoque un dépôt public) échappe aux journaux AWS.
3. La seconde clé. Pivotez sur 203.0.113.77 : en plus de la clé de dev-marco, cette adresse a utilisé AKIA3EXAMPLEBKUP4567, la clé émise à 09:09:05 pour backup-admin. À partir de 09:12, l'attaquant n'utilise plus jamais la clé divulguée. Désactiver uniquement la clé de dev-marco n'aurait rien changé. C'est le schéma de persistance IAM dans sa forme la plus simple.
4. Le contournement des défenses. Les deux détecteurs sont supprimés en moins d'une minute, trois minutes après la création de la backdoor. CloudTrail, lui, continue de tourner (aucun StopLogging), et c'est pour cela que la suite de l'histoire est visible. Les détections GuardDuty n'ont survécu que parce qu'elles avaient été exportées ; voir l'article sur le contournement des défenses.
5. Les données. 320 GetObject en 21 minutes, par un seul principal, sur un seul bucket, vus deux fois : dans les événements de données CloudTrail et dans les journaux d'accès au serveur. Les clés d'objets (de exports/2026/customers/customers-0001.csv.gz à -0320) constituent l'inventaire des données divulguées. Notez que les VPC Flow Logs ne montrent rien ici : le téléchargement est allé de S3 à l'hôte de l'attaquant via Internet, sans jamais passer par le VPC. C'est exactement la limite décrite dans les preuves d'exfiltration de données S3.
6. Le coût. Une région sans activité pendant la période de référence, une augmentation de quota, une paire de clés, SSH ouvert au monde entier et huit instances GPU ; à partir de 09:52, leurs interfaces communiquent chaque minute avec une même adresse sur des ports de pools. L'article sur le minage de cryptomonnaie couvre cette phase.
7. La session console. À 09:50, l'attaquant se connecte en tant que backup-admin sans MFA. Tout ce qui serait fait ensuite dans la console apparaîtrait avec sessionCredentialFromConsole ; dans ce jeu de données, la session clôt l'histoire.
La liste de remédiation qui en découle
Le confinement d'abord, avec les valeurs tirées des journaux :
- Désactivez
AKIA3EXAMPLEMARCO123etAKIA3EXAMPLEBKUP4567; remplacez la clé de dev-marco et purgez-la du dépôt. - Sauvegardez puis supprimez
backup-admin(politique, clé, profil de connexion). - Détachez AdministratorAccess de
backup-adminet passez en revue les autres détenteurs. - Bloquez les appels d'API depuis
203.0.113.77pendant l'investigation. - Faites un snapshot d'une instance, supprimez les huit instances d'ap-southeast-1, vérifiez toutes les autres régions ; supprimez la paire de clés
ops-maintet le groupe de sécurité ouvert ; retirez la demande de quotaL-417A185B. - Réactivez GuardDuty dans us-east-1 et eu-west-1 (idéalement partout).
- Considérez
acme-customer-exportscomme exfiltré : listez les 320 objets et évaluez les obligations de notification. - Ouvrez un dossier auprès du support AWS au sujet de l'utilisation non autorisée.
Ce que cet exemple ne montre pas
Les incidents réels sont plus désordonnés : rôles de CI bruyants, plusieurs adresses IP côté attaquant, chaînage de rôles, activité étalée sur des semaines, journaux absents précisément là où vous en avez besoin. L'exemple est volontairement propre pour que la méthode soit visible. Lisez les limites d'une investigation fondée uniquement sur les journaux avant d'accorder la même confiance à des données réelles, et suivez le guide d'analyse pas à pas pour la démarche.