RuCTFE 2012之mongodb

这是我第一次参加 RuCTFE 这种攻防形式的黑客比赛,完全没有任何经验。虽然横遭惨虐,但是还是在团队的努力下进入了前30,也算是前进途中的一个脚印吧。

比赛开始后,我看的第一个服务是 node.js/mongodb 的服务,这是一道 web 的题目,是一个聊天系统,支持 session,注册登陆等基本功能。很快我们注意到,mongodb 的端口 27017 listen 在 0.0.0.0 上,而且没有密码,从任何地方都可以直接登陆。这显然是一个漏洞,比较低级一点的漏洞。于是我们进行了修补,让他 listen 在 127.0.0.1 上,node.js 和 mongodb 的通信不受干扰。随后我又看了看 node.js 部分,代码很简单,但是没有收获任何漏洞。

进入 attack 阶段后,我迅速找了几个其他队伍的 mongodb 连接进去,但是却发现什么也没有。数据库是空的。我的第一想法是可能这不是个漏洞,是主办方故意留出来的,方便他们推送信息,但是过了一会,我又尝试了一遍,却惊喜地发现,在 mch 数据库中 sessions 和 chats 两个 collections 里面有明显是 key 的信息。于是迅速尝试提交一个,accepted! 惊喜之余立刻去刷新 scoreboard,却发现分数没有变化。Kelwya 说可能是他们有延迟,既然 accepted,那应该就是得分了。果然过了一会,分数刷新后,我们确实拿到了 2 分。在 Group1 里面,我们是第二个拿到 attack 分数的团队。随后我继续使用这个漏洞寻找可以得分的队伍,round1 拿到了几十分,round2 居然前 30 的队伍仍然有没有修补这个漏洞的,拿到了十几分。

回顾一下,找到这个漏洞之后,没有及时写脚本来自动扫 key,这不仅太浪费时间,也让我无暇去找其他漏洞。显然这道题目有一些高级漏洞,可以直接把 mongodb 搞挂(我们到后面阶段这个服务就基本是 down 的)。没有写脚本自动扫 key 的原因是 key 可能出现在 chats 和 sessioins 两个 collections 里面,并且变化比较多,给写脚本带来了一些困难,再加上进入午夜,精力实在跟不上(实在是佩服那些精力充沛奋战到结束的童鞋),最终就没有写,吃了不少亏。

另外不得不说比赛在网络上经常出问题,也非常影响我们,不仅影响我们本身的 defense 分数,也影响大家的工作效率,还影响大家拿到 key 之后的提交。我们在网络上还是吃了不少亏的,这也是实在没有办法的事情。

很高兴能有机会加入到 blue-lotus 这个团队,从比赛的角度来看,blue-lotus 称为中国黑客第一团队是毫不为过的。几次比赛下来,一方面我能感受到团队进步很大,另一方面,也不得不承认与国外强队的差距。衷心祝愿 blue-lotus 能越走越远,在国际 hacker 和 security 领域占有一席之地,也希望能继续有机会献上绵薄之力。期待下次再战!