提升程序的特权(AdjustTokenPrivileges)

本文详细介绍如何利用Windows API函数提升程序的运行特权,包括获取进程令牌、设置特权等关键步骤,并提供了一个完整的示例代码。

提升程序的特权

 

 

首先列出需要的函数

1.OpenProcessToken

2.AdjustTokenPrivileges

3. LookupPrivilegeValue

 

 

--------------------------------------------------------------

首先需要获取进程的令牌句柄

OpenProcessToken的原型.

BOOL WINAPI OpenProcessToken(
  __in          HANDLE ProcessHandle,
  __in          DWORD DesiredAccess,
  __out         PHANDLE TokenHandle
);

 

第一个参数 进程句柄(当前进程为GetCurrentProcess()为参数)

第二个参数 访问令牌特权

第三个参数 返回的参数 就是AdjustTokenPrivileges的第一个参数

 

例子:

HANDLE hToken;

bool retn = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);

if(!retn)

{

      return; //获取令牌失败。。

}

 

注:第二个参数 是令牌的权限,这个权限是要有修改权限的特权,意思就是要把你程序的权限修改得更高。

关于其他权限可以查MSDN..            所有权限可以写TOKEN_ALL_ACCESS ,去查看一个令牌特权可以用TOKEN_QUERY

这个下面函数有写。

--------------------------------------------------------------

首先先说一下使用AdjustTokenPrivileges需要的。

在这个函数中的第3和第5个参数中需要用到一个TOKEN_PRIVILEGES的结构体,在这个结构体中还有个LUID_AND_ATTRIBUTES结构体

详细说明 查看我博客的翻译分类里

 

TOKEN_PRIVILEGES结构体

typedef struct _TOKEN_PRIVILEGES

{
       DWORD PrivilegeCount; 
       LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
}TOKEN_PRIVILEGES;   

 

下面的参数是个特权数组。

上面的参数是要修改的特权数目

 

LUID_AND_ATTRIBUTES 结构体

typedef struct _LUID_AND_ATTRIBUTES

       LUID Luid; 
       DWORD Attributes;
} LUID_AND_ATTRIBUTES;

 

第一个参数是Luid是一个标志,不同的Luid代表着各种不同的特权类型

第二个参数是要这个特权干嘛,如启用这个特权(SE_PRIVILEGE_ENABLED)

 

这里的Luid的值需要用LookupPrivilegeValue来获取。

------------------------------------------------------------------------------------------

 LookupPrivilegeValue的原型

BOOL WINAPI LookupPrivilegeValue(
  __in_opt      LPCTSTR lpSystemName,
  __in          LPCTSTR lpName,
  __out         PLUID lpLuid
);

 

第一个参数是系统的名字,如果为NULL,就是本地名字(这里就填NULL)

第二个参数是特权的名字,要查看详细特权,看我的博客里翻译分类里的 包含特权 的文章。(在这里写SE_DEBUG_NAME)

第三个参数就可以通过指针返回一个LUID类型的Luid的标识了。 通过这个值就可以填入刚才的结构体里了。

----------------------------------------------------------------------------------------------------------------------------

 

最后就可以介绍AdjustTokenPrivilege就应该没什么问题了。

它的原型为:

BOOL WINAPI AdjustTokenPrivileges(
  __in          HANDLE TokenHandle,
  __in          BOOL DisableAllPrivileges,
  __in_opt      PTOKEN_PRIVILEGES NewState,
  __in          DWORD BufferLength,
  __out_opt     PTOKEN_PRIVILEGES PreviousState,
  __out_opt     PDWORD ReturnLength
);

第一个参数为OpenProcessToken第三个指针参数传出的句柄值

第二个参数为是否禁用所有所有的特权(这里填false)

第三个参数为新的TOKEN_PRIVILEGES的特权结构体指针

第四个参数是上面结构体的字节长度(sizeof)

第五个参数是 接受原先的特权的结构体

第六个参数也是这个结构体的字节长度的指针

 

在这里后两个参数不用管。

详细看我的博客翻客相关说明

MSDN里说

如果第五个参数不是NULL,在OpenProcessToken加特权时除了需要指定TOKEN_ADJUST_PRIVILEGES还必须指定TOKEN_QUERY

如果第五个参数是NULL,你不接受原先的结构体(第六个当然也是NULL), 就不用再指定附加的TOKEN_QUERY的特权了。

 

 

还要注意:

 就算这个函数返回为真,还要调用GetLastError()来检验是否完全成功。

如果返回ERROR_SUCCESS就代表修改非常成功 。。。其他的返回值 查我博客。

这个非常重要!!

还有就是Vista和Window7 里 一定要开管理员模式 才能获取成功

----------------------------------------------------

完整的例子

可以直接复制到VC 6.0里

 

 

 

在 Windows 系统中,提升账户权限或获取高特权通常涉及利用系统机制或漏洞,例如利用服务配置错误、进程令牌操作、驱动加载或调试权限等。以下是一些常见的方法和技术: ### 1. 利用服务账户提权 Windows 系统中某些服务以高权限账户(如 LocalSystem、LocalService 或 NetworkService)身份运行。攻击者可以尝试利用服务的配置错误(如可被低权限用户修改的服务二进制路径或注册表项)来执行恶意代码,从而获得高权限。 例如,若某个服务的可执行文件路径未正确设置访问控制列表(ACL),攻击者可替换该服务的可执行文件,使系统在启动服务时执行恶意代码[^1]。 ### 2. 获取 SeDebugPrivilege 调试权限 SeDebugPrivilege 是一种高权限特权,允许进程访问和调试其他进程的内存。拥有此权限的进程可以读写其他进程的内存,甚至注入代码并执行。 攻击者可通过调用 `AdjustTokenPrivileges` 函数启用当前进程的 SeDebugPrivilege,进而附加到高权限进程(如 `explorer.exe` 或 `lsass.exe`),读取其内存内容或提取凭证信息[^2]。 ```cpp HANDLE hToken; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LUID luid; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL); ``` ### 3. 使用令牌模拟(Token Impersonation) 通过利用 `SeAssignPrimaryTokenPrivilege` 或 `SeImpersonatePrivilege`,攻击者可以模拟其他用户的安全上下文。例如,使用 `CreateProcessWithTokenW` 或 `CreateProcessAsUser` 函数启动以高权限账户身份运行的进程。 某些服务(如计划任务或 COM+ 应用程序)可能允许低权限用户模拟高权限令牌,从而实现提权操作。 ### 4. 加载内核驱动(SeLoadDriverPrivilege) 如果攻击者能够启用 `SeLoadDriverPrivilege`,则可以加载恶意内核驱动。这通常用于绕过安全机制或执行内核级代码。例如,攻击者可加载一个驱动程序来修改系统调用表(SSDT Hook)或绕过保护机制。 ```cpp // 启用 SeLoadDriverPrivilege EnablePrivilege(SE_LOAD_DRIVER_NAME); // 创建驱动对象并加载 CreateDriverObject(); StartDriver(); ``` ### 5. 利用 PowerShell 历史记录获取凭证 在某些情况下,用户可能在 PowerShell 中输入敏感命令(如包含密码的命令)。PowerShell 会将这些命令记录在历史记录中。攻击者可通过读取 `Get-History` 或直接访问历史记录文件来提取敏感信息[^1]。 ```powershell Get-History ``` 此外,攻击者还可利用 `cmdkey` 或 `runas` 命令尝试获取存储的凭证信息。 ### 6. 编程实现权限提升 通过编程方式实现权限提升通常涉及利用系统 API 或漏洞。例如,利用 UAC(用户账户控制)绕过技术(如通过 ` fodhelper.exe` 或 `eventvwr.exe`)来启动高权限进程。 ```python import os os.system("reg add HKCU\\Software\\Classes\\ms-settings\\Shell\\Open\\Command /d calc.exe /f") os.system("reg add HKCU\\Software\\Classes\\ms-settings\\Shell\\Open\\Command /v DelegateExecute /t REG_SZ /d '' /f") os.system("eventvwr.exe") ``` 上述代码通过修改注册表项,使 `eventvwr.exe` 启动 `calc.exe`,从而绕过 UAC 并以高权限执行代码[^3]。 ---
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值