AWS - S3, Athena & Glacier Enum

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

S3

Amazon S3 - це сервіс, який дозволяє вам зберігати великі обсяги даних.

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

За допомогою дозволів на основі ресурсів можна визначити дозволи для підкаталогів вашого віджета окремо.

Версіювання віджета та видалення на основі MFA

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

Крім того, видалення на основі MFA запобігатиме видаленню версій файлу у віджеті S3 та також відключенню версіювання віджета, тому зловмисник не зможе змінювати ці файли.

Журнали доступу до S3

Можливо активувати журнали доступу до S3 (які за замовчуванням вимкнені) для деякого віджета та зберегти журнали в іншому віджеті, щоб знати, хто отримує доступ до віджета (обидва віджети повинні бути в одному регіоні).

Підписані URL-адреси S3

Можливо згенерувати підписаний URL-адресу, який зазвичай можна використовувати для доступу до вказаного файлу у віджеті. Підписаний URL-адреса виглядає так:

https://<bucket-name>.s3.us-east-1.amazonaws.com/asd.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAUUE8GZC4S5L3TY3P%2F20230227%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230227T142551Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjELf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJHMEUCIBhQpdETJO3HKKDk2hjNIrPWwBE8gZaQccZFV3kCpPCWAiEAid3ueDtFFU%2FOQfUpvxYTGO%2BHoS4SWDMUrQAE0pIaB40qggMIYBAAGgwzMTgxNDIxMzg1NTMiDJLI5t7gr2EGxG1Y5CrfAioW0foHIQ074y4gvk0c%2B%2Fmqc7cNWb1njQslQkeePHkseJ3owzc%2FCwkgE0EuZTd4mw0aJciA2XIbJRCLPWTb%2FCBKPnIMJ5aBzIiA2ltsiUNQTTUxYmEgXZoJ6rFYgcodnmWW0Et4Xw59UlHnCDB2bLImxPprriyCzDDCD6nLyp3J8pFF1S8h3ZTJE7XguA8joMs4%2B2B1%2FeOZfuxXKyXPYSKQOOSbQiHUQc%2BFnOfwxleRL16prWk1t7TamvHR%2Bt3UgMn5QWzB3p8FgWwpJ6GjHLkYMJZ379tkimL1tJ7o%2BIod%2FMYrS7LDCifP9d%2FuYOhKWGhaakPuJKJh9fl%2B0vGl7kmApXigROxEWon6ms75laXebltsWwKcKuYca%2BUWu4jVJx%2BWUfI4ofoaGiCSaKALTqwu4QNBRT%2BMoK6h%2BQa7gN7JFGg322lkxRY53x27WMbUE4unn5EmI54T4dWt1%2Bg8ljDS%2BvKfBjqmAWRwuqyfwXa5YC3xxttOr3YVvR6%2BaXpzWtvNJQNnb6v0uI3%2BTtTexZkJpLQYqFcgZLQSxsXWSnf988qvASCIUhAzp2UnS1uqy7QjtD5T73zksYN2aesll7rvB80qIuujG6NOdHnRJ2M5%2FKXXNo1Yd15MtzPuSjRoSB9RSMon5jFu31OrQnA9eCUoawxbB0nHqwK8a43CKBZHhA8RoUAJW%2B48EuFsp3U%3D&X-Amz-Signature=3436e4139e84dbcf5e2e6086c0ebc92f4e1e9332b6fda24697bc339acbf2cdfa

Пресигнований URL може бути створений з CLI за допомогою облікових даних основного користувача з доступом до об'єкту (якщо обліковий запис, який ви використовуєте, не має доступу, буде створений коротший пресигнований URL, але він буде некорисним)

aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'

Єдиним обов'язковим дозволом для створення підписаного URL є дозвіл, який надається, тому для попередньої команди єдиним необхідним дозволом для принципала є s3:GetObject

Також можливо створювати підписані URL з іншими дозволами:

import boto3
url = boto3.client('s3').generate_presigned_url(
ClientMethod='put_object',
Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'},
ExpiresIn=3600
)

Механізми шифрування S3

DEK означає ключ шифрування даних і завжди генерується та використовується для шифрування даних.

Шифрування на стороні сервера з керованими ключами S3, SSE-S3

Цей варіант вимагає мінімальної конфігурації, і всі керовані ключі шифрування використовуються AWS. Вам потрібно лише завантажити свої дані, і S3 вирішить всі інші аспекти. Кожному відра в обліковому записі S3 призначається ключ відра.

  • Шифрування:

  • Дані об'єкта + створений текстовий DEK --> Зашифровані дані (зберігаються всередині S3)

  • Створений текстовий DEK + Головний ключ S3 --> Зашифрований DEK (зберігається всередині S3), а текст видаляється з пам'яті

  • Дешифрування:

  • Зашифрований DEK + Головний ключ S3 --> Текстовий DEK

  • Текстовий DEK + Зашифровані дані --> Дані об'єкта

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

Шифрування на стороні сервера з керованими ключами KMS, SSE-KMS

Цей метод дозволяє S3 використовувати службу керування ключами для генерації ключів шифрування даних. KMS надає вам набагато більшу гнучкість у керуванні ключами. Наприклад, ви можете вимикати, обертати та застосовувати контроль доступу до CMK, а також вимагати проти їх використання за допомогою AWS Cloud Trail.

  • Шифрування:

  • S3 запитує ключі даних від KMS CMK

  • KMS використовує CMK для генерації пари DEK текстовий і DEK зашифрований та надсилає їх до S3

  • S3 використовує текстовий ключ для шифрування даних, зберігає зашифровані дані та зашифрований ключ і видаляє з пам'яті текстовий ключ

  • Дешифрування:

  • S3 запитує KMS розшифрувати зашифрований ключ даних об'єкта

  • KMS розшифровує ключ даних за допомогою CMK та надсилає його назад до S3

  • S3 розшифровує дані об'єкта

Шифрування на стороні сервера з наданими користувачем ключами, SSE-C

Цей варіант дозволяє вам використовувати власний головний ключ, який ви вже можливо використовуєте поза AWS. Ваш наданий користувачем ключ буде надісланий разом із вашими даними до S3, де S3 виконає шифрування для вас.

  • Шифрування:

  • Користувач надсилає дані об'єкта + Ключ користувача до S3

  • Ключ користувача використовується для шифрування даних, і зашифровані дані зберігаються

  • також зберігається солений HMAC-значення ключа користувача для майбутньої перевірки ключа

  • ключ користувача видаляється з пам'яті

  • Дешифрування:

  • Користувач надсилає ключ користувача

  • Ключ перевіряється на відповідність збереженому значенню HMAC

  • Наданий користувачем ключ використовується для розшифрування даних

Шифрування на стороні клієнта з KMS, CSE-KMS

Аналогічно до SSE-KMS, цей метод також використовує службу керування ключами для генерації ключів шифрування даних. Однак цього разу KMS викликається через клієнта, а не S3. Потім шифрування відбувається на стороні клієнта, і зашифровані дані надсилаються до S3 для зберігання.

  • Шифрування:

  • Клієнт запитує ключ даних від KMS

  • KMS повертає текстовий DEK та зашифрований DEK з CMK

  • Обидва ключі надсилаються назад

  • Клієнт потім шифрує дані за допомогою текстового DEK та надсилає зашифровані дані до S3 + зашифрований DEK (який зберігається як метадані зашифрованих даних всередині S3)

  • Дешифрування:

  • Зашифровані дані з зашифрованим DEK надсилаються клієнту

  • Клієнт запитує KMS розшифрувати зашифрований ключ за допомогою CMK, і KMS надсилає текстовий DEK

  • Тепер клієнт може розшифрувати зашифровані дані

Шифрування на стороні клієнта з наданими користувачем ключами, CSE-C

Використовуючи цей механізм, ви можете використовувати надані вами ключі та використовувати клієнт AWS-SDK для шифрування даних перед надсиланням їх до S3 для зберігання.

  • Шифрування:

  • Клієнт генерує DEK та шифрує текстові дані

  • Потім, використовуючи власний власний CMK, він шифрує DEK

  • надсилає зашифровані дані + зашифрований DEK до S3, де вони зберігаються

  • Дешифрування:

  • S3 надсилає зашифровані дані та DEK

  • Оскільки клієнт вже має CMK, який використовувався для шифрування DEK, він розшифровує DEK, а потім використовує текстовий DEK для розшифрування даних

Перелік

Одним з традиційних основних способів компрометації організацій AWS є початок з компрометації відкритих публічно відкритих відра. Ви можете знайти публічні інструменти переліку відер на цій сторінці.

# Get buckets ACLs
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api get-object-acl --bucket <bucket-name> --key flag

# Get policy
aws s3api get-bucket-policy --bucket <bucket-name>
aws s3api get-bucket-policy-status --bucket <bucket-name> #if it's public

# list S3 buckets associated with a profile
aws s3 ls
aws s3api list-buckets

# list content of bucket (no creds)
aws s3 ls s3://bucket-name --no-sign-request
aws s3 ls s3://bucket-name --recursive

# list content of bucket (with creds)
aws s3 ls s3://bucket-name
aws s3api list-objects-v2 --bucket <bucket-name>
aws s3api list-objects --bucket <bucket-name>
aws s3api list-object-versions --bucket <bucket-name>

# copy local folder to S3
aws s3 cp MyFolder s3://bucket-name --recursive

# delete
aws s3 rb s3://bucket-name –-force

# download a whole S3 bucket
aws s3 sync s3://<bucket>/ .

# move S3 bucket to different location
aws s3 sync s3://oldbucket s3://newbucket --source-region us-west-1

# list the sizes of an S3 bucket and its contents
aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"

# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>
##JSON policy example
{
"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": "*"
}
]
}

# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name> # Way 1 to get the ACL
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.json

aws s3api get-object-acl --bucket <bucket-name> --key flag #Way 2 to get the ACL
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 через двохстекову точку доступу, використовуючи ім'я віртуального хоста або шляхове ім'я точки доступу. Це корисно для доступу до S3 через IPv6.

Точки доступу двохстекового використовують наступний синтаксис:

  • bucketname.s3.dualstack.aws-region.amazonaws.com

  • s3.dualstack.aws-region.amazonaws.com/bucketname

Підвищення привілеїв

На наступній сторінці ви можете перевірити, як зловживати дозволами S3 для підвищення привілеїв:

pageAWS - S3 Privesc

Неаутентифікований доступ

pageAWS - S3 Unauthenticated Enum

Пост-експлуатація S3

pageAWS - S3 Post Exploitation

Постійність

pageAWS - S3 Persistence

Інші уразливості S3

Проблема отруєння кешу HTTP S3

Згідно з цим дослідженням було можливо кешувати відповідь від довільного віджета так, ніби вона належить до іншого. Це могло бути використано для зміни, наприклад, відповідей на файли JavaScript та компрометації довільних сторінок, використовуючи S3 для зберігання статичного коду.

Amazon Athena

Amazon Athena - це інтерактивна служба запитів, яка спрощує аналіз даних безпосередньо в Amazon Simple Storage Service (Amazon S3) з використанням стандартного SQL.

Вам потрібно підготувати таблицю реляційної БД з форматом вмісту, який буде відображатися в контрольованих віджетах S3. Після цього Amazon Athena зможе заповнити БД з журналів, щоб ви могли виконувати запити.

Amazon Athena підтримує можливість запитувати дані S3, які вже зашифровані, і, якщо налаштовано, Athena також може шифрувати результати запиту, які потім можна зберігати в S3.

Це шифрування результатів незалежне від запитуваних даних S3, що означає, що навіть якщо дані S3 не зашифровані, результати запиту можуть бути зашифровані. Важливою є те, що Amazon Athena підтримує лише дані, які були зашифровані за допомогою наступних методів шифрування S3, SSE-S3, SSE-KMS та CSE-KMS.

SSE-C та CSE-E не підтримуються. Крім цього, важливо розуміти, що Amazon Athena буде виконувати запити лише до зашифрованих об'єктів, які знаходяться в тій же регіоні, що й сам запит. Якщо вам потрібно запитувати дані S3, які були зашифровані за допомогою KMS, то користувачу Athena потрібні конкретні дозволи для виконання запиту.

Енумерація

# Get catalogs
aws athena list-data-catalogs

# Get databases inside catalog
aws athena list-databases --catalog-name <catalog-name>
aws athena list-table-metadata --catalog-name <catalog-name> --database-name <db-name>

# Get query executions, queries and results
aws athena list-query-executions
aws athena get-query-execution --query-execution-id <id> # Get query and meta of results
aws athena get-query-results --query-execution-id <id> # This will rerun the query and get the results

# Get workgroups & Prepared statements
aws athena list-work-groups
aws athena list-prepared-statements --work-group <wg-name>
aws athena get-prepared-statement --statement-name <name> --work-group <wg-name>

# Run query
aws athena start-query-execution --query-string <query>

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated