用户
搜索
  • TA的每日心情
    开心
    2018-12-25 11:26
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    官方账号

    Rank: 7Rank: 7Rank: 7

    15

    主题

    23

    帖子

    250

    魔法币
    收听
    0
    粉丝
    3
    注册时间
    2018-6-12

    i春秋认证

    发表于 2018-7-25 22:03:36 26375
    一、漏洞背景

    漏洞编号:CVE-2018-1999002
    漏洞等级:高危

    Jenkins 7 月 18 日的安全通告修复了多个漏洞,其中 SECURITY-914 是由 Orange (博客链接:http://blog.orange.tw/)挖出的 Jenkins 未授权任意文件读取漏洞。

    腾讯安全云鼎实验室安全研究人员对该漏洞进行分析发现,利用这个漏洞,攻击者可以读取 Windows 服务器上的任意文件,对于 Linux,在特定条件下也可以进行文件读取。利用文件读取漏洞,攻击者可以获取到 Jenkins 的凭证信息,从而造成敏感信息泄露。另外,在很多时候,Jenkins 的部分凭证和其内用户的帐号密码相同,获取到凭证信息后也可以直接登录 Jenkins 进行命令执行操作等。

    二、漏洞分析

    Jenkins 在处理请求的时候是通过 Stapler 进行处理的,Stapler 是一个 Java Web 框架。查看 web.xml 可知,Stapler 拦截了所有请求:

    code_1.png

    单步跟入 hudson.util.PluginServletFilter,最后会跟到 jenkins\core\src\main\java\hudson\Plugin.java 的 doDynamic 方法:

    code_2.png

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

    code_3.png

    其中 request.getLocale() 是 jetty-server-9.4.5.v20170502-sources.jar!\org\eclipse\jetty\server\Request.java  内的,其实现为:

    code_4.png

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

    最后到跟入 stapler-1.254-sources.jar!\org\kohsuke\stapler\Stapler.java:

    code_5.png

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

    code_6.png

    最后 URL 拼接的现场为:

    image2.png

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

    image3.png


    三、利用方式

    一般来说,文件读取漏洞很难转化为命令执行,对于 Jenkins 也是如此。不过 Jenkins 有一个 Credentials 模块,这个模块储存了 Jenkins 的一些凭证信息,很多时候,其凭证的帐号密码是和 Jenkins 的帐号密码相同的。无论如何,在成功利用文件读取漏洞后,都要将凭证信息读取并解密,以收集更多的信息。
    如果我们想获取 Jenkins 的凭证信息的话,需要以下几个文件:

    · credentials.xml
    · secrets/hudson.util.Secret
    · secrets/master.key

    很幸运的是这几个文件我们都可以利用文件读取漏洞读取出来。在 Shodan 上尝试获取国外 real world 的 Jenkins 的帐号密码:

    image4.png

    当然,获取到的帐号密码是不能直接登录的,但是稍微修改一下用户名就可以成功的登录进去了:

    image5.png


    四、修复方案

    虽然这个漏洞危害较大,但是不必太过担心,因为默认安装 Jenkins 的时候匿名用户是没有可读权限的。并且此漏洞在 Linux 上被利用的可能性较小。以下为推荐的修复方案:

    针对此高危漏洞利用,腾讯云网站管家 WAF AI 引擎可检测并拦截,如果需要,可在腾讯云官网进一步了解

    在全局安全配置中将匿名用户的可读权限去掉

    ➢升级到最新版本的 Jenkins(2.121.2)

    ➢使用 Linux
    腾讯安全云鼎实验室,关注云主机与云内流量的安全研究和安全运营。利用机器学习与大数据技术实时监控并分析各类风险信息,帮助客户抵御高级可持续攻击;联合腾讯所有安全实验室进行安全漏洞的研究,确保云计算平台整体的安全性。相关能力通过腾讯云开放出来,为用户提供黑客入侵检测和漏洞风险预警等服务,帮助企业解决服务器安全问题。
    支持一下~
    使用道具 举报 回复
    发表于 2018-10-16 09:28:12
    ➢在全局安全配置中将匿名用户的可读权限去掉

    ➢升级到最新版本的 Jenkins(2.121.2)

    解决方案好评
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册