
CF-Hero is a reconnaissance tool that uses multiple data sources to discover the origin IP addresses of Cloudflare-protected web applications
무엇인가요? • 기능 • 배경 • 설치 • 사용법 • cf-hero 실행 • ZoomEye (스폰서) • 할 일
CF-Hero는 Cloudflare로 보호되는 웹 애플리케이션의 실제 IP 주소를 발견하기 위해 개발된 종합적인 정찰 도구입니다. 다양한 방법을 통해 다중 소스 정보 수집을 수행합니다.
이 도구는 이러한 소스의 데이터를 분석하여 Cloudflare로 보호되는 대상의 잠재적인 원본 IP 주소를 식별합니다. 응답 분석을 통해 결과를 검증하여 오탐(false positive)을 최소화합니다.
도구의 간단한 흐름도```
┌──────────┐
│ │ ┌─────────┐
│ 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 레코드가 있고 그중 일부는 CF와 연결된 IP 주소에 해당하지 않을 수 있습니다. (이 DNS 출력은 단지 예시일 뿐이며 musana.net의 정확한 DNS 응답을 나타내지 않을 수 있습니다.)```
;; 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 주소를 추출하고 마지막으로 HTTP를 통해 찾은 IP에 연결을 시도합니다.
예를 들어 DNS TXT 레코드가 있다고 가정해 보겠습니다. TXT 레코드에서 볼 수 있듯이 SPF 레코드가 있습니다. 일부 회사는 자체 메일 서버를 호스팅할 수 있으며 TXT 레코드에는 대상 도메인을 가리키는 IP가 포함될 수 있습니다.
다음 DNS 응답에서 볼 수 있듯이 SPF 레코드에는 일부 IP 주소가 있습니다. Cf-Hero는 또한 이러한 IP 주소를 확인합니다.``` ;; 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는 CF 뒤에 있는 도메인의 실제 IP를 찾는 또 다른 기법입니다. 특수 목적을 위한 특수 검색 엔진이 많이 있습니다. Shodan과 Censys가 그중 두 가지입니다. 이들은 더 상세하고 기술적인 정보를 제공합니다. 이러한 검색 엔진은 인터넷 전체를 지속적으로 스캔하여 새로운 자산을 발견하거나 자산의 변경 사항을 모니터링하고 기록합니다. CF 뒤에 있지 않은 도메인이 올라오면 이 두 엔진은 도메인의 실제 IP를 기록할 수 있습니다. 시간이 지나 도메인이 cloudflare 뒤에 있게 되더라도 이러한 검색 엔진을 사용해 해당 IP를 찾을 수 있습니다.
CF-Hero는 censys와 shodan도 확인합니다. (참고: 이러한 서비스를 사용할 때 API 할당량으로 인해 일부 제한이 있습니다.)
## (하위)도메인
또 다른 트릭 방식은 (하위)도메인 기법입니다. 실제로 하위 도메인일 필요는 없으며 일반 도메인일 수도 있습니다. 핵심은 도메인이 같은 회사에 속해야 한다는 것입니다.
도메인이 2개 있다고 가정해 봅시다. 하나는 CF 뒤에 있지만 다른 하나는 그렇지 않습니다. 이 경우 CF 뒤에 있지 않은 도메인에 연결한 다음 호스트 헤더를 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 서비스를 사용합니다. cf-hero.yaml 파일에 API 키를 입력한 후 -securitytrails 매개변수를 사용하여 이 스캔을 수행할 수 있습니다.
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 매개변수를 사용하세요.```
Use the **securitytrails** parameter to include SecurityTrails in the scan```
# cat domain.txt | cf-hero -securitytrails
-td 및 -dl 매개변수를 사용하여 Cloudflare 뒤에 있지 않은 도메인 또는 하위 도메인 목록을 활용해 대상 도메인의 IP 주소를 찾아보세요. -dl 매개변수로 대상의 클라우드 또는 온프레미스 인프라에서 사용되는 활성 IP 주소를 식별한 블록의 IP 주소를 지정하면 대상 도메인의 실제 IP 주소를 찾을 수 있습니다.```
CF 뒤에 있는 도메인을 얻기 위해```
# cf-hero -f domains.txt -cf
CF 뒤에 있지 않은 도메인을 얻으려면```
기타 옵션 (사용자 지정 ja3, 프록시, 워커, 사용자 에이전트)```
# cf-hero -d https://musana.net -ua "Mozilla" -w 32 -ja3 "771,22..." -px "http://127.0.0.1:8080"
$HOME/.config/ 디렉토리에 cf-hero.yaml 파일을 생성하여 API 키를 설정하세요.```
// content of YAML file should be like;
zoomeye:
> **Censys에 관한 참고:** CF-Hero는 이제 [Censys Platform API](https://docs.censys.com/reference/get-started)를 사용합니다.
> (레거시 `search.censys.io` API는 2026년에 지원이 종료될 예정입니다). 개인 액세스 토큰(PAT)을 생성하여
> Censys Platform 콘솔에서 첫 번째 `censys` 항목으로 입력하세요. 계정이 유료 플랜인 경우
> API 액세스 페이지에 표시된 조직 ID를 두 번째 항목으로 추가하세요. 이 값이 없으면 API는
> Free-tier 권한을 반환하며 결과를 반환하지 않을 수 있습니다(HTTP 403).
## SS
- 스마트 색상 지정: 노란색 하이라이트는 Cloudflare가 아닌 IP를 나타내며, 이 IP들은 검사 대상일 뿐입니다.
- 제목 매개변수는 첫 번째 요청이 Cloudflare에 의해 차단된 경우 설정할 수 있습니다. (제목은 'Just a moment...'가 됩니다.) 제목 매개변수가 설정되지 않은 경우, 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 통합