AWS - S3, Athena & Glacier Enumération
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.
S3
Amazon S3 est un service qui vous permet de stocker de grandes quantités de données.
Amazon S3 fournit plusieurs options pour assurer la protection des données au repos. Les options incluent Permission (Policy), Encryption (Client and Server Side), Bucket Versioning et MFA based delete. L’utilisateur peut activer n’importe laquelle de ces options pour assurer la protection des données. La réplication des données est une fonctionnalité interne d’AWS où S3 réplique automatiquement chaque objet dans toutes les Availability Zones et l’organisation n’a pas besoin de l’activer dans ce cas.
Avec des permissions basées sur la ressource, vous pouvez définir séparément des permissions pour des sous-répertoires de votre bucket.
Bucket Versioning and MFA based delete
Lorsque le versioning du bucket est activé, toute action qui tente de modifier un fichier génère une nouvelle version du fichier, en conservant également le contenu précédent. Ainsi, le contenu n’est pas écrasé.
De plus, la suppression basée sur MFA empêchera la suppression des versions de fichiers dans le bucket S3 et empêchera également la désactivation du Bucket Versioning, de sorte qu’un attaquant ne pourra pas altérer ces fichiers.
S3 Access logs
Il est possible d’activer les logs d’accès S3 (qui sont désactivés par défaut) pour un bucket et d’enregistrer les logs dans un bucket différent afin de savoir qui accède au bucket (les deux buckets doivent être dans la même région).
S3 Presigned URLs
Il est possible de générer une presigned URL qui peut généralement être utilisée pour accéder au fichier spécifié dans le bucket. Une presigned URL 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 presigned URL peut être créée depuis le cli en utilisant les credentials d’un principal ayant accès à l’objet (si le compte que vous utilisez n’a pas accès, une presigned URL plus courte sera créée mais elle sera inutile)
aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'
Note
La seule permission requise pour générer un presigned URL est la permission qui est accordée, donc pour la commande précédente la seule permission nécessaire pour le principal est
s3:GetObject
Il est également possible de créer des presigned URLs avec d’autres permissions :
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 les clés gérées par S3, SSE-S3
Cette option requiert une configuration minimale et toute la gestion des clés de chiffrement est gérée par AWS. Tout ce que vous avez à faire est de téléverser vos données et S3 s’occupe de tous les autres aspects. Chaque bucket dans un compte S3 se voit attribuer une bucket key.
- Chiffrement :
- Object Data + created plaintext DEK –> Encrypted data (stored inside S3)
- Created plaintext DEK + S3 Master Key –> Encrypted DEK (stored inside S3) and plain text is deleted from memory
- Déchiffrement :
- Encrypted DEK + S3 Master Key –> Plaintext DEK
- Plaintext DEK + Encrypted data –> Object Data
Veuillez noter que dans ce cas la clé est gérée par AWS (rotation seulement tous les 3 ans). Si vous utilisez votre propre clé, vous pourrez la faire tourner, la désactiver et appliquer des contrôles d’accès.
Chiffrement côté serveur avec les clés gérées par KMS, SSE-KMS
Cette méthode permet à S3 d’utiliser le key management service pour générer vos data encryption keys. KMS vous offre une bien plus grande flexibilité sur la gestion de vos clés. Par exemple, vous pouvez désactiver, faire tourner et appliquer des contrôles d’accès au CMK, et auditer leur utilisation via AWS Cloud Trail.
- Chiffrement :
- S3 request data keys from KMS CMK
- KMS uses a CMK to generate the pair DEK plaintext and DEK encrypted and send them to S£
- S3 uses the paintext key to encrypt the data, store the encrypted data and the encrypted key and deletes from memory the plain text key
- Déchiffrement :
- S3 ask to KMS to decrypt the encrypted data key of the object
- KMS decrypt the data key with the CMK and send it back to S3
- S3 decrypts the object data
Chiffrement côté serveur avec des clés fournies par le client, SSE-C
Cette option vous donne la possibilité de fournir votre propre master key 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 le chiffrement pour vous.
- Chiffrement :
- The user sends the object data + Customer key to S3
- The customer key is used to encrypt the data and the encrypted data is stored
- a salted HMAC value of the customer key is stored also for future key validation
- the customer key is deleted from memory
- Déchiffrement :
- The user send the customer key
- The key is validated against the HMAC value stored
- The customer provided key is then used to decrypt the data
Chiffrement côté client avec KMS, CSE-KMS
Comme pour SSE-KMS, cela utilise également le key management service pour générer vos data encryption keys. Cependant, cette fois KMS est appelé par le client et non par S3. Le chiffrement a alors lieu côté client et les données chiffrées sont ensuite envoyées à S3 pour stockage.
- Chiffrement :
- Client request for a data key to KMS
- KMS returns the plaintext DEK and the encrypted DEK with the CMK
- Both keys are sent back
- The client then encrypts the data with the plaintext DEK and send to S3 the encrypted data + the encrypted DEK (which is saved as metadata of the encrypted data inside S3)
- Déchiffrement :
- The encrypted data with the encrypted DEK is sent to the client
- The client asks KMS to decrypt the encrypted key using the CMK and KMS sends back the plaintext DEK
- The client can now decrypt the encrypted data
Chiffrement côté client avec des clés fournies par le client, CSE-C
Avec 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 :
- The client generates a DEK and encrypts the plaintext data
- Then, using it’s own custom CMK it encrypts the DEK
- submit the encrypted data + encrypted DEK to S3 where it’s stored
- Déchiffrement :
- S3 sends the encrypted data and DEK
- As the client already has the CMK used to encrypt the DEK, it decrypts the DEK and then uses the plaintext DEK to decrypt the data
Enumération
Une des voies traditionnelles principales pour compromettre des organisations AWS commence par compromettre des buckets publics accessibles. Vous pouvez trouver des outils d’énumération de buckets publics sur cette page.
# 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 --no-sign-request
# 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 endpoint dual-stack en utilisant un nom d’endpoint de type virtual hosted-style ou path-style. Ceux-ci sont utiles pour accéder à S3 via IPv6.
Les endpoints dual-stack utilisent la syntaxe suivante :
bucketname.s3.dualstack.aws-region.amazonaws.coms3.dualstack.aws-region.amazonaws.com/bucketname
Privesc
In the following page you can check how to abuse S3 permissions to escalate privileges:
Unauthenticated Access
S3 Post Exploitation
Persistence
Other S3 vulns
S3 HTTP Cache Poisoning Issue
According to this research il était possible de mettre en cache la réponse d’un bucket arbitraire comme si elle appartenait à un autre. Cela pouvait être abusé pour modifier, 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êtes interactives qui facilite l’analyse des données directement dans Amazon Simple Storage Service (Amazon S3) en utilisant le standard SQL.
Vous devez préparer une table DB relationnelle avec le format du contenu qui va apparaître dans les buckets S3 surveillés. Ensuite, Amazon Athena pourra peupler la DB à partir des logs, afin que vous puissiez l’interroger.
Amazon Athena prend en charge la capacité d’interroger des données S3 qui sont déjà chiffrées et, si configuré pour le faire, Athena peut aussi 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 des requêtes peuvent l’être. Quelques points à noter : Amazon Athena ne supporte 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-C ne sont pas supportés. De plus, il est important de comprendre qu’Amazon Athena n’exécutera des requêtes que contre 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 en utilisant KMS, alors des permissions spécifiques sont requises pour l’utilisateur Athena afin de lui permettre d’exécuter la requête.
Enumeration
# 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
- https://cloudsecdocs.com/aws/defensive/tooling/cli/#s3
- https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html
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

