AWS - S3, Athena & Glacier Enum

Impara l'hacking di AWS da zero a eroe con htARTE (Esperto Red Team di HackTricks AWS)!

Altri modi per supportare HackTricks:

S3

Amazon S3 è un servizio che ti permette di archiviare grandi quantità di dati.

Amazon S3 fornisce diverse opzioni per garantire la protezione dei dati in stato di riposo. Le opzioni includono Autorizzazioni (Policy), Crittografia (Client e Server Side), Versioning del Bucket e Eliminazione basata su MFA. L'utente può abilitare una qualsiasi di queste opzioni per garantire la protezione dei dati. La replicazione dei dati è una funzionalità interna di AWS in cui S3 replica automaticamente ogni oggetto in tutte le Zone di Disponibilità e l'organizzazione non ha bisogno di abilitarla in questo caso.

Con le autorizzazioni basate sulle risorse, è possibile definire autorizzazioni per le sottodirectory del tuo bucket separatamente.

Versioning del Bucket e Eliminazione basata su MFA

Quando il versioning del bucket è abilitato, qualsiasi azione che tenta di modificare un file all'interno di un file genererà una nuova versione del file, mantenendo anche il contenuto precedente dello stesso. Pertanto, non sovrascriverà il suo contenuto.

Inoltre, l'eliminazione basata su MFA impedirà che le versioni dei file nel bucket S3 vengano eliminate e anche che il Versioning del Bucket venga disabilitato, in modo che un attaccante non possa modificare questi file.

Log di accesso a S3

È possibile abilitare il logging degli accessi a S3 (che di default è disabilitato) per alcuni bucket e salvare i log in un bucket diverso per sapere chi sta accedendo al bucket (entrambi i bucket devono essere nella stessa regione).

URL firmati di S3

È possibile generare un URL firmato che di solito può essere utilizzato per accedere al file specificato nel bucket. Un URL firmato ha questo aspetto:

https://<bucket-name>.s3.us-east-1.amazonaws.com/asd.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAUUE8GZC4S5L3TY3P%2F20230227%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230227T142551Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjELf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJHMEUCIBhQpdETJO3HKKDk2hjNIrPWwBE8gZaQccZFV3kCpPCWAiEAid3ueDtFFU%2FOQfUpvxYTGO%2BHoS4SWDMUrQAE0pIaB40qggMIYBAAGgwzMTgxNDIxMzg1NTMiDJLI5t7gr2EGxG1Y5CrfAioW0foHIQ074y4gvk0c%2B%2Fmqc7cNWb1njQslQkeePHkseJ3owzc%2FCwkgE0EuZTd4mw0aJciA2XIbJRCLPWTb%2FCBKPnIMJ5aBzIiA2ltsiUNQTTUxYmEgXZoJ6rFYgcodnmWW0Et4Xw59UlHnCDB2bLImxPprriyCzDDCD6nLyp3J8pFF1S8h3ZTJE7XguA8joMs4%2B2B1%2FeOZfuxXKyXPYSKQOOSbQiHUQc%2BFnOfwxleRL16prWk1t7TamvHR%2Bt3UgMn5QWzB3p8FgWwpJ6GjHLkYMJZ379tkimL1tJ7o%2BIod%2FMYrS7LDCifP9d%2FuYOhKWGhaakPuJKJh9fl%2B0vGl7kmApXigROxEWon6ms75laXebltsWwKcKuYca%2BUWu4jVJx%2BWUfI4ofoaGiCSaKALTqwu4QNBRT%2BMoK6h%2BQa7gN7JFGg322lkxRY53x27WMbUE4unn5EmI54T4dWt1%2Bg8ljDS%2BvKfBjqmAWRwuqyfwXa5YC3xxttOr3YVvR6%2BaXpzWtvNJQNnb6v0uI3%2BTtTexZkJpLQYqFcgZLQSxsXWSnf988qvASCIUhAzp2UnS1uqy7QjtD5T73zksYN2aesll7rvB80qIuujG6NOdHnRJ2M5%2FKXXNo1Yd15MtzPuSjRoSB9RSMon5jFu31OrQnA9eCUoawxbB0nHqwK8a43CKBZHhA8RoUAJW%2B48EuFsp3U%3D&X-Amz-Signature=3436e4139e84dbcf5e2e6086c0ebc92f4e1e9332b6fda24697bc339acbf2cdfa

Un URL prefirmato può essere creato dalla CLI utilizzando le credenziali di un principale con accesso all'oggetto (se l'account che si utilizza non ha accesso, verrà creato un URL prefirmato più breve ma sarà inutile)

aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'

L'unica autorizzazione richiesta per generare un URL prefirmato è l'autorizzazione concessa, quindi per il comando precedente l'unica autorizzazione necessaria per il principale è s3:GetObject

È anche possibile creare URL prefirmati con altre autorizzazioni:

import boto3
url = boto3.client('s3').generate_presigned_url(
ClientMethod='put_object',
Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'},
ExpiresIn=3600
)

Meccanismi di Crittografia S3

DEK significa Chiave di Crittografia dei Dati ed è la chiave che viene sempre generata e utilizzata per crittografare i dati.

Crittografia lato server con chiavi gestite da S3, SSE-S3

Questa opzione richiede una configurazione minima e tutte le chiavi di crittografia utilizzate sono gestite da AWS. Tutto ciò che devi fare è caricare i tuoi dati e S3 si occuperà di tutti gli altri aspetti. Ad ogni bucket in un account S3 viene assegnata una chiave del bucket.

  • Crittografia:

  • Dati dell'oggetto + DEK in chiaro creato --> Dati crittografati (memorizzati all'interno di S3)

  • DEK in chiaro creato + Chiave Master S3 --> DEK crittografato (memorizzato all'interno di S3) e il testo in chiaro viene eliminato dalla memoria

  • Decrittografia:

  • DEK crittografato + Chiave Master S3 --> DEK in chiaro

  • DEK in chiaro + Dati crittografati --> Dati dell'oggetto

Si noti che in questo caso la chiave è gestita da AWS (rotazione solo ogni 3 anni). Se si utilizza la propria chiave è possibile ruotarla, disabilitarla e applicare il controllo degli accessi.

Crittografia lato server con chiavi gestite da KMS, SSE-KMS

Questo metodo consente a S3 di utilizzare il servizio di gestione delle chiavi per generare le chiavi di crittografia dei dati. KMS offre una maggiore flessibilità su come le chiavi sono gestite. Ad esempio, è possibile disabilitare, ruotare e applicare controlli di accesso al CMK, e ordinarli contro il loro utilizzo utilizzando AWS Cloud Trail.

  • Crittografia:

  • S3 richiede le chiavi dei dati a KMS CMK

  • KMS utilizza un CMK per generare la coppia DEK in chiaro e DEK crittografato e li invia a S3

  • S3 utilizza la chiave in chiaro per crittografare i dati, memorizza i dati crittografati e la chiave crittografata ed elimina dalla memoria la chiave in chiaro

  • Decrittografia:

  • S3 chiede a KMS di decrittografare la chiave dei dati crittografati dell'oggetto

  • KMS decrittografa la chiave dei dati con il CMK e la invia nuovamente a S3

  • S3 decrittografa i dati dell'oggetto

Crittografia lato server con chiavi fornite dal cliente, SSE-C

Questa opzione ti dà la possibilità di fornire la propria chiave principale che potresti già utilizzare al di fuori di AWS. La chiave fornita dal cliente viene quindi inviata insieme ai dati a S3, dove S3 eseguirà la crittografia per te.

  • Crittografia:

  • L'utente invia i dati dell'oggetto + Chiave del cliente a S3

  • La chiave del cliente viene utilizzata per crittografare i dati e i dati crittografati vengono memorizzati

  • viene memorizzato anche un valore HMAC salato della chiave del cliente per la futura convalida della chiave

  • la chiave del cliente viene eliminata dalla memoria

  • Decrittografia:

  • L'utente invia la chiave del cliente

  • La chiave viene convalidata rispetto al valore HMAC memorizzato

  • La chiave fornita dal cliente viene quindi utilizzata per decrittografare i dati

Crittografia lato client con KMS, CSE-KMS

Analogamente a SSE-KMS, anche questo utilizza il servizio di gestione delle chiavi per generare le chiavi di crittografia dei dati. Tuttavia, questa volta KMS viene chiamato dal client e non da S3. La crittografia avviene quindi lato client e i dati crittografati vengono quindi inviati a S3 per essere memorizzati.

  • Crittografia:

  • Il client richiede una chiave dati a KMS

  • KMS restituisce il DEK in chiaro e il DEK crittografato con il CMK

  • Entrambe le chiavi vengono inviate indietro

  • Il client quindi crittografa i dati con il DEK in chiaro e invia a S3 i dati crittografati + il DEK crittografato (che viene salvato come metadati dei dati crittografati all'interno di S3)

  • Decrittografia:

  • I dati crittografati con il DEK crittografato vengono inviati al client

  • Il client chiede a KMS di decrittografare la chiave crittografata utilizzando il CMK e KMS restituisce il DEK in chiaro

  • Il client può ora decrittografare i dati crittografati

Crittografia lato client con chiavi fornite dal cliente, CSE-C

Utilizzando questo meccanismo, è possibile utilizzare le proprie chiavi fornite e utilizzare un client AWS-SDK per crittografare i dati prima di inviarli a S3 per lo storage.

  • Crittografia:

  • Il client genera un DEK e crittografa i dati in chiaro

  • Quindi, utilizzando il proprio CMK personalizzato, crittografa il DEK

  • invia i dati crittografati + DEK crittografato a S3 dove vengono memorizzati

  • Decrittografia:

  • S3 invia i dati crittografati e il DEK

  • Poiché il client ha già il CMK utilizzato per crittografare il DEK, decifra il DEK e quindi utilizza il DEK in chiaro per decrittografare i dati

Enumerazione

Uno dei principali modi tradizionali per compromettere le organizzazioni AWS inizia compromettendo i bucket accessibili pubblicamente. È possibile trovare enumeratori di bucket pubblici in questa pagina.

# Get buckets ACLs
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api get-object-acl --bucket <bucket-name> --key flag

# Get policy
aws s3api get-bucket-policy --bucket <bucket-name>
aws s3api get-bucket-policy-status --bucket <bucket-name> #if it's public

# list S3 buckets associated with a profile
aws s3 ls
aws s3api list-buckets

# list content of bucket (no creds)
aws s3 ls s3://bucket-name --no-sign-request
aws s3 ls s3://bucket-name --recursive

# list content of bucket (with creds)
aws s3 ls s3://bucket-name
aws s3api list-objects-v2 --bucket <bucket-name>
aws s3api list-objects --bucket <bucket-name>
aws s3api list-object-versions --bucket <bucket-name>

# copy local folder to S3
aws s3 cp MyFolder s3://bucket-name --recursive

# delete
aws s3 rb s3://bucket-name –-force

# download a whole S3 bucket
aws s3 sync s3://<bucket>/ .

# move S3 bucket to different location
aws s3 sync s3://oldbucket s3://newbucket --source-region us-west-1

# list the sizes of an S3 bucket and its contents
aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"

# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>
##JSON policy example
{
"Id": "Policy1568185116930",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1568184932403",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome",
"Principal": "*"
},
{
"Sid": "Stmt1568185007451",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome/*",
"Principal": "*"
}
]
}

# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name> # Way 1 to get the ACL
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.json

aws s3api get-object-acl --bucket <bucket-name> --key flag #Way 2 to get the ACL
aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-policy file://objacl.json

##JSON ACL example
## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.
{
"Owner": {
"DisplayName": "<DisplayName>",
"ID": "<ID>"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
## An ACL should give you the permission WRITE_ACP to be able to put a new ACL

doppia pila

È possibile accedere a un bucket S3 tramite un endpoint a doppia pila utilizzando un nome di endpoint in stile ospitato virtualmente o in stile percorso. Questi sono utili per accedere a S3 tramite IPv6.

Gli endpoint a doppia pila utilizzano la seguente sintassi:

  • bucketname.s3.dualstack.aws-region.amazonaws.com

  • s3.dualstack.aws-region.amazonaws.com/bucketname

Privesc

Nella pagina seguente puoi verificare come abusare le autorizzazioni S3 per elevare i privilegi:

pageAWS - S3 Privesc

Accesso non autenticato

pageAWS - S3 Unauthenticated Enum

Post sfruttamento di S3

pageAWS - S3 Post Exploitation

Persistenza

pageAWS - S3 Persistence

Altre vulnerabilità di S3

Problema di avvelenamento della cache HTTP di S3

Secondo questa ricerca era possibile memorizzare nella cache la risposta di un bucket arbitrario come se appartenesse a un altro. Questo avrebbe potuto essere abusato per modificare ad esempio le risposte dei file javascript e compromettere pagine arbitrarie che utilizzano S3 per memorizzare codice statico.

Amazon Athena

Amazon Athena è un servizio di interrogazione interattivo che facilita l'analisi dei dati direttamente in Amazon Simple Storage Service (Amazon S3) utilizzando SQL standard.

È necessario preparare una tabella DB relazionale con il formato del contenuto che apparirà nei bucket S3 monitorati. Successivamente, Amazon Athena sarà in grado di popolare il DB dai log, in modo da poterlo interrogare.

Amazon Athena supporta la possibilità di interrogare dati S3 già crittografati e, se configurato per farlo, Athena può anche crittografare i risultati della query che possono poi essere memorizzati in S3.

Questa crittografia dei risultati è indipendente dai dati S3 interrogati sottostanti, il che significa che anche se i dati S3 non sono crittografati, i risultati interrogati possono essere crittografati. Alcuni punti da tenere presente sono che Amazon Athena supporta solo dati che sono stati crittografati con i seguenti metodi di crittografia S3, SSE-S3, SSE-KMS e CSE-KMS.

SSE-C e CSE-E non sono supportati. Inoltre, è importante comprendere che Amazon Athena eseguirà solo query su oggetti crittografati che si trovano nella stessa regione della query stessa. Se è necessario interrogare dati S3 che sono stati crittografati utilizzando KMS, allora sono richiesti permessi specifici per l'utente Athena per consentire loro di eseguire la query.

Enumerazione

# Get catalogs
aws athena list-data-catalogs

# Get databases inside catalog
aws athena list-databases --catalog-name <catalog-name>
aws athena list-table-metadata --catalog-name <catalog-name> --database-name <db-name>

# Get query executions, queries and results
aws athena list-query-executions
aws athena get-query-execution --query-execution-id <id> # Get query and meta of results
aws athena get-query-results --query-execution-id <id> # This will rerun the query and get the results

# Get workgroups & Prepared statements
aws athena list-work-groups
aws athena list-prepared-statements --work-group <wg-name>
aws athena get-prepared-statement --statement-name <name> --work-group <wg-name>

# Run query
aws athena start-query-execution --query-string <query>

Riferimenti

Impara l'hacking su AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated