Egyan07/ViperFin

GitHub: Egyan07/ViperFin

基于Go语言实现的JA3/JA3S TLS指纹识别工具,通过解析ClientHello消息识别TLS客户端类型,内置恶意软件C2和渗透工具签名库,无外部依赖。

Stars: 1 | Forks: 0

# ViperFin — TLS 指纹识别工具 ViperFin 是一个用 Go 编写的 JA3/JA3S TLS 指纹识别工具。通过分析原始 ClientHello 消息来识别建立 TLS 连接的软件——无需机器学习(ML),无需 API,纯粹的协议分析。 被威胁情报平台(Salesforce、Cloudflare、Fastly)用于防御,以检测恶意软件 C2 通道。也被用于进攻性安全,以识别服务器期望客户端使用的 TLS 协议栈。 ## JA3 工作原理 每个 TLS 连接都以 **ClientHello** 消息开始。在任何加密发生之前,客户端会声明: - 它支持哪个 **TLS 版本** - 它可以使用哪些 **密码套件**(按优先级排序) - 它想要使用哪些 **扩展** - 它支持哪些 **椭圆曲线** - 它支持哪些 **EC 点格式** 不同的客户端会产生不同的组合。Chrome、Firefox、curl、Python requests 和 Cobalt Strike 都会生成截然不同的 ClientHello 消息——即使它们连接的是同一个服务器。 **JA3** 提取这五个字段,将它们连接成逗号分隔的字符串,并对结果进行 MD5 哈希: ``` SSLVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats 769,47-53-5-10-49161,0-10-11,23-24,0 → MD5 → a0e9f5d64349fb13191bc781f81f42e1 ``` GREASE 值(RFC 8701 —— 浏览器插入的随机值,用于防止协议僵化)在哈希之前被排除。 **JA3S** 是服务器端的等效项——对 ServerHello 响应进行指纹识别。JA3 + JA3S 的组合不仅能识别连接的客户端,还能识别使用的服务器基础设施(这对 C2 检测很有用)。 ## 安装 要求:Go 1.21+ ``` git clone cd viperfin chmod +x build.sh ./build.sh ``` 或者直接: ``` go build -o viperfin . ``` 无外部依赖——仅使用 Go 标准库。 ## Windows 快速入门(从 Kali 交叉编译后) 当你在 Kali 上编译好 `viperfin.exe` 并传输到 Windows 后: ### 步骤 1 — 打开命令提示符 按 `Win + R`,输入 `cmd`,按回车。 ### 步骤 2 — 导航到文件夹 ``` cd "C:\My Projects\Projects\ViperFin" ``` ### 步骤 3 — 对任何网站运行它 ``` viperfin.exe client google.com:443 ``` 只需将 `google.com` 替换为你想要检查的任何网站: ``` viperfin.exe client facebook.com:443 viperfin.exe client github.com:443 viperfin.exe client yourbank.com:443 ``` 末尾的 `:443` 对于普通网站来说总是相同的——它意味着“使用安全的 HTTPS 连接”。你不需要更改它。 ### 输出内容的含义 | 部分 | 含义 | |---|---| | **TLS Version** | 网站使用的安全协议——TLS 1.3 是最新且最安全的 | | **Cert Subject** | 安全证书所属的域 | | **Cert Issuer** | 谁颁发了安全证书(例如 Google, DigiCert) | | **Cert Expiry** | 证书何时过期——绿色表示正常,红色表示即将过期 | | **JA3 Hash** | *你*的连接的唯一指纹——就像你计算机连接方式的数字 ID | | **JA3S Hash** | *服务器*响应的唯一指纹 | | **Threat Intelligence** | 检查是否有指纹与已知的恶意软件或黑客工具匹配 | ### 需要注意什么 - ✅ `TLS 1.3` —— 良好,现代且安全 - ✅ Cert Expiry 显示为绿色 —— 证书有效 - ⚠️ Cert Expiry 显示为红色 —— 证书即将过期或已过期 - 🚨 Threat Intelligence 显示匹配 —— 连接指纹与已知的恶意软件或黑客工具匹配 ## 用法 ### 客户端模式 连接到 TLS 服务器并对自己进行指纹识别: ``` # 基本 ./viperfin client google.com:443 # Verbose — 显示所有 cipher suites、extensions、curves ./viperfin client example.com:443 --verbose # JSON 输出(支持 pipe) ./viperfin client 10.0.0.1:8443 --json # Non-standard port,跳过 cert verify ./viperfin client internal.corp:8443 --insecure ``` **它显示的内容:** - 你的 JA3 哈希(你在服务器眼中的样子) - 服务器的 JA3S 哈希 - 协商的 TLS 版本和密码套件 - 服务器证书详情 + 到期倒计时 - 来自本地数据库的威胁情报匹配 ### 服务器模式 监听传入的 TLS 连接并对每个客户端进行指纹识别: ``` # 在默认端口 4443 启动 ./viperfin server # 自定义端口 ./viperfin server --port 8443 # JSON 输出(用于 pipe 到日志文件) ./viperfin server --port 4443 --json >> fingerprints.jsonl ``` 然后从另一个终端连接进行测试: ``` curl -k https://localhost:4443 # will show curl's JA3 python3 -c "import urllib.request; urllib.request.urlopen('https://localhost:4443')" openssl s_client -connect localhost:4443 ``` **使用场景:** 在你控制的服务器上设置此模式。任何连接的客户端都会被指纹识别。适用于: - 红队:了解你的工具在防御者眼中的样子 - 蓝队:识别网络上的意外客户端 - 研究:从生产流量中收集 JA3 哈希 ### 查询模式 查询本地签名数据库: ``` # 查询特定 hash ./viperfin lookup 6bea65232d17d4884c427918d6c3abf0 # 列出所有 signatures ./viperfin lookup --list # 按 threat level 过滤 ./viperfin lookup --list --threat malicious ./viperfin lookup --list --threat suspicious ``` ## 签名数据库 本地数据库(`db/ja3_signatures.json`)包含已知的 JA3 哈希,涵盖: | 类别 | 示例 | |---|---| | 浏览器 | Chrome, Firefox, Safari, Tor Browser | | 工具 | curl, wget, Python requests, OpenSSL, Go net/http | | 渗透测试 | Metasploit, Nmap | | 恶意软件 C2 | Cobalt Strike, Sliver, Emotet, TrickBot, Dridex, QakBot, Brute Ratel | | 扫描器 | Masscan, Shodan | ### 扩展数据库 编辑 `db/ja3_signatures.json` 并添加条目: ``` { "hash": "your_md5_hash_here", "label": "Descriptive name", "category": "browser|tool|scanner|pentest_tool|malware_c2", "threat_level": "benign|info|suspicious|malicious", "notes": "Context about this fingerprint" } ``` 社区数据库: - https://ja3er.com —— 众包 JA3 数据库 - https://github.com/salesforce/ja3 —— 原始 JA3 实现 + 数据库 ## TLS 内部原理参考 ### ClientHello 结构(我们要解析的内容) ``` TLS Record Header (5 bytes) ├── Content Type: 0x16 (Handshake) ├── Legacy Version: 0x0303 (TLS 1.2, even for TLS 1.3) └── Length: 2 bytes Handshake Header (4 bytes) ├── Type: 0x01 (ClientHello) └── Length: 3 bytes ClientHello Body ├── Client Version: 2 bytes ← JA3 field 1 ├── Random: 32 bytes ├── Session ID: variable ├── Cipher Suites: variable ← JA3 field 2 ├── Compression Methods: variable └── Extensions: variable ├── server_name (0) → extracts SNI hostname ├── supported_groups (10) ← JA3 field 4 (elliptic curves) ├── ec_point_formats (11) ← JA3 field 5 ├── signature_algorithms (13) ├── supported_versions (43) → actual TLS version for TLS 1.3 └── ... (all type IDs form JA3 field 3) ``` ### 为什么排除 GREASE RFC 8701 定义了一组“GREASE”值(0x0A0A, 0x1A1A, ..., 0xFAFA),浏览器会随机将它们插入密码套件列表和扩展列表中。其目的是确保 TLS 实现不会在看到未知值时崩溃。 由于 GREASE 值(按设计)每次连接都会更改,它们会使浏览器的 JA3 指纹变得不确定。JA3 将它们过滤掉,以便同一浏览器在不同连接中产生相同的哈希值。 ## 项目结构 ``` viperfin/ ├── main.go # CLI entry point ├── go.mod # Module definition (stdlib only) ├── build.sh # Cross-compile script ├── cmd/ │ ├── client.go # `viperfin client` subcommand │ ├── server.go # `viperfin server` subcommand │ └── lookup.go # `viperfin lookup` subcommand ├── tls/ │ ├── ja3.go # JA3/JA3S hash computation + cipher/extension names │ ├── parser.go # Raw ClientHello/ServerHello byte parser │ ├── capture.go # Client mode — captureConn wrapper │ └── server.go # Server mode — listener + self-signed cert generation ├── db/ │ ├── signatures.go # Database loader (embedded JSON, Go embed) │ └── ja3_signatures.json # Known JA3 hashes └── report/ └── output.go # Terminal formatting + JSON output ``` ## 扩展此工具 基于此构建的想法: - **PCAP 模式:** 使用 `gopacket` 离线解析 `.pcap` 文件——从捕获的流量中提取 JA3,无需实时连接 - **持续监控:** 运行服务器模式 + 将 JSON 管道传输到文件,构建一个读取 JSONL 文件的简单仪表板 - **JA3 数据库同步:** 从 ja3er.com API 拉取最新哈希并合并到本地数据库 - **代理模式:** MITM 代理,对通过它的每个 HTTPS 连接进行指纹识别——用于分析应用程序流量 ## 参考资料 - JA3 原始论文:https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967 - RFC 8701 (GREASE):https://www.rfc-editor.org/rfc/rfc8701 - TLS 1.3 规范:https://www.rfc-editor.org/rfc/rfc8446 - Wireshark TLS 解析器(用于对比):https://wiki.wireshark.org/TLS
标签:C2 检测, ClientHello, Cobalt Strike, Emotet, EVTX分析, Go, IP 地址批量处理, JA3, MD5, Ruby工具, Sliver, SSL/TLS, TLS 指纹识别, 二进制发布, 协议分析, 多架构支持, 威胁情报, 开发者工具, 开源工具, 扫描器识别, 指纹, 指纹库, 攻击诱捕, 日志审计, 权限提升, 混合加密, 系统分析, 网络分析, 网络安全, 蓝队防御, 隐私保护