copyleftdev/plumbum

GitHub: copyleftdev/plumbum

一款确定性、可解释的 DNS TXT 隧道检测工具,通过六个可检查特征对 PCAP 和 Zeek 日志进行复合异常评分。

Stars: 1 | Forks: 0

# Plumbum **确定性 DNS TXT 隧道检测。** 它不猜测。它计算。\ 它不警报。它解释。 [![Rust](https://img.shields.io/badge/rust-1.70%2B-orange?logo=rust&logoColor=white)](https://www.rust-lang.org) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Build](https://img.shields.io/badge/build-passing-brightgreen)](#install) [![Crates](https://img.shields.io/badge/crates-8-8B5CF6)](#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 日志, 协议分析, 可视化界面, 可解释安全, 威胁检测, 异常评分, 权限提升, 白盒检测, 确定性检测, 网络安全, 网络流量审计, 通知系统, 隐私保护