首先你需要了解NT命名空间 https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#nt_namespaces并使用WinObj https://technet.microsoft.com/en-us/sysinternals/winobj.aspx tool.
这就像内存中的小型文件系统,其中包含文件夹和不同的“文件”(此处“文件”下表示不同的对象类型 -Event
, Mutant
(互斥体),Section
, Device
,...)。每次创建命名对象时 - 它都会放置到某个文件夹中NT命名空间 https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#nt_namespaces。这里的文件夹(如 NTFS 中的文件夹)具有安全描述符。因此,并非每个人都可以在任何文件夹下创建对象。
解释一下你在文件系统语言上所做的事情(也许会更清楚):
i (John
)尝试在下创建文件“mutex_good”%USERPROFILE%\Documents
这没关系。因为这是我的个人文件夹,我对其有写权限。
然后我登录(模拟)为zoom
并尝试在下再次创建文件“mutex_797”%USERPROFILE%\Documents
(%USERPROFILE%
在这两种情况下都扩展到相同的路径,例如c:\Users\John
冒充不影响此)
and zoom
创建文件失败。为什么 ?只是他没有权利这样做。仅有的John
, Administartors
, SYSTEM
有写权限c:\Users\John
但不是zoom
.
现在让我们回到NT命名空间 https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#nt_namespaces。当我们打电话时CreateMutexA( NULL, FALSE, "mutex_797" );
哪里"mutex_797"
将被放置?
如果你不appcontainer
并且不在系统中运行session 0
- 你在某个用户中运行session <N>
你的命名对象将被放置在\Sessions\<N>\BaseNamedObjects
目录,其中 N=1,2..
so call CreateMutexA( NULL, FALSE, "mutex_797" );
尝试创建互斥体\Sessions\<N>\BaseNamedObjects\mutex_797
然而在\Sessions\<N>\BaseNamedObjects
存在下一个 SymbolicLinks(这就像在 NTFS 文件系统中):
Global -> \BaseNamedObjects
Local -> \Sessions\<N>\BaseNamedObjects
Session -> \Sessions\BNOLINKS
所以说如果你打电话CreateMutexA( NULL, FALSE, "Global\\mutex_797" );
对象管理器尝试将互斥体放在\BaseNamedObjects\mutex_797
有关此内容的更多信息,请阅读内核对象命名空间 https://msdn.microsoft.com/en-us/library/windows/desktop/aa382954(v=vs.85).aspx
当然我们必须理解AccessCheck 的工作原理 https://msdn.microsoft.com/en-us/library/windows/desktop/aa446683(v=vs.85).aspx
对于目录对象定义了下一个访问权限:
//
// Object Manager Directory Specific Access Rights.
//
#define DIRECTORY_QUERY (0x0001)
#define DIRECTORY_TRAVERSE (0x0002)
#define DIRECTORY_CREATE_OBJECT (0x0004)
#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
也可以在以下位置阅读更多相关内容DirectoryObject DesiredAccess 标志 https://msdn.microsoft.com/en-us/library/windows/hardware/ff566492(v=vs.85).aspx
we need DIRECTORY_CREATE_OBJECT
使用权 (对目录对象的名称创建访问)用于在目录中创建互斥体(或事件或任何对象)
现在了解为什么可以在中创建互斥体\Sessions\<N>\BaseNamedObjects
but zoom
不能 - 需要寻找Security Descriptor
对于这个文件夹。我转储它:
T FL AcessMsK Sid
0 00 000F000F S-1-5-90-0-1 DWM-1
0 00 000F000F S-1-5-18 SYSTEM
0 0B 10000000 S-1-5-18 SYSTEM
0 0B 10000000 S-1-3-0 CREATOR OWNER
0 00 000F000F S-1-5-21-4026734978-3280735129-2412320105-1001 John
0 0B 10000000 S-1-5-5-0-294807 LogonSessionId_0_294807
0 00 0002000F S-1-5-5-0-294807 LogonSessionId_0_294807
0 00 0002000F S-1-5-32-544 Administrators
0 02 00000003 S-1-1-0 Everyone
0 00 00000002 S-1-5-12 RESTRICTED
17 00 00000001 S-1-16-4096 Low Mandatory Level
那么谁有DIRECTORY_CREATE_OBJECT
(4)这里?DWM-1
, SYSTEM
, Administrators
,当前登录会话用户(LogonSessionId_0_294807
), 当前用户 (John
) - 和所有。zoom
没有此访问权限。
例如Everyone
有 (3) -DIRECTORY_QUERY|DIRECTORY_TRAVERSE
- Name lookup
and Query
但不是Name creation
您可以问在这种情况下我可以在模拟后在哪里创建互斥体?需要使用\BaseNamedObjects
( 全局命名空间 )OR \BaseNamedObjects\Restricted
目录 - 我测试它的安全描述符和结果:
for \BaseNamedObjects
T FL AcessMsK Sid
0 00 0002000F S-1-1-0 Everyone
0 00 00000002 S-1-5-12 RESTRICTED
0 00 000F000F S-1-5-90-0-0
0 00 000F000F S-1-5-18 SYSTEM
17 00 00000001 S-1-16-4096 Low Mandatory Level
for \BaseNamedObjects\Restricted
T FL AcessMsK Sid
0 00 0002000F S-1-1-0 Everyone
0 00 0002000F S-1-5-12 RESTRICTED
0 00 000F000F S-1-5-90-0-0
0 00 000F000F S-1-5-18 SYSTEM
17 00 00000001 S-1-16-4096 Low Mandatory Level
那么你如何查看Everyone
这里有 2000F - 所有需要的访问。希望zoom
是的成员Everyone
?下一个代码我肯定会起作用
CreateMutexA(0, 0, "Global\\mutex_797");
for \BaseNamedObjects
(全局命名空间) 存在一个例外:
在全局命名空间中创建文件映射对象,通过
使用 CreateFileMapping,从会话零以外的会话是
特权操作。因此,运行在
任意远程桌面会话主机(RD 会话主机)服务器会话
必须启用 SeCreateGlobalPrivilege 才能创建
全局命名空间中的文件映射对象成功。这
权限检查仅限于文件映射对象的创建,
并且不适用于打开现有的。例如,如果一个服务
或者系统创建一个文件映射对象,任何运行在
任何会话都可以访问该文件映射对象,前提是用户
拥有必要的访问权限。
但对于互斥锁或事件 - 不需要Se创建全局权限已启用
你也可以说,但是zoom
是管理员帐户并且Administrator
可使用\Sessions\<N>\BaseNamedObjects
- 那么为什么这不起作用呢?因为与LOGON32_LOGON_INTERACTIVE
and UAC
系统分配给zoom
过滤后的令牌。Administrator
Group (S-1-5-32-544
) 存在于令牌中but with SE_GROUP_USE_FOR_DENY_ONLY https://msdn.microsoft.com/en-us/library/windows/desktop/aa379596(v=vs.85).aspx仅属性 - 因此它会忽略 SID 允许访问的 ACE。
和zoom
有另一种LogonSessionId_0_XXX
SID - 作为结果和ERROR_ACCESS_DENIED
正如 @Harry Johnston 所指出的 - 如果我们使用LOGON32_LOGON_BATCH
反而LOGON32_LOGON_INTERACTIVE
- 我们得到了提升的令牌 - 这里Administrator
团体将与SE_GROUP_ENABLED https://msdn.microsoft.com/en-us/library/windows/desktop/aa379596(v=vs.85).aspx属性 - 启用对允许访问的 ACE 的访问检查
或者我如何提供 - 使用Global\
名称前的前缀 - 用于放置对象\BaseNamedObjects
where Everyone
拥有完全访问权限
我理解将 NULL 作为第一个参数传递CreateMutex
方法
将使用“默认”安全属性。在这种情况下,它将
是与线程关联的安全参数,即
冒充的用户。
第一个参数 - 指向的指针SECURITY_ATTRIBUTES
让您覆盖新对象的默认安全描述符。这是控制谁可以访问它。但这不会让您或多或少地访问您尝试放置对象的目录 - 您必须拥有DIRECTORY_CREATE_OBJECT
已授予访问权限,我们无法通过以下方式影响此行为:SECURITY_ATTRIBUTES
- 这影响到新对象但不在现有目录上
and finally some visualization of NT Namespace https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#nt_namespaces