冲云破雾的「冷门」拖库 Writeup

这是一个玩起来相当有意思且不那么难的靶场,好玩的原因是我在里面精心设计了剧情,做起来会觉得很有意思又不失真实。不难的原因是在每一步都给了很明显的提示,并且没有利用到很高难度的姿势。而且因为它的核心漏洞相对“冷门”,降低了通关难度。闲话少说我们开始Writeup。

第一关 解黏去缚,茅塞顿开

靶场的入口是某公司的活动H5页,在这里有人找到了readme.md,有人找到了.DS_Store(这个我都没想到,还好没啥有价值的东西),更有很多人在这里就开始各种工具扫描器齐上阵了……他们万万没有想到的是这个位置真的真的真的只有静态页(我很“机智”的把真正要“攻击”的服务放在了千里之外的另一台服务器~)。

突破口其实也很明显,从开发者工具中查看静态文件,两个js文件和一个css文件全部有程序作者信息。

这个叫“ph0t0grapher”的人应该就是这个h5活动页的主要程序员了,那么程序员爱用什么网站呢?当然github!我们去github上搜下看。

恰好有一个用户叫“ph0t0grapher”,点进去看下他的repo:

那个叫“huodong”的repo恰好就是靶场入口的全部代码,证明人找对了,看下他的其他repo,fork的不用太关注,个人主页也没啥信息,剩下的那个是node.js编写的发邮件的demo,发现下面代码:

这里看到了邮件的用户名密码认证信息是从config文件中读取的,然而回到上一层目录发现并没有config相关的目录和文件,再看下这个repo的commit信息:

这两条commit message很明显的提示了作者在后来才添加了config相关文件,并且config相关文件也是在最后才删除的,那么作者很可能在添加config相关文件之前直接把邮箱账号密码写到程序中并提交了。直接点第二个commit验证这一点:

成功拿到“liuyan”的邮箱,从host信息中看到是腾讯企业邮箱,直接从“exmail.qq.com”登录(这一步有人尝试登录了qq个人邮箱,哭笑不得😂)。

至此第一关完成。这一关卡住了一批人,主要原因是思路没有跳出,认为靶场入口一定存在某些可利用的漏洞,我稍微没有按套路出牌。实际上在我们渗透测试的时候不也是从收集资产收集信息开始的嘛。

第二关 眼见为虚,愿者上钩

登录邮箱后,从收件箱中看到下面几封邮件:

有发版通知,有领导视察通知,还有APP上线不成功的通知,且还被转发过,转发给了chenguanxi、wuyanzu、liudehua等很多人。

我们重点关注下这条被转发了很多人的邮件,这个邮件iOS开发一定很熟悉且极不喜欢收到,大概就是告诉你你的APP没有通过苹果App Store的审核,需要修改某些地方重新提交云云。这位“liuyan”小姐姐看到了这个邮件应该是很“热心”的转发给了相关人员。然而我们稍微观察一下就不难发现这是一封钓鱼邮件。三个很明显的点:发件邮箱是gmail,点击链接跳到了一个ip地址上(真实场景中我们遇到的钓鱼邮件迷惑性更大一些,由于靶场搭建时间仓促,没有申请像样的邮箱地址和域名,也算是降低难度了。在现实中大家一定要仔细鉴别每一封邮件的真实性),输入任何信息点登录按钮都没有反应。

“liuyan”转发了这封邮件给很多人,那么只要有人信以为真,就会填入用户名密码去尝试登录。如果我们能拿到钓鱼黑客钓到的“鱼”那么就有可能拿到更多人的邮箱账号。

攻破这个钓鱼系统很简单,这里有一个路径漫游漏洞,我们可以去尝试常用文件名和路径,也可以用扫描器,这算是本靶场中唯一能用扫描器的地方了。

很快我们扫到了www.zip这个文件,下载下来是整个钓鱼站的源代码:

其中 post.php是账号密码上传的代码,打开看一下:

原来钓鱼黑客直接把密码存到了网站根目录下的data/password.txt中,直接访问之:

看到了“chenguanxi”的邮箱账号密码就在其中(同时又见到了扫描器来扫荡过的影子😂)。

第二关结束,这部分没有太多难点,跟着“剧情”发展思考下即可,用到的渗透技术点也比较初级,卡在这里的人不多。

第三关 冲云破雾,水到渠成

继续登录chenguanxi邮箱查看邮件:

这些邮件都很有趣,暂且不表。有一封邮件暴露了公司某管理系统的后台地址:

进入后发现有登录注册两个页面,其中注册时要校验工号,邮件中也有提到用工号注册,爆破工号也无效(其实我把工号限制的非常死,防止爆破😂)。

好像没有什么思路了,再看回刚才的邮件,发现有一封邮件提到了MongoDB:

这里面提到了MongoDB的未授权访问,但尝试扫描端口并未发现MongoDB开放在外网,未授权问题很可能在“mowenwei”提醒后解决了,并且为了安全将数据库放到了内网。

那是不是尝试下MongoDB注入呢?百度搜索下MongoDB注入,并根据目标语言(node.js)特性选择{"$ne": null}这样的payload去尝试,发现登录页面并不能直接绕过进入系统,但是注册页面可以绕过工号验证。
payload:

{
  "username": "test",
  "password": "111111",
  "jobnumber":  {"$ne": null}
}

成功注册用户并登陆系统,至此你会看到你自己能管理的服务器,公共服务器和一个ip地址为6.6.6.6的服务器。

6.6.6.6的密码为随机生成,可以作为唯一标识证明自己亲自入侵成功进入系统。做到此步骤的小伙伴已经很6,我都算作解出靶场了,但我同时会提示他还有一个注入点,那个注入点在哪呢?继续看系统。在登录进去后的服务器列表页面中给了相应的提示:“你负责的测试服务器都会在这里展示,生产服务器请联系管理员获取”。也就是说我们是看不到管理员服务器的,但他们应该在数据库中。 在前端console中,我故意打出了这样的数据结构(console中直接打印出数据结构也是程序员经常疏忽的点):

从中可以看出服务器的owner是以数组的形式存的。为了过滤掉admin服务器,只显示自己的和public服务器,很可能用了$where语句,并使用JavaScript语句进行过滤,比较常见的过滤方式是判断字符串的indexOf。那么我们尝试闭合indexOf,构造payload,这一步确实要对MongoDB和JavaScript都比较了解才能做出。

payload:')>0|| this.owners.indexOf('admin

成功拿到admin服务器,靶场Writeup结束。

Comments
Write a Comment