写在最前
如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 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
<