Hack The Box-Three
Hack The Box-Three
xxshhIntroduction
在信息收集过程中,使用 gobuster 爆破子域名,发现该网站使用 AWS S3 bucket作为其云存储设备。利用配置不当的 S3 bucket,上传后门到网站根目录。在本地主机编写一个反弹shell脚本,启动一个 Web 服务器并开启一个监听端口。然后浏览器访问相应的 URL,让目标主机获取并执行反弹shell,最终获取目标主机的控制权。
Write-up
首先,nmap扫描开放端口:
|
发现操作系统是Linux,有两个端口开放:22(ssh)和80(http):
访问 http://10.129.27.203 :
contact页面发现一个子域名:
通常,不同的子域名会对应不同的 IP 地址。但是也可以由同一台服务器处理多个子域名。这种情况下,服务器通过 HTTP 请求中的 Host
头来确定应该由哪个应用程序处理该请求。现在我们有域名thetoppers.htb ,接下来尝试寻找同一服务器的其他子域名。
主机在向 DNS 服务器查询前,会先检查本地 hosts 文件中是否已存在目标主机名的映射关系。所以我们首先需要通过 /etc/hosts
将 thetoppers.htb 手动映射到靶机的 IP 地址:
|
- gobuster
- 基本用法:
- 目录爆破:
gobuster dir -u http://example.com -w /path/to/wordlist.txt
- 子域名爆破:
gobuster dns -d example.com -w /path/to/wordlist.txt
- 虚拟主机枚举:
gobuster vhost -u http://example.com -w /path/to/wordlist.txt
- S3 存储桶枚举:
gobuster s3 -w /path/to/wordlist.txt
- 自定义头部:
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 爆破子域名:
|
结果显示存在一个名为 s3.thetoppers.htb 的子域名,在 /etc/hosts 文件中为此子域名也添加一个条目:
|
访问这个子域名:
Amazon S3 是一种基于云的对象存储服务(OSS),它使用 buckets 作为存储容器,类似于文件夹。使用场景包括备份和存储、媒体托管、软件交付、静态网站托管等。我们可以借助 awscli 与 S3 buckets进行交互。
首先,设置其所有字段为任意值:
使用 ls 命令列出服务器托管的所有 S3 buckets:
|
然后查看指定 bucket 内的对象和公共前缀(PRE,类似文件夹):
|
在 thetoppers.htb 这个bucket内,我们看到了一个名为 /images的文件夹,一个.htaccess(Apache 服务器的配置文件)和一个index.php,这符合网站根目录的文件结构。
awscli 允许上传文件到 S3 bucket,我们随意上传一个文件作测试:
|
浏览器访问 http://thetoppers.htb/hash.txt:
发现上传到 S3 bucket的文件成功在浏览器上被显示出来了,由此分析该S3 bucket被用作网站的 webroot
。根据这个漏洞,我们可以上传后门,获取网站的控制权。
我的Wappalyzer没分析出来网站用的什么编程语言,官方题解说是 PHP 。于是写一个 php 一句话木马:
|
写入 shell.php 文件:
|
上传 shell.php:
|
这里在浏览器访问文件失败。查看 shell.php,发现文件内容变为:
|
原因是 shell 对双引号内的内容会进行变量解析,而 $_GET["cmd"]
被解释为一个尚未定义的变量(空值)。解决办法是将双引号改成单引号,单引号内部的内容不会被解析,因此可以正确保留 $_GET["cmd"]
:
|
尝试使用 URL 参数 cmd 执行 OS 命令 id :
|
证明已经成功上传后门。接下来就要想办法获取目标主机的控制权。
在实际场景中,很多内网机器并没有对外开放的端口供连接。而且目标主机通常位于受防火墙保护的内网环境中,无法直接通过正向连接访问。但目标机器可以主动发起出站连接,因为出站流量通常允许通过防火墙。这时就要用到反弹 shell 了。
创建一个 shell.sh,使用[~]#棱角 ::Edge.Forum*一键生成(一开始用的nc,失败了):
|
本地主机开放8888端口监听:
|
在本地主机 8000 端口上启动一个 Web 服务器:
|
在浏览器上使用 curl 命令从本地主机获取 shell.sh,然后将其通过管道传输到 bash 以执行它:
|
成功下载:
监听端口显示连接成功,找到flag:
Conclusion
在这次靶场练习中,最大的收获是实际操作了以前学过的知识,比如上传后门和反弹shell。除此之外,又认识了一个渗透神器 gobuster,还了解了OSS,之前只听说过,但是没遇到过。在整个过程中,相对于以前的刷题过程,我多了些思考,并通过Chatgpt解决了疑惑,但是对一些命令还是不够熟练,以后再接再厉。