Авторские курсы Михаила Тарасова

S3 Bucket Takeover через старый CNAME: Как AWS дарит тебе ключи от королевства

S3 Bucket Takeover через старый CNAME: Как AWS дарит тебе ключи от королевства

Бро, если думаешь, что 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-аккаунтом:

Затем заливай туда свой «контент». Например, фишинговую страничку или малварь:

Теперь, когда юзер зайдёт на assets.target.com, он попадёт на твой контент. Хочешь больше наглости? Настрой редирект или хости reverse-shell:

Обход защиты: Если бакет занят, но доступ публичный (читай: разрабы забыли про Block Public Access), проверяй права через:

Если можешь читать/писать — это тоже твой билет. Обход WAF или CDN (если есть) — используй прямой доступ через IP или подмену Host заголовка:

Доказательство: Сделай скрин, где ты заходишь на assets.target.com и видишь свою страничку с надписью «Pwned by братан». Или покажи, как сливаешь куки через JS, залитый на бакет: document.cookie уходит на твой сервер evil.com/log. Видишь это в логах? Это не фото кота, это твой баг-репорт на $5k.

Советы

3 вектора для добивания:

  1. Проверь другие поддомены: Если один CNAME висит, то и другие поддомены могут быть мусором. Фуззи через ffuf -w subdomains.txt -u http://FUZZ.target.com или используй Amass для пассивного сбора.

  2. Ищи связанные сервисы: Если S3 привязан к CloudFront, проверяй его настройки на предмет слабых политик. Иногда CDN отдаёт доступ к бакету через обход. Пробуй: curl -H "Host: some-bucket.s3.amazonaws.com" https://cloudfront-url.

  3. Смотри на старые записи: Исторические данные DNS (например, через securitytrails.com) могут показать удалённые CNAME, которые всё ещё кэшируются где-то. Это твой шанс на захват.

План атаки:

  1. Собирай поддомены через subfinder -d target.com -o subdomains.txt.

  2. Проверяй CNAME-записи через dnsrecon -d target.com -t axfr или вручную с dig CNAME sub.target.com.

  3. Если находишь свободный 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/. Если повезёт — это твой джекпот.

Мои курсы