解法一

根据解压后的cry-0.0.1-SNAPSHOT.jar可以得到如下目录结构
2024-01-29T01:39:03.png
其中Controller如下
2024-01-29T01:40:00.png
就是一个明显的jndi注入,题目用的是jdk8u111,应该rmi和ldap都可以,不过ldap比较麻烦,题目里的localhost:9999/remoteObj也是一个rmi服务端
所以我们就建一个rmi恶意服务端来lookup我们的恶意代码,lookup里的详细过程本来博客里有写,但是博客倒退了两个月,所以也没了,我自己也忘了。
先写我们要加载的恶意Class文件,我写的是反弹shell的恶意命令,记得要TestRef要放在软件包外面,不然等会客户端加载我们的这个Class文件会出错
2024-01-29T01:40:26.png
把恶意的TestRef.class放到服务器上,用python起个服务,因为题目的客户端会通过这个url进行加载
2024-01-29T01:40:40.png
然后就是写一个恶意的服务端并绑定一个remoteObj,也要放在包外,先创建一个注册中心,然后绑定python服务器下的TestRef.class
2024-01-29T01:41:00.png
其中System.setProperty("java.rmi.server.hostname","124.221.19.214");这一句很重要。如何不写的话,host会解析错误。(按照我的理解,可能是客户端去lookup服务端的时候,服务端返回的是localhost,而客户端没有解析成你的vps地址而是直接为localhost)具体看这里
然后我们把这个恶意服务端的Class文件也放到我们的vps上运行
2024-01-29T01:41:25.png
再监听我们反弹shell的端口
2024-01-29T01:41:38.png
然后传evil的值即可
2024-01-29T01:42:26.png
成功去加载我们的TestRef.class
2024-01-29T01:42:39.png
成功弹shell
2024-01-29T01:43:05.png

解法二

不过,其实网上都有现成的工具,直接用就可以了。
先输入要执行的命令,然后一个个试就可以了
2024-01-29T01:43:57.png
用jdk1.8的payload就可以了
2024-01-29T01:44:25.png
成功得到flag
2024-01-29T01:44:54.png

复现环境

源码下载,可以自己在本地搭docker环境