winRM横向移动原理、检测与加固:内网渗透与防御实战指南

发布时间:2026/10/13 23:10:52
winRM横向移动原理、检测与加固:内网渗透与防御实战指南
1. winRM横向移动是什么为什么攻击者总盯上它做内网渗透和应急响应的人对“横向移动”这个词一定不陌生。横向移动的本质就是攻击者拿到一台主机的控制权之后利用这台主机作为跳板继续访问内网中的其他机器一步步扩大战果。而winRM横向移动指的是攻击者借助Windows远程管理服务Windows Remote Management简称winRM来执行远程命令、获取交互式会话从而实现跨主机控制的一种技术手段。winRM是微软官方提供的远程管理协议基于WS-ManagementWeb Services for Management标准实现默认监听5985端口HTTP和5986端口HTTPS。它的设计初衷是让管理员能够通过PowerShell Remoting、winrs命令行等工具对远程服务器进行标准化管理。说白了它就是Windows世界里“官方认证”的远程运维通道。也正因为它是合法的系统组件安全设备对它的流量往往习惯性放行攻击者正是看中了这个信任差频繁利用winRM来实现内网横移。这篇文章适合谁看如果你是蓝队成员、安全运维人员、渗透测试新手或者负责公司内网的加固与审计这篇文章可以帮你把winRM横向移动从原理到操作、从检测到防御完整串起来。文章不会教你去做危害他人的攻击而是站在安全建设与对抗模拟的角度把这条技术链路拆开揉碎讲清楚攻击者是怎么用的、红队怎么模拟、蓝队怎么发现、运维怎么封堵。我接触winRM横向移动最早是在一次内网攻防演练中。当时红队拿到一台跳板机的管理员权限本以为还要费劲去上传工具、开代理结果对方直接用winRM批量连了十几台服务器整个过程干净利落流量看着还全是“合规的远程管理”。那次之后我就意识到winRM横向移动已经是内网对抗中绕不开的核心课题必须深入研究。2. 深入理解winRM横向移动的底层原理与前置条件2.1 winRM的工作机制简述winRM不是凭空跑起来的服务它背后是一整套WS-Management协议栈。协议层走的是SOAP封装传输层基于HTTP或HTTPS。Windows系统上winRM服务服务名WinRM默认情况下是“手动启动”状态很多服务器其实并没有启用它。但一旦管理员开启过PowerShell远程管理功能或者组策略里配置过“Windows远程管理”这台机器就具备了被winRM连接的条件。要建立一次winRM连接核心要素有几个目标主机上winRM服务正在运行目标主机防火墙放行了5985或5986端口发起方拥有目标主机上的有效凭据并且该用户属于目标主机的本地管理员组或者域环境下具备远程管理权限发起方与目标主机之间网络可达。这些条件满足之后发起方就可以通过PowerShell的Invoke-Command、Enter-PSSession或者命令行工具winrs向目标主机下发命令。需要注意的一点是winRM连过去之后执行命令的权限取决于你提交凭据所属用户的权限。如果提交的是域管理员凭据那目标主机上基本就是“想干嘛干嘛”。2.2 为什么winRM会成为横向移动的“黄金通道”横向移动的常见手段可不止winRM一种PsExec、WMI、SMB计划任务、DCOM调用都有人用。但winRM之所以现在这么流行核心原因有三点。第一是流量特征“太正经”。winRM的通信内容是标准的WS-Management SOAP消息和正常的PowerShell远程管理流量完全一样。攻击者不需要上传任何第三方工具系统自带的PowerShell就能完成所有操作。在很多防护设备眼里这是“白名单软件”产生的流量告警优先级很低。第二是操作方便且支持交互式会话。PsExec往往需要先上传工具到目标主机WMI虽然可以远程执行命令但交互能力弱而winRM的Enter-PSSession可以直接进入一个交互式PowerShell会话操作体验和本地终端几乎没差别。攻击者在这个会话里可以像操作自己的电脑一样继续执行后续命令。第三是配合域环境批量操作非常高效。拿到一个域管理员权限后可以对着整个网段批量执行Invoke-Command同时向几十台服务器下发指令、搜集信息、安装后门效率极高。传统的手动单点操作完全无法比拟。值得注意的是winRM横向移动还有一个隐藏优势很多EDR和HIDS默认不监控PowerShell远程会话产生的进程行为。攻击者在winRM会话中执行的命令虽然最终会在目标主机上产生进程但这些进程的父进程往往是svchost或wsmprovhost而非常见的cmd.exe或powershell.exe单独启动这会让一些基于父进程链检测的规则失效。2.3 winRM横向移动与PowerShell体系的关系winRM横向移动能够流行与PowerShell Remoting体系深度绑定密不可分。PowerShell Remoting本身就是基于winRM实现的功能二者是“上层功能”和“底层通道”的关系。也就是说winRM提供了远程通信管道而PowerShell Remoting是管道上最常见的应用。攻击者常用的Invoke-Command会在目标主机上创建WsmSess进程同时起一个PowerShell宿主任务承载执行代码Enter-PSSession则会进入一个交互式的PowerShell会话。这两个命令的使用门槛极低几乎不需要额外准备工具。而且PowerShell的代码生态非常庞大攻击者可以把复杂的后渗透操作写成脚本通过winRM一次性下发执行极大简化了攻击链条。3. 红队视角下的winRM横向移动操作全解析3.1 前置侦察找到可横向的目标主机先声明接下来的内容全部基于授权的攻防演练和实验环境。在真实工作中模拟winRM横向移动前首先要确认目标范围内哪些主机开启了winRM服务。常规侦察思路是从已知权限的机器出发扫描内网网段中开放5985/5986端口的主机。工具比较简单可以用PowerShell原生的Test-NetConnection批量探测也可以用nmap做端口扫描。端口探测只是第一步更关键的是确定哪些主机允许“当前凭据”访问。实际操作中有一个容易被忽略的点很多环境的服务器虽然开了5985端口但winRM服务可能只允许特定主机或特定用户组访问。比如域环境下默认的“WinRMRemoteWMIUsers__”组只赋予了远程管理权限的组合本地管理员组默认有访问权限但如果做过分权最小化情况就会变化。所以侦察阶段不能只看端口还要尝试真正建立连接。可以用下面这条命令测试当前凭据能否在目标主机上执行命令Invoke-Command -ComputerName 10.0.1.15 -ScriptBlock { whoami } -Credential $cred如果这个命令成功返回了目标主机上的用户名那就说明这条横移路径是通的。这一步测试在授权评估中非常重要能帮你筛出真正的“可达主机”列表而不是浪费大量时间在端口开放但权限不通的机器上。3.2 凭据从哪里来怎么准备winRM横向移动离不开有效凭据。攻击者在实战中获取凭据的方式五花八门最常见的是抓取内存中的明文密码或哈希比如通过Mimikatz在已控主机上操作其次是读取本地配置文件中的硬编码密码再就是利用域环境中的Kerberoasting等方式离线破解服务账户密码。在攻防演练模拟中拿到凭据后通常需要先把它转成PowerShell的凭据对象才能传递给Invoke-Command使用。实现方式很简单$password ConvertTo-SecureString Pssw0rd2024 -AsPlainText -Force $cred New-Object System.Management.Automation.PSCredential(DOMAIN\adminuser, $password)这里有一个关键细节如果目标是域环境凭据里的域名部分不要省略。有些机器是域内主机用“.\adminuser”这种本地账户格式连接会失败而如果目标主机同时是域控还涉及到身份验证协议的选择。winRM默认使用Kerberos进行域内认证要求发起方和目标主机能够找到域控完成票据交换。跨域环境下可能需要指定-Authentication Negotiate参数这也是排查连接失败时的一个重要方向。3.3 核心操作远程执行命令与会话建立当凭据和目标都确认无误后winRM横向移动的核心操作就集中到两条命令上Invoke-Command和Enter-PSSession。Invoke-Command适用于“一次性下发命令”的场景。比如要在多台机器上同时收集补丁信息、查看启动脚本、获取注册表键值等都可以用这种方式。它的返回结果会自动序列化回发起端操作起来非常灵活。示例命令如下Invoke-Command -ComputerName 10.0.1.15, 10.0.1.22 -Credential $cred -ScriptBlock { Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 5 }这条命令会在两台目标主机上分别执行补丁查询并把结果返回到你的控制台。如果只需要单台机器就只写一个ComputerName即可。Enter-PSSession则完全是另一种体验。它进入交互式模式你的命令行提示符会变成[10.0.1.15]: PS后续输入的每一条命令都直接在目标主机上执行。这种模式特别适合后续的逐步操作比如手动翻查目录、检查网络连接、启用RDP、计划任务持久化等。Enter-PSSession -ComputerName 10.0.1.15 -Credential $cred进入会话后你执行whoami看到的就是目标主机上的用户身份。此时你已经拥有了目标主机的远程管理会话后续操作完全取决于你的权限边界。如果当前凭据是域管理员在这个会话中可以直接对域控进行操作横移路径瞬间拉满。3.4 批量横移的脚本化实现技巧个人经验里winRM横向移动最恐怖的地方在于批量能力。手动一台台连接虽然可行但效率太低。在授权演练中一次操作几十台主机是常规操作所以脚本化几乎是必选项。批量操作的思路很简单把目标IP列表存成数组然后把需要执行的命令封装成ScriptBlock循环调用Invoke-Command。执行时要注意并发控制避免瞬间产生大量连接导致目标主机或网络设备告警。我一般会把每批并发控制在5到10台等一批执行完毕再拉下一批。给一个可以改改就能用的示例脚本$targets Get-Content -Path .\targets.txt $cred Get-Credential $scriptBlock { $env:COMPUTERNAME whoami Get-NetTCPConnection -State Listen | Where-Object LocalPort -eq 3389 } $results foreach ($target in $targets) { try { Invoke-Command -ComputerName $target -Credential $cred -ScriptBlock $scriptBlock -ErrorAction Stop } catch { [PSCustomObject]{ Host $target; Status Failed: $($_.Exception.Message) } } } $results | Out-GridView跑完之后能成功返回结果的主机就是有效的横移目标。失败的主机要记录原因是端口不通、认证失败、还是权限不足这些信息对接下来的行动方向很有参考价值。比如某个IP报“访问被拒绝”说明这台机器开了winRM但对当前凭据不友好可以考虑换哈希传递或者换一组凭据再试。3.5 从winRM会话向更大战果延伸winRM本身只是通道攻击者的最终目标往往是获取敏感数据、创建持久化后门、扩大域控权限。一旦通过winRM控制了一台新主机后续的操作才真正拉开帷幕。常见的第一步是抓取新主机上的本地凭据信息包括SAM数据库、内存中缓存的域管理员票据、浏览器保存的密码、配置文件中的数据库连接串等。这些可以通过PowerShell脚本或工具完成很多EDR会对工具行为敏感所以更稳妥的方式是利用目标主机自带的PowerShell能力做信息搜集。第二步是宿主机信息梳理判断这台主机在内网中的角色定位。比如检查是否安装了域控相关服务、是否承载核心数据库、是否与其他生产网段有特殊连通性。这些信息决定了下一步横移的方向和优先级。第三步是持久化。持久化手段的选择很考验经验很多新手会直接往启动文件夹扔脚本或者创建计划任务但这些方式过于显眼在真实对抗中容易被人发现。更隐蔽的做法是利用WMI事件订阅、修改服务配置、或者注册一个COM对象劫持。操作前提都是保持winRM通道的可用性最好再准备一条备用通道免得主通道被封后无路可退。4. 检测与排查winRM横向移动的实战思路4.1 主机侧日志应该盯哪里作为防守方要想发现winRM横向移动日志是最核心的数据源。Windows系统上的相关日志分布在多个日志文件中需要系统性地串起来看。首先关注Microsoft-Windows-PowerShell/Operational日志。winRM远程会话在发起连接、创建会话、执行命令时PowerShell都会在这个日志里留下事件记录。值得关注的事件ID包括4103模块日志记录记录了PowerShell命令的完整执行内容4104ScriptBlock日志记录可以看到远程下发的脚本块内容400启动一个PowerShell引擎时的记录其中包含HostName等信息远程会话往往显示HostName为“ServerRemoteHost”本地会话则显示“ConsoleHost”。如果日志中大量出现HostName为“ServerRemoteHost”的事件而对应主机的管理员并没有发起远程操作那基本可以判定有人在通过winRM连入主机执行命令。其次是Windows事件日志中的安全日志。Event ID 4624登录成功是最重要的。winRM远程连接成功后会产生类型3网络登录的登录记录登录进程名通常为“NtLmSsp”或“Kerberos”登录协议为“Negotiate”。需要关注的是4624中“源网络地址”一栏的IP如果出现非本网段的管理IP在非工作时间批量登录就要拉响警报。第三个要关注的是Windows Remote Management事件日志。这个日志记录了winRM服务自身的运行状态包括连接成功、认证失败、服务器会话创建等。事件ID 91表示正在处理来自客户端的请求事件ID 142表示服务会话已创建。大量来自同一IP的142事件说明有人正在对这台机器进行高频的winRM操作。4.2 网络侧流量特征怎么看主机日志如果没开全网络侧流量也是重要的检测维度。winRM默认端口是5985和5986流量特征非常明显。在不使用HTTPS的情况下数据包内容的SOAPXML结构可以用抓包工具直接看到特征包含“http://schemas.xmlsoap.org/ws/2004/09/transfer”等字符串。还有一个很有意思的特征是winRM通信的HTTP头中会包含“Content-Type: application/soapxml;charsetUTF-8”正常的Web应用流量很少会一直保持这种Content-Type。如果内网流量设备能对5985端口做深度包检测这个特征可以作为告警依据。批量横移还有一个网络侧特征同一源IP会在短时间内向多个目标IP发送大量目的端口为5985的TCP SYN包随后伴随大量内容相似的HTTP POST请求。这种一对多的通信模式一眼就能看出不是正常的管理行为。如果网络侧有流量日志系统直接用“目的端口5985”和“连接数阈值”做条件查询很快就能圈出异常主机。4.3 基于时间线和账号行为还原攻击链单纯看单条日志很难判断是否为横向移动需要把多个维度的事件串起来。我处理这类问题时的标准动作是先拉一个时间线把同一时间段内涉及的源IP、源账号、目标IP、目标端口、事件ID统一梳理。举个例子某天凌晨2点IP为192.168.1.10的机器通过域管理员账号向10台服务器发起winRM连接。每台目标服务器的安全日志中都能在同一条时间线上看到4624登录成功事件登录进程为NtLmSsp源IP是192.168.1.10。同时PowerShell Operational日志中产生了一波4104事件执行的脚本内容高度相似。这一串关联事件放在一起基本可以断定这是一次winRM批量横移行为。再往深挖一步去看源IP那台机器192.168.1.10自己的日志会发现这台机器可能在几分钟前也发生过可疑登录事件。比如攻击者先通过Web漏洞打穿了这台机器再通过它发起winRM横移。这条链条一旦完整还原整个攻击路径就清楚了处置和溯源也就有了方向。4.4 从攻防演练中总结的检测盲区实战中检测winRM横向移动有几个常见的盲区我在这里重点提醒一下。第一个盲区是日志被清空或覆盖。很多Windows服务器默认的日志大小只有几十MB高频操作下日志覆盖极快。如果防守方没有做好日志集中收集等发现异常时日志可能已经被覆盖。建议所有具备远程管理属性的服务器都开启日志转发把PowerShell日志、安全日志实时汇总到日志中心。第二个盲区是只看端口不看内容。有些环境中5985端口被运维工具占用攻击者也会选择用5985端口做通道。单纯查端口连接只能发现一小部分问题必须结合主机侧日志和PowerShell事件来综合判定。第三个盲区是误把横向移动当正常运维。很多企业的运维团队本身就是高频使用winRM的蓝队看到5985端口连接就习以为常导致真正的攻击流量混在正常运维流量中漏过去。检测规则必须加上更多维度的条件比如账号是否为敏感账号、会话是否在下班时间建立、脚本块是否包含可疑指令免杀加载器、下载执行、注册表持久化关键字等。5. 防御winRM横向移动的加固方案与落地实践5.1 端口和服务层面的收敛从防御角度来说最直接的办法就是减少winRM的暴露面。如果业务上确实不需要winRM那么在服务器上禁用Windows远程管理服务即可。服务设置为禁用状态后即使有凭据也无法建立远程会话。如果是必须使用winRM的场景那就尽量限定访问来源。Windows防火墙可以对5985端口配置只允许特定管理网段或特定跳板机IP访问。域环境下还可以通过GPO统一推送防火墙规则避免每台机器手工配置。这里给一条常见的防火墙限制命令参考New-NetFirewallRule -DisplayName Allow WinRM from Admin Subnet -Direction Inbound -Protocol TCP -LocalPort 5985 -RemoteAddress 10.0.0.0/24 -Action Allow如果内网规模不大甚至可以直接封锁所有来源只允许管理运维机的IP通过。此外建议把winRM走的通道切到HTTPS5986端口并要求启用证书认证。HTTPS通道能够加密通信内容即使流量被截获攻击者也无法轻易读取指令内容同时在证书层面可以增加双向验证进一步抬高利用门槛。5.2 身份验证与权限边界加固winRM横向移动成功的前提是拿到有效凭据所以凭据保护永远是防御链条中最关键的一环。常规建议包括高权限账号域管理员、本地管理员不要在普通业务主机上登录使用服务器本地管理员密码定期轮换避免长期不变使用受保护的安全通道如堡垒机来访问管理端口而不是直接从任意主机发起winRM连接。域环境下还可以启用Credential Guard将重要的账号凭据隔离在虚拟安全环境中降低被Mimikatz一类的工具直接抓取的风险。但这属于系统底层的功能部署前需要评估硬件兼容性和业务影响不要盲目开启。权限边界方面建议根据“最小权限”原则来配置winRM远程管理用户。默认情况下本地管理员组拥有远程管理权限但很多环境里的本地管理员密码是统一派发的一旦泄露就是全网沦陷。可以考虑创建一个专门的远程管理组只赋予需要远程维护的人员权限并把其他不需要远程管理的人员从管理员组中剔除。5.3 日志策略配置与集中监控前文说了日志是检测winRM横向移动的基础。防御工作落实到操作层面就是确保日志产生和留存是完整、集中、可检索的。建议在域内统一开启组策略将PowerShell模块日志记录、ScriptBlock日志记录开启到“详细”级别。开启方法是在组策略编辑器里找到“计算机配置 → 管理模板 → Windows Components → Windows PowerShell”启用“打开模块日志记录”和“打开PowerShell脚本块日志记录”模块名称填“*”表示记录所有模块。安全日志的审计策略中重点开启“登录/注销 → 审核登录”和“账户登录 → 审核凭据验证”。这样每次winRM连接产生的4624事件和相应的登录类型、源IP都会保留下来。日志集中存储建议配置Windows Event Forwarding把安全日志、PowerShell日志、System日志统一推送到日志服务器。保留周期根据合规要求至少180天以上。检测规则可以围绕4.1节提到的事件ID设置告警一旦触发即时通知不能等攻击者把整个内网摸完才反应过来。5.4 纵深防御与应急响应预案单一防御手段很难完全拦下winRM横向移动真正有效的防守是纵深防御。把网络分段、端口控制、身份认证、日志监控、行为分析各自做好攻击者突破一层还有下一层等着。网络层面核心业务网段和管理网段之间必须加防火墙ACL把5985/5986端口严格限制在管理网段内。生产主机默认不允许对外开启远程管理端口即使运维需要访问也通过跳板机跳转。终端层面EDR类产品要开启脚本行为检测对PowerShell远程会话中出现的可疑脚本块包含IEX、DownloadString、Add-MpPreference等关键字进行告警。同时对所有服务器的PowerShell执行策略做约束限制未签名脚本的运行。应急响应预案要提前写好明确的处置流程发现winRM横向移动后第一步是隔离被控主机阻断它与网络的通信第二步是在域控上强制重置相关账号的密码移除被控主机上的异常会话第三步是采集被控主机日志分析攻击者执行过哪些命令判断影响面第四步是针对漏出的凭据做全域密码轮换。整个流程必须提前演练不然真到出事的时候应急人员连第一步该先封IP还是先改密码都拿不准。6. 实战中常见的坑与排查经验速查winRM横向移动听起来不难真正操作起来问题还挺多。下面把我自己踩过的坑和排查经验整理成速查表供大家做攻防演练或应急排查时参考。问题现象可能原因排查与解决办法连接报“WinRM客户端无法处理该请求”目标主机winRM服务未启动检查目标主机服务状态手动启动WinRM服务并设为自动连接报“访问被拒绝”当前用户不在目标主机远程管理权限范围内确认目标主机本地管理员组成员或加入WinRMRemoteWMIUsers__组连接报“无法解析服务器名称”使用主机名连接但DNS解析失败改用IP地址连接或者检查DNS配置连接报“身份验证失败”域环境下Kerberos票据异常清除缓存票据klist purge重新获取Kerberos票据后再连接批量执行时部分主机失败部分主机防火墙未放行5985端口逐个检查失败主机的防火墙规则远程执行命令返回“无法加载文件”目标主机PowerShell执行策略限制远程会话中先用Set-ExecutionPolicy Bypass -Scope Process绕过限制进入交互式会话后中文乱码目标主机字符编码不一致在会话开始前执行chcp 65001或者设置输出编码排查这类问题有个通用思路先看服务端再查网络最后查权限。服务端就是确认winRM服务和端口状态网络就是确认中间是否有防火墙、ACL拦截权限则是确认账号是否在目标主机上有合法身份。按这个顺序逐层排查大多数问题都能快速定位。还有一个容易忽略的细节winRM的配置中默认有两个信任主机TrustedHosts设置这个配置直接影响跨域或者非域环境下的连接。如果在非域环境中要连接其他主机需要在客户端先设置信任列表Set-Item WSMan:\localhost\Client\TrustedHosts -Value 10.0.1.15,10.0.1.22这可能是新手最常见的问题来源之一。因为域环境下大多数连接通过Kerberos完成不需要设置TrustedHosts很多人根本不知道这个配置存在一换到工作组的测试环境就翻车还以为是凭据写错了。排查认验证问题时优先确认对方机器是否处于域内再决定要不要调TrustedHosts。关于HTTPS方式的winRM连接还有一个坑是证书验证。如果目标主机使用的是自签名证书客户端默认不会信任连接时需要用-SkipCACheck参数跳过CA验证。不过这种操作在正式环境里不建议使用毕竟跳过证书验证会带来中间人攻击的风险。如果是防御测试需要也仅限于隔离的测试环境中使用。7. 写在最后的个人心得winRM横向移动的技术原理并不复杂但它折射出的问题值得深思一个系统自带的合法管理功能恰恰成了攻击者眼中最高效的渗透工具。这说明安全建设的核心不是把某个功能一刀切禁用而是搞清楚业务到底需要什么再把需求量身定制成最小暴露面的安全策略。我在多次攻防演练中观察到的规律是防守方是否重视winRM的检测直接决定了演练结果的上限。每支蓝队都会部署EDR、都会接日志但能做到持续监控5985端口、持续分析PowerShell 4104事件、持续追踪域账号登录行为的少之又少。而攻击者恰恰专挑这些防守盲区下手一个合法的管理协议就能把整个域内主机摸个遍。所以这篇关于winRM横向移动的拆解既是在讲攻击路径更是在唤起防守端对这个“隐形后门”的重视。建议读者把这篇文章作为起点回到自己的内网环境里做一次自查哪些服务器开着winRM哪些账号具备远程管理权限日志是否覆盖了所有关键节点流量监控是否识别了winRM的通信特征把这些问题逐一落实远比收藏一堆新鲜工具和POC更有价值。另外提醒一句所有攻防技术都应当在合法授权的前提下使用。未授权测试行为涉嫌违法这篇文章的内容仅用于安全建设、攻防演练和应急响应工作切勿用于非法目的。