gpt4 book ai didi

security - 在 DCOM 调用中使用默认身份验证和单独的伪装/模拟

转载 作者:行者123 更新时间:2023-12-03 14:32:46 28 4
gpt4 key购买 nike

我正在尝试使用 DCOM(进程外)实现两件事

  1. 使用 CoInitializeSecurity 及其参数 pAuthList 设置进程范围的身份验证。
  2. 在特殊情况下(COM 调用)使用伪装来更改调用者的身份

我的想法:

  1. 据我所知,auth info 结构包含所有新 COM 调用的默认身份验证信息(例如 RPC_C_AUTHN_WINNT 的用户名和密码)。因此,COM 应该使用 auth 结构中的信息,而不是进程 token 。但是,所有 COM 调用/连接始终使用进程的标识,而不是应用的默认标识。

  2. 通常,可以使用 CoSetProxyBlanket 更改代理的身份验证信息。这对我有用。我的问题是,如果我自己模拟 token 并调用 COM 函数,它是否必须工作。我读过各种 MSDN 文章,将 EOAC_DYNAMIC_CLOAKING 应用于 CoInitializeSecurity 应该可以使其正常工作。但是,我的手动“模拟 COM 调用始终显示服务器端的进程标识。

客户端看起来像这样(Delphi)

var
authList : SOLE_AUTHENTICATION_LIST;
authidentity : SEC_WINNT_AUTH_IDENTITY_W;
authInfo : array[0..1] of SOLE_AUTHENTICATION_INFO;

pcAuthSvc : DWORD;
asAuthSvc : array[0..0] of SOLE_AUTHENTICATION_SERVICE;
Token : TJwSecurityToken;

begin
ZeroMemory( @authidentity, sizeof(authidentity) );

authidentity.User := 'Testbenutzer';
authidentity.UserLength := Length('Testbenutzer');
authidentity.Domain := '';
authidentity.DomainLength := 0;
authidentity.Password := 'test';
authidentity.PasswordLength := 4;
authidentity.Flags := SEC_WINNT_AUTH_IDENTITY_UNICODE;


ZeroMemory( @authInfo, sizeof( authInfo ) );

// NTLM Settings
authInfo[0].dwAuthnSvc := RPC_C_AUTHN_WINNT;
authInfo[0].dwAuthzSvc := RPC_C_AUTHZ_NONE;
authInfo[0].pAuthInfo := @authidentity;



authList.cAuthInfo := 1;
authList.aAuthInfo := @authInfo;

OleCheck(CoInitializeSecurity(
NULL, // Security descriptor
-1, // Count of entries in asAuthSvc
NULL, // asAuthSvc array
NULL, // Reserved for future use
RPC_C_AUTHN_LEVEL_CONNECT, // Authentication level
RPC_C_IMP_LEVEL_IMPERSONATE, // Impersonation level
@authList, // Authentication Information
DWORd(EOAC_DYNAMIC_CLOAKING), // Additional capabilities
NULL // Reserved
));
//create COM object
int := CoSecurityTestObj.Create;
int.TestCall;

服务器还设置了标志 EOAC_DYNAMIC_CLOAKING。它使用 CoImpersonateClient 来获取线程 token 和用户名。它还使用 CoQueryClientBlanket 来获取 authInfo(作为 SEC_WINNT_AUTH_IDENTITY_W 结构)。但是,这两个调用始终返回客户端的进程标识。

手动模拟也不起作用(2.):

Token := TJwSecurityToken.CreateLogonUser(authidentity.User, '', authidentity.Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT);
Token.ImpersonateLoggedOnUser;
int := CoSecurityTestObj.Create;
int.TestCall;

再次提问:

  1. 我错了吗?或者为什么默认身份验证信息结构(带有用户名和密码的 WinNT)没有在每个 COM 连接/调用中用作默认身份验证?

  2. 我错了吗?或者为什么手动模拟不起作用?请注意,我单独测试了 2.,因此 1. 不会干扰。

这是 JEDI Windows 安全代码库的基础工作,我对其进行了扩展以支持 COM 安全性。因此,您的帮助将采用 GPL/MPL。

引用文献:

伪装:

  1. http://msdn.microsoft.com/en-us/library/ms683778%28VS.85%29.aspx
  2. http://msdn.microsoft.com/en-us/library/cc246058%28PROT.10%29.aspx
  3. http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook/WhatIsCoInitializeSecurity.html

CoInitializeSecurity 和 pAuthInfo

  1. http://www.codeguru.cn/vc&mfc/apracticalguideusingvisualcandatl/93.htm

获取安全毯(服务器端)

  1. http://www.codeguru.cn/vc&mfc/apracticalguideusingvisualcandatl/92.htm

最佳答案

您是否尝试过使用 RPC_C_AUTHN_LEVEL_CALL 而不是 RPC_C_AUTHN_LEVEL_CONNECT 来调用 CoInitializeSecurity()?

通常,当我创建 DCOM 客户端时,我会创建 COSERVERINFO 并使用安全凭证传递给 CoCreateInstanceEx(),记住在所有接口(interface)上调用 CoSetProxyBlanket()。

关于security - 在 DCOM 调用中使用默认身份验证和单独的伪装/模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1993651/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com