记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

你真的了解LSA Protection (RunAsPPL)吗?

2021-04-15 00:31

原文链接:https://itm4n.github.io/lsass-runasppl/

关于在Windows上防止凭据被盗的保护,启用LSA Protection(RunAsPPL)LSASS可能被认为是第一个实施的建议。但是您真的知道PPL是什么吗?在这篇文章中,我想介绍一些有关“受保护进程”的核心概念,并为后续几天要发布的文章做准备。

介绍

当你想想看,RunAsPPL对于LSASS一个真正的利器。配置非常容易,因为您要做的唯一一件事就是在注册表中添加一个简单的值,然后重新启动。像其他任何保护一样,仅靠它是不够的,但是它仍然特别有效。攻击者若想解决该问题,就必须使用一些相对高级的技巧,最终增加了被检测到的几率。

因此,作为安全顾问,这是我通常向客户提出的最重要的建议之一。但是,从客户的角度来看,我注意到这种保护倾向于与 Credential Guard[1] 混淆,后者是完全不同的。我认为这种混淆是由于尽管Credential Guard和LSA Protection实际上是互补的,但后者似乎提供了更强大的机制。

但是作为顾问,如果您想说服客户他们同时实行这两项防御措施,就必须解释这些概念。不久前,我说我认为的LSA Protection意思就是:“只有经过数字签名的二进制文件才能访问受保护的进程”。您可能已经注意到,这句话没有什么深意,让我意识到我并不真正了解LSA Protection的工作方式。因此,我做了一些研究,发现了一些非常有趣的东西,这也是我为什么要写这篇文章。

免责声明:我在这篇文章中讨论的大多数概念已经被微软官方文档和 Windows Internals 7th Edition[2] 所涵盖,这是我的两个主要信息来源。这篇博客文章的目的不是解释它们,而是收集我认为从安全顾问的角度来看最有价值的信息。

如何启用LSA保护(RunAsPPL)

如前所述,RunAsPPL启用非常容易。该过程在官方文档中有详细说明,并且之前在许多博客文章中也介绍了该过程。

如果要在公司环境中启用它,则应遵循Microsoft提供的文档创建一个组策略:配置其他LSA保护[3]。但是,如果您只想在一台计算机上手动启用它,则只需:

1.以管理员身份打开注册表编辑器(regedit.exe);2.找到 HKLM\SYSTEM\CurrentControlSet\Control\Lsa3.添加DWORD值RunAsPPL并将其设置为1;4.重启。

image.png

就是这样!大功告成!

在整个公司环境中应用此设置之前,需要考虑两个特殊情况。它们都在官方文档中进行了描述。如果对以下两个问题中至少一个的回答为“是”,则需要采取一些预防措施。

1.您是否使用任何第三方身份验证模块?2.您是否使用UEFI和/或安全启动?

第三方身份验证模块–如果需要第三方身份验证模块(例如在智能卡读卡器中),则应确保它们满足此处列出的要求:受保护进程的插件或驱动要求[4]。最基本的,该模块必须使用Microsoft签名进行数字签名,并且必须符合Microsoft安全开发生命周期(SDL)。该文档还包含一些有关如何在推出阶段之前设置审核策略的说明,以确定如果RunAsPPL启用该模块是否将被阻止。

安全启动–如果启用了安全启动,例如现代笔记本电脑通常会启用安全启动,则需要注意一件事。当RunAsPPL启用时,将设置存储在固件,在UEFI变量。这意味着,一旦设置了注册表项并且计算机已重新启动,删除新添加的注册表值将无效并RunAsPPL保持启用状态。如果要禁用保护,则必须遵循Microsoft在此处提供的步骤:禁用LSA保护[5]

你现在抓不到密码了!

到现在为止,我想大家都知道,RunAsPPL对一些抓密码的工具防护很有效,如Mimikatz(在接下来的部分更多的事情)或ProcDump。因此,如下所示的输出应该看起来很熟悉。

image.png

此屏幕快照显示了几件重要的事情:

1.当前用户是默认Administrators组的成员;2.当前用户拥有SeDebugPrivilege(尽管当前已被禁用);3.该命令privilege::debug在Mimikatz成功启用SeDebugPrivilege;4.该命令sekurlsa::logonpasswords失败,并显示错误代码0x00000005。

因此,尽管当前用户拥有所有特权,该命令仍然失败。要理解为什么,我们应该看看kuhl_m_sekurlsa_acquireLSA()在mimikatz/modules/sekurlsa/kuhl_m_sekurlsa.c的代码。这是代码的简化版本,仅显示我们感兴趣的部分。

HANDLE hData = NULL;DWORD pid;DWORD processRights = PROCESS_VM_READ | PROCESS_QUERY_INFORMATION;
kull_m_process_getProcessIdForName(L"lsass.exe", &pid);hData = OpenProcess(processRights, FALSE, pid);
if (hData && hData != INVALID_HANDLE_VALUE) { // if OpenProcess OK} else { PRINT_ERROR_AUTO(L"Handle on memory");}

在此代码段中,PRINT_ERROR_AUTO是一个宏,该宏基本上打印出失败的函数的名称以及错误代码。错误代码本身是通过调用检索的GetLastError()。对于那些不熟悉Windows API工作方式的人,您只需要知道这一点,SetLastError()并且这GetLastError()是两个Win32函数,可用来设置和获取最后的标准错误代码。此处列出了前500个代码:系统错误代码(0-499)[6]

除此之外,其余代码非常简单。它首先获取被调用进程的PID,lsass.exe然后尝试通过标志并通过调用Win32函数将其打开(即获取进程句柄)。我们在上一个屏幕截图中看到的是,此功能失败,并显示错误代码,仅表示“访问被拒绝”。这确认了一旦启用,即使具有的管理员也无法使用所需的访问标志打开。 PROCESS_VM_READ PROCESS_QUERY_INFORMATION OpenProcess 0x00000005 RunAsPPL SeDebugPrivilegeLSASS

到目前为止,我已经解释的所有内容都可以视为常识,因为之前在许多其他博客文章或渗透测试备忘单中已经讨论过这些内容。但是我必须做一下总结,以确保我们都在同一页上,并且还介绍了以下部分。

使用当前已知的技术绕过RunAsPPL

在撰写此博客文章时,有三种主要的已知技术可以绕过RunAsPPL和访问lsass.exe(或一般而言任何其他PPL)的内存。这已经在其他博客文章中讨论过了,因此我将尽量保持简短。

利用mimikatz的mimidrv.sys

在前面的部分中,我说过RunAsPPL有效地阻止了Mimikatz访问的内存lsass.exe,但是该工具实际上也是绕过它的最普遍的技术。

为此,Mimikatz使用数字签名的驱动程序来删除内核中Process对象的保护标志。该文件mimidrv.sys必须位于当前文件夹中,以便使用命令作为内核驱动程序服务加载!+。然后,您可以使用命令!processprotect删除保护并最终访问lsass.exe。


mimikatz # !+mimikatz # !processprotect /process:lsass.exe /removemimikatz # privilege::debugmimikatz # sekurlsa::logonpasswords
image.png

完成后,您甚至可以使用相同的命令“恢复”保护,而无需使用/remove参数,最后使用卸载驱动程序!-。


mimikatz # !processprotect /process:lsass.exemimikatz # !-
image.png

如果您这样做,则需要注意一件事!您必须知道Mimikatz 不能将保护级别恢复到原始级别。下面的两个屏幕截图显示了lsass.exe发出命令前后该过程的保护级别!processprotect /process:lsass.exe。正如你所看到的,当RunAsPPL被启用,保护等级为PsProtectedSignerLsa-Light,而它PsProtectedSignerWinTcb的保护是后恢复 通过Mimikatz。在某种程度上,这使系统比在下一部分中看到的更加安全,但是它也可能具有一些不良的副作用。

image.png
image.png

方法二:用自己的驱动

先前方法的主要缺点是可以很容易地被防病毒软件检测到。例如,即使您能够在内存中执行Mimikatz,您仍然必须将其复制mimidrv.sys到目标上。此时,您可以考虑编译驱动程序的自定义版本,以逃避基于签名的检测,但这也会破坏文件的数字签名。因此,除非您愿意支付几百美元来签署新的驱动程序,否则不会这样做。

如果您不想执行正式的签名过程,则可以使用一个巧妙的技巧。这个技巧包括加载一个官方的,易受攻击的驱动程序,可以利用该驱动程序在内核中运行任意代码。一旦加载了驱动程序,就可以从User-land利用它来加载未签名的驱动程序。例如,这项技术是在gdrv-loader[7]PPLKiller[8]中实现的。

方法三:pypykatz

后两种技术都依赖于使用驱动程序来在内核中执行任意代码并禁用进程保护。这样的技术仍然非常危险,犯了一个错误,就会触发BSOD。

不过,最近,@SkelSec提出了另一种访问方法lsass.exe。在题为Duping AV with handles[9]的文章中,他介绍了一种绕过AV检测/阻止对LSASS进程的访问的方法。

如果要访问LSASS的内存,则要做的第一件事是调用OpenProcess以获取对Process对象具有适当权限的句柄。因此,某些反病毒软件可能会阻止此类尝试,从而在早期阶段有效地终止攻击。SkelSec描述的技术背后的想法很简单:根本不要调用 OpenProcess。但是,那您如何获得初始处理呢?答案来自以下观察。有时,其他进程,例如防病毒软件,已经在其内存空间中的LSASS进程上打开了句柄。因此,作为具有调试特权的管理员,您可以将此句柄复制到您自己的进程中,然后使用它来访问LSASS。

事实证明,该技术还有另一个目的。它也可以用来绕过,RunAsPPL因为某些不受保护的进程可能已经通过另一种方式(例如使用驱动程序)获得了LSASS进程的句柄。在这种情况下,可以通过以下命令使用pypykatz。

pypykatz live lsa --method handledup

什么是PPL流程?

有趣的部分到了。在前面的段落中,我故意掩盖了一些关键概念。我选择展示所有众所周知的事物,以便在这里对其进行更详细的说明。

首先,PPL表示“受保护的流程”,但在此之前,只有“受保护的流程”。Windows Vista / Server 2008引入了受保护进程的概念,其目的不是保护您的数据或凭据。其最初目标是保护媒体内容并符合DRM(数字版权管理)要求。Microsoft开发了此机制,以便您的媒体播放器可以读取例如蓝光,同时防止您复制其内容。当时的要求是映像文件(即可执行文件)必须使用特殊的Windows Media证书进行数字签名(如Windows Internals的“受保护的过程”部分所述)。

在实践中,一个受保护的过程可通过未保护的过程仅具有非常有限的权限访问:PROCESS_QUERY_LIMITED_INFORMATION,PROCESS_SET_LIMITED_INFORMATION,PROCESS_TERMINATE和PROCESS_SUSPEND_RESUME。对于某些高度敏感的过程,甚至可以减少此设置。

几年后,从Windows 8.1 / Server 2012 R2开始,Microsoft引入了Protected Process Light的概念。PPL实际上是对先前“受保护过程”模型的扩展,并添加了“保护级别”的概念,这基本上意味着某些PP(L)进程可以比其他进程受到更多保护。

保护等级

进程的保护级别已添加到EPROCESS内核结构中,并且更具体地存储在其Protection成员中。该Protection成员是一个PS_PROTECTION结构,在此处进行了说明。


typedef struct _PS_PROTECTION {    union {        UCHAR Level;        struct {            UCHAR Type   : 3;            UCHAR Audit  : 1;                  // Reserved            UCHAR Signer : 4;        };    };} PS_PROTECTION, *PPS_PROTECTION;

尽管将其表示为结构,但所有信息都存储在单个字节的两个半字节中(Level是a UCHAR,即an unsigned char)。前3位代表保护Type(见PS_PROTECTED_TYPE下文)。它定义过程是PP还是PPL。后4位代表Signer类型(请参见PS_PROTECTED_SIGNER下文),即实际的保护级别。

typedef enum _PS_PROTECTED_TYPE {    PsProtectedTypeNone = 0,    PsProtectedTypeProtectedLight = 1,    PsProtectedTypeProtected = 2} PS_PROTECTED_TYPE, *PPS_PROTECTED_TYPE;
typedef enum _PS_PROTECTED_SIGNER { PsProtectedSignerNone = 0, // 0 PsProtectedSignerAuthenticode, // 1 PsProtectedSignerCodeGen, // 2 PsProtectedSignerAntimalware, // 3 PsProtectedSignerLsa, // 4 PsProtectedSignerWindows, // 5 PsProtectedSignerWinTcb, // 6 PsProtectedSignerWinSystem, // 7 PsProtectedSignerApp, // 8 PsProtectedSignerMax // 9} PS_PROTECTED_SIGNER, *PPS_PROTECTED_SIGNER;

您可能已经猜到了,进程的保护级别由这两个值的组合定义。下表列出了最常见的组合。

image.png

Signer Types

在“受保护进程”的早期,保护级别是二进制的,即某个进程是否受保护。我们看到在Windows NT 6.3中引入PPL时,情况发生了变化。PP和PPL现在都具有一个保护级别,该保护级别由签名者级别确定,如上所述。因此,要知道的另一件有趣的事情是如何确定签名者类型和保护级别。

这个问题的答案很简单。尽管有一些例外,但签名者级别最常见的是由文件的数字证书中的特殊字段确定的:增强密钥用法(Enhanced Key Usage 简称EKU)。

image.png

在此屏幕截图中,您可以wininit.exe在左侧和SgrmBroker.exe右侧看到两个示例。在这两种情况下,我们都可以看到EKU字段包含代表Windows TCB Component签名者类型的OID 。第二个突出显示的OID代表保护级别,Protected Process Light在wininit.exe和Protected Process的情况下都是如此SgrmBroker.exe。结果,我们知道后者可以作为PP执行,而前者只能作为PPL执行。但是,它们都将具有WinTcb级别。

保护优先级

需要讨论的最后一个关键方面是保护优先级。在Windows Internals 7th Edition第1部分的“ Protected Process Light(PPL)”部分中,您可以阅读以下内容:

在解释进程时,请记住,首先,受保护的进程始终胜过PPL,其次,较高价值的签名者流程可以访问较低的签名者流程,反之亦然。

换句话说:

PP可以打开具有完全访问权限的PP或PPL,只要其签名者级别大于或等于此级别即可;一个PPL可以打开另一个具有完全访问权限的PPL,只要其签名者级别大于或等于该PPL;PPL不能打开具有完全访问权限的PP,无论其签名者级别如何。

注意:毫无疑问,ACL检查仍然适用。成为受保护的流程并不能赋予您超能力。如果您以低特权用户身份运行受保护的进程,则将无法神奇地访问其他用户的进程。这是附加保护。

为了说明这一点,我选择了3个易于识别的进程/图像文件:

wininit.exe –会话0初始化lsass.exe – LSASS流程MsMpEng.exe – Windows Defender服务

image.png
image.png

这3个PPL的运行方式NT AUTHORITY\SYSTEM与之相同,SeDebugPrivilege因此在此示例中无需考虑用户权限。这全部归结为保护级别。正如wininit.exe签名者类型WinTcb(对于PPL而言,这是最大可能的值)一样,它可以访问其他两个进程。然后,lsass.exe可以MsMpEng.exe在签名者级别Lsa高于时访问Antimalware。最后,MsMpEng.exe由于它具有最低级别,因此不能访问其他两个进程。

结论

最后,受保护过程(轻量级)的概念仍然是对Userland的保护。它旨在防止普通应用程序(即使具有管理员权限)访问受保护的进程。这就解释了为什么大多数常见的绕过这种保护的技术都需要使用驱动程序。如果您能够在内核中执行任意代码,则可以(几乎)执行所需的任何操作,并且完全可以禁用对任何Protected Process的保护。当然,多年来,由于您现在需要加载数字签名的驱动程序,这变得有些复杂,但是如我们所见,此限制可以解决。

在本文中,我们还看到该概念已从基本的未受保护的模型演变为分层模型,在分层模型中,某些进程可能比其他进程受到更多保护。特别是,我们看到“ LSASS”具有其自己的保护级别– PsProtectedSignerLsa-Light。这意味着具有较高保护级别的进程(例如:“ WININIT”)仍然可以完全访问权限打开该进程。

我没有提到PP / PPL的一个方面。这里的“ PPL”中的“ L”是有原因的。确实,通过使用“受保护的过程灯”的概念,整体安全模型被部分地放宽了,这为Userland的利用打开了方便之门。在接下来的几天中,我将发布本文的第二部分,以讨论其中一种技术。这也将伴随着新工具PPLdump的发布。顾名思义,此工具为本地管理员提供了仅使用Userland技巧即可转储任何PPL进程的内存的功能。

最后,我想提一下,这项研究和开发工作部分是根据我在SCRT的工作而完成的。因此,下一部分将发布在他们的Blog上,但我会让您发布在Twitter上。最好的还没有到来,敬请期待!

链接与资源

Microsoft-如何配置凭据的其他LSA保护 https://docs.microsoft.com/zh-cn/windows-server/security/credentials-protection-and-management/configuring-additional-lsa-protection

Windows Internals 7th Edition(Part 1) https://docs.microsoft.com/zh-cn/sysinternals/resources/windows-internals

References

[1] Credential Guard: https://docs.microsoft.com/en-us/windows/security/identity-protection/credential-guard/credential-guard
[2] Windows Internals 7th Edition: https://docs.microsoft.com/en-us/sysinternals/resources/windows-internals
[3] 配置其他LSA保护: https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/configuring-additional-lsa-protection#to-enable-lsa-protection-using-group-policy
[4] 受保护进程的插件或驱动要求: https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/configuring-additional-lsa-protection#protected-process-requirements-for-plug-ins-or-drivers
[5] 禁用LSA保护: https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/configuring-additional-lsa-protection#to-disable-lsa-protection
[6] 系统错误代码(0-499): https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-
[7] gdrv-loader: https://github.com/alxbrn/gdrv-loader
[8] PPLKiller: https://github.com/RedCursorSecurityConsulting/PPLKiller
[9] Duping AV with handles: https://skelsec.medium.com/duping-av-with-handles-537ef985eb03


分享、点赞、看就是对我们的一种支持!



知识来源: https://mp.weixin.qq.com/s?__biz=MzU0ODg2MDA0NQ==&mid=2247485958&idx=1&sn=ab8eba8e92c54a7771a438b0df7e4be9

阅读:209964 | 评论:0 | 标签:无

想收藏或者和大家分享这篇好文章→复制链接地址

“你真的了解LSA Protection (RunAsPPL)吗?”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

黑帝公告 📢

永久免费持续更新精选优质黑客技术文章Hackdig,帮你成为掌握黑客技术的英雄

广而告之 💖

标签云 ☁