首页
社区
课程
招聘
[原创]简单的"DACLs 和 ACEs"利用之阻塞进程句柄
发表于: 2025-1-23 20:51 6151

[原创]简单的"DACLs 和 ACEs"利用之阻塞进程句柄

2025-1-23 20:51
6151

微软对于DACLs 和 ACEs描述

Windows 访问控制机制:

每个 Windows 内核对象(例如文件、进程、线程等)都有一个安全描述符(Security Descriptor)。

安全描述符包含了自主访问控制列表(DACL)以及其他安全信息。

DACL 是一系列访问控制条目(ACE)的列表,每个 ACE 定义了特定的用户或组对该对象的操作权限。

DACL 和 ACE 的工作原理:

DACL: DACL 就像一个对象的“访问权限清单”,它决定了谁可以对这个对象执行哪些操作。

ACE: 每个 ACE 都是 DACL 中的一个条目,它包含以下信息:

受托人 (Trustee): 可以是用户、组或特殊账户(例如“Everyone”、“SYSTEM”)。

访问权限 (Access Mask): 指定允许或拒绝的操作类型(例如读取、写入、执行、删除、查询信息等)。

ACE 类型 (Type): 可以是允许访问(Allow ACE)或拒绝访问(Deny ACE)。

访问控制过程:

当一个进程尝试访问一个对象时,Windows 会检查对象的安全描述符。

系统会提取 DACL 并遍历其中的 ACE,检查 ACE 的受托人是否与请求进程的访问令牌匹配。

如果找到匹配的 允许 ACE,并且允许了请求的全部权限,则授予访问权限,并停止检查。

如果找到匹配的 拒绝 ACE,则拒绝访问权限,并停止检查。

如果检查完所有 ACE 都找不到匹配的允许 ACE,则拒绝访问。

拒绝 ACE 优先: 如果既有允许 ACE 也有拒绝 ACE,则拒绝 ACE 优先。

ACE 顺序重要: ACE 在 DACL 中的顺序很重要,因为系统是按照顺序检查 ACE,直到授予或拒绝访问。

如何阻止其他进程打开句柄:

要阻止其他进程打开你的进程句柄,你需要修改你进程的安全描述符中的 DACL,添加一个拒绝访问的 ACE。

这个 ACE 需要满足以下条件:

受托人: 你需要决定拒绝哪个用户或组的访问,通常拒绝当前用户本身或者所有用户的访问。

访问权限: 你需要拒绝所有进程访问权限 (PROCESS_ALL_ACCESS)。

使用 SetSecurityInfo 设置 DACL:

SetSecurityInfo 函数允许你修改内核对象的安全描述符,包括 DACL。

当使用 SetSecurityInfo 设置 DACL_SECURITY_INFORMATION 时,它会用你提供的新的 DACL 替换 原有的 DACL。
也是正因为如此,原有的全部被替换,所以仅仅剩下一个拒绝的.

图片描述

最后附上代码:
被替换DACL的进程(保护进程)

进行OpenProcess的进程(攻击进程):

#include <windows.h>
#include <aclapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <sddl.h>
 
void Cleaner(HANDLE TkHandle, PACL ProcACL, PTOKEN_USER UserTk) {
    if (TkHandle) {
        CloseHandle(TkHandle);
    }
    if (ProcACL) {
        free(ProcACL);
    }
    if (UserTk) {
        free(UserTk);
    }
}
//获取当前进程令牌并设置拒绝访问权限
bool SetSecurityControls() {
    HANDLE TkHandle = nullptr;
    PTOKEN_USER UserTk = nullptr;
    PACL ProcACL = nullptr;
    DWORD CbBuffer = 0;
    DWORD CbACL = 0;
    if (!OpenProcessToken(
        GetCurrentProcess(),
        TOKEN_QUERY,
        &TkHandle)) Cleaner(TkHandle, ProcACL, UserTk);
 
    GetTokenInformation(TkHandle, TokenUser, nullptr, 0, &CbBuffer);
    UserTk = static_cast<PTOKEN_USER>(malloc(CbBuffer));
    if (UserTk == nullptr) Cleaner(TkHandle, ProcACL, UserTk);
    if (!GetTokenInformation(
        TkHandle,
        TokenUser,
        UserTk,
        CbBuffer,
        &CbBuffer
    )) {
        Cleaner(TkHandle, ProcACL, UserTk);
    }
    if (!IsValidSid(UserTk->User.Sid)) {
        Cleaner(TkHandle, ProcACL, UserTk);
    }
 
    CbACL = sizeof(ACL) + sizeof(ACCESS_DENIED_ACE) + GetLengthSid(UserTk->User.Sid);
    ProcACL = static_cast<PACL>(malloc(CbACL));
    if (ProcACL == nullptr) Cleaner(TkHandle, ProcACL, UserTk);
    if (!InitializeAcl(ProcACL, CbACL, ACL_REVISION)) Cleaner(TkHandle, ProcACL, UserTk);
    // 添加拒绝访问的 ACE
    if (!AddAccessDeniedAce(
        ProcACL,
        ACL_REVISION,
        PROCESS_ALL_ACCESS, //拒绝所有权限
        UserTk->User.Sid
    )) {
        Cleaner(TkHandle, ProcACL, UserTk);
    }
 
    if (ERROR_SUCCESS == SetSecurityInfo(
        GetCurrentProcess(),
        SE_KERNEL_OBJECT,
        DACL_SECURITY_INFORMATION,
        nullptr, nullptr,
        ProcACL,
        nullptr
    )) {
        printf("Successfully set security controls.\n");
    }
    else {
        printf("Failed to set security controls.\n");
    }
 
    Cleaner(TkHandle, nullptr, UserTk);
    free(ProcACL);
    system("pause");
    return true;
}
 
 
int main() {
    if (!SetSecurityControls()) {
        printf("SetSecurityControls failed\n");
        system("pause");
        return 1;
    }
    system("pause");
    return 0;
}
#include <windows.h>
#include <aclapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <sddl.h>
 
void Cleaner(HANDLE TkHandle, PACL ProcACL, PTOKEN_USER UserTk) {
    if (TkHandle) {
        CloseHandle(TkHandle);
    }
    if (ProcACL) {
        free(ProcACL);
    }
    if (UserTk) {
        free(UserTk);
    }
}
//获取当前进程令牌并设置拒绝访问权限
bool SetSecurityControls() {
    HANDLE TkHandle = nullptr;
    PTOKEN_USER UserTk = nullptr;
    PACL ProcACL = nullptr;
    DWORD CbBuffer = 0;
    DWORD CbACL = 0;
    if (!OpenProcessToken(
        GetCurrentProcess(),
        TOKEN_QUERY,
        &TkHandle)) Cleaner(TkHandle, ProcACL, UserTk);
 
    GetTokenInformation(TkHandle, TokenUser, nullptr, 0, &CbBuffer);
    UserTk = static_cast<PTOKEN_USER>(malloc(CbBuffer));
    if (UserTk == nullptr) Cleaner(TkHandle, ProcACL, UserTk);
    if (!GetTokenInformation(
        TkHandle,
        TokenUser,
        UserTk,
        CbBuffer,
        &CbBuffer
    )) {
        Cleaner(TkHandle, ProcACL, UserTk);
    }
    if (!IsValidSid(UserTk->User.Sid)) {
        Cleaner(TkHandle, ProcACL, UserTk);
    }
 
    CbACL = sizeof(ACL) + sizeof(ACCESS_DENIED_ACE) + GetLengthSid(UserTk->User.Sid);
    ProcACL = static_cast<PACL>(malloc(CbACL));
    if (ProcACL == nullptr) Cleaner(TkHandle, ProcACL, UserTk);
    if (!InitializeAcl(ProcACL, CbACL, ACL_REVISION)) Cleaner(TkHandle, ProcACL, UserTk);
    // 添加拒绝访问的 ACE
    if (!AddAccessDeniedAce(
        ProcACL,
        ACL_REVISION,
        PROCESS_ALL_ACCESS, //拒绝所有权限
        UserTk->User.Sid

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 44
支持
分享
最新回复 (24)
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
1
2025-1-23 23:12
0
雪    币: 28
活跃值: (623)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
2025-1-24 09:59
0
雪    币: 23
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
学习学习
2025-1-24 10:26
0
雪    币: 698
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
学习学习
2025-1-24 12:34
0
雪    币: 3967
活跃值: (2094)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学到了
2025-1-31 06:36
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
66666
2025-2-15 13:49
0
雪    币: 188
活跃值: (1151)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
Thank so much!
2025-2-17 15:26
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
也太厉害了吧
2025-2-17 15:53
0
雪    币: 39
活跃值: (620)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
666
2025-3-2 17:37
0
雪    币: 1051
活跃值: (3593)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
2025-3-3 08:36
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
666
2025-3-3 09:22
0
雪    币: 1918
活跃值: (6765)
能力值: ( LV7,RANK:118 )
在线值:
发帖
回帖
粉丝
13
mark
2025-3-19 15:58
0
雪    币: 154
活跃值: (7771)
能力值: ( LV9,RANK:335 )
在线值:
发帖
回帖
粉丝
14
2025-3-19 16:16
0
雪    币: 5266
活跃值: (3951)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
mark
2025-3-21 14:08
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
mark
2025-3-24 20:35
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
mark
2025-3-25 23:17
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
mark
2025-4-10 21:27
0
雪    币: 0
活跃值: (190)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
mark
2025-4-13 10:36
0
雪    币: 2043
活跃值: (350)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
wwwq
2025-4-17 11:46
0
雪    币: 2043
活跃值: (350)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
不能阻止DEBUGGER打开进程
2025-4-17 11:55
0
雪    币: 3616
活跃值: (3405)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
mark
2025-4-22 21:06
0
雪    币: 2274
活跃值: (5448)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
23
牛逼牛逼
2025-5-21 07:09
0
雪    币: 227
活跃值: (417)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
mark
2025-5-25 02:01
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25

感谢分享!帖子深入解析了Windows进程访问控制,并附代码。如需更直观理解,可用思维导图梳理流程。


最后于 12小时前 被mb_cizqyhuh编辑 ,原因:
15小时前
0
游客
登录 | 注册 方可回帖
返回