AWS - CloudTrail Enum
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
AWS CloudTrail enregistre et surveille l'activité au sein de votre environnement AWS. Il capture des journaux d'événements détaillés, y compris qui a fait quoi, quand et d'où, pour toutes les interactions avec les ressources AWS. Cela fournit une trace d'audit des changements et des actions, aidant à l'analyse de la sécurité, à l'audit de conformité et au suivi des changements de ressources. CloudTrail est essentiel pour comprendre le comportement des utilisateurs et des ressources, améliorer les postures de sécurité et garantir la conformité réglementaire.
Chaque événement enregistré contient :
Le nom de l'API appelée : eventName
Le service appelé : eventSource
L'heure : eventTime
L'adresse IP : SourceIPAddress
La méthode de l'agent : userAgent
. Exemples :
Signing.amazonaws.com - Depuis la console de gestion AWS
console.amazonaws.com - Utilisateur root du compte
lambda.amazonaws.com - AWS Lambda
Les paramètres de la requête : requestParameters
Les éléments de réponse : responseElements
Les événements sont écrits dans un nouveau fichier journal environ toutes les 5 minutes dans un fichier JSON, ils sont conservés par CloudTrail et enfin, les fichiers journaux sont livrés à S3 environ 15 minutes après. Les journaux de CloudTrail peuvent être agrégés à travers les comptes et les régions. CloudTrail permet d'utiliser l'intégrité des fichiers journaux afin de pouvoir vérifier que vos fichiers journaux sont restés inchangés depuis que CloudTrail vous les a livrés. Il crée un hachage SHA-256 des journaux à l'intérieur d'un fichier de résumé. Un hachage sha-256 des nouveaux journaux est créé chaque heure. Lors de la création d'un Trail, les sélecteurs d'événements vous permettront d'indiquer le trail à enregistrer : événements de gestion, de données ou d'informations.
Les journaux sont sauvegardés dans un bucket S3. Par défaut, le chiffrement côté serveur est utilisé (SSE-S3) donc AWS déchiffrera le contenu pour les personnes qui y ont accès, mais pour une sécurité supplémentaire, vous pouvez utiliser SSE avec KMS et vos propres clés.
Les journaux sont stockés dans un bucket S3 avec ce format de nom :
BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD
Le BucketName étant : aws-cloudtrail-logs-<accountid>-<random>
Exemple : aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/
À l'intérieur de chaque dossier, chaque journal aura un nom suivant ce format : AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz
Convention de nommage des fichiers journaux
De plus, les fichiers de résumé (pour vérifier l'intégrité des fichiers) seront à l'intérieur du même bucket dans :
Créez un Trail dans le compte AWS où vous souhaitez que les fichiers journaux soient livrés
Appliquez des autorisations au bucket S3 de destination permettant l'accès inter-comptes pour CloudTrail et autorisez chaque compte AWS qui a besoin d'accès
Créez un nouveau Trail dans les autres comptes AWS et sélectionnez d'utiliser le bucket créé à l'étape 1
Cependant, même si vous pouvez sauvegarder tous les journaux dans le même bucket S3, vous ne pouvez pas agréger les journaux CloudTrail de plusieurs comptes dans des journaux CloudWatch appartenant à un seul compte AWS.
Rappelez-vous qu'un compte peut avoir différents Trails de CloudTrail activés stockant les mêmes (ou différents) journaux dans différents buckets.
Lors de la création d'un CloudTrail, il est possible d'indiquer d'activer CloudTrail pour tous les comptes de l'organisation et de récupérer les journaux dans un seul bucket :
De cette manière, vous pouvez facilement configurer CloudTrail dans toutes les régions de tous les comptes et centraliser les journaux dans 1 compte (que vous devez protéger).
Vous pouvez vérifier que les journaux n'ont pas été altérés en exécutant
CloudTrail peut automatiquement envoyer des journaux à CloudWatch afin que vous puissiez définir des alertes qui vous avertissent lorsque des activités suspectes sont effectuées. Notez que pour permettre à CloudTrail d'envoyer les journaux à CloudWatch, un rôle doit être créé pour autoriser cette action. Si possible, il est recommandé d'utiliser le rôle par défaut d'AWS pour effectuer ces actions. Ce rôle permettra à CloudTrail de :
CreateLogStream : Cela permet de créer des flux de journaux CloudWatch
PutLogEvents : Livrer les journaux CloudTrail au flux de journaux CloudWatch
L'historique des événements CloudTrail vous permet d'inspecter dans un tableau les journaux qui ont été enregistrés :
CloudTrail Insights analyse automatiquement les événements de gestion d'écriture des pistes CloudTrail et vous alerte sur des activités inhabituelles. Par exemple, s'il y a une augmentation des événements TerminateInstance
qui diffère des bases établies, vous le verrez comme un événement Insight. Ces événements facilitent la recherche et la réponse à des activités API inhabituelles comme jamais auparavant.
Les insights sont stockés dans le même bucket que les journaux CloudTrail dans : BucketName/AWSLogs/AccountID/CloudTrail-Insight
Intégrité des fichiers journaux CloudTrail
Valider si les journaux ont été altérés (modifiés ou supprimés)
Utilise des fichiers de résumé (crée un hachage pour chaque fichier)
Hachage SHA-256
SHA-256 avec RSA pour la signature numérique
clé privée détenue par Amazon
Prend 1 heure pour créer un fichier de résumé (fait à l'heure chaque heure)
Arrêter l'accès non autorisé
Utiliser des politiques IAM et des politiques de bucket S3
équipe de sécurité —> accès administrateur
auditeurs —> accès en lecture seule
Utiliser SSE-S3/SSE-KMS pour chiffrer les journaux
Empêcher la suppression des fichiers journaux
Restreindre l'accès à la suppression avec des politiques IAM et des politiques de bucket
Configurer la suppression MFA S3
Valider avec la validation des fichiers journaux
Le Conseiller d'accès AWS s'appuie sur les 400 derniers jours de journaux CloudTrail AWS pour recueillir ses insights. CloudTrail capture un historique des appels API AWS et des événements connexes effectués dans un compte AWS. Le Conseiller d'accès utilise ces données pour montrer quand les services ont été accédés pour la dernière fois. En analysant les journaux CloudTrail, le Conseiller d'accès peut déterminer quels services AWS un utilisateur ou un rôle IAM a accédés et quand cet accès a eu lieu. Cela aide les administrateurs AWS à prendre des décisions éclairées sur l'affinement des autorisations, car ils peuvent identifier les services qui n'ont pas été accédés pendant de longues périodes et potentiellement réduire des autorisations trop larges en fonction des modèles d'utilisation réels.
Par conséquent, le Conseiller d'accès informe sur les autorisations inutiles accordées aux utilisateurs afin que l'administrateur puisse les supprimer.
Il est possible d'effectuer une injection CSV dans CloudTrail qui exécutera du code arbitraire si les journaux sont exportés en CSV et ouverts avec Excel. Le code suivant générera une entrée de journal avec un mauvais nom de Trail contenant la charge utile :
Pour plus d'informations sur les injections CSV, consultez la page :
Pour plus d'informations sur cette technique spécifique, consultez https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/
Les Honeytokens sont créés pour détecter l'exfiltration d'informations sensibles. Dans le cas d'AWS, ce sont des clés AWS dont l'utilisation est surveillée. Si quelque chose déclenche une action avec cette clé, alors quelqu'un doit avoir volé cette clé.
Cependant, les Honeytokens comme ceux créés par Canarytokens, SpaceCrab, SpaceSiren utilisent soit un nom de compte reconnaissable, soit le même ID de compte AWS pour tous leurs clients. Par conséquent, si vous pouvez obtenir le nom du compte et/ou l'ID du compte sans faire créer de journal par Cloudtrail, vous pourriez savoir si la clé est un honeytoken ou non.
Pacu a quelques règles pour détecter si une clé appartient à Canarytokens, SpaceCrab, SpaceSiren:
Si canarytokens.org
apparaît dans le nom du rôle ou si l'ID de compte 534261010715
apparaît dans le message d'erreur.
En les testant plus récemment, ils utilisent le compte 717712589309
et ont toujours la chaîne canarytokens.com
dans le nom.
Si SpaceCrab
apparaît dans le nom du rôle dans le message d'erreur.
SpaceSiren utilise des uuids pour générer des noms d'utilisateur : [a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}
Si le nom semble aléatoirement généré, il y a de fortes probabilités que ce soit un HoneyToken.
Vous pouvez obtenir l'ID de compte à partir de l'encodé à l'intérieur de la clé d'accès comme expliqué ici et vérifier l'ID de compte avec votre liste de comptes Honeytokens AWS :
Check more information in the recherche originale.
La technique la plus efficace pour cela est en fait une simple. Utilisez simplement la clé que vous venez de trouver pour accéder à un service dans votre propre compte d'attaquant. Cela fera en sorte que CloudTrail génère un journal dans VOTRE PROPRE compte AWS et non dans celui des victimes.
Le fait est que la sortie vous montrera une erreur indiquant l'ID du compte et le nom du compte, donc vous pourrez voir si c'est un Honeytoken.
Dans le passé, il y avait certains services AWS qui n'envoient pas de journaux à CloudTrail (trouvez une liste ici). Certains de ces services répondront avec une erreur contenant l'ARN du rôle de clé si quelqu'un non autorisé (la clé honeytoken) essaie d'y accéder.
De cette manière, un attaquant peut obtenir l'ARN de la clé sans déclencher aucun journal. Dans l'ARN, l'attaquant peut voir l'ID de compte AWS et le nom, il est facile de connaître l'ID et les noms des comptes des entreprises HoneyToken, ainsi un attaquant peut identifier si le token est un HoneyToken.
Notez que toutes les API publiques découvertes ne créant pas de journaux CloudTrail sont maintenant corrigées, donc vous devrez peut-être trouver les vôtres...
Pour plus d'informations, consultez la recherche originale.
Certains services AWS généreront une infrastructure telle que des bases de données ou des clusters Kubernetes (EKS). Un utilisateur parlant directement à ces services (comme l'API Kubernetes) n'utilisera pas l'API AWS, donc CloudTrail ne pourra pas voir cette communication.
Par conséquent, un utilisateur ayant accès à EKS qui a découvert l'URL de l'API EKS pourrait générer un token localement et parler directement au service API sans être détecté par Cloudtrail.
Plus d'infos dans :
AWS - EKS Post ExploitationDans le premier exemple, un seul sélecteur d'événements est fourni sous forme de tableau JSON avec un seul objet. Le "ReadWriteType": "ReadOnly"
indique que le sélecteur d'événements ne doit capturer que des événements en lecture seule (donc les insights de CloudTrail ne vérifieront pas les événements d'écriture par exemple).
Vous pouvez personnaliser le sélecteur d'événements en fonction de vos exigences spécifiques.
Supprimer le bucket S3
Changer la politique du bucket pour refuser toute écriture du service CloudTrail
Ajouter une politique de cycle de vie au bucket S3 pour supprimer des objets
Désactiver la clé KMS utilisée pour chiffrer les journaux CloudTrail
Vous pourriez générer une clé asymétrique et faire en sorte que CloudTrail chiffre les données avec cette clé et supprimer la clé privée afin que le contenu de CloudTrail ne puisse pas être récupéré. C'est essentiellement un ransomware S3-KMS expliqué dans :
AWS - S3 Post ExploitationRansomware KMS
C'est un moyen plus simple d'effectuer l'attaque précédente avec des exigences de permissions différentes :
AWS - KMS Post ExploitationApprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE) Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)