news 2026/10/10 3:44:52

Windows权限提升实战指南:从令牌到服务的提权命令详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows权限提升实战指南:从令牌到服务的提权命令详解

搞Windows安全这几年,我有一个特别深的感受:大部分“拿到一台机器却拿不到管理员权限”的窘境,不是卡在漏洞利用上,而是卡在基础权限模型没吃透。很多朋友上来就想用提权工具一把梭,结果不是被杀毒软件拦掉,就是命令根本没权限执行。这篇内容说白了,就是带你把Windows权限提升的基础知识和常用命令系统过一遍,弄明白系统到底凭什么认定你是“低权限”还是“高权限”。

这篇文章适合三类人:做授权渗透测试的安全新手、负责服务器加固的运维工程师,以及想搞懂Windows安全机制的开发人员。我会把自己在测试环境里反复踩过的坑和总结出来的经验一起写出来,包括命令怎么用、参数背后是什么意思、哪些输出才是真正值得盯的东西。先说一句老话:文章里讲的所有操作,都只允许在你拥有书面授权的测试环境或自己搭的实验环境里进行,未经授权对任何系统做权限提升都是违法行为,这点务必记牢。

1. 先搞清楚Windows的权限体系

1.1 从“令牌”说起:你到底是谁,系统说了算

Windows安全模型的核心不是“用户名密码验完了就完事”,而是登录成功后系统会给你发一张“身份证明”,这张证明在Windows内部叫访问令牌(Access Token)。你可以把它想象成进出大楼的工牌:工牌上写着你属于哪个部门、能进哪些楼层、能不能带人进去,Windows的令牌也是类似的东西,里面装着你的用户标识(SID)、所属的用户组列表、当前进程能调用的特权列表,还有完整性级别。

每次你运行一个程序,系统都会把这份令牌的副本附加到进程上,程序后面做任何敏感操作,系统都会检查这份令牌。权限提升的本质,就是想办法让进程携带的令牌“变大”:要么换一个更高权限用户的令牌,要么往现有令牌里塞入额外的特权,要么绕过系统对该令牌的权限校验。理解了这一点,你就能明白为什么whoami命令有两个好玩的分支——whoami显示你当前的有效身份,而whoami /all会把令牌里的所有细节全打印出来,后一条才是提权前期必须看的东西。

这里要特别提一下“特权(Privilege)”和“权限(Permission)”的区别。权限通常指NTFS文件权限、注册表权限这类针对具体对象的访问控制,由ACL(访问控制列表)决定;特权则是系统级别的能力,比如“调试程序”、“替换进程级令牌”、“关闭系统”,这些能力绑定在令牌里,和某个具体文件无关。提权时两者都可能成为突破口,但很多人习惯性只去看文件权限,忽略了令牌里的特权列表,导致错过像SeImpersonatePrivilege这种一眼就值钱的特权。

1.2 内置用户组与特权:Administrator并不是万能钥匙

Windows预定义了一批安全组,搞清楚它们的权限边界是提权的基础。Administrators组成员几乎能控制整台机器,可以安装驱动、修改系统文件、管理所有用户;Users组成员只能做普通日常操作,写不了系统目录,改不了关键注册表;SYSTEM账户比Administrator还高半级,它不归任何用户管,是操作系统内核和核心服务使用的身份;还有一个Everyone组,表示所有能登录到系统的账户。

实际提权中,你更多遇到的是“已经在Users组里,但想拿到Administrator或SYSTEM”的情况。比如拿到一个WebShell,进程身份是IIS的应用池账户,属于Users组;又比如通过某种方式取得了某台服务器上一个普通开发账号的权限,想横向扩散到域管账户。这时候要先看看自己的身份离管理员还有多远,最快的方法是net localgroup administrators看看组里有哪些成员,再whoami /groups看自己当前令牌挂靠了哪些组。

特权列表里有几个名字值得烂熟于心:SeDebugPrivilege(调试其他进程,可以用来注入或读取别的进程内存)、SeImpersonatePrivilege(允许模拟其他用户的令牌,大名鼎鼎的Potato家族提权就是靠它)、SeTakeOwnershipPrivilege(可以接管任何对象的拥有权,等于能改任意文件ACL)、SeBackupPrivilege(备份特权,能绕过NTFS权限读取任何文件)、SeRestorePrivilege(恢复特权,能写入任何位置)。只要当前令牌带其中任意一项,提权成功的概率就会大很多。

1.3 完整性级别与UAC:为什么“管理员”也要被拦

从Windows Vista开始,微软引入了完整性级别(Integrity Level,简称IL)和用户账户控制(UAC,User Account Control)。完整性级别是另一个维度的安全标签,从低到高依次为不可信、低、中、高、系统。即使你的令牌属于Administrators组,如果完整性级别是“中”,那也做不了很多需要“高”完整性级别才能做的操作。

UAC就是控制这个切换的开关。管理员登录后,系统默认给的不是完整的管理员令牌,而是一个经过过滤的令牌,完整性级别只有“中”;当某个操作需要管理员权限时,UAC弹窗确认后,系统才会给进程分配完整的高级别令牌。这个机制对提权的意义在于:有些低权限用户根本不在本地管理员组里,这时候UAC弹窗的机会都不会有;而如果某个配置允许普通用户以管理员方式运行程序且不弹窗,那就等于给提权开了一扇门。后面讲注册表、计划任务时,你会发现很多配置型漏洞都和“让低完整性进程有机会触发高完整性动作”有关。

2. 权限提升的核心思路:从四类问题下手

2.1 漏洞型提权:补丁没打全,历史漏洞就是敲门砖

第一类提权思路是直接攻击系统组件或内核的漏洞,拿到SYSTEM权限。经典例子是前些年影响巨大的MS17-010类远程代码执行漏洞,虽然它更多被用来做横向渗透,但同一类内核漏洞在本地提权上也屡见不鲜。这类漏洞利用工具公开、利用链成熟,只要目标系统没打补丁,基本就是一打就穿。

对测试者来说,漏洞型提权的前置工作是识别补丁和系统版本。systeminfo输出末尾会列出已安装的补丁编号,把补丁号和公开漏洞库比对,就能判断机器可不可打。但这类提权有个现实问题:极容易触发杀毒软件和EDR,而且打崩系统的风险也不小。我在授权测试里见过不少因为内核利用不当直接把目标机打蓝屏的案例,所以现在越来越倾向于先看配置型问题,把漏洞型提权当成最后手段。

2.2 配置型提权:服务、路径、权限三连排查

配置型提权是我个人遇到概率最高的一类,核心思路是“系统本身给了你利用的条件,只是管理员没注意”。例如某个Windows服务以SYSTEM身份运行,但它的可执行文件目录普通用户可写,那你就可以替换掉这个文件,等服务下次启动时用SYSTEM权限执行你的代码。再例如服务的二进制路径没有加引号,路径里又有空格,系统在解析路径时就会产生歧义,可能在更早的目录里找到一个同名文件来执行。

这类问题的排查命令非常集中:sc qc 服务名能看服务的二进制路径和启动账户,icacls能看目录的权限,wmic service list full能一次性导出所有服务的详细信息。我后面会在实操章节把这三个命令的组合用法完整演示一遍,因为它们组合起来就是一条高效的“捡漏流水线”。对运维同学来说,这类问题也最有加固意义——权限配置对了,很多提权路径就自动断掉了。

2.3 凭据型提权:找钥匙比撬锁更常见

第三类思路是翻找凭据。很多时候你根本不需要费劲去提权,因为系统里某个角落就明文躺着管理员密码,或者某个配置文件里有可复用的服务账号口令。Windows下常见的位置包括:IIS的web.config数据库连接串、PowerShell历史记录、环境变量里的密码、计划任务里保存的凭据、桌面或文档目录里的操作手册、远程桌面连接保存的凭据等等。

命令层面,cmdkey /list可以查看当前用户保存的Windows凭据,findstr /si password *.txt *.xml *.ini *.config可以在一批文件里搜密码关键词,type %APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt可以看PowerShell历史记录。不要小看这些“笨办法”,我在模拟项目X的测试中,曾靠运维留在服务器C盘根目录的一份部署说明文档,直接拿到了域管账户的口令,整个过程没碰任何漏洞。

2.4 令牌型提权:借别人的身份干活

第四类是令牌模拟和令牌劫持。Windows允许一个进程在某些条件下“借用”系统里其他进程的令牌来执行操作,比较出名的是SeImpersonatePrivilege配合Potato系列工具。原理可以这么理解:如果某个服务进程有模拟权限,而且系统里能拿到高权限进程的令牌句柄,那就可以让系统“以为”你是那个高权限进程,从而获得相应权限。

这种思路在服务账户提权场景里尤其常见,因为很多Windows服务配置的账户默认就带着SeImpersonatePrivilege和SeAssignPrimaryTokenPrivilege。你只需要找到一个能控制服务账户执行代码的入口,比如能往服务的工作目录写一个DLL,或者能执行计划任务脚本,接下来就能借令牌登高。操作层面,先用whoami /priv确认有没有可用的特权,再用工具去尝试模拟高权限令牌。它比漏洞利用更稳定,也更容易在授权测试里复现。

3. 信息收集:提权前你必须会这些命令

3.1 系统基础信息:补丁、版本、运行状态一眼看穿

提权前的信息收集决定了后续所有动作的方向,第一步永远是摸清系统底细。systeminfo是绕不开的命令,它会输出系统版本、主机名、处理器架构、网卡信息、已安装补丁列表等。重点关注三点:一是操作系统版本和Build号,这决定了该找哪个年代段的漏洞;二是补丁列表,缺了哪些历史补丁就直接对应公开提权漏洞;三是系统类型,有些利用工具只支持工作站系统,对服务器版无效。

systeminfo在真实机器上执行可能很慢,尤其旧机器要等十几秒,但你可以在等的同时并行跑一组其他命令。还要留意32位和64位系统的差异,很多利用程序需要匹配目标位数。另外配合wmic os get caption,version,osarchitecture或PowerShell的Get-ComputerInfo也能拿到类似信息,不管用哪个,核心目标是先回答两个问题:这系统打了哪些补丁,还缺哪些补丁。

3.2 当前身份与账户体系:先知道自己是谁

收集完系统信息,马上要看自己的身份。whoami /all输出当前用户的详细信息,包括SID、所属组、特权列表、完整性级别,这是判断提权可能性的基础。光看仍然不够,还要确认系统里有哪些其他账户,net user列出本地用户,net localgroup列出本地用户组,net localgroup administrators看管理员组成员,net user 某用户名能查看指定用户的属性和最后登录时间。

联网环境下还要收集网络信息,因为权限提升往往不只在这一台机器上完成。ipconfig /all看IP和DNS,arp -a看内网还有哪些主机存活,netstat -ano看当前建立了哪些连接、有哪些服务在监听。这些信息能帮你判断当前机器在内网里的位置,以及是否存在从普通用户横向移动到其他服务器的可能性。

3.3 服务、计划任务与进程:找可乘之机

服务是配置型提权的重灾区,所以信息收集阶段就要把所有服务过一遍。wmic service list full能导出所有服务的名称、状态、启动路径、启动账户,输出很大,建议先存到文件里再慢慢翻。sc query state= all则给出更简洁的服务列表,配合sc qc 服务名可以精确查看某个服务的配置,包括二进制路径和依赖关系。

计划任务同样重要,schtasks /query /fo LIST /v能查看所有计划任务,重点看哪些任务以高权限运行、哪些任务的可执行脚本落在低权限用户可写的目录里。进程方面,tasklist /svc把进程和所属服务对应起来,tasklist /v可以看到进程的运行账户,有时候能发现某个进程正在以SYSTEM权限运行,而它的文件却可以被你修改。

3.4 权限与ACL:查一个目录能写不能写

查到目录和服务后,怎么判断自己到底能不能动手?Windows下最常用的就是icacls,它能查看或修改文件和目录的ACL。比如icacls C:\看C盘根目录权限,输出里会列出每个用户组对该目录的权限,其中(F)表示完全控制,(M)表示修改,(W)表示写入,(R)表示读取。如果某个服务的工作目录对你所在的组写入了写入或完全控制权限,那替换文件这条路就存在。

Sysinternals工具集中有一款叫accesschk的小工具,专门用来自查“谁对谁有什么权限”,比icacls更直观。典型用法是accesschk.exe /accepteula -uwcqv "Authenticated Users" C:\Windows\System32\*,可以检查普通认证用户对系统目录下所有文件和服务的权限。不过accesschk需要单独下载,而且杀毒软件有时会误报,我已经不止一次碰到测试机上它被直接隔离的情况,所以一般先让icacls上,查不到想要的结果再上accesschk。

4. 实操演练:命令怎么用、结果怎么看

4.1 whoami /priv 结果解读:哪两个特权值得盯

假设你现在已经在目标机器上拿到一个低权限账户的Shell,第一步永远是whoami /priv。输出看起来像一张表格,每一行格式是“特权名 描述 状态”。状态只有两种:Disabled或Enabled,但是要注意,状态为Disabled的特权照样有可能被提权利用,因为某些工具会自动帮你启用它,所以不要只见Enabled就行。

真正值得盯的特权有两类。第一类是高价值的模拟类特权,包括SeImpersonatePrivilege、SeAssignPrimaryTokenPrivilege,看到这俩基本可以走Potato路线;第二类是“文件级”特权,包括SeBackupPrivilege、SeRestorePrivilege、SeTakeOwnershipPrivilege,这仨能让你绕过ACL读取或写入任意文件,等于说全盘文件都不设防。我见过一个测试案例,账户只有SeBackupPrivilege,利用公开的工具读取了SAM数据库文件并离线破解出了本地管理员密码,整个过程没用任何漏洞。

4.2 服务排查三连:q服务、写路径、查权限

服务提权最标准的三步走:第一步找出高权限服务,第二步确认其路径可不可控,第三步替换或劫持文件。先wmic service list full > services.txt把所有服务信息导出到文件,然后人工或脚本筛选出路径指向非系统目录的服务,尤其关注那些位于用户目录、共享目录、Temp目录下的服务。

筛出来以后,用sc qc 服务名查看服务的二进制路径和启动账户。这里有个细节:sc qc里的BINARY_PATH_NAME才是实际启动命令,而服务名和显示名是两回事,很多新手用显示名去查,结果sc qc根本查不到。常见错误还包括把服务路径拼错、不看路径有没有加引号、不去检查服务的启动账户。一个以SYSTEM运行、路径又落在C:\Program Files\某应用\下的服务,如果这个目录对Users组可写,那提权条件就成立了。

4.3 未引用服务路径:空格惹的大祸

未引用服务路径(Unquoted Service Path)是Windows服务配置里一个经典问题,原理不复杂:启动命令如果没加引号,而路径里又有空格,Windows解析时就会把前一段空格前的字符串当成程序路径来尝试。比如服务路径是C:\Program Files\MyApp\service.exe,系统会先尝试C:\Program.exe,再尝试C:\Program Files\MyApp\service.exe。如果某个低权限用户能写入C:\根目录,就能放一个名为Program.exe的程序,等服务重启时以系统权限执行它。

找这种问题的方法:先用wmic service list full导出路径,手工找那些路径带空格且没加引号的服务,再用icacls依次检查路径最靠前的那个目录是否可写。这里最容易踩的坑是只检查最终目标目录,忽略了中间目录。比如路径是C:\Program Files\MyApp\service.exe,如果C:\根目录可写,就不需要目录C:\Program Files可写,直接把Program.exe扔根目录即可。这类问题在授权测试环境里复现率极高,而且利用方式很稳定,不像漏洞利用那样容易被补丁堵死。

4.4 计划任务与注册表检查:两个低垂的果子

计划任务提权的排查思路和服务类似:找高权限运行的任务,看脚本或程序路径可不可控。schtasks /query /fo LIST /v输出很啰嗦,建议先重定向到文本文件,重点搜Run As User字段为SYSTEM或以管理员身份运行的任务,再逐个看Task To Run里的路径和参数。权限判断依然用icacls,如果脚本路径可写,任务触发时就能劫持。

注册表方面,最经典的是AlwaysInstallElevated配置。这个配置在两组策略项中同时为1时约定:所有安装包都会以系统权限安装,不管当前用户是什么级别。检查命令是:

reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

如果两条都返回0x1,那就存在配置型提权路径:构造一个恶意的MSI安装包,然后运行它,由于系统策略规定以高权限安装,恶意负载会以管理员或SYSTEM身份执行。这个点在真实加固良好的系统上很少出现,但一旦出现就是稳稳的提权路径,实测成功率接近百分之百。好多安全团队做基线检查时会把这项列入高危项,原因就在这里。

4.5 令牌模拟操作:借高权限进程的身份

如果你的whoami /priv输出里带有SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege,而且又跑在某个服务账户下,令牌模拟这条路就很有希望。这种场景常见于拿到WebShell后,应用池账户一般会带上模拟特权。原理上,你可以让系统列出当前所有可用的高权限令牌,然后创建一个以该令牌身份运行的进程。

实际操作中PowerUp这类脚本会帮你完成大部分动作,但我还是建议先理解它背后干了什么:找到高权限进程、复制其令牌句柄、用Windows API创建新进程并指定该令牌。执行前务必手动确认运行账户和目标进程的权限情况,避免在未经授权环境里操作。我在测试环境里演练时习惯先用tasklist /v看哪个进程以SYSTEM权限运行,判断目标进程存活状态,再调用公开脚本尝试模拟,一步步确认结果,避免出现权限操作失败后留下大量痕迹。

5. 常见问题与排查技巧实录

5.1 命令执行失败:权限、杀软与编码三板斧

信息收集阶段最容易翻车的是命令被拦截或执行不了。权限不足是最常见的原因,比如普通用户执行wmic service list full在某些系统上会被拒绝,这时可以改用sc query state= all或者PowerShell的Get-Service、Get-WmiObject来绕。杀毒软件是第二道坎,accesschk和各类提权工具的下载、解压、执行都可能被杀软处理,建议在本地环境先校验哈希、确认工具来源,再上传到授权测试机器。

第三道坎是编码和输出解析。Windows命令行的代码页和终端编码经常不一致,中文系统里icacls输出看起来像乱码,这时在PowerShell里先执行chcp 65001换成UTF-8代码页,或者改成用cmd /c执行再type查看重定向文件。我刚开始做测试时在一个繁体中文服务器上折腾了半天,最后发现只是代码页问题,命令和思路完全没毛病,这类环境问题反而最浪费精力。

5.2 提权失败的一般原因:补丁全、权限严、过程粗

辛苦跑了一圈发现提权失败,先别急着怀疑工具,大部分时候是下面几个原因。目标系统补丁打得很全,历史漏洞全部封死;服务目录和计划任务目录的权限管控严格,普通用户没有任何写入机会;AlwaysInstallElevated策略没有打开;令牌里也没有任何可利用特权。这些情况真遇到就换思路,凭据型提权和横向扩散往往比在同一台机器上死磕配置更有效果。

排查过程粗心也是一大因素。很多新手喜欢照着文章命令一通复制,但没看清服务路径是不是带引号、没检查所有中间目录的权限、没确认服务的启动账户,结果条件根本不成立就急着去生成利用程序。我在每一个测试环节都会要求自己把“服务和路径情况”用sc qc和icacls双重确认一遍,输出存档,再进入下一步。

5.3 防御视角:怎么让提权变难

作为运维或安全团队,知道提权命令的目的是为了更好防守。最核心的原则是最小权限:服务账户不要随便给SeImpersonatePrivilege这类特权,普通用户坚决不加入本地管理员组,共享目录和服务器本地目录的写入权限按需分配,能不给写就不给写。另一个重要措施是统一管控本地管理员密码,避免每台机器同一个口令,这样横纵向移动都很难开展。

系统加固层面要继续保持补丁更新,特别是历史内核漏洞的补丁;开启Credential Guard和LSASS保护,降低凭据被离线提取的风险;通过AppLocker或类似白名单机制限制脚本和可执行文件运行,旁观用户随意放一个Program.exe到目录里也执行不了;配置日志审计,重点监控服务创建与修改、计划任务变更、特权调用等事件。做完这些之后,像未引用服务路径、DLL劫持、AlwaysInstallElevated这类配置型提权会被清掉一大片。

我在实际授权测试里做下来,发现配置型提权虽然在防御完善的环境里会越来越少,但中小型环境里仍然大量存在。关键在于很多管理员并不知道“用户能写这个服务目录”意味着什么,也不清楚注册表策略里那两个键值的作用。这里也给搞安全的朋友一句实在话:与其总想着怎么利用,不如先把系统和应用配置查一遍,当你站在攻击者视角能把一条路径打通,说明你的加固清单里对应那一项就有必要补上。

最后分享一个我在调测过程中觉得很有用的习惯:每次做提权排查都按固定顺序执行命令——先看身份和特权,再导服务和计划任务,最后查权限和注册表策略,把输出存成文本备份。这个顺序不是谁规定的,而是能避免你反复登录、反复切换命令窗口。等哪天你发现这套流程跑得很顺了,说明Windows权限提升的基础知识已经真正变成你自己的东西了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 3:43:51

DBeaver连接MySQL建库建表实操指南

很多学MySQL的同学,第一关不是SQL语法,而是不知道用什么工具干活。命令行当然能建库建表,但那条路对新手太劝退。我用DBeaver连接本地MySQL、创建数据库表这套流程,已经重复过上百次,也带过不少零基础的人上手&#xf…

作者头像 李华
网站建设 2026/10/10 3:42:40

2003-2023地级市工业三废面板数据整理与清洗指南

做了几年环境数据分析,手里的城市面板数据少说也整理过几十套。要说哪类数据最让人又爱又恨,工业三废绝对排得上号——想研究污染排放和经济增长的关系,它是核心变量;想评估环境规制的影响,它是因变量;可真…

作者头像 李华
网站建设 2026/10/10 3:42:40

微电网调度中的风光场景生成与削减:蒙特卡洛+概率距离法实战

做微电网调度优化的时候,我大部分时间其实不是在写约束,而是在想办法对付不确定性。前段时间接了一个模拟项目,给定一片风电和一片光伏作为可调度的分布式电源,目标是最小化运行成本。第一步很常规:用蒙特卡洛法把未来24小时的风光出力抽成5000个随机场景。第二步就出问题了——…

作者头像 李华
网站建设 2026/10/10 3:41:45

Spring Boot在线考试系统:并发写入与事务边界实战

简介:这份资源是面向高校计算机相关专业学生与Java开发初学者的毕业设计参考文档,围绕基于Spring Boot框架的在线考试系统展开,帮助读者理解如何用主流技术栈完成一个具备实际业务价值的Web项目。文档完整覆盖需求分析、系统架构、数据库设计…

作者头像 李华
网站建设 2026/10/10 3:40:41

代码签名技术全解析:原理、证书选型与CI/CD实践

1. 代码签名到底在签什么:从一次线上事故说起前阵子帮一个做桌面工具的朋友排查问题,用户反馈安装包双击之后系统直接弹窗拦截,提示"未知发布者",甚至有的机器连运行权限都不给。代码本身没毛病,功能测试全过…

作者头像 李华