首页 网络安全 正文
  • 本文约2401字,阅读需12分钟
  • 142
  • 0

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 服务器端请求伪造漏洞CVE-2024-10524

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

评论
更换验证码
友情链接