Skip to content

cyberspacesec/go-finger

Repository files navigation

GXX - 基于YAML规则的指纹识别引擎

GXX 是一款高性能指纹识别工具,基于 YAML 配置的 CEL 表达式规则进行目标系统识别。支持 HTTP/HTTPS、TCP、UDP 协议,可进行大规模批量目标扫描。

主要特性

  • YAML 规则引擎 - 基于 CEL 表达式的指纹匹配,规则简洁强大
  • 高性能并发 - ants 协程池 + 两级并发(URL 级 + 规则级),支持大规模目标
  • 多协议支持 - HTTP/HTTPS、TCP、UDP、Raw HTTP
  • 技术栈识别 - 内置 Wappalyzer 引擎识别网站技术组件
  • 多格式输出 - TXT / CSV / JSON,支持 Unix Domain Socket 实时推送
  • SDK 接口 - 独立 SDK 包,所有对外类型自包含,支持 context.Context
  • 内存优化 - CEL 环境单例 + Program 缓存 + 延迟格式化日志 + 对象池

快速开始

CLI 使用

# 扫描单个目标 gxx -u https://example.com # 从文件批量扫描 gxx -f targets.txt # 使用代理 gxx -u https://example.com --proxy http://127.0.0.1:8080 # 输出为 CSV(格式由扩展名自动识别) gxx -u https://example.com -o results.csv # JSON 输出 gxx -u https://example.com -o results.json --json # 调试模式 gxx -u https://example.com --debug # 设置规则并发线程数 gxx -u https://example.com -rt 500

SDK 使用

package main import ( "context" "fmt" "gxx/sdk" "log" ) func main() { ctx := context.Background() // 1. 初始化指纹规则 options, _ := sdk.NewFingerOptions() if err := sdk.InitFingerRules(options); err != nil { log.Fatal(err) } // 2. 执行指纹识别 result, err := sdk.FingerScan(ctx, "https://example.com", "", 10) if err != nil { log.Fatal(err) } // 3. 读取结果 fmt.Printf("URL: %s 状态码: %d 标题: %s\n", result.URL, result.StatusCode, result.Title) for _, m := range result.Matches { fmt.Printf(" - %s (%s)\n", m.Info.Name, m.Info.ID) } }

详细 SDK 文档参见 sdk/sdk.md

命令行参数

输入选项

参数 说明
-u, --url 目标 URL/主机(可指定多个)
-f, --file 目标列表文件(每行一个)
-t, --threads URL 并发线程数(默认 5)
-rt, --rulethreads 规则并发线程数(默认 200,最大 5000)

输出选项

参数 说明
-o, --output 输出文件路径(txt/csv/json)
--json JSON 格式输出
--sock Unix Domain Socket 实时输出路径

调试选项

参数 说明
--proxy HTTP/SOCKS5 代理
-p 测试单个 YAML 文件
-pf 测试指定目录的 YAML 文件
--debug 开启调试模式
--no-file-log 禁用文件日志
--timeout 请求超时(秒,默认 3)

项目结构

gxx/ ├── cmd/ # CLI 入口 │ ├── main.go # 主程序 │ └── cli/ # 命令行处理 ├── sdk/ # SDK 对外接口(所有对外类型均在此定义) │ ├── sdk.go # 业务 API │ ├── sdk.md # SDK 文档 │ └── debug/ # 运维/调试 API(内存监控、GC等) ├── pkg/ # 核心引擎 │ ├── cel/ # CEL 表达式引擎(全局环境单例 + Program 缓存) │ ├── finger/ # 指纹规则解析与执行 │ ├── runner/ # 扫描调度器(工作池、缓存、监控) │ ├── network/ # 网络请求层(HTTP/TCP/UDP) │ └── wappalyzer/ # Wappalyzer 技术栈识别 ├── types/ # 公共类型定义 ├── utils/ # 基础设施 │ ├── logger/ # 日志系统(延迟格式化,高并发友好) │ ├── output/ # 多格式输出 │ ├── common/ # 通用工具 │ ├── config/ # 配置管理 │ └── proto/ # Protobuf 协议定义 ├── fingerYaml/ # 内置指纹规则库(embed) └── example/ # 示例代码 ├── basic_scan/ # 基本扫描 ├── api_scan_baidu/ # API 调用示例 ├── file_target_scan/ # 文件批量扫描 ├── proxy_scan/ # 代理扫描 └── wappalyzer_scan/ # 技术栈识别 

执行流程

目标输入 → 存活探测(GET /) → 基础信息提取 → 缓存预热 → 规则并发匹配 → 结果输出 │ │ 标题/证书/ICP/Wappalyzer CEL表达式评估 (2348条规则×200并发) 
  1. 存活探测:对目标发起 GET / 请求,获取标题、证书、服务器信息、ICP 备案号、Wappalyzer 技术栈
  2. 缓存预热:将基础响应写入缓存,后续规则匹配时直接复用(TTL + LRU 驱逐)
  3. 规则匹配:2348 条指纹规则通过全局规则池(200 并发)并行执行 CEL 表达式评估
  4. 结果输出:匹配结果实时输出到控制台 + 文件 + Socket

性能优化

优化项 效果
CEL 基础环境单例 + Extend() 派生 消除每条规则创建 cel.NewEnv() 的重量级开销
CEL Program 缓存 (sync.Map) 相同表达式零重复编译
延迟格式化日志 (logger.Debug(format, args...)) 非 Debug 模式下零字符串分配
SetVariableMap 跳过 proto 对象 消除 64% 的 protobuf 序列化分配 (9.3GB → 0)
HTTP 客户端池化 相同配置复用客户端实例
Wappalyzer 全局单例 启动时加载一次,全程共享
指纹快照版本号缓存 扫描期间只复制一次指纹列表
内存监控频率调优 ReadMemStats 从 5s 降到 15s,减少 STW

实测数据(16 目标 x 2348 规则)

指标
总分配 11.8 GB
峰值堆 539 MB
最终残留 147 MB
GC CPU 3%
扫描耗时 20s
零 goroutine 泄漏 race detector 验证通过

指纹规则格式

id: web-application info: name: Web应用识别 author: 作者名 description: 识别特定Web应用 rules: r0: request: method: GET path: / expression: response.status == 200 && response.body.ibcontains(b"特征字符串") expression: r0()

详细规则语法参考 docs/指纹规则格式说明.md

编译构建

# Makefile 构建 make build # 基本构建 make build-embed # 嵌入指纹库 make release # 构建发布包 # 手动编译 CGO_ENABLED=0 go build -ldflags "-w -s" -o gxx cmd/main.go # 构建脚本 chmod +x build.sh && ./build.sh

示例代码

示例 说明
basic_scan 基本单目标扫描
api_scan_baidu API 集成示例
file_target_scan 文件批量扫描
proxy_scan 代理扫描
wappalyzer_scan 技术栈识别

免责声明

本工具仅用于授权的安全测试和研究目的。使用者应遵守相关法律法规,未经授权不得对目标系统进行扫描。工具作者不对任何滥用行为负责。

许可证

MIT License

About

GXX是一款强大的指纹识别工具,基于YAML配置的规则进行目标系统识别。 本工具支持多种协议(HTTP/HTTPS、TCP、UDP),可进行高效的批量目标扫描和精准识别。

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages