一、漏洞简述
Ruby Net::FTP 模块是一个FTP客户端,在上传和下载文件的过程中,打开本地文件时使用了open函数。而在ruby中,open函数是借用系统命令来打开文件,且没用过滤shell字符,导致在用户控制文件名的情况下,将可以注入任意命令。
Net::FTP#get、getbinaryfile、gettextfile、put、putbinaryfile和puttextfile使用Kernel#open打开本地文件。如果localfile参数以管道字符“|”开头,则执行管道字符后面的命令。localfile的默认值是文件.basename(remotefile),因此恶意的FTP服务器可能导致任意命令执行。
影响版本:
Ruby 2.2系列:2.2.8及更早版本
Ruby 2.3系列:2.3.5及更早版本
Ruby 2.4系列:2.4.2及更早版本
Ruby 2.5系列:2.5.0-preview1
在主干修订版r61242之前
修复:
Ruby团队只是用File.open函数替换了open函数,而File.open函数不容易受到命令注入的影响。
二、漏洞复现
本操作使用kali 机为攻击机,ip为192.168.187.134
ubuntu上使用 vulhub为靶机,ip为192.168.187.133
在kali机上 打开docker
service docker start
在ubuntu 上加载CVE-2017-14015漏洞环境
cd /vulhub-master/ruby/CVE-2017-17405
docker-compose build
docker-compose up -d
在kali运行一个可以访问到FTP客户端。可以使用python运行pyftpdlib,如果没有就可以按照下面的步骤安装使用环境
#安装pyftplid
pip install pyftpdlib
#在当前目录下使用python生成一个ftp服务器,默认监听在0.0.0.0:2121端口。
python -m pyftpdlib -p 2121 -i 0.0.0.0
开始利用漏洞。注入命令|touch${IFS}success.txt
(空格用${IFS}
代替),发送如下数据包即可。
然后在浏览器中会提出文件下载, 保存下载文件
在kali中 查看FTP服务器出现的访问记录
然后在ubuntu靶机中运行命令
docker ps -a
进入docker容器,依次执行下列命令,查看已经被保存的success.txt文件
参考链接
https://blog.csdn.net/weixin_44253823/article/details/102917806