ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Windows权限提升实战指南:从服务配置到内核漏洞利用

Windows权限提升实战指南:从服务配置到内核漏洞利用 授权内网渗透里最磨人的阶段往往不是拿Webshell那一哆嗦而是手里攥着一个低权限shell之后的每一步——目标明明就是本地管理员或者SYSTEM可眼前横着UAC、ACL、一堆服务配置和杀软。前段时间做Windows域环境评估我在权限提升上花的时间比前面打点还多。这篇把我在真实项目里反复验证过的Windows平台的权限提升思路完整盘一遍信息收集怎么做得又准又安静服务配置错误为什么永远是第一优先令牌和UAC有哪些不需要内核漏洞也能走通的路以及补丁对比打内核漏洞时最容易翻车的几个细节。内容偏向实战适合正在做红队评估、内网渗透测试或者纯粹想加固自己Windows主机的朋友。1. 提权前计时开始先把系统底裤盘干净1.1 whoami /all 是起点不是例行公事很多入门教程让你第一步跑systeminfo但我习惯先跑whoami /all一次把当前用户SID、所属组、以及最重要的权限特权全部拉出来。别只敲一个whoami就完事/all参数里藏着后面所有路线的分水岭。whoami /all输出里重点看Privilege部分以下几项直接决定你可以走哪条路特权含义能干什么SeImpersonatePrivilege模拟其他令牌直接上土豆家族可提权到SYSTEMSeAssignPrimaryTokenPrivilege分配主令牌辅助模拟令牌经常和上面同时出现SeDebugPrivilege调试系统进程读取LSASS内存掏凭据SeBackupPrivilege备份文件/目录绕过文件ACL直接读SAM、SYSTEM注册表SeRestorePrivilege恢复权限可以替换系统文件、修改服务DLL如果用户属于Administrators组但当前令牌是过滤后的优先考虑UAC绕过而不是直接跑内核漏洞如果属于IIS AppPool\xxx或者NETWORK SERVICE这类虚拟账户重点看有没有SeImpersonatePrivilege有就直接土豆安排。# 快速判断当前用户身份和组 whoami /groups net user %username%1.2 systeminfo 只留两列OS版本和补丁systeminfo输出太长了直接存文件后面不管是人工看还是丢给工具都比在终端里翻半天强。脚本一闪而过看不到输出这个问题我也遇到过解决办法是重定向到文件再读cmd /c systeminfo sysinfo.txt 21 type sysinfo.txt# 或者用PowerShell直接提取关键字段 systeminfo | Select-String OS Name|OS Version|System Type|HotfixOS Name和OS Version决定你该去找哪个漏洞的EXPSystem Type决定编译x64还是x86Hotfix列表告诉你哪些补丁已经打了。我一般把elevated token那几行也标记出来后面打补丁对比的时候不会只看版本号就盲目选EXP。1.3 网络、进程、计划任务一次收集到位信息收集阶段切忌东一榔头西一棒子我习惯在拿到shell后按固定顺序把下面这些一次性落盘# 网络与域环境 ipconfig /all route print arp -a net view /domain net localgroup administrators # 进程与服务 tasklist /svc wmic service list full service_list.txt # 计划任务 schtasks /query /fo LIST /v tasks.txt进程列表里看到Sysmon、EDR、Antivirus字样的进程后面所有操作都要收敛尽量用系统原生组件避免弹窗和可疑进程创建。服务列表和计划任务文件先落盘下一步找配置错误时直接对着翻。2. 服务配置错误提权圈子里最温顺的大礼包为什么说它是最温顺的服务配置错误提权通常不需要重启机器、不需要编译复杂EXP、基本不触发内核蓝屏成功率还高。它利用的全是Windows设计里宽松的地方不是漏洞本身所以杀软覆盖也差。优先看它没毛病。2.1 未引用服务路径一条空格引发的权限放大未引用服务路径Unquoted Service Path的原理不复杂服务指向的可执行文件路径包含空格却没有用引号包起来Windows在启动服务时按空格拆分路径依次尝试前几个片段作为可执行文件。举例子服务路径是C:\Program Files\My App\svc.exe系统会依次尝试C:\Program.exe C:\Program Files\My.exe C:\Program Files\My App\svc.exe如果C:\Program Files\My App\这个目录允许当前用户写文件把一个恶意exe命名为My.exe放进去然后触发服务启动恶意exe就以服务账户身份通常是SYSTEM执行了。查找未引用的服务路径用PowerShell这一条就够Get-CimInstance Win32_Service | Select-Object Name,State,StartMode,PathName | Where-Object { $_.PathName -notmatch \ -and $_.PathName -match }找到候选目标后用icacls检查拆分后的目录可写性icacls C:\Program Files\My App看到BUILTIN\Users:(F)或者Everyone:(F)就是天赐良机。检查一下当前服务是自动启动还是手动启动自动启动的话重启目标机器就行手动启动就得看看能不能远程重启服务sc qc 服务名 sc stop 服务名 sc start 服务名2.2 服务binPath修改与DLL劫持看注册表ACL说话服务路径没空格不代表没戏如果服务对应的注册表键ACL可写可以直接修改binPath指向你的exe然后重启服务。定位服务注册表HKLM\SYSTEM\CurrentControlSet\Services\服务名用accesschk微软官方工具看当前用户对这个键有没有写权限accesschk.exe /accepteula -uwc Users HKLM\SYSTEM\CurrentControlSet\Services\服务名能写就直接改sc config 服务名 binPath cmd.exe /c net localgroup administrators 当前用户 /add sc stop 服务名 sc start 服务名服务DLL劫持是另一种思路某些服务启动时加载的DLL如果放在可写目录且程序默认从当前目录搜索DLL就可以放一个同名恶意DLL过去。定位这种点最实用的工具是ProcMon先观察服务启动时NAME NOT FOUND的记录再配合icacls判断目录是否可写。这个手法静默度高但需要服务或子系统触发时间成本稍大。3. 计划任务、启动项、注册表Run低调试成本的系统入口3.1 高权限计划任务的识别与利用Windows计划任务提权的核心逻辑就一条找以SYSTEM或Administrator身份运行、但可执行文件路径可以被你控制的任务。先把所有任务完整导出来schtasks /query /fo LIST /v tasks.txt重点搜两个关键词Run As User显示为SYSTEM/Administrator的以及Task To Run路径指向C:\Users\Public、C:\Temp、C:\ProgramData这类非系统目录的。路径可写意味着你可以替换任务调用的exe或者脚本等待系统按计划触发。找到候选任务后确认当前用户对路径的写权限icacls C:\ProgramData\xxx\run.bat如果可写直接把恶意命令写入脚本如果任务是.bat或.ps1替换成本极低。需要注意任务触发时间如果任务是每天凌晨跑一次等在目标机器上等到触发不现实可以试试schtasks /run /tn 任务名手动触发部分任务允许当前用户手动调用。3.2 注册表启动项与文件关联劫持启动项在提权上不如计划任务常见但在某些限定场景里很好用。检查以下位置HKLM\Software\Microsoft\Windows\CurrentVersion\Run HKCU\Software\Microsoft\Windows\CurrentVersion\Run HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\RunHKLM的Run键通常需要管理员写权限低权限用户能改的是HKCU但HKCU只会以当前用户身份登录时执行对提权帮助有限。真正有价值的是文件关联劫持修改HKCU\Software\Classes\mscfile\shell\open\command这类键值当管理员双击某个后缀文件时就会以管理员上下文执行你的命令。这个思路和UAC绕过里用的eventvwr手法同源放到后面一起讲。另外注册表HKCU\Environment\UserInitMprLogonScript也可以指定登录脚本如果目标机器的登录流程不干净有机会在管理员登录时执行命令不过触发依赖用户重新登录属于被动等待型能不做首选就不做首选。4. 令牌与UAC没内核漏洞也能走的两条小路4.1 SeImpersonate 令牌与土豆家族的适用边界自带SeImpersonatePrivilege权限的账户基本就是冲着土豆家族来的。土豆家族的原理都差不多利用Windows服务账户可以模拟客户端连接的机制诱导SYSTEM进程连接到你创建的命名管道然后通过模拟令牌执行命令。区别在于诱导方式和稳定性。工具需要特权适用场景备注JuicyPotatoSeImpersonate / SeAssignPrimaryTokenWindows 7/8/Server 2008-2016老经典新系统不灵PrintSpooferSeImpersonate / SeAssignPrimaryTokenWin10/Server 2016稳定用的打印队列提醒机制GodPotatoSeImpersonate / SeAssignPrimaryTokenWin10/Server 2019多个利用链合一兼容性好实战里最省心的是PrintSpoofer一条命令直接弹SYSTEM shellPrintSpoofer.exe -i -c cmd.exe需要说明的是土豆家族只对具备SeImpersonatePrivilege的服务账户如IIS、SQL Server服务账户有效普通Users组成员没有这个特权硬跑只会报错。拿到webshell后先看whoami /all有没有特权再决定要不要上土豆顺序别搞反。4.2 UAC绕过在真实渗透中的价值评估如果你拿到的是管理员组的已登录会话但令牌是经过UAC过滤的这时候内核提权往往不是最优解。Windows为了让标准用户也能用管理员发的功能官方特意留了一批带autoElevate的白名单程序可以由普通完整性级别自动提升到高完整性级别。我用得最多的是fodhelper和eventvwr# fodhelper修改HKCU\Software\Classes\ms-settings\shell\open\command reg add HKCU\Software\Classes\ms-settings\shell\open\command /v DelegateExecute /t REG_SZ /d /f reg add HKCU\Software\Classes\ms-settings\shell\open\command /d cmd.exe /f fodhelper.exe# eventvwr修改HKCU\Software\Classes\mscfile\shell\open\command reg add HKCU\Software\Classes\mscfile\shell\open\command /d cmd.exe /f eventvwr.exe原理是这些程序启动时会在当前用户注册表先找自定义命令找到了就以高完整性级别执行。整个过程只写HKCU注册表权限要求极低不碰内核杀软监控点少。需要注意UAC绕过只能把管理员组用户从普通令牌升级到完整令牌如果你连Administrators组成员都不是这条路线不适用。5. 凭据就是提权的一半离线读SAM、在线掏LSASS5.1 SAM与SYSTEM配置单元的离线读取Windows的密码哈希存储在C:\Windows\System32\config\SAM但文件被系统锁定不能直接复制。标准姿势是用reg save导出注册表配置单元reg save hklm\sam sam.hiv reg save hklm\system system.hiv reg save hklm\security security.hiv导出的文件拉到本地用secretsdump一行搞定secretsdump.py -sam sam.hiv -system system.hiv -security security.hiv LOCAL所有本地账户的LM/NTLM哈希直接出来。拿到哈希后下一步就是哈希传递PTT/PTK或者交给hashcat爆破弱口令。这套打法的前提是当前用户对注册表有读权限——系统管理员默认可以读SYSTEM更不用说。如果你只有SeBackupPrivilege也可以通过regedit的备份方式导出这是备份特权最常见的利用。5.2 从LSASS内存里捞出明文密码与票据只要当前会话有管理员权限在机器上转储LSASS进程内存通常能直接拿到当前所有登录用户的明文密码、NTLM哈希和Kerberos票据。最稳的办法是procdumpprocdump.exe -ma lsass.exe lsass.dmp然后本地用mimikatz解析mimikatz.exe sekurlsa::minidump lsass.dmp sekurlsa::logonpasswords exit更直接的方式是mimikatz在目标机器上在线读内存但我建议能转储就转储在线读取容易被EDR盯上离线转储把文件拖回来解析减少目标机器上的操作时长。除了LSASS还有几处容易漏掉的凭据点cmdkey /list—— Windows凭据管理器中保存的域凭据C:\Users\*\AppData\Roaming\Microsoft\Credentials\—— 凭据文件浏览器保存的密码Chrome/Edge的Login DataPowerShell配置文件、web.config里面的连接字符串C:\Windows\Panther\Unattend.xml—— 无人值守安装时可能留下明文管理员密码我在评估里不止一次靠Unattend.xml直接拿到完整管理员密码比前面所有提权手段都省事。这些散落的明文和哈希往往是进入域管账户的跳板别只盯着SAM不放。6. 内核漏洞利用硬核但最容易翻车的手段6.1 用 systeminfo 数据自动匹配补丁说到内核漏洞最高频的错误就是系统是Win10 22H2就去找Win10 22H2新出的EXP版本对了也不行——很多EXP对补丁版本极其敏感比如CVE-2020-0796SMBGhost只在未打补丁的1909/1903上稳定。所以第一步永远是把systeminfo输出丢给补丁对比工具# wesng 使用 python wesng.py --update python wesng.py sysinfo.txt# MSF中也可以直接调模块 use post/multi/recon/local_exploit_suggester set session 1 runwesng会把系统补丁和公开EXP比对输出一份候选列表。拿到候选之后交叉核对三件事目标架构是x64还是x86、EXP编译版本是否匹配、是否需要预先关闭缓解措施。很多EXP的README里写明了系统版本范围匹配条件多一重确认拼的是耐心。6.2 编译、加载与执行的静默化处理目标机器通常没有编译器所以EXP要在本地编译好再传过去。Windows平台编译我一般用Visual Studio的开发者命令行编译前一定要选Release、x64按目标架构否则运行时报错会让你怀疑人生。没有VS环境的可以试试跨平台编译# MinGW 交叉编译示例目标 x64 Windows x86_64-w64-mingw32-gcc exploit.c -o exploit.exe -lws2_32 -static内核EXP执行时最常见的三个问题被杀软拦——先把payload做混淆或者用白名单进程加载触发后目标蓝屏——多发生在系统版本不匹配时跑EXP前务必留个后路比如计划任务里预埋一个反弹shell就算EXP失败也有重试机会执行后没有返回SYSTEM shell——检查当前进程架构用32位EXP去提权64位进程经常失败经典目标如MS17-010永恒之蓝对老的Server 2008/2012系统依旧好用新系统更多靠本地漏洞组合拳。内核漏洞利用应该是整套提权流程里的最后手段而不是第一选择——它动静最大、对系统稳定性影响最大、日志痕迹最明显。我亲眼见过同事在内网横向中用内核EXP把目标服务器打成蓝屏整个业务集群跟着重启后续所有测试计划全被打乱。配置错误、令牌滥用、凭据窃取都试过一轮没有收获再考虑内核这条路并且提前评估蓝屏对业务的影响。7. 给防守方的日志视角怎样通过事件ID反推上面这些动作7.1 提权手法在安全日志里的映射聊完攻击思路必然要落到检测和防御上。我在评估结束后会给客户输出一份检测日志清单把攻击动作和事件ID对应起来防守方照着查就能快速定位异常。攻击阶段典型动作关键事件ID信息收集大量进程枚举、服务枚举4688进程创建配合命令行审计服务配置利用sc stop/start、修改服务binPath7045新服务 / 7040服务状态改变计划任务利用创建/修改/运行计划任务4698、4699、4701、4702注册表修改修改HKCU Run键、类关联4657注册表值变更凭据访问转储LSASS、reg saveSysmon 10进程访问 / 4656登录事件提权后可能开启新会话4624、4672特殊登录重点说的4688建议通过组策略开启命令行进程创建审计这样每次进程创建都会把完整命令行写进日志。攻击者运行whoami /all、whoami /priv、net localgroup administrators的时候行为特征会非常明显SIEM直接写规则命中即可。Sysmon是更细的检测层重点监控lsass.exe被非系统进程访问的Event ID 10以及命名管道创建对应的Event ID 18土豆家族在创建命名管道这一下很难躲过。7.2 最小权限、LAPS与Credential Guard的联动加固提权之所以屡屡得手根因往往不是某个漏洞多严重而是系统里到处是可写目录、明文凭据、管理员口令长期不变。防御上三个动作最有效本地管理员口令定期轮换用LAPS把每台机器的管理员密码独立化。一台被拿不会变成全网通用的钥匙。启用Credential Guard把LSASS里的凭据隔离到虚拟化安全进程mimikatz那套的收益会大幅下降。做应用控制AppLocker/WDAC限制非白名单exe执行上面提到的土豆家族、procdump、wesng编译出来的exp都会被拦在门外。这三件事都做全的主机我在评估里提权要费的时间往往是普通主机的两到三倍很多攻击链会在中间断掉。攻防本来就是这个游戏——防守方把默认选项改掉攻击方的捷径就少一大截。最后说个经验之谈提权这件事能不能快速拿到SYSTEM大部分靠的不是会用多少EXP而是肯不肯花十分钟静下心把系统信息收集干净。我自己吃过太多次亏上来就想着打补丁利用结果发现目标主机随便一个服务目录就可写配置错误五分钟搞定收工。先把机器上所有权限配置错误、弱凭据、临时文件排查完再考虑要不要碰内核这条顺序在Windows主机上一直不会过时。上面这些手法希望攻防两边的朋友都心里有数——一边知道路怎么走一边知道墙在哪里。
返回列表