`

CVE-2013-0422 分析2

 
阅读更多

0x01

http://wcf1987.iteye.com/blog/1749088 这是对CVE-2012-0507的分析

http://wcf1987.iteye.com/blog/1768355这是对CVE-2013-0422的分析

本文则是javacve-2013-0422的分析,其实看poc感觉上就跟CVE-2012-0507有几分相似的地方,都是最终利用了defineclass来实现定义一个高权限的类,他面临的挑战也与CVE-2012-0507有几分相似,下面具体分析

 

 

 

0x02 这个poc的特点是新,目前为止orcale没打补丁,所以中招几率非常之大,大家速度关闭浏览器的java设置吧,话说回来,感觉java这几年好像漏洞频发的样子,不知道是我才关注还是oracle的不作为。

 

0x03 poc中有一段字符串,但是这段字符串解码如下

import java.security.AccessController;

import java.security.PrivilegedExceptionAction;

public class B

  implements PrivilegedExceptionAction

{

  public B()

  {

    try

    {

      AccessController.doPrivileged(this); } catch (Exception e) {

    }

  }

 

  public Object run() {

    System.setSecurityManager(null);

    return new Object();

  }

}

可以看到这段代码中就核心功能就一句话System.setSecurityManager(null);,这句话执行成功了,保护机制也就绕过了,poc的大量反射就为了能够高权限的去调用一下这个类B的构造函数,即poc中的localClass3.newInstance();

 

0x04 看这段poc中大部分的反射都集中在了这两个类中

  sun.org.mozilla.javascript.internal.Context

  sun.org.mozilla.javascript.internal.GeneratedClassLoader

  看他的poc逐步突破路径如下:

 

0x5 这里会发现出现了大量的MethodHandleMethodType之类的东西,这些东西都是jdk7新有的特性,和反射很类似,不过似乎效率更高?我个人目前觉得在这个poc中,这些调用方式如果替换成反射应该也是可以的,核心的对权限的突破应该是出现在0x04中提到的这两个类中

 

0x06

MethodHandles.publicLookup() 

Returns a lookup object which is trusted minimally. It can only be used to create method handles to publicly accessible fields and methods.

之所以不用lookup的方法,是因为lookup返回的是所有的方法,而publicLookup只返回属性为public的方法和属性,这样子后面有一步就不会因为权限不够导致错误,

 

MethodType.methodType()

主要是定义方法的参数结构,可以有多个,主要支出各个参数的类型是什么

 

public MethodHandle findVirtual(Class<?> refc,

                       String name,

                       MethodType type)

                         throws NoSuchMethodException,

                                IllegalAccessException

Produces a method handle for a virtual method. The type of the method handle will be that of the method, with the receiver type (usually refc) prepended. The method and all its argument types must be accessible to the lookup class.

When called, the handle will treat the first argument as a receiver and dispatch on the receiver's type to determine which method implementation to enter. (The dispatching action is identical with that performed by aninvokevirtual or invokeinterface instruction.)

The returned method handle will have variable arity if and only if the method's variable arity modifier bit (0x0080) is set.

Because of the general equivalence between invokevirtual instructions and method handles produced by findVirtual, if the class is MethodHandle and the name string is invokeExact or invoke, the resulting method handle is equivalent to one produced by MethodHandles.exactInvoker or MethodHandles.invoker with the same type argument.

这个方法就是去找到一个方法,第一个参数是这个方法是哪个类或者接口的,第二个参数是这个方法名是什么,第三个则是这个方法的参数是什么有几个,分别什么类型。注意这个方法可以去找那些接口的抽象方法,而不一定是具体的实现,通过这三个参数可以唯一的定位出一个方法,返回的就是methodHandle了。

 

public Object invokeWithArguments(List<?> arguments)

                           throws Throwable

Performs a variable arity invocation, passing the arguments in the given array to the method handle, as if via an inexact invoke from a call site which mentions only the type Object, and whose arity is the length of the argument array.

This method is also equivalent to the following code:

 invokeWithArguments(arguments.toArray())

Parameters:

arguments - the arguments to pass to the target

Returns:

the result returned by the target

这个方法就是很简单调用前面返回的methodHandle了,参数与定义时的保持一致即可。返回就是方法执行的结果了

 

0x07 那么原来的复杂的反射调用可以简化为如下(只是表明调用的实质):

       Context a =new sun.org.mozilla.javascript.internal.Context();

       sun.org.mozilla.javascript.internal.GeneratedClassLoader    b=a.createClassLoader(null);

       b.defineClass(XX);

 

0x08 在以前的blog中我们说过java干掉安全机制的一种方法中,最重要的是如何去得到一个ClassLoader,而ClassLoader最大的问题是,在严格限制的低权限环境中肯定是不允许你创建他的子类的实例的,而通过getClass.getClassLoader则虽然可以得到当前类的ClassLoader,但是由于这个一般都是系统类,和我们不在同一个包下面,无法去调用这个protecteddefineClass方法,在这个poc中我们发现似乎两个方面都有空子可以钻,

 

0x09 a.createClassLoader(null);这个方法按道理在低权限下是无法创建ClassLoader的,但是

由于找不到这两个文件的具体源代码,也就无从分析了,但是看上去似乎这里有点小问题,而后的b中又定义了一个publicdefineClass方法估计在这个里面,可能在这个public方法里面去调用了protected的那个defineClass从而导致了安全系统的破坏。

分享到:
评论

相关推荐

    CVE-2013-2251漏洞示范

    利用CVE-2013-2251漏洞获取服务器的webshell,从而黑入服务器

    CVE-2011-0816, CVE-2011-0831, CVE-2011-0832, CVE-2011-0835

    CVE-2011-0816, CVE-2011-0831, CVE-2011-0832, CVE-2011-0835, CVE-2011-0838, CVE-2011-0848, CVE-2011-0870, CVE-2011-0876, CVE-2011-0879, CVE-2011-0880, CVE-2011-2230, CVE-2011-2231, CVE-2011...

    weblogic 漏洞统计 CVE

    2. CVE-2016-3416、CVE-2016-0688、CVE-2016-0638:这些是2016年的高知名度漏洞,可能使攻击者能够通过恶意构建的请求执行任意代码,通常与反序列化问题有关。 3. CVE-2015-2623、CVE-2015-4744:这些漏洞可能允许...

    CVE-2013-6117:CVE-2013-6117

    CVE-2013-6117 $ ./CVE-2013-6117 -hOptions: -h, --help display help information -f, --filename File containing list of IP addresses -t, --target Target IP -n, --threads No of concurrent threads ...

    CVE-2023-6548 和 CVE-2023-65的Citrix Netscaler/ADC-13.0-92.21 最新补丁

    针对CVE-2023-6548 和 CVE-2023-6549 的 NetScaler ADC 和 NetScaler Gateway 的漏洞补丁升级包 CVE-2023-6548 :在管理接口上执行经过身份验证的(低特权)远程代码 CVE-2023-6549:拒绝服务 2、 强烈建议受影响...

    OPENSSH漏洞(CVE-2020-15778 CVE-2018-15473、CVE-2018-15919)修补文件命令

    2. CVE-2018-15473:这个漏洞涉及到OpenSSH的公钥认证过程。如果攻击者能够操纵公钥文件的顺序,他们可能可以绕过特定的认证限制,从而获取未经授权的访问权限。 3. CVE-2018-15919:这是一个输入验证错误,可能...

    Androidroot源码利用CVE-2013-6282漏洞.zip

    Androidroot源码利用CVE-2013-6282漏洞.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    cve-2013-2070

    自己总结出来的一个脚本,虽然是利用,但是工具是可以用。系统漏洞脚本

    Android root源码(利用CVE-2013-6282漏洞)

    CVE-2013-6282是一个漏洞编号,该漏洞属于Linux内核级别的漏洞,在android 2.x至4.3之前的版本中同样存在, 可以用于系统提权,获得root权限,属于Linux系统API缺陷。 利用该漏洞,开发Android root程序。

    weblogic10.36 CVE-2018-2893补丁文件

    weblogic10.36 CVE-2018-2893补丁文件 最新补丁文件,修复 WebLogic(CVE-2018-2893)安全漏洞预警,oracle官方发布了2018年4月份的关键补丁更新CPU(CriticalPatchUpdate),其中包含一个高危的Weblogic反序列化漏洞...

    CVE-2012-4969漏洞分析

    总之,通过分析,可以得出结论:CVE-2012-4969漏洞是因为CMshtmlEd类对象在释放后,其指针被错误地再次使用所导致。这样的漏洞能够被利用来执行任意代码,造成严重的安全威胁。解决这类问题,通常需要软件厂商发布...

    CVE-2013-3660-分析改进1

    【CVE-2013-3660 分析与 x64 平台 EXP 编写技巧】 本文主要探讨的是Microsoft Windows系统中一个名为CVE-2013-3660的安全漏洞,该漏洞源于win32k.sys模块,可能导致本地权限提升。这个漏洞是由Google安全团队的...

    Jackson 最新反序列化漏洞(CVE-2019-14361和CVE-2019-14439)

    Jackson官方github仓库发布安全issue,涉及漏洞CVE-2019-14361和CVE-2019-14439,均是针对CVE-2019-12384漏洞的绕过利用方式,当用户提交一个精心构造的恶意JSON数据到WEB服务器端时,可导致远程任意代码执行。...

    CVE-2022-33891POC Apache Spark 命令注入(CVE-2022-33891)POC

    CVE-2022-33891POC Apache Spark 命令注入(CVE-2022-33891)POC CVE-2022-33891 影响版本 Apache spark version 3.1.1版本 Apache Spark version&gt;= 3.3.0 修复方案 1.建议升级到安全版本,参考官网链接: ...

    麒麟Linux kernel本地权限提升漏洞(CVE-2022-0847)漏洞补丁及相关依赖包9

    麒麟Linux kernel本地权限提升漏洞(CVE-2022-0847)漏洞补丁及相关依赖包9 麒麟Linux kernel本地权限提升漏洞(CVE-2022-0847)漏洞补丁及相关依赖包9 麒麟Linux kernel本地权限提升漏洞(CVE-2022-0847)漏洞补丁及相关...

    CVE-2018-3191利用exp

    标题"CVE-2018-3191利用exp"涉及的是一个针对WebLogic服务器的安全漏洞,该漏洞被命名为CVE-2018-3191。这个漏洞是由于WebLogic服务器中Spring框架的一个组件处理JNDI(Java Naming and Directory Interface)注入...

    麒麟Linux kernel本地权限提升漏洞(CVE-2022-0847)漏洞补丁及相关依赖包1

    Linux kernel本地权限提升漏洞(CVE-2022-0847)漏洞补丁及相关依赖包1Linux kernel本地权限提升漏洞(CVE-2022-0847)漏洞补丁及相关依赖包1Linux kernel本地权限提升漏洞(CVE-2022-0847)漏洞补丁及相关依赖包1Linux ...

    Centos7_x64-openssh7.4补丁包rpm包,(最新fix CVE-2021-41617).zip

    1.上传并解压:Centos7-openssh补丁包(最新fix CVE-2021-41617 #2008884).zip 2.到服务器对应的解压目录 执行命令安装 : rpm -Fvh openssh-* 3.安装完成后执行命令查看修复情况: rpm -qa openssh --changelog | ...

    cve-2019-2725修复相关的补丁p29694149_10360190115_Generic.zip

    标题 "cve-2019-2725修复相关的补丁p29694149_10360190115_Generic.zip" 指涉的是一个针对CVE-2019-2725漏洞的安全更新。CVE-2019-2725,全称“Common Vulnerabilities and Exposures”,是2019年发现的一个特定安全...

    oracle 11.2.0.1 CVE-2012-1675 补丁:p12880299_112010_Linux-x86-64.zip

    Oracle 11.2.0.1 CVE-2012-1675 补丁:p12880299_112010_Linux-x86-64.zip 是一个针对Oracle数据库系统的重要安全更新。这个补丁主要解决了一个在Oracle 11.2.0.1版本中的严重安全漏洞,该漏洞被标记为CVE-2012-1675...

Global site tag (gtag.js) - Google Analytics