本文以cmd为例,将它改为System账号
原理
每个程序都有一个EPROCESS结构体,每个程序的EPROCESS都有一个 Token,它定义了该进程的安全上下文(用户身份、权限等),我们可以通过WinDbg来对它进行修改
安装和配置WinDbg
从Windows应用商店或官网下载WinDbg并安装
安装完后以管理员身份运行cmd,运行命令
bcdedit -debug on
至此WinDbg安装完毕,并且本地内核调试功能开启
获取System用户令牌
打开WinDbg,点击左上角文件,在Start debugging栏处有Attach to kernel 选项,点击它,在最右侧栏处有一个Local选项点击它,再点击OK,就是点击文件后再“Start debugging” → “Attach to kernel” → “Local” → “OK”
此时会显示命令行,我们可以通过任务管理器得知System进程的PID是4,而它的HEX也是4
我们可以用以下命令输出System进程的详细信息(4指进程pid的16进制,1表示输出信息的详细程度,而1输出的信息正好包含用户Token)
!process 4 1
输出的Token部分就是这个进程的用户令牌,我们把它记录下来,例如我的是86e03b80
获得cmd的EPROCESS地址和token偏移量
我以cmd为例,运行cmd,运行命令
whoami
可以查看运行cmd的用户,为非System用户。
打开任务管理器,查看cmd进程的pid,并转化为16进制,例如我的转换后是1BF2
切回WinDbg,输入命令(把1BF2换成你所获得的用户令牌)
!process 1BF2 0
从PROCESS栏处获得cmd的EPROCESS地址,例如我的是9b06b900
dt _eprocess -ny token
获得token偏移量,例如我的是+0x0fc
写入内存
最后输入命令(把9b06b900改成你获得的程序EPROCESS地址,把+0x0fc改成你获得的token偏移量,把86e03b80改成你获得的用户token
eq 9b06b900+0x0fc 86e03b80
直接写入内存
再次切换回cmd输入命令whoami可以看到cmd的用户已经被改为system
以此类推其他用户和进程也可以用此方法