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服务, 代理, 元数据, 反向代理, 安全检测, 安全编程, 客户端加密, 指纹, 指纹识别, 无文件攻击, 日志审计, 服务端, 机器人检测, 流量抓取, 网络命名空间, 网络指纹, 自签名证书, 证书, 连接元数据, 防御工具