CVE-2023-36845 Juniper SRX EX 远程命令执行漏洞
漏洞信息
漏洞名称:CVE-2023-36845 Juniper SRX EX 远程命令执行漏洞
影响应用:瞻博网络 Junos OS 的 SRX 防火墙和 EX 交换机系列产品
漏洞介绍:Web 服务器存在环境变量注入漏洞,通过控制 PHPRC ( PHP 环境变量 )影响 PHP 配置文件,使用配置文件中的 auto_prepend_file 进行文件包含,导致代码执行、文件泄露等危害。本漏洞和 J-Web 的代码无关,而是其使用的 Web 服务器的原因。
漏洞利用:上面虽然说到可代码执行,但 Juniper 有开发了一个 Veriexec 工具,它会限制住系统命令执行( ls 、id 啥的有点用的都不行 ),而且 J-Web 运行在 FreeBSD Jail ( 每个 Jail 环境都有其独立的文件系统、进程空间和网络堆栈),所以说这个代码执行并不能去执行系统命令,只能够利用 PHP 代码去做一些事情。
所以该漏洞的危害是从其他方面去入手的,不过同样有限制:J-Web 的登录凭证会存储到 /var/sess/ 目录下 ( 别人登录后,有效 1 h ),我们可以利用 PHP 代码去获取该目录下的文件名,其文件名就是凭证值,然后在 Cookie 加入该值就可以登录 J-Web 后台,控制防火墙、交换机设备。
应用介绍:Juniper Networks Junos OS EX 是美国瞻博网络(Juniper Networks)公司的一套专用于该公司的硬件设备的网络操作系统。该操作系统提供了安全编程接口和 Junos SDK。
Juniper Networks Junos OS EX 存在安全漏洞,该漏洞源于J-Web模块存在PHP外部变量修改漏洞。允许未经身份验证的网络攻击者控制某些重要的环境变量。攻击者利用特制请求可以修改某个PHP环境变量,造成部分完整性损失,这可能允许链接到其他漏洞。
修复介绍:官方给的修复方式就是禁用 J-Web 组件,使用客户端去进行设备管理。禁用 J-Web 后虽然该漏洞仍然存在,但无法获取凭证登录后台了。
环境搭建
下载个 ova 文件导入虚拟机中然后配置 J-Web 就可以了,官网要注册,找了一个百度云的:
链接:https://pan.baidu.com/s/14AOCwCxMWLL6ok35pcSVdQ?pwd=6ee4
进去后改下网络适配器 NAT:
安装完成后,登录 root 用户,空密码,然后去开启 J-Web:
1 |
|
密码就是之前设置的密码。
J-Web 组件代码在 /packages/mnt/jweb-srxtvp-8ae76b91/jail/html
目录下。
利用原理
auto_prepend_file 是 php.ini 中的一项配置,其作用相当于 php 代码 require 或 include,这个参数表示php程序加载应用程序前加载指定的php文件。
allow_url_include 是否允许 include/require 打开 URL 作为文件处理。
在本地先搞一下,修改 php.ini:
1 |
|
然后在写一个用于访问的 php 文件:
访问后就可以看到其加载了 phpinfo.php :
再看一下 PHPRC 环境变量,这个环境变量是可以控制 php.ini 的,这个漏洞就是这个环境变量可控,然后导致的代码执行漏洞。
这个漏洞利用原理就是这样,PHPRC 可控导致代码执行。
漏洞分析
关于 CVE-2023-36845 漏洞官方的介绍和修复都非常简单:
……..
该应用使用的是 CGI 模式,其执行流程如下:
客户端请求: 用户通过浏览器发送HTTP请求到Web服务器。
Web服务器检测CGI: Web服务器检查请求的URL,如果它指向一个CGI脚本,就会触发CGI处理。
环境变量设置: Web服务器为CGI脚本设置一些环境变量,这些变量包含了有关请求的信息,例如请求方法(GET或POST)、查询字符串、请求头等。
CGI脚本执行: Web服务器启动一个新的进程,运行指定的CGI脚本。脚本接收到环境变量和请求数据。
处理请求: CGI脚本根据环境变量和请求数据生成响应内容,通常是HTML页面。
响应发送: 生成的响应被发送回Web服务器。
Web服务器发送响应: Web服务器将响应发送回客户端浏览器,完成HTTP请求-响应周期。
操作环境变量的很明显就应该是 Web 服务器这里了。
Web 服务器在 /packages/mnt/jweb-srxtvp-8ae76b91/usr/sbin 就一个可执行文件:
可以看到 appweb.conf ,它是基于 appweb 开发而来的,搜一下跟环境变量有关的就这个了:
appweb 是 Embedthis 开发的一款嵌入式 web 服务器,Embedthis 旗下还有 GoAhead 项目,也是一个比较出名的嵌入式 web 服务器。这个项目有 CVE-2017-17562 以及 CVE-2021-42342 这两个 goahead 的环境变量注入漏洞,成因是代码在处理用户提交的参数时没有合理限制敏感字符,导致可以注入如 LD_PRELOAD 等关键环境变量。
看不到代码,也没有具体的介绍,就只能猜测该漏洞可能是 Juniper 在 Web 服务器 appweb 这里导致了环境变量注入漏洞。网上也没找到具体的说明。
漏洞利用
这个漏洞的利用方式的有个发展过程,漏洞发布的时候评分 5.3 ,不过在和 CVE-2023-36846 组合起来利用的时候,达成 RCE 效果,组合评分 9.8。在 watchtowr 的文章中,其研究通过 CVE-2023-36846 ( 未授权文件上传漏洞 ) 上传 php 和 ini 文件,然后利用 CVE-2023-36845 修改 PHPRC指向上传的 ini 文件,从而造成文件包含代码执行。
随后 vulncheck 的 Jacob Baines 发现了一条单洞就可以代码执行的利用方式,然后评分升级了:
这个 CVE-2023-36846 是因为 do_upload 函数,也就是进行文件上传的,没有对文件上传做限制,导致可以上传文件到 /var/tmp/ 目录下,上传 ini 和 php 文件,然后在设置 /?PHPRC=/var/tmp/xxx.ini,这就导致了文件包含。
而 vulncheck 发现的这种利用方式,也就是在上面那本地测试的那种,利用 data:// 内嵌文件进行包含。
这里去执行一下系统命令:
这个就是 Veriexec 导致的了,也是因为这个东西 watchtowr 才使用了 PHPRC + ini 文件包含的利用手法,而不是使用 LD_PRELOAD 环境变量加载动态链接库进行命令执行( CVE-2017-17562 的利用手法 )。
由于存在 Veriexec 导致不能够去进行命令执行,就只能是去找其他的利用方法:
在 /packages/mnt/jweb-srxtvp-8ae76b91/jail/html/core/user.php 中,可以看到它会把 session 保存为 “$sessPath/sess_“ . $cookie_value 并且其判断登录也是靠的这个文件是否存在。
这里就是直接登录一下,在系统里面找下文件:
/var/jail/sess/和那个目录下都有,那使用 PHP 读取该目录下的文件:
1 |
|
然后伪造 PHPSESSID 进行登录即可,这里要注意:
http 是 PHPSESSID,https 是 SECUREPHPSESSID:
刷新页面即可进入后台,不过这个 PHPSESSID 有效时常是 1 h,还需要对方也正在登录,没有退出的情况才有用:
漏洞修复就是关闭 J-Web,访问后就类似于这种,后台无法利用:
问题出现在 web 服务器,所有就算关闭 J-Web 也同样可以利用,不过后台无法利用的话其实这个漏洞很难在往下去利用了,目前的危害就是可以执行 PHP 代码获取一些信息或者能使用 PHP 代码对内网进行探测:
MSF 中也有对该漏洞的利用:
从它的 payload 路径就可以看到其归类到 freebsd 这里了。
它最后的利用是去依靠 FreeBSD Jail 启用逃逸模式,然后去利用 Juniper J-Web 后台的某些功能去重写真实系统上的 ssh 密码密码。
不过前提就是 JAIL_BREAK 要开启,这个 Juniper 应该是不会给默认开启的:
找了一下,没开
那么这个漏洞的危害就是代码执行( 达不到执行系统命令 )、登录后台操作设备了。