You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从NT Authority/SYSTEM权限切换至Administrator权限获取Shell

如何从NT Authority/SYSTEM权限切换至Administrator权限获取Shell

兄弟,我太懂你这种窘境了——握着最高级的SYSTEM权限,却偏偏切不到Administrator的shell,毕竟有些工具、脚本就认普通管理员的上下文,真的头疼。给你几个我实战过的靠谱方法,都是在CommandLine/Powershell里就能直接操作的:


方法一:用计划任务(最稳定可靠)

SYSTEM权限完全能创建并触发以Administrator身份运行的计划任务,这个方法几乎不会受UAC或者会话限制,稳得一批:

命令行(CMD)版本

  1. 先创建任务(如果Administrator有密码,记得加 /rp "你的密码" 参数):
schtasks /create /tn "TempAdminShell" /tr "cmd.exe" /ru "Administrator" /sc once /st 00:00 /f
  1. 立即触发任务:
schtasks /run /tn "TempAdminShell"

如果你的Administrator账户是禁用状态,先执行这个命令启用:

net user Administrator /active:yes

用完之后可以再用 /active:no 禁用回去。

Powershell版本

代码更简洁,还能直接调Powershell:

# 创建任务动作和主体
$taskAction = New-ScheduledTaskAction -Execute "powershell.exe"
$taskPrincipal = New-ScheduledTaskPrincipal -UserId "Administrator" -LogonType Interactive

# 注册并启动任务
Register-ScheduledTask -TaskName "TempAdminPS" -Action $taskAction -Principal $taskPrincipal -Force
Start-ScheduledTask -TaskName "TempAdminPS"

方法二:窃取Administrator进程的Token(适合快速切换)

如果系统里已经有Administrator运行的进程(比如桌面的explorer.exe),可以直接偷它的Token来启动新shell,不用绕计划任务:

先导入必要的API函数,再执行窃取逻辑:

Add-Type @"
using System;
using System.Runtime.InteropServices;
public class TokenHelper {
    [DllImport("advapi32.dll", SetLastError=true)]
    public static extern bool OpenProcessToken(IntPtr ProcessHandle, uint DesiredAccess, out IntPtr TokenHandle);
    [DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
    public static extern bool CreateProcessWithTokenW(IntPtr TokenHandle, uint LogonFlags, string ApplicationName, string CommandLine, uint CreationFlags, IntPtr CurrentDirectory, IntPtr StartupInfo, out IntPtr ProcessInformation);
}
"@

# 找到Administrator的进程(这里以explorer为例,没有的话换其他进程)
$adminProcess = Get-Process -Name "explorer" | Where-Object { $_.UserName -like "*Administrator*" }

if ($adminProcess) {
    # 打开进程Token
    $tokenHandle = [IntPtr]::Zero
    [TokenHelper]::OpenProcessToken($adminProcess.Handle, 0x0002, [ref]$tokenHandle) | Out-Null
    
    # 用Token启动新的Powershell
    [TokenHelper]::CreateProcessWithTokenW($tokenHandle, 0, "powershell.exe", $null, 0x00000010, [IntPtr]::Zero, [IntPtr]::Zero, [ref][IntPtr]::Zero) | Out-Null
} else {
    Write-Host "没找到Administrator的进程,先启动一个后台进程再试!"
}

方法三:runas命令(需要知道Administrator密码)

如果你知道管理员密码,这个方法最快,但在非交互式的SYSTEM会话里可能会踩坑:

# 直接带密码运行(把`你的密码`替换成实际密码)
echo 你的密码 | runas /user:Administrator "cmd.exe"

如果之前缓存过凭据,也可以用/savecred参数跳过密码输入:

runas /user:Administrator /savecred "powershell.exe"

不过这个方法有时候会因为UAC设置或者会话权限失败,优先级不如前两个。


备注:内容来源于stack exchange,提问作者asim

火山引擎 最新活动