关于TryHackMe.com上Steel Mountain靶机的演练报告及CVE-2014-6287漏洞利用
关于 TryHackMe.com 上 Steel Mountain 靶机的 write-up 以及 CVE-2014-6287 的利用程序
我本人对最初发现和利用此漏洞不持任何功劳。感谢以下人员!
发现者:
Daniele Linguaglossa
Metasploit 模块作者:
Muhamad Fadzil Ramli
TryHackMe 房间及作者:
https://tryhackme.com/room/steelmountain
https://tryhackme.com/p/tryhackme
参考资料:
https://nvd.nist.gov/vuln/detail/CVE-2014-6287
https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/http/rejetto_hfs_exec.rb
https://subscription.packtpub.com/book/networking_and_servers/9781786463166/1/ch01lvl1sec20/vulnerability-analysis-of-hfs-2-3
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6287
https://www.tutorialspoint.com/pascal/pascal_functions.htm
我绝非资深安全专家。这意味着我可能会提供一些不准确的信息。如果您是资深专业人士/经验丰富的研究人员,并发现任何错误,请告知我,以便我回来学习并纠正错误,提供正确信息。这对我以及可能偶然看到这篇 write-up 的其他新手研究人员都有益处。如果您发现我写的信息有误,请通过 [email protected] 联系我,以便我进行修正。谢谢!
Rejetto 文件服务器(也称为 HFS)是一款用于在网络中发布和共享文件的程序。在 2.3 版本中,存在一个漏洞(CVE-2014-6287),攻击者可以通过在搜索参数中插入一个空字节来执行系统命令。代码未能正确使用其正则表达式配置处理空字节,从而导致远程代码执行漏洞。
该漏洞可在 findMacroMarker 函数中找到,该函数源自 parserLib.pas 文件。.pas 是 Pascal 编程语言的文件扩展名。截至本文撰写时,我尚未使用 Pascal 编写过任何代码。让我们看看代码片段并分析其功能!
function findMacroMarker(s:string; ofs:integer=1):integer;
begin result:=reMatch(s, '{[.:]|[.:]}||', 'm!', ofs) end;
第一行代码是名为 findMacroMarker 的函数声明,它接受两个参数。在 Pascal 中,参数的数据类型必须声明,因此 s:string 表示变量 s 是一个字符串,同样,变量 ofs 的数据类型为 integer(整数)。在参数右侧,我们看到一个冒号后跟 integer。这被称为函数类型。分号表示该行代码的结束。下一行代码的第一个词是 begin。这告诉编译器函数从何处开始。接下来我们看到一个名为 result 的变量,后跟赋值运算符 :=。result 变量被赋值为 reMatch 函数的结果。我在互联网上找不到关于 reMatch 的任何信息,因此我假设它是 HFS 中其他地方编写的自定义函数。幸运的是,该函数一目了然。reMatch 显然是正则表达式匹配的缩写,后跟所查找的正则表达式模式,该模式在 reMatch 函数的参数以及第一行代码中定义的初始变量参数中都有体现。在第二行末尾,end 一词用于为编译器定义函数的结束。
漏洞出现在上述 reMatch 函数中的正则表达式模式中。该正则表达式未能正确处理空字节 %00。当我们传递一个带有前置空字节的系统命令时,该函数将遇到此 bug 并在主机上执行该命令。要利用此漏洞,我们只需在 GET 请求的搜索参数中传递空字节,后跟 {.exec|code.}(其中 code 是要执行的命令),URL 格式如下:
http://(IP地址/域名)/?search==%00{.exec|要执行的命令.}
我们先用 rustscan 进行端口扫描。我倾向于使用 rustscan 快速了解攻击面。

这里开放了大量端口。现在我们使用 nmap 深入挖掘,找出这些端口上运行的服务,从而找到可利用的服务。

我们看到在较高端口上运行着一个名为 Microsoft Windows RPC 的服务。RPC 是远程过程调用,允许 Windows 进程通过网络或在计算机内部进行通信。接着,我们在 80 和 8080 端口上发现有几个不同的 Web 服务器。在 5985 和 47001 端口上存在 Microsoft Httpapi Httpd,它允许应用程序通过 HTTP 进行通信,而无需 Microsoft IIS(Internet 信息服务)。Nmap 检测到 3389 端口可能运行着一个 Web 服务器,但我无法通过 HTTP 或 SSL 连接。我们先连接到 80 端口的 Web 服务器,因为这是 HTTP 协议的标准端口。

在 80 端口上,我们看到了一个网页,显示了钢铁山脉公司的标志和一张标有“月度最佳员工”的照片。如果打开 Web 开发者工具,我们可以看到照片被命名为 BillHarper.png,这给我们提供了第一个问题的答案。让我们连接到其他正在监听的服务,看看能找到什么。

当我们连接到 5985 端口的服务时,得到了 HTTP 错误代码 404。404 错误代码表示服务器无法找到请求的资源。这里没什么有趣的。我们继续下一个。

没错!这个看起来很有趣。在 8080 端口上,我们有一些文件共享服务。让我们四处看看,能否找到关于这个服务的更多信息。如果查看左下角,我们可以看到名称和一个看起来像版本号的文字:HttpFileServer 2.3。我们进一步枚举。

如果点击标记为 HttpFileServer 2.3 的链接,我们会被引导到一个网页,显示运行在 8080 端口上的软件名称。这里是 Rejetto HFS HTTP File Server。让我们检查 47001 端口上的另一个服务,以确保覆盖所有基础。如果找不到有用的信息,我们可以回到 Rejetto 并开始查找已知的 CVE。

看起来 47001 端口上又是一个 404。让我们开始查找 Rejetto HFS 2.3 的 CVE。

快速搜索发现存在一个已知的 HFS 2.3 的 CVE 列表。我们将从 THM 指南中脱离出来,不依赖预设的 Metasploit。我编写了一个利用程序,可以为我们提供一个 shell。要使用它,你需要访问 revshells.com,输入正确的网络信息,并选择 PowerShell #3 (Base 64)。获得载荷后,将其复制并粘贴到利用程序第 13 行的 payload 变量中,然后运行利用程序。监听器会自动打开,你应该能够访问系统。注意:你可能需要多次运行利用程序才能捕获到 shell。

太好了!我们已进入系统,并且额外获得了 PowerShell shell。这意味着我们可以访问 .NET cmdlet。相比标准的命令提示符 shell,我们可以用这个造成更大的破坏。接下来进行权限提升。THM 指南为我们提供了一个有用的工具 PowerSploit,其中包含用于枚举机器潜在提权向量的工具。我们将把 PowerUp.ps1 放到目标机器上,并利用它来帮助我们控制机器。

首先,在我们存放 PowerUp.ps1 文件的目录中启动一个简单的 HTTP 服务器。然后在目标系统上,我们使用 Invoke-Webrequest cmdlet 从我们的服务器拉取文件到目标机器。接下来,我们将安装并运行 PowerUp 附带的其中一个 cmdlet。

要安装 PowerUp.ps1,请运行此命令:. .\PowerUp.ps1。接着我们需要使用新的 cmdlet Invoke-AllChecks。运行后,我们得到了一大堆输出。我已将其缩减到我们想要的重要部分。我们可以看到 PowerUp 告诉我们,我们有权限修改该文件。让我们检查正在运行的服务,以便在它运行时将其关闭。我们需要这样做,因为如果文件正在被服务使用,我们就无法对其进行任何操作。

通过使用 Get-Service cmdlet,我们得到了机器上存在的服务列表。由于我们的目标服务正在运行,我们需要将其关闭,以便修改并覆盖二进制文件。

要停止服务,我们使用 Stop-Service cmdlet,后跟服务名称。现在我们需要使用 Get-Service cmdlet 再次确认服务已停止。如上所示,我们可以确认服务确实已停止。让我们进入包含目标二进制文件的目录。该目录是 C:\Program Files (x86)\IObit\Advanced SystemCare。

注意二进制文件的大小,它位于最右侧列中二进制文件名的左侧。

创建一个 meterpreter 载荷,并像之前一样使用 Python Web 服务器模块托管它。

使用你创建载荷时使用的相同网络信息启动一个 meterpreter 监听器。

使用 Invoke-Webrequest cmdlet 将我们的 meterpreter 载荷从我们的机器拉到目标系统。确保将其命名为 ASCService.exe,以便利用弱文件权限覆盖正常的二进制文件,用我们的恶意二进制文件取而代之。

通过列出目录并检查文件大小是否发生变化来确认二进制文件已被覆盖。在这种情况下,文件大小从 6 位数变为 5 位数,这确认我们已成功上传恶意二进制文件!

当恶意二进制文件替换了正常文件后,我们只需使用 Start-Service cmdlet 重新启动服务。当我们这样做时,机器将执行我们的载荷并为我们提供一个 meterpreter shell!我们可以在 meterpreter 中运行 getuid 来检查是否获得了 NT AUTHORITY/SYSTEM。运行 getuid 后,我们确实可以看到已经控制了这台机器!祝你度过愉快的一天!