GXX是一款强大的指纹识别工具,基于YAML配置的规则进行目标系统识别。 本工具支持多种协议(HTTP/HTTPS、TCP、UDP),可进行高效的批量目标扫描和精准识别。
- 强大的指纹识别 - 基于YAML的规则配置,简洁而强大
- 高性能并发 - 使用协程池实现高效并发扫描,支持大规模目标
- 多协议支持 - 全面支持HTTP/HTTPS、TCP、UDP协议
- 代理功能 - 支持HTTP/SOCKS5代理,可配置多个代理地址
- 批量扫描 - 支持从文件读取多个目标进行批量扫描
- 多格式输出 - 支持TXT/CSV/JSON等多种输出格式
- 自定义规则 - 灵活的指纹规则自定义功能
- 技术栈识别 - 内置Wappalyzer引擎,快速识别网站技术组件
- CEL表达式 - 使用强大的CEL表达式引擎进行规则匹配
- 实时输出 - 支持Unix domain socket实时结果输出
# 使用 go install 安装
go install github.com/yourusername/gxx@latest
# 或下载预编译版本
# 从 releases 页面下载对应平台的二进制文件
# 扫描单个目标
gxx -u https://example.com
# 从文件读取目标列表
gxx -f targets.txt
# 使用代理
gxx -u https://example.com --proxy http://127.0.0.1:8080
# 指定输出文件
gxx -u https://example.com -o results.txt
# 开启调试模式
gxx -u https://example.com --debug
# 禁用文件日志记录
gxx -u https://example.com --no-file-log
# 设置规则线程数提高性能
gxx -u https://example.com -rt 10000
-u, --url
:要扫描的目标URL/主机(可指定多个)-f, --file
:包含目标URL/主机列表的文件(每行一个)-t, --threads
:并发线程数(默认:10)-rt, --rulethreads
:指纹规则并发线程数(默认自动计算,最大:50000)
-o, --output
:输出文件路径--format
:输出文件格式(支持 txt/csv/json,默认:txt)--sock-output
:Unix domain socket输出路径(用于实时数据流)
--proxy
:HTTP/SOCKS5代理(支持逗号分隔的列表或文件输入)-p, --poc
:测试单个YAML文件-pf, --poc-file
:测试指定目录下的所有YAML文件--debug
:开启调试模式--no-file-log
:禁用文件日志记录,仅输出日志到控制台--timeout
:设置请求超时时间(秒,默认:5)
GXX提供了简单易用的API,便于集成到您的项目中。以下是主要API和使用示例:
import (
"gxx"
"gxx/types"
)
包含目标站点的基本信息,包括标题、服务器信息、状态码和技术栈等:
type BaseInfoType struct {
Target string // 目标URL
Title string // 网页标题
ServerInfo *ServerInfo // 服务器信息
StatusCode int32 // HTTP状态码
Response *http.Response // HTTP原始响应
Wappalyzer *TypeWappalyzer // 技术栈信息
}
服务器信息结构体:
type ServerInfo struct {
OriginalServer string // 原始Server头信息
ServerType string // 服务器类型
Version string // 版本信息
}
包含扫描结果的结构体:
type TargetResult struct {
URL string // 目标URL
StatusCode int32 // HTTP状态码
Title string // 网页标题
Server *ServerInfo // 服务器信息
Matches []*FingerMatch // 匹配的指纹信息
Wappalyzer *TypeWappalyzer // 技术栈信息
}
技术栈信息结构体:
type TypeWappalyzer struct {
WebServers []string // Web服务器
ReverseProxies []string // 反向代理
JavaScriptFrameworks []string // JS框架
JavaScriptLibraries []string // JS库
WebFrameworks []string // Web框架
ProgrammingLanguages []string // 编程语言
Caching []string // 缓存技术
Security []string // 安全组件
StaticSiteGenerator []string // 静态站点生成器
HostingPanels []string // 主机面板
Other []string // 其他杂项
}
// 创建默认配置选项
options, err := gxx.NewFingerOptions()
if err != nil {
// 错误处理
}
// 初始化指纹规则(仅需执行一次)
err = gxx.InitFingerRules(options)
if err != nil {
// 错误处理
}
// 扫描单个URL
target := "https://example.com"
proxy := "" // 如果需要代理,指定代理地址
timeout := 5 // 超时时间,单位:秒
workerCount := 10000 // 规则并发线程数,可设置较高的值提高识别速度,最大50000
// 执行指纹识别
result, err := gxx.FingerScan(target, proxy, timeout, workerCount)
if err != nil {
// 错误处理
}
// 获取所有匹配的指纹
matches := gxx.GetFingerMatches(result)
for _, match := range matches {
// 指纹ID: match.Finger.Id
// 指纹名称: match.Finger.Info.Name
// 匹配结果: match.Result
// 请求信息: match.Request
// 响应信息: match.Response
}
// 获取目标站点的基础信息
baseInfo, err := gxx.GetBaseInfo(target, proxy, timeout)
if err != nil {
// 错误处理
}
// 处理结果
fmt.Printf("标题: %s\n", baseInfo.Title)
fmt.Printf("状态码: %d\n", baseInfo.StatusCode)
if baseInfo.ServerInfo != nil {
fmt.Printf("服务器: %s\n", baseInfo.ServerInfo.ServerType)
}
if baseInfo.Wappalyzer != nil {
fmt.Printf("Web服务器: %v\n", baseInfo.Wappalyzer.WebServers)
fmt.Printf("编程语言: %v\n", baseInfo.Wappalyzer.ProgrammingLanguages)
}
// 单独进行技术栈识别,不执行指纹匹配
wappResult, err := gxx.WappalyzerScan(target, proxy, timeout)
if err != nil {
// 错误处理
}
// 处理技术栈分析结果
if len(wappResult.WebServers) > 0 {
fmt.Printf("Web服务器: %v\n", wappResult.WebServers)
}
if len(wappResult.ProgrammingLanguages) > 0 {
fmt.Printf("编程语言: %v\n", wappResult.ProgrammingLanguages)
}
if len(wappResult.JavaScriptFrameworks) > 0 {
fmt.Printf("JS框架: %v\n", wappResult.JavaScriptFrameworks)
}
package main
import (
"fmt"
"gxx"
"log"
)
func main() {
// 1. 创建配置选项
options, err := gxx.NewFingerOptions()
if err != nil {
log.Fatalf("创建选项错误: %v", err)
}
// 2. 初始化指纹规则库(仅需执行一次)
if err := gxx.InitFingerRules(options); err != nil {
log.Fatalf("初始化指纹规则错误: %v", err)
}
// 3. 处理单个URL
target := "https://example.com"
proxy := "" // 如果不需要代理,设为空字符串
timeout := 5 // 超时时间,单位:秒
workerCount := 10000 // 规则并发线程数,可设置较高的值提高识别速度
result, err := gxx.FingerScan(target, proxy, timeout, workerCount)
if err != nil {
log.Printf("处理URL错误: %v", err)
return
}
// 4. 输出基本信息
fmt.Printf("URL: %s\n", result.URL)
fmt.Printf("状态码: %d\n", result.StatusCode)
fmt.Printf("标题: %s\n", result.Title)
if result.Server != nil {
fmt.Printf("服务器: %s\n", result.Server.ServerType)
}
// 5. 处理匹配结果
matches := gxx.GetFingerMatches(result)
if len(matches) > 0 {
fmt.Println("\n匹配的指纹:")
for i, match := range matches {
fmt.Printf(" %d. %s (ID: %s, 匹配结果: %v)\n",
i+1, match.Finger.Info.Name, match.Finger.Id, match.Result)
}
} else {
fmt.Println("\n未匹配到任何指纹")
}
// 6. 获取技术栈信息
if result.Wappalyzer != nil {
fmt.Println("\n技术栈信息:")
if len(result.Wappalyzer.WebServers) > 0 {
fmt.Printf(" Web服务器: %v\n", result.Wappalyzer.WebServers)
}
if len(result.Wappalyzer.ProgrammingLanguages) > 0 {
fmt.Printf(" 编程语言: %v\n", result.Wappalyzer.ProgrammingLanguages)
}
if len(result.Wappalyzer.WebFrameworks) > 0 {
fmt.Printf(" Web框架: %v\n", result.Wappalyzer.WebFrameworks)
}
if len(result.Wappalyzer.JavaScriptFrameworks) > 0 {
fmt.Printf(" JS框架: %v\n", result.Wappalyzer.JavaScriptFrameworks)
}
}
}
查看 example 目录获取完整使用示例:
- 基本扫描:单目标扫描示例
- 代理扫描:使用代理进行扫描
- 文件目标扫描:批量扫描多个目标
- 百度API扫描:API集成示例
- Wappalyzer技术栈识别:网站技术栈识别
gxx/
├── cmd/ # 命令行应用程序入口点
├── pkg/ # 核心功能实现包
│ ├── finger/ # 指纹识别实现
│ ├── runner/ # 扫描运行器
│ ├── wappalyzer/ # Wappalyzer技术栈识别
│ └── cel/ # CEL表达式处理
├── types/ # 类型定义
├── utils/ # 工具和核心功能代码
│ ├── config/ # 配置管理
│ ├── logger/ # 日志管理
│ ├── common/ # 通用工具函数
│ ├── request/ # 请求处理
│ └── output/ # 结果输出处理
├── logs/ # 日志输出目录
├── example/ # 示例代码
├── docs/ # 文档目录
├── go.mod # Go模块定义
└── README.md # 项目说明文档
# 构建项目(不嵌入指纹库)
make build
# 构建项目(嵌入指纹库)
make build-embed
# 构建发布包(不嵌入指纹库)
make release
# 构建发布包(嵌入指纹库)
make release-embed
# 查看所有可用命令
make help
# 基本编译
CGO_ENABLED=0 GOARCH=arm64 GOOS=darwin go build -ldflags "-w -s" -o gxx main.go
# 使用构建脚本
chmod +x build.sh
./build.sh
goreleaser build --snapshot --clean --snapshot
GXX使用YAML格式定义指纹规则,规则设计简洁明了,易于理解与扩展。详细说明请参考:
id: web-application
info:
name: Web应用识别
author: 作者名
description: 识别特定Web应用
reference:
- https://example.com
created: 2025/04/01
rules:
r0:
request:
method: GET
path: /
expression: response.status == 200 && response.body.ibcontains(b"特征字符串")
expression: r0()
提示: 推荐使用ibcontains
函数进行大小写不敏感的关键词匹配,这能提高识别的准确性。
GXX专为高性能设计,主要特性包括:
┌─────────────────┐ ┌──────────────────┐
│ URL任务队列 │────│ 全局规则池 │
│ (默认5线程) │ │ (默认200线程) │
└─────────────────┘ └──────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌──────────────────┐
│ 缓存管理器 │ │ 内存监控器 │
│ (TTL+LRU) │ │ (智能GC) │
└─────────────────┘ └──────────────────┘
- 高效并发: 使用ants协程池管理并发,支持大规模目标扫描
- 智能缓存: TTL+LRU缓存机制,避免重复请求,提升响应速度
- 内存管理: 智能垃圾回收和内存监控,优化大规模扫描的内存使用
- 分级并发: URL级别和规则级别的双重并发控制,最大化性能
默认配置:
- URL工作池: 5个线程
- 规则工作池: 200个线程
- 最大规则线程: 5000个
- 缓存大小: 2048个条目
- 缓存TTL: 10分钟
扩展API:
// 获取性能统计
stats := gxx.GetPoolStats()
cacheStats := gxx.GetCacheStats()
// 内存管理
gxx.StartMemoryMonitor()
gxx.ForceGC()
欢迎为GXX贡献代码或指纹规则:
- 规则贡献:通过添加新的YAML格式指纹规则文件扩展指纹库
- 代码贡献:遵循项目代码结构进行功能开发
- 问题反馈:通过Issues提交问题或功能建议
- 文档改进:完善项目文档和使用示例
本工具仅用于授权的安全测试和研究目的。使用者应遵守相关法律法规,未经授权不得对目标系统进行扫描。工具作者不对任何滥用行为负责。