java 0day_Java 0day简略分析

准备

编译Gondvv.java,生成在Gondvv.class,在同目录下新建test.htm,内容如下

粗略观察一下java代码,应该是绕过了Java Sandbox,而并非是JVM中溢出等漏洞,所以可以直接调试java代码。

setSecurityManager

首先需要简单了解setSecurityManager()函数。setSecurityManager()用于设置一个SystemSecurity。如果已经设置过securityManager,调用setSecurityManager时则会调用checkPermission检查权限是否正确。同样可以通过调用setSecurityManager来替换掉一个现有的securityManager。所以绕过SandBox的方法一般为禁用掉SecurityManager,调用setSecurityManager()函数,并传入null参数。如下图

7c3ad5fc3d8b9fa74b1b63e6c5f5170c.png

8026500a07ff962dfeab42b1e8a24921.png

首先对setSecurityManager()下断点,检查函数调用链,看是在何处修改security manager。

3af711e3a61c8a47dc7b55b79e861cc0.png

中断在setSecurityManager(),观察函数调用链

98ffc4b3d480c552e6b2da24edf3cb60.png

可以在调用链中观察到Gondvv中的代码,调用了Gondvv.disableSecurity()函数。并且观察一下setSecurityManager()的参数,为null,这是一个取消security manager的操作,若执行成功,则可以绕过其权限检查,从而任意执行命令。链中出现Gondvv的代码,为非信任代码,却仍成功关闭SecurityManager,猜测可能是权限被修改。

代码分析

下面开始分析Gondvv.java中的disableSecurity()函数。

首 先 创 建 表 达 式 , 用 于 执 行setSecurityManager()。但是,若直接执行则会触发setSecurityManager()中checkPermission()的检查,导致失败

b8ea6d96b2eafb536c7a44fda56a0284.png

所以在Gondvv.java中,首先修改上下文为AllPermission,以保证以AllPermission权限调用

setSecurityManager(),绕过检查。下图为准备设置的新权限。

ab3eea3fa3eea7680eb7102054bf3ff4.png

接着调用关键函数,在此函数内,完成权限的更改。

4a967e9003aae968a6d0b52002f64407.png

创建一个表达式,用来获取到SunToolkit,在java6中是获取不到的,java7中的ClassFinder

可以获取到SunToolkit

040fb91203eb3eef37440f403be857f3.png

查看GetClass的实现,是表达式调用Class.forName(“sun.awt.SunToolkit”),用来获取SunToolkit

576f717f380608367e074b22f5a37d6d.png

接着会在Expression.invoke()调用到ClassFinder.findClass(),如下图

c8ac7c0a8cd48449c9cdbb6c3d8bac46.png

此时可以观察ClassFinder.findClass()的参数,正是“sun.awt.SunToolkit”,通过ClassFinder类成功的获取到了我们想要的信息

96aa64bcd0b6a943092b97f320e5a297.png

其中”acc”为Statement中的私有成员,用于控制当前Statement上下文的访问权限

16222b2ad478ff13fd58c5a5ada3fddf.png

getField()为sun.awt.SunToolkit中的一个公有方法,并返回一个对象的引用(Field类型),并且

该方法可以获取到私有成员,如下图

d8afafe9c4ccf085c863565314698800.png

以下表达式实际为SunToolkit.getField(Statement.class, “acc”),即执行该表达式后,即可返

回”acc”的引用

0bed1df5b51ba5a7d11a514d94ccc012.png

此时已成功获取acc对象,可直接修改其权限。

调用Field类的set方法,成功的将传入的localStatement上下文设置为AllPermission,localStatement上下文权限已被修改,执行该Statement将可通过setSecurityManager()中的权限检查,将SecurityManager置为null

772cba8e6b4f2ad888c0ce1a46d71486.png

执行Statement,即可执行任意命令。

47d8764eb034a63f22851792ad184cf8.png

Exploit中弹出calc

23a2fd8cb11a1001eae9734c05516fd4.png

漏洞成因

sun.awt.SunToolkit本身就是安全机制实现的一部分,按照SandBox的机制,是不应该让不信任的代码直接获取到该类库的,而ClassFinder.findClass()却没有考虑这一点,致使攻击者可以获取到SunToolkit,修改自身权限,进而关闭SecurityManager.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值