3日上午九点,第一届L-CTF落下帷幕,排行榜定格在下图的状态中:
从9月20日比赛筹备开始到现在,参与比赛组织、筹办的每个人都收获良多。特将部分题目的出题人心得,和比赛中一些有趣的事情分享出来,以飨读者。
关于出题
Icemakr(Pwn出题人)
If your problem relies on leaking libc, consider providing the libc.so along with the problem binary. libc hunting isn't really an interesting skill to test in a CTF.
关于Pwn100,出题时就想着,PWN100简单粗暴的栈溢出就好。PWN200当时是想试一下house of spirit的技巧,就是在栈上构造堆块,然后通过free和malloc之后得到一个栈上的堆块,就可以对这块缓冲区写东西了(比如覆盖返回地址),但实际情况是没有考虑到覆盖got表里的函数地址为shellcode的地址即可get shell(https://gbmaster.wordpress.com/2015/07/21/x86-exploitation-101-house-of-spirit-friendly-stack-overflow/,https://github.com/shellphish/how2heap/blob/master/house_of_spirit.c)。
PWN300设计时的初衷是想让选手自己通过查共享库的文件头,然后找到符号表,从而获得共享库内函数信息的方法来getshell(http://uaf.io/exploitation/misc/2016/04/02/Finding-Functions.html),Pwn400则希望选手构造一个虚表,利用uaf来修改虚表指针指向构造好的虚表,在下一次调用虚函数时即可控制程序执行流。PWN500就是让大家构造overlapping chunks,来做一些羞羞的事(http://www.contextis.com/documents/120/Glibc_Adventures-The_Forgotten_Chunks.pdf)
Silver(逆向400、500出题人)
这次出的题让各位见笑了……哈哈哈(掩饰不住得意/*weisuo*/的笑)。
先说Re400啦,题目标题是The Gold Rush,淘金热。各位应该已经看到我们放出的 Writeup 了,在我的设计中,Re不只是一道对程序主文件(problem_fully_stripped)的逆向题,因为这个程序里涉及的算法比较多(sha256, sha384, twofish),而用C++编写也提升了一点点难度,因此在我的思路中是希望选手通过对程序流程的理解和405480处函数的分析,并结合对magic_file的逆向分析,了解到这是在挖矿,然后去网络中找到对应的nonce值。之所以在比赛中段放出了提示bitcoin,也是希望提示参赛队伍这是一道和比特币密切相关的题。
后期和队伍交流时也发现,两支解出来的队伍(跌亭科技、Nu1L)基本就是这个思路,不再赘述,可见逆向能力很强。但比赛结束后我发现AAA有一种更好的解法[点击查看他们对Re200和500的wp],但是没来得及提交。这种解法利用的是我在出题设计时候的漏洞:密钥的解密参数是用各块哈希值的sha384生成的,但各块的哈希值是可以从数据中直接拿到的,也就是说,选手可以先对程序进行patch,然后在magic_file后附加一个块,写入最后一个块的hash值,再直接运行程序,就可以了。这个漏洞的引入还是因为我不希望大家直接去爆破nonce的哈希,所以就取了整个块的hash……无意之中忘掉了这一点……然而更可惜的是,如果他们能把这个题目漏洞提交上来,按我的想法,至少能拿到100分以上的加分(因为这个洞会导致题目难度至少降低100分),在此还是要表达对AAA战队队员逆向功底和思路的钦佩,师傅们还是强的不要不要的啊。
而Re500,在设计之初是希望将软件逆向和硬件逆向结合起来,题目的名字Halt and Catch fire是一部讲述上世纪80年代个人计算机发展的美剧,其第一集讲述的就是主人公通过自己搭建的硬件电路,dump出BIOS芯片内的代码。我甚至还构想过在线下赛融入相关的内容,只可惜由于种种原因,线下赛不能举办,这个思路也只能留作以后使用了。
斗胆出了这么两道题,如果有哪些地方见笑了,还请海涵。
math1as(web 300、500出题人)
😀 从这次比赛的情况看来各位表哥都很厉害,这次我出题的时候呢,web300的主要思路还是二次注入,比较常见。而headpic这个标题是从经历过的一个实际的渗透案例出发的,比较现实的换头像产生ssrf,另外我又在想,对于某些问题是否可以让web有更多种解法,更偏实战一点,于是就有了验证码的两种解决方案,1是识别,2是从session绕过。最后的登陆呢,则是考察到了其他题目没有怎么关注的php类型和函数的问题,通过strcmp函数的缺陷来完成最后的flag收割。
web500作为一道分值很重的题目,实际上是一道实战渗透+内网+提权的题目,之所以外部的web选择了python, 一个是感觉web如果全是php就太low了233(。虽然php的确是世界上最好的语言,另一个是,说不定不同的语言特点和框架可以让大家能够有更好的思路呢。比较实际的点就是那个积分转现金,并发数据库不加锁定的问题,经典的案例是wooyun的白帽子奖金提现,命令注入则部分参考了hitcon 2015的一道题目,最后的内网渗透则是从某个js混淆中获得的灵感(http://www.cnblogs.com/index-html/p/use_vm_protect_js.html),也顺手黑一下易语言。当然呢留下的小惊喜是,居然还有本地提权~,不过这算是一个常规题目了,我这个web狗看了下都能做hhh。
关于比赛
进入L-CTF时代
我们的比赛在20日就开始出题,22日开始尝试和相关部门沟通,之后我们就联系了补天漏洞响应平台,对方也非常支持我们,同意作为比赛的赞助方。在出题和相关工作基本就绪后,在补天平台的帮助下,我们28日晚上在多个渠道推送了比赛的相关信息,也得到了圈子里很多朋友的大力支持。非常可惜的是,在30日早上,我们收到了有关部门的通知。在和多方联系后,为了让比赛能正常的进行下去,我们将比赛更名为L-CTF,因为参与出题的成员基本都是XDSEC以及L-Team的主要成员。
可能和一部分人想的不一样,我们争这个比赛,不是对利益有什么追求——事实上前几届的比赛,我们也没有从比赛中拿到什么经济利益。我们在意的是比赛历史的传承,和比赛质量的延续。作为主办方,大家一是希望能通过举办这场比赛,认识更多的朋友,毕竟CTF比赛是需要大家一起玩才能继续下去的;另一方面,我们也希望通过举办比赛,提升我们自己的技术水平,从各位大佬们讨得一点技巧。
从攻防角度看,CTF比赛的主办方类似于防守方,而选手类似于攻击方,大家互相在这种过程中提升技巧。在出题过程中,我们也一直希望让CTF更贴近实战(“享受实战艺术的非职业CTF队伍”),而不是为了出题而出题。
我们的比赛向来如此。无论今后如何,我们都不会变,会尽量向各位提供一个良好的比赛环境。也希望各位今后能支持我们的L-CTF。
长路漫漫,感谢有你。
搅屎棍、抗扫描和DDoS风云
搅屎棍一直是CTF比赛中一个有趣的话题,我们在赛前准备的时候自然也想到了这一点。我们预计到的最坏的情况,是某台服务器由于配置不当被拿到了管理权限,因此在部署的时候我们特意采用了前后端分离的结构,这样前端可以快速过滤掉部分很明显的垃圾流量;同时对前后端的每台服务器都做了镜像,保证系统被修改后能快速恢复,前端被攻击也可以不影响后端业务正常运行。这一点也是我们能对一些特殊情况作出响应的关键。
但没想到的是在29日晚上,还是被搅了一波,有搅屎棍使用脚本批量注册了一批帐号上去。后端的维护人员看到之后,紧急上线了某公司的图片验证码(他们的平台在注册帐号后提供了有时限的体验服务),并后台上线了一个批量删除的功能。中间因为他们SDK的文档前后端不完全对应,还花了一点点时间调整,中间网站后端也多次波动,给大家带来了一点不便,主要还是因为我比较菜……
另一个被搅屎的,是部分Web题目,竟然有人直接上了扫描器(目测御剑),由于我们的题目设计问题,直接把服务扫挂了……前期使用了一个脚本,隔一段时间重启一次服务,后来大家觉得不够黑客,太Low,于是索性在前端上做了一点防护,简单的过滤掉了一些看起来就没可能的请求,在某种程度上也算节省了大家的时间(毕竟Nginx比Tornado快那么一点点)。
最后要提到的就是给了我们一点压力的DDoS攻击。10月1日17点,我们实验室所在的楼层由于需要进行电路检修临时停电,之后负责服务器运维的小伙伴收到腾讯云发来的短信,说我们的主服务器由于被DDoS而拖入黑洞。我们完全没有对这种情况作出预案,因为我们从来没想到,有什么人或者什么组织,会用DDoS这种方式给我们压力。在评估了情况后,我们在30分钟内快速响应,将前端服务器部署到了另一台机器上,启用了新的IP,并联系了某公司的某抗DDoS产品,他们为我们提供了防御服务(特此表示感谢)。
事后我们查看被黑洞主机的日志,发现对方早在当天中午一点和三点就各发动了试探性的1G的攻击,之后在五点发动的一波8G的攻击,将我们的机器拖进了黑洞,可见对方有一定经验,用最小的代价(10G)就让我们的服务无法正常访问。在切换到新的服务器后,我们发现攻击者还有一点残余流量,因此晚上我们也通过一些方式进行溯源,在60分钟内,根据肉鸡的IP地址逐步反查,和攻击者取得了联系。
当时ctf.l-team.org指向腾讯云的服务器119.28.17.228,得知遭受DDoS攻击后,通过某蜜罐数据抓到中控IP为104.*.*.35和192.*.*.11,并且大多使用XorDDoS类型的木马。通过黑客使用HFS服务器,抓到样本如下MD5 (xx) = 16aafd07797366c7c9**********c58e,MD5 (uu) = 38632540b5a743ceda**********c706。随即对该中控IP的域名解析的历史解析进行排查,发现该黑客所使用的ip绑定多个域名,并开启whois隐私保护,然而百密一疏,从54**.x*z发现了其使用的邮箱6*@qq.com。进一步社工得到其真实信息,包括姓名及其常用id等信息。通过与黑客直接接触,他们称是有人希望他“对自己公司的服务器做一个24小时的压力测试”,并直接给出了我们主服务器的IP地址。
之后的几十个小时,直到比赛结束,除了偶尔被扫描一波以外,一切风平浪静。
因吹厮挺
还有很多事情,无法一一详录,于是一概记到这里,也是希望和大家分享我们这次比赛的苦与乐。
这次比赛的出题组成员,绝大多数都是第一次为CTF比赛出题,甚至很多人之前从来没有出过题;
赛前宣传时,我们本来打算将宣传口号定为“暴打出题人”,后来因担心自己人身安全而作罢;
这次比赛正好赶上silver的摄像头到货,因此他自作主张,在B站借用帐号,开了个直播间。直播过程不仅给大家带来了很多欢乐,还额外附送了一堆新鲜的表情包。负责“坐台”的silver也获得了新成就”色情男主播“,听说他现在准备打包行李回老家直播写代码;
比赛过程中,作为运维的klaus基本没怎么睡,3日比赛结束后,他马上从实验室回到宿舍去补觉了,实际其他人也都差不多。但当晚上招呼大家撸串时,klaus的样子完全不像是刚刚睡醒……;
比赛的几天里,大家在实验室基本靠外卖存活,“西电信安协会”俨然成为“西电外卖协会”,以至于外卖老板都知道这里还有人在。比赛QQ群和内部交流群里的大佬们在得知我们的情况后,很”贴心“的上传了朋友圈里的美食图片……不过我们也没闲着,赛后撸串的时候也很贴心的分享了一些图片。
比赛时,所有的题目一血记录不是在屏幕上展示的,而是在一块小白板上展示的,因为协会前端人才稀缺,而且之前并没想到写前端……;
………………
最后
窗外早已繁星点点。回想起我们经历的这最难以忘怀的72小时,感慨万千。感谢在协商过程中帮助过我们的老师们、同学们,感谢前期给我们提供重要支持、并在赛后为参赛队伍提供奖品和证书的360补天漏洞响应平台,感谢在比赛中发挥出色的参赛队伍、队员们,感谢在紧急时刻支持过我们的伙伴们、朋友们,感谢在比赛运行过程中起到重要作用的协会成员、元老们。
西电信安协会[XDSEC]由西安电子科技大学08、09届学长们由兴趣聚成,作为校内第一个信息安全团体不断发展至今,L-Team则是由协会核心成员组成的CTF战队。我们今后也会一直努力,争取在技术水平上有更高的进步。
感谢各位安全爱好者对XDSEC的支持与信任,感谢大家一路上对我们和关心的照顾。
不忘初心,方能始终。
共勉;
发表评论
您还未登录,请先登录。
登录