picoCTF2017 Web 100 TW_GR_E1_ART

CMU的CTF game,国外的思路和国内完全不一样的感觉,这一道题是level2的一道题目,并且后面每个level都有以此题为蓝本的进阶题,第一次遇见这种题目,同层次的level2的sql题目是用万能密码就能getflag的题目,于是想当然的觉得这道题就是被秒的题目,结果被教做人了,过了挺久才做出来,而且感觉做法很蠢,也是因为对JS和node的极度不熟悉,而后面进阶的题目就不考虑了。在这里把做整个题目的过程复现一下,主要反思整个思考的过程以及如何入手一道完全不懂领域的CTF题目并在解出题目的过程中达到学习的目的。

直接打开题目发现

。。。。。。。。。。。。。。。。

picoCTF为每一道题都设置了hint,我们先看这道题的hint

让我们去找泄漏的Nodejs文件,对于完全不懂node的人来说,首先就应该去搜索nodejs是否出现过敏感文件泄漏的漏洞,以及整个Nodejs的文件目录结构。搜索得到nodejs貌似没有重大的敏感文件泄漏,并且可以搜索得到nodejs的文件目录:
可以发现两个文件:app.js和package.json(我这里是直接通过dirsearch扫到的package.json),发现app.js不能访问,package.json可以,于是查看package.json:

通过搜索资料查看package.json每项的具体意思:http://javascript.ruanyifeng.com/nodejs/packagejson.html,实际上这里很容易看出主要的点就是server/serv.js脚本,这是整个Web应用的服务端脚本。查看他:

很多的require,为了知道具体require是怎么工作的,我们继续查找资料:http://www.ruanyifeng.com/blog/2015/05/require.html

了解清楚后我们可以知道如何访问require的脚本,并且可以识别哪些是nodejs的内置模块,在之后的查询中可以忽略这些内置模块。慢慢看下来后发现 require(“./game”)(app, io) 应该是我们要找的目标,查看他,因为整个脚本有近1000行,所以不把所有的代码放上来,只放上重点部分,首先是game.js的require:

其中./config ./generator都应该是重点查看的对象,接着考虑到我们的目标是找到flag,于是搜索”flag”,可以找到一个地方:

这是一个switch的分支,其中提到了item,以及action.item,猜测是使用一个旗子物品后进行检测,如果成功就显示flag,往上翻到函数定义处:

是一个使用物品的函数,接受了4个参数,但是此时我们不知道这4个参数到底代表什么,于是找到调用这个函数的部分:

。。。。。没差别,找到doAction的函数调用处:

可以知道entity是state.player,那么上面对旗子check的判断可以改成

猜测state.player在客户端和服务端的定义一样,我们在console中输入state.player查看一下:

成功输出了当前角色的状态,包括物品的定义和属性。想到前面./config的文件还没看,于是看一下:

得到了flag这个物品的属性定义,找到调用这个函数的地方:

这里把整个函数放上来,因为这里面包含了关于楼层的定义,可以看到第四层就是最后一层,并且在第四层生成了很多的旗子物品,而其中有一个旗子的check是64。所以只要手动打到第四层然后找到check是64的旗子使用就可以拿到flag,最后也是靠这个方法拿的flag,但是感觉不是正常解法。

后面到达的第四层状况,地面全是旗子

通过console查询旗子的check数值,找到check是64的旗子使用就可以拿到flag。

但是当时我认为手动打到第四关是不可能实现的,并且这样手动打很愚蠢,就先想了其他的思路:

首先是随便捡一个物品,在本地通过console更改这个物品的属性为正确flag的属性:

可以发现本地修改成功,我们在第二层拿到了第四层才能拿到的flag。但是使用后仍然不行,抓包发现发出去的数据包仍然没有变成flag:

尝试改成flag再发出去却发现无法通过chek==64的验证,不知道是否和数据包中的lhs和rhs有关。

总结一下,用的最土的方法解决了这道题,那么更加优雅的方法可能是什么?首先是层数的问题,有没有机会直接跳过前面三层到达第四层?通过在console里查询state可以看出floor是存储在map对象里的,但是和之前修改物品一样,本地修改floor没有造成影响,抓进入下一层的包显示的编码很乱,对websocket的了解还远远不够。远程直接使用flag也是一样的问题,现在看,优雅的方法估计需要对websocket和这个Web应用的源码相当了解才行,这真的是一道和sql万能密码绕过排在一个层次的题目吗???