AWS - S3, Athena & Glacier Enum

Reading time: 13 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

S3

Amazon S3 est un service qui vous permet de stocker de grandes quantités de données.

Amazon S3 fournit plusieurs options pour atteindre la protection des donnĂ©es au repos. Les options incluent Permission (Politique), Encryption (CĂŽtĂ© Client et CĂŽtĂ© Serveur), Bucket Versioning et MFA basĂ© sur la suppression. L'utilisateur peut activer l'une de ces options pour atteindre la protection des donnĂ©es. La rĂ©plication des donnĂ©es est une fonctionnalitĂ© interne d'AWS oĂč S3 rĂ©plique automatiquement chaque objet Ă  travers toutes les zones de disponibilitĂ© et l'organisation n'a pas besoin de l'activer dans ce cas.

Avec des permissions basées sur les ressources, vous pouvez définir des permissions pour les sous-répertoires de votre bucket séparément.

Bucket Versioning et suppression basée sur MFA

Lorsque le versionnage de bucket est activé, toute action qui tente de modifier un fichier à l'intérieur d'un fichier générera une nouvelle version du fichier, conservant également le contenu précédent de celui-ci. Par conséquent, cela ne remplacera pas son contenu.

De plus, la suppression basĂ©e sur MFA empĂȘchera les versions de fichiers dans le bucket S3 d'ĂȘtre supprimĂ©es et Ă©galement le versionnage de bucket d'ĂȘtre dĂ©sactivĂ©, donc un attaquant ne pourra pas modifier ces fichiers.

Journaux d'accĂšs S3

Il est possible d'activer la connexion d'accĂšs S3 (qui est dĂ©sactivĂ©e par dĂ©faut) pour un certain bucket et de sauvegarder les journaux dans un autre bucket pour savoir qui accĂšde au bucket (les deux buckets doivent ĂȘtre dans la mĂȘme rĂ©gion).

URLs pré-signées S3

Il est possible de gĂ©nĂ©rer une URL prĂ©-signĂ©e qui peut gĂ©nĂ©ralement ĂȘtre utilisĂ©e pour accĂ©der au fichier spĂ©cifiĂ© dans le bucket. Une URL prĂ©-signĂ©e ressemble Ă  ceci :

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

Une URL prĂ©-signĂ©e peut ĂȘtre créée depuis le cli en utilisant les identifiants d'un principal ayant accĂšs Ă  l'objet (si le compte que vous utilisez n'a pas accĂšs, une URL prĂ©-signĂ©e plus courte sera créée mais elle sera inutile)

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

note

La seule autorisation requise pour générer une URL pré-signée est l'autorisation accordée, donc pour la commande précédente, la seule autorisation nécessaire pour le principal est s3:GetObject

Il est également possible de créer des URL pré-signées avec d'autres autorisations :

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

Mécanismes de chiffrement S3

DEK signifie Data Encryption Key et est la clé qui est toujours générée et utilisée pour chiffrer les données.

Chiffrement cÎté serveur avec des clés gérées par S3, SSE-S3

Cette option nécessite une configuration minimale et toute la gestion des clés de chiffrement utilisées est gérée par AWS. Tout ce que vous avez à faire est de télécharger vos données et S3 s'occupera de tous les autres aspects. Chaque bucket dans un compte S3 se voit attribuer une clé de bucket.

  • Chiffrement :
  • DonnĂ©es de l'objet + DEK en clair créé --> DonnĂ©es chiffrĂ©es (stockĂ©es dans S3)
  • DEK en clair créé + ClĂ© maĂźtre S3 --> DEK chiffrĂ© (stockĂ© dans S3) et le texte en clair est supprimĂ© de la mĂ©moire
  • DĂ©chiffrement :
  • DEK chiffrĂ© + ClĂ© maĂźtre S3 --> DEK en clair
  • DEK en clair + DonnĂ©es chiffrĂ©es --> DonnĂ©es de l'objet

Veuillez noter que dans ce cas la clé est gérée par AWS (rotation uniquement tous les 3 ans). Si vous utilisez votre propre clé, vous pourrez faire pivoter, désactiver et appliquer un contrÎle d'accÚs.

Chiffrement cÎté serveur avec des clés gérées par KMS, SSE-KMS

Cette méthode permet à S3 d'utiliser le service de gestion des clés pour générer vos clés de chiffrement de données. KMS vous offre une bien plus grande flexibilité sur la gestion de vos clés. Par exemple, vous pouvez désactiver, faire pivoter et appliquer des contrÎles d'accÚs au CMK, et ordonner leur utilisation à l'aide d'AWS Cloud Trail.

  • Chiffrement :
  • S3 demande des clĂ©s de donnĂ©es Ă  KMS CMK
  • KMS utilise un CMK pour gĂ©nĂ©rer la paire DEK en clair et DEK chiffrĂ© et les envoie Ă  S3
  • S3 utilise la clĂ© en clair pour chiffrer les donnĂ©es, stocke les donnĂ©es chiffrĂ©es et la clĂ© chiffrĂ©e et supprime de la mĂ©moire la clĂ© en clair
  • DĂ©chiffrement :
  • S3 demande Ă  KMS de dĂ©chiffrer la clĂ© de donnĂ©es chiffrĂ©e de l'objet
  • KMS dĂ©chiffre la clĂ© de donnĂ©es avec le CMK et la renvoie Ă  S3
  • S3 dĂ©chiffre les donnĂ©es de l'objet
Chiffrement cÎté serveur avec des clés fournies par le client, SSE-C

Cette option vous donne l'opportunitĂ© de fournir votre propre clĂ© maĂźtre que vous utilisez peut-ĂȘtre dĂ©jĂ  en dehors d'AWS. Votre clĂ© fournie par le client serait alors envoyĂ©e avec vos donnĂ©es Ă  S3, oĂč S3 effectuerait ensuite le chiffrement pour vous.

  • Chiffrement :
  • L'utilisateur envoie les donnĂ©es de l'objet + clĂ© client Ă  S3
  • La clĂ© client est utilisĂ©e pour chiffrer les donnĂ©es et les donnĂ©es chiffrĂ©es sont stockĂ©es
  • une valeur HMAC salĂ©e de la clĂ© client est Ă©galement stockĂ©e pour la validation future de la clĂ©
  • la clĂ© client est supprimĂ©e de la mĂ©moire
  • DĂ©chiffrement :
  • L'utilisateur envoie la clĂ© client
  • La clĂ© est validĂ©e par rapport Ă  la valeur HMAC stockĂ©e
  • La clĂ© fournie par le client est ensuite utilisĂ©e pour dĂ©chiffrer les donnĂ©es
Chiffrement cÎté client avec KMS, CSE-KMS

De maniĂšre similaire Ă  SSE-KMS, cela utilise Ă©galement le service de gestion des clĂ©s pour gĂ©nĂ©rer vos clĂ©s de chiffrement de donnĂ©es. Cependant, cette fois, KMS est appelĂ© via le client et non S3. Le chiffrement a alors lieu cĂŽtĂ© client et les donnĂ©es chiffrĂ©es sont ensuite envoyĂ©es Ă  S3 pour ĂȘtre stockĂ©es.

  • Chiffrement :
  • Le client demande une clĂ© de donnĂ©es Ă  KMS
  • KMS renvoie le DEK en clair et le DEK chiffrĂ© avec le CMK
  • Les deux clĂ©s sont renvoyĂ©es
  • Le client chiffre ensuite les donnĂ©es avec le DEK en clair et envoie Ă  S3 les donnĂ©es chiffrĂ©es + le DEK chiffrĂ© (qui est enregistrĂ© comme mĂ©tadonnĂ©es des donnĂ©es chiffrĂ©es dans S3)
  • DĂ©chiffrement :
  • Les donnĂ©es chiffrĂ©es avec le DEK chiffrĂ© sont envoyĂ©es au client
  • Le client demande Ă  KMS de dĂ©chiffrer la clĂ© chiffrĂ©e en utilisant le CMK et KMS renvoie le DEK en clair
  • Le client peut maintenant dĂ©chiffrer les donnĂ©es chiffrĂ©es
Chiffrement cÎté client avec des clés fournies par le client, CSE-C

En utilisant ce mécanisme, vous pouvez utiliser vos propres clés fournies et utiliser un client AWS-SDK pour chiffrer vos données avant de les envoyer à S3 pour stockage.

  • Chiffrement :
  • Le client gĂ©nĂšre un DEK et chiffre les donnĂ©es en clair
  • Ensuite, en utilisant son propre CMK personnalisĂ©, il chiffre le DEK
  • soumet les donnĂ©es chiffrĂ©es + DEK chiffrĂ© Ă  S3 oĂč elles sont stockĂ©es
  • DĂ©chiffrement :
  • S3 envoie les donnĂ©es chiffrĂ©es et le DEK
  • Comme le client a dĂ©jĂ  le CMK utilisĂ© pour chiffrer le DEK, il dĂ©chiffre le DEK et utilise ensuite le DEK en clair pour dĂ©chiffrer les donnĂ©es

ÉnumĂ©ration

L'un des moyens traditionnels de compromettre les organisations AWS commence par compromettre les buckets accessibles publiquement. Vous pouvez trouver des énumérateurs de buckets publics sur cette page.

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

dual-stack

Vous pouvez accéder à un bucket S3 via un point de terminaison dual-stack en utilisant un nom de point de terminaison de style hébergé virtuel ou de style chemin. Ceux-ci sont utiles pour accéder à S3 via IPv6.

Les points de terminaison dual-stack utilisent la syntaxe suivante :

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

Privesc

Dans la page suivante, vous pouvez vérifier comment abuser des permissions S3 pour escalader les privilÚges :

AWS - S3 Privesc

AccÚs non authentifié

AWS - S3 Unauthenticated Enum

S3 Post Exploitation

AWS - S3 Post Exploitation

Persistance

AWS - S3 Persistence

Autres vulnérabilités S3

ProblĂšme de Poisoning du Cache HTTP S3

Selon cette recherche, il Ă©tait possible de mettre en cache la rĂ©ponse d'un bucket arbitraire comme si elle appartenait Ă  un autre. Cela aurait pu ĂȘtre abusĂ© pour changer par exemple les rĂ©ponses de fichiers javascript et compromettre des pages arbitraires utilisant S3 pour stocker du code statique.

Amazon Athena

Amazon Athena est un service de requĂȘte interactif qui facilite l'analyse des donnĂ©es directement dans Amazon Simple Storage Service (Amazon S3) en utilisant le SQL standard.

Vous devez préparer une table de base de données relationnelle avec le format du contenu qui va apparaßtre dans les buckets S3 surveillés. Ensuite, Amazon Athena pourra peupler la base de données à partir des journaux, afin que vous puissiez l'interroger.

Amazon Athena prend en charge la possibilitĂ© d'interroger des donnĂ©es S3 qui sont dĂ©jĂ  chiffrĂ©es et si configurĂ© pour le faire, Athena peut Ă©galement chiffrer les rĂ©sultats de la requĂȘte qui peuvent ensuite ĂȘtre stockĂ©s dans S3.

Ce chiffrement des rĂ©sultats est indĂ©pendant des donnĂ©es S3 sous-jacentes interrogĂ©es, ce qui signifie que mĂȘme si les donnĂ©es S3 ne sont pas chiffrĂ©es, les rĂ©sultats interrogĂ©s peuvent ĂȘtre chiffrĂ©s. Quelques points Ă  prendre en compte sont qu'Amazon Athena ne prend en charge que les donnĂ©es qui ont Ă©tĂ© chiffrĂ©es avec les mĂ©thodes de chiffrement S3 suivantes, SSE-S3, SSE-KMS et CSE-KMS.

SSE-C et CSE-E ne sont pas pris en charge. De plus, il est important de comprendre qu'Amazon Athena n'exĂ©cutera des requĂȘtes que sur des objets chiffrĂ©s qui se trouvent dans la mĂȘme rĂ©gion que la requĂȘte elle-mĂȘme. Si vous devez interroger des donnĂ©es S3 qui ont Ă©tĂ© chiffrĂ©es Ă  l'aide de KMS, des permissions spĂ©cifiques sont requises par l'utilisateur Athena pour leur permettre d'effectuer la requĂȘte.

Enumeration

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

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