byevincent/ShareSift

GitHub: byevincent/ShareSift

ShareSift 是一款利用机器学习两阶段分类器在 SMB 共享中高效发现凭据与机密文件的安全评估工具,旨在替代 Snaffler 并大幅提升召回率。

Stars: 8 | Forks: 1

# ShareSift [![tests](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/9df584633a171555.svg)](https://github.com/byevincent/ShareSift/actions/workflows/test.yml) [![python](https://img.shields.io/badge/python-3.10--3.12-blue)](pyproject.toml) [![license](https://img.shields.io/badge/license-Apache--2.0-green)](LICENSE) ML 增强型 SMB 共享猎手。Snaffler 的继任者,采用两阶段分类器 pipeline。 ShareSift 根据文件包含凭据或机密的可能性,对 SMB 共享上的文件进行排名。阶段 1 在每个路径上运行 LightGBM 路径分类器。阶段 2 在标记的文件上运行 Qwen3 1.7B LoRA 内容分类器进行确认。可以单独运行阶段 1,也可以同时运行两个阶段。 ## 为什么开发它 Snaffler 能捕获像 `id_rsa`、`NTDS.dit` 和 `.kdbx` 这样的明显模式。但它会漏掉长尾部分。共享上的自定义脚本、不寻常文件名中的机密,以及具有非传统名称的密码目录,都会成为漏网之鱼。 ShareSift 在此基础上增加了一层 ML。在 Snaffler 盲测基准测试中,该路径分类器在召回率上比 Snaffler 高出 29.3 个百分点。而内容分类器在参数量仅为四分之一的情况下,几乎弥合了与 Biringa 和 Kul 2025 之间的差距。 ## 性能 ### 在真实企业共享内容上的正面对比 v0.51 发布了一个包含 2525 个文件的 Windows NTFS 语料库,该语料库通过 Stauffer 的 [DiskForge](https://github.com/jknyght9/diskforge) 构建 — 涵盖 16 个类别的 75 个具有合成性但格式真实的凭据文件, 并与 2420 个企业共享干扰文件(HR 政策、财务 报告、营销资产、供应商 PDF、软件安装介质、 日志归档、项目源代码、公共模板)+ 20 个精度 压力测试文件名(`password_policy.docx`、`secrets_management_guidelines.pdf` 等)+ 30 个 windows10 OS 模板存根混合在一起。 相同的路径,相同的真实标记,两套 pipeline 并行测试: | 工具 | 保留策略 | P | R | F1 | 捕获 | 漏报 | FPs | |---|---|---:|---:|---:|---:|---:|---:| | 上游 Snaffler | Yellow+ | 0.800 | 0.213 | 0.337 | 16 | 59 | 4 | | 上游 Snaffler | Red+ | 0.800 | 0.213 | 0.337 | 16 | 59 | 4 | | **ShareSift v0.51** | Yellow+ | 0.158 | **0.840** | 0.266 | 63 | 12 | 336 | | **ShareSift v0.51** | **Red+** | **0.466** | **0.720** | **0.565** | **54** | **21** | **62** | | ShareSift v0.51 | Black-only | 0.833 | 0.333 | 0.476 | 25 | 50 | 5 | **在 Red+ 级别 —— 即操作员分拣策略:** ShareSift 捕获的 **凭据比 Snaffler 多 3.4 倍**(75 个中的 54 个对比 16 个), **F1 为 0.565 对比 0.337**。 权衡是真实存在的:ShareSift 会出现更多的误报 (62 对比 4),因为路径分类器在 Yellow 层级对 二进制扩展名干扰文件(`.msi` / `.iso` / `.psd`)的处理非常激进。如果你只 想要确定的发现,请运行 Black-only —— 精确率会上升 到 0.833。如果你不想让 59 个真实的凭据被默默漏掉, 请运行 Red+。选择权在你手中。 完整的分类别细分(16 个类别中有哪 12 个达到了 100% 的阶段 1 召回率,哪 4 个需要内容扫描或 v0.52 规则) 位于 [docs/diskforge_winshare_v1_results.md](docs/diskforge_winshare_v1_results.md)。 ### 严格召回率基准测试 | 基准测试 | 指标 | ShareSift v0.51 | |---|---|---:| | Metasploitable 3 (Windows AD, 40 creds) | Recall | **100% (40/40)** | | Metasploitable 2 (Linux server, 34 creds) | Recall | **100% (34/34)** | | DiskForge Win10 forensic (13 plants) | Recall | **100% (13/13)** | | Linux rule-blind (500 paths, Snaffler-rule-exclusion benchmark) | F1 | **0.944** | | Snaffler-blind Windows (500 LLM-labeled paths) | P | **0.984** | | Snaffler-issues operator-grounded | Pass | **31/31 closed** + 7/10 open | ### 纪律轨迹 ShareSift 采用纪律诚实的研究周期:在编写规则以修复前一个测试集的失败之前,先锁定下一个测试集。截至 v0.51 经历了四代: | 代数 | 来源 PRs | 规则前基线 | 规则后 | 闭环于 | |---|---|---:|---:|---| | v1 | #78 Cisco, #135 FileZilla, #67 ADO | 36% | **100%** | v0.49 | | v2 | #198 CMD-set, #155 Azure CLI, #98 cred-filename, Chrome/Edge | 50% | **100%** | v0.49 | | v3 | #154 -password, #140 Kerberos, #139 MDE, #112 SCCM | 90%¹ | **100%** | v0.50 | | v4 | OPEN PRs #192 PPK, #186 SCCM-broad | **60%²** | 70% | (locked at v0.50) | ¹ v3 基线为 90% 反映了 pysnaffler 捆绑了来自 PRs #140 和 #112 的上游规则(两者均已合并)。这不是严格的泛化测试。 ² v4 使用的是 pysnaffler 未捆绑的 OPEN PRs。从 60% 到 70% 的规则后提升来自于 SCCMContentLib$ 规则(根据 v3 锁定的 PR #112 编写),它捕获了 PR #186 的注册表导出探测,而该规则从未针对此进行编写 —— 这是一个真实的泛化信号。 有关完整的纪律周期说明,请参阅 [docs/methodology.md](docs/methodology.md),有关包含原始计数和诚实来源细分的 12 项基准测试完整评分卡,请参阅 [docs/v0p50_benchmark_sweep.md](docs/v0p50_benchmark_sweep.md)。 ## 安装 **快速安装** — 在 Kali 上放置一个二进制文件(无需 `git clone`,无需 `uv` 设置,无需 Python): ``` # 真正的单文件 binary — Stage 1 path classifier + rules + tier engine # + Snaffler-TSV + engagement DB + sort + query + export。约 77 MB,零 # Python 先决条件。从 v0.46 版本起可用。 wget https://github.com/byevincent/ShareSift/releases/latest/download/sharesift chmod +x sharesift ./sharesift --version ``` 或者通过 pipx(需要 Python 3.10+): ``` pipx install 'sharesift[smb]' # SMB-direct workflow pipx install sharesift # Stage 1 only ``` **从源码完整安装** — 如果你想进行开发、训练或运行内容分类器: ``` # 最新 milestone 版本(推荐) git clone --branch v0.51.0 https://github.com/byevincent/ShareSift.git # 或者跟踪 main 分支以获取未发布的工作 git clone https://github.com/byevincent/ShareSift.git cd ShareSift # 仅 Stage 1(path classifier,约 100MB) uv sync # 两个阶段(额外增加约 3GB 的 torch 和 transformers) uv sync --group content-inference # 直接支持 SMB(无需挂载)— 添加 smbprotocol + pyspnego uv sync --extra smb ``` 添加 `--group content-training` 以进行 LoRA fine-tuning。这将额外拉取 5GB 数据。 里程碑版本:[v0.51.0](https://github.com/byevincent/ShareSift/releases/tag/v0.51.0)(当前 — 通过 DiskForge 进行真实企业共享基准测试:在 Red+ 级别 F1 为 0.565 对比 Snaffler 的 0.337),[v0.50.0](https://github.com/byevincent/ShareSift/releases/tag/v0.50.0)(预留的 v3 达到 100%,v4 达到 70% 基线 + SCCMContentLib$ 泛化),[v0.49.0](https://github.com/byevincent/ShareSift/releases/tag/v0.49.0)(预留的 v1 达到 100%,v2 达到 100%,v3 达到 90% + POSIX FileName bugfix),[v0.48.0](https://github.com/byevincent/ShareSift/releases/tag/v0.48.0)(预留的 v1 从 36% 提升至 91%,v2 从 70% 提升),[v0.47.0](https://github.com/byevincent/ShareSift/releases/tag/v0.47.0)(Snaffler-issues 基准测试 + MSF2 recall 为 1.000),[v0.46.0](https://github.com/byevincent/ShareSift/releases/tag/v0.46.0)(77MB 单文件二进制 + DB 导出器),[v0.45.0](https://github.com/byevincent/ShareSift/releases/tag/v0.45.0)(top-K precision 从 0.20 提升至 0.70),[v0.43.0](https://github.com/byevincent/ShareSift/releases/tag/v0.43.0)(Linux 规则漏洞填补),[v0.41.0](https://github.com/byevincent/ShareSift/releases/tag/v0.41.0)(接合数据存储)。中间标签作为预发布版显示在[发布页面](https://github.com/byevincent/ShareSift/releases)上。 ## 快速开始 ### 远程 SMB 共享(无需挂载,v0.35+) 将 ShareSift 指向一个 UNC 路径并提供凭据,它将直接通过 SMB2/3 遍历共享。认证标志遵循 netexec 惯例(`-u/-p/-H/-k/-d`)。 ``` # 密码认证 uv run sharesift //10.10.10.5/Finance$ -u user -p pass # Pass-the-hash(NT hash 或 LM:NT) uv run sharesift //10.10.10.5/Finance$ -u CORP/user -H 'aad3b435b51404eeaad3b435b51404ee:27c4...' # Kerberos(从 KRB5CCNAME 读取 ticket) uv run sharesift //dc01.corp.local/SYSVOL$ -u alice -k --use-kcache # 匿名 / null session uv run sharesift //10.10.10.5/Public --no-pass # Pre-flight:在开始长时间 walk 之前确认凭据有效 uv run sharesift //10.10.10.5/Finance$ -u user -p pass --check ``` 输出默认存放在 `./sharesift--/` 中(使用 `--output-dir` 覆盖)。完整的一站式 pipeline 运行(枚举 → 分拣 → 内容扫描 → 验证 → HTML 报告)使用实时 SMB 会话进行内容读取 — 无需本地挂载。 ### 本地 / 已挂载的共享 ``` uv run sharesift /mnt/downloaded_share # 或者跳过实时验证 + 报告,只获取分类后的命中结果: uv run sharesift /mnt/downloaded_share \ --skip-verify --skip-report # 显式 subcommand 形式(legacy v0.18 flag set,仍受支持): uv run sharesift scan --share /mnt/downloaded_share --output-dir ./scan-out ``` 中间结果存放在 `--output-dir` 中: ``` scan-out/ ├── files.txt # enumerated paths ├── paths.jsonl # stage 1 scores ├── hits.jsonl # stage 1+2 results ├── verified.jsonl # live credential checks └── report.html # interactive HTML report ``` 添加 `--json` 可在 stderr 获取结构化的运行结束摘要(对 CI 很有用)。添加 `-q` / `--quiet` 可静音进度,或添加 `-v` / `--verbose` 获取 debug 详情。 当你需要更精细的控制时,可以使用下面的各个子命令单独运行每个阶段。 ### 从共享枚举中对路径进行评分 将枚举工具的输出直接通过管道传输给 ShareSift。 ``` manspider --target \\fileserver -d corp.local | \ uv run sharesift score-paths --stdin # 或者从文件 uv run sharesift score-paths \ --input enumerated_paths.txt \ --output scored.jsonl ``` 输出是包含路径、概率和层级(Black、Red、Yellow 或 null)的 JSONL。 ``` {"path": "\\\\fileserver\\Finance\\backups\\creds.kdbx", "probability": 0.987, "tier": "Black"} {"path": "\\\\fileserver\\Dev\\notes.txt", "probability": 0.523, "tier": "Yellow"} {"path": "\\\\fileserver\\Marketing\\Q4.pdf", "probability": 0.012, "tier": null} ``` 首先处理 Black,然后是 Red,最后是 Yellow。使用 `jq` 进行排序和过滤。 ### 使用两个阶段扫描文件 ``` find ./downloaded_share -type f | \ uv run sharesift scan-files --stdin \ --output deep_scan.jsonl ``` 阶段 2 为每条记录添加 `content_check` 和 `content_excerpt`。 ``` {"path": "./downloaded_share/Dev/notes.txt", "path_probability": 0.52, "path_tier": "Yellow", "content_check": "yes", "content_excerpt": "API_KEY = 'sk_live_...'"} ``` 阶段 2 仅在标记为特定层级的路径上运行。使用 `--force-content` 覆盖此行为。在 CPU 上,每个文件需要 5 到 8 秒。在 CUDA 上运行大约需要 150ms。 ## 架构 两阶段 pipeline。每个阶段独立运行。 ``` ┌─────────────────────────────────────────┐ │ Stage 1 router (by path shape) │ │ │ │ UNC path → Windows model │ path list → │ Unix path → Linux model │ → (probability, tier) │ │ │ LightGBM + char n-grams + │ │ 8 hand features, calibrated │ │ probability, per-model tier band │ └─────────────────────────────────────────┘ │ (tier flagged subset) ↓ ┌──────────────────────────┐ │ Stage 2: Qwen3-1.7B LoRA │ → (yes / no on secret presence) │ via transformers + PEFT │ │ 4-bit base on CUDA │ │ bf16 on CPU │ └──────────────────────────┘ ``` 阶段 1 基于 11,190 条 Windows 和 1,685 条 Linux 记录进行训练。它在不到一毫秒的时间内对每个路径进行评分。根据你的硬件配置,阶段 2 的体积在 1.5 到 3.4GB 之间。 完整设计详见 [docs/architecture.md](docs/architecture.md) 和 [docs/build_plan.md](docs/build_plan.md)。 ## pysnaffler 集成 `ShareSiftPathRule` 是一个 `SnaffleRule` 子类,它将路径分类器插入到 pysnaffler 的 SMB 枚举循环中。 ``` uv sync --group pysnaffler-integration ``` ``` from sharesift.pysnaffler_run import build_ruleset from pysnaffler.snaffler import pySnaffler # 仅 ML:ShareSift 替换 Snaffler 的 rule pack ruleset = build_ruleset() # 混合:Snaffler 默认加上 ShareSift ruleset = build_ruleset(include_defaults=True) snaffler = pySnaffler(ruleset=ruleset, dry_run=True) ``` ## 限制 未根据真实的接合测试发现进行验证。ShareSift 的标签来自公共语料库数据上的 Claude 规则和 Codex 审计 pipeline。这是有用的信号,但它与内部接合级别的 ground truth 属于不同类别。 校准在分布中保持有效。层级带精确率契约在与训练来源相同的数据上是可靠的。在分布外数据上,Windows 模型的 ECE 从 0.007 上升到 0.30。在扫描真实的 SMB 共享时,请将层级分配视为分拣排序,而不是概率契约。 跨来源的泛化能力比标题数字所暗示的要弱。当你在 Stack Exchange 上进行训练并在 GitHub Code Search 上进行测试时,Windows 的 PR AUC 会从 0.97 下降到 0.76。真实的 SMB 共享是第三种分布,训练和评估都没有涵盖。 内容分类器比 Biringa 和 Kul 2025 低 13 个 F1 点。差距源于模型大小。Mistral 7B 比 Qwen3 1.7B 大四倍,而 ShareSift 的目标是 RTX 4070 部署。 罕见的凭据类别训练不足。私钥、SSH 凭据、云凭据和 IAC 各自的训练记录都不超过三条。这些类别上的召回率很弱。 没有 AVX 512 的 CPU 运行缓慢。在 Ryzen 5 3600 上的基准测试为每个 5 到 8 秒。 完整的审计历史记录请参见 [docs/audit_2026-05-31.md](docs/audit_2026-05-31.md) 和 [docs/audit_2026-05-30.md](docs/audit_2026-05-30.md)。 ## 项目布局 ``` src/sharesift/ runtime package path.py PathClassifier router (Windows and Linux models) content.py content classifier wrapper tier.py probability to tier band features.py char n-gram and hand features prompt.py content classifier chat template formatter pysnaffler_rule.py SnaffleRule plugin pysnaffler_run.py build_ruleset() helper cli.py score-paths and scan-files entry point src/eval/ training and evaluation scripts tools/ training, dataset builders, audit tools docs/ engineering log and architecture docs models/ trained model weights ``` ## 许可证 Apache 2.0。有关 GPLv3 组件(内置的 Snaffler 规则集和 pysnaffler)的信息,请参见 [NOTICE](NOTICE)。 ## 贡献 这是一个活跃的个人项目。请在 [docs/build_plan.md](docs/build_plan.md) 和 [docs/journal.md](docs/journal.md) 中跟踪主要设计决策。在发送 PR 之前请先提一个 issue。
标签:Apex, DLL 劫持, LightGBM, SamuraiWTF, SMB, 凭据扫描, 凭证收集, 大语言模型, 安全助手, 机器学习, 系统调用监控, 逆向工具, 错误配置检测