概要 客户端(Windows XP SP3) 服务器(Windows Vista Business SP1)/作为LocalSystem服务运行
Api序列 客户 - AcquireCredentialsHandle 客户端 - Initializesecuritycontext 服务器 - Acquirecredentialshandle 服务器 - AcceptSecurityContext 客户端/服务器 - CompleteAuthnToken 服务器 - ImpersonateSecurityContext 服务器 - AccessCheckAndAuditAlarm(MAXIMUM_allowed) 服务器 - 然后我将请求的访问权限与允许的访问进行比较。
我对使用createprivateobjectsecurityex创建的私有安全对象调用访问检查。随着Uac开启,我从accesscheck获得了成功,但没有任何权限被保留。关闭uac后,我获得了GantedAccess参数
中所有权限的成功详细 该应用程序有两个组件,一个客户端和一个服务器。它 使用tcp通过不安全的网络进行通信。进行身份验证 我使用上面列出的sspi api进行连接 冒充主叫用户。一旦主叫用户被模仿我 使用Accesscheckandauditalarm,如果失败,我将恢复到正常状态 AccessCheck的。随着UAC开启,我获得了成功 accesscheckandauditalarm但没有访问权限 grandedaccess参数,但如果关闭uac它按预期工作。 我已检查服务器进程的完整性级别并已设置 到高,我看了模仿令牌的完整性级别 用于模拟调用用户,并将其设置为“中”。我有 尝试将主叫用户的完整性级别设置为高,用 成功,但访问检查仍然返回不正确的结果。 我可能有一个链接令牌,我尝试使用链接令牌 调用GetTOkenInformation(TokenLInkedToken),结果为0x520。 关于我接下来会尝试的任何想法都会受到赞赏。
验证后的代码。
SECURITY_STATUS ss = SEC_E_OK;
HANDLE _hToken = NULL;
ss = QuerySecurityContextToken((PCtxtHandle)pContext,&_hToken);
if(SEC_E_OK != ss)
{
return ss;
}
CAccessToken impToken;
impToken.Attach(_hToken);
if(CWin32::IsVista())
{
/*TOKEN_LINKED_TOKEN linkedToken;
DWORD nLen = 0;
BOOL bRet = GetTokenInformation(_hToken,
(TOKEN_INFORMATION_CLASS)TokenLinkedToken,&linkedToken,sizeof(linkedToken), &nLen);
if(bRet)
{
CloseHandle(impToken.Detach());
impToken.Attach(linkedToken.LinkedToken);
}
else
{
TRACE(_T("GetTokenInfo Failed 0x%x\n"),GetLastError());
}*/
PSID pHighIntegritySid = NULL;
BOOL bConvertSid = FALSE;
bConvertSid = ConvertStringSidToSid(SDDL_ML_HIGH,
&pHighIntegritySid);
if (bConvertSid)
{
TOKEN_MANDATORY_LABEL TML = {0};
TML.Label.Attributes = SE_GROUP_INTEGRITY |
SE_GROUP_INTEGRITY_ENABLED;
TML.Label.Sid = pHighIntegritySid;
BOOL bSetTokenRet = SetTokenInformation(_hToken,
(TOKEN_INFORMATION_CLASS)TokenIntegrityLevel,&TML,sizeof(TML) +
GetLengthSid(pHighIntegritySid));
LocalFree(pHighIntegritySid);
if(!bSetTokenRet)
{
nReturn = GetLastError();
DBGOUT(DebugOut::LOG_COMP_AUTH_LAYER,DebugOut::LOG_DETAIL_ERROR,
_T("Failed to set Token information %x\n"),nReturn);
return nReturn;
}
}
}
bool bRet = impToken.Impersonate();
if(false == bRet)
{
return GetLastError();
}
_GetTokenSecurityLevel(impToken.GetHandle());
::MapGenericMask(&nRights, GetGENERIC_MAPPING());
DWORD nAccessGranted = 0;
BOOL bAccessStatus = FALSE;
BOOL bGenerateOnClose = FALSE;
BOOL bAccessCheckRet = FALSE;
bAccessCheckRet = ::AccessCheckAndAuditAlarm(_T("Purgos
Security"),impToken.GetHandle(),_T("Purgos"),m_csObjectName.GetBuffer(0),
const_cast<SECURITY_DESCRIPTOR*>(m_ObjectSD.GetPSECURITY_DESCRIPTOR())/
*privObjectSD.GetPSECURITY_DESCRIPTOR())*/,MAXIMUM_ALLOWED,GetGENERIC_MAPPI NG(),FALSE,&nAccessGranted,&bAccessStatus,&bGenerateOnClose);
答案 0 :(得分:3)
找到所有相关方的解决方案。
问题是被身份验证的用户是本地帐户,默认情况下,本地帐户具有过滤令牌,其中BUILTIN \ Administrators组具有拒绝ACL。我正在检查BUILTIN \ Administrators组的权限。因此必须设置注册表设置或使用域帐户。
赖安