首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >CF-Hero:突破Cloudflare防护的智能侦察工具

CF-Hero:突破Cloudflare防护的智能侦察工具

作者头像
qife122
发布2025-11-13 16:55:27
发布2025-11-13 16:55:27
710
举报

项目描述

CF-Hero是一款专业的网络安全侦察工具,专门用于发现受Cloudflare保护的Web应用程序的真实IP地址。通过多源情报收集、DNS侦察和智能验证技术,有效识别潜在的真实服务器IP。

功能特性

  • DNS侦察:获取当前DNS记录(A、TXT记录)和历史DNS数据分析
  • 多源情报收集:集成ZoomEye、Censys、Shodan等多个搜索引擎
  • 智能验证:通过响应分析验证发现结果,减少误报
  • 关联域名发现:分析相关域名的关联性
  • 高性能扫描:支持多线程并发处理,提高扫描效率
  • 端口检测:自动检测HTTP/HTTPS端口的可访问性

安装指南

系统要求

  • Go 1.16 或更高版本
  • 网络连接(用于访问外部API和服务)

安装步骤

  1. 克隆项目仓库:
代码语言:javascript
复制
git clone https://github.com/musana/CF-Hero.git
  1. 进入项目目录:
代码语言:javascript
复制
cd CF-Hero
  1. 安装依赖:
代码语言:javascript
复制
go mod download
  1. 编译项目:
代码语言:javascript
复制
go build -o cf-hero main.go

或者直接go install安装cf-hero

代码语言:javascript
复制
go install -v github.com/musana/cf-hero/cmd/cf-hero@latest

依赖项

项目依赖以下Go模块:

  • github.com/gammazero/workerpool - 工作池管理
  • github.com/miekg/dns - DNS查询功能
  • github.com/projectdiscovery/retryabledns - 可重试DNS查询
  • github.com/Danny-Dasilva/CycleTLS/cycletls - TLS连接处理
  • github.com/fatih/color - 彩色输出
  • github.com/schollz/progressbar/v3 - 进度条显示

使用说明

基本用法

代码语言:javascript
复制
# 扫描单个目标
./cf-hero -d example.com

# 从文件读取多个目标
./cf-hero -f targets.txt

# 使用管道输入
cat targets.txt | ./cf-hero

参数选项

  • -d:指定目标域名
  • -f:从文件读取目标列表
  • -w:设置工作线程数(默认:10)

典型使用场景

  1. 渗透测试:在授权测试中识别Cloudflare背后的真实服务器
  2. 安全评估:评估组织的Cloudflare配置安全性
  3. 威胁情报:收集关于目标基础设施的情报信息

核心代码

主程序入口

代码语言:javascript
复制
packagemain

import (
"fmt"
"os"

"github.com/gammazero/workerpool"
"github.com/musana/cf-hero/internal/config"
"github.com/musana/cf-hero/internal/scanner"
"github.com/musana/cf-hero/internal/utils"
)

funcmain() {
fmt.Print(utils.Banner())

options :=config.ParseOptions()
varurls []string
vardomainList []string

ifoptions.File!=""&&options.DomainList=="" {
urls=utils.ReadFromFile(options.File)
} elseifoptions.File==""&&options.DomainList!="" {
urls=append(urls, options.TargetDomain)
domainList=utils.ReadFromFile(options.DomainList)
} else {
fi, _ :=os.Stdin.Stat()
iffi.Mode()&os.ModeNamedPipe==0 {
fmt.Println("[!] No data found in pipe. Urls must be given using pipe or f parameter!")
os.Exit(1)
} else {
urls=utils.ReadFromStdin()
}
}

scanner :=scanner.New(options, urls, domainList)
scanner.PreScan()

wp :=workerpool.New(options.Worker)
for_, url :=rangeurls {
url :=url
wp.Submit(func() {
scanner.Start(url)
})
}
wp.StopWait()
}

DNS查询功能

代码语言:javascript
复制
packagedns

import (
"net"
"regexp"

"github.com/miekg/dns"
"github.com/projectdiscovery/retryabledns"
)

funcGetARecords(domainstring) ([]net.IP, []net.IP) {
varcfIPs []net.IP
varnonCFIPs []net.IP

ips, _ :=net.LookupIP(domain)
iflen(ips) >0 {
for_, ip :=rangeips {
ifip.To4() !=nil {
result, _ :=IsInCloudflareIPRange(ip)
ifresult {
cfIPs=append(cfIPs, ip)
} else {
nonCFIPs=append(nonCFIPs, ip)
}
}
}
}
returncfIPs, nonCFIPs
}

funcIsInCloudflareIPRange(aIPnet.IP) (bool, net.IP) {
cloudflareRanges := []string{
"173.245.48.0/20",
"103.21.244.0/22",
"103.22.200.0/22",
"103.31.4.0/22",
"141.101.64.0/18",
"108.162.192.0/18",
"190.93.240.0/20",
"188.114.96.0/20",
"197.234.240.0/22",
"198.41.128.0/17",
"162.158.0.0/15",
"104.16.0.0/13",
"104.24.0.0/14",
"172.64.0.0/13",
"131.0.72.0/22",
}

for_, rangeStr :=rangecloudflareRanges {
_, cidr, _ :=net.ParseCIDR(rangeStr)
ifcidr.Contains(aIP) {
returntrue, aIP
}
}

returnfalse, aIP
}

HTTP客户端实现

代码语言:javascript
复制
packagehttp

import (
"crypto/tls"
"fmt"
"net"
"net/http"
"strings"
"time"

"github.com/Danny-Dasilva/CycleTLS/cycletls"
"golang.org/x/net/html"
)

funcNewHTTPClient(proxystring, targetURLstring) *http.Client {
transport :=&http.Transport{
DialContext: (&net.Dialer{
Timeout:   30*time.Second,
KeepAlive: 30*time.Second,
}).DialContext,
MaxIdleConns:          100,
IdleConnTimeout:       90*time.Second,
TLSHandshakeTimeout:   10*time.Second,
ExpectContinueTimeout: 1*time.Second,
ResponseHeaderTimeout: 30*time.Second,
DisableKeepAlives:     false,
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
}

ifproxy!="" {
transport.Proxy=http.ProxyFromEnvironment
}

return&http.Client{
Transport: transport,
Timeout:   60*time.Second,
}
}

funcCheckPort(hoststring, portstring) bool {
timeout :=time.Second*2
conn, err :=net.DialTimeout("tcp", net.JoinHostPort(host, port), timeout)
iferr!=nil {
returnfalse
}
ifconn!=nil {
conn.Close()
returntrue
}
returnfalse
}

测试使用

1.准备需要待检测的web应用域名列表,检测该web应用是否受Cloudflare保护,如果是则获取真实IP

如下所示,准备好收集到的域名列表

2.使用如下命令读取域名文件列表,逐个检测域名是否使用了Cloudflare进行保护,如果是的话,则获取该域名的真实ip地址

代码语言:javascript
复制
cf-hero -f E:\work\SecurityProject\CF-Hero\com.txt
\\-f 配置输入的文件路径,从文件中读取域名

结果如下所示

CF-Hero通过综合运用DNS分析、多源情报收集和智能验证技术,为安全研究人员提供了强大的Cloudflare绕过能力,是网络安全评估中的重要工具。感兴趣的朋友可以自己clone下来玩玩。

github链接地址:https://github.com/musana/CF-Hero.git

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全技术点滴分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 功能特性
  • 安装指南
    • 系统要求
    • 安装步骤
    • 依赖项
  • 使用说明
    • 基本用法
    • 参数选项
    • 典型使用场景
  • 核心代码
    • 主程序入口
    • DNS查询功能
    • HTTP客户端实现
  • 测试使用
    • 1.准备需要待检测的web应用域名列表,检测该web应用是否受Cloudflare保护,如果是则获取真实IP
    • 2.使用如下命令读取域名文件列表,逐个检测域名是否使用了Cloudflare进行保护,如果是的话,则获取该域名的真实ip地址
    • 结果如下所示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档