紫队实验台开发复盘:用红队手法验证蓝队检测
做安全运营的人都有一个痛:告警规则一堆,但到底哪些攻击手法能检出、哪些是盲区,心里没数。 于是第二个项目我做了一个「紫队实验台」——purple-team-lab,把「红队攻击 → 蓝队检测」的验证流程做成了一个可控闭环。
这篇文章记录三个关键决策,以及两个被实验”戳出来”的检测缺口。
一、核心思路:红队的思路,蓝队的产出
紫队 = 红队 + 蓝队协作。落到工具上,我设计成四步闭环:
选用例(红队手法)→ 生成模拟告警 → 规则引擎匹配 → 覆盖率/缺口报告
最重要的设计约束是合规:所有”攻击”都是写死的示例数据(演示 IP、示例载荷特征),代码里没有任何端口扫描、发包、真实攻击逻辑,断网也能完整跑通。这既是红线,也恰好是安全从业者应展示的素质。
二、决策 1:不 fork 重框架,自研轻量引擎
调研了 Atomic Red Team(12.4k⭐ 的 ATT&CK 用例库)和 MITRE 的 CALDERA(多步攻击链编排)。两者都很重、且需要真靶机,于是借鉴它们的「用例模型 + 编排思路」,自研了一个 Sigma-lite 规则引擎:
- 规则 = AND(多个 matcher);matcher 内 values = OR
- 三种算子:
equals(字段等值)/contains(不区分大小写包含)/regex - 每条约 10 行 JSON,安全分析师看得懂、改得动
告警字段按日常告警池口径来(数据源 / 告警名称 / 告警描述 / 源·目的 IP / 协议 / 时间),让验证结果能直接对应当天工作时看到的告警形态。
三、决策 2:12 个场景横跨 6 大战术
覆盖初始访问、执行、侦察、凭据访问、横向移动、C2:SQL 注入(UNION / 盲注)、XSS(反射 / 编码绕过)、目录爆破、SSH / Web 爆破、Webshell(冰蝎特征)、反弹 Shell、PowerShell 编码执行、PSEXEC 横移、DNS 隧道。
四、决策 3:手工埋了两个”盲区”,让报告有真话讲
如果 12 个场景全部命中,报告就是 100%,没意思。我故意设计两个现有规则检不出的场景:
- XSS 双重 URL 编码——规则只做明文 / 单层编码匹配,
%253Cscript%253E直接绕过; - DNS 高熵隧道——规则只有特征模板(”高熵域名”关键词),没有域名熵值 / 频率统计能力。
于是每轮验证的基线是 10/12 命中、83% 覆盖率,报告页会明示缺口 + 整改方向。这比”全绿”的演示有价值得多——它演示的正是检测工程的日常:总有盲区,验证的意义就是找到它。
五、踩的坑
- 写规则时图省事加了个
alert(关键词,结果双重编码样本里alert(1)明文还在,把”漏检场景”误判成了命中——规则特征必须精确对应绕过后的形态; node --test传目录参数在老版本能用、Node 24 报错,直接node --test自动发现最稳。
六、质量与交付
- 11 个端到端接口测试(
node:test,零测试框架),其中固定断言”12 场景 = 10 检出 2 缺口”,防止规则改动悄悄改变基线 - Vue3 黑金界面三页:场景库(勾选发起)/ 验证任务 / 检测报告(覆盖率环 + 战术条)
- Docker Compose 一键跑
七、简历话术
独立设计紫队”攻击模拟→检测验证”实验台:12 个 MITRE ATT&CK 场景 + 自研 Sigma-lite 规则引擎(equals/contains/regex 算子、AND/OR 组合),通过受控实验识别出双重编码绕过、DNS 高熵隧道两类检测缺口并给出整改建议;全程离线数据模拟保障合规,11 个端到端测试保障基线可复现。
代码与完整文档:github.com/hedongli1/purple-team-lab。下一个目标:给 DNS 隧道补上”子域熵值统计”检测,把覆盖率从 83% 干到 100%。