copyleftdev/plumbum
GitHub: copyleftdev/plumbum
一款确定性、可解释的 DNS TXT 隧道检测工具,通过六个可检查特征对 PCAP 和 Zeek 日志进行复合异常评分。
Stars: 1 | Forks: 0
# Plumbum
**确定性 DNS TXT 隧道检测。**
它不猜测。它计算。\
它不警报。它解释。
[](https://www.rust-lang.org)
[](LICENSE)
[](#install)
[](#architecture)
Plumbum 根据 PCAP 和 Zeek dns.log 文件计算复合异常分数,将结果持久化存储在 SQLite 中,并为每个发现生成完全可分解的解释。无机器学习。无黑盒。每个分数都是六个可检查特征的确定性函数。
## 安装
```
cargo build --release
```
在 `target/release/` 中生成两个二进制文件:
| 二进制文件 | 用途 |
|---|---|
| `plumbum` | 用于分析、评分和导出的 CLI |
| `plumbum-mcp` | 基于 stdio JSON-RPC 的 MCP server |
## 快速开始
```
plumbum init # create .plumbum/ working directory
plumbum validate capture.pcap # check file structure
plumbum plan capture.pcap # dry-run: preview scope
plumbum apply capture.pcap --c2-domains evil.tk # full analysis
plumbum show evil.tk # inspect a domain
plumbum explain evil.tk # score decomposition
plumbum export --format json # export findings
plumbum dashboard # interactive TUI
plumbum stream -i eth0 # live capture + scoring
```
示例输出
```
Plumbum Findings:
CRITICAL 94.4 evil.tk
Artifacts written to .plumbum/plumbum.db (run #1)
Summary: 1 domains scored, 1 CRITICAL, 0 HIGH, 0 MEDIUM
```
```
Domain: evil.tk
Score: 94.4 (CRITICAL)
Components:
entropy norm=0.000 w=0.1500 contrib=0.000 ( 0.0%)
periodicity norm=1.000 w=0.1000 contrib=0.100 ( 3.7%)
volume norm=1.000 w=0.2500 contrib=0.250 ( 9.3%)
length norm=1.000 w=0.1000 contrib=0.100 ( 3.7%)
client_rarity norm=1.000 w=1.8000 contrib=1.800 (66.7%)
subdomain_diversity norm=1.000 w=0.3000 contrib=0.300 (11.1%)
```
## 命令
| 命令 | 描述 |
|---|---|
| `init` | 创建包含配置和数据库的 `.plumbum/` 目录 |
| `validate` | 解析输入并报告记录计数 |
| `plan` | 显示将要分析内容的试运行 |
| `apply` | 完整分析:解析、提取、评分、持久化 |
| `show` | 显示域名的分数和原始特征 |
| `explain` | 详细的分数分解及每个特征的贡献 |
| `export` | 导出为 JSON、CSV 或 Sigma rule |
| `dashboard` | 交互式 TUI 仪表板 |
| `stream` | 从网络接口实时捕获 DNS 并实时评分 |
| `version` | 打印版本 |
## 评分模型
Plumbum 在 **六个归一化特征** 上使用加权线性模型:
| 特征 | 信号 | 范围 |
|---|---|---|
| **Entropy** | TXT 内容的 Shannon 熵 | 0 = 低, 1 = 高 |
| **Periodicity** | 查询时间的规律性 | 0 = 不规则, 1 = 像时钟一样精准 |
| **Volume** | 每个父域的查询计数 | 0 = 安静, 1 = 语料库中最活跃 |
| **Length** | 平均 TXT 响应长度 | 0 = 短, 1 = 语料库中最长 |
| **Client Rarity** | 唯一源 IP 的倒数 | 1 = 单个主机 (最可疑) |
| **Subdomain Diversity** | 每个父域的唯一子域 | 0 = 少, 1 = 语料库中最多 |
### 权重预设
| 预设 | 描述 |
|---|---|
| `default` | 均衡的近似等权重 |
| `optimized` | 通过模拟退火在标记数据上调优 |
| `regularized` | 基于模拟退火并强制特征多样性 **(默认)** |
### 严重性阈值
| 严重性 | 分数 |
|---|---|
| **CRITICAL** | ≥ 80 |
| **HIGH** | ≥ 60 |
| **MEDIUM** | ≥ 40 |
| **LOW** | < 40 |
## 支持的格式
| 格式 | 详情 |
|---|---|
| **PCAP** | 经典 libpcap — 支持两种字节序、微秒/纳秒时间戳 |
| **pcapng** | SHB / IDB / EPB 块 |
| **Zeek dns.log** | 带有标准 `#fields` 头的制表符分隔文件 |
| **Link layers** | Ethernet (类型 1), Linux SLL (类型 113) |
## 配置
`plumbum init` 生成 `.plumbum/config.hcl`:
```
analysis {
weight_preset = "regularized"
entropy_weight = 0.15
periodicity_weight = 0.10
volume_weight = 0.25
length_weight = 0.10
client_rarity_weight = 1.80
subdomain_diversity_weight = 0.30
}
thresholds {
critical = 80
high = 60
medium = 40
}
```
## MCP 服务器
Plumbum 通过 [Model Context Protocol](https://modelcontextprotocol.io) 经 stdio JSON-RPC 暴露分析结果:
```
plumbum-mcp
```
| 类型 | 端点 | 描述 |
|---|---|---|
| Resource | `plumbum://domains` | 最近一次运行的已评分域名 |
| Resource | `plumbum://status` | 分析状态和运行摘要 |
| Tool | `plumbum_explain` | 域名的分数分解 |
| Tool | `plumbum_query` | 使用过滤器查询已评分域名 |
## 架构
```
┌─────────────────────────────────────────────────────────┐
│ plumbum-cli │
│ init validate plan apply stream │
│ show explain export dashboard │
├────────────┬────────────┬───────────────┬───────────────┤
│plumbum-tui │plumbum-mcp │plumbum-config │plumbum-stream │
│ ratatui │ stdio rpc │ HCL parser │ live capture │
├────────────┴────────────┴───────────────┴───────────────┤
│ plumbum-store │ plumbum-score │
│ SQLite · WAL · batch ingest │ weights │
│ schema · queries · artifacts │ normalize │
│ │ composite │
│ │ explain │
├─────────────────────────────────────────┴───────────────┤
│ plumbum-core │
│ dns types · features · pcap · zeek │
└─────────────────────────────────────────────────────────┘
```
| Crate | 角色 |
|---|---|
| [`plumbum-core`](plumbum-core/) | DNS 类型、PCAP/pcapng + Zeek 解析器、特征提取 |
| [`plumbum-score`](plumbum-score/) | 复合评分、权重预设、归一化、解释 |
| [`plumbum-store`](plumbum-store/) | SQLite schema、批量写入、预处理查询、导出产物 |
| [`plumbum-config`](plumbum-config/) | HCL 配置解析器、类型、默认值 |
| [`plumbum-cli`](plumbum-cli/) | CLI 二进制文件 (`plumbum`) |
| [`plumbum-tui`](plumbum-tui/) | 基于 ratatui 的交互式仪表板 |
| [`plumbum-mcp`](plumbum-mcp/) | MCP server 二进制文件 (`plumbum-mcp`) |
| [`plumbum-stream`](plumbum-stream/) | 实时网络捕获、滑动窗口累加器、实时评分 |
## 实时流
直接从网络接口捕获 DNS 流量并实时对域名进行评分:
```
# 从 eth0 流式捕获,60s 窗口,分数 >= 40 时报警
sudo plumbum stream -i eth0 --window 60 --threshold 40
# 列出可用接口
plumbum stream --list-interfaces
# Pipe to jq 进行过滤
sudo plumbum stream -i any | jq 'select(.severity == "CRITICAL")'
```
输出为换行符分隔的 JSON —— 每个窗口每个域名一条警报:
```
{"domain":"evil.tk","score":94.4,"severity":"CRITICAL","query_count":1847,"client_count":1,"subdomain_count":1234,"mean_entropy":4.21,"cv":1.80,"mean_txt_length":189.0,"window_secs":60.0,"is_c2":true}
```
## 许可证
本项目采用 [MIT License](LICENSE) 授权。
标签:AMSI绕过, C2 检测, DNS 安全, DNS 隧道检测, HTTP工具, IP 地址批量处理, PCAP 分析, Rust, SQLite, Zeek 日志, 协议分析, 可视化界面, 可解释安全, 威胁检测, 异常评分, 权限提升, 白盒检测, 确定性检测, 网络安全, 网络流量审计, 通知系统, 隐私保护