Забудьте про свои сканеры уязвимостей, которые тупо долбят 169.254.169.254 и радуются, если видят 200 OK. Сейчас мы поговорим о настоящем колдовстве: как заставить браузер жертвы атаковать сам себя. Как обмануть ту самую пресловутую Same-Origin Policy (SOP), которая якобы стоит на страже веб-безопасности.
Мы разберем всё: от матчасти до написания своего кастомного DNS-сервера на коленке, который будет плясать под нашу дудку. Мы пройдемся по реальным кейсам - от кражи ключей AWS до полного компромета локальных сетей.
Погнали.
Введение: Почему мы всё ещё тут, и кому это нужно?
1.1. Пролог: Миф о "безопасной внутренней сети"
Абсолютное большинство людей - от сисадмина с двадцатилетним стажем до домохозяйки, которая ставит пароль "12345" на вай-фай, - свято верят в одну иллюзию. Эта иллюзия называется "Моя локальная сеть - моя крепость".Звучит знакомо, правда? "Ну, у нас же корпоративный фаервол на периметре", "Мы используем NAT, из интернета к нам не достучаться", "У нас белые IP только на DMZ, а внутренние сервера в изоляции". Или на бытовом уровне: "Я ж не идиот, чтобы по подозрительным ссылкам тыкать, у меня антивирус Касперского стоит и вай-фай паролем закрыт".
Спойлер: всё это - херня. Прости за прямоту, но это так. Фаервол на периметре не поможет, если атака идёт изнутри. NAT - это не безопасность, а кривой костыль для нехватки IPv4-адресов, который не даёт входящим соединениям пробиться, но понятия не имеет, что делать с исходящими. А антивирус - это вообще табличка "Мойдодыр" на двери сортира: вроде приятно, но если внутрь уже кто-то пролез, эта табличка его не остановит.
DNS Rebinding - это именно та атака, которая с хирургической точностью препарирует этот миф. Она не ломает твой фаервол. Она не подбирает пароль к твоему роутеру перебором. Она не эксплуатирует какой-то сложный zero-day баг в ядре Linux. Вместо всего этого она делает нечто гораздо более элегантное и пугающее: она превращает браузер жертвы в прокси для атаки на её же внутреннюю сеть.
Представь ситуацию. Ты сидишь в уютном офисе, подключён к корпоративной сети. У тебя запущена внутренняя CRM-система на 192.168.10.50, система мониторинга на 10.0.0.15 и, скажем, админка твоего же собственного пет-проекта на localhost:8080. Ты абсолютно уверен, что эти сервисы в безопасности, потому что из интернета до них просто не добраться. И тут ты открываешь в браузере ссылку, которую тебе прислал "коллега" в мессенджере - ну там, смешной мем с котиком или важный документ. И всё. Твоя внутренняя сеть перестала быть твоей. Она стала нашей.
1.2. Исторический экскурс: Как старая проблема стала новой
Знаешь, сколько лет DNS Rebinding? Она старше, чем многие читатели этой статьи. Впервые о ней заговорили ещё в конце 90-х - начале 2000-х. В 2001 году исследователь по имени Dan Kaminsky (тот самый, который позже нашёл фатальную уязвимость в самом протоколе DNS) публично описал эту технику. Уже тогда было понятно, что комбинация доверчивости браузера и гибкости DNS - это гремучая смесь.Почему же она до сих пор жива? Почему мы в 2026 году обсуждаем атаку, которой больше четверти века?
Ответ банален до скрежета зубовного: инерция и legacy. Архитектура веба застыла в бетоне совместимости. Нельзя просто так взять и сказать: "А давайте браузеры перестанут менять IP-адрес для одного домена", потому что сразу же сломаются все легитимные системы балансировки нагрузки и CDN, которые используют низкий TTL для быстрого переключения трафика между серверами. Нельзя полностью запретить запросы с публичных IP на приватные, потому что есть куча легитимных кейсов (например, плагины браузера, которые общаются с локальными сервисами).
Индустрия выбрала путь пластырей и костылей. Вместо того чтобы перепроектировать фундамент, браузеры обзавелись такими штуками как DNS Pinning (пришпиливание IP), а потом от него отказались. Потом придумали CORS, который должен был регулировать доступ между источниками, но DNS Rebinding обходит CORS на корню, потому что для браузера источник (origin) не меняется. Потом появились спеки вроде Private Network Access (бывший CORS-RFC1918), но их внедрение идёт со скрипом, и в них до сих пор полно дыр (привет, 0.0.0.0).
Так что да, это старая атака. Но старая - не значит мёртвая. Старая - значит отточенная, как бритва якудза, и проверенная в бесчисленных реальных кампаниях.
1.3. Почему это работает?
Давай на секунду отойдём от технических деталей и подумаем о философии. Почему DNS Rebinding вообще возможна?Потому что в основе взаимодействия браузера с сервером лежит фундаментальное несоответствие: браузер оперирует доменными именами, а сетевое соединение - IP-адресами.
Браузер думает категориями "сайтов". Для него
Ссылка скрыта от гостей
- это целостная сущность, которой он доверяет (или не доверяет) на основе протокола, домена и порта. Он создаёт изоляцию (песочницу) для каждого такого "сайта".Сеть же - тупая. Ей плевать на домены. Ей нужен IP-адрес, порт и протокол. Она просто пересылает байты туда, куда скажешь.
DNS - это клей, который соединяет эти два мира. И это клей - ненадёжный. Он может быть изменён (нами, атакующими) в любой момент.
Браузер совершает акт веры. Он говорит: "Я один раз спросил у DNS, где живёт example.com, и запомнил это. Теперь все последующие соединения к example.com я буду отправлять на этот IP, пока DNS не скажет мне что-то другое, или пока я сам не решу проверить заново". Мы, как атакующие, эксплуатируем этот промежуток между "один раз спросил" и "проверил заново". Мы заставляем браузер изменить своё мнение о том, где живёт сайт, прямо во время сессии, сохранив при этом все привилегии, которые даются "сайту".
Это как если бы ты договорился встретиться с другом в кафе, пришёл туда, а друг позвонил и сказал: "Слушай, я переехал в другое кафе, но ты всё ещё считай, что мы встречаемся в первом, и заказывай там кофе для меня". Официант (браузер) принесёт кофе (запрос) в пустое кафе (локальный IP), но будет думать, что обслуживает твоего друга (домен).
1.4. Экономика атаки: Зачем это злоумышленникам в 2026 году?
А зачем это реальным плохим парням? Какая у них мотивация?- Кража данных из внутренних систем. Самый очевидный сценарий. Компании хранят свои самые ценные данные именно во внутреннем периметре: бухгалтерия, кадровые данные, исходный код, коммерческая тайна. Внешний периметр защищён хорошо, а внутри часто царит анархия доверия. Один клик менеджера по ссылке - и внутренняя википедия компании (с кучей паролей и инструкций) утекает наружу.
- Компрометация IoT и умного дома. Это вообще золотая жила. Камеры, холодильники, роботы-пылесосы, розетки, лампочки - весь этот зоопарк торчит наружу через облачные сервисы, но внутри сети они часто общаются по примитивным протоколам без какой-либо аутентификации. DNS Rebinding позволяет отдавать команды напрямую устройствам в локальной сети жертвы. Можно открыть умный замок, выключить сигнализацию, или, что ещё веселее, добавить камеру в ботнет для DDoS-атак.
- Обход сложных сетевых сегментаций. В некоторых компаниях есть настолько параноидальная сегментация сети, что даже если злоумышленник получит доступ к одному компьютеру, он не сможет с него пройти дальше, потому что там стоят ACL (Access Control Lists) на уровне железа. Но браузер на компьютере жертвы находится внутри её сегмента сети. Он может ходить туда, куда самой жертве разрешено. Атакуя через браузер, мы используем легитимные пути доступа жертвы, которые уже открыты фаерволами.
- Кража токенов облачных провайдеров. Мы уже упоминали AWS Metadata. Но это касается не только AWS. Google Cloud, Azure, DigitalOcean, Яндекс.Облако - у всех есть похожие сервисы метаданных. Если на инстансе в облаке работает браузер (например, разработчик зашёл на свою виртуалку по RDP и открыл там ссылку), мы можем украсть токены роли этой виртуалки и получить доступ к облачной инфраструктуре компании извне.
- Использование браузера жертвы как прокси для сканирования. Наш JavaScript может сканировать локальную сеть жертвы изнутри. Мы можем узнать, какие у неё есть сервисы, какие порты открыты, какие версии софта стоят. Это разведка, которая остаётся полностью незаметной для сетевых средств обнаружения вторжений, потому что трафик идёт от легитимного компьютера легитимного пользователя.
1.5. Прежде чем мы начнём (Pre-flight check)
Чтобы тебе было комфортно читать дальше, и чтобы ты мог сразу же пробовать всё на практике, я рекомендую подготовить небольшой полигон. Тебе не обязательно делать это прямо сейчас, но имей в виду.- Виртуальная машина. Лучше всего взять чистую VM с Linux (например, Ubuntu 22.04 или Kali Linux) без важных данных. Мы будем поднимать DNS-серверы на 53-м порту, а это требует прав root и может конфликтовать с локальными сервисами. Виртуалка позволит не засрать основную систему.
- Два браузера. Желательно иметь под рукой Chrome, Firefox и, может быть, Safari, чтобы проверять различия в их поведении.
- Простой HTTP-сервер на localhost. Мы будем его атаковать. Это может быть что угодно: python3 -m http.server 8000, или Node.js приложение, или даже просто админка роутера, если ты тестируешь в своей сети.
- VPS (необязательно, но желательно). Для полного погружения тебе понадобится сервер в интернете с белым IP, на котором ты сможешь поднять свой DNS и веб-сервер. Подойдёт самый дешёвый VPS за $3-5 в месяц. Но на первых порах можно тестировать всё локально, замкнув на 127.0.0.1.
Чтобы лучше понять фундаментальные механизмы атак на DNS и угрозы, связанные с манипуляциями DNS‑ответами, полезно изучить материалы по DNS‑атакам в целом - они шире дают картину того, как злоумышленники могут использовать уязвимости в системе доменных имен для обхода сетевых защит.
2. Матчасть: SOP - это не абвер, но тоже защищает
Прежде чем ломать, нужно понять, что ломаем. Same-Origin Policy (SOP) - это, блин, краеугольный камень безопасности любого браузера. Придумали её в Netscape ещё в 95-м, когда интернет был в основном текстом и ссылками .Идея гениальная в своей простоте: скрипт с одного сайта не должен иметь доступ к данным другого сайта. Иначе любой скрипт с левого ресурса читал бы вашу почту, если вы её открыли в соседней вкладке.
Что считается одним источником (Origin)? Это три кита:
- Протокол (схема): http:// и https:// - это разные миры.
- Хост (домен): example.com и
Ссылка скрыта от гостей- тоже разные. Строгость, блин, почти армейская.
- Порт: :80 и :8080 - как небо и земля.
| URL для сравнения с
Ссылка скрыта от гостей
| Результат | Причина |
|
Ссылка скрыта от гостей
| Разный | Порты не совпадают (81 vs 443) |
|
Ссылка скрыта от гостей
| Разный | Домены не совпадают (нужен
Ссылка скрыта от гостей
.) |
|
Ссылка скрыта от гостей
| Разный | Протоколы разные (HTTP vs HTTPS) |
|
Ссылка скрыта от гостей
| Один | Меняется только путь. Это разрешено |
Так вот, когда наш скрипт с hackers.space пытается стучаться на 192.168.0.1, браузер смотрит: протокол? - может совпадать. А вот хост? Для браузера 192.168.0.1 - это не hackers.space. Всё, блокировка. Именно эту проверку мы и будем обходить.
3. Суть атаки: Фокус с переодеванием
DNS Rebinding - это не взлом DNS-сервера провайдера. Это манипуляция на нашем собственном, легитимном DNS-сервере, который мы контролируем.Вот пошаговая схема, как это происходит :
- Приманка. Жертва (пусть её внутренний IP будет 192.168.1.10) переходит по ссылке на наш сайт
Ссылка скрыта от гостей(или кликает на баннер с 18+, неважно).
- Первое знакомство. Браузер жертвы идёт к DNS-резолверу и спрашивает: "Где rebind.it?". Наш авторитативный DNS-сервер (который мы настроили) отвечает: "Он на 104.28.1.2" (это IP нашего сервера с вредоносным JS). Важный момент: мы ставим TTL (Time-To-Live) этой записи равным 0 или 1 секунде. Это значит, что кэшировать этот ответ нельзя .
- Загрузка полезной нагрузки. Браузер загружает с 104.28.1.2 нашу HTML-страницу с JavaScript-кодом. JS активируется и готовится к работе.
- Смена маски. Проходит секунда. Запись в кэше браузера/ОС протухла. Наш JS-скрипт инициирует новый запрос к
Ссылка скрыта от гостей(или куда нам надо). Браузер снова идет в DNS. И тут наш сервер (или специально настроенный DNS) отвечает: "А теперь rebind.it находится по адресу 192.168.1.1" (роутер жертвы) или 127.0.0.1 (её же компьютер) .
- Успех! Браузер смотрит на запрос: домен тот же (rebind.it), протокол тот же (http), порт (скорее всего 80, если не указан иной). Всё сходится! SOP доволен. Но на самом деле запрос уходит на внутренний IP. Ответ от роутера или локального сервиса возвращается в JS, и мы можем его прочитать и отправить к себе на сервер сбора данных.
4. Технический ликбез про TTL: Почему 0 - это наше всё
TTL (Time-To-Live) в контексте DNS - это время в секундах, которое резолвер (будь то кэш провайдера или ваша операционка) имеет право хранить запись у себя, прежде чем сходить за актуальной версией .В обычной жизни TTL измеряется часами. Это нужно для стабильности. Но нам стабильность не нужна, нам нужен контроль.
Если мы выставим TTL в 0, это предписание: "НЕ КЭШИРУЙ ВООБЩЕ!". Но тут есть нюанс. Многие публичные DNS-резолверы (например, Google 8.8.8.8) могут сказать "пошли вы" и проигнорировать TTL=0 из соображений производительности. Они всё равно закэшируют на несколько секунд. Поэтому на практике используют TTL=1 или TTL=2. Достаточно мало, чтобы запись быстро исчезла, но достаточно "вежливо", чтобы резолверы не начали ее игнорировать .
Стратегии переключения:
Наш DNS-сервер должен уметь отдавать разные IP в зависимости от того, который по счету запрос.
- First then second: Первый запрос - IP атакующего. Все последующие - IP жертвы (например, 127.0.0.1). Классика .
- Round Robin: Чередование: раз - наш IP, два - IP жертвы, три - наш, четыре - жертвы... Подходит для ситуаций, когда нужно "прощупать" много портов и стабильность не важна .
- Random: Генератор случайных чисел решает, кем прикинуться в этот раз.
5. Инструментарий: Хватаем то, что плохо лежит
Хватит теории, переходим к хардкору.5.1. Singularity of Origin (NCCGroup) - мастхэв
Это не просто инструмент, это фреймворк. Он поднимает сразу и DNS-сервер, и веб-сервер с эксплойтами. Умеет делать автоматический sweep портов, сканировать внутренние подсети и даже имеет красивую веб-морду для управления атакой .Ставится легко, использует Python. Рекомендую для серьезных пентестов, когда нужно показать заказчику красивые скриншоты его же падения.
5.2. rebind из репозиториев Kali
Старый, добрый, консольный. Часто идет в комплекте с Kali Linux .Как пользоваться:
Bash:
sudo rebind -i eth0 -d yourdomain.com
Он поднимет DNS на 53-м порту, веб-сервер на 80-м для атаки и отдельный сервер на 81-м для сбора данных (коллбэков). Просто и эффективно. Главное - чтобы 53-й порт на вашей VPS был открыт для всех.
5.3.
Ссылка скрыта от гостей
Если нужно быстро проверить гипотезу или нет желания поднимать свой DNS-сервер, есть этот онлайн-сервис .Он генерирует специальный домен вида 7f000001.c0a80101.rbndr.us. IP-адреса кодируются в шестнадцатеричном формате и разделяются точкой. Например, 7f000001 = 127.0.0.1, а c0a80101 = 192.168.1.1. Сервис отвечает по кругу: сначала на первый IP, потом на второй. Идеально для быстрого POC (Proof of Concept).
5.4. dnsFookup - когда хочется логов
Этот инструмент написал парень, который нашел баг в AWS через DNS Rebinding . Он позволяет создавать кастомные правила (например, "3 раза отдай IP атакующего, 1 раз - IP жертвы") и, что самое главное, ведет подробные логи. Вы реально видите каждый запрос, который прилетел на ваш DNS. Помогает понять, что происходит в браузере жертвы, особенно если что-то идет не по плану.Git репа: GitHub - makuga01/dnsFookup: DNS rebinding toolkit .
5.5. Пишем свой простой DNS-сервер на Python
Не доверяете готовым решениям? Хотите полный контроль? Понимаю. Давайте набросаем простейший DNS-сервер на Python, который будет делать ровно то, что нам нужно - сначала отдавать один IP, потом другой.Для этого используем библиотеку dnslib. Ставим:
pip install dnslib.Создаем файл rebind_dns.py:
Python:
#!/usr/bin/env python3
from dnslib import *
from dnslib.server import DNSServer
import time
# Настройки
DOMAIN = 'rebind.lab.' # Точка в конце важна!
FIRST_IP = "1.2.3.4" # IP нашего сервера с JS
SECOND_IP = "127.0.0.1" # Целевой IP (localhost жертвы)
TTL = 1 # Время жизни записи
# Счетчик запросов (глобальный, но для демо пойдет)
# В реальности для каждого клиента нужно хранить отдельную сессию,
# но для простоты оставим так.
request_count = 0
class RebindingResolver:
def resolve(self, request, handler):
global request_count
reply = request.reply()
qname = request.q.qname
qtype = request.q.qtype
# Нас интересуют только A-записи (IPv4) для нашего домена
if qtype == QTYPE.A and str(qname) == DOMAIN:
request_count += 1
print(f"[*] Запрос #{request_count} от {handler.client_address[0]}")
if request_count == 1:
ip = FIRST_IP
print(f" -> Отдаем первый IP: {ip}")
else:
ip = SECOND_IP
print(f" -> Отдаем целевой IP: {ip}")
# Добавляем ответ в пакет
reply.add_answer(RR(qname, QTYPE.A, ttl=TTL, rdata=A(ip)))
else:
# Если запрашивают не наш домен - игнорим
pass
return reply
if __name__ == '__main__':
resolver = RebindingResolver()
# Запускаем DNS сервер на всех интерфейсах, порт 53
# (для запуска на порту 53 нужны root-права)
server = DNSServer(resolver, port=53, address="0.0.0.0")
print(f"[+] DNS Rebinding Server запущен для домена {DOMAIN}")
print(f"[+] Стратегия: {FIRST_IP} (1 раз) -> {SECOND_IP} (все остальные)")
server.start()
Запускаем от root:
sudo python3 rebind_dns.pyЭтот сервер считает все запросы подряд. Для реальной атаки нужно привязываться к IP клиента, но для понимания механики и теста на себе - самое то. Первый же запрос к rebind.lab даст наш реальный IP, второй и последующие - 127.0.0.1.
6. Практика: Охота на локальные сервисы
Теперь самое мясо. Как это юзать в реальном мире. Разберем несколько жирных кейсов.6.1. Кейс 1: Burp Suite MCP Server (2025 год)
Это свежий баг, который уже успели закрыть, но суть от этого не меняется . Burp Suite - это основной инструмент любого уважающего себя веб-пентестера. У них есть фича - MCP Server (Model Context Protocol), который по умолчанию висел на localhost:9876 и позволял делать запросы.Проблема была в том, что сервер не проверял, откуда пришел запрос (CORS и валидация origin'а были в зачаточном состоянии) . Атакующий делал следующее:
- Регал домен на rbndr.us или поднимал свой DNS.
- Генерил ссылку вида
Ссылка скрыта от гостей, где 7f000001 = 127.0.0.1, а c0a80103 - IP атакующего сервера.
- Жертва (разработчик, у которого запущен Burp) переходила по ссылке.
- Сначала браузер шел на IP атакующего и загружал JS.
- JS пытался стучаться на порт 9876 того же домена. DNS резолвил этот запрос уже в 127.0.0.1.
- Так как порт 9876 на localhost был открыт (Burp слушал), JS мог слать команды MCP серверу: читать историю запросов (где могли быть токены и пароли), делать внутренние запросы от имени Burp и т.д. .
6.2. Кейс 2: Deluge BitTorrent Client - читаем файлы с диска
Тут история еще интереснее. Deluge - популярный торрент-клиент. У него есть веб-интерфейс для управления. И в какой-то момент в нем нашли path traversal .Суть бага: при запросе к /js/deluge-all/..%2F..%2F..%2F..%2Fetc%2Fpasswd сервер отдавал файл, потому что плохо чистил пути. Но доступ к веб-интерфейсу обычно только с localhost. Казалось бы, безопасно? А вот хрен.
Атакующий делает DNS Rebinding:
- Цель: 127.0.0.1:8112 (порт Deluge WebUI).
- Стратегия: сначала отдаем свой IP, потом - 0.0.0.0 (это special-purpose адрес, который в Linux/Mac означает "все интерфейсы", включая localhost, и используется для обхода некоторых защит) .
- JS в браузере жертвы стучится на
Ссылка скрыта от гостей.
- DNS-сервер отдает 0.0.0.0, браузер шлет запрос на localhost:8112.
- Deluge отдает конфиг с хешом пароля админа.
- JS считывает ответ и шлет его на сервер атакующего.
6.3. Кейс 3: AWS Metadata - классика жанра
Это классика, которую знают все, но она до сих пор работает в 90% случаев, если разработчики не озаботились защитой .Cloud Metadata - это сервис по адресу 169.254.169.254, который отдает credentials роли инстанса. Если вы смогли до него достучаться - вы получили ключи доступа к AWS API.
Представьте приложение, которое рендерит картинки по URL. Оно защищено от SSRF и блокирует прямой доступ к 169.254.169.254. Но оно доверяет запросам от самого себя? Нет? А если эти запросы придут от браузера администратора, который просто зашел посмотреть статистику на сайте?
Атакующий отправляет ссылку админу. JS через DNS Rebinding стучится на 169.254.169.254/latest/meta-data/iam/security-credentials/ и забирает ключи. Профит - полный компрометация AWS аккаунта .
7. Обход защит: Игра в "кошки-мышки" с браузерами
Производители браузеров не дураки, они пытаются с этим бороться. Но не всегда успешно.7.1. DNS Pinning
Это старая защита. Браузер, получив первый IP для домена, "пришпиливает" его и не меняет до перезагрузки или очень долгого таймаута, игнорируя TTL . Это убивает атаку. Но от этого страдают легитимные сервисы с балансировкой нагрузки (когда IP меняется часто). Поэтому многие браузеры отказались от строгого пиннинга или сделали его очень слабым. В современных браузерах это уже не панацея.7.2. Local Network Access (CORS-RFC1918)
Это новый стандарт, который делит адреса на публичные и приватные (127.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8 и т.д.) . По задумке, сайт с публичного IP не может делать запросы на приватный IP, если приватный сервер явно не разрешил это через CORS.Казалось бы, victory? Но нет.
- Обход через 0.0.0.0: В Linux и MacOS адрес 0.0.0.0 не считается приватным по стандарту, но при подключении браузер попадает на localhost. Это дыра, которую активно юзают .
- Обход через спец. домены: Некоторые браузеры всё еще разрешают ребайндинг на localhost, если домен изначально резолвился в публичный IP, а потом вдруг стал localhost. Защита есть, но она не везде включена по умолчанию.
7.3. Когда HTTPS не помогает
Часто думают: "У нас HTTPS, значит всё ок". Действительно, если ваш сайт на HTTPS, а локальный сервис жертвы - просто HTTP, то при смене IP браузер попытается установить HTTPS-соединение с локальным сервисом. Локальный сервис, естественно, не сможет предоставить валидный сертификат на ваш домен. Соединение оборвется .Но!
- Если локальный сервис тоже работает по HTTPS с самоподписанным сертификатом, браузер покажет ошибку, но продвинутый пользователь (или тупой скрипт) может её проигнорировать.
- Если целевой сервис внутри сети использует тот же домен, что и атакующий (например, корпоративная CRM висит на crm.agency.com, и у нее есть нормальный сертификат от внутреннего CA), то атака пройдет как по маслу.
8. Методы защиты (для тех, кому не насрать)
Если вы админ и читаете это, чтобы понять, как защитить свою помойку, - ловите чеклист.На стороне сервера (локального сервиса):
- Валидация Host-заголовка: Ваш локальный сервис (на 127.0.0.1:8080) должен проверять, какой Host пришел в запросе. Если пришел Host: rebind.it - сразу отбрасывать такой запрос. Сервис должен знать свое имя (например, localhost или internal.corp.com) и отвечать только на него .
- Аутентификация: Если на ваш сервис нельзя зайти без пароля, даже DNS Rebinding не поможет (если только мы не воруем сессию через XSS, но это уже другая история). Cookies от rebind.it не уйдут на localhost, потому что у них другой domain .
- HTTPS с валидным сертификатом: Если ваш локальный сервис использует HTTPS с сертификатом, подписанным внутренним CA, который не доверяет браузеру жертвы - атака захлебнется на этапе TLS-рукопожатия.
- Не слушайте 0.0.0.0 без нужды: Если приложение слушает все интерфейсы, это упрощает жизнь атакующим. Старайтесь биндиться на 127.0.0.1 строго.
- Блокировка "грязных" ответов: Настройте свой DNS-резолвер (например, dnsmasq) так, чтобы он отбрасывал ответы, где внешний домен резолвится в приватный IP (127.0.0.0/8, 192.168.0.0/16, 10.0.0.0/8, 169.254.0.0/16) . Это называется DNS-фильтрация или использование dnswall .
- DNSSEC: Технически может помочь, но на практике его внедрение - геморрой, и мало кто им пользуется для защиты от ребайндинга.
9. Заключение
Мы прошли с тобой огромный путь. От философии доверия в интернете до шестнадцатеричных кодировок IP-адресов в доменах rbndr.us. От Same-Origin Policy, которую придумали, когда интернет был размером с университетский кампус, до современныхспекак Private Network Access, которые пытаются (и пока безуспешно) заткнуть дыры в этой политике.Мы разобрали атаку DNS Rebinding под микроскопом. Мы увидели, как элегантно и просто она обходит многоуровневую защиту, построенную на доверии к доменным именам. Мы написали свой DNS-сервер, который умеет менять маски на лету. Мы прошлись по реальным уязвимостям в софте, который стоит у каждого второго разработчика (Burp Suite) и у каждого третьего гика (Deluge). Мы заглянули в облака и увидели, как можно украсть ключи от AWS, просто заставив браузер жертвы сходить по адресу 169.254.169.254.
И знаешь, какой главный вывод я хочу, чтобы ты вынес из этого всего? В безопасности нет священных коров. Нет ничего, что было бы защищено "по умолчанию" просто потому, что оно "внутри" или "локально".
Внутренняя сеть - это не крепость. Это проходной двор с табличкой "посторонним вход воспрещён", на которую всем насрать, если у них есть приглашение от браузера. Localhost - это не магическое заклинание, отгораживающее от мира. Это просто ещё один сетевой интерфейс, к которому можно достучаться, если обмануть того, кто стучится. А браузер - это не безопасная песочница, а доверчивый исполнитель, который делает то, что ему скажет JavaScript, если его правильно попросить.
9.2. Что мы узнали на самом деле?
Давай пробежимся по ключевым инсайтам, которые мы вынесли из этого путешествия.1. DNS - это не просто "телефонная книга", это поле боя.
Мы привыкли воспринимать DNS как скучную инфраструктурную данность. Прописал А-запись - и забыл. Но DNS это динамический протокол. TTL существует не просто так, и возможность быстрой смены IP-адреса для одного домена - это фича, а не баг. Фича, которую CDN-провайдеры используют для балансировки, а хакеры для ребайндинга. Мы поняли, что низкий TTL это не всегда хорошо для безопасности, и что кэширование - наш друг, если мы жертва, и враг, если мы атакующий.
2. Same-Origin Policy - это не стена, это решето.
SOP - отличная штука, когда нужно разделить evil.com и gmail.com. Но она доверяет идентификатору "источник" (origin) абсолютно слепо. Если мы, как атакующие, можем контролировать резолвинг домена в IP, мы можем заставить браузер считать, что localhost и наш сайт - это один и тот же источник. SOP не проверяет, что за железка отвечает на том конце провода. Ей важен только ярлычок, который мы ловко подменили.
3. Безопасность на уровне сети (Network-level security) бессильна против атак на уровне приложения (или наоборот).
Это, пожалуй, самый важный урок. Ты можешь иметь самый крутой корпоративный фаервол с правилами "запрещено всё, что не разрешено". Ты можешь сегментировать сеть VLAN-ами. Ты можешь поставить IDS/IPS на каждом углу. Но если твой сотрудник откроет в браузере ссылку, и его браузер, находясь внутри этой защищённой сети, начнёт атаковать локальные сервисы - твои сетевые защиты просто не увидят этой атаки. Для них это будет легитимный трафик легитимного пользователя к легитимному (с их точки зрения) ресурсу. Это классический разрыв между слоями OSI: мы атакуем на 7-м (прикладном) уровне, используя дыру в 3-м (сетевом) уровне.
4. Разработчики - первые (и главные) виновники.
Мы видели это на примере Burp Suite, Deluge и тысячи других приложений. Разработчики внутренних сервисов часто находятся в плену иллюзии безопасности. "Это же локальный сервис, кто к нему достучится, кроме localhost?" - думают они. И не валидируют Host-заголовок. И не ставят аутентификацию на запросы с localhost. И слушают на всех интерфейсах (вдруг пригодится?). И используют устаревшие версии библиотек с path traversal. В результате один клик по ссылке - и локальный сервис, который должен был быть внутренним инструментом, превращается в открытое веб-приложение, доступное для любого скрипта в интернете (через браузер жертвы).
5. Браузеры - это насосы для данных, а не песочницы.
Мы привыкли думать о браузере как о безопасном контейнере для запуска кода из интернета. Но реальность такова, что браузер - это мощнейший инструмент для доступа к ресурсам. Он умеет ходить по сети, читать файлы (через file:// API, хотя и с ограничениями), обращаться к железу (через WebUSB, WebBluetooth), хранить кучу данных (cookies, localStorage). И всё, что нужно атакующему - это получить контроль над этим инструментом. DNS Rebinding - один из способов такого контроля. Мы не взламываем браузер, мы просто используем его по назначению, но с подменённой целью.
9.3. Взгляд с обеих сторон баррикад
Это значит - понимать мотивы и ограничения всех сторон конфликта.- Жертва. Она не тупая и не ленивая. Она просто живёт в своей реальности. Она не знает, что клик по ссылке с мемом может открыть доступ к её веб-камере. Она доверяет браузеру, потому что браузер - это окно в интернет. Её вина минимальна. Виноваты те, кто создал условия, в которых такой клик стал опасным.
- Разраб. Он не злодей. Он хотел как лучше: сделать удобный локальный сервис без лишней аутентификации, чтобы не бесить пользователя. Он думал, что localhost - это безопасно. Он просто не знал о DNS Rebinding, или знал, но думал, что это "старая атака, которую давно пофиксили". Его ошибка - в недостатке знаний, а не в злом умысле.
- Создатели браузеров. Они пытаются балансировать на грани. С одной стороны - безопасность, с другой - совместимость с легаси. Нельзя просто выключить DNS-перепривязку, потому что сразу перестанут работать законные сервисы. Они вводят сложные механизмы вроде Private Network Access, но они работают криво, потому что веб - это зоопарк.
- Атакующий. Это мы с тобой (в рамках этой статьи, конечно). Мы не хотим просто сломать чужое. Мы хотим понять, как система работает на пределе своих возможностей. Мы хотим найти грань, где доверие заканчивается и начинается уязвимость. Мы испытываем кайф от элегантности решения, от того, как несколько простых идей складываются в красивую атаку. Мы не циничны, мы - исследователи. Иногда наши исследования могут принести пользу, помогая сделать системы безопаснее.
9.4. Будущее атаки: Что дальше?
Давай включим хрустальный шар и попробуем заглянуть в будущее. Что ждёт DNS Rebinding через 5, 10 лет?Оптимистичный сценарий (для защитников):
- Массовое внедрение Private Network Access (PNA). Если все браузеры начнут железно требовать, чтобы сайты с публичных IP запрашивали специальное разрешение у приватных сервисов перед отправкой запроса, и если приватные сервисы начнут отдавать правильные CORS-заголовки (или, что лучше, перестанут отвечать на запросы без них), то атака умрёт. Но это потребует изменения миллионов строк кода в legacy-системах. Процесс идёт, но медленно.
- Ужесточение политик DNS-резолверов. Провайдеры и корпоративные DNS-серверы могут начать фильтровать ответы, в которых внешние домены резолвятся в приватные IP-адреса. Это называется DNS-ребайндинг защита на уровне резолвера. Такие штуки уже есть в dnsmasq, но редко включены по умолчанию.
- HTTPS везде. Если все внутренние сервисы перейдут на HTTPS с валидными (пусть даже внутренними) сертификатами, то при ребайндинге браузер будет ругаться на несоответствие сертификата домену. Но для этого нужно, чтобы сертификаты были у каждого локального сервиса, включая роутеры и принтеры. Фантастика.
- Интернет вещей (IoT) похоронит все попытки защиты. Мир наводнён миллиардами устройств с прошивками, которые писались вчерашними студентами за еду. У этих устройств открыты веб-морды на локальных портах, там нет аутентификации, они не обновляются. DNS Rebinding для IoT - это как открытый шведский стол. Пока есть такие устройства, атака будет жить и процветать.
- Новые обходы старых защит. Как только браузеры закроют дыру с 0.0.0.0, исследователи найдут новый спец-адрес или новый способ обмануть резолвер. Это бесконечная гонка вооружений. Мы видели это с DNS Pinning, мы видим это сейчас с PNA. Всегда будет какой-нибудь легаси-метод или недокументированная фича, которая позволит провернуть трюк.
- Комбинация с другими атаками. DNS Rebinding редко используется сама по себе. Чаще это часть цепочки: социальная инженерия -> ребайндинг -> кража токенов -> доступ к API. По мере усложнения систем, цепочки становятся длиннее, а ребайндинг остаётся удобным звеном для перехода из внешнего мира во внутренний.
9.5. Что делать тебе?
Ты потратил кучу времени (или просто промотал вниз, но я надеюсь на первое). Что дальше? Как применить это знание?Если ты пентестер или баг-хантер:
- Добавь DNS Rebinding в свой арсенал. Не останавливайся на сканировании портов с Metasploit. В следующий раз, когда будешь тестировать веб-приложение, посмотри, не открывает ли оно какие-то API для localhost. Попробуй проэксплуатировать это через клиента. Используй Singularity или dnsFookup для автоматизации.
- Ищи комбинации. DNS Rebinding + Path Traversal = чтение файлов с диска жертвы. DNS Rebinding + CSRF-уязвимость в локальном сервисе = выполнение действий от имени жертвы в её внутренней сети. Комбинируй, фантазируй.
- Пиши об этом. Если найдёшь новый вектор или обход защиты - не молчи. Публикуй write-up, делись с сообществом. Это движет индустрию вперёд.
- Перестань доверять localhost. Это просто ещё один сетевой интерфейс.
- Валидируй Host-заголовок. Твой сервер на 127.0.0.1:8080 должен отвечать только на запросы, где в Host указано localhost:8080 или твоё внутреннее доменное имя, но не evil.com. Это первая линия защиты.
- Используй аутентификацию. Даже для локальных сервисов. Простая базовая HTTP-аутентификация или токен в заголовке остановят 90% атак.
- Не слушай на всех интерфейсах без нужды. Биндись строго на 127.0.0.1.
- Включай CORS, если твой сервис может понадобиться веб-страницам. И настраивай его строго: разрешай только конкретные источники, а не *. Для запросов с localhost, вероятно, CORS вообще не нужен, так что можно отвечать заголовком Access-Control-Allow-Origin: null или вообще его не ставить, запретив тем самым доступ из браузера.
- Будь бдителен. Ссылки - это опасная штука. Не переходи по ним из писем и сообщений от незнакомцев, даже если они выглядят заманчиво. Если ссылку прислал друг, но его сообщение выглядит странно - переспроси в другом канале, не взломали ли его.
- Обновляй софт. Современные браузеры автоматически обновляются и получают патчи безопасности, которые (возможно, медленно, но верно) закрывают векторы ребайндинга. Используй последние версии.
- Используй браузеры с усиленной защитой. Например, в Firefox есть режим "Строгой защиты от отслеживания", который может блокировать некоторые виды ребайндинг-атак. Или используй расширения вроде uMatrix/uBlock Origin в продвинутом режиме, чтобы контролировать, к каким IP может обращаться страница.
Прощальный напутствие
Мы - сообщество. Мы - те, кто не принимает всё на веру. Те, кто копает глубже, чем написано в мануалах.Те, кто задаёт вопрос "а что, если...?" и ищет на него ответ, даже если ответ ломает устоявшиеся представления.
DNS Rebinding - это всего лишь одна из многих атак, которые демонстрируют хрупкость нашей цифровой цивилизации. Но она - отличная метафора нашего подхода к жизни.
- Будь как DNS-запись с TTL=0: Не застревай в устаревших знаниях. Постоянно обновляй свою картину мира. То, что было безопасно вчера, может быть дырой сегодня.
- Будь как браузер жертвы: Доверяй, но проверяй. Верь в хорошее, но всегда имей в виду, что обстоятельства могут измениться (и IP-адрес может подмениться).
- Будь как атакующий DNS-сервер: Умей быстро переключаться между ролями и точками зрения. Сначала ты - белый и пушистый, потом - жёсткий и проникающий. Адаптивность - ключ к выживанию.
- Будь как защищённый локальный сервис: Не жди милостей от сети. Сам проверяй, кто к тебе стучится, и не пускай чужих, даже если они говорят, что они свои.
Мир не станет безопаснее после прочтения этой статьи. Уязвимости никуда не денутся. Люди продолжат кликать на ссылки, разработчики - забывать про Host-заголовки, а браузеры - пытаться балансировать между безопасностью и совместимостью.
Но, надеюсь, ты стал немного другим. Ты увидел, как за кулисами обычного веб-сёрфинга разворачиваются настоящие драмы. Ты понял, что безопасность - это не набор галочек, а постоянный процесс мышления. Ты вооружился знанием, которое можно использовать и для защиты, и для нападения.
Что ты выберешь - дело твоё. Я лишь показал тебе карту. Дальше ты идёшь сам.
Последнее редактирование модератором: