1. 横向移动的本质与攻防逻辑拆解
1.1 为什么拿到一台机器只是开始
很多人做内网演练时,拿到第一台机器的权限就以为大功告成,实际上那只是拿到了入场券。横向移动的核心目标是在已经控制一台主机的基础上,把权限扩展到内网中其他更有价值的目标上。这件事之所以成立,根本原因在于内网环境天然存在信任关系——域控信任域内主机、主机信任同网段邻居、运维终端信任被管服务器。攻击方要做的就是沿着这些信任链条,从低价值节点跳到高价值节点。
从防守视角看,横向移动检测之所以困难,是因为它产生的流量和正常运维行为高度相似。一个运维人员用远程桌面连服务器,和一个攻击者用同样协议跳板,在网络层看起来几乎一样。所以理解横向移动,不能只盯着工具,而要理解协议本身的设计缺陷和认证机制的薄弱环节。
1.2 横向移动的三大支柱:认证、协议、凭据
横向移动的底层逻辑可以拆成三个关键词:认证、协议、凭据。认证决定了你能不能连上目标,协议决定了你用什么通道连,凭据决定了你以什么身份连。这三者缺一不可。
认证层面,内网最常用的是NTLM和Kerberos两套体系。NTLM的缺陷在于哈希传递——攻击者不需要明文密码,只要拿到NTLM哈希就能完成认证。Kerberos虽然更安全,但票据传递和委派配置不当同样会出问题。协议层面,SMB、WMI、WinRM、RDP、DCOM各有各的适用场景和检测特征。凭据层面,内存抓取、注册表导出、凭据文件搜索是三大主要来源。
注意:横向移动的每一步都会在目标机器上留下日志。事件ID 4624登录类型3(网络登录)和类型10(远程交互登录)是防守方重点监控对象。攻击方需要考虑日志清理,但清理本身也会产生日志,这是个悖论。
1.3 攻防视角的差异与统一
攻击方关注的是路径最短、动静最小、成功率最高。防守方关注的是异常登录、异常进程、异常网络连接。这两者的交汇点在于:任何横向移动都必然产生认证事件和网络连接。所以真正有效的防守不是封堵某个工具,而是建立行为基线,识别偏离基线的认证模式。
我在实际演练中最大的体会是:横向移动的成功率不取决于工具多先进,而取决于对目标内网拓扑和认证体系的理解深度。一个对域结构了如指掌的人,用最基础的工具也能打通;一个只会无脑扫段的人,给他再好的工具也是碰运气。
2. 核心协议与工具选型深度解析
2.1 SMB与PsExec:经典但不再隐蔽
SMB协议是横向移动的元老级通道。PsExec的工作原理是通过SMB写入一个服务二进制文件到目标机器的ADMIN$共享,然后通过服务控制管理器远程创建并启动服务,服务运行后建立命名管道回连。这个过程会留下明显的痕迹:服务创建事件(事件ID 7045)、PSEXESVC服务名、ADMIN$共享写入记录。
为什么PsExec至今仍在用?因为它稳定、通用、不需要目标机器额外开放端口。但它的缺点同样致命:服务创建日志几乎无法避免,而且PSEXESVC这个服务名太出名了,稍微有点安全意识的防守方都会监控。
替代方案是使用impacket套件中的smbexec.py或atexec.py。smbexec通过创建服务来执行命令,但不落地二进制文件,而是直接调用cmd.exe或powershell.exe。atexec则利用任务计划程序执行命令,留下的是任务计划相关日志。这两个工具比PsExec隐蔽一些,但原理相同,检测思路也类似。
2.2 WMI与WinRM:系统原生通道的利用
WMI(Windows Management Instrumentation)是Windows系统管理的核心组件,几乎每台Windows机器都默认开启。通过WMI执行远程命令,调用的是Win32_Process类的Create方法。这个过程不落地文件,不创建服务,看起来比PsExec干净很多。
但WMI的问题在于:它需要目标机器的防火墙允许RPC动态端口。在域环境中,域控和成员服务器之间通常开放这些端口,但在跨网段场景下经常被阻断。另外,WMI执行命令后,进程的父进程是WmiPrvSE.exe,这个特征在Sysmon日志中非常明显。
WinRM(Windows Remote Management)基于5985/5986端口,是PowerShell Remoting的底层协议。它的优势在于加密传输、支持会话保持、可以执行复杂脚本。缺点是默认不开启,需要目标机器运行WinRM服务。在域环境中,很多管理员会通过组策略批量开启WinRM,这反而给攻击方提供了便利。
| 工具/协议 | 默认端口 | 落地文件 | 主要日志痕迹 | 适用场景 |
|---|---|---|---|---|
| PsExec | 445 | 是 | 服务创建7045 | 通用,但易检测 |
| smbexec | 445 | 否 | 服务创建7045 | 需要命令回显 |
| atexec | 445 | 否 | 任务计划日志 | 延时执行 |
| WMI | 135+动态 | 否 | WmiPrvSE父进程 | 域内横向 |
| WinRM | 5985/5986 | 否 | WinRM操作日志 | 脚本化操作 |
| RDP | 3389 | 否 | 登录类型10 | 图形化操作 |
2.3 RDP与DCOM:图形化与组件化路径
RDP(远程桌面协议)是最直观的横向移动方式,但也是最容易被发现的。登录类型10(RemoteInteractive)在安全日志中非常显眼,而且RDP会话会创建一个新的会话ID,防守方通过监控会话创建就能发现异常。不过RDP的优势在于可以手动操作图形界面,适合需要交互的场景。
DCOM(分布式组件对象模型)是较少人关注的路径。通过DCOM,可以调用MMC20.Application、ShellWindows、ShellBrowserWindow等对象的ExecuteShellCommand方法执行命令。DCOM的检测难度较高,因为它走的是RPC动态端口,而且进程行为看起来像正常的COM组件调用。但DCOM的利用条件也比较苛刻,需要目标机器开放相应的COM接口权限。
2.4 凭据获取:横向移动的燃料
没有凭据,再好的通道也连不上。凭据获取主要有三个来源:内存、注册表和文件系统。
内存抓取最经典的是Mimikatz的sekurlsa模块,它通过读取LSASS进程内存获取明文密码、NTLM哈希和Kerberos票据。但LSASS进程受PPL(Protected Process Light)保护,直接读取会被拦截。绕过PPL需要驱动级操作或利用已知漏洞,难度较高。
注册表方面,HKLM\SAM和HKLM\SECURITY存储着本地账户哈希,但需要SYSTEM权限才能读取。域缓存凭据存储在HKLM\SECURITY\Cache中,默认缓存最近10个域用户的哈希。通过reg save导出后离线破解,是获取域凭据的常用手段。
文件系统方面,组策略首选项(GPP)中的cpassword、unattend.xml中的明文密码、PowerShell历史记录、配置文件中的连接字符串,都是常见的凭据泄露点。我在一次演练中,就是通过搜索共享目录中的配置文件,找到了数据库连接字符串,进而拿到了整个数据库集群的权限。
3. 实操流程与关键环节实现
3.1 信息收集:绘制内网拓扑与信任关系
横向移动的第一步不是急着连目标,而是搞清楚内网长什么样。信息收集的核心是回答三个问题:有哪些机器、哪些机器之间有信任关系、哪些机器上有高价值目标。
基础信息收集从当前机器开始。ipconfig /all看网卡和DNS配置,route print看路由表,net view /domain看域内机器列表,net group "Domain Admins" /domain看域管成员。这些命令都是系统原生的,不会触发告警。
进阶信息收集需要借助工具。BloodHound是目前最强大的域关系分析工具,它通过LDAP查询收集用户、组、计算机、会话、ACL等信息,然后以图形化方式展示攻击路径。BloodHound的价值在于它能发现隐藏的信任关系,比如某个普通用户对某台服务器有AdminTo权限,而那个用户又登录过某台机器,那台机器上缓存了域管凭据——这条路径人脑很难发现,但BloodHound能自动算出来。
实操心得:BloodHound收集数据时会产生大量LDAP查询,在大型域中可能触发告警。建议使用SharpHound的Stealth模式,降低查询频率,或者分时段多次收集。
3.2 凭据窃取与破解:从哈希到明文
拿到初始权限后,第一件事是尝试提权到SYSTEM,然后抓取凭据。提权常用的是令牌窃取和漏洞利用。令牌窃取通过incognito或meterpreter的steal_token命令,窃取高权限进程的令牌。漏洞利用则依赖未打补丁的系统,比如经典的MS16-032、MS17-010等。
提权到SYSTEM后,用Mimikatz抓取凭据。命令是sekurlsa::logonpasswords,它会输出当前系统中所有登录会话的凭据信息。如果LSASS受PPL保护,可以尝试sekurlsa::pth进行哈希传递,或者用procdump导出LSASS内存后离线分析。
对于NTLM哈希,如果目标机器禁用了NTLM认证,哈希传递会失败。这时候需要尝试破解哈希。Hashcat是最常用的工具,对于NTLM哈希,使用模式1000;对于NetNTLMv2,使用模式5600。破解速度取决于密码复杂度和字典质量。我在实际项目中,用rockyou.txt加上规则变形,能破解出大约30%的NTLM哈希。
3.3 横向移动执行:从单点到多点
有了凭据,就可以开始横向移动了。第一步是选择目标。优先选择三类机器:域控、文件服务器、运维跳板机。域控是终极目标,文件服务器上有大量敏感数据,运维跳板机上通常缓存着大量高权限凭据。
第二步是选择通道。如果目标机器开放445端口且允许SMB,优先用smbexec或atexec。如果开放5985端口,用WinRM。如果都不行,尝试WMI或DCOM。RDP作为最后手段,因为动静最大。
第三步是执行命令。以smbexec为例,命令格式是:
python3 smbexec.py domain/user:password@target_ip执行后会获得一个半交互式shell,可以执行系统命令。但smbexec的shell没有回显,需要将命令输出重定向到文件再读取。
WinRM的利用更灵活:
python3 evil-winrm -i target_ip -u user -p passwordevil-winrm提供了一个完整的PowerShell会话,支持文件上传下载、脚本执行、内存加载等操作。它的优势在于所有操作都在内存中完成,不落地文件。
3.4 权限维持与痕迹清理
横向移动成功后,需要考虑权限维持。最简单的是创建本地管理员账户,但容易被发现。更隐蔽的是创建计划任务或服务,定期回连。Kerberos票据是另一种维持方式,黄金票据(Golden Ticket)可以伪造任意用户的TGT,只要域控的KRBTGT哈希没变,票据就一直有效。
痕迹清理是双刃剑。清理安全日志、系统日志、PowerShell操作日志可以延缓被发现的时间,但清理操作本身会产生日志。而且如果清理不彻底,反而会引起怀疑。我的建议是:除非有明确的反取证需求,否则不要轻易清理日志。在演练场景中,保持低调比清理痕迹更重要。
4. 常见问题与排查技巧实录
4.1 连接失败类问题排查
横向移动中最常见的问题是连接失败。失败原因通常有三类:网络不通、认证失败、权限不足。
网络不通的表现是超时或拒绝连接。排查方法是先用ping测试连通性,再用telnet target_ip port测试端口开放情况。如果ping通但端口不通,说明有防火墙拦截。这时候需要换端口或换协议。比如445被封,可以尝试5985;如果5985也封了,尝试135端口的WMI。
认证失败的表现是“登录失败:用户名或密码错误”或“STATUS_LOGON_FAILURE”。排查方法是确认凭据是否正确、目标机器是否允许该认证方式。比如目标机器禁用了NTLM,那哈希传递就会失败,需要改用Kerberos认证。Kerberos认证需要先获取TGT,然后用sekurlsa::ptt注入票据。
权限不足的表现是“拒绝访问”或“STATUS_ACCESS_DENIED”。排查方法是确认当前用户是否有目标机器的管理员权限。在域环境中,Domain Admins组对域内所有机器都有管理员权限,但普通域用户只对部分机器有权限。可以用BloodHound查询当前用户对目标机器的权限。
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 连接超时 | 防火墙拦截 | telnet测试端口 | 换协议或端口 |
| 认证失败 | 凭据错误/协议禁用 | 确认凭据和认证方式 | 换凭据或换Kerberos |
| 拒绝访问 | 权限不足 | BloodHound查权限 | 提权或换目标 |
| 命令无回显 | 通道限制 | 检查工具配置 | 重定向输出到文件 |
| 服务创建失败 | 权限不足/服务被禁 | 检查服务状态 | 换WMI或WinRM |
4.2 告警触发类问题排查
横向移动过程中触发告警是常有的事。常见的告警来源包括:EDR、IDS/IPS、SIEM、蜜罐。
EDR告警通常是因为执行了敏感操作,比如Mimikatz读取LSASS、PsExec创建服务、PowerShell执行可疑脚本。规避EDR的方法是使用白名单工具、内存加载、混淆脚本。比如用Cobalt Strike的beacon代替Mimikatz,用PowerShell的Invoke-Expression加载远程脚本。
IDS/IPS告警通常是因为网络流量特征明显,比如SMB流量中的PsExec特征、Kerberos流量中的异常票据请求。规避方法是加密流量、使用合法协议、降低扫描频率。
SIEM告警通常是因为日志关联分析发现了异常模式,比如同一用户在短时间内登录多台机器、非工作时间登录、登录类型异常。规避方法是模仿正常用户行为,控制操作频率,选择合适的时间窗口。
蜜罐是最难规避的,因为蜜罐本身就是用来诱捕的。识别蜜罐的方法是:检查机器名是否可疑(如HONEYPOT、TRAP)、检查共享目录是否有诱饵文件、检查服务是否异常开放。如果怀疑是蜜罐,立即放弃该目标。
4.3 权限维持类问题排查
权限维持失败通常是因为维持手段被安全软件拦截。比如创建计划任务被EDR拦截、创建服务被组策略限制、写入注册表被权限拒绝。
排查方法是先确认当前权限是否足够。用whoami /priv查看当前令牌的权限,用whoami /groups查看当前用户所属的组。如果权限不足,需要先提权。
另一个常见问题是维持手段被清理。比如创建的计划任务被管理员发现并删除、创建的服务被安全软件禁用。这时候需要多种维持手段并用,比如同时创建计划任务、服务、注册表启动项,增加被完全清理的难度。
实操心得:权限维持的最高境界是让维持手段看起来像正常系统行为。比如创建一个名为“Windows Update Assistant”的计划任务,指向一个合法的系统路径,但实际执行的是回连脚本。这种伪装很难被人工发现,只能靠行为分析。
4.4 跨域横向移动的特殊问题
跨域横向移动比域内横向移动复杂得多。核心难点在于信任关系的类型和方向。域信任分为单向信任、双向信任、外部信任、林信任等。只有信任方向正确,才能跨域认证。
跨域横向移动的第一步是确认信任关系。用nltest /domain_trusts查看当前域的信任列表,用nltest /dclist:target_domain查看目标域的域控列表。如果存在信任关系,可以用当前域的凭据请求目标域的TGT,然后用TGT请求目标域的服务票据。
跨域横向移动的第二步是获取目标域的凭据。如果当前域的用户在目标域有账户,可以直接用该账户认证。如果没有,需要先攻陷当前域的域控,然后利用域控的信任关系跳转到目标域。
跨域横向移动的第三步是执行命令。跨域执行命令和域内类似,但需要注意目标域的认证策略和防火墙规则。有些域之间的防火墙只开放特定端口,需要提前探测。
5. 防守方视角的检测与阻断策略
5.1 认证异常检测
横向移动必然产生认证事件,所以认证异常检测是最有效的防线。重点监控以下几类事件:
事件ID 4624登录类型3(网络登录)和类型10(远程交互登录)。如果同一用户在短时间内对多台机器产生类型3登录,且这些机器之间没有正常的运维关系,就可能是横向移动。如果出现类型10登录,且登录时间不在运维窗口内,也值得怀疑。
事件ID 4648显式凭据登录。这个事件表示使用了显式提供的凭据进行登录,常见于runas、PsExec等工具。如果显式凭据登录的目标是域控或敏感服务器,需要重点排查。
事件ID 4768和4769 Kerberos票据请求。如果同一用户在短时间内请求大量服务票据,且这些服务不在其正常访问范围内,可能是Kerberoasting或票据传递攻击。
5.2 进程与命令检测
横向移动工具在执行时会创建特定进程或执行特定命令。监控这些特征可以有效检测横向移动。
PsExec会创建PSEXESVC.exe进程,服务名是PSEXESVC。smbexec会创建cmd.exe进程,父进程是services.exe。WMI会创建WmiPrvSE.exe进程,父进程是svchost.exe。WinRM会创建wsmprovhost.exe进程。
命令行检测方面,关注包含以下关键词的命令:net use、net group、whoami、ipconfig、systeminfo、tasklist、schtasks、sc create、reg save。这些命令单独出现可能正常,但如果短时间内大量出现,且来自非运维账户,就可能是横向移动的前期侦察。
5.3 网络流量检测
网络层检测主要关注异常连接和异常协议使用。
异常连接包括:内网机器之间的SMB连接突然增多、非域控机器之间的Kerberos流量、非运维终端对服务器的RDP连接。这些都可以通过NetFlow或全流量分析发现。
异常协议使用包括:SMB流量中包含PsExec特征字符串、WMI流量中包含异常查询、WinRM流量中包含可疑脚本。这些需要通过深度包检测(DPI)或协议分析工具发现。
5.4 欺骗与诱捕策略
最主动的防守是诱捕。部署蜜罐账户、蜜罐共享、蜜罐服务,引诱攻击方暴露行为。
蜜罐账户是一个没有实际权限但看起来像域管的账户。如果这个账户被用于登录,那一定是攻击方在尝试横向移动。蜜罐共享是一个包含诱饵文件的共享目录,文件内容看起来像凭据配置,实际是监控陷阱。一旦有人访问这些文件,立即告警。
蜜罐服务是在非标准端口上模拟常见服务,比如在445端口上模拟SMB但实际是监控程序。攻击方扫描到这个端口并尝试连接时,就会被记录。
实操心得:蜜罐的部署要自然,不能太刻意。比如蜜罐账户的命名要符合企业命名规范,蜜罐共享的路径要看起来像正常的部门共享。如果蜜罐太假,攻击方一眼就能识破,反而暴露了防守方的意图。
6. 实战中的经验与避坑指南
6.1 信息收集阶段的常见坑
第一个坑是过度扫描。很多人一进内网就开扫描器全段扫,结果触发IDS告警,被防守方封禁IP。正确的做法是先用系统原生命令做被动收集,比如net view、nltest、arp -a,这些命令不会产生明显的扫描特征。只有在被动收集不够用时,才做小范围主动扫描。
第二个坑是忽略DNS。内网中很多服务是通过DNS名称访问的,如果DNS配置错误,会导致连接失败。排查DNS问题的方法是nslookup测试域名解析,ipconfig /displaydns查看DNS缓存。
第三个坑是不记录收集结果。信息收集的内容很多,如果不及时记录,后面很容易忘记。建议用Markdown或Excel表格记录每台机器的IP、主机名、开放端口、操作系统、已获取的凭据、已尝试的通道。
6.2 凭据获取阶段的常见坑
第一个坑是盲目抓取LSASS。如果LSASS受PPL保护,直接抓取会导致蓝屏或EDR告警。正确的做法是先检查LSASS的保护状态,用Get-Process lsass | Select-Object -ExpandProperty ProtectionLevel查看。如果是PPL,需要先绕过PPL再抓取。
第二个坑是忽略凭据有效期。域用户的密码可能定期更换,抓到的凭据可能已经过期。使用凭据前先用net use或runas测试有效性,避免在横向移动过程中才发现凭据失效。
第三个坑是只关注域管凭据。域管凭据固然重要,但普通域用户的凭据同样有价值。很多普通域用户对特定服务器有管理员权限,通过BloodHound可以发现这些隐藏路径。
6.3 横向移动执行阶段的常见坑
第一个坑是通道选择不当。比如目标机器禁用了NTLM,却用哈希传递去连,必然失败。正确的做法是先探测目标机器的认证策略,用nmap的smb-security-mode脚本或crackmapexec的--shares参数测试。
第二个坑是命令回显问题。smbexec和atexec都没有交互式回显,需要将命令输出重定向到文件再读取。比如cmd.exe /c whoami > C:\Windows\Temp\output.txt,然后用SMB读取该文件。
第三个坑是忽略目标机器的安全软件。如果目标机器安装了EDR,PsExec和Mimikatz很可能被拦截。这时候需要换用更隐蔽的工具,比如Cobalt Strike的beacon、SilentTrinity、或者自定义的PowerShell脚本。
6.4 权限维持阶段的常见坑
第一个坑是维持手段太单一。只创建一个计划任务,被管理员发现后删除就彻底失去了权限。正确的做法是多种维持手段并用,至少保留两条独立的后路。
第二个坑是维持手段太显眼。创建一个名为“Backdoor”的服务,或者一个每小时回连一次的计划任务,很容易被安全软件发现。正确的做法是伪装成正常系统行为,比如创建一个名为“Microsoft Windows Update”的计划任务,回连间隔设置为随机时间。
第三个坑是忘记清理测试痕迹。在权限维持过程中,可能会创建测试文件、测试账户、测试服务。这些测试痕迹如果不清理,会成为防守方追踪的线索。建议在维持手段稳定后,立即清理所有测试痕迹。
6.5 整体OPSEC的注意事项
OPSEC(操作安全)是横向移动的灵魂。再好的技术,如果OPSEC不到位,也会功亏一篑。
时间管理方面,避免在非工作时间操作。很多企业的安全监控在非工作时间会降低告警阈值,但同时也可能有值班人员专门盯着异常。最佳操作时间是工作时间的中间时段,这时候正常流量大,异常行为容易被淹没。
频率控制方面,避免短时间内大量操作。比如不要在一分钟内登录十台机器,不要在一分钟内扫描整个网段。把操作分散到较长时间段内,模仿正常运维节奏。
身份伪装方面,尽量使用已获取的合法凭据,而不是创建新账户。使用合法凭据操作,日志中记录的是合法用户的行为,更难被识别为攻击。如果必须创建账户,账户名要符合企业命名规范,权限要最小化。
日志管理方面,不要轻易清理日志。清理日志本身会产生日志,而且如果清理不彻底,反而会引起怀疑。如果必须清理,只清理与当前操作直接相关的日志,不要大面积清理。
我在多次演练中最大的体会是:横向移动的成败往往不取决于技术,而取决于细节。一个端口没探测清楚、一个凭据没验证有效、一个日志没考虑到,都可能导致整个链条断裂。所以每一步操作前都要问自己三个问题:这一步会产生什么日志?这一步会不会触发告警?这一步失败了有没有备用方案?想清楚这三个问题,横向移动的成功率会大幅提升。