robalb/ebpf-web-fingerprint
GitHub: robalb/ebpf-web-fingerprint
一个基于 eBPF 的高性能 TCP/TLS 指纹识别库与 Web 服务器,解决在 Go 服务中低开销获取客户端握手元数据的问题。
Stars: 97 | Forks: 7
# eBPF 网页指纹识别
一个基于 eBPF 的高性能 TCP & TLS 指纹识别网络服务器与库。
请参阅[这篇文章](https://halb.it/posts/ebpf-fingerprinting-1/)
以了解该主题的高级介绍。
本项目提供两种使用模式:
- [独立演示网络服务器](#run-the-demo-webserver)
一个简单的网络服务器,能够回显访问者的 TCP 和 TLS 握手详细信息。
它可用于尝试指纹识别检测与规避技术,
或作为如何使用指纹识别库的参考。
- [Golang 指纹识别库](#using-the-fingerprint-library)
一个可嵌入现有 Golang 网络服务器或反向代理中的可复用库。
它暴露底层客户端连接元数据,从而实现高级指纹识别和机器人检测策略。
## 运行演示网络服务器
要在独立网络命名空间中构建并运行网络服务器:
```
# 创建一个专用的网络命名空间
make testns_setup
# 在专用命名空间中编译并运行测试服务器
make testns_run
```
服务器将在以下地址均可访问:
- `http://10.200.1.2:8080/test/id` (IPv4)
- `http://[fd00:a1b:200::2]:8080/test/id` (IPv6)
请注意,构建过程目前需要系统中安装 `go`、`Make`、`Clang` 和 `LLVM`。
在 Ubuntu/Debian 系统上,您可以通过以下命令安装所有依赖:
```
sudo apt install clang-18 llvm-18
```
其他 Linux 发行版用户可以向你最喜欢的 LLM 寻求帮助以完成安装。
## 以 TLS 模式运行演示服务器
首先,必须为 IP 地址 `10.200.1.2` 生成一个有效的自签名证书:
```
openssl req -x509 -nodes -days 730 -newkey rsa:2048 -keyout key.pem -out cert.pem -config san.cnf
```
然后,使用 TLS 启用运行演示服务器:
```
TLS=true make testns_run
```
服务器将在以下地址可访问:
```
curl https://10.200.1.2:8080/test/id --insecure
curl https://[fd00:a1b:200::2]:8080/test/id --insecure
```
若要使用特定的 TLS 版本:
```
curl https://10.200.1.2:8080/test/id --insecure --tlsv1.1 --tls-max 1.1
```
该项目在 `test/` 文件夹中包含一些测试代理作为子模块。
它们可用于在 TLS 和 TCP 分片场景下测试系统行为。
若要使用特定 TLS 版本和测试代理,首先启动代理,然后运行:
```
curl https://10.200.1.2:8080/test/id --insecure --tlsv1.1 --tls-max 1.1 --proxy localhost:4433
```
## 其他演示服务器配置
演示服务器通过环境变量接收配置。
例如,以下是如何在启用 TLS 并监听 443 端口的情况下运行演示服务器:
```
TLS=true DST_PORT=443 make testns_run
```
这是您可以使用的完整环境变量列表及其默认值:
| 变量名 | 默认值 | 描述 |
| ------ | ------ | ---- |
| `IFACE` | `veth-ns` | 服务器监听的网络接口。必须存在并已分配配置的 `DST_IP`。 |
| `DST_IP` | `10.200.1.2` | 服务器在选定接口上监听的目标 IP 地址。 |
| `DST_PORT` | `8080` | 服务器监听的 TCP 端口。当 `CERTMAGIC=true` 时,**不能** 为 `80`。 |
| `TLS` | `false` | 启用 TLS 模式和 TLS 指纹识别。选项:`"true"` 或 `"false"`。 |
| `CERTMAGIC` | `false` | 启用通过 Certmagic 自动管理 TLS 证书。选项:`"true"` 或 `"false"`。启用后,`TLS_CERT` 和 `TLS_KEY` 将被忽略。 |
| `CERTMAGIC_PATH` | `./acme` | Certmagic 存储证书、账户信息和元数据的文件系统路径。服务器必须对此路径可写。 |
| `CERTMAGIC_DOMAINS` | `example.com,www.example.com` | Certmagic 将自动获取和管理 TLS 证书的域名列表,以逗号分隔。 |
| `TLS_CERT` | `cert.pem` | TLS 证书文件路径。仅在 `TLS="true"` 且 `CERTMAGIC="false"` 时使用。 |
| `TLS_KEY` | `key.pem` | TLS 私钥文件路径。仅在 `TLS="true"` 且 `CERTMAGIC="false"` 时使用。 |
## 使用指纹识别库
如果您有兴趣将基于 eBPF 的指纹识别能力添加到网络服务器中,
那么您极大概率**不**需要一个会自动启动网络服务器的高层级且主观意见化的 API。
因此,该库未提供以下这类高级函数:
```
startFingerprintWebServer(":80", handlers)
```
相反,指纹识别库提供功能以挂载到现有的 Golang 网络服务器,
为您已有的功能增强 TCP 和(可选)TLS 握手数据。
考虑到该项目的规模有限且实现简单,
将其放入 vendor 目录或甚至在您的项目中重新实现可能是更好的选择。
本项目的 MIT 许可证允许这样做。
因此,使用该库的良好起点是启动演示服务器并进行实验。
请参阅[演示服务器](#run-the-demo-webserver)章节。
然后,您可以阅读代码以熟悉高级概念。
## 目标
请注意,该项目的主要目标是让
原始握手数据能够以尽可能低的开销
从常规 Golang 网络服务器中轻松获取。
特定指纹识别标准或技术的实现不在项目范围内。
最终用户应能根据其项目需求自由实现他们想要的系统。
标签:Bot检测, C2日志可视化, clang, Docker镜像, ebpf, ebpf指纹, Go, Golang, HTTP服务器, llvm, make, Ruby工具, SEO, ssl, TCP, TLS, URL发现, Web服务, 代理, 元数据, 反向代理, 安全检测, 安全编程, 客户端加密, 指纹, 指纹识别, 无文件攻击, 日志审计, 服务端, 机器人检测, 流量抓取, 网络命名空间, 网络指纹, 自签名证书, 证书, 连接元数据, 防御工具