SP1R4/CMDR

GitHub: SP1R4/CMDR

CMDR 是一个为 CTF 选手和开发者设计的命令行管理器,支持参数化命令、工作区隔离、链式执行、加密保护和报告生成。

Stars: 0 | Forks: 0

# CMDR v3.1 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/SP1R4/CMDR/actions/workflows/ci.yml) ![License](https://img.shields.io/github/license/SP1R4/CMDR?color=black) ![Top language](https://img.shields.io/github/languages/top/SP1R4/CMDR) ![Last commit](https://img.shields.io/github/last-commit/SP1R4/CMDR) **专为 CTF 选手和开发者打造的命令管理器** 通过工作区、主机、环境变量、playbook、输出捕获、发现结果以及可扩展的命令包来存储、组织和运行 shell 命令。 [功能](#features) · [安装说明](#installation) · [快速开始](#quick-start) · [CTF 工作流](#ctf-workflow) · [开发工作流](#dev-workflow) · [命令参考](#command-reference)
## 功能 | 功能 | 描述 | |---------|-------------| | **命令管理** | 存储、打标签、搜索、设置别名并即时运行命令 | | **参数化命令** | `nmap {TARGET} -sV`;支持 `{VAR:=default}` 和 `{VAR:?}` (必填) 形式 | | **主机/目标模型** | 清单管理主机;`@name` / `--on` / `--all-hosts` 会填充 `{TARGET}` 等 | | **输出捕获 → 链式执行** | `--capture VAR[:regex]` 将命令的 stdout 传递到环境变量中 | | **远程执行** | `--on ` 通过 SSH 运行已存储的命令 | | **发现与报告** | 结构化的发现结果 + Markdown 评估报告 (`--report`) | | **运行历史** | 记录运行历史;`--history`;使用 `-r last` 重新运行 | | **加密工作区** | 将工作区在静态下锁定为加密的 blob (age/gpg) | | **危险标志** | `--danger` 命令在运行前总是会要求确认,即使使用了 `-y` | | **模糊选择器** | `--pick` (或直接使用 `cmdr`) 通过 fzf 模糊查找命令 | | **工作区** | 为每个项目或测试任务隔离命令存储 | | **环境变量** | 设置一次 `TARGET=10.10.10.1`,即可在处处使用 `{TARGET}` | | **Playbook** | 将命令串联为命名的、可复用的序列 | | **输出捕获** | 保存带有时间戳的命令输出 (`--save`) | | **命令包** | 为 CTF 和开发预构建的命令集 | | **项目级本地命令** | 每个仓库的 `.cmdr.json`,通过 `--local` 使用 (需通过信任验证) | | **笔记** | 为命令附加带有时间戳的笔记 | | **剪贴板复制** | 将解析后的命令复制到剪贴板 (`-c`) | | **Tab 补全** | 支持 Bash 和 Zsh | | **试运行 / 撤销** | 预览 (`-n`) 和单层撤销 (`-u`) | ## 安装说明 ``` git clone https://github.com/SP1R4/CMDR.git cd CMDR ./install.sh ``` 安装程序将会: - 如果缺失则安装 `jq` (支持 apt, dnf, yum, pacman, brew) - 设置文件权限 - 提供别名或 `~/.local/bin` 符号链接安装选项 - 启用 Tab 补全 安装完成后: ``` cmdr -h ``` ## 快速开始 ``` # 添加命令 cmdr -a serve 'python3 -m http.server 8080' dev --desc 'Quick HTTP server' # 使用 alias 添加 cmdr -a scan 'nmap {TARGET} -sV' security --desc 'Service scan' --alias s # 设置 env 变量 cmdr --env TARGET=10.10.10.1 # 运行它(TARGET 从 env 自动填充) cmdr -r scan # 或直接传递 args cmdr -r scan 192.168.1.1 # Dry-run 以预览 cmdr -n -r scan # 复制到剪贴板而不是运行 cmdr -c scan # 显示所有命令 cmdr -s # 搜索 cmdr -f nmap ``` ## CTF 工作流 ``` # 1. 为 engagement 创建一个 workspace cmdr -w htb-box # 2. 加载 CTF command packs cmdr --pack load ctf-network cmdr --pack load ctf-web cmdr --pack load ctf-privesc # 3. 清点 targets(填充 {TARGET}/{OS}/{RUSER}/{RPORT}) cmdr --host add 10.10.10.50 --name box1 --os linux cmdr --host add 10.10.10.51 --name box2 --os windows --user administrator cmdr --env LPORT=4444 # 4. 对 host 进行 Recon cmdr -r quick-scan @box1 --save cmdr -r dirfuzz @box1 --save # 5. 串联 auth flow:捕获 token,在下游重用它 cmdr -r login @box1 --capture 'TOKEN:eyJ[A-Za-z0-9._-]+' cmdr -r list-users @box1 # uses {TOKEN} # 6. 记录结构化 findings(稍后用于填充报告) cmdr --finding high box1 "Unauth API at /admin" --evidence outputs/dirfuzz_*.log cmdr --finding medium box1 "Tomcat 9.0 — CVE candidate" # 7. 可复用的 recon playbook,然后扇出到每个 host cmdr --playbook recon quick-scan dirfuzz nikto-scan cmdr -r quick-scan --all-hosts --save # 8. 拥有 creds 后远程运行 privesc cmdr -r linpeas --on box2 # 9. 审查并生成交付物 cmdr --findings cmdr --history cmdr --report engagement.md # 10. 锁定静态的 engagement workspace,切换回默认值 cmdr --lock-workspace htb-box cmdr -w default ``` ## 开发工作流 ``` # 1. 全局加载 dev packs(在默认 workspace 中) cmdr --pack load dev-python cmdr --pack load dev-docker cmdr --pack load dev-git # 2. 添加 project-local 命令 cmdr --local -a build 'make -j$(nproc)' dev --desc 'Build project' cmdr --local -a test 'python3 -m pytest -v tests/' dev --desc 'Run tests' cmdr --local -a lint 'flake8 . && mypy .' dev --desc 'Lint check' # 3. 创建 CI 风格的 chain cmdr --playbook ci lint test build # 4. 运行它 cmdr -p ci # 5. 快速的 git workflow cmdr -r glog # Pretty git log cmdr -r git-branch-clean # Clean merged branches ``` ## 工作区 工作区用于隔离命令、环境变量、笔记、playbook 和输出。 ``` cmdr -w myproject # Switch to workspace cmdr -w # Show active workspace cmdr -W # List all workspaces cmdr -w default # Return to default workspace ``` ## 环境变量 针对特定工作区的变量,在运行时自动替换 `{KEY}` 占位符。 ``` cmdr --env TARGET=10.10.10.1 # Set cmdr --env PORT=8080 # Set another cmdr --env # Show all cmdr --env-clear PORT # Remove one ``` 解析顺序:首先替换环境变量,然后剩余的 `{placeholders}` 将通过位置参数填充或以交互方式提示输入。 ## Playbook 与链式执行 ``` # 创建命名的 playbook cmdr --playbook recon quick-scan dirfuzz nikto-scan # 运行它 cmdr -p recon # 列出所有 playbooks cmdr --playbooks # 一次性 chain(不保存) cmdr --chain cmd1 cmd2 cmd3 # Dry-run 一个 playbook cmdr -n -p recon ``` Playbook 和链式执行在首次失败(非零退出)时即停止。 ## 命令包 `packs/` 目录下预构建的命令集。 ``` cmdr --pack list # See available packs cmdr --pack load ctf-web # Load a pack ``` | 包 | 命令 | 分类 | |------|----------|----------| | `starter` | 实用的系统管理员/网络/开发/安全单行命令 | mixed | | `ctf-network` | nmap 扫描, enum4linux, netcat, DNS | ctf-recon, ctf-enum, ctf-exploit | | `ctf-web` | ffuf, gobuster, sqlmap, nikto, wfuzz | ctf-web | | `ctf-privesc` | SUID, capabilities, cron, sudo, linpeas | ctf-privesc | | `dev-python` | venv, pytest, flake8, http.server | dev-python | | `dev-docker` | build, run, compose, prune, exec | dev-docker | | `dev-git` | log, undo, amend, stash, branch cleanup | dev-git | ## 笔记与输出捕获 ``` # 将 finding 附加到命令 cmdr --note scan "Found port 8080, Apache Tomcat 9.0" # 查看笔记 cmdr --notes scan # For one command cmdr --notes # All notes # 保存命令输出 cmdr -r scan --save # 查看已保存的输出 cmdr --outputs # All cmdr --outputs scan # Filtered ``` ## 项目级本地命令 在任何目录下放置一个 `.cmdr.json`。CMDR 会将其与你的全局/工作区命令合并,以便其标签能从该目录下使用。本地条目具有优先权(深合并:你在本地省略的字段将回退使用相同标签的全局条目)。 ``` # 添加到本地文件 cmdr --local -a build 'make -j4' dev # 显示在 "Project-Local" 部分下 cmdr -s # 正常运行(优先从本地解析) cmdr -r build ``` ### 信任模型(重要) `.cmdr.json` 包含 CMDR 将要执行的 shell 命令。为了避免运行 来自你刚 `cd` 进入的目录(例如刚克隆的、不受信任的 仓库)中的命令,**本地文件会被忽略,直到你明确信任它们**: ``` cmdr --trust # approve the current dir's .cmdr.json after reviewing it cmdr --untrust # revoke trust ``` - 使用 `cmdr --local -a ...` 编写本地文件时会自动对其建立信任。 - 信任是基于文件的**内容哈希**锁定的 —— 如果文件发生改变,信任将被 撤销,直到你重新运行 `cmdr --trust`。在重新信任之前请审查 diff。 - 信任记录会在 `.cmdr_trusted.json` 中全局保存,以绝对路径为键。 ## 主机与目标定位 构建针对特定工作区的主机清单,然后针对主机执行命令。选择一个 主机会填充 `{TARGET}`/`{RHOST}` (ip 或 hostname), `{RHOSTNAME}`, `{OS}`, `{RUSER}`, `{RPORT}`。 ``` cmdr --host add 10.10.10.5 --name dc01 --os windows --user admin --port 5985 cmdr --host list cmdr --host rm dc01 cmdr -r smbscan @dc01 # fill host vars for one host cmdr -r nmap --all-hosts # run once per defined host cmdr -r linpeas --on dc01 # execute over SSH (uses user/port from the host) ``` ## 输出捕获 → 链式执行 将命令的 stdout 传递到工作区环境变量中,然后在下一条命令中使用它 —— 非常适合用于 token、会话 ID 以及多步骤的渗透利用。 ``` cmdr -r login --capture TOKEN # whole (trimmed) stdout -> {TOKEN} cmdr -r login --capture 'TOKEN:eyJ[A-Za-z0-9._-]+' # first regex match -> {TOKEN} cmdr -r get-users # command references {TOKEN} ``` ## 占位符形式 ``` {VAR} env var, else next positional arg, else interactive prompt {VAR:=default} env var, else next positional arg, else 'default' (no prompt) {VAR:?} env var, else next positional arg, else hard error (required) ``` ## 发现与报告 ``` cmdr --finding high dc01 "Unauth WinRM" --evidence outputs/winrm_x.log cmdr --finding low - "Verbose banner" # '-' = no specific host cmdr --findings # list, ordered by severity cmdr --report engagement.md # markdown report (hosts/findings/notes/history) ``` ## 运行历史 ``` cmdr --history # recent runs (exit codes, host, command) cmdr --history 50 # last 50 cmdr -r last # re-run the most recent command (alias: cmdr -r !) ``` ## 危险命令 标记破坏性命令,使它们总是提示确认 —— 即使在 `-y` 下或 在 playbook 内部。它们在 `cmdr -s` 中会显示红色的 `[!]`。 ``` cmdr -a wipe 'rm -rf {DIR}' ops --danger cmdr -r wipe /data # prompts "Run this command marked dangerous? (y/N)" ``` ## 加密工作区 将命名的工作区在静态下加密为单个 blob (使用 `age`,回退使用 `gpg`)。锁定时会移除明文目录,并在解锁时恢复。 ``` cmdr -w client-x # work in a named workspace cmdr --lock-workspace client-x # -> workspaces/client-x.cmdrlock, prompts passphrase cmdr --unlock-workspace client-x # decrypt and restore ``` ## 模糊选择器 ``` cmdr --pick # fuzzy-find a command with fzf and run it cmdr # bare invocation on a TTY also opens the picker (falls back to -m) ``` ## 命令参考 ### 核心命令 | 标志 | 用法 | 描述 | |------|-------|-------------| | `-a` | `cmdr -a [cat] [--desc ..] [--alias ..] [--danger]` | 添加命令 | | `-e` | `cmdr -e [cmd] [cat] [--desc ..] [--alias ..] [--danger]` | 编辑命令 | | `-d` | `cmdr -d [-y]` | 删除(带确认) | | `-s` | `cmdr -s` | 显示所有命令 | | `-r` | `cmdr -r [args..] [@host] [--save] [--capture VAR] [--on host] [--all-hosts]` | 运行命令 | | `-f` | `cmdr -f ` | 搜索命令 | | `-c` | `cmdr -c [args..]` | 复制到剪贴板 | | `--pick` | `cmdr --pick` | 模糊选择命令 (fzf) | ### 工作区与环境 | 标志 | 用法 | 描述 | |------|-------|-------------| | `-w` | `cmdr -w ` | 切换工作区 | | `-w` | `cmdr -w` | 显示当前工作区 | | `-W` | `cmdr -W` | 列出所有工作区 | | `--env` | `cmdr --env KEY=VALUE` | 设置环境变量 | | `--env` | `cmdr --env` | 显示环境变量 | | `--env-clear` | `cmdr --env-clear KEY` | 清除环境变量 | | `--local` | `cmdr --local -a ...` | 使用项目本地的 `.cmdr.json` | | `--trust` | `cmdr --trust` | 信任当前目录的 `.cmdr.json` | | `--untrust` | `cmdr --untrust` | 撤销对当前目录 `.cmdr.json` 的信任 | | `--lock-workspace` | `cmdr --lock-workspace [name]` | 在静态下加密命名工作区 | | `--unlock-workspace` | `cmdr --unlock-workspace ` | 解锁已锁定的工作区 | ### 主机 | 标志 | 用法 | 描述 | |------|-------|-------------| | `--host add` | `cmdr --host add --name [--hostname h] [--os o] [--user u] [--port p]` | 添加/更新主机 | | `--host list` | `cmdr --host list` | 列出主机 | | `--host rm` | `cmdr --host rm ` | 移除主机 | ### 发现与历史 | 标志 | 用法 | 描述 | |------|-------|-------------| | `--finding` | `cmdr --finding "title" [--evidence path]` | 记录一项发现 | | `--findings` | `cmdr --findings` | 列出发现 | | `--report` | `cmdr --report [file]` | 渲染 Markdown 报告 | | `--history` | `cmdr --history [n]` | 显示最近的运行历史 | ### Playbook 与链式执行 | 标志 | 用法 | 描述 | |------|-------|-------------| | `--playbook` | `cmdr --playbook ` | 创建 playbook | | `-p` | `cmdr -p ` | 运行 playbook | | `--playbooks` | `cmdr --playbooks` | 列出 playbook | | `--chain` | `cmdr --chain ` | 按顺序运行命令 | ### 笔记、输出与包 | 标志 | 用法 | 描述 | |------|-------|-------------| | `--note` | `cmdr --note "text"` | 添加笔记 | | `--notes` | `cmdr --notes [tag]` | 显示笔记 | | `--outputs` | `cmdr --outputs [tag]` | 显示已保存的输出 | | `--pack` | `cmdr --pack list` | 列出包 | | `--pack` | `cmdr --pack load ` | 加载包 | ### 通用 | 标志 | 用法 | 描述 | |------|-------|-------------| | `-x` | `cmdr -x ` | 将命令导出为 JSON | | `-l` | `cmdr -l ` | 导出日志 | | `-i` | `cmdr -i ` | 导入命令 (合并) | | `-m` | `cmdr -m` | 交互模式 | | `-u` | `cmdr -u` | 撤销上次更改 | | `-n` | `cmdr -n` | 试运行模式 | | `-v` | `cmdr -v` | 调试日志 | | `-V` | `cmdr -V` | 显示版本 | | `-h` | `cmdr -h` | 显示帮助 | ## 开发与测试 CMDR 是纯 Bash + `jq`,没有构建步骤。在提交更改之前进行 Lint 和测试: ``` shellcheck -x -S warning cmdr.sh cmdr_functions.sh install.sh tests/run.sh bash tests/run.sh ``` CI 会在每次推送时运行这两者。请参阅 [CONTRIBUTING](CONTRIBUTING.md) 获取指南, 并参阅 [CHANGELOG.md](CHANGELOG.md) 获取发布说明。 ## 许可证 [MIT](LICENSE) © SP1R4
标签:PE 加载器, 内存分配, 工作流, 应用安全, 效率工具, 网络调试, 自动化