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 Public Buckets

A bucket is considered “public” if any user can list the contents of the bucket, and “private” if the bucket's contents can only be listed or written by certain users.

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

Learn about AWS-S3 misconfiguration here: http://flaws.cloud and http://flaws2.cloud/

Finding AWS Buckets

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

Enumeration & OSINT:

  • Використовуючи wappalyzer (плагін для браузера)
  • Використовуючи burp (spidering вебу) або вручну переміщаючись по сторінці — всі resources, що завантажуються, будуть збережені в History.
  • Перевіряйте ресурси в доменах типу:
http://s3.amazonaws.com/[bucket_name]/
http://[bucket_name].s3.amazonaws.com/
  • Перевірте CNAME, оскільки resources.domain.com може мати CNAME bucket.s3.amazonaws.com
  • s3dns – легкий DNS-сервер, який пасивно ідентифікує cloud storage buckets (S3, GCP, Azure) аналізуючи DNS-трафік. Він виявляє CNAME, слідує ланцюгам резолюції та зіставляє шаблони bucket-ів, пропонуючи тиху альтернативу brute-force або API-орієнтованому відкриттю. Ідеально підходить для recon та OSINT-робочих процесів.
  • Перевірте https://buckets.grayhatwarfare.com, веб-сайт з уже виявленими відкритими buckets.
  • Ім'я bucket-а та домен bucket-а мають бути однаковими.
  • 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.
  • Щоб перевірити, що це bucket, ви також можете відвідати https://flaws.cloud.s3.amazonaws.com/.

Brute-Force

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

# Generate a wordlist to create permutations
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

# Generate a wordlist based on the domains and subdomains to test
## Write those domains and subdomains in 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

# Create permutations based in a list with the domains and subdomains to attack
goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
## The previous tool is specialized increating permutations for subdomains, lets filter that list
### Remove lines ending with "."
cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
### Create list without TLD
cat /tmp/final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp/final-words-s3.txt.temp3
### Create list without dots
cat /tmp/final-words-s3.txt.temp3 | tr -d "." > /tmp/final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
### Create list without hyphens
cat /tmp/final-words-s3.txt.temp3 | tr "." "-" > /tmp/final-words-s3.txt.temp5

## Generate the final wordlist
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

## Call s3scanner
s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt  | grep bucket_exists

Loot S3 Buckets

Якщо є відкриті S3 buckets, BucketLoot може автоматично шукати цікаву інформацію.

Find the Region

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

By DNS

Ви можете дізнатися регіон bucket-а за допомогою 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
або ви можете отримати доступ до bucket, відвідавши: flaws.cloud.s3-us-west-2.amazonaws.com

Спробою

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

Перелічення вмісту bucket

Щоб перевірити відкритість bucket, користувач може просто ввести URL у свій веб-браузер. Приватний bucket відповість "Access Denied". Публічний bucket покаже перші 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]

Якщо bucket не має доменного імені, під час спроби enumerate його, вказуйте лише bucket name, а не весь домен AWSs3. Приклад: s3://<BUCKETNAME>

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

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

Отримати Account ID з public Bucket

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

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

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

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

Confirming a bucket belongs to an AWS account

Як пояснено в this blog post, якщо у вас є дозволи на list a bucket можна підтвердити accountID, якому належить bucket, відправивши запит такого вигляду:

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>

Якщо помилка — “Access Denied”, це означає, що ID облікового запису був неправильним.

Використані email-адреси як root account enumeration

Як пояснено в this blog post, можна перевірити, чи електронна адреса пов'язана з будь-яким обліковим записом AWS, спробувавши надати електронній пошті дозволи на S3 bucket через ACLs. Якщо це не викликає помилки, це означає, що електронна адреса є root user деякого облікового запису 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