CF-Hero ищет IP-адрес исходного сервера сайта, который работает через Cloudflare. Программа не взламывает CDN и не извлекает закрытые данные из инфраструктуры Cloudflare. Она собирает кандидатов из DNS-записей, архивов DNS и поисковиков публично доступных сервисов, после чего проверяет, похож ли ответ найденного IP на ответ целевого сайта.
Материал предназначен для проверки собственных доменов или инфраструктуры, которую владелец разрешил тестировать. Не применяйте инструкции для несанкционированного сбора данных, обхода защиты чужих ресурсов или атак на найденные серверы. Соблюдайте законы своей страны, включая требования, действующие в России.
Что программа ищет на самом деле
Когда сайт подключают к Cloudflare в режиме проксирования, публичная DNS-запись обычно указывает на адрес Cloudflare, а не на сервер владельца. Но реальный сервер может раскрыться из-за старой DNS-записи, неправильно опубликованного поддомена, IP-адреса в TXT-записи или следа в Shodan, Censys, ZoomEye либо SecurityTrails.
CF-Hero начинает с домена и проверяет его A-записи. В коде программы зашит список IPv4-подсетей Cloudflare. Найденные адреса инструмент делит на адреса Cloudflare и адреса, которые в эти подсети не входят. Если домен вообще не использует IP Cloudflare, сканирование origin-адреса прекращается: цель считается не защищенной Cloudflare.
Затем программа получает TXT-записи домена через публичные DNS-резолверы 1.1.1.1, 1.0.0.1, 8.8.8.8 и 8.8.4.4. Из текста она регулярным выражением извлекает IPv4-адреса. Типичный пример утечки связан с SPF-записью почты:
v=spf1 ip4:203.0.113.25 include:_spf.example.net -all
Наличие адреса в SPF не доказывает, что перед нами веб-сервер сайта. Адрес может принадлежать почтовому шлюзу. CF-Hero поэтому не просто печатает IP, а пытается открыть найденный адрес по HTTP или HTTPS и сравнить HTML-заголовок страницы с заголовком целевого сайта.
| Источник | Что получает CF-Hero | Что может пойти не так |
|---|---|---|
| A-записи | Текущие адреса домена, включая случайно оставленный origin | Непроксируемый IP может относиться к другому сервису |
| TXT-записи | IPv4-адреса из SPF и других строк | Чаще встречаются адреса почтовых серверов |
| SecurityTrails | Исторические A-записи домена | Старый IP мог давно сменить владельца |
| Shodan | Историю DNS по домену | Данные зависят от покрытия и лимитов API |
| Censys | Хосты, найденные по доменному имени | Совпадение домена не гарантирует совпадение приложения |
| ZoomEye | Кандидаты из поисковой базы интернет-сервисов | Результат требует отдельной проверки |
Как CF-Hero подтверждает найденный IP
Главная проверка в текущем коде довольно узкая. Для целевого URL CF-Hero получает содержимое тега
<title>
страницы. Для каждого IP-кандидата программа сначала проверяет, открыт ли порт 80, затем порт 443, отправляет запрос и снова извлекает HTML-заголовок. Если заголовки совпали, адрес выводится как найденный real IP.Допустим, собственный сайт
https://audit.example
через Cloudflare возвращает заголовок страницыCustomer Portal
. Историческая DNS-база нашла адрес203.0.113.25
. Если запрос напрямую к этому адресу также вернул страницу с заголовкомCustomer Portal
, CF-Hero сообщит, что IP найден через SecurityTrails, Shodan или другой выбранный источник.Такое совпадение полезно для первичной диагностики, но не служит строгим доказательством. Стандартный заголовок вроде
Welcome
,Home
илиLogin
встречается у тысяч сайтов. Обратная ошибка тоже возможна: реальный origin не подтвердится, если сервер требует правильный заголовок Host, отдает другую страницу при прямом обращении по IP или доступен только с адресов Cloudflare.В документации описана проверка списка связанных доменов с подстановкой Host-заголовка. Но в актуальном исходном коде параметр домена передается в функцию проверки, а сам запрос к IP выполняется без видимой установки нужного Host-заголовка. Поэтому режим с
-td
и-dl
нельзя считать надежной реализацией проверки виртуальных хостов без дополнительной ручной верификации.Запуск на своем домене
Программа написана на Go. Разработчик указывает требование Go 1.18 или новее и предлагает установить последнюю версию одной командой:
go install -v github.com/musana/cf-hero/cmd/cf-hero@latest
Важная деталь из кода: входные значения должны начинаться с
http://
илиhttps://
. Файл со строкойaudit.example
программа отфильтрует, а строкуhttps://audit.example
примет в работу.Минимальная проверка собственного домена использует только текущие A- и TXT-записи:
echo "https://audit.example" | cf-hero -v
Параметр
-v
включает подробный вывод: программа покажет найденные адреса, отметит IP Cloudflare и сообщит, какие кандидаты проверяет. Тот же аудит для списка своих доменов выглядит так:cf-hero -f owned-domains.txt -v
Содержимое файла:
https://audit.example
https://portal.example
https://shop.example
Для исторических DNS-записей и поисковых баз нужны API-ключи. CF-Hero читает их из файла
~/.config/cf-hero.yaml
:securitytrails:
- "API_KEY"
shodan:
- "API_KEY"
censys:
- "API_KEY"
zoomeye:
- "API_KEY"
После настройки можно проверить собственный домен по архиву DNS:
echo "https://audit.example" | cf-hero -securitytrails -v
Или подключить несколько источников одновременно:
echo "https://audit.example" | cf-hero -securitytrails -shodan -censys -zoomeye -v
Когда Cloudflare вместо сайта показывает межстраничную проверку с заголовком вроде
Just a moment...
, CF-Hero сравнивает кандидатов не с приложением, а с заглушкой Cloudflare. Для своего проекта можно заранее узнать настоящий заголовок приложения и передать его вручную:echo "https://audit.example" | cf-hero -securitytrails -title "Customer Portal" -v
Что нового полезного и где программа переоценивает себя
Версии v1.0.3 и v1.0.4 сделали инструмент удобнее для аудита: появился подробный режим вывода, интеграция ZoomEye и ручное указание заголовка, когда фронтенд Cloudflare мешает проверке. Программа также умеет обрабатывать список доменов параллельно, число рабочих потоков задает параметр
-w
.Но CF-Hero остается узким инструментом разведки по публичным следам. Он не сравнивает HTML-хеши, favicon-хеши, уникальные заголовки ответа или TLS-сертификаты, хотя такие признаки помогли бы снизить число ложных совпадений. В списке планов разработчика пока указаны favicon search и интеграция viewdns, а не готовые функции.
Есть и более принципиальное ограничение. Найденный адрес не означает, что защита Cloudflare уже бесполезна. Origin может принимать только соединения от разрешенных сетей Cloudflare, блокировать прямые запросы на межсетевом экране или обслуживать на том же IP другое приложение. Результат CF-Hero нужно воспринимать как повод проверить конфигурацию, а не как окончательный вердикт.
Для администратора полезный сценарий выглядит просто: прогнать свои домены через A- и TXT-проверку, при наличии доступа подключить исторические источники, вручную перепроверить каждый кандидат, затем закрыть origin на уровне межсетевого экрана так, чтобы веб-трафик принимался только от сетей Cloudflare. Если сервер продолжает отвечать напрямую из интернета, проблема находится не в CDN, а в настройке инфраструктуры.
CF-Hero действительно раскрывает IP любого сайта за Cloudflare?
Нет. Программа находит только публичные следы и подтверждает кандидатов по совпадению HTML-заголовка. При корректно закрытом origin-сервере, чистой истории DNS и отсутствии утечек инструмент может ничего не найти.
Нужны ли платные сервисы для запуска?
Базовая проверка A- и TXT-записей работает без API-ключей. Для SecurityTrails, Shodan, Censys и ZoomEye нужны учетные данные соответствующих сервисов, а доступность результатов зависит от их тарифов и лимитов.
Почему найденный IP может оказаться ложным?
CF-Hero подтверждает кандидата главным образом по совпадению HTML-заголовка. Одинаковый заголовок могут возвращать разные сайты, почтовый сервер может попасть в TXT-запись, а старый адрес из DNS-истории уже может не относиться к проекту.
Как проверить, что собственный сервер действительно спрятан?
Нужно убедиться, что публичные DNS-записи не раскрывают origin, старые адреса больше не обслуживают сайт, а межсетевой экран принимает HTTP- и HTTPS-трафик к origin только от разрешенных сетей Cloudflare. Один успешный результат CF-Hero уже означает, что конфигурацию следует перепроверить.
