Living off the Land
本周早些时候, Grzegorz Tworek发布了一种非常酷的方法来建立持久的 LPE,这是我以前从未在野外见过的。从(受损的)特权帐户,我们可以滥用服务控制管理器,通过使用sdset将过于宽松的 ACL 提供给服务控制管理器,允许任意非管理用户在计算机上永久拥有完整的系统权限。
一些背景知识
要了解此攻击的作用,需要对sdset以及 Microsoft 的安全描述符定义语言( SDDL ) 进行一些简单的阅读。但是……为您总结这两篇文章,我们只需要知道安全描述符字符串的格式,其中包含标记来指示安全描述符的四个主要组成部分中的每一个:所有者(O:)、主要组(G:)、 DACL (D:)、 SACL (S:) 以及访问控制实体的令牌。安全描述符可以包含这些令牌的任意组合,但并非所有令牌都是必需的,正如我们将在下面演示的那样。
根据推文,我们只需要运行 sc.exe sdset scmanager D:(A;;KA;;;WD) 来自提升的 Windows shell(即具有本地管理权限的东西)。在演示整个攻击之前,让我们进一步分解一下。
D:(A;;KA;;;WD) … wat. D:
如果您像我一样,对这些 Microsoft SDDL 令牌如何工作或每个部分代表什么了解非常有限,我们应该花一些时间来了解更多。(你知道,学习一些新东西和所有jazz)
那么这个字符串实际上代表什么?让我们分解每个部分。首先,我们应该了解一般的访问控制条目语法:
ace_type;ace_flags;rights;object_guid;inherit_object_guid;account_sid;(resource_attribute)
-
D:自由访问控制列表 (DACL)
-
DACL 标识允许或拒绝访问某个对象的用户和组。
-
A;允许访问(ace_type)
-
第一段表示访问控制条目 ( ACE ) 的开头。ACL 包含 ACE 列表。ACE 定义特定用户或组对对象的访问权限,或定义生成系统管理消息或警报的访问类型。用户或组由安全标识符 (SID) 标识。
-
ace_flags为空
-
KA;密钥全部访问(rights)
-
如果在 SID 上下文中使用,此令牌还可以指代域密钥凭据管理员,这一点也不令人困惑。我们只需知道,这可以访问与 SDDL 相关的所有注册表项。
-
object_guid为空
-
inherit_object_guid为空
-
WD - 所有人的安全主体 ( account_sid)
-
下面您将看到我们可以在 SDDL 字符串中引用的一些常见安全主体的表格。
ACE 安全原则
Abbreviation | Security Principal |
---|---|
AU | 已认证用户 |
BA | 内置管理员 |
SY | 本地系统 |
BU | 内置用户 |
WD | 每个人 |
总结
这里的 TL;DR 是,此命令授予服务控制管理器上的everyone、all权限。这意味着,我可以(作为非特权用户)创建一个服务,该服务将允许我像SYSTEM一样执行任意命令,因为以SYSTEMscmanager上下文运行。如果您想要更多技术参考,您可以阅读上百万篇类似这篇文章的文章。
攻击流程示例
# 检查我们的普通用户的权限。
首先,我们将使用非特权帐户并输出用户信息。这里我只是简单地演示我们将从中授予特权的帐户没有管理权限。
# 通过SDSET修改SCMANAGER的权限
接下来,我们从提升的命令提示符执行命令来修改scmanagerACL。这必须使用管理帐户(已被入侵的帐户)来完成:
检测机会 - 应严格审查对服务控制管理器的 ACL 的修改。以下是用于检测此博客的 POC 行为的示例 sigma 规则:
title: DACL Modification of Service Control Manager via sdset
id: 8998782b-66de-44e7-8335-305e2dd431b3
status: experimental
description: This rule detects usage of sdset to modify the DACL of the service-control manager service, scmanager.
references:
- https://twitter.com/0gtweet/status/1628720819537936386?cxt=HHwWhIC87Ze9sJotAAAA
tags:
- attack.persistence
- attack.privilege_escalation
author: Gabriel De Jesus (0xv1n)
date: 2023/02/28
logsource:
product: windows
category: process_creation
detection:
selection:
Image|endswith:
- 'sc.exe'
CommandLine|contains|all:
- ' sdset '
- ' scmanager '
- ' D:(A;;KA;;;WD) '
condition: selection
fields:
- Image
- CommandLine
falsepositives:
- Unknown
level: high
# 确认已发生变更
根据操作系统返回的反馈,我们知道命令成功了,但如果我们想检查服务的安全描述符,我们可以使用sdshow <service_name>。在这种情况下,我们确认scmanager确实具有新的安全描述符。
此外(感谢 Grzegorz!),我们可以运行sc.exe sdshow scmanager showrights来枚举服务的权限。这实际上将令牌映射到其安全描述符,并使我们能够更轻松地了解特定服务拥有的权限:
# 创建恶意服务以实现持久性 LPE
我们现在可以从非特权帐户创建一个服务,将我们的帐户添加到此机器的本地管理员组:
sc create LPE displayName= "LPE" binPath= "C:WindowsSystem32net.exe localgroup Administrators nonpriv-user /add" start= auto
# 重启机器
此时,我们需要做的就是重新启动机器并允许服务控制管理器以SYSTEM权限执行我们的新服务。一旦恢复在线,我们应该看到我们的帐户现在已添加到本地管理员。
这种机制最好的部分是,即使聪明的管理员删除了帐户的本地管理员权限,我们仍然拥有该服务。如果管理员删除了该服务,我们仍然可以创建新服务。这种持久性的补救措施是将 DACL 恢复到scmanager强化状态。
# 持续的本地权限提升
现在,无论何时,我们都可以生成具有管理员权限的任意进程:
希望这有帮助!
原文始发于微信公众号(Ots安全):PrivEsc:滥用服务控制管理器实现隐秘且持久的 LPE
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论