ACL 相关
Access Control Link
-
所有的Windows对象都称为安全对象,文件、进程、注册表、内存等
-
为每个安全对象赋予一个安全描述符(Security descriptor)
-
Security identifiers (SIDs)for the owner and primary group of an object
-
A DACL that specifies the access rights allowed or denied to particular users or groups
-
A SACL that specifies the types of access attempts that generate audit records for the object
DACL
DACL由多个ACE(Access Control Entry)组成。
Windows的访问控制
Windows的访问控制包括三部分:访问令牌、对象安全描述符和访问检查。
- 访问令牌作为一个容器,通过Token体现
- 对象安全描述符表示目标对象的安全属性,通过安全矩阵详细描述该对象赋予不同用户组的权限
- 访问检查表示通过比较访问令牌和ACL,以决定该进程是否具有访问时申请的相应权限
Windows中高权限服务、进程所拥有的文件、目录如果存在着ACL设置不当,对低权限用户开放了“写”甚至“执行”权限,低权限用户可以通过修改、替换文件内容来达到执行指定代码的目的。
例如Windows的System332目录如果开放了写权限,则可以向目录写入一个DLL,等待系统重新启动,由 Svchost等程序加载即可实现权限提升。
ACL检查
-
Sysinternalsuit提供的
accesschk.exe
可以对指定的目录、文件进行ACL检查。命令为accesschk.exe -w -s directory
,其中directory为需要检测的目录。 -
accesschk.exe可以审计进程对所有用户组开放的权限。采用命令
accesschk.exe -p pid
可以获取某个进程开放的权限,其中pid可以用*
代,表示检测所有进程对不同用户组开放的权限。为了保证正常运行,运行accesschk.exe时需要较高的权限。 -
accesschk.exe同样可用于审计服务,通过命令
accesschk.exe -c *
可审计所有服务对所有用户组开放的权限。 -
注册表中的启动项、服务加载项如果对低权限用户开放了写权限,低权限用户可以向这些表项写入指定的文件,等待系统重新启动后实现权限提升。使用命令
accesschk.exe -w -s -k HKLM
,表示递归扫描HKLM中开放了写权限的表项。
进程ACL利用
当检查发现存在低权限用户对某高权限进程有读写权限,可有如下两种方式进行利用:
- 第一种
通过OpenProcess获取进程句柄,并将目标代码写入该进程空间中,以该进程的权限运行这些代码,运行代码权限为该进程权限。
- 第二种
通过OpenProcess获取进程句柄,再通过OpenProcessToken获取该进程的Token,并利用该Token通过CreateProcessAsUser创建新的进程,新的进程权限和目标进程权限一致。
相关漏洞
MS10-059:
一些Windows应用中使用了 Tracing 功能记录调试信息。使用了这个 Tracing 功能的 Windows 进程会持续监控相关子键的变化,一旦注册表值发生了变化就会立即读取该值。
其中的一个注册表值为 FileDirectory,包含有 Windows目录名。在Local System 账号运行的服务连接到管道时拥有扮演权限的本地用户可以通过扮演为 Local System 账号(或Administrator等特权账号)提升权限。
注册表项对 Users 组开放了 Set Value 权限,因此任何通过认证的用户都可以设置任意值。