按攻击阶段注入技术卡并守住红线,让打靶练习有章法
30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add qingsiweisan/dsh-htb-skills该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · security
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 6 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 50 处,展示前 49 条)
- 读取本地文件src/guard.js:255
mtimeMs = statSync(path).mtimeMs - 读取本地文件src/guard.js:264
const raw = JSON.parse(readFileSync(path, 'utf8')) - 读取密钥环境变量src/sherlock-tools.js:62
if (typeof process.env.HTB_TOKEN === 'string' && process.env.HTB_TOKEN) return process.env.HTB_TOKEN - 读取本地文件src/sherlock-tools.js:65
const t = readFileSync(file, 'utf8').trim() - 发起网络请求src/sherlock-tools.js:79
const res = await fetch(BASE + pathname, { - 发起网络请求src/sherlock-tools.js:157
const res = await fetch(json.url, { headers: { authorization: 'Bearer ' + token } }) - 写入本地文件src/sherlock-tools.js:161
mkdirSync(dir, { recursive: true }) - 写入本地文件src/sherlock-tools.js:163
writeFileSync(zipPath, buf) - 执行外部命令来自配置/变量src/sherlock-tools.js:173
execFileSync(cmd, args, { stdio: 'ignore' }) - 读取本地文件src/state-tools.js:102
text = readFileSync(indexPath, 'utf-8') - 读取本地文件src/state-tools.js:175
names = readdirSync(root).filter((n) => n.endsWith('-state.jsonl')) - 读取本地文件src/state-tools.js:191
if (!existsSync(path)) return [] - 读取本地文件src/state-tools.js:193
for (const line of readFileSync(path, 'utf-8').split('\n')) { - 写入本地文件src/state-tools.js:213
appendFileSync(path, `${JSON.stringify(event)}\n`) - 读取本地文件src/state-tools.js:295
return { path, rules: parseRouterRules(readFileSync(path, 'utf-8')) } - 读取本地文件src/wp-guard.js:376
: Boolean(unlockPath) && existsSync(unlockPath) - 读取本地文件src/struggle-watch.js:154
entries = readdirSync(d, { withFileTypes: true }) - 读取本地文件src/struggle-watch.js:169
const { mtimeMs } = statSync(p) - 读取本地文件src/scope-observe.js:131
names = readdirSync(stateRoot).filter((n) => n.endsWith('-state.jsonl')) - 读取本地文件src/scope-observe.js:145
const st = statSync(p) - 读取本地文件src/scope-observe.js:155
for (const line of readFileSync(p, 'utf-8').split('\n')) { - 读取本地文件src/scope-observe.js:220
if (!existsSync(dirname(logPath))) mkdirSync(dirname(logPath), { recursive: true }) - 写入本地文件src/scope-observe.js:220
if (!existsSync(dirname(logPath))) mkdirSync(dirname(logPath), { recursive: true }) - 写入本地文件src/scope-observe.js:222
appendFileSync(logPath, `${JSON.stringify({ - 读取本地文件src/auto-state.js:249
} else if (existsSync(stateRoot)) { - 读取本地文件src/auto-state.js:250
const names = readdirSync(stateRoot).filter((n) => n.endsWith('-state.jsonl')) - 读取本地文件src/auto-state.js:335
if (!existsSync(dirname(path))) mkdirSync(dirname(path), { recursive: true }) - 写入本地文件src/auto-state.js:335
if (!existsSync(dirname(path))) mkdirSync(dirname(path), { recursive: true }) - 写入本地文件src/auto-state.js:336
appendFileSync(path, `${JSON.stringify(record)}\n`) - 读取本地文件src/auto-state.js:342
if (!existsSync(dirname(logPath))) mkdirSync(dirname(logPath), { recursive: true }) - 写入本地文件src/auto-state.js:342
if (!existsSync(dirname(logPath))) mkdirSync(dirname(logPath), { recursive: true }) - 写入本地文件src/auto-state.js:343
appendFileSync(logPath, `${JSON.stringify(record)}\n`) - 读取本地文件src/machine-own.js:64
names = readdirSync(root).filter((n) => n.endsWith('-state.jsonl')) - 读取本地文件src/machine-own.js:73
const { mtimeMs } = statSync(join(root, n)) - 读取本地文件src/machine-own.js:80
for (const line of readFileSync(join(root, newest), 'utf-8').split('\n')) { - 读取本地文件src/machine-own.js:163
if (!existsSync(stateRoot)) mkdirSync(stateRoot, { recursive: true }) - 读取本地文件src/log-sink.js:47
if (!existsSync(dir)) mkdirSync(dir, { recursive: true }) - 写入本地文件src/log-sink.js:47
if (!existsSync(dir)) mkdirSync(dir, { recursive: true }) - 读取本地文件src/htb-api.js:47
if (!existsSync(p)) { - 读取本地文件src/htb-api.js:50
const raw = readFileSync(p, 'utf-8').trim() - 发起网络请求src/htb-api.js:88
res = await fetch(baseUrlOf(config) + path, init) - 写入本地文件router/src/index.js:60
appendFileSync(join(tmpdir(), 'htb-router.log'), new Date().toISOString() + ' ' + line + '\n') - 读取本地文件router/src/index.js:85
const names = readdirSync(stateRoot).filter((n) => n.endsWith('-state.jsonl')) - 读取本地文件router/src/index.js:94
try { bestT = statSync(join(stateRoot, pinned)).mtimeMs } catch { bestT = 0 } - 读取本地文件router/src/index.js:99
const t = statSync(join(stateRoot, n)).mtimeMs - 读取本地文件router/src/index.js:108
for (const line of readFileSync(path, 'utf-8').split('\n')) { - 读取本地文件router/src/index.js:207
const names = readdirSync(stateRoot).filter(n => n.endsWith('-state.jsonl')) - 写入本地文件router/src/index.js:238
appendFileSync(path, line + '\n') - 读取本地文件router/src/index.js:261
if (existsSync(p)) return readFileSync(p, 'utf-8')
扫描于 2026/10/31(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-skill-filesystem给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成dsh-htb-skills
HTB(Hack The Box)打靶框架,封装成 DeepSeek Harness 插件。
社区项目,并非 DeepSeek 官方插件,也不代表 DeepSeek 的认可或背书。
仅用于授权环境(HTB 靶机、自建实验环境)的攻防练习。见 SECURITY.md。
是什么
一个「技能库 + 状态账本 + 路由 + 守卫」的组合。目标不是让模型知道更多,而是让它在正确的时刻想起该想起的东西、该停的时候停得下来。
三个组件:
| 组件 | 目录 | 作用 |
| 技能库 + 守卫 | 根目录(src/ skills/ scripts/) | 164 张技术卡 + 5 个观测/守卫模块 + 9 个 htb_ 工具 + 30 道自检闸 |
| 路由 | router/ | 93 条规则:从工具调用推断攻击阶段,按需注入对应卡片(不是全量灌) |
| 预设 | preset/ | persona 与插件装配(把上面两者接到一个会话里) |
关于卡片里的 RS
部分卡片带一行 📌 DSH 适配:本技能移植自 RS,以及 (⚠️ xxx 是 RS 时代工具名) 的注记。
RS = Reasonix Studio,是这批卡片最初成形的环境(作者的上一代工作台)。
展开完整文档(README 剩余 1 节)
dsh-htb-skills
HTB(Hack The Box)打靶框架,封装成 DeepSeek Harness 插件。
社区项目,并非 DeepSeek 官方插件,也不代表 DeepSeek 的认可或背书。
仅用于授权环境(HTB 靶机、自建实验环境)的攻防练习。见 SECURITY.md。
是什么
一个「技能库 + 状态账本 + 路由 + 守卫」的组合。目标不是让模型知道更多,而是让它在正确的时刻想起该想起的东西、该停的时候停得下来。
三个组件:
| 组件 | 目录 | 作用 |
| 技能库 + 守卫 | 根目录(src/ skills/ scripts/) | 164 张技术卡 + 5 个观测/守卫模块 + 9 个 htb_ 工具 + 30 道自检闸 |
| 路由 | router/ | 93 条规则:从工具调用推断攻击阶段,按需注入对应卡片(不是全量灌) |
| 预设 | preset/ | persona 与插件装配(把上面两者接到一个会话里) |
关于卡片里的 RS
部分卡片带一行 📌 DSH 适配:本技能移植自 RS,以及 (⚠️ xxx 是 RS 时代工具名) 的注记。
RS = Reasonix Studio,是这批卡片最初成形的环境(作者的上一代工作台)。两者工具名不同,所以每张移植过的卡都在头部标了映射关系(例如 read_skill / run_skill → DSH 的 skill 工具)。
这些注记是迁移痕迹,不是外部依赖 —— 本仓库不依赖 RS,也不包含它的代码。
六层结构
按「离模型思维的距离」排,越靠后越可靠:
L1 输入 它看到什么 router 按阶段注入卡片 / htb_brief 传假设给子 agent L2 动作 它能做什么 4 道守卫(红线 / 提问 / WP / 停止协议)+ dead 必须带对照证据 L3 反馈 做完看到什么 单次输出超标 + 上下文累积 + 失败归因 6 类 + 战线预算 L4 时间 什么时候停 stall 90 分钟 / budget 6 小时 → 注入提醒 + 上闸 L5 结构 什么离开脑子 state.jsonl(fact / intent / auto-probe)+ loot 台账 L6 采样 换起点 未实现(见 docs/ARCHITECTURE.md 的「未做」清单)
17 个工具的用途 / 输入输出 / 调用方式见 docs/TOOLS.md;分层、装配、生效条件与已知欠账见 docs/FRAMEWORK.md;改代码前读 docs/ARCHITECTURE.md(变异点地图);卡片写作规范见 docs/CARD-NORMS.md。
目录结构
dsh-htb-skills/
├── package.json # dsh.bundle.patch → cordis.patch.yml
├── cordis.patch.yml # 注入 host 插件行 ├── src/ │ ├── index.js # 插件入口(注册 provider / 工具 / 守卫) │ ├── sherlock-tools.js # 6 个 htb_sherlock_ 工具 │ ├── state-tools.js # htb_fact / htb_frontier / htb_brief(状态账本) │ ├── guard.js # 红线守卫(18 条) │ ├── ask-guard.js # 提问守卫(不把解题责任推回用户) │ ├── wp-guard.js # WP 守卫(打靶会话不读官方 writeup) │ ├── struggle.js # 停滞/重复/预算的判定 │ ├── struggle-watch.js # 判定接线 + 停止协议闸 │ ├── scope-observe.js # 出站目标观测(只记录,永不拦截) │ ├── context-hygiene.js # 上下文卫生(单次 + 累积) │ ├── error-classify.js # 失败归因(6 类 + 同类合并) │ └── auto-state.js # 战线推断 + 切换摘要 + 战线预算 ├── skills/ # 164 张技能卡(T1 路由 / T2 深度 / T3 参考) │ └── htb-skill-index/ # 领域 × 层级总索引 ├── scripts/ # 30 道自检闸(25 个 node 用例 + python 审计) ├── templates/ # 并行侦察 workflow / 通道适配器 ├── docs/ # 架构与卡片规范 ├── router/ # 路由插件(规则表 + 匹配逻辑) └── preset/ # persona 与装配
可选伴随仓库(不在本仓库内)
| 仓库 | 许可 | 作用 | 状态 |
| dsh-htb-evidence | Apache-2.0(fork 自 PerryLink/dsh-research-report) | 证据账本:把 htb_fact 的 evidenceId 绑到可校验的字节快照;另加 htb_coverage / htb_traces 两个 HTB 专用工具 | 独立发布 |
| dsh-htb-tuning | 私有 | profile 调优:中和与渗透工作冲突的默认权限规则 | 本地专用 |
主包不依赖它们:
- 没有 evidence 时,htb_fact 仍可写 inferred 事实,只是 verified 无法做证据校验;
- framework-check.mjs 检测不到 evidence 仓库会自动跳过那两道闸(打印 ↷ 跳过),不影响其余 28 道。
为什么 evidence 不并进来:它是 Apache-2.0 的第三方 fork,并进 MIT 仓库需要保留上游 LICENSE / NOTICE 并显式声明改动,属于独立的许可决策,不适合顺手合并。
安装
git clone https://github.com/qingsiweisan/dsh-htb-skills.git
cd dsh-htb-skills
1) 技能库 + 守卫(link 安装,本地改代码即时生效)
dsh plugin --profile web add link:./dsh-htb-skills
2) 路由(可选,但强烈建议——没有它,卡片只在被想起时才生效)
dsh plugin --profile web add link:./dsh-htb-skills/router
3) 预设:把 preset/cordis.patch.yml 里的 persona 段落合并进你的 profile 配置。
其中 C:\Users\<user>\... 是占位符,按你的实际路径替换。
dsh web # 重启后新建会话,看到 htb-skill-index 等 T1 卡即为生效
注意:插件挂载后,~/.dsh/skills 里的同名散装技能会与插件里的卡重复(同名时 preset 层遮蔽全局层)。迁移前先备份:
mv ~/.dsh/skills ~/.dsh/skills.bak
自检
node scripts/framework-check.mjs # 30 道闸,绿了才算没改坏
node scripts/router-rules-test.mjs # 只跑路由规则表
python scripts/triage_skills.py # 重生成索引卡(需 pyyaml)
python scripts/audit_routing.py # 路由完整性审计(只读)
改完卡片或规则必须跑 framework-check.mjs。它覆盖:卡片元数据一致性、路由引用可解析、守卫接线、状态账本、上下文卫生、失败归因、战线推断、以及"文档数字与实际一致"(防止 README 说 164 张卡而实际 163 张)。
卡片的 frontmatter 约定
name: web-attacks
description: 'Web 攻击综合手册:OWASP 映射 → …(检索词:…)'
whenToUse: '目标有 HTTP/HTTPS 攻击面时:…'
T2/T3 卡额外带这一行;T1 卡不写: disable-model-invocation: true
metadata: { domain: web, tier: T1 }
- domain:meta / web / ad-win / linux / db / cloud / creds / forensics / network / tools
- tier:T1(进会话目录)/ T2(深度,按名加载)/ T3(参考与题源,按名加载)
新增一张卡 = 建目录 + 写 SKILL.md + 在 scripts/triage_skills.py 的 MAPPING 登记 domain/tier + 重跑校验链。slug 的每个分词都必须出现在元数据里(否则路由搜不到)。
兼容范围
- DeepSeek Harness 0.1.0-rc.x(对齐 @deepseek-ai/dsh-skill-filesystem ^0.1.0-rc.6)
- Node ^22.19.0 || >=24.0.0
- Harness 仍在开发者预览期,升级后如有破坏性变更,请对照上游 skill-filesystem 的导出
许可证
MIT。技能卡内容整理自个人实战与公开资料;不含任何真实环境凭据(见 SECURITY.md)。
关于第三方仓库:卡片里出现的 github.com/... 链接是工具来源(告诉你这个工具去哪拿),不是本仓库的依赖。本仓库不包含这些项目的代码,也没有 vendored 目录;运行时只依赖 @deepseek-ai/dsh-skill-filesystem 与 @deepseek-ai/dsh-llm(Harness 一方组件)。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
qingsiweisan/dsh-htb-skills
按攻击阶段注入技术卡并守住红线,让打靶练习有章法
相关插件 · 安全 / 权限
智能体逆向工程morluto/rea
用智能体逆向工程任何东西,从应用行为到原生二进制。
★ 415,267已汉化DSH
73.3
智能体集群框架ruvnet/ruflo
面向 Claude Code 与 Codex 的智能体元基座meta-harness。
★ 80,414已汉化MCP
71.9
WorkBuddy 模型接入corrinehu/dsh-workbuddy-connect
2026 年 10 月 20 日起,WorkBuddy…
★ 1,604已汉化DSH
71.7
破甲一键通z91772524-ai/pojia-next
十五个 AI…
★ 967已汉化DSH
71.6
AI 代理虚拟终端strukto-ai/mirage
Mirage 是给 AI 智能体用的虚拟终端:一层 shell,统管数据、命令行和运行时。Unix…
★ 3,756已汉化DSH
70.8
Agent 操作层agentic-os-org/ANOLISA
ANOLISA(Agentic Nexus Operating Layer & Interface System Architecture)|智能体操作系统,带运行时、安全、可观测性,以及 Tokenless 响应压缩,降低 token 用量与成本。
★ 649已汉化DSH
70.7