DDCTF2019 “再来1杯Java”出题记录

0x00 总体思路

题目请看:https://ddctf.didichuxing.com/challenges#%E5%86%8D%E6%9D%A51%E6%9D%AFJava
考点3个:

  • padding oracle
  • 任意文件下载
  • Java反序列化攻击

看同学们解题基本按照我的预想,但细节还是有我没料想到解法。希望大家在做这道题目,展现自己水平的同时,也能细细体会下,学到一些有用的知识。接下来,我就聊聊这几个考点涉及到有趣的故事。

0x01 具体分析

1. padding oracle

padding oracle的资料很多,但我看到的大多都是2个block,直接改变IV来加解密。想给大家传递个点是,针对(>2)个block的密文,同样是可以进行PaddingOracle攻击。思路是:将多个Block每次分为2块进行PaddingOracle攻击。

本题关键点:Token解密失败会返回'decrypt err~',成功解密会返回'parse json err~'或者正确的明文。这就可以通过这个“侧信道”数据,来进行攻击了。

这里推荐1个工具,https://github.com/mwielgoszewski/python-paddingoracle,加解密1把嗦。我使用的时候,加密会又些问题,提了个commit,有兴趣的同学可以看看。

攻击代码如下:

ps:出题时候偷懒失误了,直接把明文给了。导致题目变简单了,有个同学用新颖的思路,不用Padding Oracle直接CBC翻转,构造出了管理员的Token。

0x02 任意文件下载

参考这篇文章里面提到的思路和fuzz字典。

大家对于Java可能比较熟悉SpringMVC的形式,将Java编译成字节码,放到Tomcat上运行。而现在大多都是前后端分离,后端使用Spring Boot打包成Jar运行,提供REST形式的接口。

运行也很方便,直接java -jar spring-serial-ddctf-2019-1.0-SNAPSHOT.jar。也正因如此,会在进程的文件描述目录/proc/self/fd/,获取到源码。

0x03 Java反序列化

这里是想模拟WebLogic攻击的方法,本来想着在SerialKiller里面去掉JRMP的Payload。后来出题的时候发现不去掉也行,参考文章Weblogic JRMP反序列化漏洞回顾里面的多个Payload,就能找到管用的~我出题测试的时候,直接用的RMIConnectionImpl_Stub进行绕过。

代码我放到GitHub:https://github.com/angelwhu/ysoserial-my/blob/master/src/main/java/ysoserial/payloads/JRMPClient2.java

为了考察各位对Java的编程能力和熟悉程度,我使用阿里的JVM-Sandbox工具Hook了底层命令执行函数。我把源码放在这里了https://github.com/angelwhu/jvm-systemblock,有兴趣可以看看~

禁用了命令执行,就需要同学们自己写Java代码读目录读文件了,然后通过网络请求将结果返回到服务器~有2个思路:

  • ysoserial工具里面的执行Java代码部分的Payload。
  • 使用URLClassLoader加载远程Java字节码。

这2个思路,在做出这道题的2个同学里分别使用了,点赞~

比较麻烦的地方,需要同学们耐心:

  • 需要编译打包工具,传到线上,操作比较麻烦。
  • 改工具,写Java代码,慢慢调试。

CommonsCollections1的payload不管用,本地配置环境测试好再打远程比较好。

我用的CommonsCollections6的Payload,然后改成了URLClassLoader形式:

读flag的Java代码:

0x04 ddctf几句话

本题思路是基于现在广泛使用的Spring Boot框架抽象提取的业务场景。
考点Padding Oracle出题失误,把明文显示出来了,造成选手直接构造CBC翻转攻击的独特解法,很赞。

反序列化漏洞的考点,本来想去掉SerialKiller工具里面关于JRMP防护部分,题目测试时候发现可以直接绕过,也就没改、加大了难度。考察漏洞攻击理解的同时,通过限制命令执行操作,着重考察了同学们的Java编程能力。做出题目的2位同学用的思路都不一样,都很棒。

希望做过这道题目的同学能够从中学到一些知识,而不执著于题目本身。