内网横向移动原理与实战:SMB、WMI、PsExec协议穿透解析
2026/9/15 4:14:43 网站建设 项目流程

以前在攻防演练里,每次打完点拿到一台主机,后面能不能快速拿下一整个域,看的不是单点爆破能力,而是横向移动那一下是否够快够稳。我自己刚接触内网的时候,最常被三个名词卡住:SMB、WMI、PsExec。这三个玩意儿单拿出来都能查到一堆资料,但真正在实战里怎么组合、怎么绕过不通的端口、怎么从一台跳板机摸到目标网段,网上讲得乱,自己踩坑又费时间。

这篇我从红队和蓝队两个角度去拆,讲清楚SMB、WMI、PsExec这三类协议横向移动的原理,再说说“协议穿透”到底在穿透什么,最后把实操命令、检测点、排查经验一次给到位。适合正在学内网渗透的、做攻防演练防守的、以及后续想在企业内部做安全测试的朋友参考。内容只讲合法授权前提下的技术验证与防御理解,别有别的用途。

1. 内网横向移动的底层逻辑:先看它“移”的是什么

1.1 横向移动在内网攻防中的位置

很多人以为拿到一台服务器就算“攻破”,其实在攻防视角里,单点失陷只是开始。攻击者进入内网后,真实目标通常是域控、核心数据库、运维堡垒机这类高价值资产。从第一台webshell到你想要的核心资产之间,隔着的往往不是一道墙,而是成片的服务器网段和一堆普通业务账号。此时要做的就是在内网里“移动”,把权限从A机器扩展到B机器,再从B扩展到C,一步步逼近目标。

这就是横向移动的意义。它可以被理解成攻击链条里的“放大器”:初始打点决定你能不能进来,横向移动决定你能拿到多大范围。常见的攻击链模型是:外网打点、初始权限获取、权限提升、内网主机与凭据收集、横向移动、目标系统控制或数据回传。其中横向移动和凭据收集是互相促进的,收集到的凭据越多,能移动到的机器越多,移动后又能收集到更多凭据。

1.2 横向移动的三大前置条件

我刚开始学横向移动时总有一个误区,以为有工具就能随便连。实际上横向移动的成功与否,几乎完全取决于三个前置条件是否满足。

第一个是凭据。攻击者需要至少一个合法账号,可以是明文密码、NTLM Hash或者Kerberos票据。没有凭据就只能靠漏洞打,那是另外一套技术栈。第二个是网络连通性。源主机和目标主机之间的端口要能通,尤其是445、135这类管理端口。很多内网虽然机器很多,但网络分段或主机防火墙会阻断这些端口的访问,导致有凭据也连不上去。第三个是目标主机开启了对应服务,比如SMB服务、Windows Management Instrumentation服务,并且当前凭据在目标上有足够的权限。

这三个条件我习惯类比成“门禁卡、走廊门、房间权限”。门禁卡决定了你能不能刷开某一层的门,走廊决定了有没有通道让你走过去,房间权限决定了你进去后能翻到什么。横向移动的每一步都是围绕这三个条件开展的,排查问题也基本逃不开这个框架。

2. 三个协议的原理:SMB、WMI、PsExec分别是什么

2.1 SMB:文件共享背后的隐藏能力

SMB(Server Message Block)是Windows环境下用于文件共享、打印共享等操作的核心协议。默认监听445/TCP端口,老版本还用过139/TCP。大家平时在Windows资源管理器里输入\\192.168.1.10\share访问共享文件夹,用的就是SMB。但很多人不知道,SMB除了能传输文件,还能作为远程管理的“运输通道”。

SMB协议内部有“命名管道”(Named Pipe)机制,像\pipe\browser\pipe\svcctl这类管道可以让客户端调用服务器上的服务管理接口。攻击者利用这一特性,通过SMB会话访问目标的IPC$共享,进而触发目标上的计划任务服务、服务控制管理器,最终实现远程命令执行。SMB还提供了默认管理共享,比如C$ADMIN$,这些只有管理员权限才能访问,而它们的存在本身就意味着:只要拿到管理员凭据,远程访问整个C盘都不成问题。

SMB 1.0和SMB 2.0/3.0之间还有个容易被忽略的差异:老版本协议缺乏签名机制,容易被中间人篡改;新版本默认启用或推荐启用SMB签名。实际测试里,很多内网老机器还在用SMB 1.0,这既带来了兼容性问题,也增加了被利用的风险。题目里提到的“查看电脑smb地址”这类常见需求,其实就是查看本机IP和SMB服务状态,在管理内网时也属于基本功。

2.2 WMI:远程管理中暗藏的代码执行入口

WMI(Windows Management Instrumentation)是微软基于Web-Based Enterprise Management标准实现的一套管理基础设施。它通过DCOM或WS-Management协议工作,默认使用135/TCP作为RPC端点映射端口,然后动态协商一个高位TCP端口用于数据传输。由于WMI本身是为系统管理设计的,很多企业安全团队对它的监控力度远低于对SMB的监控,所以它成了内网横向移动里非常“低调”的选择。

WMI可以查询远程主机的进程列表、系统信息,也能创建进程、修改服务、调用类方法。经典的远程执行命令方式是调用Win32_Process.Create方法,参数里直接给一段命令行,目标主机用当前WMI会话的身份权限去启动这个进程。因为整个过程走的是管理通道,发起者通常不会被要求写入目标磁盘,留下的痕迹比SMB+服务方式更少。

有个我自己踩过的坑:WMI虽然好用,但触发远程进程时,如果目标上的杀软对创建进程行为有严格告警,还是会被拦。而且WMI的连接稳定性受RPC端口动态分配和防火墙策略影响很大,两个网段之间只放行了135端口而没有放行高位RPC端口时,WMI会连不上。这个后面在排查部分细讲。

2.3 PsExec:微软老牌远程执行工具的机制

PsExec是微软Sysinternals套件里的经典工具,搞Windows运维的人都用过。它表面上是个“远程执行命令”的工具,工作原理却值得拆开看:客户端先通过SMB连接到目标的ADMIN$共享,把一个名为PSEXESVC.exe的服务端二进制文件上传到目标的系统目录;然后通过SMB的svcctl命名管道调用服务控制管理器,创建名为PSEXESVC的服务;接着启动服务,让服务进程以System权限执行我们传递进去的命令;命令执行完成后,再删除服务和二进制文件。

这套“上传文件、创建服务、启动服务、删除服务”的流程,本质上是Windows服务机制本身能力的体现。正因为PsExec流程特征如此明显,防守方只要盯住“主机上出现新的服务 + 新文件写入系统目录 + SMB连接同一来源IP”这几件事,就能快速定位。后来很多开源工具,比如impacket里的psExec实现、CrackMapExec的smb-exec模块,都沿用了这套服务执行思路,只是在免杀、清理痕迹等方面做了各自优化。

2.4 三个协议的关系与选择

我经常把这三种方式放一起做横向移动技术选型,它们并不互斥,而是互补的关系。

方式底层依赖默认端口典型工具特点
SMB+计划任务/服务SMB,命名管道445net useschtaskssc原理直观,兼容性好,但会留下大量SMB连接和服务创建日志
WMIDCOM/RPC135wmic、PowerShell无文件落地,利用管理通道,隐蔽性较好,受防火墙影响大
PsExecSMB+服务管理445PsExec、impacket-psexec使用方便,功能强大,但特征明显,杀软检测率高

某种方式不通时,优先排查端口连通性和目标服务状态,然后换另一种方式试。真实环境里很少有人只依赖一种协议,基本都是“SMB探测打底,WMI和PsExec交替执行”。

3. 协议穿透:真正要穿过的不是协议,是网段和策略

3.1 “穿透”到底穿透什么

很多初学者第一次看到“协议穿透”这个词,会误以为是要把协议本身破解或反转。其实内网横向移动里说的穿透,指的是突破网络隔离和访问控制策略。企业内网往往按功能划分多个网段,比如办公网、业务网、数据库网、运维网,网段之间通过防火墙或交换机ACL限制访问。即使你拿到了办公网一台机器的管理员权限,也不代表你能直接访问数据库网段的445端口。

这种情况下,攻击者做的事情就是寻找一个“中间点”,这台机器同时能被当前控制的主机访问,又能够访问目标网段。然后用它在中间执行命令、转发流量、存储凭据,让横向移动从“直连”变成“跳一跳”。这个过程我习惯叫协议穿透或内网穿透式移动。说白了,就是在网络不可直连的现实里,利用已有节点打通一条路。

必须强调,这里讨论的“穿透”仅限于攻防演练和授权测试中对网络访问控制的技术验证,目的是帮助防守方发现策略缺口,绝不是什么绕过网络边界的灰色工具。

3.2 利用已放行协议做移动:以SMB为例

SMB是最容易被选作“穿透”通道的协议之一。原因很简单,很多企业内网出于文件共享或老的业务需求,普遍放行了445端口。攻击者只要控制一台能访问目标网段445的跳板机,就能以它为起点,把横向移动命令向更内层延伸。

举个实际例子:假设场景里拿下了应用服务器A,目标数据库服务器B,A和B之间业务上需要共享文件,所以防火墙上放行了A到B的445端口。现在攻击者有了A的本地管理员权限,就可以在A上创建一个计划任务,让A去连接B的IPC$共享,然后调用B上的服务管理接口执行命令。从B的角度看,发起连接的是A这台“业务白名单机器”,流量完全符合正常业务特征。

还有一个更直接的手段是Windows自带的端口转发。在A机上执行netsh interface portproxy,把A的某个端口转发到B的445端口,这样外部主机只要访问A的该端口,实际上就访问到了B的SMB服务。这种办法适合在目标网段内的机器无法直连,但攻击者又能控制一台跳板机的情况。注意,portproxy需要管理员权限,并且会在A上留下持久性配置,防守方查一下端口监听和防火墙规则就能发现。

3.3 跨网段横向的典型套路

从实战中总结,跨网段横向核心思路一般是:确认当前位置、梳理可达关系、寻找跳板机器、在跳板上执行横向命令。

第一步确认当前位置。通过ipconfig /allroute printarp -a判断当前主机IP、网关和网段。第二步梳理可达关系。用端口扫描或系统自带telnetTest-NetConnection探测目标网段关键机器是否开放445/135。第三步寻找跳板。目标网段中只要有一台机器能同时被你当前控制的主机和目标机器访问,它就是跳板。第四步执行横向命令。在跳板上用计划任务或服务方式把命令“弹”给最终目标。

我见过的一个比较经典的攻防场景:攻击者打下一台运维跳板机,上面记录着大量目标主机IP和账号,由于运维网段到数据库网段只开放了运维工具端口,攻击者直接用WMI从运维跳板机向数据库服务器发起远程进程创建,整个过程没有在数据库网段新增任何额外监听端口。这种利用“已有业务关系”进行的穿透,比单纯扫端口绕策略高明得多。

3.4 常见误解:SMB不通就是不支持SMB

很多人在测试SMB横向移动时,第一步就卡在“连接不上”。我要提醒一个高频误解:连接不通,不全是因为对方没开SMB服务,更多时候是防火墙策略或网络隔离在起作用。比如Windows防火墙默认会阻止来自其它网段的445入站请求,除非防火墙规则里允许特定来源IP。而域内机器之间之所以通常能直接SMB互联,是因为域环境里的组策略一般会放行域成员间的文件和打印机共享。

另一个误解是“SMB 1.0必须打开才能连”。实际上Windows 10和Server 2019以上默认禁用SMB 1.0,但现代Windows之间用SMB 2.0/3.0就能正常连接。很多管理员为了排查老设备问题会打开SMB 1.0,这反而放大了攻击面。遇到445不通时,先确认目标防火墙、本机防火墙、源和目标的SMB版本,再做下一步判断。

4. 实操:从探测到横向执行的完整过程

4.1 测试环境与授权声明

下面所有操作都是基于一个模拟内网环境,三台VMware虚拟机:一台Kali用于发起测试,一台Windows Server 2019作为跳板机,一台Windows 10作为目标机。网络环境里我预先配置好了账号凭据和网段访问关系,所有测试均获得授权,仅供验证横向移动的流量特征与防御检测规则。你跟着练习时,一定也要在自己搭的虚拟机或授权的靶场里进行,别拿生产环境随便试。

4.2 第一步:探测存活与端口状态

横向移动前先得摸清目标情况。用Nmap对目标网段做扫描,重点看445、135、139这几个端口:

nmap -sV -p 445,139,135 192.168.10.0/24

结果里如果445端口显示open,说明目标SMB服务可访问;135端口open对应DCOM/RPC服务;139端口表示NetBIOS会话服务也在监听。有些机器可能三个端口都开放,有些只开135没有开445,这直接决定了后续该用哪种横向方式。

除了端口扫描,还可以用smbclient直接访问目标的共享列表:

smbclient -L //192.168.10.20 -U administrator

如果目标开启了共享但没有强制SMB签名,smbclient通常能列出共享目录。测试环境里我习惯配合CrackMapExec做综合探测,一条命令就能拿到SMB版本、是否支持签名、域名等信息:

crackmapexec smb 192.168.10.0/24

这个阶段不用做太深,确认端口、服务、主机名和大致系统版本就够了。

4.3 第二步:SMB横向移动与远程命令执行

拿到一个管理员账号后,可以先用net use建立到目标IPC$的空会话或指定凭据会话:

net use \\192.168.10.20\ipc$ /user:testlab\administrator "P@ssw0rd"

建立成功说明当前账号具有目标的管理员权限。此时可以通过计划任务方式在目标上执行命令。先创建一个名为TaskLog的计划任务,触发命令是生成一个探针文件:

schtasks /create /s 192.168.10.20 /u testlab\administrator /p "P@ssw0rd" /tn TaskLog /tr "cmd.exe /c whoami > C:\ProgramData\task.txt" /sc once /st 00:00 schtasks /run /s 192.168.10.20 /u testlab\administrator /p "P@ssw0rd" /tn TaskLog schtasks /delete /s 192.168.10.20 /u testlab\administrator /p "P@ssw0rd" /tn TaskLog /f

执行后如果C:\ProgramData\task.txt里写的是nt authority\system,说明命令已经以System权限在目标上执行成功。这种通过计划任务的SMB横向移动,完全使用系统自带命令,不会在目标上落地额外的攻击工具,特征主要集中于事件日志中计划任务的创建和启动记录。

建共享替代方案是用sc.exe创建远程服务。计划任务方式更直观,服务方式更容易触发杀软告警,实际选择时看目标环境。建议优先计划任务。

4.4 第三步:WMI横向移动与无文件执行

如果不想使用SMB,或者目标445端口不可达,但135端口开放,可以试WMI。系统中的wmic命令可以直接调用远程主机的Win32_Process.Create

wmic /node:192.168.10.20 /user:testlab\administrator /password:"P@ssw0rd" process call create "cmd.exe /c whoami > C:\ProgramData\wmi.txt"

执行成功后,WMI的返回值里会显示ProcessId,这表示远程进程已经创建。这种方式的优势是全程不依赖SMB共享,不需要写文件到目标管理共享,而是直接命令目标生成指定进程。不过WMI默认走DCOM,会动态协商高位TCP端口,很多防火墙默认没有放行,所以实战中成功率不一定胜过SMB。

PowerShell方式也值得掌握:

$secpasswd = ConvertTo-SecureString 'P@ssw0rd' -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential('testlab\administrator', $secpasswd) Invoke-WmiMethod -ComputerName 192.168.10.20 -Credential $cred -Class Win32_Process -Name Create -ArgumentList "cmd.exe /c whoami > C:\ProgramData\wmi2.txt"

使用PowerShell的好处是方便把命令写到脚本里做批量操作,但Invoke-WmiMethod同样受DCOM端口动态分配影响。

4.5 第四步:PsExec横向执行与工具对比

PsExec的使用非常直接,官方版从Sysinternals下载后在命令行敲:

PsExec64.exe \\192.168.10.20 -u testlab\administrator -p "P@ssw0rd" cmd.exe /c whoami

命令执行时,PsExec会完成上传服务、创建服务、启动服务、删除服务的一整套动作。它的优点是自带了复制文件、远程启动交互式进程等能力,用起来省心。缺点同样突出,杀软基本都会盯着PSEXESVC这个服务名和系统目录下新出现的二进制文件,很多企业EDR已经能直接识别并拦截。

开源替代方案里,impacket提供的psexec.py在Kali下很好用:

impacket-psexec testlab/administrator:P@ssw0rd@192.168.10.20

它实现了与PsExec类似的服务创建机制,但默认二进制由impacket生成,杀软特征库更新快的环境里也可能被查。测试时如果官方PsExec被拦,可以试试impacket版本或用WMI替代,不必一棵树上吊死。

4.6 第五步:利用portproxy做SMB协议穿透

模拟一个更贴近真实内网的场景:目标Windows 10(192.168.10.20)和Kali所在网段不通,但跳板机Server 2019(192.168.10.10)能和目标通。此时需要在跳板机上配置端口转发,把Kali对跳板机某个端口的访问转发到目标的445端口:

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=4445 connectaddress=192.168.10.20 connectport=445 netsh interface portproxy show all

配置完成后,在Kali上直接访问跳板机的4445端口,实际就是访问目标的445端口。用smbclient测试:

smbclient -L //192.168.10.10:4445 -U administrator

如果列出共享成功,说明穿透链路已经打通。这种技术在攻防演练中很常见,相当于把一台被控主机变成了一个“协议网关”。但要注意,netsh interface portproxy在跳板机上留下了监听端口、转发目标和防火墙规则,防守方检查端口监听和netstat时很容易看到异常。

5. 蓝队视角:流量与日志里的横向移动痕迹

5.1 Windows事件日志中的关键线索

防守横向移动,第一步是知道该看哪些日志。Windows自带的安全日志里有几个与横向移动密切相关的事件ID,我做蓝队时都会重点盯。

事件ID日志名称说明横向移动触发场景
4624安全日志登录成功远程交互登录、网络登录
4625安全日志登录失败口令爆破尝试
4648安全日志显式凭据登录用指定账号远程连接目标主机
5140安全日志共享对象访问访问IPC$ADMIN$等共享
7045系统日志安装服务PsExec创建服务
1000/1001应用/系统日志计划任务创建/触发schtasks远程创建计划任务

攻击者使用PsExec时,目标机系统日志会出现7045事件,记录新服务PSEXESVC的安装;使用计划任务横向移动时,目标机会出现计划任务相关的创建与启动事件。4648事件则记录了使用显式凭据(非当前登录凭据)访问其它主机,常见于net useschtasks /s这类命令。

5.2 网络侧检测:445流量的“社交画像”

流量侧的检测思路通常是给445这件事做“社交画像”。正常情况下,一台办公电脑不会频繁向几十台服务器发起SMB连接。一旦出现来自同一IP的445端口大量扫描式连接、大量登录失败后突然成功的连接,以及同一来源对多个目标的IPC$访问,基本就能圈定可疑横向移动。

WMI横向移动的流量特征则是135端口RPC查询后动态协商高位端口。防守方如果看到同一来源短时间内在135上做了大量RPC请求,然后伴随大量高位端口的DCOM通信,就需要重点排查。Sysmon配合Event ID 3(网络连接)、Event ID 11(文件创建)、Event ID 13(注册表改动)、Event ID 17和18(管道连接/断开)能更精细地还原攻击者行为。

5.3 防御配置清单

从根上减少横向移动攻击面,我通常会按优先级做这几件事:

  • 禁止域环境中不必要的SMB管理共享访问,尤其对普通用户权限收紧ADMIN$C$的访问限制。
  • 对SMB启用签名并尽可能禁用SMB 1.0。SMB签名能有效降低中间人投毒类攻击,SMB 1.0关闭后大量老漏洞从根上失效。
  • 限制WMI访问来源。通过DCOM安全描述符和WMI命名空间安全设置,只允许特定管理主机使用WMI。
  • 坚持最小权限原则,普通运维账号不该有域管权限,本地管理员密码要定期轮换,推荐用LAPS管理。
  • 启用Credential Guard和受限管理员模式,减轻凭据被提取后的影响。
  • 在网络边界和主机防火墙上,对135、139、445等高危端口做来源IP白名单,少用“全放行”。

这些措施不会100%阻断横向移动,但能把攻击者的每一步都变慢、变响,给自己争取响应时间。

6. 常见问题与排查技巧实录

6.1 SMB连接不上,445端口显示filtered或closed

先确认目标机是否真的开放445端口。在源机上用Test-NetConnection -ComputerName 192.168.10.20 -Port 445做连通性测试。如果显示filtered,一般是防火墙拦截,需要在目标机的防火墙入站规则里放行文件和打印机共享相关规则,或者临时加一条允许来源IP访问445的规则。如果显示closed但Nmap扫描时端口是open的,检查源机Windows防火墙是否拦了出站445流量。

SMB 1.0相关的兼容问题在真实环境里也常见。有时老设备只能通过SMB 1.0访问,而新Windows默认禁用了1.0,双方协议版本匹配不上就会报错。手段只是临时在测试机上启用SMB 1.0功能,但生产环境千万别为图省事长期开启。

6.2 WMI报错“拒绝访问”或“RPC服务器不可用”

WMI执行失败常见三类问题。第一类确实是凭据错误或权限不够,确认账号是否在目标机的本地管理员组中。第二类是UAC远程限制,Windows Vista以后,本地管理员组用户在远程WMI连接时会被过滤成标准用户权限,解决办法是在目标机上把注册表LocalAccountTokenFilterPolicy设为1,这属于典型的“改机器配置来验证攻击可行性”操作,真实企业环境里一般不建议这么干。第三类是防火墙只放行了135端口,后续DCOM动态高位端口没放行,导致WMI连接后数据传输失败。此时需要放行RPC动态端口范围,或者改用winrm这类走单一端口的方案。

6.3 PsExec被发现/被杀的应对

杀软对PsExec的检测重点集中在PSEXESVC服务名、文件落地路径、服务创建动作这几处。如果只是做授权测试,可以考虑不落盘的方式:先用SMB共享上传自定义命名服务,或者改用WMI和计划任务这种不需要落盘的方法。如果必须使用PsExec类工具,优先使用impacket的psexec,并在测试后确认服务与二进制文件已清理干净。

另外提醒一点:工具被阻断不代表思路被阻断。理解协议原理之后,你可以不加任何第三方工具,仅用系统内置的scschtaskswmic完成大部分横向移动动作,这些原生命令的流量特征更接近系统正常操作,也更方便攻防双方在日志层面做对照分析。

6.4 协议互通性的“版本坑”

同一个局域网里如果有多代Windows主机,横向移动时还会遇到协议版本差异。Windows 2008等老系统的SMB 1.0默认开着,但和Windows 10默认的SMB 3.1.1协商时通常没问题;反而是老系统在SMB 2.1和SMB 3.0之间可能出现兼容问题。WMI方面,老系统用wmic走DCOM比较稳,新系统PowerShell的CimInstance走WS-Management更加顺畅,所以在跨版本横向时,要么统一用较底层的SMB+计划任务,要么针对目标系统选择兼容的WMI调用方式。

我在实际测试里还会关注另一个细节:在多网卡机器上,SMB和WMI的源IP可能会走错网卡导致目标解析不到。可以在命令里显式绑定源IP,或者在源机上调整路由优先级,这类“环境问题”常常比攻击本身更费时。

最后补一点经验

玩内网横向移动这几年,我的一个很深感受是:真正决定你能走多远的不是工具多不多,而是对协议细节和日志痕迹的理解深不深。很多人拿个脚本跑通了一台机器,换了个环境就完全抓瞎,就是因为不懂SMB、WMI、PsExec各自干了什么、在目标上留下了什么。反过来,从蓝队视角研究一遍这些特征,再回到红队去看命令执行,很多以前觉得“玄学”的连接失败问题都会变得很清楚。

继续深入的方向,建议多研究Kerberos相关的票据利用和域环境下的hash传递原理,和多协议横向移动结合起来,基本就能应对大多数中等规模的内网攻防场景。多搭几台虚拟机自己练,比自己闷头看一个月的资料都有效。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询