CVE-2024-47575 漏洞分析及三种利用方式

CVE-2024-47575 漏洞分析及三种利用方式

原创 p1Kk 奇安信天工实验室 2025-06-04 03:30

一、前  言

二、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分析过程和其他利用方式的学习

FGFM

FortiManager的FGFM功能允许管理员对FortiGate设备进行集中管理和配置。管理员可以通过FortiManager来查看和配置托管设备的接口、HA、DNS等设置,并进行路由管理。此外,FGFM还支持通过修订历史记录进行故障排除,帮助管理员识别和解决配置相关的问题‌。

在FortiManager中处理FGFM请求的是fgfmsd进程,通过TCP端口541建立的SSL连接运行。

01

FGFM协议结构

在之前对FortiGate-FGFM协议的分析中,我们用一种比较粗略的方式生成了合法的FGFM请求头,满足请求头第三字节低位等于1,第四字节小于等于2,以及长度检查;然后导出合法的Fortigate证书建立连接。

screenshot (1).png

1.png

但这次分析
重新抓取fgfm请求可以得到原始请求格式。

screenshot (2).png

screenshot (3).png

分为几个部分:
– magic_number == b’\x36\xe0\x11′

  • msg_type*   eg b’\x00′

  • len

  • command     eg ‘put script’

  • key-value      eg ‘devid=0’

  • param_end == ‘\r\n’

  • end == ‘\r\n\r\n’

*请求头第四字节决定了不同的分支

2.png

漏洞利用方式一

以7.4.1版本为分析目标。

请求


为type 0

,根据不同的command 返回的
request_type
调用函数表
0x42EB77
中对应的处理函数:

3.png

4.png

当客户端C请求
get connect_tcp
时:

screenshot (4).png

服务器S响应:

screenshot (5).png

客户端C请求
localid
 = 服务器S返回
remoteid

服务器S同时也会返回一个
localid
用于对应
C-localid

S-remoteid
,标识信道。

负责处理
get connect_tcp
请求的是
connect_tcp
函数:

screenshot (6).png

5.png

svc http监听该套接字,并在
libfmgsvrd.so
中可以找到定义和回调函数:

screenshot (7).png

screenshot (8).png

dmworker
让我联想到之前的分析中,在
libdmserver.so

off_FE84C0
路由表注册了多个函数,最终在
rcs/checkout
对应函数
dmworker_rcs_checkout
中发现命令注入:

screenshot (9).png

screenshot (10).png

screenshot (11).png

查看使用
libdmserver.so
的进程,可以锁定
dmworker

screenshot (12).png

启动
dmworker
调试可以捕获json请求格式:

screenshot (13).png

该注入可通过认证后HTTP请求触发,但如何通过fgfm请求触发?

继续分析fgfmsd,如果请求
type 2
会进入
fgfm_chan_handler
函数,通过
localid
标识 发送请求数据:

screenshot (14).png

screenshot (15).png

那么请求格式为:

screenshot (16).png

发送该请求测试,并调试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

screenshot (17).png

svc_rpc_uclient

libsvcclt.so
中定义,通过对RPC调用终止位置进一步逆向分析,发现它通过
Unix
套接字进入了
fdssrvd

在该文件中发现可以通过
put_json_cmd
接口访问的函数表,其中
som/export
对应的函数中存在命令注入:

screenshot (18).png

要触发
som/export
需要请求
get file_exchange
命令分配文件传输句柄。

客户端请求:

screenshot (19).png

服务器响应:

screenshot (20).png

同上面的分析,不通过
type 2
而是通过
channel
命令指明
localid
同样可以达到
sub_40BB6D
发送请求。

watchtowrLabs在文末也分析了漏洞
patch
并发现了利用方式一的命令注入
patch
点但不知如何触发,相比该利用过程,第一种利用方法有点复杂走远了。

漏洞利用方式三

在学习attackerkb
这篇文章对7.6.0版本的分析时,可以发现一些与7.4版本的不同之处。

同样请求
get connect_tcp
,对应函数
sub_1B978

screenshot (21).png

screenshot (22).png

此时只是生成了一个 
shell
,可通过
channel
请求 -> 调用
fgfm_sock_write
将输入和输出传输到服务器创建的新 FGFM通道(和前面原理一样通过
localid
匹配)。

总  结

本文分享了三种针对CVE-2024-47575的利用方式,该漏洞成因是与未授权的设备建立不安全通信,结合(认证后)命令注入点实现远程代码执行。同时在漏洞刚披露时,我选择7.4大版本进行漏洞分析,随着网上漏洞分析文章的公开,对比7.4版本,7.6版本中的漏洞点非常明显利用也较简单,因此大家在以后做漏洞挖掘时可以多个大版本对比分析。

【版权说明】

【版权说明】

本作品著作权归p1Kk
所有

未经作者同意,不得转载

头像.png

p1Kk

天工实验室安全研究员

专注于iot漏洞挖掘与利用

往期回顾

01

通用Linux x64内核态shellcode编写技巧

02

基于路由转发导致的权限认证绕过漏洞分析

03

隐匿与追踪:Rootkit检测与绕过技术分析

04

二进制混淆对抗技术研究

每周三更新一篇技术文章  点击关注我们吧!