首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >服务器2008 R2和服务器2016上的OpenProcess (PROCESS_DUP_HANLDE|SYNCHRONIZE,x,x)访问被拒绝

服务器2008 R2和服务器2016上的OpenProcess (PROCESS_DUP_HANLDE|SYNCHRONIZE,x,x)访问被拒绝
EN

Stack Overflow用户
提问于 2020-10-22 09:40:23
回答 1查看 78关注 0票数 1

以系统帐户身份运行服务。客户端应用程序调用OpenProcess (PROCESS_DUP_HANDLE | SYNCHRONIZE,x,x)

客户端以管理员身份运行,并且在服务器2008+上以高权限运行。在Windows Server 2003上,这可以很好地工作。

在Server2008 R2和Server2016上,如果服务以系统身份运行,则以本地管理员身份运行的客户端被提升,客户端在打开以系统身份运行的进程时被拒绝访问。如果我们将服务更改为以本地管理员帐户运行,则来自客户端的OpenProcess将正常工作。

我们可以在Process Explorer -属性-安全选项卡-无法打开的服务进程的权限中看到的内容-在Server2003中,每个人都有“完全控制”权限。在2008年,R2和更高版本的进程中没有添加任何权限。

如果我们在Server2008 R2+上的客户端启用了SeDebugPrivilege,那么即使服务是以系统身份运行的,OpenProcess也会成功。

不幸的是,客户端的代码不再可用,有没有什么系统配置可以在没有SeDebugPrivilege的情况下在2008 R2或更高版本中工作?

我知道如果服务是一个受保护的进程,这将被阻塞,但我不认为这是一个受保护的进程。

在Server2003上,如果我作为控制台(它支持)运行服务exe,作为系统帐户使用psexec -sid,我甚至在2003上也无法OpenProcess它。"Everyone“并不是以完全控制添加的。因此,似乎特定于服务配置的一些事情正在以不同的方式进行。

我在server 2003和server 2008 R2上用cmd sc sdshow检查了服务ACL,权限完全相同。

目前我正在通过启动挂起的进程,启用SeDebugPrivilege,然后恢复进程来解决问题,但感兴趣的是是否有任何其他操作系统配置选项来解决问题。

EN

回答 1

Stack Overflow用户

发布于 2020-10-26 09:40:59

我已经弄清楚原因了。该服务本身授予每个人完全控制权限。颠倒启动代码,如下所示:

代码语言:javascript
运行
复制
HANDLE hToken;
PTOKEN_PRIVILEGES NewPrivileges;
BYTE OldPriv[1024];
PBYTE pbOldPriv;
ULONG cbNeeded;
BOOLEAN fRc;
LUID LuidPrivilege;

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
   // fail
}

cbNeeded = 0;

// Initialize the privilege adjustment structure
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &LuidPrivilege);

NewPrivileges = (PTOKEN_PRIVILEGES)LocalAlloc(
    LMEM_ZEROINIT,
    sizeof(TOKEN_PRIVILEGES) + (1 - ANYSIZE_ARRAY) * sizeof(LUID_AND_ATTRIBUTES)
);

if (NewPrivileges == NULL) {
    return FALSE;
}

NewPrivileges->PrivilegeCount = 1;
NewPrivileges->Privileges[0].Luid = LuidPrivilege;
NewPrivileges->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

// Enable the privilege
pbOldPriv = OldPriv;
fRc = AdjustTokenPrivileges(
    hToken,
    FALSE,
    NewPrivileges,
    1024,
    (PTOKEN_PRIVILEGES)pbOldPriv,
    &cbNeeded
);

// grant everyone full control to process
       SECURITY_DESCRIPTOR securityDescriptor;
        HANDLE hCurrentProcess = GetCurrentProcess();
SetSecurityDescriptorDacl(&securityDescriptor, TRUE, NULL, FALSE);
SetKernelObjectSecurity(GetCurrentProcess(), DACL_SECURITY_INFORMATION, &securityDescriptor);

InitializeSecurityDescriptor(&securityDescriptor,1);

在Windows XP和Server2003上,向SetSecurityDescriptorDacl传入NULL按照微软文档的说明工作:

pDacl

指向指定安全描述符的DACL的ACL结构的指针。如果此参数为NULL,则将NULL DACL分配给安全描述符,从而允许对对象的所有访问。DACL由安全描述符引用,而不是复制到安全描述符中。

然而,在Server 2016、Server 2019和Windows 10上,此代码似乎删除了process对象上的所有all。

在此操作系统上,要在测试程序中获得相同的结果,必须使用以下命令:

代码语言:javascript
运行
复制
ConvertStringSecurityDescriptorToSecurityDescriptor(L"D:PAI(A;;GA;;;WD)", SDDL_REVISION_1, &pSecurityDescriptor, plDescriptorSize);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64474016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档