AWS - S3 Unauthenticated Enum

Reading time: 8 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 Публічні Бакети

Бакет вважається “публічним”, якщо будь-який користувач може переглядати вміст бакета, і “приватним”, якщо вміст бакета може переглядатися або записуватися лише певними користувачами.

Компанії можуть мати неправильно налаштовані дозволи бакетів, що надає доступ або до всього, або до всіх, хто автентифікований в AWS в будь-якому обліковому записі (тобто до будь-кого). Зверніть увагу, що навіть з такими неправильними налаштуваннями деякі дії можуть не бути виконані, оскільки бакети можуть мати свої власні списки контролю доступу (ACL).

Дізнайтеся про неправильні налаштування AWS-S3 тут: http://flaws.cloud та http://flaws2.cloud/

Пошук AWS Бакетів

Різні методи для визначення, коли веб-сторінка використовує AWS для зберігання деяких ресурсів:

Перерахування та OSINT:

  • Використання плагіна браузера wappalyzer
  • Використання burp (спайдеринг вебу) або ручного навігації по сторінці, всі ресурси, завантажені будуть збережені в Історії.
  • Перевірте ресурси в доменах, таких як:
http://s3.amazonaws.com/[bucket_name]/
http://[bucket_name].s3.amazonaws.com/
  • Перевірте CNAMES, оскільки resources.domain.com може мати CNAME bucket.s3.amazonaws.com
  • s3dns – легкий DNS-сервер, який пасивно ідентифікує бакети хмарного зберігання (S3, GCP, Azure), аналізуючи DNS-трафік. Він виявляє CNAME, слідкує за ланцюгами розв'язання та співвідносить шаблони бакетів, пропонуючи тиху альтернативу брутфорсу або відкриттю через API. Ідеально підходить для розвідки та OSINT-робочих процесів.
  • Перевірте https://buckets.grayhatwarfare.com, веб-сайт з уже виявленими відкритими бакетами.
  • Ім'я бакета та доменне ім'я бакета повинні бути однаковими.
  • flaws.cloud знаходиться за IP 52.92.181.107, і якщо ви туди перейдете, він перенаправить вас на https://aws.amazon.com/s3/. Також, dig -x 52.92.181.107 дає s3-website-us-west-2.amazonaws.com.
  • Щоб перевірити, чи це бакет, ви також можете відвідати https://flaws.cloud.s3.amazonaws.com/.

Брутфорс

Ви можете знайти бакети, брутфорсуючи імена, пов'язані з компанією, яку ви тестуєте:

# Генерація списку слів для створення перестановок
curl -s https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt > /tmp/words-s3.txt.temp
curl -s https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt >>/tmp/words-s3.txt.temp
cat /tmp/words-s3.txt.temp | sort -u > /tmp/words-s3.txt

# Генерація списку слів на основі доменів та піддоменів для тестування
## Запишіть ці домени та піддомени в subdomains.txt
cat subdomains.txt > /tmp/words-hosts-s3.txt
cat subdomains.txt | tr "." "-" >> /tmp/words-hosts-s3.txt
cat subdomains.txt | tr "." "\n" | sort -u >> /tmp/words-hosts-s3.txt

# Створення перестановок на основі списку з доменами та піддоменами для атаки
goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
## Попередній інструмент спеціалізується на створенні перестановок для піддоменів, давайте відфільтруємо цей список
### Видалити рядки, що закінчуються на "."
cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
### Створити список без TLD
cat /tmp/final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp/final-words-s3.txt.temp3
### Створити список без крапок
cat /tmp/final-words-s3.txt.temp3 | tr -d "." > /tmp/final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
### Створити список без дефісів
cat /tmp/final-words-s3.txt.temp3 | tr "." "-" > /tmp/final-words-s3.txt.temp5

## Генерація фінального списку слів
cat /tmp/final-words-s3.txt.temp2 /tmp/final-words-s3.txt.temp3 /tmp/final-words-s3.txt.temp4 /tmp/final-words-s3.txt.temp5 | grep -v -- "-\." | awk '{print tolower($0)}' | sort -u > /tmp/final-words-s3.txt

## Виклик s3scanner
s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt  | grep bucket_exists

Здобуття S3 Бакетів

Даючи відкриті S3 бакети, BucketLoot може автоматично шукати цікаву інформацію.

Знайти Регіон

Ви можете знайти всі підтримувані регіони AWS на https://docs.aws.amazon.com/general/latest/gr/s3.html

За DNS

Ви можете отримати регіон бакета за допомогою dig та nslookup, зробивши DNS-запит на виявлену IP-адресу:

bash
dig flaws.cloud
;; ANSWER SECTION:
flaws.cloud.    5    IN    A    52.218.192.11

nslookup 52.218.192.11
Non-authoritative answer:
11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com.

Перевірте, чи має розв'язане доменне ім'я слово "website".
Ви можете отримати доступ до статичного веб-сайту, перейшовши за адресою: flaws.cloud.s3-website-us-west-2.amazonaws.com
або ви можете отримати доступ до бакету, відвідавши: flaws.cloud.s3-us-west-2.amazonaws.com

Спробуючи

Якщо ви намагаєтеся отримати доступ до бакету, але в доменному імені вказуєте інший регіон (наприклад, бакет знаходиться в bucket.s3.amazonaws.com, але ви намагаєтеся отримати доступ до bucket.s3-website-us-west-2.amazonaws.com, тоді вам буде вказано на правильне місце:

Перерахування бакету

Щоб перевірити відкритість бакету, користувач може просто ввести URL у свій веб-браузер. Приватний бакет відповість "Доступ заборонено". Публічний бакет відобразить перші 1,000 об'єктів, які були збережені.

Відкрито для всіх:

Приватний:

Ви також можете перевірити це за допомогою cli:

bash
#Use --no-sign-request for check Everyones permissions
#Use --profile <PROFILE_NAME> to indicate the AWS profile(keys) that youwant to use: Check for "Any Authenticated AWS User" permissions
#--recursive if you want list recursivelyls
#Opcionally you can select the region if you now it
aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2]

Якщо у бакета немає доменного імені, при спробі його перерахувати, вкажіть лише ім'я бакета і не вводьте ціле доменне ім'я AWSs3. Приклад: s3://<BUCKETNAME>

Шаблон публічного URL

https://{user_provided}.s3.amazonaws.com

Отримати ID облікового запису з публічного бакету

Можливо визначити обліковий запис AWS, скориставшись новим S3:ResourceAccount ключем умови політики. Ця умова обмежує доступ на основі S3 бакету, в якому знаходиться обліковий запис (інші політики на основі облікового запису обмежують доступ на основі облікового запису, в якому знаходиться запитуючий суб'єкт).
І оскільки політика може містити шаблони, можливо знайти номер облікового запису лише по одному числу за раз.

Цей інструмент автоматизує процес:

bash
# Installation
pipx install s3-account-search
pip install s3-account-search
# With a bucket
s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket
# With an object
s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket/path/to/object.ext

Ця техніка також працює з URL-адресами API Gateway, URL-адресами Lambda, наборами даних Data Exchange і навіть для отримання значення тегів (якщо ви знаєте ключ тегу). Ви можете знайти більше інформації в оригінальному дослідженні та інструменті conditional-love для автоматизації цього експлуатації.

Підтвердження, що бакет належить обліковому запису AWS

Як пояснено в цьому блозі, якщо у вас є дозволи на перегляд бакету можливо підтвердити accountID, до якого належить бакет, надіславши запит, як:

bash
curl -X GET "[bucketname].amazonaws.com/" \
-H "x-amz-expected-bucket-owner: [correct-account-id]"

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">...</ListBucketResult>

Якщо помилка - це "Доступ заборонено", це означає, що ідентифікатор облікового запису був неправильним.

Використані електронні адреси для перерахунку кореневих облікових записів

Як пояснено в цьому блозі, можливо перевірити, чи пов'язана електронна адреса з будь-яким обліковим записом AWS, спробувавши надати електронній адресі дозволи на S3 бакет через ACL. Якщо це не викликає помилки, це означає, що електронна адреса є кореневим користувачем якогось облікового запису AWS:

python
s3_client.put_bucket_acl(
Bucket=bucket_name,
AccessControlPolicy={
'Grants': [
{
'Grantee': {
'EmailAddress': 'some@emailtotest.com',
'Type': 'AmazonCustomerByEmail',
},
'Permission': 'READ'
},
],
'Owner': {
'DisplayName': 'Whatever',
'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef'
}
}
)

Посилання

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