首页
社区
课程
招聘
[原创] R3提权 突破TrustedInstaller 更改所有者实现代码删除系统文件
2023-10-6 05:14 10214

[原创] R3提权 突破TrustedInstaller 更改所有者实现代码删除系统文件

2023-10-6 05:14
10214

R3提权 突破TrustedInstaller 更改所有者实现代码删除系统文件

为了让需要的网友能够找到相关资料,所以标题起的有点夸张,前年,我有个奇怪的需求就是要删除系统目录下的某个文件,然后东拼西凑出来的代码


Win10系统手动修改删除

我们直接删除系统目录下的文件会提示需要权限才能进行更改


编辑权限也无法编辑


问了一下百度 原因是需要修改所有者 下面是修改所有者的步骤

修改完成之后即可正常编辑权限

代码

#include<Windows.h>
#include<iostream>
#include<AclAPI.h>

//修改文件的用户访问权限
BOOL EnableFilaAccountPrivilege(const char path[],PCTSTR accountName)
{
    EXPLICIT_ACCESS aces{};
    PACL pACL = NULL;
    PACL pACL1 = NULL;

    //获取文件(夹)安全对象的DACL列表
    GetNamedSecurityInfo((LPTSTR)path,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,&pACL1,NULL,NULL);

    //生成指定用户帐户的访问控制信息(这里指定赋予全部的访问权限)
    BuildExplicitAccessWithName(&aces,(LPTSTR)accountName,GENERIC_ALL,GRANT_ACCESS,SUB_CONTAINERS_AND_OBJECTS_INHERIT);

    //创建新的ACL对象(合并已有的ACL对象和刚生成的用户帐户访问控制信息)
    if (ERROR_SUCCESS != SetEntriesInAcl(1,&aces,pACL1,&pACL))
    {
        printf("SetEntriesInAcl\r\n");
        if (NULL != pACL) LocalFree(pACL);
        return FALSE;
    }
    //设置文件(夹)安全对象的DACL列表
    if (ERROR_SUCCESS != SetNamedSecurityInfo((LPTSTR)path,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pACL,NULL)) 
    {
        printf("SetNamedSecurityInfo\r\n");
        if (NULL != pACL) LocalFree(pACL);
        return FALSE;
    }
    if (NULL != pACL) LocalFree(pACL);
    return TRUE;
}

//提升自己进程的权限
BOOL AdjustPrivileges()
{
    HANDLE hToken = NULL;
    LUID luidValue = { 0 };
    TOKEN_PRIVILEGES tokenPrivileges = { 0 };

    //打开进程令牌并获取进程令牌句柄
    if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
    {
        printf("OpenProcessToken\r\n");
        return FALSE;
    }

    //设置提升权限信息
    tokenPrivileges.PrivilegeCount = 1;
    tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if (!LookupPrivilegeValue(NULL, SE_TAKE_OWNERSHIP_NAME, &tokenPrivileges.Privileges[0].Luid))
    {
        printf("LookupPrivilegeValue\r\n");
        return FALSE;
    }

    //提升进程令牌访问权限
    if (!AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, 0, NULL, NULL))
    {
        printf("AdjustTokenPrivileges\r\n");
        return FALSE;
    }
    else
    {
        //根据错误码判断是否特权都设置成功
        DWORD dwRet = ::GetLastError();
        if (ERROR_SUCCESS == dwRet)
        {
            return TRUE;
        }
        else if (ERROR_NOT_ALL_ASSIGNED == dwRet)
        {
            printf("ERROR_NOT_ALL_ASSIGNED\r\n");
            return FALSE;
        }
    }
    return FALSE;
}

//修改所有者权限
BOOL ChangeOwner(const char* Path)
{
    char UserName[36] = { 0 };

    //LookupAccountName函数所需要的变量
    DWORD cbUserName = sizeof(UserName);
    char Sid[1024] = { 0 };
    DWORD cbSid = sizeof(Sid);
    char DomainBuffer[128] = { 0 };
    DWORD cbDomainBuffer = sizeof(DomainBuffer);
    SID_NAME_USE eUse;

    //获取当前登陆用户名
    GetUserNameA(UserName,&cbUserName);

    //获取用户名SID
    if (!LookupAccountNameA(NULL,UserName,&Sid,&cbSid,DomainBuffer,&cbDomainBuffer,&eUse)) return FALSE;

    //更改所有者
    //Path                    要更改的文件或文件夹路径
    //SE_FILE_OBJECT          注册表为:SE_REGISTRY_KEY    
    //Sid                     需要更改所有者的SID
    if(ERROR_SUCCESS!=SetNamedSecurityInfoA((LPSTR)Path,SE_FILE_OBJECT,OWNER_SECURITY_INFORMATION,&Sid,NULL,NULL,NULL)) return FALSE;
    return TRUE;
}

int main()
{
    char strBuffer[256] = { 0 };
    DWORD dwSize = sizeof(strBuffer);
    GetUserName(strBuffer, &dwSize);
    printf("用户名 %s\n",strBuffer);

    if (AdjustPrivileges()) printf("提升自己进程的权限成功\n");
    if (ChangeOwner("C:\\Windows\\System32\\ntoskrnl.exe")) printf("更改所有者成功\n");
    if(EnableFilaAccountPrivilege("C:\\Windows\\System32\\ntoskrnl.exe", strBuffer)) printf("修改文件的用户访问权限成功\n");
    system("pause");
    return 0;
}

编译的时候需要修改一下UAC执行级别


运行结果


修改完成的实体效果


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞14
打赏
分享
最新回复 (8)
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
_TypeError 2023-10-6 12:55
2
0
牛蛙牛蛙 旺哥
雪    币: 3663
活跃值: (3843)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 2023-10-6 20:06
3
0
感谢分享
雪    币: 3699
活跃值: (3713)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Mxixihaha 2023-10-6 20:45
4
0
感谢分享
雪    币: 19299
活跃值: (28938)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-10-6 20:47
5
1
感谢分享
雪    币: 6888
活跃值: (3488)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
romobin 2023-10-6 22:09
6
0
感谢感谢,  编译测试成功 ,准备编译成dll 调用方便 
雪    币: 346
活跃值: (386613)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
一笑人间万事 2023-10-7 15:47
7
1

初雨团队的NSudo了解下~

最后于 2023-10-7 15:50 被一笑人间万事编辑 ,原因:
雪    币: 2093
活跃值: (1820)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
洪七公. 2023-10-7 16:48
8
1
感谢分享
雪    币: 1470
活跃值: (2463)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
旺仔_小可爱 2023-10-9 00:12
9
0
飄零 初雨团队的NSudo了解下~
又跟大佬学到了 哈哈哈
游客
登录 | 注册 方可回帖
返回