首页
论坛
课程
招聘
[翻译]Windows特权滥用:审计,检测和防御
2019-3-28 10:46 8167

[翻译]Windows特权滥用:审计,检测和防御

2019-3-28 10:46
8167

Windows特权滥用:审计,检测和防御

原文:https://medium.com/palantir/windows-privilege-abuse-auditing-detection-and-defense-3078a403d74e
翻译:玉林小学生
校对:银雁冰
特权是Windows中一个重要的原生安全控制机制。如名称所描述,特权授予账户在操作系统内执行特权操作的权利:调试,模拟令牌等。防护人员了解特权相关知识并知道攻击者如何滥用特权有助于增强他们的检测和攻击面减缓能力。
本文中,我们对特权进行一个简单介绍,并分享我们检测和阻止特权滥用的建议。文中包括了防护人员保护系统特权需要知道的关键概念,并提供了关于如何通过审计、检测策略和目标特权删减来增强系统安全的样例。

Windows特权介绍

特权是授予一个账户的在系统内执行特权操作的权利。需要区分特权(应用于系统相关的资源)和访问权限(应用于安全对象)。微软在访问控制文档中详细介绍了特权。下面,我们介绍几个防护特权滥用需要的重要概念。

访问令牌

访问令牌是对系统内所有安全资源执行授权决策的基础。它通过LSA(Local Security Authority)授予用户。访问令牌包含用户的SID(security identifier),组SID,特权,完整性等级和其它安全相关信息。

 

用户创建的每个进程或线程都继承了一份创建者令牌的副本。这个令牌用于在系统内访问安全对象或执行特权行为时执行访问检测。
访问令牌作为主令牌或模拟令牌存在。主令牌功能如上描述并被用于代表进程或线程的默认安全信息。
模拟操作准许一个线程使用另一个用户或客户端的访问令牌执行一个操作。模拟令牌常在客户端、服务端通信中使用。例如,当一个用户访问一个SMB文件共享,服务端需要一个用户令牌的副本来验证用户是否拥有足够的权限。此时,服务端线程除了拥有一个自身的主令牌外还拥有一个用户的模拟令牌,并使用用户的模拟令牌进行用户行为的访问检测。

受限访问令牌

受限令牌(也称作被过滤的管理令牌)是主令牌或模拟令牌的子集,被修改用于控制特权或权限。受限访问令牌准许系统移除特权,增加拒绝访问控制项,或进行其它访问权限改变。
假设在最初创建令牌时系统内运行着UAC(User Account Control),LSA会尝试识别用户是否为一个特权组的成员或者被IsTokenRestricted类似的函数授予了一个敏感特权。如果存在一个受限的SID,将使用被删减的特权产生一个新的访问令牌。
受限访问令牌的一个样例见下面的截图:
受限访问令牌
尽管用户毫无疑问是本地管理员,未提升权限的cmd.exe只拥有一个有部分特权的受限令牌。当通过以管理员运行提升了权限,进程将拥有用户的有更多特权的主令牌:

也可以使用Process Explorer工具查看进程的主令牌。下面的截图展示了未提权进程的受限令牌。

下面的截图展示了提权进程的主访问令牌:

通常被滥用的特权

微软提供了列出Windows下特权常量的文档。这些特权可以直接分配给一个用户或者通过基于组成员关系继承得到。这些特权中的许多可以被滥用,下面列出的是最常被恶意软件和攻击技术滥用的特权值
1. SeBackupPrivilege
描述:该特权导致拥有对所有文件的读访问权限,无视文件的访问控制链表(ACL)。
攻击情景:搜集
2. SeCreateTokenPrivilege
描述:请求创建一个主令牌
攻击情景:特权提升
3. SeDebugPrivilege
描述:通过任意账户请求调试和调整某个进程拥有的内存
攻击情景:特权提升;防护逃逸;凭据窃取
4. SeLoadDriverPrivilege
描述:请求加载或卸载一个设备驱动。
攻击情景:渗透;防护逃逸
5. SeRestorePribilege
描述:请求执行恢复操作。该特权使得系统授权对任意文件的写访问,无视文件的ACL。
攻击情景:渗透;防护逃逸
6. SeTakeOwershipPrivilege
描述:无需授予任意访问权限,获得某个对象的拥有权。
攻击情景:渗透;防护逃逸;搜集
7. SeTcbPrivilege
描述:表示它的持有者是可信计算基的一部分。一些被可信计算保护的子系统被授予这个权限。
攻击情景:特权提升
“对LPE滥用令牌特权”白皮书对特权滥用技术进行了一个综合介绍,更多信息见其3.1节----利用特权。

特权审计和免除

现在我们已经展示了特权的关键概念,现在我们看一个典型样例:发现并解除对调试特权(SeDebugPrivilege)的滥用。
SeDebugPrivilege准许进程查看并修改其它进程的内存,是一个长期存在的安全问题。SeDebugPrivilege准许令牌持有者访问任何进程或线程,无视安全描述符的限制。Windows证书搜集工具Lsadump使用该技术获得对Local System Authority (LSASS)内存空间的读访问。恶意软件也使用该技术向可信进程中注入代码,因为使用该权限能够在目标进程中创建远程线程
SeDebugPrivilege有许多合法使用情景。许多管理工具需要检查其它进程的内存来定位错误或者了解运行状况。同样的,许多商业应用程序基于合法的原因需要SeDebugPrivilege以将它们自己的代码注入到系统内运行的进程中。(例如,这篇文章解释了赛门铁克终端保护系统如何依赖于SeDebugPrivilege特权)
更多关于SeDebugPrivilege特权及其在恶意软件中的应用的内容可以在几本书和出版物中找到。本文引用到的包括内存取证的艺术(页数:173,186,197-199),恶意软件分析手册(页数:58,231,589)和Windows恶意软件分析基础(页数:143)。

开启特权审计

现在我们来看一看审计技术,搜集识别潜在特权滥用需要的事件。在Palantir,我们使用系统自带的Windows事件转发(Windows Event Forwarding,WEF)来搜集主要部件的审计日志。如果你想使用WEF,请看我们之前的博客Github仓库中介绍的配置和管理细节。
Windows10和Server 2016中自带的事件记录工具支持对系统内特权使用进行审计。可以使用组策略(Group Policy Object,GPO)开启对敏感特权使用非敏感特权使用的审计并使用WEF子脚本进行搜集。此外,对给登录用户分配特定特权事件进行审计,可以识别在哪里创建了有特权的访问令牌。
在我们遇到的大多数环境中,只搜集与使用敏感特权有关的事件,不审计对备份特权和恢复特权的使用
使用正确的审计GPO,我们搜集对下列特权的使用:

  • 表现为操作系统的一部分的行为
  • 创建令牌对象
  • 调试程序
  • 使计算机和用户对授权可信
  • 安全审计
  • 授权后模拟一个客户
  • 加载、卸载设备驱动
  • 管理审计和安全日志
  • 修改固件环境变量
  • 替换进程令牌
  • 获取对文件或其它对象的拥有权

识别特权使用

现在事件日志被搜集到了一个集中的位置,我们现在可以通过搜索来发现可被滥用的特权主体。
我们利用事件代码4672(为新登录用于分配特定特权)搜集事件,通过搜索我们可以发现拥有SeDebugPrivilege特权的用户令牌在哪里被创建。一个事件样例是:

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特权。这意味着在这台机器上生成的用户令牌可能被一个具备系统访问的恶意角色进行了攻击和滥用。
如果Authorization Policy Change审计开启,我们可以在令牌特权被开启和禁用时收到额外的事件通知。一个样例是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事件日志并验证它们能够被安全解除,我们只需解除操作以确保只有需要该特权的用户拥有它。
首先,我们在活动目录中创建一个安全组(SeDebug-Exceptions-sg)。任何加入安全组的用户能够继续在他们的系统使用SeDebugPrivilege特权(如,只需系统层调试的管理员),所有其它用户失去该特权(如,招聘,咨询台)。
接下来,我们创建一个组策略对象并将其配置为只给SeDebug-Exceptions-sg组的用户分配调试程序特权。该设置的配置在:Computer Configuration\Windows Settings\Security Settings\Local Policies\User Rights Assignment
然后我们对测试机和用户部署该组策略,使所有行为被安全过滤。

测试和验证

一旦部署到测试环境,我们进行测试和验证来识别所有不利影响或问题。根据从Windows安全中心获得的数据,我们对可能被影响的用户总结出了一个细粒度的白名单。在后面的测试阶段,没有一个报告或问题被确定或归因于进行的修改。然后,我们将特权移除GPO应用到其它测试中。
下图是我们一台机器中的命令管理员提示符。注意,尽管与一个特权cmd进程相关,SeDebugPrivilege已经不再存在于令牌中:

结合使用Windows事件和基于主机的脚本,我们继续监控和追踪SeDebugPrivilege特权直到我们确定测试环境已经接受了修改并运行稳定。

问题和限制

最后,我们来讨论该特权移除技术的限制。
首先,不是所有可被滥用的特权都可以被移除(如,SeBackupPrivilege,SeImpersonatePrivilege)。所以这个技术可以被作为一个深度防御策略众多层中的一层,而不是一个单独的万能药。
第二,修改特权无法限制系统层账户。为了操作系统和相关工具的功能正常运行,这些特权是必需的,不能移除。这种账户的样例见下面的截图,这是SYSTEM用户的主访问令牌的特权。这类特权行为将在检测和警报中捕获,但需要指出无法阻止在系统上获得这些特权。

本例中,管理员用户执行psexec来以NT AUTHORITY\SYSTEM用户开启一个cmd.exe。注意,令牌特权表中存在SeDebugPrivilege特权。如果用户拥有机器的管理员权限,有许多机制来绕过这个安全控制。

结论

虽然本文提出的技术本身不会阻止一个带有目的性的攻击者,但这是一个有价值的深度防御控制,可以阻止自动执行的恶意软件并破坏一些攻击工具的功能。具备了特权知识和攻击者如何滥用特权的知识后,防护者能够为他们的组织开发并实现更强的检测和攻击面减缓能力。

延伸阅读

安全原则
通过GPO枚举远程访问策略
滥用LPE令牌特权

作者

Chad D., Dane S., Tyler B.


【公告】 [2022大礼包]《看雪论坛精华22期》发布!收录近1000余篇精华优秀文章!

收藏
点赞1
打赏
分享
最新回复 (5)
雪    币: 4863
活跃值: 活跃值 (982)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
CCkicker 活跃值 2019-3-28 17:50
2
0
感谢分享~
雪    币: 6269
活跃值: 活跃值 (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yuanyouran 活跃值 2019-3-28 18:39
3
0
感谢分享
雪    币: 129
活跃值: 活跃值 (846)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
niuzuoquan 活跃值 2019-4-2 14:14
4
0
感谢分享
雪    币: 1065
活跃值: 活跃值 (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ielts 活跃值 2019-4-16 10:07
5
0
感谢分享~ 
雪    币: 1313
活跃值: 活跃值 (2821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
风中小筑V 活跃值 2019-4-24 12:33
6
0
感谢翻译.还有楼主id真有趣.
游客
登录 | 注册 方可回帖
返回