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