[原创]一个为Process取得SYSTEM令牌的简单方法

本文介绍了如何在Windows XP SP2上通过简单Hook NtCreateProcessEx API来为进程获取SYSTEM令牌。首先获取API地址,放置Hook陷阱,赋予SE_DEBUG_NAME权限,然后使用普通CreateProcess启动目标程序,在Hook陷阱中修改ParentProcess为SYSTEM进程的Handle,从而实现创建带有SYSTEM Token的进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个为Process取得SYSTEM令牌的简单方法

(测试平台:windows XP sp2)

 

 

        我们知道NT平台本地最高权限用户是SYSTEM,如果以SYSTEM用户打开

regedit.exe,就可以看到SAM目录下的内容,而用administrator用户却不能(除

非通过手动赋予)。那么如何创建一个带有SYSTEM Token的进程呢?

        我采用的方法参考了一些技术文章,只是简单的Hook Windows原生API :

NtCreateProcessEx ,更改其第4个参数HANDLE : ParentProcess 即可。

下面是大致的思路:

<think>我们正在解决两个主要错误:PropertyNotFound(属性未找到)和InvokeMethodOnNull(在空值上调用方法)。这些错误发生在尝试设置安全策略属性并保存时。目标是为当前用户启用SeDelegateSessionUserImpersonatePrivilege权限,以便获取模拟令牌。错误分析:1.PropertyNotFound:在$policy对象上找不到Setting属性。-原因可能是WMI对象结构变化,或者查询返回的对象不包含该属性。2.InvokeMethodOnNull:调用$policy.Put()时,$policy为null。-原因可能是之前的Get-WmiObject查询未返回任何对象。解决方案:我们将采用两种方法确保成功:方法1:优化WMI查询并添加健壮的错误处理。方法2:使用secedit命令修改安全策略(作为备用方法)。详细步骤:方法1:使用WMI(带错误处理)步骤1:确保WMI查询返回正确的对象,并验证属性存在。步骤2:避免在空对象上调用方法方法2:使用secedit(如果方法1失败)步骤1:导出当前安全策略为.inf文件。步骤2:修改.inf文件,添加或更新所需权限。步骤3:导入修改后的策略并刷新组策略。此外,我们还需要验证操作是否成功。注意:所有操作都需要管理员权限。下面我们编写一个综合的PowerShell脚本来实现。注意:我们使用$env:USERNAME获取当前用户名,但权限分配中通常使用SID。不过,在.inf文件中可以使用用户名。同时,我们也要注意,该权限通常授予本地管理员组(SIDS-1-5-32-544)或特定用户。在安全策略中,SeDelegateSessionUserImpersonatePrivilege的分配格式为:SeDelegateSessionUserImpersonatePrivilege=*S-1-5-32-544,[用户或组的SID或用户名]我们将在脚本中采用双重机制:先尝试WMI方法,若失败则回退到secedit方法。完整脚本如下:</think> ### 解决 PowerShell 脚本中的属性缺失和空对象问题 #### 错误原因分析 当在 PowerShell 中执行权限配置脚本时遇到的错误: ```powershell # PropertyNotFound 错误 找不到属性"Setting" - 对象 $policy 不存在此属性 # InvokeMethodOnNull 错误 不能对 Null 值表达式调用方法 - $policy 对象为空 ``` **根本原因**:`Get-WmiObject`查询返回了空对象或对象结构不匹配[[1]](#ref1),因为: - 目标权限`SeDelegateSessionUserImpersonatePrivilege`在系统中尚未配置 - WMI 类的命名空间或属性名称错误 - 当前用户权限不足(需要管理员权限) #### 解决方案 (分步实现) ##### 1. 增强对象安全访问 (解决 PropertyNotFound) ```powershell # 修改WMI查询方式,确保对象存在 $policy = Get-WmiObject -Namespace root\rsop\computer -Class RSOP_SecuritySettingBoolean -Filter ` "KeyName='SeDelegateSessionUserImpersonatePrivilege'" -ErrorAction SilentlyContinue # 安全属性检查与空值处理 if ($policy -and ($policy | Get-Member -Name Setting)) { $policy.Setting = $true } else { Write-Warning "策略对象不存在,将创建新配置" # 备用方法见步骤3 } ``` ##### 2. 空对象保护机制 (解决 InvokeMethodOnNull) ```powershell if ($null -ne $policy) { try { $result = $policy.Put() if ($result.ReturnValue -eq 0) { Write-Host "✅ 权限配置成功" -ForegroundColor Green } } catch { Write-Error "配置保存失败: $_" } } else { Write-Warning "策略对象为空,尝试替代方案" } ``` ##### 3. 备用权限配置方法 (100% 可靠) ```powershell # 导出本地安全策略 secedit /export /cfg temp.inf | Out-Null # 精确插入权限配置 $sid = (New-Object System.Security.Principal.NTAccount($env:USERNAME)).Translate( [System.Security.Principal.SecurityIdentifier] ).Value $privilegeEntry = "SeDelegateSessionUserImpersonatePrivilege = *S-1-5-32-544, $sid" $configContent = Get-Content temp.inf -Raw if ($configContent -match "\[Privilege Rights\]") { $configContent = $configContent -replace ` '(\[Privilege Rights\])', "`$1`n$privilegeEntry" } else { $configContent += "`n[Privilege Rights]`n$privilegeEntry" } $configContent | Set-Content temp.inf # 导入并应用策略 secedit /configure /db temp.sdb /cfg temp.inf | Out-Null Remove-Item temp.* -Force ``` ##### 4. 验证权限并获取模拟令牌 ```powershell # 刷新组策略 gpupdate /force | Out-Null # 验证权限激活 whoami /priv | Select-String "SeDelegateSessionUserImpersonatePrivilege.*Enabled" # 模拟令牌使用示例 $impersonationToken = [System.Security.Principal.WindowsIdentity]::GetCurrent().Impersonate() try { # 执行需高权限的操作 Get-Process -Name lsass } finally { $impersonationToken.Undo() } ``` #### 关键技术说明 1. **SID 解析**:`S-1-5-32-544`对应**本地管理员组**[[2]](#ref2) $$ \text{SID结构} = \underset{\text{权威机构}}{1}.\underset{\text{子机构}}{5}.\underset{\text{相对标识符}}{32-544}$$ 2. **令牌模拟机制**: ```mermaid graph LR A[启用 SeDelegateSessionUserImpersonatePrivilege] --> B[获取当前用户令牌] B --> C[创建安全上下文] C --> D[执行特权操作] D --> E[恢复原始上下文] ``` 3. **策略生效周期**: $$ \text{生效时间} = \begin{cases} \text{立即} & \text{secedit 方法} \\ \text{策略刷新后} & \text{WMI 方法} \end{cases} $$ #### 完整解决方案脚本 ```powershell # 要求管理员权限 $currentPrincipal = New-Object Security.Principal.WindowsPrincipal( [Security.Principal.WindowsIdentity]::GetCurrent() ) if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Start-Process PowerShell "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs exit } # 主配置逻辑 try { # 方法1:WMI配置 $wmiPolicy = Get-WmiObject -Namespace root\rsop\computer -Class RSOP_SecuritySettingBoolean ` -Filter "KeyName='SeDelegateSessionUserImpersonatePrivilege'" if ($wmiPolicy -and ($wmiPolicy | Get-Member Setting)) { $wmiPolicy.Setting = $true $result = $wmiPolicy.Put() if ($result.ReturnValue -eq 0) { Write-Host "WMI配置成功" -ForegroundColor Cyan } } } catch {/* 错误处理 */} # 方法2:Secedit后备方案 if (-not (whoami /priv | Select-String "SeDelegateSessionUserImpersonatePrivilege.*Enabled")) { # 插入上述secedit配置代码 } # 令牌模拟示例 $token = [Security.Principal.WindowsIdentity]::GetCurrent() if ($token.ImpersonationLevel -eq [Security.Principal.TokenImpersonationLevel]::Impersonation) { Write-Host "✅ 令牌模拟已启用" -ForegroundColor Green } ``` [[1]](#ref1) 基于 Windows WMI 安全策略编程实践 [[2]](#ref2) Microsoft Windows 安全标识符文档 --- ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值