一、前 言
二、FGFM
三、漏洞利用方式一
四、漏洞利用方式二
五、漏洞利用方式三
六、总 结
2024年10月23日,Fortinet官方发布了针对CVE-2024-47575的安全公告:
A missing authentication for critical function vulnerability [CWE-306] in FortiManager fgfmd daemon may allow a remote unauthenticated attacker to execute arbitrary code or commands via specially crafted requests.
表明该漏洞存在于fgfmd服务中,可能允许远程未经身份验证的攻击者通过特制的请求执行任意代码。本文主要分享之前对CVE-2024-47575的1day分析过程和其他利用方式的学习
FortiManager的FGFM功能允许管理员对FortiGate设备进行集中管理和配置。管理员可以通过FortiManager来查看和配置托管设备的接口、HA、DNS等设置,并进行路由管理。此外,FGFM还支持通过修订历史记录进行故障排除,帮助管理员识别和解决配置相关的问题。
在FortiManager中处理FGFM请求的是fgfmsd进程,通过TCP端口541建立的SSL连接运行。
FGFM协议结构
在之前对FortiGate-FGFM协议的分析中,我们用一种比较粗略的方式生成了合法的FGFM请求头,满足请求头第三字节低位等于1,第四字节小于等于2,以及长度检查;然后导出合法的Fortigate证书建立连接。
但这次分析重新抓取fgfm请求可以得到原始请求格式。
分为几个部分:
-
magic_number == b'x36xe0x11'
-
msg_type* eg b'x00'
-
len
-
command eg ‘put script’
-
key-value eg 'devid=0'
-
param_end == 'rn'
-
end == 'rnrn'
*请求头第四字节决定了不同的分支
以7.4.1版本为分析目标。
请求类型为type 0
时,根据不同的command 返回的request_type调用函数表0x42EB77中对应的处理函数:
当客户端C请求get connect_tcp时:
服务器S响应:
客户端C请求localid = 服务器S返回remoteid。
服务器S同时也会返回一个localid用于对应C-localid和S-remoteid,标识信道。
负责处理get connect_tcp请求的是connect_tcp函数:
svc http监听该套接字,并在libfmgsvrd.so中可以找到定义和回调函数:
dmworker让我联想到之前的分析中,在libdmserver.so中off_FE84C0路由表注册了多个函数,最终在rcs/checkout对应函数dmworker_rcs_checkout中发现命令注入:
查看使用libdmserver.so的进程,可以锁定dmworker:
启动dmworker调试可以捕获json请求格式:
该注入可通过认证后HTTP请求触发,但如何通过fgfm请求触发?
继续分析fgfmsd,如果请求type 2会进入fgfm_chan_handler函数,通过localid标识 发送请求数据:
那么请求格式为:
发送该请求测试,并调试svc httpd进程发现会对(un)compressed_data检查是否为合法的HTTP请求格式,合法才会转发,将(un)compressed_data设置为合法的POST /jsonrpc请求头+dmworker请求体即可触发漏洞。
第二种利用方法来自watchtowrLabs。
在分析get请求时发现一条命令put_json_cmd,当参数file_exch_cmd=put_json_cmd时进入下面的处理逻辑,解析json对象并将其传递给svc_rpc_uclient:
svc_rpc_uclient在libsvcclt.so中定义,通过对RPC调用终止位置进一步逆向分析,发现它通过Unix套接字进入了fdssrvd。
在该文件中发现可以通过put_json_cmd接口访问的函数表,其中som/export对应的函数中存在命令注入:
要触发som/export需要请求get file_exchange命令分配文件传输句柄。
客户端请求:
服务器响应:
同上面的分析,不通过type 2而是通过channel命令指明localid同样可以达到sub_40BB6D发送请求。
watchtowrLabs在文末也分析了漏洞patch并发现了利用方式一的命令注入patch点但不知如何触发,相比该利用过程,第一种利用方法有点复杂走远了。
在学习attackerkb这篇文章对7.6.0版本的分析时,可以发现一些与7.4版本的不同之处。
同样请求get connect_tcp,对应函数sub_1B978:
此时只是生成了一个 shell,可通过channel请求 -> 调用fgfm_sock_write将输入和输出传输到服务器创建的新 FGFM通道(和前面原理一样通过localid匹配)。
本文分享了三种针对CVE-2024-47575的利用方式,该漏洞成因是与未授权的设备建立不安全通信,结合(认证后)命令注入点实现远程代码执行。同时在漏洞刚披露时,我选择7.4大版本进行漏洞分析,随着网上漏洞分析文章的公开,对比7.4版本,7.6版本中的漏洞点非常明显利用也较简单,因此大家在以后做漏洞挖掘时可以多个大版本对比分析。
【版权说明】
本作品著作权归p1Kk所有
未经作者同意,不得转载
天工实验室安全研究员
专注于iot漏洞挖掘与利用
原文始发于微信公众号(奇安信天工实验室):CVE-2024-47575 漏洞分析及三种利用方式
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论