AWS - S3 Unauthenticated Enum

Підтримайте HackTricks

S3 Public Buckets

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

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

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

Пошук AWS Buckets

Різні методи для виявлення, коли веб-сторінка використовує 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

  • Перевірка 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/.

Brute-Force

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

# Створення списку слів для створення перестановок
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

Loot S3 Buckets

Для відкритих бакетів 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 або ви можете отримати доступ до 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:

#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 не має доменного імені, при спробі його перерахування, вказуйте тільки ім'я bucket і не весь AWSs3 домен. Приклад: s3://<BUCKETNAME>

Public URL template

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

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

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

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

# 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 і навіть для отримання значення тегів (якщо ви знаєте ключ тегу). Ви можете знайти більше інформації в оригінальному дослідженні та інструменті conditional-love для автоматизації цього експлойту.

Підтвердження, що bucket належить до AWS акаунту

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

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 облікового запису було неправильним.

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

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

Посилання

Підтримайте HackTricks

Last updated