Skip to content

Cet outil n’est ni affilié à Amazon Web Services, Inc. ou Amazon.com, Inc., ni approuvé ou sponsorisé par ces sociétés. AWS, Amazon Web Services, CloudTrail et GuardDuty sont des marques d’Amazon.com, Inc. ou de ses sociétés affiliées. Les autres noms sont des marques de leurs propriétaires respectifs.

Élévation de privilèges et persistance IAM dans CloudTrail

Comment un attaquant reste dans AWS via IAM (utilisateurs cachés, clés en plus, politiques admin, rôles, fournisseurs d'identité) ce que CloudTrail en montre.

Publié le 6 min de lecture

En bref. Après la fuite d'une clé, la priorité de l'attaquant est de ne plus dépendre de cette clé. Les gestes habituels, tous visibles dans CloudTrail sous iam.amazonaws.com : CreateUser → AttachUserPolicy (AdministratorAccess) → CreateAccessKey et CreateLoginProfile pour cet utilisateur. Variantes plus discrètes : une deuxième clé sur un utilisateur existant, un principal supplémentaire dans la politique d'approbation d'un rôle, un nouveau fournisseur SAML/OIDC, une fonction Lambda publique ou des user data EC2 modifiées. Lisez requestParameters pour connaître la cible et responseElements pour les identifiants des nouvelles clés, et supprimez chacun de ces éléments avant de déclarer l'incident clos.

Révoquer l'identifiant divulgué, c'est la partie facile d'un incident AWS. Ce qui tourne mal, c'est la porte dérobée que vous n'avez pas trouvée : celle qui permet au même acteur de revenir une semaine plus tard avec une clé que vous n'avez jamais vue. Cet article passe en revue les techniques de persistance et d'élévation de privilèges IAM qui reviennent sans cesse dans les journaux, et la façon dont chacune apparaît dans CloudTrail.

Les événements IAM sont globaux, et journalisés dans us-east-1

IAM est un service global ; comme la plupart des événements de services globaux, ses événements CloudTrail sont enregistrés avec awsRegion à us-east-1. Si vous n'avez récupéré l'historique des événements que pour la région où tournent vos workloads, vous êtes peut-être passé à côté de toutes les modifications IAM. Vérifiez explicitement cette région.

Les utilisateurs servant de porte dérobée

La version bruyante, et toujours la plus courante :

{"eventSource": "iam.amazonaws.com", "eventName": "CreateUser",
 "requestParameters": {"userName": "backup-admin"}}
{"eventName": "AttachUserPolicy",
 "requestParameters": {"userName": "backup-admin",
   "policyArn": "arn:aws:iam::aws:policy/AdministratorAccess"}}
{"eventName": "CreateAccessKey",
 "requestParameters": {"userName": "backup-admin"},
 "responseElements": {"accessKey": {"accessKeyId": "AKIA..."}}}
{"eventName": "CreateLoginProfile",
 "requestParameters": {"userName": "backup-admin", "passwordResetRequired": false}}

Ce qui la trahit :

  • Les quatre appels se suivent à quelques secondes d'intervalle, depuis la même clé et la même IP.
  • Le nom est choisi pour se fondre dans le décor : backup, support, svc-…, terraform, quelque chose qui ressemble à un compte de service.
  • passwordResetRequired: false sur un profil de connexion créé par un script.
  • L'utilisateur se connecte ensuite à la console sans MFA (ConsoleLogin avec additionalEventData.MFAUsed = "No").

ATT&CK : T1136.003 Create Account: Cloud Account, T1098.003 Additional Cloud Roles.

Des identifiants supplémentaires sur des identités existantes

Plus discret : au lieu de créer un utilisateur, l'attaquant ajoute une deuxième clé d'accès à un utilisateur existant (un utilisateur peut en avoir deux), ou définit un mot de passe console sur un utilisateur de service qui n'en a jamais eu.

  • CreateAccessKey où requestParameters.userName diffère du nom d'utilisateur de l'appelant : un principal qui génère une clé pour quelqu'un d'autre, c'est rare en fonctionnement normal.
  • CreateLoginProfile ou UpdateLoginProfile sur un utilisateur censé n'avoir qu'un accès programmatique.

Le rapport d'identifiants aide ici : access_key_2_active = true sur un utilisateur qui n'a toujours eu qu'une seule clé, ou password_enabled = true sur un compte de service, méritent qu'on pose la question.

ATT&CK : T1098.001 Additional Cloud Credentials.

Droits administrateur : attachés, inline ou via un groupe

TechniqueÉvénementsCe qu'il faut lire
Politique gérée d'administrationAttachUserPolicy, AttachRolePolicy, AttachGroupPolicypolicyArn = …:policy/AdministratorAccess ou IAMFullAccess
Politique inline *:*PutUserPolicy, PutRolePolicy, PutGroupPolicypolicyDocument avec Action: "*" et Resource: "*"
Nouvelle version de politiqueCreatePolicyVersion (souvent avec setAsDefault: true)Même vérification du document ; le nom de la politique peut sembler anodin
Appartenance à un groupe d'administrationAddUserToGroupgroupName du type Admins

CreatePolicyVersion mérite l'attention, car il modifie ce qu'accorde une politique existante et considérée comme sûre, sans changer ni son nom ni ses attachements. SetDefaultPolicyVersion peut obtenir le même résultat en revenant à une version plus ancienne et plus permissive.

Approbation de rôle et fédération

Les rôles sont plus difficiles à repérer que les utilisateurs, car rien de nouveau n'apparaît dans la liste des utilisateurs.

  • UpdateAssumeRolePolicy réécrit la liste de qui peut assumer un rôle. Un attaquant y ajoute son propre ID de compte AWS ou un principal externe. Comparez le nouveau policyDocument au précédent (historique AWS Config, infrastructure as code, ou un GetRole antérieur).
  • CreateSAMLProvider, CreateOpenIDConnectProvider, AddClientIDToOpenIDConnectProvider, UpdateOpenIDConnectProviderThumbprint : quiconque contrôle le fournisseur d'identité peut obtenir des identifiants de rôle dans le compte via AssumeRoleWithSAML / AssumeRoleWithWebIdentity. ATT&CK : T1484.002 Trust Modification.

Lorsque l'organisation fédère ses accès via un fournisseur d'identité externe, l'attaquant a pu entrer par celui-ci plutôt que par IAM ; pour un accès adossé à Okta, voir oktaforensics.com.

Persistance par le calcul

TechniqueÉvénementsPourquoi cela persiste
Lambda publiqueAddPermission avec le principal * ; CreateFunctionUrlConfig avec authType: NONEN'importe qui peut invoquer du code qui s'exécute avec le rôle de la fonction
Code Lambda nouveau ou modifiéCreateFunction, UpdateFunctionCode depuis une clé utilisée de façon interactiveDu code contrôlé par l'attaquant, avec les permissions du rôle
User data EC2ModifyInstanceAttribute avec userDataLe script s'exécute en root au prochain démarrage
Paires de clés SSHCreateKeyPair, ImportKeyPairAccès aux instances lancées avec cette paire

Les déploiements de code Lambda depuis la CI sont normaux. Le même événement émis par la clé à long terme d'un humain à une heure inhabituelle ne l'est pas.

Comment s'assurer de les avoir tous trouvés

  1. Pivotez sur chaque principal contrôlé par l'attaquant (l'utilisateur de la clé divulguée, les utilisateurs créés, les rôles assumés) et listez leurs écritures réussies (readOnly = false, pas d'errorCode).
  2. Extrayez chaque nouvel identifiant de clé des réponses de CreateAccessKey et pivotez aussi sur ceux-là.
  3. Comparez l'état actuel d'IAM à son état antérieur : rapport d'identifiants, sortie de aws iam get-account-authorization-details, ou l'état de votre IaC.
  4. Cherchez les tentatives échouées : un AccessDenied sur CreateUser vous dit ce que l'attaquant a essayé, et si une réussite ultérieure est venue d'un autre principal.

Dans l'analyseur

AWS Forensics dispose d'une règle pour chacune des techniques ci-dessus (« Utilisateur IAM créé », « Clé d’accès créée pour un autre utilisateur », « Mot de passe console défini pour un utilisateur », « Politique d’approbation de rôle modifiée », « Fournisseur d’identité ajouté ou modifié », « Utilisateur ajouté à un groupe d’administration », « Fonction Lambda exposée publiquement », « Fonction Lambda créée ou code mis à jour », « User data EC2 modifiées », « Paire de clés SSH créée ou importée », « Politique administrateur attachée », « Politique accordant un accès total (:) »), et la checklist de remédiation nomme précisément les utilisateurs, clés et rôles à nettoyer. La référence des événements à surveiller les liste avec leurs ID ATT&CK, et le déroulé d'incident fictif montre la création puis la découverte d'un administrateur servant de porte dérobée.

Pour aller plus loin

Articles liés

Les événements CloudTrail que tout intervenant AWS doit connaître, de la reconnaissance à l'impact, avec les champs porteurs de preuves et les ID MITRE ATT&CK.
Contournement des défenses sur AWS : StopLogging, DeleteTrail, sélecteurs d'événements, détecteurs GuardDuty, Config et Flow Logs supprimés dans CloudTrail.
Une clé d'accès AWS a fuité : désactivez-la, puis retrouvez dans CloudTrail où elle a servi, ce qu'elle a énuméré, ce qu'elle a créé et les données exposées.

Cet outil n’est ni affilié à Amazon Web Services, Inc. ou Amazon.com, Inc., ni approuvé ou sponsorisé par ces sociétés. AWS, Amazon Web Services, CloudTrail et GuardDuty sont des marques d’Amazon.com, Inc. ou de ses sociétés affiliées. Les autres noms sont des marques de leurs propriétaires respectifs.