
CF-Hero — это инструмент разведки, который использует несколько источников данных для обнаружения исходных IP-адресов веб-приложений, защищённых Cloudflare.
Что это? • Возможности • Предыстория • Установка • Использование • Запуск cf-hero • ZoomEye (Спонсор) • Планы
CF-Hero — это комплексный инструмент разведки, разработанный для обнаружения реальных IP-адресов веб-приложений, защищённых Cloudflare. Он выполняет сбор информации из нескольких источников с помощью различных методов.
Инструмент анализирует данные из этих источников, чтобы выявить потенциальные исходные IP-адреса целей, защищённых Cloudflare. Он проверяет результаты с помощью анализа ответов, чтобы минимизировать ложные срабатывания.
простая блок-схема инструмента```
┌──────────┐
│ │ ┌─────────┐
│ Domain │───────►│ Check A │
│ │ │ Records │
└──────────┘ └────┬────┘
│
┌──────────────────┘
│
▼
┌─────────────┐
│Is it behind │ YES
│ CloudFlare │────────────────────────────────────────┐
└─────────────┘ │
│ │
│ │
│ ▼
│ ┌──────────────────────────┐
│ │ Check the domain from │
│ ┌─────────────────│ various sources │───────────────────┐
│ │ └──────────────────────────┘ │
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
│ ▼ ▼ ▼ ▼
│ ┌────────────────┐ ┌─────────────┐ ┌───────────┐ ┌─────────────┐
│ │ Historical DNS │ │ Current DNS │ ┌─┤ OSINT │ │ Sub/domains │
│ ┌──│ Records │ ┌─│ Records │ │ └───────────┘ ┌─│ │
│ │ └────────────────┘ │ └─────────────┘ │ ┌─────────┐ │ └─────────────┘
│ │ ┌──────────────┐ │ ┌───────────┐ ├──►│ ZoomEye │ │ ┌─────────────┐
│ ├───►│SecurityTrails│ ├──►│ TXT │ │ └─────────┘ │ │ sub(domains)│
│ │ └──────────────┘ │ └───────────┘ │ ┌─────────┐ └──►│ used by the │
│ │ ┌──────────────┐ │ ┌───────────┐ ├──►│ Shodan │ │ same company│
│ │ └───►│Completedns │ └──►│ A │ │ └─────────┘ └─────────────┘ │
│ │ └──────────────┘ └───────────┘ │ ┌─────────┐ │
│ │ └──►│ Censys │ │
│ │ └─────────┘ │
│ │ │
│ │ │
│ └────────────────────────────────────────────┬────────────────────────────────────────────┘
│ │
NO │ │
│ │
│ │
│ ▼
│ ┌──────────────────────────────────────┐
│ │ Establish direct HTTP connections to │
│ │ each discovered IP address │
│ └──────────────────────────────────────┘
│ │
│ │
│ │
│ ▼
│ ┌─────────────────────────────┐
│ │ Compare the HTML title with │
│ │ the target's title │
│ └─────────────────────────────┘
│ │
│ │
│ │
│ ▼
│ ┌─────────────────────┐
│ │ │ YES
│ │ Are they the same ? │─────────────────────┐
│ │ │ │
│ └─────────────────────┘ ▼
│ │ ┌───────────────┐
│ │NO │ Real IP found │
│ │ └───────┬───────┘
│ ▼ │
│ ┌──────────┐ │
└───────────────────────────────────────────►│ FINISH │◄───────────────────────────┘
└──────────┘
# Возможности
### Возможности
- DNS-разведка
- Проверяет текущие DNS-записи (A, TXT)
- Извлекает домены за Cloudflare
- Извлекает домены не за Cloudflare
- HTML-заголовок, указанный пользователем (на случай, если CF блокирует вас)
- Умная подсветка
- Сторонние разведданные
- Интеграция с ZoomEye
- Интеграция с Censys
- Интеграция с Shodan
- Интеграция с SecurityTrails
- Обратный поиск по IP для связанных доменов
- Расширенные возможности
- Поддержка пользовательских JA3-отпечатков
- Возможности параллельного сканирования
- Поддержка стандартного ввода (конвейера)
- Сравнение HTML-заголовков для проверки
- Поддержка прокси
- Настройка пользовательского User-Agent
# Контекст
## Текущие DNS-записи
Давайте рассмотрим сценарий с некорректными DNS-настройками.
Как вы можете видеть, обычный DNS-запрос возвращает IP-адрес домена. Например, musana.net находится за Cloudflare (CF), но иногда у домена есть несколько A-записей, и некоторые из них могут не соответствовать IP-адресам, связанным с CF. (Этот вывод DNS является лишь наглядным примером и может не отражать точный ответ DNS для musana.net.)```
;; ANSWER SECTION:
musana.net. 300 IN A 104.16.42.102
musana.net. 300 IN A 104.16.43.102
musana.net. 300 IN A 123.45.67.89 (Real IP exposed)
musana.net. 300 IN A 123.45.76.98 (Real IP exposed)
Другой случай связан с TXT-записями. Иногда домен находится за CF, но реальный IP-адрес домена может использоваться в TXT-записях. CF-Hero проверяет все TXT-записи, затем извлекает все IP-адреса и, наконец, пытается подключиться к найденному IP-адресу через HTTP.
Допустим, у нас есть DNS TXT-записи. Как видно из TXT-записей, в них есть SPF-запись. Некоторые компании могут размещать собственный почтовый сервер, и TXT-записи могут содержать IP-адрес, который указывает на целевой домен.
Как вы можете видеть в следующем ответе DNS, SPF-запись содержит некоторые IP-адреса. Cf-Hero также проверяет их.``` ;; ANSWER SECTION: musana.net. 115 IN TXT "1password-site-verification=LROK6G5XFJG5NF76TE2FBTABUA" musana.net. 115 IN TXT "5fG-7tA-G4V" musana.net. 115 IN TXT "MS=ms16524910" musana.net. 115 IN TXT "OSSRH-74956" musana.net. 115 IN TXT "docker-verification=6910d334-a3fc-419c-89ac-57668af5bf0d" musana.net. 115 IN TXT "docusign=4c6d27bb-572e-4fd4-896c-81bfb0af0aa1" musana.net. 115 IN TXT "shopify-verification-code=1Ww5VsPpkIf32cJ5PdDHdguRk22K2R" musana.net. 115 IN TXT "shopify-verification-code=NM243t2faQbaJs8SRFMSEQAc4J9UQf" musana.net. 115 IN TXT "v=spf1 include:_spf.google.com include:cust-spf.exacttarget.com include:amazonses.com include:mail.zendesk.com include:servers.mcsv.net include:spf.mailjet.com ip4:216.74.162.13 ip4:216.74.162.14 ip4:153.95.95.86 ip4:18.197.36.5 -all"
## OSINT
OSINT — ещё один способ найти реальный IP-адрес любого домена, который находится за CF. Существует множество специализированных поисковых систем для специальных целей. Shodan и Censys — две из них. Они предоставляют более детальную и техническую информацию. Эти поисковые системы непрерывно сканируют весь интернет, обнаруживают новые активы, а также отслеживают и логируют изменения активов. Когда домен, который не находится за CF, появляется, оба этих движка могут залогировать реальный IP-адрес домена. Через некоторое время, если домен окажется за Cloudflare, его IP можно будет найти с помощью этих поисковых систем.
CF-Hero также проверяет censys и shodan. (Обратите внимание, что при использовании этих сервисов у вас есть некоторые ограничения из-за квоты API.)
## (Суб)домены
Другой трюк — техника (суб)доменов. На самом деле это не обязательно должен быть субдомен, это может быть и домен. Ключевой момент здесь: домены должны принадлежать одной компании.
Допустим, у нас есть 2 домена. Один из них находится за CF, а другой — нет. В этом случае вы подключаетесь к домену, который не находится за CF, а затем меняете заголовок Host на домен, который находится за CF. Если вы получите ответ приложения, которое находится за CF, поздравляю, вы обошли CF. Теперь вы можете обращаться к веб-приложению напрямую по IP. (и, конечно, это также зависит от конфигурации)
Рассмотрим подробнее```
--> TCP --> blog.musana.net [123.45.67.89] ---> HTTPs -------------\
\
--> TCP --> api.musana.net [123.67.45.98] ----> HTTPs -----------\ \
\ \
--> TCP --> test.musana.net [123.89.44.88] ---> HTTPs -------------\ \
\___\____________________
--> TCP --> tools.musana.net [123.44.55.66] --> HTTPs -------------> | GET / HTTP/2 |
| Host: musana.net | ====> Check & Compare Responses
--> TCP --> admin.musana.net [33.44.123.45] --> HTTPs -------------->|_______________________|
/ /
--> TCP --> ... [...] ------------------------> HTTPs ------------------>/ /
/ /
--> TCP --> ... [...] ------------------------> HTTPs ---------------->/ /
/ /
--> TCP --> random-test.com [55.44.11.33] ----> HTTPs -------------->/ /
/
--> TCP --> fsubsidiary.net [66.77.22.123] ---> HTTPs ----------------->/
Сервисы исторических DNS-записей пытаются обнаружить все домены в Интернете и записывать изменения в DNS-записях этих доменов.Наиболее известным из этих сервисов является securitytrails. Если домен опубликован в интернете с его реальным IP-адресом, бот этого сервиса может записать его реальный IP-адрес; после этого, если домен размещён за cloudflare, реальные IP-адреса можно узнать с помощью этих сервисов. Таким образом, мы можем найти реальный IP-адрес домена, который в прошлом публиковался с реальным IP-адресом.
Для исторических DNS-записей используется сервис security trails. Вы можете выполнить это сканирование с помощью параметра -securitytrails после ввода API-ключа в файле cf-hero.yaml.
cf-hero требует go1.18 для успешной установки. Выполните следующую команду для установки.``` go install -v github.com/musana/cf-hero/cmd/cf-hero@latest
# Использование```
____ __
_____/ __/ / /_ ___ _________
/ ___/ /__ ___ / __ \/ _ \/ ___/ __ \
/ /__/ ___/ (___) / / / / __/ / / /_/ /
\___/_/ /_/ /_/\___/_/ \____/
@musana
_____________________________________________
Unmask the origin IPs of Cloudflare-protected domains
Usage:
cf-hero [flags]
Flags:
GENERAL OPTIONS:
-w int Worker count (default 16)
-f string Input file containing list of host/domain
-v Enable verbose output
-title string Specify HTML title to match (skip fetching from Cloudflare domain)
PRINT OPTIONS:
-cf Print domains behind Cloudflare
-non-cf Print domains not behind Cloudflare
SOURCES:
-censys Include Censys in scanning
-securitytrails Include SecurityTrails historical DNS records in scanning
-shodan Include Shodan historical DNS records in scanning
-zoomeye Include Zoomeye in scanning
-dl string Domain list for sub/domain scanning
-td string Target domain for sub/domain scanning
CONFIGURATION:
-hm string HTTP method. (default "GET")
-ja3 string JA3 String (default "772,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,18-10-16-23-45-35-5-11-13-65281-0-51-43-17513-27,29-23-24,0")
-ua string HTTP User-Agent (default "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/113.0")
-px string HTTP proxy URL
Самая базовая команда запуска. По умолчанию она проверяет записи A и TXT.```
или вы можете передать ему параметр "f".```
# cf-hero -f domains.txt
Используйте параметр zoomeye, чтобы включить ZoomEye в сканирование```
Используйте параметр **censys**, чтобы включить Censys в сканирование.```
# cat domain.txt | cf-hero -censys
Используйте параметр shodan, чтобы включить Shodan в сканирование.```
Используйте параметр **securitytrails**, чтобы включить SecurityTrails в сканирование.```
# cat domain.txt | cf-hero -securitytrails
Используйте параметры -td и -dl, чтобы попытаться найти IP-адрес целевого домена, используя список доменов или поддоменов, которые не находятся за Cloudflare. Указывая с помощью параметра -dl IP-адреса в блоках, где вы определили действующие IP-адреса, используемые облачной или локальной инфраструктурой цели, вы можете найти реальный IP-адрес целевого домена.```
чтобы получить домены за CF```
# cf-hero -f domains.txt -cf
чтобы получить домены, не находящиеся за CF```
другие опции (кастомный ja3, прокси, воркер, user agent)```
# cf-hero -d https://musana.net -ua "Mozilla" -w 32 -ja3 "771,22..." -px "http://127.0.0.1:8080"
создайте файл cf-hero.yaml в каталоге $HOME/.config/ чтобы установить ключ API```
// content of YAML file should be like;
zoomeye:
> **Примечание о Censys:** теперь CF-Hero использует [Censys Platform API](https://docs.censys.com/reference/get-started)
> (устаревший API `search.censys.io` будет отключён в 2026 году). Создайте персональный токен доступа (PAT)
> в консоли Censys Platform и укажите его первым значением `censys`. Если ваш аккаунт на платном
> тарифе, добавьте ID вашей организации (отображается на странице API Access) вторым значением — без него API
> возвращает права уровня Free-tier и может не выдать результатов (HTTP 403).
## Скриншоты
- Умная подсветка: жёлтым выделяются IP-адреса, не относящиеся к Cloudflare; они будут только проверяться.
- Параметр title можно задать, если первый запрос блокируется Cloudflare (заголовок будет 'Just a moment...'). Если параметр title не задан, HTML-заголовок извлекается автоматически.
<p align="left">
<img src="https://assets.kitploit.com/production/public/readmes/49199/e80b0d75e679cf55e02181d2af808f95830912a200c11a7c30427223bd7099cf.png">
</p>
<p align="left">
<img src="https://assets.kitploit.com/production/public/readmes/49199/71d5a3a4afae8732b7a7f945260bf65cdd5b28599adc9677d601c9977a84bf0f.png">
</p>
## 🏆 Спонсорство
Этот проект с гордостью поддерживается [ZoomEye](https://www.zoomeye.ai).
<p height="100" align="left">
<a href="https://www.zoomeye.ai"><img height="100" src="https://www.zoomeye.ai/static/logo-CVnk4X2t.svg"></a>
</p>
## В планах
- поиск по favicon
- интеграция с viewdns