easyshell Extensions 脚本菜单 — 用户使用手册
本文是 Extensions 脚本菜单 的统一说明,涵盖:部署使用、内置插件集、自定义 JSON 插件编写,以及从 Cobalt Strike CNA 迁移。
适用于操作人员与需要扩展菜单的用户。
目录
1. 简介
1.1 是什么
Extensions 脚本菜单 是 EasyShell Web 控制台中的右键扩展能力:在已上线主机上,通过树形菜单一键下发命令、内存执行工具、凭据抓取等操作。
- 配置以 JSON 文件 描述,放在服务端
Extensions/目录 - 不解析 Cobalt Strike 的
.cna(Sleep 脚本);CNA 需转换为 JSON 后使用 - 与交互式 Shell 分离:菜单执行走 非交互通道,结果在 输出坞 展示
1.2 与 Cobalt Strike CNA 的区别
| 项目 | Cobalt Strike CNA | EasyShell Extensions |
|---|---|---|
| 运行环境 | CS 客户端 + Sleep 运行时 | Web 控制台 + 静态 JSON |
| 命令下发 | bshell / beacon_* | shell / memory_exec 等步骤 |
| 工具路径 | script_resource() | relPath(相对 Extensions/,正斜杠) |
| 执行方式 | Beacon 交互控制台 | cmd.exe /C 非交互 + 输出坞轮询 |
2. 快速开始
2.1 目录结构
将 Extensions 文件夹放在 easyshell 服务端程序同级(与 easyshell.exe 同目录):
easyshell.exe
easyshell.db
Extensions/
EasyShell插件集/ ← 内置插件包(推荐直接使用)
main.json ← 菜单入口与模块加载顺序
modules/ ← 各分类菜单 JSON
Windows信息收集.json
权限提升.json
...
tools/ ← 内存执行二进制(部分需自行放入)
scripts/ ← PowerShell 等脚本
若程序同级没有
Extensions/,服务端会回退到启动时工作目录下的Extensions/(便于开发调试)。
2.2 加载菜单
- 登录 Web 控制台
- 选中已上线客户端,进入 脚本菜单 页
- 点击 重新加载配置(或重新进入该页面,会自动刷新)
菜单会按主机系统(Windows / Linux / macOS)和架构自动过滤显示项。
2.3 执行一项插件
- 在左侧菜单树点击 叶子菜单(最底层一项)
- 若需要参数,在弹窗中填写(如端口、网段、路径)
- 若有危险操作提示,确认后继续
- 页面底部 输出坞 自动展开并轮询显示执行结果
3. 控制台使用
3.1 脚本菜单页
| 操作 | 说明 |
|---|---|
| 点击菜单项 | 对当前选中会话下发对应步骤 |
| 参数弹窗 | 填写后替换命令中的 {{参数名}} |
| 二次确认 | 高危项(提权、持久化等)会先弹出确认框 |
| 输出坞 | 展示命令回显;可在此继续输入命令 |
| 重新加载配置 | 修改 JSON 后点此刷新,无需重启服务 |
3.2 输出坞与 Shell 的关系
- 脚本菜单执行结果写入 会话缓冲区,在输出坞以文本形式展示
- 与 客户端 Shell → 非交互式 共用同一缓冲区
- 不会混入交互式 PTY(xterm)输出,避免乱序
慢链路(如 DNS Beacon)回显可能延迟,可点 刷新输出;最长轮询约 13 分钟。
3.3 输出坞中直接内存执行
在输出坞或 非交互式终端 命令框中,可直接输入(不要加 shell 前缀):
memory-exec EasyShell插件集/tools/fscan.exe -h 192.168.1.0/24
memory-exec EasyShell插件集/tools/postex_helper.exe inline-bin getsystem 3
语法:memory-exec <Extensions相对路径> [模式] [参数...]
4. 内置插件集
仓库自带 EasyShell插件集,部署时复制到 Extensions/EasyShell插件集/ 即可。
4.1 菜单分类
| 模块 | 内容概要 |
|---|---|
| Windows信息收集 | 系统、网络、用户、进程、启动项、敏感搜索 |
| Windows内网探测 | arp、ping、fscan、nbtscan 等 |
| Windows域环境 | 域信息、PowerView、AdFind、SharpHound、Web 投递 |
| 权限提升 | getsystem、MS16 提权脚本、土豆类等 |
| 后渗透 | Mimikatz、浏览器密码、LaZagne、组合链 |
| Windows远程桌面 | RDP 状态与端口 |
| Windows痕迹与维持 | 计划任务、隐藏、防火墙、痕迹清理 |
| Linux信息收集 / Linux内存执行 | Linux 命令与 ELF 无盘执行 |
| Linux隐匿与权限维持 | cron、systemd、文件隐藏等 |
| macOS信息收集 / macOS隐匿与权限维持 | macOS 枚举与维持 |
上线后,右键菜单仅展示与 当前主机会话系统 匹配的项。
4.2 tools 目录(需自行准备的常见文件)
部分菜单依赖 tools/ 下的二进制,请参考 EasyShell插件集/tools/MANIFEST.txt:
| 文件 | 用途 |
|---|---|
postex_helper.exe | getsystem、rev2self 等(构建产物,自带) |
bof_helper.exe | BOF 内联执行(构建产物,自带) |
fscan.exe / fscan.o | 内网扫描(有 .o 时优先 BOF,更稳定) |
mimikatz.exe | 凭据抓取 |
AdFind.exe / SharpHound.exe | 域信息 |
hack-browser-data.exe / lazagne.exe | 本地凭据 |
其他 .exe / .o | 按菜单说明按需放入 |
5. 执行方式与输出
5.1 步骤类型一览
插件每一项(叶子菜单)由一条或多条 步骤 组成:
| 类型 | 作用 | 典型场景 |
|---|---|---|
shell | 在目标机执行命令 | whoami、netstat、schtasks |
cd | 切换工作目录 | 进入指定路径后再执行 |
log | 输出提示文字 | 标记阶段开始/说明 |
delay | 等待若干毫秒 | 多步链之间留间隔 |
memory_exec | 内存加载执行文件 | EXE、BOF、PS1、ELF |
credentials_refresh | 刷新控制台凭据库 | 抓取后同步到凭据页 |
search_sensitive | 敏感文件扫描 | 搜索配置、密钥等 |
dump_browser | 浏览器密码协议 | Chromium 系密码 |
5.2 Windows 命令注意事项
菜单中的 shell 命令经 cmd.exe /C 非交互执行,请注意:
- 路径含空格:用引号,如
"C:\Program Files\app.exe" sc服务命令:binPath=、start=等 等号后要有空格schtasks:任务名和/TR路径建议加引号for /L %i:在菜单命令里写%i(不是%%i)- 避免交互命令:
doskey /history、more等无效或会卡住 - 慢命令:避免
wmic product;已安装软件建议用注册表 / PowerShell 查询
5.3 内置占位符
除用户填写的参数外,还支持:
| 占位符 | 含义 |
|---|---|
{{参数名}} | 参数弹窗中用户输入 |
{{es_webdelivery_first}} | 控制台已 Open 的第一条 Web 投递下载地址 |
{{es_webdelivery_0}} … 15 | 按序号取 Web 投递地址 |
{{es_webdelivery_count}} | 已 Open 的投递数量 |
用于「当前会话拉取并运行 Web 投递」等二阶段场景。
6. 内存执行
6.1 执行模式
| 模式 | 适用文件 | 说明 |
|---|---|---|
execute-assembly | .NET EXE/DLL | CLR 内存加载 |
inline-bin | 原生 PE | Donut 或侧车子进程执行 |
inline-execute | .o BOF | 轻量 COFF,推荐 x64 会话 |
powershell | .ps1 | 脚本内存执行 |
shellcode-inject | .raw | 裸 shellcode |
elf | Linux 无扩展名二进制 | Linux 无盘执行 |
服务端会自动优化以降低掉线概率:
- 有同名
.o时优先走 BOF(inline-execute) - 检测到 .NET 程序自动改用
execute-assembly - 大体积 PE 或
postex_helper走侧车 spawn,不经 Donut 同进程
6.2 高危能力正确用法
| 能力 | 正确做法 | 错误做法 |
|---|---|---|
| getsystem | memory_exec + postex_helper.exe,参数 getsystem 3 | shell getsystem 文本命令 |
| Mimikatz | memory_exec + mimikatz.exe + 参数串 | 交互式 mimikatz 输入 |
| 浏览器密码 | dump_browser 步骤 | — |
getsystem 说明: 成功后植入体会以 SYSTEM 令牌自动重启并接替当前会话(同 uid 重连),控制台无需重新选中主机。成功标志:[+] token elevation succeeded 与 [+] elevated implant relaunched。
6.3 配置示例
fscan(EXE + BOF 优先):
{
"type": "memory_exec",
"relPath": "EasyShell插件集/tools/fscan.exe",
"bofRelPath": "EasyShell插件集/tools/fscan.o",
"preferBof": true,
"mode": "inline-bin",
"pluginOs": "windows",
"args": "{{args}}"
}
getsystem:
{
"type": "memory_exec",
"relPath": "EasyShell插件集/tools/postex_helper.exe",
"mode": "inline-bin",
"pluginOs": "windows",
"args": "getsystem 3"
}
relPath 使用正斜杠,前缀为包名 EasyShell插件集/。args 按程序命令行原样传递,不要额外套 cmd 引号。
7. 自定义插件
7.1 包结构
可在 Extensions/ 下新增自己的插件包(文件夹),或直接向 EasyShell插件集 追加菜单。
Extensions/
我的插件包/
main.json
modules/
自定义功能.json
tools/
scripts/
main.json 示例:
{
"menu": "我的插件包",
"order": [
"自定义功能"
]
}
menu:右键菜单根名称order:子模块文件名(不含.json),顺序即菜单展开顺序- 新增模块后必须把名称加入
order,否则不会加载
7.2 模块 JSON 结构
{
"version": 1,
"platforms": ["windows"],
"roots": [
{
"label": "自定义功能",
"children": [
{
"label": "分组一",
"children": [
{
"label": "查看当前用户",
"steps": [
{ "type": "shell", "command": "whoami /all" }
]
},
{
"label": "按端口查连接",
"params": [
{ "key": "port", "label": "端口", "placeholder": "443", "required": true }
],
"steps": [
{ "type": "shell", "command": "netstat -ano | findstr {{port}}" }
]
}
]
}
]
}
]
}
7.3 常用字段
| 字段 | 说明 |
|---|---|
label | 菜单显示名称 |
children | 子菜单(分支节点) |
steps | 执行步骤(叶子节点) |
params | 参数:key、label、placeholder、default、required |
confirm | 执行前确认提示文案 |
platforms | windows / linux / darwin / all,可写在任意节点 |
7.4 完整叶子节点模板
{
"label": "示例菜单",
"confirm": "确定执行?",
"params": [
{ "key": "target", "label": "目标", "placeholder": "192.168.1.1", "required": true }
],
"steps": [
{ "type": "log", "text": "开始执行", "echo": true },
{ "type": "shell", "command": "ping -n 2 {{target}}" },
{ "type": "delay", "ms": 500 },
{
"type": "memory_exec",
"relPath": "EasyShell插件集/tools/工具.exe",
"mode": "inline-bin",
"pluginOs": "windows",
"args": "{{target}}"
}
]
}
修改 JSON 后,在控制台点击 重新加载配置 即可生效。
7.5 并入内置插件集的建议
若扩展的是官方分类,建议合并进 EasyShell插件集/modules/ 对应文件,而不是新建独立包:
| 功能类型 | 合并到 |
|---|---|
| 主机/网络枚举 | Windows信息收集.json |
| 扫描探测 | Windows内网探测.json |
| 域与 AD | Windows域环境.json |
| 提权 | 权限提升.json |
| 凭据/键盘/截图 | 后渗透.json |
| 持久化/痕迹 | Windows痕迹与维持.json |
外来插件建议增加一级分组,如 "label": "我的插件名",其下挂具体菜单,避免与内置项重名。
8. 从 CNA 迁移
若你已有 Cobalt Strike .cna 插件,需转换为 JSON 才能在 EasyShell 中使用。
8.1 核心原则
- EasyShell 不运行
.cna;.cna可保留作参考,运行时忽略 - 把 CNA 的
menu/item映射为 JSON 的children/steps - 二进制功能改为
memory_exec,文件放入tools/或scripts/
8.2 常见 API 对照
| CNA | EasyShell JSON |
|---|---|
bshell($1, "cmd") | { "type": "shell", "command": "cmd" } |
blog($1, "提示") | { "type": "log", "text": "提示", "echo": true } |
bcd($1, "路径") | { "type": "cd", "path": "路径" } |
bpause($1, 2000) | { "type": "delay", "ms": 2000 } |
prompt_text / 简单 dialog | params + 命令里 {{key}} |
bexecute_assembly | memory_exec + execute-assembly |
beacon_inline_execute + .o | memory_exec + inline-execute |
binput + alias | 找到 alias 实现,转为对应 steps |
不易直接迁移的: bdllspawn(反射 DLL)、bupload 落盘链、复杂 if 分支、CS 界面函数(openListenerManager 等)——需改写成内存执行或拆成多个固定菜单项。
8.3 自动转换(初稿)
仓库提供脚本,可批量转换 简单 shell 类 CNA:
python tools/convert_cna_to_manifest.py --pack Extensions/你的插件包
- 输入:
你的插件包/modules/*.cna - 输出:同名
modules/*.json - 支持:
bshell、blog、bcd、简单prompt_text - 不支持:
beacon_*、程序集、BOF、复杂 dialog → 需人工补充
8.4 推荐迁移流程
1. 按 CNA 的 menu 划分模块
2. 运行 convert_cna_to_manifest.py 生成 JSON 初稿
3. 手工处理:
- bexecute_assembly → memory_exec + tools/
- beacon_inline_execute → .o 放入 tools/ + inline-execute
- 复杂 dialog → 拆成多个菜单或简化为 params
- Windows 命令改为 cmd /C 友好写法
4. 复制 EXE/BOF/PS1 到 EasyShell插件集/tools 或 scripts/
5. 合并进 modules/*.json,更新 main.json 的 order
6. 控制台重新加载并实测
8.5 转换案例
案例 1 — 简单命令:
CNA:
item "systeminfo" {
bshell($1, "systeminfo");
}
JSON:
{
"label": "systeminfo",
"steps": [{ "type": "shell", "command": "systeminfo" }]
}
案例 2 — 带参数:
CNA:
item "Ping 扫描" {
$subnet = prompt_text($1, "subnet", "网段前三段", "192.168.1");
bshell($1, "for /L %i in (1,1,254) do @ping -n 1 -w 100 $subnet.%i");
}
JSON:
{
"label": "Ping 扫描",
"params": [
{ "key": "subnet", "label": "网段前三段", "placeholder": "192.168.1", "required": true }
],
"steps": [
{
"type": "shell",
"command": "for /L %i in (1,1,254) do @ping -n 1 -w 100 {{subnet}}.%i | findstr /i \"TTL=\""
}
]
}
案例 3 — .NET 程序集:
CNA:bexecute_assembly($bid, script_resource("scripts/Tool.exe"), $args)
步骤:
- 复制
Tool.exe→EasyShell插件集/tools/Tool.exe - JSON:
{
"type": "memory_exec",
"relPath": "EasyShell插件集/tools/Tool.exe",
"mode": "execute-assembly",
"pluginOs": "windows",
"args": "{{args}}"
}
案例 4 — BOF:
CNA:beacon_inline_execute + wifipasswords.o
步骤:
- 复制
.o→EasyShell插件集/tools/wifipasswords.o - JSON:
{
"type": "memory_exec",
"relPath": "EasyShell插件集/tools/wifipasswords.o",
"mode": "inline-execute",
"pluginOs": "windows",
"args": ""
}
8.6 转换后检查清单
- [ ]
main.json的order已包含新模块名 - [ ]
tools//scripts/中文件已就位 - [ ]
relPath路径正确(正斜杠,以EasyShell插件集/开头) - [ ] 高危项已加
confirm - [ ] 控制台重新加载后菜单可见、执行有回显
更完整的 CNA 案例与 AI 辅助转换:仓库内
skills/cna-to-easyshell/(供 Cursor AI 等使用)。
9. 常见问题
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 菜单为空 | 未登录、Extensions 路径不对 | 确认已登录;检查 easyshell.exe 同级是否有 Extensions/ |
| 某项不显示 | 系统不匹配 | 检查 JSON 中 platforms 是否包含当前主机会话系统 |
| 执行无回显 | 主机休眠长、离线 | 点输出坞「刷新」;确认主机在线 |
| memory_exec 报错 400 | 文件缺失、位数不匹配 | 核对 tools/ 是否有对应文件;x86/x64 是否与会话一致 |
| 执行后短暂掉线 | 大 EXE 同进程 Donut | 提供同名 .o BOF,或改用 execute-assembly |
| schtasks / reg 失败 | 引号问题 | 参数用 {{变量}} 模板,勿在弹窗中手填多余引号 |
| PowerView 等 PS1 失败 | 脚本未部署 | 检查 scripts/ 路径与 relPath 是否一致 |
| 修改 JSON 不生效 | 未刷新 | 脚本菜单页点击 重新加载配置 |
附录:文件位置速查
| 路径 | 说明 |
|---|---|
Extensions/EasyShell插件集/ | 内置插件包 |
Extensions/EasyShell插件集/main.json | 模块加载顺序 |
Extensions/EasyShell插件集/modules/*.json | 菜单定义 |
Extensions/EasyShell插件集/tools/ | 内存执行二进制 |
Extensions/EasyShell插件集/tools/MANIFEST.txt | 工具清单说明 |
tools/convert_cna_to_manifest.py | CNA 自动转换脚本(让ai参考,直接修改复用即可) |
文档版本:与 EasyShell Extensions 脚本菜单功能同步维护。















请登录后查看评论内容