cdncheck
cdncheck是一个用于识别与DNS/IP网络地址相关技术的工具。
功能
- CDN、云和WAF检测
- 易于作为库使用
- 易于扩展的提供商
- 支持IP、DNS输入
- 文本、JSONL输出
- 输出过滤
安装
cdncheck需要go1.19才能成功安装。运行以下命令安装最新版本:
go install -v github.com/projectdiscovery/cdncheck/cmd/cdncheck@latest
使用
cdncheck -h
这将显示该工具的帮助信息。以下是它支持的所有开关。
用法:
./cdncheck [标志]
标志:
输入:
-i, -input string[] 要处理的IP/DNS列表
检测:
-cdn 仅在CLI输出中显示CDN
-cloud 仅在CLI输出中显示云
-waf 仅在CLI输出中显示WAF
匹配器:
-mcdn, -match-cdn string[] 匹配指定CDN提供商的主机(cloudfront、fastly、google、leaseweb)
-mcloud, -match-cloud string[] 匹配指定云提供商的主机(aws、google、oracle)
-mwaf, -match-waf string[] 匹配指定WAF提供商的主机(cloudflare、incapsula、sucuri、akamai)
过滤器:
-fcdn, -filter-cdn string[] 过滤指定CDN提供商的主机(cloudfront、fastly、google、leaseweb)
-fcloud, -filter-cloud string[] 过滤指定云提供商的主机(aws、google、oracle)
-fwaf, -filter-waf string[] 过滤指定WAF提供商的主机(cloudflare、incapsula、sucuri、akamai)
输出:
-resp 在CLI输出中显示技术名称
-o, -output string 以纯文本格式将输出写入文件
-v, -verbose 显示详细输出
-j, -jsonl 以JSON(行)格式写入输出
-nc, -no-color 禁用CLI输出中的颜色
-version 显示项目版本
-silent 仅在输出中显示结果
配置:
-r, -resolver string[] 要使用的解析器列表(文件或逗号分隔)
-e, -exclude 从输出中排除检测到的IP
-retry int DNS解析的最大重试次数(必须至少为1)(默认为2)
更新:
-up, -update 将cdncheck更新到最新版本
-duc, -disable-update-check 禁用自动cdncheck更新检查
如何添加新提供商?
provider.yaml文件包含CDN、WAF和云提供商列表。该列表包含URL、ASN和CIDR,然后使用generate-index
程序将其编译成最终的sources_data.json
文件。
provider.yaml
文件示例 -
cdn:
# asn包含提供商的ASN号码
asn:
leaseweb:
- AS60626
# urls包含CDN提供商的URL列表
urls:
cloudfront:
- https://d7uri8nf7uskq.cloudfront.net/tools/list-cloudfront-ips
fastly:
- https://api.fastly.com/public-ip-list
cidr 包含提供商的 CIDR 范围
cidr: akamai: - "23.235.32.0/20" - "43.249.72.0/22" - "103.244.50.0/24" - "103.245.222.0/23" - "103.245.224.0/24" - "104.156.80.0/20"
可以通过以下简单步骤将可从 URL、ASN 或静态 CIDR 列表抓取的新提供商添加到 provider.yaml
文件中:
- 复刻包含
cmd/generate-index/provider.yaml
文件的 GitHub 仓库。 - 将复刻的仓库克隆到本地机器,并导航到
cmd/generate-index
目录。 - 打开
provider.yaml
文件,找到你要添加的提供商类型(CDN、WAF 或 Cloud)对应的部分。 - 在
provider.yaml
文件的适当部分添加新提供商的信息。 - 提交你的更改,并附上描述性的提交信息。
- 将更改推送到 GitHub 上你复刻的仓库。
- 向原始仓库提交包含你更改的拉取请求。
其他提供商
基于 CNAME 和 Wappalyzer 的添加可以在 other.go 文件中完成。只需简单地将值添加到变量中即可。
// cdnCnameDomains 包含 CNAME 到域名再到 CDN 的映射
var cdnCnameDomains = map[string]string{
"cloudfront.net": "amazon",
"amazonaws.com": "amazon",
...
}
// cdnWappalyzerTechnologies 包含 Wappalyzer 技术到 CDN 的映射
var cdnWappalyzerTechnologies = map[string]string{
"imperva": "imperva",
"incapsula": "incapsula",
...
}
作为库使用 cdncheck
这是一个辅助库,用于检查给定的 IP 是否运行在云服务、CDN 或 WAF 上。
可以通过导入 github.com/projectdiscovery/cdncheck
来使用该库。以下是一个基本示例:
package main
import (
"fmt"
"net"
"github.com/projectdiscovery/cdncheck"
)
func main() {
client := cdncheck.New()
ip := net.ParseIP("173.245.48.12")
// 检查 IP 是否包含在 CDN 黑名单中
matched, val, err := client.CheckCDN(ip)
if err != nil {
panic(err)
}
if matched {
fmt.Printf("%v 是 %v\n", ip, val)
} else {
fmt.Printf("%v 不是 CDN\n", ip)
}
// 检查 IP 是否包含在云服务黑名单中
matched, val, err = client.CheckCloud(ip)
if err != nil {
panic(err)
}
if matched {
fmt.Printf("%v 是 %v\n", ip, val)
} else {
fmt.Printf("%v 不是云服务\n", ip)
}
// 检查 IP 是否包含在 WAF 黑名单中
matched, val, err = client.CheckWAF(ip)
if err != nil {
panic(err)
}
if matched {
fmt.Printf("%v WAF 是 %v\n", ip, val)
} else {
fmt.Printf("%v 不是 WAF\n", ip)
}
}
cdncheck 由 projectdiscovery 团队用 ❤️ 制作,并在 MIT 许可 下分发。