1. 内网环境下的横向移动:一次系统的攻防视角复盘
搞安全这一行,尤其是做内网防护和渗透测试的朋友,对“横向移动”这个词一定不陌生。我在实际参与攻防演练和应急响应时,见过太多因为横向移动没防住,导致整个核心业务网段被拿下的案例。所谓横向移动,简单说就是攻击者拿到第一台机器的控制权之后,以此为跳板,在内网里逐步摸索、渗透,最终控制更多主机、拿到更高权限的过程。它解决的核心问题是“拿到一台机器之后下一步怎么走”,掩盖的是攻击者真正的最终目标,通常是最核心的数据库或运维管理平台。
这篇内容不讲废话,只聚焦内网环境下的横向移动。适合正在入门但已经摸到了一点门道的安全运维、蓝队防守人员,也适合需要了解攻击路径以便更好做防护的研发朋友。我会把思路、常见手法、实操要点、坑点,以及防守视角该怎么看这些操作,一次性掰开揉碎说清楚。
1.1 为什么横向移动是内网攻防的核心
很多人会误以为,拿到一台服务器的权限,攻击就结束了。实际上,单点突破只是整个攻击链条里比较靠前的一步。真正的核心在于横向移动,因为绝大多数有价值的目标(核心数据库、堡垒机、域控、财务系统)都不会直接暴露在外网,它们往往藏在内网深处,甚至划分了多个网段,做了访问控制。攻击者必须依靠已控制的那台机器,一步步“横向”跳过去。
打个生活化的比方,这就好比小区安保做得再好,但只要有一户人家的阳台没锁,小偷进了这一户之后,就能顺着阳台和楼道,挨家挨户试探,最终摸到物业的中心控制室。内网横向移动就是这个“顺阳台挨家挨户试探”的过程,而防守方要做的,就是确保每一道“阳台门”和“楼道监控”都能发现问题。
1.2 横向移动的完整视角:攻击者怎么想,防守者怎么看
一次完整的横向移动,从攻击者的视角看,通常分为三步:第一步,收集当前机器的信息,搞清楚自己手里有什么牌(本机账号、网络连接、共享目录、缓存凭证);第二步,地毯式探测内网拓扑,搞清楚有哪些机器、哪些端口是开放的、哪些账号可以在哪些机器上使用;第三步,选择合适的工具或系统机制横向跳转,在目标机器上执行命令或植入后门,然后重复以上步骤。
从防守者的视角看,这三步对应的恰恰是信息收集监测、异常连接行为发现、以及凭据使用审计。很多防守团队做不好横向移动的检测,核心原因是不理解攻击者在每个环节具体做了什么,所以看不懂日志里那些“不起眼”的告警。下面我把每个环节的手法拆开讲,并附上防护思路。
2. 横向移动的核心技术点拆解
2.1 内网信息收集:决定后续攻击路径的胜负手
横向移动能走到哪一步,很大程度上取决于第一步信息收集做得细不细。我这几年复盘过不少案例,发现很多攻击者功亏一篑,不是因为技术不行,而是因为前期信息收集太粗糙,拿着错账号去撞目标机器,触发锁定策略,惊动了防守方。
信息收集的关键对象包括三大类。
第一类是当前机器的账号与组信息。比如Windows环境下,查看本地管理员组成员,可以知道这台机器上哪些账号有高权限;查看当前登录会话和缓存凭据,可以判断有没有域账号在这台机器上活动过。这些信息直接决定你能不能拿到“跨机器”的合法凭据。Linux环境下,则重点查看.bash_history、/etc/shadow备份文件、SSH密钥文件等,判断是否存在可以复用密钥登录其他机器的情况。
第二类是网络连接与共享资源。执行net view /domain可以查看当前域里的机器列表和共享资源,netstat -ano可以查看当前机器与哪些内网IP有活跃连接。这一步看起来简单,却是绘制内网拓扑的基础。攻击者会根据当前机器跟哪些IP有连接,判断哪些机器可能是运维管理终端、数据库服务器或者备份服务器。
第三类是凭据获取。这一步用到的技术很多,包括但不限于在内存中抓取明文密码或哈希(常见工具比如mimikatz的sekurlsa模块),读取浏览器保存的密码,扫描当前网段内是否存在使用弱口令或默认口令的机器。这里必须强调,所有无授权测试行为都是违法的,我只在受控的攻防演练环境中研究这些,并且所做的一切都是为了加强防守。
2.2 横向移动常用系统机制解析
(1)IPC连接与计划任务
Windows内网中,最经典也最高频的横向移动方式是通过IPC(Inter-Process Communication,进程间通信)连接配合计划任务。攻击者利用已获得的某个账号和密码或哈希,与目标机器的隐藏共享建立连接,然后在目标机器上创建计划任务,让计划任务去执行指定的payload。
实际操作中,建立连接用的是net use \\目标IP\ipc$ /user:域名\账号 密码,创建计划任务用的是schtasks /create /s 目标IP /u 账号 /p 密码 /tn 任务名 /tr "命令" /sc once /st 执行时间,启动计划任务用schtasks /run /s 目标IP /tn 任务名。整个过程只需要135、445端口开放,不需要额外装任何软件,还原生支持远程执行,所以特别容易被滥用。
不过要注意,windows计划任务的/s参数在跨域或非域环境使用时,经常出现“拒绝访问”或“找不到网络路径”的报错。我处理过很多次这种情况,90%以上是因为账号没有目标机器的本地管理员权限,或者目标机器开启了防火墙阻止了远程计划任务创建的端口。遇到报错先检查账号权限,再检查防火墙,不要反复用同一个方案死磕。
(2)远程执行服务
Windows自带两种非常方便的远程执行服务,分别是远程桌面和远程PowerShell。远程桌面简单直观,但默认情况下,连接会有登录记录,有些做得好的防守团队会监控4624、4625事件,并且会有告警。更隐蔽的方式是PowerShell远程会话,攻击者只要目标机器开启了WinRM服务(端口5985/5986),并且有目标机器的管理员凭据,就能建立PowerShell会话,直接在目标机器上执行命令。
用PowerShell建立远程会话的代码非常简单,New-PSSession -ComputerName 目标IP -Credential 账号,然后Enter-PSSession进入交互式会话,或者Invoke-Command -Session $ses -ScriptBlock { 命令 }执行单条命令。这种方式没有图形界面,不会产生大量桌面连接日志,而且命令执行结果直接回传,非常高效。我强烈建议防守方重点监测WinRM相关的事件日志和5985端口连接。
(3)哈希传递与票据传递
在域环境中,单纯的“密码”这个维度是不够的。很多攻击者拿到的并不是明文密码,而是NTLM哈希,但这并不妨碍横向移动。因为Windows的很多身份认证流程本身就支持使用哈希完成认证,这就是所谓的哈希传递(Pass-the-Hash)。攻击者用mimikatz抓取到哈希之后,不需要破解成明文,直接用工具发起横向连接就行。
更进一步的是票据传递(Pass-the-Ticket),攻击者会尝试窃取域内的TGT(票据授权票据)或服务票据,然后在需要横向访问其他机器时“重放”这些票据,以获得对应服务的访问权限。这个手法对防守方的隐蔽性更强,因为攻击者全程没有使用任何明文密码,传统的密码修改策略可能都发现不了。
(4)SSH、代理与内网穿透
如果内网是Linux服务器居多,或者跨了多个隔离网段,那横向移动的方式就变成SSH密钥复用和代理转发。攻击者在拿到一台Linux机器后,会检查~/.ssh/目录下是否存在私钥文件,如果有,就直接尝试用这个私钥去连接其他机器。很多运维为了方便,会把同一个密钥配置到多台服务器上,这简直是在给横向移动铺路。另一个思路是,把已控制机器做成跳板,利用SSH本地转发、动态转发等手段,让流量经由这个跳板流向原本访问不到的目标网段。
不管用哪种方式,横向移动的本质都是一样的:攻击者手上的“可复用凭据”和“网络可达性”决定了他们能跳多远。下面从防守者的角度反推,看看每个环节最容易出问题的地方在哪。
3. 从攻击链反推核心实操要点
很多防守人第一次接触横向移动时,一上来就想着我要用某个工具去扫、去打,结果处处碰壁。我的建议刚好相反,先建立“攻击链”意识,再逐步验证每个环节。
3.1 基于攻击链的验证路线
我整理过一个比较通用的横向移动验证路线,放在受控的攻防演练环境里非常有效,大致分为五个阶段。
第一个阶段是“立足点信息收集”,确认当前机器的系统版本、已登录用户、所在域信息、网络连接情况、杀软类型和版本。这里有一个小技巧,先看进程列表里有没有安全软件进程,这直接影响后续工具和payload能不能落地。杀软如果很强,就先考虑纯系统机制,比如计划任务或PowerShell,尽量避免落地文件。
第二个阶段是“内网拓扑测绘”,基于当前机器的路由表、DNS解析记录、ARP缓存,判断内网大概有哪些网段,然后用轻量方式探测目标网段里有哪些活跃主机。轻量方式包括ICMP ping扫、常见端口探测,以及尝试用SMB空会话枚举共享。不要一上来就跑全端口扫描,动静太大。
第三个阶段是“凭据梳理复用”,把当前机器能收集到的全部账号、哈希、票据、SSH密钥整理出来,做一个对应矩阵,哪个账号可能在哪台机器上用。这一步最花时间,但也最影响成功率。
第四个阶段是“横向尝试”,从矩阵中挑选最可能的组合,优先用系统机制、计划任务、WMI这类工具少的方案,因为落地文件少,被监控发现的概率低。成功执行之后,立刻在目标机器上再次收集信息,顺便植入简单的持久化手段(比如创建本地账号或注册计划任务),以备后续会话中断时仍有退路。
第五个阶段是“向着核心目标逐级深入”,重复以上过程,直到触达最高价值目标。整个过程需要保持记录,哪个IP、哪个账号、用了什么手法成功的,这是为了后面应急响应和复盘时有据可查。
3.2 关键实操参数与判断依据
实操中最容易踩坑的几个参数,我先列出来,都是实战中摸过的。
第一个是SMB连接的端口条件。IPC连接依赖目标机器的445端口开放,同时依赖账号对目标机器的ADMIN$共享有访问权限。如果没有权限,即使网络通,也会报错“拒绝访问”。所以后半段报错看权限,前半段报错看网络和端口。
第二个是计划任务命令的语法细节。schtasks的/tr参数会将整个命令字符串提交给目标机器的shell去执行,所以如果命令中包含空格或特殊字符,务必用双引号包裹整个命令,并考虑目标机器的可执行文件路径(比如C:\Windows\Temp\xxx.exe)。我用过一个很经典的坑:命令里带了管道符号,结果在目标机器上被解析错误,目标机器根本没有执行成功。遇到这种情况,最简单的处理方式是把命令写成批处理文件传到目标机器,再让计划任务去调用这个批处理文件。
第三个是防火墙对横向移动的影响。Windows自带防火墙默认会阻止一些远程管理端口,但内网很多管理员会直接关闭防火墙或放行特定网段,这给了横向移动很大的操作空间。我见过一个很典型的场景,目标机器在域内,防火墙放行了域内的远程桌面和SMB端口,但攻击者用的是非域账号,此时就算放行了端口,认证也会失败。判断“网络通不通”和“认证过不过”是两个完全不同的概念,一定要分开排查。
3.3 一个典型的域内横向移动过程
我简单描述一次受控演练中的实操过程,让大家有个整体感觉。
假设我们已经通过Web漏洞拿下了内网里的一台Windows Server(且称它A机),现在想横向到目标B机(B机是文件服务器)。步骤是这样的:
先在A机上执行whoami和ipconfig,确认当前用户是本地账户还是域账户。如果是域账户,横向的权限边界会宽很多。接着用net group "Domain Admins" /domain查看域管理员组里有谁,再用dir \\B机IP\c$测试是否有权限直接访问B机的C盘共享。如果直接成功,说明当前账号权限很大,可以尝试直接复制payload过去并远程创建服务或计划任务执行。如果失败,就回到A机整理抓取的哈希和票据,利用哈希传递的方式尝试。
在受控环境里,我最常走的路径是:A机抓取账号哈希,哈希传递到B机,B机上用同样的方式继续跳。整个过程不需要输入任何明文密码,也不涉及爆破,风险在于每一次哈希传递都可能在目标机器的安全日志中留下“异常登录类型”的记录,防守方如果做了登录来源与登录类型的关联分析,我们是很容易暴露的。
3.4 各系统机制横向移动对照
为了让大家快速比较各种横向移动方式的特点,我把常用的几种列成一个表:
| 机制 | 依赖条件 | 优点 | 主要风险 / 检测点 |
|---|---|---|---|
| IPC + 计划任务 | 目标开放445/135,账号有本地管理员权限 | 无需落地服务、适配性强 | 事件ID 5145(网络共享对象访问)、计划任务创建事件 |
| WMI 远程执行 | 目标开放135,账号有本地管理员权限 | 可以远程执行命令、查询信息 | 事件ID 4648(显式凭据登录尝试)、WMI进程创建 |
| PowerShell 远程会话 | WinRM开启(5985/5986),账号是本地管理员或远程管理用户 | 交互式命令执行、无需额外服务 | PowerShell 日志 4104(脚本块日志)、5985/5986连接 |
| 远程桌面 | 目标开放3389 | 直观、可以操控桌面 | 4624/4625登录事件、远程桌面连接日志 |
| 哈希传递 | 账号NTLM哈希,目标开放SMB | 无需明文密码、工具成熟 | 4624登录事件中登录类型为3且目标账号是管理员 |
| 票据传递 | 有域内服务票据或TGT | 隐蔽性强、可跨服务访问 | Kerberos相关事件,尤其是异常的TGS请求 |
| SSH密钥复用 | 私钥文件泄露,目标开放22 | 无需密码、Linux环境常用 | SSH登录记录、~/.ssh/authorized_keys的变化 |
不同的场景适合不同的方式。如果目标是域内一台老旧的Windows 7机器,那么IPC+计划任务往往是最省事的;如果目标网段做了端口白名单,只放行了HTTP/HTTPS,那可能得想办法用Web应用去执行命令;如果当前机器是一台Linux跳板机,那么SSH密钥复用和代理转发就是核心手段。
3.5 防护视角下,这些实操如何被看见
把上面这些实操放在防守视角下看,有几类检测点值得反复强调。
第一类是认证日志中的登录类型异常。普通工作人员在内网里,大多通过网络访问共享文件或浏览器打卡系统,很少会频繁用管理员账号远程登录服务器。所以登录类型为3(网络登录)且账号是管理员组的用户,就是横向移动的高频特征。防守团队如果只关注“告警日志”而没建立“登录矩阵基线”,就很难发现这种异常。
第二类是Windows事件日志中的特定事件ID。比如远程PowerShell会留下WMI活动的痕迹,计划任务执行会留下对应的创建和启动事件,微软自己的安全基线文档里都列了这些关键事件ID。前提是防守方要提前开启相关日志的审计策略,生产环境里我看到很多机器默认连“审核登录事件”都没开,啥都记录不下来。
第三类是流量侧的检测。在横向移动过程中,攻击者会在短时间内向多台目标机器发起SMB连接或RPC调用,这些连接如果做成“源IP到目标IP”的图谱,一眼就能看出攻击路径。很多高级威胁检测系统就是基于这种“引导式横向移动路径”来告警的。
4. 常见问题与排查技巧实录
做横向移动相关的工作,绝大多数时间其实花在排查问题而不是“打进去”上。我把这几年遇到频率最高的问题整理出来,每个都附带排查思路。
4.1 为什么共享连接不上
最常见的原因有三个:
第一种是账号或密码错误。不要只看提示是“拒绝访问”还是“找不到网络路径”。如果是“拒绝访问”,大概率是认证没通过,账号权限不足或密码错误;如果是“找不到网络路径”,大概率是网络层面的问题,比如防火墙拦截、网段隔离、目标机器没开机。
第二种是目标机器域名解析异常。在域环境下,如果用机器名访问,而当前机器DNS拿不到目标机器的正确IP,也会导致连接失败。解决方法是优先用IP连接,或者先ping一下确认目标机器在线。
第三种是杀软或终端管控拦截。很多内网主机安装了终端安全软件,默认会拦截SMB远程连接中执行的计划任务。这种情况下,报错往往是“创建任务成功但运行失败”,排查日志时会发现是终端防护拦截了创建进程。
4.2 目标机器在线,但端口探测不到
这种情况常见于跨网段场景,当前机器与目标机器之间隔了防火墙或ACL。很多攻击者在这里犯的错误是无脑全端口扫描,动静非常大。建议先做一次简单的内核层探测(Windows下考虑ARP缓存、DNS记录,Linux下可考虑traceroute或ping特定网段),先判断网络可达性,再决定是否投入资源去扫端口。网络层不通的情况下,不管用什么高级手法都是白搭。
另一种可能是目标机器开启了防火墙但允许特定IP访问。有些内网主机会设置“仅允许特定管理网段访问我的445或3389端口”,如果当前机器不在这个白名单里,即使两台机器同一网段,端口也是“黑洞”状态。遇到这种场景,需要先从信息收集阶段找到一台在目标网段或具备管理权限的中间机器,再借助它完成跳转。
4.3 拿到了管理员哈希,横向还是失败
这个坑我见过很多很多次。原因通常是下面两个:
第一,目标机器不是这个哈希所属账号可登录的机器。简单说,哈希是域管理员的,但服务器本地安全策略里限制了域管理员在本地登录的权限,或者用户账户控制(UAC)开启了本地管理员过滤。这种情况下哈希传递或令牌模拟都不会成功。
第二,SMB签名未开启或开启策略不匹配。有些横向移动攻击工具在做哈希传递时,依赖SMB签名关闭或可协商,如果目标机器强制开启SMB签名,工具会直接失败。处理方式是换用其他支持SMB签名协商的方案,或重新选择系统机制。不要死磕一个工具,横向移动的“备用方案”越多越好。
4.4 防守方最容易漏掉什么
从这些年参与应急响应的经验看,防守方最容易漏掉的点,是“非Windows系统上的横向移动”。很多安全团队把大量精力放在监控Windows日志上,结果攻击者拿到一台Linux或网络设备(比如交换机、路由器控制台),直接用SSH密钥或运维管理账号横向移动,防守方根本没有日志可查。
还有一个容易漏掉的点是“共享目录”。很多企业内网会把大量敏感文件放在共享目录里,而且共享目录对所有域用户可读,不设置任何访问限制。攻击者拿到任意域账号后,根本不需要横向到数据库,光是下载共享里的备份文件、配置文件就能拿到大量明文凭据。这部分已经算是横向移动思路的自然延展了,如果你把共享权限做收敛,攻击者能跳的范围立刻缩水一大截。
4.5 排查技巧速查表
| 现象 | 排查步骤 | 常见原因 | 推荐解法 |
|---|---|---|---|
| 共享连接报“拒绝访问” | 检查账号和目标机器的本地管理员组成员关系 | 非管理员账号尝试IPC连接 | 换用管理员账号或哈希传递 |
| 计划任务创建成功但执行失败 | 检查目标机器的时间、路径、杀软拦截日志 | 命令含特殊字符或路径错误、杀软拦截 | 用双引号包裹命令,或改为批处理文件 |
| 远程桌面连不上 | 确认3389是否放行、账号是否能远程登录 | 防火墙拦截或远程桌面服务未启动 | 改用WinRM或其他系统机制 |
| WMI执行无响应 | 检查135端口是否可达、账号权限 | 防火墙拦截RPC动态端口 | 启用WinRM或计划任务方案 |
| 哈希传递失败 | 确认目标机器是否开启SMB签名 | SMB签名强制开启 | 更换工具或协商强制签名 |
| SSH密钥登不上 | 检查~/.ssh/authorized_keys和私钥权限 | 管理员更改了密钥或私钥权限过宽 | 改用密码认证的运维账号 |
4.6 经验心得:横向移动的“度”与“道”
最后再写一点个人的真实体会,不算方法论,只当交流。
第一,横向移动最忌讳贪心。很多攻防演练里的攻击者,从第一台机器拿下之后,就急着把所有网段摸一遍,结果在信息收集阶段就把防守方的流量分析设备打满了。好的横向移动是“少而准”,每走一步都要有明确目的。我在实际演练中,宁可多用一两个小时做凭据整理和拓扑梳理,也不愿意在目标网段里反复扫。
第二,攻击思维不等于恶意,防守思维也必须有攻击视角。这一点听起来像套话,但在横向移动这个具体领域尤其明显。如果不理解攻击者是怎么利用计划任务、怎么复用哈希、怎么用WMI做远程执行的,就算把日志全部保留下来,也不知道该看哪些关键字段。反过来,一旦理解了这些机制,再看安全设备上的告警,会有一种“对上了”的感觉。
第三,横向移动最后拼的永远不是某个“神器”级别的工具,而是对系统机制的理解深度。Windows和Linux各自的认证体系、端口依赖、权限模型,这些东西理解了,哪怕手边只有系统自带命令,也能完成很好的实验路线。我在给团队做分享时经常说,能用系统原生命令和机制解决的问题,就不要依赖外部工具,因为这样最不容易被已知特征拦截。
第四,防护要从“防单机”变成“防路径”。只看一台服务器清没清后门,意义不大。复现攻击者的完整跨机器路径,确认每一个跳板机的凭据和权限都被收回,这才叫闭环。很多安全事件处置失败,说到底就是路径没断干净,攻击者过几天又顺着老路径摸回来了。