很多刚接触渗透测试的人,会误以为拿到一台 Web 服务器的 Shell,渗透就差不多结束了。但真实攻防中,这往往只是开始。攻击者真正想拿到的,通常不是边界主机,而是域控、数据库、邮件系统、核心业务服务器这类高价值资产。连接“外网入口”和“核心资产”的关键环节,就是横向移动。
什么是横向移动?
横向移动是指攻击者在获得内网某台主机的初始权限后,以该主机为跳板,继续在内网中访问其他系统、获取更多凭据、扩大控制范围的过程。
它和垂直提权不同:
- 垂直提权:在同一台主机上从普通用户提升到管理员或 SYSTEM/root。
- 横向移动:从一台主机跳到另一台主机,逐步接近核心目标。
两者经常交替出现:先横向到一台权限更高的主机,再在上面提权;提权完成后,又继续向下一台主机横向移动。
为什么横向移动很关键?
因为单点突破往往不足以造成严重危害。攻击者需要:
- 找到域控制器、数据库、文件服务器等核心资产;
- 获取域管理员、数据库管理员等高权限账号;
- 扩大控制范围,降低被单点阻断的风险;
- 为后续数据窃取、持久化控制创造条件。
从攻击链看,横向移动处于承上启下的位置:
flowchart TD A[初始突破] --> B[凭据获取] B --> C[横向移动] C --> D[权限提升] D --> E[目标达成] A -->|Web 漏洞 / 钓鱼 / 边界服务漏洞| A1[典型技术: 漏洞利用、钓鱼邮件、弱口令爆破] B -->|Mimikatz / 抓取 / 哈希传递| B1[典型技术: Mimikatz、LaZagne、Pass-the-Hash] C -->|SMB / RDP / WMI / WinRM| C1[典型技术: PsExec、CrackMapExec、WMI、RDP] D -->|提权 / 域管提升| D1[典型技术: 内核漏洞、服务配置错误、Kerberoast] E -->|数据窃取 / 持久化| E1[典型技术: 数据打包、计划任务、后门植入]如果没有横向移动,攻击者通常只能停留在被攻破的边界主机上;一旦横向移动成功,内网纵深防御就可能被逐步瓦解。
横向移动常见技术路线
横向移动的手法很多,但核心思路基本一致:复用已有权限、凭据、协议或配置缺陷,实现跨主机访问。
1. 基于凭据的移动
攻击者获取到用户名密码、NTLM 哈希、Kerberos 票据等凭据后,可以直接访问其他主机。常见方式包括:
- 使用 PsExec、CrackMapExec 等通过 SMB 执行远程命令;
- 通过 RDP 登录目标主机;
- 使用 WMI 远程执行命令;
- 利用 Pass-the-Hash、Pass-the-Ticket 进行身份复用。
这类方式之所以常见,是因为很多内网环境中存在凭据复用、本地管理员密码相同、域账号权限过大等问题。
2. 基于漏洞的移动
如果目标主机存在未修复漏洞,攻击者也可能直接利用漏洞完成横向跳转。例如:
- 利用未打补丁的 SMB 漏洞;
- 利用 Exchange、域控相关组件漏洞;
- 利用中间件、数据库、远程服务漏洞。
这种方式风险较高,容易触发告警,但在缺乏补丁管理和资产梳理的环境中仍然具有威胁。
3. 基于隧道和代理的移动
当内网存在网段隔离、防火墙限制或路由不可达时,攻击者可能会建立隧道或代理,穿透网络边界。常见手段包括:
- SOCKS 代理;
- SSH 隧道;
- 端口转发;
- 内网路由添加。
这类技术不一定直接获取新主机权限,但能帮助攻击者扩大探测范围,为后续横向移动创造条件。
攻击者如何寻找横向目标?
横向移动不是盲目跳转,通常会先做内网信息收集:
- 查看当前主机的 IP、子网、路由表;
- 扫描内网存活主机和开放端口;
- 判断是否为域环境;
- 查找共享目录、配置文件、浏览器保存密码、数据库连接串;
- 定位域控制器、数据库服务器、文件服务器等高价值目标。
很多横向移动的成功,并不是因为攻击者使用了多么复杂的工具,而是因为内网中已经存在可用凭据、过度信任关系和缺乏分段隔离。
从防守角度看,如何检测和阻断?
横向移动之所以难防,是因为很多攻击行为看起来很像正常运维:管理员也会用 RDP、WMI、PsExec、远程更新、批量部署补丁。因此检测重点不应只放在“某个工具是否出现”,而要看行为是否异常。
可以从三层入手:
1. 流量层
关注内网东西向流量中异常的 SMB、RDP、WMI、WinRM、LDAP、Kerberos 行为。例如:
- 某台普通业务主机突然大量访问其他主机 445、3389、5985 端口;
- 非运维账号频繁发起远程登录;
- 同一账号短时间内登录大量主机;
- Kerberos 票据请求、NTLM 认证出现异常模式。
2. 端点层
通过 EDR 或主机日志关注:
- 异常进程创建;
- Mimikatz、LaZagne 等凭据抓取行为;
- PowerShell 执行可疑命令;
- 计划任务、服务、注册表启动项被修改;
- 远程命令执行痕迹。
3. 日志与身份层
重点审计:
- 域账号登录日志;
- 特权账号使用记录;
- 账号横向访问路径;
- 异常时间、异常地点、异常主机登录;
- 本地管理员账号复用情况。
阻断方面,可以结合最小权限、网络分段、微隔离、RDP/WMI/SMB 访问控制、敏感主机白名单、快速账号封控等措施,把攻击者限制在尽可能小的范围内。
代码与命令示例
以下示例仅用于理解横向移动的技术原理和检测思路,必须在授权实验环境或靶场中使用,不得用于非授权目标。
示例 1:SSH 横向登录
如果内网主机开放 SSH,且存在弱口令或凭据复用,攻击者可能尝试远程登录:
ssh user@192.168.10.20从防守角度看,可以重点检测:
- 同一账号短时间内登录多台主机;
- 非运维账号登录生产服务器;
- 来自异常源 IP 的 SSH 登录;
- 登录失败次数突然增加。
示例 2:WMI 远程执行命令
在 Windows 域环境中,WMI 常被用于远程管理。攻击者也可能利用它执行命令:
wmic /node:192.168.10.20 /user:admin /password:Pass123 process call create "cmd.exe /c whoami"这类行为在端点和系统日志中通常会留下痕迹,例如进程创建记录、远程 WMI 调用记录、异常命令行参数等。
示例 3:PowerShell 远程会话
PowerShell Remoting 也是常见的横向移动方式之一:
Enter-PSSession -ComputerName 192.168.10.20 -Credential admin如果业务主机正常情况下不会建立 PowerShell 远程会话,却突然出现大量远程执行行为,就需要重点排查。
示例 4:Python 端口探测脚本
横向移动前,攻击者通常会探测内网存活主机和开放端口。下面是一个简化的端口探测示例:
import socket target = "192.168.10.20" ports = [22, 80, 445, 3389, 5985] for port in ports: try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(1) result = s.connect_ex((target, port)) if result == 0: print(f"{target}:{port} is open") s.close() except Exception: pass从检测角度,可以关注内网主机是否出现大量短连接、异常扫描行为、同一源 IP 对多个目标端口进行探测等。
学习建议
横向移动是内网渗透中非常典型、也非常容易“只懂概念、不会落地”的知识点。建议学习时不要只背工具名,而是按这个顺序梳理:
- 先理解目标:攻击者为什么要横向移动?想靠近哪些资产?
- 再理解前提:横向移动依赖哪些凭据、协议、信任关系?
- 接着看路径:从边界主机到域控/数据库,可能经过哪些跳板?
- 最后看检测:每一步会留下哪些日志、流量和端点痕迹?
为便于快速对照,下表汇总了常见横向移动攻击手法在流量层、端点层、日志层的检测要点、典型告警特征及简要阻断建议。
| 攻击手法 | 流量层检测要点 | 端点层检测要点 | 日志层检测要点 | 典型告警特征 | 阻断建议 |
|---|---|---|---|---|---|
| SMB(445) | 异常大量 445 端口连接;非运维主机频繁访问共享;SMB 协议版本异常 | svchost.exe 异常加载;PsExec 服务创建痕迹;net use 命令执行 | 4624 登录类型 3 异常;5140 共享访问异常;4776 NTLM 认证异常 | 同一主机短时间访问大量 445 端口;共享访问来源主机异常 | 限制 SMB 访问来源;关闭不必要的共享;对敏感主机实施 445 白名单 |
| RDP(3389) | 异常 3389 连接;非运维时段远程登录;大量 RDP 爆破流量 | mstsc.exe 异常启动;剪贴板重定向;远程桌面服务异常 | 4624 登录类型 10 异常;4778/4779 会话重连记录;登录源 IP 异常 | 非运维账号远程登录;同一账号多地同时登录;登录失败后成功 | 启用 NLA;限制 RDP 来源 IP;使用 RDP 网关;对高价值主机禁用 RDP |
| WMI(135/动态端口) | 135 端口异常连接;WMI 调用流量突增;动态 RPC 端口异常 | wmic.exe 异常执行;进程创建父子关系异常;远程 WMI 调用记录 | 4624 登录类型 3 异常;WMI 活动日志;事件 ID 5857/5858 | wmic process call create 命令;非运维账号发起 WMI 调用 | 限制 WMI 远程调用;禁用不必要的 WMI 命名空间;对敏感主机实施访问控制 |
| WinRM(5985/5986) | 5985/5986 端口异常连接;WinRM 流量突增;非运维主机发起 WinRM | winrs.exe 异常执行;PowerShell 远程会话建立;WSMan 服务异常 | 4624 登录类型 3 异常;WinRM 操作日志;PowerShell 远程会话日志 | Enter-PSSession 命令;非运维账号建立远程 PowerShell 会话 | 限制 WinRM 访问来源;对敏感主机禁用 WinRM;实施 TrustedHosts 白名单 |
| SSH(22) | 异常 22 端口连接;SSH 登录流量突增;非运维主机发起 SSH | ssh.exe 异常执行;密钥文件被访问;SSH 隧道建立痕迹 | SSH 登录日志异常;同一账号多主机登录;登录源 IP 异常 | 同一账号短时间登录多台主机;非运维账号登录生产服务器 | 限制 SSH 来源 IP;使用密钥认证;禁用 root 远程登录;实施堡垒机统一入口 |
| PowerShell Remoting | 5985/5986 端口异常;PowerShell 远程流量突增;非运维主机发起远程会话 | powershell.exe 异常执行;脚本块日志;AMSI 告警;远程会话建立 | PowerShell 操作日志(4104);远程会话日志;4624 登录类型 3 异常 | Enter-PSSession/Invoke-Command 命令;PowerShell 下载执行模式 | 限制 PowerShell 远程访问;启用 Constrained Language Mode;对敏感主机禁用 Remoting |
需要说明的是,上述检测要点并非孤立存在,实际防守中应把流量、端点、日志三层数据联动分析,才能更准确地区分正常运维与恶意横向移动。
在实际落地时,可以借助一些成熟的检测工具来辅助上述三层分析。下面简要说明 Zeek、Suricata、Sysmon、BloodHound 各自的适用场景。
Zeek(流量层)
Zeek 是一款面向网络流量的安全监控框架,擅长解析 SMB、RDP、WMI、WinRM、LDAP、Kerberos 等协议并输出结构化日志。它适合在流量层发现异常连接模式,例如某台业务主机短时间内访问大量主机的 445、3389、5985 端口,或同一账号从多台主机发起远程登录。Zeek 本身不直接阻断流量,更多用于持续记录和告警。
Suricata(流量层)
Suricata 是高性能的入侵检测与防御系统,基于规则匹配内网东西向流量中的恶意特征,例如 PsExec 服务创建、WMI 远程调用、异常 SMB 命令、RDP 爆破等。它既可以作为 IDS 旁路监听,也可以作为 IPS 在线阻断。相比 Zeek,Suricata 更偏重已知攻击特征的实时匹配,适合在流量层快速触发告警。
Sysmon(端点层)
Sysmon 是 Windows 平台上的主机监控工具,通过驱动级日志记录进程创建、网络连接、文件写入、注册表变更、DLL 加载等行为。它适合在端点层发现 Mimikatz、LaZagne 等凭据抓取行为、异常进程创建、PowerShell 可疑执行、计划任务或服务被修改等痕迹。Sysmon 日志通常需要配合 SIEM 或 EDR 平台做关联分析,才能形成有效告警。
BloodHound(日志与身份层)
BloodHound 是一款面向 Active Directory 的分析工具,通过采集域内对象、ACL、会话、组关系等数据,可视化呈现账号之间的横向访问路径和提权路径。它适合在日志与身份层梳理账号横向访问路径、定位本地管理员复用、发现过度信任关系,帮助防守方优先收敛高风险路径。需要说明的是,BloodHound 本身是攻击者常用的侦察工具,防守方也可以用它做红队视角的路径审计,但采集数据时需在授权范围内进行。