记在M公司组织CTF夺旗赛的经历
Contents
我在M公司工作了接近三年,跳槽前接到的的最后一项工作,是作为公司的黑客马拉松组委会一员,组织当年的黑马活动:CTF夺旗赛,即Capture The Flag。做网络安全应该很熟悉这项赛事,而我在当时,仅仅是对这个赛事的名称和赛制略有了解而已,虽然当时已经确定了下一份工作是一家API安全公司。 参与这个工作的原因大致是因为我要离职,所以手上没有确定的长期工作,而过往的工作交道中可能给组委会的负责人K姐留下了点做事细致且能填得了新坑的印象,反正公司内也没什么研发懂这个事情,于是我就稀里糊涂了便成为了实际上的技术负责人,时间其实有点紧张,印象中是在我提出离职后,大概也就不到一个月的准备时间。 大部门的领导帮忙出面向其他部门邀题的同时,我就在思考题目的组织方式,不能太难,Pwn这种二进制漏洞作为非安全公司的黑马竞赛题目就完全不合适了,可能时间全部耗完都没人有任何思路,Reverse Engineering也不太合适,简单到可以归类于MISC难度的还凑活。最后的题目主干由Crypto和MISC,以及Web组成,重点用Web做区分度。 我当时的设想是,整个比赛要有话题性和热度,不能太难,让参赛队伍都卡住,也不能太简单,让参赛队伍最后按照解题速度来排名,最好有点普适的趣味度让不同背景的团队都有所得,也能有一定的安全实战场景,体现一定的专业性和教育性。 因为这是公司的第一届CTF比赛,所以并没有合适的人讨论或者过往的经验参考,专业的CTF比赛经验又不适用于我们,所以在网上选题的时候,我对于每道题都会在不看答案的情况下从头开始思考,一直到做出结果,然后再去看题目原有的解题思路,考虑和比较其中的不同之处,再考虑所有参赛队伍的能力情况,以此来预测最后的通过率和解题时间的上下限。基于这种"普通程序员“的视角,很多从其他部门邀来的题目,就被淘汰掉了,或者过于偏门,或者过于艰难,所以最后所有的题目都是我筛选或者选择后的定稿。 压轴题是一道PHP的Phar漏洞和目录遍历漏洞的Web题,在网上找到原题后,从头开始做了一遍再对照原题的解题思路,把细节处做了一些调整,使得题目与原题不全相同又更简单了一些。虽然略显“专业”,但是对于基础扎实和逻辑性强的队伍,即使没有任何相关背景,也能通过搜索关键词在网上找到提示,一步步做出解答。 最后再对所有题目检查一遍,确保解题思路在“普通程序员”的知识范围之内,虽然这个知识范围的跨度也已经很大了,但总归能在互联网上找到思路却又不能照抄。对题目调整难度,控制解答时间,其实是一个很主观的工作,我只能不断猜测,上千人公司的研发团队,参赛的三人队伍有几十支,大部分队伍是什么样的,最优秀的又应该是什么样的。 整理完题目后便是靶场和比赛环境的部署了,虽然有运维团队和公司的网安同事帮忙,然而细节上仍然要靠自己把关,即自己去故意破坏或者修改靶场环境,单是redis环境的安全性测试就把相关的文档和配置重新啃了一遍,有些配置甚至在正常的研发需求中很少遇见,这避免了竞赛中有人删改原有答案,撑爆内存以及故意关机等,从赛后的日志来看,这些尝试都出现不止一次,当然也都失败了。 除了靶场环境以外,作为输入答案和提供实时排名的CTFd也在nginx上做了防护和实时的请求统计,当时的预测就是难免会有过度上头的围观者基于恶作剧的心态来破坏秩序,果不其然开赛时ctfd就被海量的请求刷到卡顿,在公司大群内贴出警告和对应的IP统计信息后,这些异常请求就偃旗息鼓了。 之后就是顺利的一下午,不同团队的比分逐渐拉开差距,但又都有不同速度的进展,最后半小时有两只队伍平分,并且都卡在最后的PHP的漏洞题目上,比赛截止前大概不到十分钟左右,唯一的优胜者终于打通全关。戏剧感拉足,没有意外,系统没有被破坏,所有的题目都能够被解答出来,排名在前的队伍得分紧凑又有差距,几乎所有队伍都在各自不同擅长的题目上得了分。 大老板和其他领导给优胜者们颁了奖,一等奖的团队很兴奋,二三等奖也很开心。我也很开心,虽然领导们肯定不知道这后面有什么样的细节工作,但是一切尽在计划中的满足感才能产生最多的内啡肽。K姐虽然不是研发出身,不过依照对我的信任和她自己的敏锐度应该能猜出来我到底避开了多少坑,于是赛后还特意给我发了个纪念品。 我没有给我所在团队的同事漏题,他们也没拿到任何优胜,只是参赛纪念而已,但我想他们也丝毫不会想过埋怨我 ,毕竟对于正直的人而言,公正远比蝇头小利重要得多。 离开M公司已四年有余,老同事们也星散四方,写下这段记忆,算是对当初工作一点的自傲的追忆,也是对那些可敬可爱同事的回忆。