GNU Wget 服务器端请求伪造漏洞CVE-2024-10524
GNU Wget(常简称为Wget)是一个在网络上进行自动下载的简单而强大的自由软件,其本身也是 GNU 计划的一部分,使用C语言开发。
GNU Wget 广泛的被Unix和主要的Linux发行版用户所使用,也可以在任何类似Unix的系统以及其他Unix变种操作系统上进行编译和使用。
一、基本情况
GNU Wget 是一个广泛使用的开源命令行工具,主要用于从网络上下载文件,由 GNU 项目开发,用于从各种类型的网络服务器获取文件。
GNU Wget 可以跟踪 HTML 页面的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构,这常被称作 "递归下载"。
在递归下载时,wget 会遵循 Robot Exclusion 标准 (/robots.txt).wget 可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。
GNU Wget 支持 HTTP、HTTPS 和 FTP 协议,可用于从各种的网络服务器获取文件,在带宽很窄的情况下和不稳定网络中有超强适应性。
栋科技漏洞库关注到GNU Wget近期披露一个因解析不当导致的服务器端请求伪造漏洞,该漏洞追踪为CVE-2024-10524,CVSS评分6.5。
二、漏洞分析
CVE-2024-10524源于Wget 1.24.5及之前版本在处理HTTP简写格式URL时解析不当,错误地将包含冒号(:)的用户输入解析为FTP请求。
导致原本应为HTTP请求URL解析为FTP请求,使使用Wget通过简写URL访问远程资源并在URL中传递任意用户凭据的应用程序存在漏洞。
攻击者可以通过控制简写URL中的用户信息部分(例如malwaredomain:aaa@reliableserver)来改变请求目标,将请求发送到恶意服务器。
攻击者在这种情况下可输入伪造凭据,导致Wget访问任意主机、服务器端请求伪造攻击、钓鱼攻击、MITM(中间人)攻击和数据泄露等。
需要明确的是仅当使用易受攻击的Wget版本且攻击者能够控制提供给Wget的简写HTTP URL中的凭据时,CVE-2024-10524才可被利用。
目前该漏洞的技术细节已公开,深入细节和利用:
考虑一个应用程序,该应用程序使用 Wget 通过速记 HTTP 访问远程资源,并在URL 的userinfo部分中传递用户的凭据。例如:
wget user_input@host/file
原则上应用程序应该清理输入并确保它不包含允许命令注入字符,但它应该允许用户输入冒号,和是一个允许成为userinfo一部分的字符。
这很危险,正常来说 Wget 收到类似user:input@example.com/filename 的URL时应向example.com发出 HTTP 请求,请求文件filename。
程序在解析命令行参数后要做的,首先是检查提供给它的 URL 是否以速记格式编写,这是在位于url.c的 rewrite_shorthand_url 中完成的。
该函数接收URL并返回完整URL,URL不是简写的返回NULL,该函数首先检查URL是否为正常完整格式,然后在URL中搜索冒号或斜杠:
char *
rewrite_shorthand_url (const char *url)
{
const char *p;
char *ret;
if (url_scheme (url) != SCHEME_INVALID)
return NULL;
/* Look for a ':' or '/'. The former signifies NcFTP syntax, the
latter Netscape. */
p = strppk (url, ":/");
if (p == url)
return NULL;
...
}
如果找到冒号,Wget 就会断定该 URL 是简写 FTP 请求(除非冒号后面跟着代表端口的数字)。
如果未找到冒号,Wget 会将 URL 转换为 HTTP URL:
if (p && *p == ':')
{
/* Colon indicates ftp, as in foo.bar.com:path. Check for
special case of http port number ("localhost:10000"). */
int digits = strspn (p + 1, "0123456789");
if (digits && (p[1 + digits] == '/' || p[1 + digits] == '\0'))
goto http;
/* Turn "foo.bar.com:path" to "ftp://foo.bar.com/path". */
if ((ret = aprintf ("ftp://%s", url)) != NULL)
ret[6 + (p - url)] = '/';
}
else
{
http:
/* Just prepend "http://" to URL. */
ret = aprintf ("http://%s", url);
}
因此如果 Wget 在 URL 中的任何位置发现冒号就会认为它是 FTP URL。
因此在示例中,运行wget user:input@example.com/file将为域user发出 FTP 请求,请求文件input@example.com/file。
这种行为是在意料之外的,毕竟用户在输入中使用 HTTP 简写格式的情况非常罕见,但这不妨碍攻击者可能会利用这一漏洞来发起攻击。
该漏洞被披露后,Wget 已发布补丁,补丁删除了对 FTP 简写格式的支持,因为它已被视为已弃用,不受类似于 Wget 的其他工具的支持。
三、影响范围
Wget <= 1.24.5
四、修复建议
目前该漏洞已经修复,受影响用户可升级到Wget 1.25.0或更高版本。
Wget >= 1.25.0
五、参考链接
https://jfrog.com/blog/cve-2024-10524-wget-zero-day-vulnerability/
https://seclists.org/oss-sec/2024/q4/107
https://git.savannah.gnu.org/cgit/wget.git/commit/?id=c419542d956a2607bbce5df64b9d378a8588d778