[译]Windows权限滥用:审核,检测和防御

原文:Windows Privilege Abuse: Auditing, Detection, and Defense
原文发布时间2019年1月30日
作者:https://medium.com/@palantir
如果你熟悉美国公司的话会知道这是个CIA投资的大数据公司,所以没有头像,作者名字在最后。

任何对此文感兴趣的读者请花费50美元/年或5美元/月的价格参加Medium会员计划,否则每月只能查看三篇文章。
一个月一餐盒饭钱,我觉得并不贵,你说呢?

以下为本人对文章的翻译。不对内容负责,也不对任何翻译错误负责,同时不包含任何图片内容,如需查看图片请付费查看原文链接,谢谢。

注:本文的上一篇文章的中文翻译在此,原来可以拿200的稿费啊哈哈哈。
行动力强的可以去注册账号投稿赚钱哦。
本站坚持不盈利,以上。


权限是Windows中重要的本地安全控件。顾名思义,特权授予帐户在操作系统中执行特权操作的权限:调试,模拟等。了解特权以及攻击者会如何滥用特权的防御者可以增强其检测能力和减少易受攻击点。

在这篇博文中,我们简要介绍了特权,并分享了我们检测和防止滥用的建议。我们将介绍防御者需要了解的保护权限的关键概念,并提供有关如何通过审核,检测策略和目标权限移除来提高安全性的示例。

Windows权限简介

权限是授予帐户在操作系统中执行特权操作的权限。区分特权(适用于系统相关资源)和访问权限(适用于安全对象)非常重要。Microsoft在其Access Control文档中提供了Windows权限的详细说明。下面,我们将介绍需要了解的最重要的概念来更好地防范滥用行为。

访问令牌

访问令牌是操作系统安全资源的所有授权决策的基础。它们由本地安全机构(LSA)授予授权用户。访问令牌包括用户的安全标识符(SID),组SID,特权,完整性级别和其他安全相关信息。

此处有图
用户访问令牌和安全对象。参考:Microsoft安全原则文档

用户创建的每个进程或线程都会继承其令牌的副本。此令牌用于在访问安全对象或在操作系统中执行特权操作时执行访问检查。

访问令牌可以作为主令牌模拟令牌存在。主令牌的功能如上所述,用于展示进程或线程的默认安全信息。

模拟允许线程使用来自其他用户或客户端的访问令牌执行操作。模拟令牌通常用于客户端/服务器通信。例如,当用户访问SMB文件共享时,服务器需要用户令牌的副本来验证用户是否具有足够的权限。除了线程的主令牌之外,执行服务器端线程还包括用户的模拟令牌,并使用模拟令牌对用户的操作执行访问检查。

受限访问令牌

受限制的令牌(也称为被过滤的管理令牌)是已被修改为具有控制权限或许可的主要令牌或模拟令牌的子集。受限制的访问令牌允许系统删除权限,添加拒绝访问控制条目或执行其他访问权限更改。

假设在初始令牌创建过程中正在运行用户帐户控制(UAC),LSA将尝试识别用户是否是特权组的成员,或者是否已使用与IsTokenRestricted函数类似的功能授予敏感特权。存在受限制的SID将导致调用以生成低特权的新访问令牌。

可以在以下屏幕截图中看到受限访问令牌的示例:

此处有图

即使此处用户是本地管理员,未升级的cmd.exe shell也会将一个令牌限制为少数权限。当提升为以管理员身份运行时,该进程会携带具有更大权限列表的用户主令牌:

此处有图

也可以使用Process Explorer检查主令牌。以下屏幕截图显示了附加到未提权进程的受限访问令牌。

此处有图

以下屏幕截图显示了附加到提权进程的主要访问令牌:

此处有图

常被滥用的特权

Microsoft提供了一些概述了Windows中的权限常量文档。这些权限可以直接分配给用户,也可以通过组成员身份继承。虽然许多特权可以被滥用,但以下是恶意软件和攻击中最常被滥用的特权常量:

  1. SeBackupPrivilege
    说明:此权限使系统将所有读取访问控制授予任何文件,而不管为文件指定的访问控制列表(ACL)如何。
    攻击场景:收集。
  2. SeCreateTokenPrivilege
    描述:创建主令牌所必需的。
    攻击场景:特权升级
  3. SeDebugPrivilege
    描述:调试和调整另一个帐户拥有的进程的内存所必需。
    攻击场景:特权升级; 躲避防御; 凭证访问
  4. SeLoadDriverPrivilege
    描述:加载或卸载设备驱动程序所必需的。
    攻击场景:持久性; 躲避防御
  5. SeRestorePrivilege
    描述:执行还原操作所必需的。此权限使系统将所有写访问控制授予任何文件,而不管为文件指定的ACL。
    攻击场景:持久性; 防御逃跑
  6. SeTakeOwnershipPrivilege
    描述:获取对象的所有权而不被授予自由访问权限。
    攻击场景:持久性; 躲避防御; 采集
  7. SeTcbPrivilege
    描述:此权限将其持有者标识为可信计算机库的一部分。某些受信任的受保护子系统被授予此权限。
    攻击场景:特权升级

Abusing Token Privileges for LPE ”白皮书提供了权限滥用技术的全面参考,有关详细信息,请参阅“3.1 - 可利用权限”一节。

特权审核和删除

现在我们已经列出了一些关键的权限概念,让我们来看一个代表性的例子:识别和减轻滥用调试程序权限(SeDebugPrivilege)。

SeDebugPrivilege允许进程检查和调整其他进程的内存,并且长期以来一直是安全问题。无论安全描述符如何,SeDebugPrivilege都允许令牌承载访问任何进程或线程。Windows凭证收集工具Lsadump使用此技术为进程提供对本地系统机构(LSASS)的内存空间的读访问权限。恶意软件还滥用此权限来执行代码注入其他可信赖的进程,因为它允许在目标进程中创建新的远程线程

SeDebugPrivilege确实有许多合法的用例。许多管理工具需要检查其他进程的内存以进行故障排除或分析。同样,许多将自己的代码注入系统上运行进程的商业应用程序需要SeDebugPrivilege才有正当理由。(例如,请参阅此文章,了解Symantec Endpoint Protection如何依赖SeDebugPrivilege。)

SeDebugPrivilege的其他上下文及其在恶意软件中的使用可以在几本书籍和出版物中找到。我们引用的一些内容是“The Art of Memory Forensics” (页:173,186,197-199),Malware Analysts Cookbook (页:58,231,589)和 Windows Malware Analysis Essentials (页:143)。

启用权限审核

现在让我们将审核视为一种收集识别潜在特权滥用所必需的事件的技术。在Palantir,我们使用本机Windows事件转发(WEF)来收集中央位置的审计日志。如果您想部署WEF,请参阅我们之前的博客文章GitHub以获取配置和管理详细信息。

Windows 10和Server 2016中的本机事件日志记录工具支持在操作系统中使用审核权限。可以通过组策略对象(GPO)启用对敏感权限使用非敏感权限使用的审计,并通过WEF订阅进行收集。此外,审核分配给新登录的特权以识别创建特权访问令牌的位置是有价值的。

在大多数环境中,我们建议您仅收集与敏感权限使用相关的事件,并禁用对备份和还原权限使用的审核。虽然这些技术可以被恶意行为者用作收集,持久性和躲避防御技术的一部分,但它们会产生过多的事件。

通过应用正确的审计GPO,我们收集以下权限的使用情况:

  • 作为操作系统的一部分
  • 创建一个令牌对象
  • 调试程序
  • 使计算机和用户帐户可信任以进行委派
  • 生成安全审核
  • 身份验证后模拟客户端
  • 加载和卸载设备驱动程序
  • 管理审核和安全日志
  • 修改固件环境值
  • 替换进程级令牌
  • 获取文件或其他对象的所有权

识别权限使用情况

现在事件日志已经被收集到一个集中的位置,我们可以通过有针对性的搜索来识别潜在的可滥用的权限原语。

当我们使用事件代码4672(分配给新登录的特权)收集事件时,我们可以在我们的队列中执行搜索,以确定生成具有SeDebugPrivilege的用户令牌的位置。一个示例事件:

LogName=Security
SourceName=Microsoft Windows security auditing.
EventCode=4672
EventType=0
Type=Information
ComputerName=dane
TaskCategory=Special Logon
OpCode=Info
RecordNumber=17946067
Keywords=Audit Success
Message=Special privileges assigned to new logon.
Subject:
    Security ID:        
    Account Name:        dane
    Account Domain:        
    Logon ID:        0x5623BE0
Privileges:        SeSecurityPrivilege
            SeTakeOwnershipPrivilege
            SeLoadDriverPrivilege
            SeBackupPrivilege
            SeRestorePrivilege
            **SeDebugPrivilege**
            SeSystemEnvironmentPrivilege
            SeImpersonatePrivilege
            SeDelegateSessionUserImpersonatePrivilege

在这种情况下,用户帐户被授予SeDebugPrivilege作为登录事件的一部分。这表明在该机器上生成的用户令牌可能被具有系统访问权限的恶意行为者瞄准并滥用。

如果启用了授权策略更改审核,则在启用或禁用令牌权限时,我们会额外接收事件通知。4703事件的一个示例(调整了用户权限):

LogName=Security
SourceName=Microsoft Windows security auditing.
EventCode=4703
EventType=0
Type=Information
ComputerName=dane
TaskCategory=Authorization Policy Change
OpCode=Info
RecordNumber=161204239
Keywords=Audit Success
Message=A user right was adjusted.
Subject:
    Security ID:        
    Account Name:        dane
    Account Domain:        
    Logon ID:        0x3E7
Target Account:
    Security ID:        
    Account Name:        dane
    Account Domain:        
    Logon ID:        0x3E7
Process Information:
    Process ID:        0xa64
    Process Name:        C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe
Enabled Privileges:
            **SeDebugPrivilege**
Disabled Privileges:
            -

在此实例中,修改了用户帐户令牌以启用SeDebugPrivilege。虽然本质上不是恶意的,但这可能表明了使用PowerShell二进制文件执行代码注入或受保护的凭据访问的对手活动。

最后,事件ID 4673调用特权服务)和4674尝试对特权对象进行操作)可能包含其他上下文或其他特权调用。4673事件的一个例子:

LogName=Security
SourceName=Microsoft Windows security auditing.
EventCode=4673
EventType=0
Type=Information
ComputerName=dane
TaskCategory=Sensitive Privilege Use
OpCode=Info
RecordNumber=93434404
Keywords=Audit Failure
Message=A privileged service was called.
Subject:
    Security ID:        
    Account Name:        dane
    Account Domain:       
    Logon ID:        0xADF23180D
Service:
    Server:    Security
    Service Name:    -
Process:
    Process ID:    0xf818
    Process Name:  C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Service Request Information:
    Privileges:        **SeTcbPrivilege**

在此实例中,PowerShell二进制文件作为普通用户调用了特权SeTcbPrivilege。攻击者可以滥用SeTcbPrivilege来生成具有其他特权或功能的新令牌,然后将其用来模拟。

删除被滥用的权限

现在我们已经分析了SeDebugPrivilege事件日志并验证了它们是否可以安全删除,我们执行删除以确保只有需要此权限的用户才能使用它。

首先,我们在Active Directory中创建一个安全组(SeDebug-Exceptions-sg)。添加到安全组的任何用户都可以继续在其系统上使用SeDebugPrivilege(例如,执行系统级调试的管理员),而任何其他用户都将失去该权限(例如,招聘,帮助台)。

接下来,我们生成组策略对象(GPO)并将其配置为仅将“调试程序”的权限分配给SeDebug-Exceptions-sg组中的用户。可以在以下位置配置该设置: Computer Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment

然后,我们将GPO部署到整个机群中的机器和用户,并进行安全过滤。

测试和验证

一旦部署到测试环境,我们就会进行测试和验证,以发现任何不利影响或问题。使用从Windows安全性派生的数据,我们对可能受影响的用户帐户列入白名单。在测试阶段结束时,没有发现任何报告或问题可归因于更改。然后,我们可以将权限移除GPO应用于机群的其余部分。

下图是我们其中一台机器的管理提示。请注意,即使与提权的cmd.exe进程关联,令牌中也不再存在SeDebugPrivilege:

此处有图

使用Windows事件和基于本机的脚本的组合,我们继续监视和跟踪SeDebugPrivilege,直到我们可以验证机群已收到更改并且稳定。

问题和限制

最后,让我们讨论前述的权限删除技术的局限性。

首先,并非所有易受滥用的特权都可以被删除(例如SeBackupPrivilege,SeImpersonatePrivilege等)。因此,这种技术应被视为深度防御战略的众多层面之一,而不是灵丹妙药。

其次,修改权限不会限制系统级帐户。为了使操作系统和相关工具正常工作,这些权限是必需的,不能撤销。这方面的一个示例是以下与SYSTEM用户的主要访问令牌相关联的权限的屏幕截图。这样的动作将在检测和警报中捕获,但重要的是要注意在系统上获得特权无法硬性停止。

此处有图

在这种情况下,管理员用户可作为NT AUTHORITY\SYSTEM执行psexec以生成一个cmd.exe shell环境。请注意在令牌的关联权限表中存在SeDebugPrivilege。如果为用户授予其计算机的管理员权限,则有多种机制可以绕过此安全控制。

结论

虽然所提出的技术本身不会阻止坚定的攻击者,但它是一种有价值的纵深防御控制,可以关闭自动恶意软件功能并阻止一些开箱即用的攻击者工具。凭借对特权以及攻击者如何滥用特权的理解,防御者可以为他们的系统开发和实施增强的攻击探测和减少攻击面的能力。

进一步阅读

作者

Chad D.,Dane S.,Tyler B.