本期作者/0xc4se
近日,Juniper Networks发布安全公告,EX 系列和 SRX 系列(EX 交换机和 SRX 防火墙设备)上瞻博网络 Junos OS 的 J-Web 中的两个 PHP 外部变量修改漏洞允许未经身份验证的基于网络的攻击者控制某些,重要的环境变量。威胁行为者可以发送特制请求来修改某些 PHP 环境变量或通过 J-Web 上传任意文件,无需任何身份验证即可成功利用上述问题,其中SRX 系列防火墙设备受 CVE-2023-36845 & CVE-2023-36846 影响 ,本小节以SRX防火墙为例对这两个漏洞进行分析和复现。
受漏洞影响的设备型号如下:
SRX 系列:
21.1 version 21.1R1 and later versions;
21.2 versions prior to 21.2R3-S6;
21.3 versions prior to 21.3R3-S5;
21.4 versions prior to 21.4R3-S5;
22.1 versions prior to 22.1R3-S3;
22.2 versions prior to 22.2R3-S2;
22.3 versions prior to 22.3R2-S2, 22.3R3;
22.4 versions prior to 22.4R2-S1, 22.4R3;
EX 系列:
All versions prior to 20.4R3-S8;
21.1 version 21.1R1 and later versions;
21.2 versions prior to 21.2R3-S6;
21.3 versions prior to 21.3R3-S5;
21.4 versions prior to 21.4R3-S4;
22.1 versions prior to 22.1R3-S3;
22.2 versions prior to 22.2R3-S1;
22.3 versions prior to 22.3R2-S2, 22.3R3;
22.4 versions prior to 22.4R2-S1, 22.4R3.
本小节使用vsrx 22.4R1.10版本进行测试,设备开启后,使用默认用户名密码:root/空,进行登录。输入cli进行控制界面,输入configure进入设置模式。
set system root-authentication plain-text-password
设置登录用户,并输入commit命令保存配置。
set system login user admin class super-user authentication plain-text-password
设置主机名和ip后配置完成。
set system host-name exploit
set interfaces fxp0 unit 0 family inet address xxx.xxx.xxx.xxx/24
在测试攻击机中访问url,并使用我们设置好的登录用户名和密码进行登录。
首先是未授权文件上传漏洞,我们可以通过poc快速定位到webauth_operation.php文件中,php使用了includes/sajax.php文件,并调用了sajax_init()和sajax_handle_client_request()函数。
我们查看includes/sajax.php文件中,发现sajax_handle_client_request的参数为认证身份参数,并且传进来为false。说明调用sajax_handle_client_request函数并不会触发身份验证。
在sajax_handle_client_request函数的末尾,我们可以看到”$internal_functions”变量,通过打印变量中user的值,我们可以获取150个单独的功能,其中对于我们比较重要的就是文件上传和写入的功能了。
这里我们可以使用文件上传功能,他需要按照指定格式的json数组数据,该数组数据需要包括fileName、fileData和csize,并最终在/var/tmp目录下生成文件。
rs=do_upload&rsargs[0]=[{"fileData":"data:text/html;base64,PD9waHAgcGhwaW5mbygpOz8+","fileName":"test.php","csize":18}]
这里的”PD9waHAgcGhwaW5mbygpOz8+”便是我们要执行的php代码base64编码后的值。
使用burp抓包,并进行修改。POST方法,uri为/webauth_operation.php,data为我们构造好的exp数据。点击send后,返回{“converted_fileName”:{xxx}}即为漏洞利用成功。
此时,我们返回srx防火墙进行查看,jweb-srxtvp-xxx目录下的jail目录即为jweb工作目录。我们进入”./var/tmp”下进行查看,发现我们写入的php代码已经被写入到文件中,我们记录下该文件名称。
接下来我们设置php执行代码的环境变量, PHPRC变量可用于指定 php.ini 配置文件的路径,我们使用PHPRC拼接php ini的地址就可以正常执行。这里我们如何知道未授权用户可以控制关键的环境变量呢,这里通过CataLpa大佬的文章(https://wzt.ac.cn/2023/08/25/juniper202308/),我们知道可以通过构造poc进行测试,来确认是否存在环境注入的问题。
以CataLpa举例请求为例,发送如下请求服务器会返回 502,当去除 LD_PRELOAD 参数时响应又正常。
GET /?LD_PRELOAD=/abcd HTTP/1.1
Host: 127.0.0.1
查看 httpd 的日志 (/packages/mnt/jweb-srxtvp-75913db7/jail/var/log/httpd-trace.log) 存在以下内容
确认了环境变量注入问题,我们开始设计exp数据的内容如下,这里将我们已经写入php的文件路径进行设置:
auto_prepend_file="/var/tmp/f85af77f9cdc3d748675368d4594115484615990cca0b759814d222bed55eb33.php"
auto_prepend_file表示在php程序加载第一个php代码前加载的php文件,也就是先加载了我们的exp数据。
POST方法,uri为/webauth_operation.php,第二次exp使用base64编码后按照指定格式放入data数据中,点击send进行发送。
我们进入设备进行查看,发现ini文件已经正常写入。
将前面步骤响应体中converted_fileName的值”*.ini”进行拼接后进行访问,发现phpinfo()函数已经执行。
当我们返回设备查 J-Web 组件时发现用户登录后 session 令牌会被存放在 “var/sess” 目录下,并且命名具有一定规则。
当我们返回设备查 J-Web 组件时发现用户登录后 session 令牌会被存放在 “var/sess” 目录下,并且命名具有一定规则。
当我们将这俩者一起使用时,就可以获取目标设备的配置信息。其中包括了用户密码等信息。我们可以通过破解或使用命令修改密码来获得远程shell。
当以上步骤都完成时,使用ssh进行连接便可成功获得shell。
这一小节中,我们简单分析和复现了juniper vsrx远程代码执行漏洞,这些漏洞单独看每个评分都不高,但是将多个漏洞联合起来就可以实现远程代码执行,危害较大。但总体来看,该漏洞利用了多个漏洞,防御时只要切断远程代码执行中间的任何一个环节,就可缓解该漏洞危害,目前官方已经发布了安全补丁和相关缓解措施,建议用户即时更新。
原文始发于微信公众号(蛇矛实验室):Juniper SRX远程代码执行漏洞复现分析