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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
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
може мати CNAMEbucket.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/.
Брутфорс
Ви можете знайти бакети, брутфорсуючи імена, пов'язані з компанією, яку ви тестуєте:
- https://github.com/sa7mon/S3Scanner
- https://github.com/clario-tech/s3-inspector
- https://github.com/jordanpotti/AWSBucketDump (містить список потенційних імен бакетів)
- https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets
- https://github.com/smaranchand/bucky
- https://github.com/tomdev/teh_s3_bucketeers
- https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3
- https://github.com/Eilonh/s3crets_scanner
- https://github.com/belane/CloudHunter
# Генерація списку слів для створення перестановок
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-адресу:
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:
#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 бакету, в якому знаходиться обліковий запис (інші політики на основі облікового запису обмежують доступ на основі облікового запису, в якому знаходиться запитуючий суб'єкт).
І оскільки політика може містити шаблони, можливо знайти номер облікового запису лише по одному числу за раз.
Цей інструмент автоматизує процес:
# 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, до якого належить бакет, надіславши запит, як:
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:
s3_client.put_bucket_acl(
Bucket=bucket_name,
AccessControlPolicy={
'Grants': [
{
'Grantee': {
'EmailAddress': 'some@emailtotest.com',
'Type': 'AmazonCustomerByEmail',
},
'Permission': 'READ'
},
],
'Owner': {
'DisplayName': 'Whatever',
'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef'
}
}
)
Посилання
- https://www.youtube.com/watch?v=8ZXRw4Ry3mQ
- https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/
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.