CCTF出题思路

不写解题思路了吧,那事交给选手了,等wp收集好了之后,或许会放出来(经过选手同意后)。

就只写我出的几道题,或者我知道的那几道题吧。

神秘文件

从Forensic开始吧,神秘文件系列,外层用BitLocker对vhd做了个加密,里层用TrueCrypt创建了个加密卷文件,这文件有普通卷和一个隐藏卷。
本来这一系列是只有两道题的,一个考点是从内存中提取BitLocker的密钥,另一个就是从内存中提取到TrueCrypt的密钥。分别是100分和500分。然后当时制作加密卷的时候,往正常的TC加密卷里放了个CCTF{I_4m_n0t_f14g},当个坑。后来呢,也懒得去删除了,毕竟不是考点。然后到了比赛前一天,突然发现,tm题目似乎不够。于是,把这个只要输入purpleroc就能挂载的作为200分的题,而且,是想通过这个200分告诉你们,里面还有个隐藏卷(可通过卷容量来判定)。并且得提示你们密码,于是就写了一长串的题目说明,担心你们不知道这个flag是2还是3的。其实,这个是送分的,或者说是坑,就别在意这一点了,重要的是如何拿到level2中隐藏加密卷文件。

所以,这题的解题思路,唔,怎么说呢,第一关,估计大家都知道EFDD或者password passware都是得到BitLocker的恢复密钥的,然后第三关呢,EFDD、Volatility之类的都能够得到masterkey,但都没提供相应的解密功能,这就需要大家自己动手了,至于为什么我放个隐藏卷,也是有原因的,因为,隐藏卷的参数特别些,你拿到mastkey也是不一定能解密的。

相应的,pctf2011里有一个类似的题目:http://mweissbacher.com/blog/2011/05/17/plaidctf-writeup-fun-with-firewire/
而他的方法是直接提取AES密钥,因为,该题中的tc加密卷就是AES算法,显然,我这里并不是这么做的,我用到了AES-Twofish-Serpent三种组合的算法。所以,这个wp及供参考。话说回来,虽然我想用这道题来看看大家的思路,但还是挺担心大家能做出来的,毕竟,这是我的毕设哇,思路实现可能不久,但我做成产品的确花了蛮久时间呢~具体实践过程是我论文的第三章中的内容,所以,这题还是能做的。

Alt text
详见:http://www.purpleroc.com/html/024735.html
所以,这题,只是想告诉你,内存里有东西,并且有东西可以去分析内存文件。然后,内存里真的能提取到好多信息。
你若认为是个坑,它就是坑吧。

MMMMMMails

这题源于同门的论文中如下部分:

Alt text
也是比赛前一天拍脑袋想出来的题目,毕竟我都专门增设了一个取证栏(其实也不是,毕竟老早前就有出个邮件取证题目的想法了)。
然后就开始邮件轰炸(结果这坑B轰炸器不太好使,每次给我炸五封邮件,Orz),为了让难度大一点,我tm整整炸了个把小时才凑齐了80封。
主要考点在邮件头信息的分析吧,假如由icloud发到sina的一封邮件的头部信息为:

Alt text
可以得出,整个传输过程:
邮件的传输过程如下:

  1. 发送方地址或者域名,这里是192.168.253.2(MUA)
  2. 传送邮件方,在这里应该是苹果的服务器,nk11p16im-asmtp002.me.com(MTA)— Mon, 09 Mar 2015 06:58:30 +0000
    (GMT)
  3. 苹果服务器交给了新浪:irxd5-185.sinamail.sina.com.cn(MDA)— 09 Mar 2015 15:02:38 +0800
  4. 新浪某服务器交给了代理,popproxy02.pop.fmail.xd.sinanode.com(MTA)—Mon, 9 Mar 2015 15:02:39
    +0800 (CST)
  5. 代理在传给了自己的mail服务器,然后被客户端取回。mda04.fmail.qxg.sinanode.com(MUA)—Mar 09 2015 15:02:40 +0800 (CST)

这个传输过程肯定是有时间先后顺序的,所以考点1就在这里了。
第一个有问题的邮件中,收到的时间比发出的时间还早,注意时区

Alt text
第二个有问题的邮件中,本应该从ipv6-ops-confirm+ee0511682737e383c5786c4e3ea457558a96e16d@lists.cluenet.de发送到tracy_zip@163.com,发送方服务器域名应该是cluenet.de而不是cloude.de。

Alt text

这题,除了折腾点,学点邮件头的知识,不过分吧,我觉得不过分。

EZGame

唔,本来嘛,早出来好了,然后安码给了几个题,其中就有流量,然后呢,RainismG也出了一个流量,我就准备废弃它了,后来想想,唔,似乎不太一样,就放上去吧。整个流量其实是个攻击的常见过程,主要想大家分析分析,我总觉得我的题目会给大家很多其他的信息,但没想到大家关注的只是flag。
原本ms08067打过去的流量是加密的,我没尝试过解密,也不知道难度大不大,总觉得可能太大了,然后就强行放了个nc到靶机然后nc -e弹了个shell来传明文。
整个流程大概是,先ping了下对面,证明存活。然后nmap带script扫了下,扫完后,用ms08067的脚本check了下是否可攻击,最后攻击拿到shell,再然后呢,用ms12020打了下,但没成功。
为了营造一个成功了的氛围,我强行shutdown了机器,然后还ping了下,证明目标down了。
然后,就没然后了,似乎做出来的人也不是特别多,不知道为啥~~

2048?4096?

其实吧,我也觉得是个坑,周五晚上了,github找思路的过程中看到了一个2048的代码,就拿过来改了改。
然后发现,我怎么才能控制判定呢?怎么才能知道步数与分数的关系呢?然后就大致写了个打到2048后就让通过的,后来想了想,不太对,酱紫的话,随意爆破就可以了,似乎太简单。
然后,打完dota再回来重写了一遍,把随机冒出来的4去掉,让每次出来的都只有2,最分数最小判断,也就是为啥是在你挂了的时候判定,而不是打到一定的分数后按q来判定。
把每次出来的分数定下来后,得分数和步数之间也就有了一定的联系。我大概确定了三组可成功的吧:

if ((score == 16 && turns == 22 && timer >=20) ||(score == 22 && turns == 24 && timer >= 30)||(score == 28 && turns == 26 && timer >= 40))
{
printf ("CCTF{Th3_L0w3r_Th3_B3sT}\n");
exit(0);
}
else
printf("Do not cheat!\n");

这题嘛,我也觉得有点坑,但是呢,你稍微逆向一下整个代码,分析下,我觉得也能出来,正因为我觉得坑,所以我才明确hint了最低分。至于时间判定嘛,你确定你不假思索在20秒之内能够走22步并且拿到最低分?
说是坑,也不算,如果你察觉到了每次出来的都是2,如果你站在如何判定步数和分数关系问题的层面上,肯定会知道怎么做的。

其他的

好像也就只出了这几个,以前还想出re啊、pwn啊之类的,后来想了想,也干脆没出了。也来聊聊其他题目吧。
唔,渗透我没看,不会、也不说了。
二进制这块,simple pwn是joker师傅给的源码,据说思路是dl-resolve,我没测,他试了试似乎多加了点步骤。
AAAAApk是去年cctf决赛的题目,当时学校打ctf的少,就没人做出来,今年继续用。
新大陆是我逛github的时候看到的一个,感觉挺好,可以来试试,毕竟,我觉得ctf的pwn就应该给很小的bin才好玩。应该在git上搜tiny shellcode能得到一些信息吧。
ftp_server是君莫笑晚上赶出来的,具体,我没看,等哪天有空了,也来体会一下吧。
HelpFBI是ThomasKing出的,据说挺凶残,反正我不会。
diffffuse是我张老师给我的源码,我挑了个源码2.7w行的编译了下,就放上去了,毕竟,如果是我,看到这么高分值题目和这么大的一个bin,都压根不想做了。
签到也是凶残的rr出的,哈哈,谁要你们不用F12。
Best_Easy_Misc唔,即是福说很简单,处处给了提示。
True or False,额,这个,我当时也不会,看了提示后,才发现是怎么回事了。
5ecr3t,据说是最凶残的一个了,我先前以为是个简单的misc,记得当时拿到手之后也做了下。然后找密码花了点时间,再然后在ICMP包里找到密码了,RainismG说后面就只剩一个lsb隐写,然后我就没做了~结果,居然大坑就在这里。。。
剩下的Base{安码}系列的都是赞助商出的题,当时看了看,觉得,肯定会被你们秒掉,然后misc1居然有段时间比签到的人数还多。毕竟,一个strings能够做掉四个题,也就不讨论了。

好吧,就写到这里了,大家玩的开心就好,主要是希望大家有所收获,每场比赛的都能够积累些新的姿势、学习点新的知识,这就足够了,能够在毕业前、不打ctf前再坑大家一次,也还是挺开心的哈。

——Tracy_梓朋
2016年4月25日20:29:10