
CF-Hero est un outil de reconnaissance qui utilise plusieurs sources de données pour découvrir les adresses IP d'origine des applications web protégées par Cloudflare.
Qu'est-ce que c'est ? • Fonctionnalités • Contexte • Installation • Utilisation • Exécuter cf-hero • ZoomEye (Sponsor) • À faire
CF-Hero est un outil complet de reconnaissance développé pour découvrir les adresses IP réelles des applications web protégées par Cloudflare. Il effectue la collecte de renseignements multi-sources via diverses méthodes.
L'outil analyse les données de ces sources pour identifier les adresses IP d'origine potentielles des cibles protégées par Cloudflare. Il valide les résultats par l'analyse des réponses afin de minimiser les faux positifs.
un organigramme simple de l'outil```
┌──────────┐
│ │ ┌─────────┐
│ 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 │◄───────────────────────────┘
└──────────┘
# Fonctionnalités
### Fonctionnalités
- Reconnaissance DNS
- Vérifie les enregistrements DNS actuels (A, TXT)
- Extrait les domaines derrière Cloudflare
- Extrait les domaines qui ne sont pas derrière Cloudflare
- Titre HTML fourni par l'utilisateur (si CF vous bloque)
- Coloration intelligente
- Intelligence tierce
- Intégration ZoomEye
- Intégration Censys
- Intégration Shodan
- Intégration SecurityTrails
- Recherche IP inversée pour les domaines associés
- Fonctionnalités avancées
- Prise en charge d'empreintes JA3 personnalisées
- Capacités d'analyse simultanée
- Prise en charge de l'entrée standard (piping)
- Comparaison du titre HTML pour validation
- Prise en charge du proxy
- Configuration d'un User-Agent personnalisé
# Contexte
## Enregistrements DNS actuels
Examinons un cas d'utilisation avec des paramètres DNS mal configurés.
Comme vous pouvez le voir, une requête DNS classique renvoie l'adresse IP du domaine. Par exemple, musana.net est derrière Cloudflare (CF), mais parfois le domaine possède plusieurs enregistrements A, et certains d'entre eux peuvent ne pas correspondre à des adresses IP associées à CF. (Cette sortie DNS n'est qu'un exemple illustratif et peut ne pas représenter la réponse DNS exacte pour 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)
L'autre cas concerne les enregistrements TXT. Parfois, le domaine est derrière CF, mais l'IP réelle du domaine peut être utilisée dans les enregistrements TXT. CF-Hero vérifie tous les enregistrements TXT, puis extrait toutes les adresses IP et tente enfin de se connecter via HTTP à l'IP trouvée.
Prenons par exemple des enregistrements DNS TXT. Comme on le voit dans les enregistrements TXT, il y a un enregistrement SPF. Certaines entreprises peuvent héberger leur propre serveur mail et les enregistrements TXT peuvent contenir une IP qui pointe vers le domaine cible.
Comme vous pouvez le voir dans la réponse DNS suivante, l'enregistrement SPF contient des adresses IP. Cf-Hero vérifie également celles-ci.``` ;; 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 est une autre technique pour trouver la vraie IP de tout domaine qui se trouve derrière CF. Il existe de nombreux moteurs de recherche spécialisés pour des besoins spécifiques. Shodan et Censys en sont deux exemples. Ils fournissent des informations plus détaillées et techniques. Ces moteurs de recherche analysent en continu tout Internet, découvrent de nouveaux actifs, ou surveillent et journalisent les changements dans les actifs. Lorsqu'un domaine qui n'est pas derrière CF est mis en ligne, les robots de ces moteurs peuvent journaliser la vraie IP du domaine. Après un certain temps, si le domaine est placé derrière Cloudflare, son IP peut être trouvée à l'aide de ces moteurs de recherche.
CF-Hero vérifie également censys et shodan. (Notez que lorsque vous utilisez ces services, vous avez certaines limites en raison du quota d'API.)
## (Sous)Domaines
L'autre astuce consiste en la technique des (sous)domaines. En fait, il ne doit pas nécessairement s'agir d'un sous-domaine, cela peut aussi être un domaine. Le point clé est le suivant : les domaines doivent appartenir à la même entreprise.
Disons que nous avons 2 domaines. L'un est derrière CF mais l'autre ne l'est pas. Dans ce cas, vous vous connectez au domaine qui n'est pas derrière CF, puis vous modifiez l'en-tête Host avec le domaine qui est derrière CF. Si vous obtenez une réponse de l'application qui est derrière CF, félicitations, vous avez contourné CF. Vous pouvez désormais accéder à l'application web directement via l'IP. (et bien sûr, cela dépend aussi de la configuration)
Regardons de plus près.```
--> 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 ----------------->/
Les services d’enregistrements DNS historiques tentent de découvrir tous les domaines sur Internet et d’enregistrer les modifications apportées aux enregistrements DNS de ces domaines. Le plus connu de ces services est securitytrails. Si un domaine est publié sur Internet avec sa véritable adresse IP, le bot de ces services peut consigner sa véritable adresse IP ; ensuite, si le domaine est placé derrière Cloudflare, les véritables adresses IP peuvent être découvertes à l’aide de ces services. Ainsi, nous pouvons trouver la véritable adresse IP d’un domaine qui a été diffusé avec sa véritable adresse IP dans le passé.
Il utilise le service securitytrails pour les enregistrements DNS historiques. Vous pouvez effectuer cette analyse à l’aide du paramètre -securitytrails après avoir saisi la clé API dans le fichier cf-hero.yaml.
cf-hero nécessite go1.18 pour être installé correctement. Exécutez la commande suivante pour installer.``` go install -v github.com/musana/cf-hero/cmd/cf-hero@latest
# Utilisation```
____ __
_____/ __/ / /_ ___ _________
/ ___/ /__ ___ / __ \/ _ \/ ___/ __ \
/ /__/ ___/ (___) / / / / __/ / / /_/ /
\___/_/ /_/ /_/\___/_/ \____/
@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
La commande d'exécution la plus basique. Elle vérifie les enregistrements A et TXT par défaut.```
ou vous pouvez passer le paramètre "f" à celui-ci.```
# cf-hero -f domains.txt
Utilisez le paramètre zoomeye pour inclure ZoomEye dans l'analyse```
Utilisez le paramètre **censys** pour inclure Censys dans l'analyse.```
# cat domain.txt | cf-hero -censys
Utilisez le paramètre shodan pour inclure Shodan dans le scan.```
Utilisez le paramètre **securitytrails** pour inclure SecurityTrails dans l'analyse.```
# cat domain.txt | cf-hero -securitytrails
Utilisez les paramètres -td et -dl pour tenter de trouver l'adresse IP du domaine cible en utilisant une liste de domaines ou de sous-domaines qui ne sont pas derrière Cloudflare. En spécifiant les adresses IP dans les blocs où vous avez identifié des adresses IP actives utilisées par l'infrastructure cloud ou sur site de la cible avec le paramètre -dl, vous pouvez trouver la véritable adresse IP du domaine cible.```
pour obtenir les domaines derrière CF```
# cf-hero -f domains.txt -cf
pour obtenir les domaines non derrière CF```
autres options (ja3 personnalisé, proxy, worker, user agent)```
# cf-hero -d https://musana.net -ua "Mozilla" -w 32 -ja3 "771,22..." -px "http://127.0.0.1:8080"
créez le fichier cf-hero.yaml dans le répertoire $HOME/.config/ pour définir la clé API```
// content of YAML file should be like;
zoomeye:
> **Note sur Censys :** CF-Hero utilise désormais l'[API Censys Platform](https://docs.censys.com/reference/get-started)
> (l'API `search.censys.io` héritée sera mise hors service en 2026). Générez un jeton d'accès personnel (PAT)
> depuis la console Censys Platform et placez-le en première entrée `censys`. Si votre compte est sur un plan
> payant, ajoutez votre identifiant d'organisation (affiché sur la page API Access) en deuxième entrée — sans lui, l'API
> renvoie des autorisations de niveau gratuit et peut ne donner aucun résultat (HTTP 403).
## Captures d'écran
- Coloration intelligente : les surlignages jaunes indiquent les IP non-Cloudflare, qui ne seront soumises qu'à des vérifications.
- Le paramètre title peut être défini si la première requête est bloquée par Cloudflare. (Le titre serait 'Just a moment...') Si le paramètre title n'est pas défini, le titre HTML est récupéré automatiquement.
<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>
## 🏆 Sponsoring
Ce projet est fièrement soutenu par [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>
## À faire
- recherche de favicon
- intégration de viewdns