JSON

Jenkins-LDAP (CVE-2016-9299) 反序列化漏洞分析

字号+ 作者:H5之家 来源:H5之家 2017-03-13 14:04 我要评论( )

Jenkins-LDAP (CVE-2016-9299) 反序列化漏洞分析,这个漏洞在去年11月份官方发布通告的时候我当时关注过,当时自己一直在找 com.sun.jndi.ldap.LdapAttribute 这

Jenkins-LDAP (CVE-2016-9299) 反序列化漏洞分析,这个漏洞在去年11月份官方发布通告的时候我当时关注过,当时自己一直在找 com.sun.jndi.ldap.LdapAttribute 这个类相关的反序列化,当时意识到这个类里面的 _getAttributeSyntaxDefinition()_ 方法和 _getAttributeDefinition()_ 可能会存在反序列化的问题,但是当时找了好多类,发现在发序列化的时候都无法触发这两个方法,原本以为是jdk里面自己的问题,最后就没继续跟下去了,中途有老外放出了一个ppt里面演示了这个漏洞,大概看了下发现是利用json来bypass Jenkins的白名单,当时一直在忙数据分析的事情,事情就搁浅了,前不久刚好MSF上有Payload了,再加上年底了没那么多事了,所以就研究了下,这个漏洞还是挺有意思的,涉及的知识面还是稍微广了一点,这里不得不佩服那些漏洞发现者。

每当一个漏洞漏洞出现的时候,我就在想为什么自己不能发现,当每次漏洞分析完的时候才发现各方面的差距真的是不小。

技术在于分享,这样才能进步。漏洞简介

2016年11月16号Jenkins官方发布了一个安全通告,命名为 CVE-2016-9299 ,从通告上来看,该漏洞依然是个反序列的漏洞,不过这个漏洞的反序列化和LDAP有关,而且在反序列化后需要连接到一个恶意的LDAP服务器,Jenkins对于之前反序列化的修复方法就是对一些恶意的类加上黑名单,所以这里首先得Bypass官方的黑名单,对于该漏洞只有这么多信息,而且在官方给的POC里面也仅仅是提到了 com.sun.jndi.ldap.LdapAttribute 这个类,这个漏洞的利用首先是不需要认证的,而且能任意代码执行,危害可见一斑。

漏洞分析

从官方的描述以及后面的Payload来看,问题和net.sf.json以及com.sun.jndi.ldap.LdapAttribute有关,通过分析对LdapAttribute这个类的分析,我们可以确定以下两个方法是触发反序列化漏洞的根本(关于下文中LDAP的反序列相关的知识请移步16年blackhat老外的Paper “us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE”)

getAttributeSyntaxDefinition getAttributeDefinition

这两个方法中都调用了该 _DirContext schema = getBaseCtx().getSchema(rdn);_ 代码片段其中getBaseCtx()方法定义如下:

\

该段代码使用jndi的方式去访问LDAP服务,这里我们可以控制Context.PROVIDER_URL的参数,从而控制jndi访问的LDAP服务器的地址。

getSchema(rdn)方法最终会调用 com.sun.jndi.ldap.LdapBindingEnumeration.createItem(String, Attributes, Vector) 方法(调用关系太多,自己去调试),该方法的定义如下图

\

在该方法中最终会调用 Obj.decodeObject(attrs) 方法,从而实现对象的反序列化。这里稍微提下,com.sun.jndi.ldap.Obj对象中定义了几种对象序列化与反序列化的方法,有直接反序列化的,也有直接通过远程加载的,这里的的反序列化稍微与其它地方的反序列化不同的点在于我们不能远程加载对象,因为com.sun.jndi.ldap.VersionHelper12.trustURLCodebase的默认值为false,所以直接决定了类加载器只能加载当前classpath下面的类,关于如何去构造对象使得LDAP在反序列化能执行任意代码,请看下文。

到这里我们知道了com.sun.jndi.ldap.LdapAttribute中相关的方法能触发反序列化的漏洞,那么现在我们要做的就是去找到一个类在反序列化的时候能调用我们相应触发漏洞的函数,也就是在反序列化时能调用getAttributeSyntaxDefinition方法或者getAttributeDefinition方法的类,通过老外的PPT以及公开的gadgets,我们稍微分析下就会发现在net.sf.json这个类库中存在可以调用类任意getXXX函数的地方,那么com.sun.jndi.ldap.LdapAttribute这个类中的getXXX方法是不是也可以通过这种方式来调用,首先我们先确定究竟是那个类中的那个方法能调用getXXX函数,通过gadgets中的json Payload我们发现最终能调用对象的getXXX函数如下图(net.sf.json.JSONObject.defaultBeanProcessing(Object, JsonConfig))所示

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Json.Net学习笔记(十三) 缩小序列化Json的大小

    Json.Net学习笔记(十三) 缩小序列化Json的大小

    2017-03-01 16:01

  • com.google.gson json字符串的序列化与反序列化

    com.google.gson json字符串的序列化与反序列化

    2017-01-29 09:00

  •  extJs 2.1学习札记(JSON序列化篇)

    extJs 2.1学习札记(JSON序列化篇)

    2017-01-25 15:00

  • Json传到服务端序列化json参数的Filter类

    Json传到服务端序列化json参数的Filter类

    2017-01-02 18:03

网友点评
b