DDCTF 2019 WriteUp

虽然很忙还是打了滴滴CTF,不过这比赛办的还是很用心的。最后三十几名和还是要向师傅们学习。这几天太忙了一直没空写writeup,还好题目都还在。

Web

滴~

这道题除了备份文件有点难扫之外题还是挺简单的,各个群开始散布备份文件后,这道题才开始大量被做出。
扫目录能扫到config.php。
url:http://117.51.150.246/index.php?jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09
解两次base64和一次hexdecode,看到flag.jpg。明显的是文件包含,读到index.php源码

可以看到是无法直接读到config.php的,绕过了很久才知道原来有practice.txt.swp这个备份文文件。。。内容为f1ag!ddctf.php,用上面文件包含读取,可以用config绕过不能输入
读出内容为

很简单的变量覆盖和php://伪协议绕过,拿到flag

Web签到题

进去提示没有权限,扫目录没有有效信息,观察发现index.js内容:

伪造请求头加上didictf_username:admin
得到并访问:app/fL2XID2i0Cdh.php拿到源码。

很明显的反序列化漏洞,Application.php有__destruct魔法函数可以读flag,Session.php会读session,并且在session_read函数中会反序列化session,而session是存储在cookie中的,但是会存在以下的session校验

这说明,如果我们想要触发反序列化漏洞,必须得自己构造session,即必须绕过以上的md5校验,我们就必须得到eancrykey。我们可以看到读key的函数

以及session_read中可疑的返回key的语句:

运行到这只需要带上它本身的cookie就行。格式化输出,如果我们输入nickname为%s,那么就能在第二轮循环中输出key值。

拿到了key就可以伪造session反序列化数据了,其中我们已经可以得到flag地址,其中../的限制只要双写就能绕过。
payload如图:

拿到flag:

Upload-IMG

上传文件需要图片源码中包括phpinfo字符串,上传后下载下来用hex编辑器打开可以看到图片被压缩了,并且之前写入的字符串不见了

观察发现被gd压缩渲染了,查资料可以得到一个php paload,将字符串插入jpg图片绕过gd渲染。
jpg_payload 只要将要写入的内容替换$miniPayload变量就行,运行php jpa_payload.php your_imag_name 就可生成绕过gd渲染的图片马,不过经测试,第一次生成的图片仍然不能绕过,将题目返回的图片再次运行即可拿到flag。

homebrew event loop

给了源码

flask的CTF题常规种类并不多,这道题既没有SSTI也没有泄露Secret_Key,但是它有一个eval可以执行函数。
代码逻辑很清楚,entry_point为Web入口,然后解析url中GET参数,GET参数为action:ACTION;ARGS0#ARGS1#ARGS2......的格式,将其解析为一个操作链,在execute_event_loop中按照顺序执行。如下执行:

其中的action就为上面的ACTION。而且#可以注释掉eval后面添加的字符串内容,这样我们可以伪造url参数达到运行任意函数的目的,但是限制了函数必须有参数且为列表。一开始一直局限于沙盒绕过,对源代码中其他函数的测试没有太多深入,花了不少时间。
这道题逻辑写得非常的好,request.event_queue是一个先入先出的队列,这说明尽管我们能构造像如下的函数执行链:
action:trigger_event%23;action:buy;8%23action:get_flag;
即执行buy_handler再执行get_flag_handler,尽管执行成功,执行完buy_handler后一定会将consume_point_function加入对列,这样无法将flag返回。但是这道题加了一个session的log机制,将访问过的trigger_event记录在cookie中,这样即使web页面不能返回,我们却能从session中的log得出。
按照上面访问web后,将返回的cookie解码,将其中的log解base64拿到flag:

大吉大利,今晚吃鸡~

先是要买票拿到入场券,一看就是溢出题,但是被浏览器给坑了,火狐在json返回格式遇到大整数会出现部分四舍五入的问题,导致我分析这些特征分析了很久。这只是一个uint32溢出,买票时买2**32 +1 价格的票,pay时应该是是另一个服务器,溢出花一块钱买的票。
进去后有一个id和ticket,需要移除对手,写脚本注册新号就可以用他的ticket和id移除他。

mysql弱口令

这道题挺坑的,8123端口是写死的,因为服务器的问题一直没有运行成功,就更别说做题了。。。
不过这道题还是很有趣的,本题验证agent.py是否运行然后向提供的端口扫描mysql弱口令(我觉得这就是这道题没有讲清楚的地方)。mysql服务端的伪造,伪造mysql服务端,执行LOAD DATA LOCAL INFILE命令读取任意客户端文件。网上有很多脚本可以直接跑,拿一个师傅的跑起来:

先读.bash_history查看命令历史,看到源码位置views.py文件,读取:

可以看到flag在数据库中,有两种方法拿到flag,可以读取mysql存储文件也可以读取~/.mysql_history
拿到flag

Misc

北京地铁

一个脑洞题,图片lsb隐写,用Stegsolve打开后直接提取低位数据就行,在最上面看到base64编码数据

题目提示aes加密,而其解密的key值为北京地铁图片上一个稍微不同的站点魏公村站(weigongcun)。。。这脑洞很清奇。
解密aes随便写一下

MulTzor

参考这篇文章https://www.anquanke.com/post/id/161171 流密码的安全问题,根据统计学以及英语特性上的分析,最后得出加密key值并逆出原文。
那篇文章讲得很清楚这里不赘述,我们用它的第一种方法:通过英文字母汉明距离猜测密钥长度,利用空格异或字母仍然等于字母特性猜测出原文中空格位置,那么当明密文对足够多时,就可以完全恢复出秘钥,这样就可以完全恢复出明文了。
https://github.com/nasume/cryptopals/这个项目已经实现了,可以直接跑出来

Wireshark

这道题分析图片难度倒不大,取出一共三张图片,其中有一张打不开,提示crc错误,改了高度后可以打开,看到key值。

一直在想key值的作用,没注意wireshark中其他的http流量,卡了两天才做出来。流量中将其中一个图片在一个网站(http://tools.jb51.net/aideddesign/img_add_info)中加密并返回,我们在同一个地方解密就好

联盟决策大会

题目已经提示了Shamir 秘密分享算法。按照算法,(k,n)秘密分享算法将秘密分为n份,任意k个子秘密可以恢复出S。本体要求分为两个组织,组织1,2都必须有三人以上同意才能得到秘密。
那么这题可以单独出组织1,2。分别算出秘钥,再用这两个算出总秘密,期间可以使用同一个P

拿到flag

2 thoughts on “DDCTF 2019 WriteUp

  1. 大神 能加你微信吗?本人是一个快毕业的学生,正在研究拼多多方向,无意打扰,只是想跟你探讨拼多多数据,我的微信是lm354563790

发表评论

电子邮件地址不会被公开。 必填项已用*标注