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 指纹识别, 二进制发布, 协议分析, 多架构支持, 威胁情报, 开发者工具, 开源工具, 扫描器识别, 指纹, 指纹库, 攻击诱捕, 日志审计, 权限提升, 混合加密, 系统分析, 网络分析, 网络安全, 蓝队防御, 隐私保护