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

DNS Rebinding на IoT API — домашние камеры и принтеры через браузер превращаются в твоих ботов

DNS Rebinding на IoT API — домашние камеры и принтеры через браузер превращаются в твоих ботов

• Что вижу: Целая армия IoT-устройств (камеры, роутеры, принтеры, NAS) в локальных сетях, которые светят наружу своими веб-мордами на 192.168.x.x. У них либо нет аутентификации, либо дефолтные креды. API для управления этими поделками часто не проверяет заголовок Host и не имеет никакой CSRF-защиты.

• Как поймал: Никак. Я не сканирую 192.168.1.1 из своего подвала. Я заставляю браузер жертвы сделать это за меня. Пользователь просто заходит на мой зловредный сайт evil-kittens.com. Дальше его браузер сам становится моим личным nmap’ом для его локалки.

• Чем пахнет: Тотальный захват LAN. Можно читать почту с NAS, смотреть в камеры, печатать “ты уволен” на принтере соседа, использовать его роутер как прокси. Класс уязвимости — обход Same-Origin Policy. Вероятность — 8 из 10. Если у юзера есть типичный китайский IoT-хлам, он мой.

Че почем
• Эксплойт:
1. Настройка DNS: Тебе нужен домен, скажем, rebind.pentester.local, и свой DNS-сервер, который им управляет. Этот сервер должен быть хитрым: на первый запрос для rebind.pentester.local он отвечает IP твоего сервера (144.X.X.X) с минимальным TTL (Time To Live), например, 1 секунда. На все последующие запросы он отдаёт IP из приватного диапазона, например, 192.168.1.1.
2. Зловредный сайт: На твоём сервере (144.X.X.X) лежит страница с JavaScript. Юзер заходит на http://rebind.pentester.local, и его браузер загружает этот скрипт.
3. JavaScript-оружие: Скрипт в цикле начинает долбиться на свой же домен, например, запрашивать http://rebind.pentester.local/api/camera/stream.

• Обход защиты: Современные браузеры пытаются бороться с этим через DNS Pinning. Обход — заставить браузер сбросить кэш. Например, завалить его запросами к разным субдоменам, пока он не сдастся. Или использовать WebSockets, которые иногда менее строго относятся к пиннингу. Но самый жир в том, что большинству IoT-девайсов плевать на заголовок Host. Браузер думает, что общается с rebind.pentester.local, а на деле его запросы принимает роутер на 192.168.1.1, который радостно на них отвечает.

• Доказательство: Скриншот логов твоего collector.pentester.local, где в POST-запросах прилетает JSON с состоянием камеры или системной информацией роутера. Подпись к скрину: “Это не ответ от моего API. Это твой “умный дом” только что стал моим глупым ботом”.

Советы
Если ты поймал сигнал с вражеского IoT, вот план добивания:
1. Подними свой DNS-сервер (подойдёт dnsmasq с кастомными правилами) и веб-сервер с пейлоадом. Можешь использовать готовые фреймворки типа singular.city для тестов.
2. Модифицируй JS-пейлоад, чтобы он перебирал популярные локальные IP (192.168.0.1, 192.168.1.1, 10.0.0.1) и порты (80, 8080, 443).
3. Научи свой скрипт “фингерпринтить” устройства. Нашёл /login.htm с заголовком D-Link — пробуй дефолтные креды для D-Link. Нашёл /api/v2/ — значит, это камера Hikvision, дёргай её эндпоинты.
4. Слив данных — это для детей. Найди в API эндпоинт для обновления прошивки и залей туда свою. Преврати камеру в персистентный плацдарм в сети жертвы.

Если всё плохо и ничего не работает:
• Браузер кэширует DNS намертво? Попробуй атаку через WebRTC. Заставь браузер через STUN-сервер слить свои локальные IP, а потом уже атакуй их напрямую через другой Rebinding-домен.
• API требует аутентификации? Перебирай топ-10 дефолтных паролей (admin:admin, root:root, admin:12345). Твой JS может это делать в фоне, юзер ничего не заметит.
• Устройство отвечает, но API не даётся? Пиздец. Иди читать RFC по UPnP. Часто через него можно пробросить порты наружу и зайти на устройство уже без всякого Rebinding. Это низко, но эффективно.

Мои курсы