dsh-red-team
红队渗透辅助插件:侦察/枚举/指纹/CVE 匹配/敏感路径(8 工具,仅限授权测试)
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 25, 2026
- Updated
- Sep 20, 2026
Introduction
dsh-red-team
一句话:8 个 red_* 工具把 PTES 流程的侦察/枚举/指纹/攻击面评估段做成结构化工具面——子域枚举、目录枚举、链接爬取、技术栈指纹、banner 抓取、安全响应头检测、敏感路径探测、CVE 匹配。
为什么值得用:单次 fetch 拿到的东西和「一次可复盘的侦察」差在过滤依据。手动跑一遍目录枚举,你只看到命中列表——看不到「扫了多少条、丢了多少、按什么丢的」;目标站是 SPA 时更会全 200 误报。本插件每次调用落一行轨迹,把 raw / kept / dropped / reasons 全部写下来,并用响应体特征(而不是状态码)判真泄露,把误报与假阴性压到可解释的程度。
能力
| 工具 | 用途(含工具描述要点) |
|---|---|
red_subdomain_enum | 子域名枚举(crt.sh 证书透明日志反查)。侦察用,仅限授权测试。参数:domain(必填) / limit(默认 30) |
red_dir_brute | Web 目录/文件枚举:内置常见字典探测,非 404 视为存在(状态码/大小)。枚举攻击面,仅限授权测试。参数:url(必填) / extra(追加自定义路径) / timeout(默认 8000ms) |
red_crawl_links | 页面链接爬取:提取页面内 href/src/action 链接(同域去重),发现隐藏端点/后台入口。仅限授权测试。参数:url(必填) / maxLinks(默认 50) |
red_tech_fingerprint | Web 技术栈指纹:响应头(Server/X-Powered-By)+ 页面特征识别框架(WordPress/Django/Spring/React 等,19 条特征表)。识别目标技术栈,仅限授权测试 |
red_banner_grab | 服务 banner 抓取:TCP 连接读取服务标识(识别端口背后的服务/版本)。服务枚举,仅限授权测试。参数:host/port(均必填) |
red_security_headers | Web 安全响应头检测:缺失 HSTS/CSP/X-Frame-Options 等 = 攻击面(XSS/点击劫持/降级)。评估目标防御配置,仅限授权测试(7 项头) |
red_sensitive_paths | 敏感路径探测:.git 仓库泄露 / .env 配置 / phpinfo / 备份文件 / 管理后台。识别配置泄露与后台暴露,仅限授权测试 |
red_cve_match | CVE 匹配:按软件+版本查已知漏洞(NVD),按 CVSS 排序并标注可获取的 exploit 参考。攻击面评估,仅限授权测试 |
快速开始
1) 装依赖(自研插件家园 self-plugins/,在目标 profile 的 package.json 加 link 依赖):
"dsh-red-team": "link:<工作区>/self-plugins/dsh-red-team"
2) 挂组合(agent 预设行):
- insert:
- id: agent-red-team
name: dsh-red-team
config:
enabled: true
3) 30 秒验证:对一个自己搭建的靶场或本机服务调用一次
red_tech_fingerprint url="http://127.0.0.1:8080/"
期望:返回 {ok:true, ...} 且技术栈字段为数组/字符串;同时 tail -3 "$DSH_HOME/redteam-trace.jsonl" 应看到新增一行 scan/start 与一行 scan/end(含 tool / target / stats / durationMs)。不要拿公网第三方站点做首次验证——先用本机目标确认接线。
配置
| 项 | 默认 | 说明 |
|---|---|---|
enabled | true | 装载时打一行「红队工具面就绪(8 工具,仅限授权测试)」并落 boot 轨迹 |
环境变量 DSH_REDTEAM_TRACE | 未设(= 开启) | 设为 0 关闭轨迹落盘(除 0 之外的任何值都视为开启) |
本插件无 Config 之外的任何外部状态:不读缓存、不持凭据、不写插件目录。
落盘与自证(出问题时先看这里)
唯一持久产物:<DSH_HOME>/redteam-trace.jsonl(append-only,一行一阶段,无轮转;DSH_HOME 缺省 ~/.dsh)。
| 阶段 | 含义 |
|---|---|
boot | 插件装载(自报 enabled + 8 个工具名清单 cfg.tools[]) |
scan/start | 工具调用前(durationMs: 0) |
scan/end | 内层函数成功收尾(带命中数与过滤统计) |
scan/error | 内层函数抛错(带可 grep 的 failure 分类) |
| 字段 | 语义 |
|---|---|
atMs / pid / build | 写入时刻 / 进程 pid / <version>@<lib/trace.js mtime ms> |
tool / target | 工具名(boot 行为 apply)/ 脱敏后的目标 |
phase / failure? / error? | 阶段枚举 / 失败分类 http-4xx|http-5xx|dns|refused|timeout|network|parse|abort|unknown / 原文裁剪 200 字符 |
raw? / hits? / stats? | 过滤前原始条数 / 过滤后条数 / {raw,kept,dropped,reasons}——reasons 是可 grep 的过滤依据(如 off-origin / duplicate / not-found-or-error) |
textChars? | 文本型结果长度(banner 字符数;与「命中条数」语义不同,单列不混用) |
durationMs | 每次工具调用实耗 |
一条命令答五问:
tail -3 "$DSH_HOME/redteam-trace.jsonl"
# ① 线上跑的是哪个构建 → build = "<版本>@<模块 mtime ms>"(boot 行还带 cfg.enabled / cfg.tools,可判「挂的是哪几个工具」)
# ② 谁发起 / 打向谁 → tool + target(已脱敏)+ pid
# ③ 断在哪一段 → phase 枚举;scan/error 行的 failure 直接给出失败类别(dns/timeout/refused/http-4xx…)
# ④ 结果质量 → raw(扫描条数)vs hits(保留条数)vs stats.dropped + stats.reasons(按什么丢的)
# ⑤ 耗时与预算 → durationMs(每次调用实耗,配合工具自身 timeout 判网络超时占比)
隐私红线:target 先脱敏(URL userinfo、键名像凭据的 query 参数、用户主目录前缀折叠为 <home>),只记目标与计数、绝不记响应正文(页面/banner 正文可能含他人数据与凭据)。观测绝不反噬:全部 IO 失败吞错返回 false,扫描行为不受影响(有接线级尸体测试)。
生效判据与回退
生效判据(三选一):
- 行为级:8 个
red_*工具在工具面可调用,非法入参被拒(domain非法 →domain 格式无效;url非 http(s) →url 必须是 http(s):// 开头;port越界 →port 无效); - 轨迹级:
tail -1 "$DSH_HOME/redteam-trace.jsonl"的build里 mtime 等于lib/index.js(或lib/trace.js)的 mtime ⇒ 进程在跑当前构建; - 生态级:
plugin_boot_status(dsh-plugin-bootreport)的live含dsh-red-team⇒ 同上(机器化版本)。
注意:重新构建 ≠ 生效——产物 mtime 新只证明「构建过」,进程启动时间必须晚于产物 mtime 才算「在跑它」。缺这一条时不得宣称「已生效」。
回退:
- 源码级:
git -C self-plugins/dsh-red-team revert <commit>→ 重新构建 → 预检 → 重启; - 组合级:预设里给
agent-red-team行加disabled: true(或移除该行)→ 哨兵重启; - 运行期:无需回退(无持久业务状态;设置
DSH_REDTEAM_TRACE=0可即时停掉轨迹写入,<DSH_HOME>/redteam-trace.jsonl可随时删除)。
测试
npm test # = node --test "tests/*.test.mjs"(跑 lib/ 产物,与运行时同源)
43 例离线测试(Windows 侧 43/43 通过):
tests/pure.test.mjs(20 例)——纯函数层:框架特征 19 条且正则大小写不敏感、安全头 7 项 present+missing 恒等、目录字典含高价值路径、404/0不算存在、CVE 按 CVSS 降序、同源判定按URL.origin精确比较(不同端口 /a.com.evil.com这类前缀形似域必须被排除)、crt.sh 名单清洗(apex 不算子域)、脏数据保守返回;tests/trace.test.mjs(23 例)——轨迹层:路径解析与构建自报、目标脱敏、失败分类、序列化键序稳定、坏行跳过,以及三条尸体测试(父路径是普通文件 → 返回false且不抛;DSH_HOME不可写 → 工具照常返回;含凭据的目标 → 落盘行里搜不到凭据串)。
无需网络、无需真实目标、无需 WSL:用例全程桩化,不发起任何真实扫描。离线单测不需要出网,也不需要对任何目标有授权——这是刻意的:测试不得把 CI 变成扫描器。
平台注记(诚实披露):在 WSL/POSIX 下跑会出现 42 pass / 1 fail——失败例是
tests/trace.test.mjs的selfBuild(用例把import.meta.url的 pathname 做.replace(/^\//,'')以剥掉 Windows 盘符前的斜杠,在/mnt/...这类 POSIX 路径下会把根斜杠也剥掉,读不到package.json,于是期望''而实际'0.1.1')。这是测试代码的路径假设问题,不是插件行为问题;部署目标为 Windows,故按 43/43 记。修复属源码/测试改动,不在本次文档任务范围内。
设计要点
- 存在判据不用状态码单值:目录探测把
404与连接失败(status 0)都不算「存在」;敏感路径则进一步看响应体特征(.git/HEAD体以ref:开头、.env体含KEY|SECRET|PASS|TOKEN)才判真泄露——这是对抗 SPA 全 200 误报的关键,改动探测逻辑时不得退回纯状态码判定。 - 同源过滤是安全语义:链接爬取曾用
href.startsWith(base.origin)前缀比较,会把https://a.com:8443/x与https://a.com.evil.com/x误当同源;现在按URL.origin精确比较。这类缺陷在结果里看不出来,所以过滤依据必须落进stats.reasons。 - 失败分类可 grep:网络层失败被归一到
dns/refused/timeout/network等固定枚举——排障时grep '"failure":"dns"'比读长错误串快。 - 能力 ≠ 沙箱:本插件无法校验目标是否获授权。选择不加技术门禁(可被绕过,属伪安全),改为文档 + 调用者硬约束;如需显式开关,方向是
config.allowHosts白名单(默认关闭,见docs/semantic.md§10 U5)。 - 失败态与「不存在」合并是已知假阴性风险:目录枚举对超时/网络错误静默跳过,输出与「探测过且不存在」同形(§10 U2/U8)——结论里不要把这二者当同一件事。
- 零 npm 运行时依赖:全部走 Node 原生
fetch/net,无外部进程(banner 抓取走node:netTCP,不调nmap/nc)。
合规红线(硬性)
- 仅用于自有 / 明确授权的系统与开源靶场;
- 不触碰未经授权的第三方系统;
- 本插件为侦察/攻击面评估性质,不含破坏性利用载荷(利用与武器化不在本插件职责内);
- 首次验证请对
127.0.0.1或自建靶场进行。
相关文档
| 文档 | 内容 |
|---|---|
docs/semantic.md | 权威契约:定位与反定位、术语、概念模型、契约(状态→裁决表 + 调用点清单 + 轨迹行 schema)、可证伪验收清单(A1–A21)、未决问题(U1–U9) |
| alice-digital-life | 本插件所属生态的中心索引(全部自研插件) |
技能 cyber-range / plugin-maintainability / public-api-scraping | 靶场实战方法论、可维护性工程(五问判据)、公开 API 抓取与反爬 |
License
MIT © jonah791
本插件属于我的数字生命爱丽丝(alice-digital-life)的 DSH 自研插件生态——50 个插件按生命/认知/感知/行动/通信/治理/呈现七层组织。