1. icacls-syntax
2. icacls-parameters
3. icacls-remarks
4. Command-line syntax key
5. icacls-examples
6. 查看ACL
	6.1 icacls
	6.2 Get-Acl
	6.3 获取注册表项的 ACL
	6.4 查看文件夹属性
7. 访问控制列表
	7.1 ACL
	7.2 DACL
	7.3 SACL
	7.4 ACE
	7.5 ACE类型
	7.6 更多相关
8. ACL检测
	8.1 文件和注册表检测工具(2015年的小工具)
	8.2 域环境(2017年参考资料)

 Windows-icacls
使用 ACL(访问控制列表)可以灵活地控制对文件和文件夹的访问权限。
显示或修改指定文件中的任意访问控制列表 (DACL), 并将存储的 DACL 应用于指定目录中的文件。
此命令将替换已弃用的 cacls 命令。 

1. icacls-syntax

icacls directory [/substitute SidOld SidNew [...]] [/restore aclfile] [/C] [/L] [/Q]
将存储的 DACL 应用于目录中的文件。
 
icacls name [/save aclfile] [/setowner user] [/findsid Sid] [/verify] [/reset] [/T] [/C] [/L] [/Q]
 
ICACLS name /save aclfile [/T] [/C] [/L] [/Q]
将匹配名称的文件和文件夹的 DACL 存储到 aclfile 中 以便将来与 /restore 一起使用。 请注意,未保存 SACL、所有者或完整性标签。
 
ICACLS name /setowner user [/T] [/C] [/L] [/Q]
更改所有匹配名称的所有者。 该选项不会强制更改所有身份;使用 takeown.exe 实用程序可实现该目的。
 
ICACLS name /findsid Sid [/T] [/C] [/L] [/Q]
查找包含显式提及 SID 的 ACL 的所有匹配名称。
 
ICACLS name /verify [/T] [/C] [/L] [/Q]
查找其 ACL 不规范或长度与 ACE 计数不一致的所有文件。
 
ICACLS name /reset [/T] [/C] [/L] [/Q]
为所有匹配文件使用默认继承的 ACL 替换 ACL。
 
icacls name [/grant[:r] Sid:perm[...]] [/deny Sid:perm [...]] [/remove[:g|:d]] Sid[...]]] [/setintegritylevel Level:policy[...]] [/T] [/C] [/L] [/Q]

2. icacls-parameters

Parameter Description
<name> 指定要为其显示或修改 DACL 的文件。
<directory> 指定要显示或修改 DACL 的目录。
/t 对当前目录及其子目录中的所有指定文件执行该作。
/c 即使发生文件错误,也会继续该作。 仍然显示错误消息。
/l 对符号链接执行作,而不是对目标执行。
/q 禁止显示成功消息。
/save <ACLfile> 将所有匹配文件的 DACL 存储到访问控制列表 (ACL) 文件中,
以供稍后使用 /restore。
/setowner <user> 将所有匹配文件的所有者更改为指定用户。
/findsid <sid> 查找包含显式提及指定安全标识符 (SID) 的 DACL 的所有匹配文件。
/verify 查找具有非规范或长度与访问控制项(ACE)计数不一致的所有文件。
/reset 将 ACL 替换为所有匹配文件的默认继承 ACL。
/grant[:r] <sid>:<perm> 授予指定的用户访问权限。
  • 如果使用了 :r,这些权限将(替换)以前授予的所有显式权限。
  • 如果不使用 :r,这些权限将(添加)到以前授予的所有显式权限。
/deny <sid>:<perm> 显式拒绝指定的用户访问权限。
为有状态权限添加显式拒绝 ACE,并删除任何显式授予中的相同权限。
/remove: g |d <sid> 从 DACL 中删除指定 SID 的所有匹配项。 此命令还可以使用:
  • g - 删除对指定 SID (授予)的所有权限
  • d - 删除对指定 SID (拒绝)的所有权限
/setintegritylevel <perm><level> 将完整性 ACE 显式添加到所有匹配的文件。 可以将级别指定为:
  • L[ow]
  • M[edium]
  • H[igh]
完整性 ACE 的继承选项可以优先于级别,但只应用于目录。
/substitute <sidold><sidnew> 将现有 SID (sidold) 替换为新 SID (sidnew) 。
需要使用 <directory> 参数。
/restore <ACLfile> /c | /l | /q 将存储的 DACL 从 <ACLfile> 应用于指定目录中的文件。
需要使用 <directory> 参数。
/inheritancelevel: e |d |r 设置继承级别,可以是:
  • e - 启用继承
  • d - 禁用继承并复制 ACE
  • r - 禁用继承并仅删除继承的 ACE
 

3. icacls-remarks

  • SID 可以采用数字或友好名称形式。  如果使用数字形式,将通配符 * 附加到 SID 的开头。
  • 此命令将 ACE 条目的规范顺序保留为:
  1. Explicit denials (显式拒绝)
  2. Explicit grants (显式授予)
  3. Inherited denials (继承拒绝)
  4. Inherited grants (继承授予)
  • 此选项 <perm> 是一个权限掩码,可为基本权限、高级权限或继承权限指定:
    • 一系列简单权限(基本权限),无需使用括号:
      • N - 无法访问
      • F - 完全访问
      • M - 修改访问权限
      • RX - 读取和执行访问
      • R - 只读访问
      • W - 只写访问
      • D - 删除访问权限
    • 必须使用括号的特定权限(高级权限)的逗号分隔列表:
      • DE - 删除
      • RC - 读取控制(读取权限)
      • WDAC - 写入 DAC (更改权限)
      • WO - 写入所有者(获取所有权)
      • S - 同步
      • AS – 访问系统安全性
      • MA - 允许的最大值
      • GR - 通用读取
      • GW - 通用写入
      • GE - 通用执行
      • GA - 通用所有
      • RD - 读取数据/列表目录
      • WD - 写入数据/添加文件
      • AD - 追加数据/添加子目录
      • REA - 读取扩展属性
      • WEA - 写入扩展属性
      • X - 执行/遍历
      • DC - 删除子项
      • RA - 读取属性
      • WA - 写入属性
    • 必须使用括号的继承权限序列, 继承权限可以优先于每种格式, 但只应用于目录:
      • (I) - 继承。 ACE 继承自父容器。
      • (OI) - 对象继承。 此容器中的对象继承此 ACE。 仅适用于目录。
      • (CI) - 容器继承。 此父容器中的容器继承此 ACE。 仅适用于目录。
      • (IO) - 仅继承。 ACE 继承自父容器,但不适用于对象本身。 仅适用于目录。
      • (NP) - 不传播继承。ACE 由容器和对象从父容器继承,但不会传播到嵌套容器。仅适用于目录。

4. Command-line syntax key

下表描述了用于指示命令行语法的表示法。 
Notation Description
不带括号或大括号的文本 必须按如下所示键入的项目。
<Text inside angle brackets> 必须为其提供值的占位符。
[Text inside square brackets] Optional items. 可选项目。
{Text inside braces} 所需项集。必须选择一个。
垂直条 (|) Vertical bar 互斥项的分隔符。 必须选择一个。
省略号 (…) Ellipsis 可重复和多次使用的项。

5. icacls-examples

若要将 C:\Windows 目录中的所有文件的 DACL 及其子目录保存到 ACLFile 文件,请键入:
icacls c:\windows\* /save AclFile /T
 
若要为 C:\Windows 目录及其子目录中存在的 ACLFile 中的每个文件还原 DACL,请键入:
icacls c:\windows\ /restore AclFile
 
若要向用户授予对名为 Test1 的文件的 Delete 和 Write DAC 权限,请键入:
icacls test1 /grant User1:(d,wdac)
icacls test1 /grant Administrator:(D,WDAC)
 
若要向 SID S-1-1-0 定义的用户授予对名为 TestFile 的文件的删除和写入 DAC 权限,请键入:
icacls TestFile /grant *S-1-1-0:(d,wdac)
 
要将 (高) 完整性级别应用于目录并确保其文件和子目录都继承此级别,请键入:
icacls "myDirectory" /setintegritylevel (CI)(OI)H
 
 > icacls /?

6. 查看ACL

6.1 icacls

 > icacls c:\windows\winsxs
c:\windows\winsxs NT SERVICE\TrustedInstaller:(OI)(CI)(F)
 BUILTIN\Administrators:(RX)
 BUILTIN\Administrators:(OI)(CI)(IO)(GR,GE)
 NT AUTHORITY\SYSTEM:(RX)
 NT AUTHORITY\SYSTEM:(OI)(CI)(IO)(GR,GE)
 BUILTIN\Users:(RX)
 BUILTIN\Users:(OI)(CI)(IO)(GR,GE)
 APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(RX)
 APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(OI)(CI)(IO)(GR,GE)
 APPLICATION PACKAGE AUTHORITY\所有受限制的应用程序包:(RX)
 APPLICATION PACKAGE AUTHORITY\所有受限制的应用程序包:(OI)(CI)(IO)(GR,GE)
已成功处理 1 个文件; 处理 0 个文件时失败
 
如果问题是由 WinSxS 文件夹的权限不正确引起的, 您可以使用 icacls.exe 查看、修改、备份和还原 ACL(访问控制列表)。 
“WinSxS”文件夹位于“c:\windows\winsxs”。 它包含多个文件,包括Windows更新服务包和安全补丁,以及来自过去更新的文件。

6.2 Get-Acl

获取资源(如文件或注册表项)的安全描述符。 
 > Get-Acl c:\windows\winsxs | Format-List
Path   : Microsoft.PowerShell.Core\FileSystem::C:\windows\winsxs
Owner  : NT SERVICE\TrustedInstaller
Group  : NT SERVICE\TrustedInstaller
Access : NT AUTHORITY\SYSTEM Allow  -1610612736
         NT AUTHORITY\SYSTEM Allow  ReadAndExecute, Synchronize
         BUILTIN\Administrators Allow  -1610612736
         BUILTIN\Administrators Allow  ReadAndExecute, Synchronize
         BUILTIN\Users Allow  -1610612736
         BUILTIN\Users Allow  ReadAndExecute, Synchronize
         NT SERVICE\TrustedInstaller Allow  FullControl
         APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES Allow  ReadAndExecute, Synchronize
         APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES Allow  -1610612736
         APPLICATION PACKAGE AUTHORITY\所有受限制的应用程序包 Allow  ReadAndExecute, Synchronize
         APPLICATION PACKAGE AUTHORITY\所有受限制的应用程序包 Allow  -1610612736
Audit  :
Sddl   : …
 
 > Get-Acl -Path c:\windows\winsxs | Format-Table -wrap
 
 > $ac2 = Get-Acl -Path c:\windows\winsxs
 > $ac2.Access
 > $ac2.Access | Format-Table -wrap

6.3 获取注册表项的 ACL

此示例使用 Get-Acl cmdlet 获取注册表的控制子项(HKLM:\SYSTEM\CurrentControlSet\Control)的安全描述符。 
 > Get-Acl -Path HKLM:\System\CurrentControlSet\Control | Format-List
Path   : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
Owner  : BUILTIN\Administrators
Group  : NT AUTHORITY\SYSTEM
Access : BUILTIN\Administrators Allow  FullControl
         BUILTIN\Users Allow  ReadKey
         BUILTIN\Administrators Allow  FullControl
         NT AUTHORITY\SYSTEM Allow  FullControl
         CREATOR OWNER Allow  FullControl
         APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES Allow  ReadKey
         S-1-15-3-1024-… Allow  Re
         adKey
Audit  :
Sddl   : O:BAG:SYD:(A;;KA;;;BA)(A;CIID;KR;;;BU)(A;CIID;KA;;;BA)(A;CIID;KA;;;SY) (A;CIIOID;KA;;;CO)(A;CIID;KR;;;AC)(A;CIID;KR;;;S-1-15-3-1024-… )
 
 > $acl = Get-Acl -Path 'HKLM:\SAM'
 > $acl.Access
 > $acl.Access | Format-Table -wrap
 
Set-Acl
更改指定项(如文件或注册表项)的安全描述符。 

6.4 查看文件夹属性

文件夹属性 → 安全 → 高级 … 

7. 访问控制列表

7.1 ACL

Access control lists
  • ACL:Access Control List (访问控制列表)。用来表示用户(组)权限的列表,包含两种类型:DACL 和 SACL。
  • DACL:Discretionary Access Control List (自由访问控制列表)。安全对象权限的列表, 主要负责定义谁可以访问对象。
  • SACL:System Access Control List (系统访问控制列表)。用来记录对安全对象访问的日志.
  • ACE:Access Control Entry (访问控制条目)。ACL中的元素.

7.2 DACL

自由访问控制列表(DACL)标识允许或拒绝访问安全对象的受托人。
当 进程 尝试访问安全对象时,系统将检查对象的 DACL 中的 ACE,以确定是否向其授予访问权限。
  • 如果没有DACL,系统将允许访问
  • 如果存在DACL,但没有ACE,系统将拒绝所有访问
  • 如果存在DACL,也存在ACE,那么会按照每个ACE指定允许或拒绝
有关详细信息,请参阅 DACL 如何控制对对象的访问。
有关如何正确创建 DACL 的信息,请参阅 创建 DACL。

7.3 SACL

系统访问控制列表(SACL)允许管理员记录访问安全对象的尝试。
每个 ACE 指定指定的受托人尝试的访问尝试类型,这些尝试导致系统在安全事件日志中生成记录。
SACL 中的 ACE 可以在访问尝试失败、成功或两者兼有时生成审核记录。
有关 SCL 的详细信息,请参阅 审核生成 和 SACL 访问权限。

7.4 ACE

(ACE) 访问控制列表 (ACL) 中的条目。 ACE 包含一组访问权限和安全标识符 (SID),用于标识允许、拒绝或审核其权限的受托方。 
 
访问控制项数量
ACE 的类型
有六种类型的 ACE,其中三种受所有安全对象支持。 其他三种类型 目录服务对象支持的特定于对象的 ACE。
目录服务 (DS) 对象支持特定于对象的 ACE。 特定于对象的 ACE 包含一对 GUID,这些 GUID 扩展了 ACE 可以保护对象的方式。
 
所有类型的 ACE 都包含以下访问控制信息:
  • 安全标识符(SID),用于标识 ACE 适用的 受托人。
  • 访问掩码,指定 ACE 控制的 访问权限。
  • 指示 ACE 类型的标志。
  • 一组位标志,用于确定子容器或对象是否可以从 ACL 附加到的主对象继承 ACE。

7.5 ACE类型

  类型 D/S 描述
安全对象
支持的 ACE
访问被拒绝的 ACE DACL 拒绝 对受托人的访问权限。
访问允许的 ACE DACL 允许 对受托人的访问权限。
系统审核 ACE SACL 用于在受托方尝试行使指定访问权限时生成审核记录。
特定于对象
的 ACE
访问被拒绝的 ACE DACL 拒绝 对对象上设置的属性或属性的受托人访问权限,
或将 ACE 继承限制为指定类型的子对象。
使用 ACCESS_DENIED_OBJECT_ACE 结构。
访问允许的 ACE DACL 允许 受托方访问对象上设置的属性或属性,
或将 ACE 继承限制为指定类型的子对象。
使用 ACCESS_ALLOWED_OBJECT_ACE 结构。
系统审核 ACE SACL 用于记录受托人访问对象上设置的属性或属性的尝试,
或将 ACE 继承限制为指定类型的子对象。
使用 SYSTEM_AUDIT_OBJECT_ACE 结构。

7.6 更多相关

使用 ACL
请勿尝试直接处理 ACL 的内容。
若要确保 ACL 在语义上正确,请使用相应的函数来创建和作 ACL。
有关详细信息,请参阅 从 ACL 获取信息,并 创建或修改 ACL。
 
DACL 和 ACE
AccessCheck 的工作原理

8. ACL检测

本文介绍了Windows系统中的ACL在文件、注册表和域环境下后门利用方面的技巧,并给出检测后门的建议。 详细信息请看如下原文链接: 

8.1 文件和注册表检测工具(2015年的小工具)

可借助开源工具WindowsDACLEnumProject:
能够列出存在风险的ACL。(最新版本为10年前的2015年。但下载后仍然能用)
 
运行可能提示找不到 MSVCR100.dll 文件。
MSVCR100.dll 是Visual Studio 2010(Visual C++ 2010)的一个动态链接库。 可以单独下载这个dll文件放在同一目录下即可。
下载最新版32位的版本。(10.0.40219.473). Zip文件大小: 0.4 MB 
在命令行下运行,可以看到扫描过程。

8.2 域环境(2017年参考资料)

需要开启高级安全审核策略,参考资料:
开启策略后,Event ID 5136会记录域环境中ACL的修改,参考资料: