内网横向移动攻防:深入解析Pass the Hash与Pass the Ticket攻击原理与实战

📅 2026/7/27 11:35:20
内网横向移动攻防:深入解析Pass the Hash与Pass the Ticket攻击原理与实战
1. 项目概述理解内网横向移动的“通行证”在真实的内部网络攻防演练或安全评估中攻击者获取初始立足点比如一台普通员工的办公电脑往往只是开始。真正的挑战和风险在于如何从这个小小的“桥头堡”出发像水银泻地一样渗透到整个内网的核心区域比如域控制器、文件服务器、数据库服务器。这个过程我们称之为“横向移动”。而“Pass the Hash”和“Pass the Ticket”就是横向移动技术皇冠上的两颗明珠它们绕过了传统密码验证的壁垒直接利用身份认证的“信物”在网内畅行无阻。你可以把内网的Windows域环境想象成一个高档小区。每个用户计算机或人都有一个唯一的门禁卡密码哈希或Kerberos票据。正常情况下访客攻击者需要知道住户的密码明文密码才能让物业域控制器制作一张临时门禁卡。但PtH和PtT这两种技术其精妙之处在于攻击者根本不需要知道密码。对于PtH攻击者直接捡到了住户丢失的门禁卡母卡密码哈希自己复制了一张对于PtT则是直接偷走了住户已经办好、正在使用的临时门禁卡TGT票据。拿着这些“信物”攻击者就能大摇大摆地进入小区各个楼栋访问其他住户的家门。这个项目的核心就是深入剖析这两种攻击技术的原理、实战应用场景、具体操作手法以及至关重要的如何防御。它不仅仅是工具的使用教程更是对Windows认证体系一次“庖丁解牛”式的理解。无论是红队人员用于提升渗透效率还是蓝队人员用于构建检测防线掌握其中的细节都至关重要。接下来我将结合多年的一线实战经验带你从原理到实操彻底搞懂这两把内网横向移动的“万能钥匙”。2. 攻击原理深度拆解为什么“信物”比“密码”更好用要理解为什么PtH和PtT如此有效我们必须先抛开工具深入Windows身份认证的底层逻辑。很多人觉得这些技术很“黑客”很神秘其实不然它们恰恰是利用了系统设计上的固有特性是一种“特性利用”而非“漏洞利用”。2.1 Windows认证基石NTLM哈希与Kerberos票据在内网中主要存在两种认证协议NTLM和Kerberos。它们代表了两种不同的“信物”形式。NTLM哈希静态的“密码指纹”当你输入密码“Pssw0rd!”时系统并不会存储这个明文而是会用一个算法NT LAN Manager将其计算成一串固定长度的字符串例如32ED87BDB5FDC5E9CBA88547376818D4。这串字符就是NTLM哈希。它是密码的“指纹”或“摘要”。在NTLM认证过程中客户端向服务器证明自己知道密码的方式就是向服务器证明自己拥有这个哈希或能通过它完成一个挑战-应答过程。关键在于在许多情况下系统验证的是你是否拥有正确的哈希而不是你是否知道原始密码。这就为PtH打开了大门我只要拿到你的哈希就能“代表”你。Kerberos票据动态的“临时通行证”在更现代、更复杂的域环境中Kerberos协议是默认选择。它引入了票据Ticket的概念流程更像现实生活中的签证用户用密码向域控制器DC申请一个“长期签证”Ticket Granting Ticket, TGT。当用户想访问某个具体服务如文件共享\\fileserver\share时用TGT向DC申请针对该服务的“短期签证”Service Ticket, ST。用户将ST提交给服务端服务端验证ST的合法性后授予访问权限。这里的TGT和ST都是加密的票据文件。PtT攻击的核心就是窃取并重用这个TGT票据。因为TGT证明了用户已经通过了DC的初始认证拥有了在接下来一段时间内通常8-10小时申请各种服务票据的资格。拿到TGT就等于拿到了在域内自由申请各种服务访问权的“母卡”。2.2 Pass the Hash为何无需明文密码PtH攻击之所以成立基于一个关键事实在NTLM认证的“挑战-应答”机制中应答Response的计算依赖于密码哈希而非密码本身。当攻击者捕获到目标用户的NTLM哈希后他可以在自己的攻击机器上直接使用这个哈希值来计算正确的应答从而通过服务器的验证。服务器端只关心应答是否正确它并不关心这个应答是用明文密码算出来的还是直接用哈希算出来的。注意PtH成功需要几个前提条件目标服务支持NTLM认证SMB、WMI、WinRM等攻击者拥有的哈希必须与目标账户的密码哈希完全一致即账户密码未更改并且目标账户在目标机器上有相应的访问权限如管理员权限。它无法用于基于Kerberos的认证。2.3 Pass the TicketKerberos的信任链滥用PtT攻击则利用了Kerberos协议中的信任传递。TGT票据是由域控制器KDC用其自己的密钥krbtgt账户的哈希加密的。域内所有计算机都信任由域控制器颁发的TGT。因此一旦攻击者通过内存导出如Mimikatz的sekurlsa::tickets或磁盘上的票据文件kirbi格式获取了一个有效的TGT他就可以将这个票据注入到自己当前会话的内存中。之后当他尝试访问域内其他资源时系统会直接使用这个被盗的TGT去申请服务票据整个过程完全绕过了密码验证。更厉害的是“黄金票据”和“白银票据”攻击它们是PtT的进阶形式。黄金票据是伪造TGT需要获取krbtgt账户的哈希从而可以创建任意用户的TGT权限极大。白银票据是伪造ST直接针对特定服务不需要与KDC交互更难检测。3. 实战环境搭建与工具选型在真正动手之前一个贴近真实的实验环境至关重要。我不推荐直接在物理机或公司网络中进行测试使用虚拟机搭建隔离的域环境是最安全、最规范的做法。3.1 实验环境拓扑设计一个最小化的经典实验环境通常包括三台虚拟机域控制器安装Windows Server 2016/2019配置为域控如dc.corp.com同时作为DNS服务器。成员服务器安装Windows Server 2016/2019加入域模拟一台内网应用服务器如server01.corp.com。攻击者机器安装Kali Linux或Windows 10/11不加入域模拟已攻陷的初始跳板机。这台机器需要能通过网络与域内机器通信。所有虚拟机置于同一个虚拟网络如VMware的Host-Only或VirtualBox的内部网络确保网络隔离。为域用户分配不同的权限例如创建一个域管理员admin一个普通域用户user1并在成员服务器上为admin配置本地管理员权限。3.2 核心工具链解析与准备工欲善其事必先利其器。下面这些工具是进行PtH/PtT研究和测试的标配。1. Mimikatz凭证提取与利用的“瑞士军刀”这是绕不开的神器。它主要工作在Windows上用于从lsass.exe进程内存中提取哈希、明文密码和Kerberos票据。获取由于其敏感性杀软会疯狂查杀。在实验环境中需要提前在目标Windows机器上关闭实时防护或使用免杀变种。直接从GitHub官方发布页下载需谨慎。核心命令提取哈希privilege::debug提权 sekurlsa::logonpasswords提取票据sekurlsa::tickets /export传递哈希sekurlsa::pth /user:用户名 /domain:域名 /ntlm:哈希值替代品对于哈希传递impacket套件中的psexec.py、wmiexec.py等脚本同样强大且跨平台。2. ImpacketPython编写的攻击套件这是一个宝藏库用Python实现了大量网络协议客户端特别适合在Linux攻击机上使用。安装pip install impacket核心脚本psexec.py基于SMB的类psexec执行支持PtH。wmiexec.py通过WMI执行命令更隐蔽支持PtH。smbexec.py另一种SMB执行方式。getTGT.py请求Kerberos票据。ticketConverter.py转换票据格式如.kirbi转.ccache。优势无需在目标安装客户端纯协议交互隐蔽性好。3. Rubeus.NET编写的Kerberos专家专注于Kerberos攻击的利器功能强大常用于票据请求、注入、续订和金银票据攻击。核心功能asktgt请求TGT、dump导出票据、ptt传递票据、renew续订票据。使用场景在已获得一定权限的Windows主机上进行Kerberos相关的深度操作。4. Metasploit Cobalt Strike集成化攻击框架对于快速实战和武器化这些框架提供了模块化支持。Metasploitexploit/windows/smb/psexec模块支持PtHpost/windows/gather/hashdump用于抓取哈希kiwiMimikatz的MSF版模块用于凭证操作。Cobalt Strikemake_tokenPtH、kerberos_ticket_usePtT等命令与Beacon完美集成适合团队协作和长期渗透。实操心得在真实环境中工具的使用顺序和选择很有讲究。初期信息搜集可能用impacket系列脚本进行无接触探测获取一个Shell后优先尝试用Mimikatz或Rubeus抓取内存凭证横向移动时根据目标服务开放情况选择psexec445端口、wmiexec135端口或WinRM5985端口。永远要有备选方案。4. 攻击链实操详解从哈希获取到横向移动假设我们已经通过钓鱼、漏洞利用等方式拿下了一台内网普通域用户user1的主机WORKSTATION01。现在我们的目标是横向移动到重要的成员服务器SERVER01。4.1 阶段一信息搜集与凭证窃取首先我们需要在已控主机上搜集尽可能多的信息并尝试提取凭证。1. 权限提升与进程转储上传Mimikatz到WORKSTATION01。运行前需获取Debug权限。以管理员身份运行CMD或PowerShell然后执行# 提升权限 privilege::debug # 如果看到‘Privilege ‘20’ OK’ 则成功 # 转储lsass进程内存中的登录凭证包含哈希和票据 sekurlsa::logonpasswords这条命令会输出当前及历史登录会话的所有信息包括明文密码如果系统启用WDigest或存在其他缓存、NTLM哈希、Kerberos票据等。重点关注域管理员或高权限用户的条目。2. 哈希提取与识别从Mimikatz的输出中找到目标账户比如我们发现admin用户也在此机器登录过的哈希。NTLM哈希通常显示为NTLM: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。完整记录下这个哈希值HASH_ADMIN和对应的域名CORP。3. 票据导出同时我们也可以导出内存中的Kerberos票据以备PtT使用。# 导出所有票据到当前目录的.kirbi文件 sekurlsa::tickets /export导出的文件命名通常包含用户名和服务名例如[0;3e7]-2-0-40e10000-adminkrbtgt-CORP.COM.kirbi这个就是admin用户的TGT票据。4.2 阶段二Pass the Hash 实战应用现在我们有了admin的NTLM哈希假设SERVER01的445端口SMB开放我们可以尝试PtH。方法一使用Mimikatz直接创建访问令牌在WORKSTATION01上使用Mimikatz的pth功能它会创建一个新的命令行窗口其访问令牌中注入了指定的哈希。sekurlsa::pth /user:admin /domain:CORP /ntlm:HASH_ADMIN执行后会自动弹出一个新的CMD窗口。在这个新窗口里任何网络访问如net use,dir \\server01\c$都会使用admin的身份。你可以直接执行dir \\SERVER01\C$如果成功列出目录说明PtH成功admin对SERVER01有管理员权限。随后可以使用sc或psexec远程执行命令。方法二使用Impacket工具从Linux攻击机如果我们的攻击机是Kali可以直接使用Impacket无需在目标安装任何东西。# 使用psexec获取一个交互式shell python3 psexec.py CORP/adminSERVER01 -hashes :HASH_ADMIN # 或者使用wmiexec更隐蔽流量特征与psexec不同 python3 wmiexec.py CORP/adminSERVER01 -hashes :HASH_ADMIN # 使用smbexec执行单条命令 python3 smbexec.py CORP/adminSERVER01 -hashes :HASH_ADMIN whoami在-hashes参数中冒号:前是LM哈希通常为空后面是NTLM哈希。成功后会返回一个具有admin权限的Shell或命令执行结果。4.3 阶段三Pass the Ticket 实战应用如果我们导出的是Kerberos票据攻击流程则有所不同。1. 票据格式转换与注入Mimikatz导出的.kirbi格式需要转换为Linux下Impacket常用的.ccache格式。# 在Linux攻击机上使用ticketConverter.py转换 python3 ticketConverter.py admin.kirbi admin.ccache # 设置环境变量指定使用哪个票据文件 export KRB5CCNAME/path/to/admin.ccache2. 利用票据进行访问设置好环境变量后Impacket的许多脚本在访问域内资源时会自动使用这个票据进行Kerberos认证而无需密码或哈希。# 使用票据请求访问无需密码 python3 psexec.py CORP/adminSERVER01 -k -no-pass # 使用smbclient列出共享 python3 smbclient.py CORP/adminSERVER01 -k -no-pass -c ls参数-k表示使用Kerberos认证-no-pass表示不提供密码。如果票据有效且权限足够命令将成功执行。3. 在Windows上注入票据如果仍在WORKSTATION01的Windows环境下可以直接用Mimikatz将.kirbi票据注入到当前会话。# 注入票据 kerberos::ptt C:\path\to\admin.kirbi # 验证票据是否注入成功 klist注入后当前CMD或PowerShell会话进行的任何Kerberos认证都会使用这张票据。可以尝试访问\\SERVER01\C$或使用dir命令。4.4 攻击路径选择与对抗策略在实际内网中选择哪种方式取决于环境配置网络隔离与端口开放如果目标服务器关闭了SMB445但开放了WinRM5985则PtH可能通过evil-winrm工具进行。认证协议如果域强制使用Kerberos认证通过组策略禁用NTLM那么PtH对许多服务将失效PtT成为主要手段。权限维持获取的TGT票据有有效期通常8小时但可以续订。而NTLM哈希在用户修改密码前一直有效。因此哈希有时是更持久的“后门”。注意事项PtH/PtT攻击会留下明显的日志。PtH会在目标服务器的安全日志中产生事件ID 4624登录成功但登录类型为“3 - 网络”且进程名可能异常。PtT在使用票据时会在域控制器上产生Kerberos票据请求事件ID 4768, 4769事件。高安全环境会监控这些异常登录行为。5. 防御、检测与溯源方案了解了攻击才能更好地防御。防御PtH/PtT是一个体系化工程需要从预防、检测、响应多个层面入手。5.1 预防层面加固认证体系启用Credential Guard这是Windows 10/Server 2016之后引入的硬件安全功能能将lsass进程中的密钥材料哈希、票据隔离在安全的虚拟化容器中使Mimikatz等工具无法直接读取。这是目前最有效的缓解措施之一。限制本地管理员权限实施最小权限原则。域用户尽量不要加入本地管理员组。使用“受保护的用户”组或组策略限制高权限账户在网络上的登录能力。应用LAPS为所有加入域的计算机设置随机的本地管理员密码并定期自动更新。这样即使一台机器被攻陷攻击者获取的本地管理员哈希也无法用于其他机器的横向移动。禁用NTLM认证在域环境中通过组策略逐步禁用NTLMv1并最终禁用所有NTLM认证强制使用Kerberos。这能从根本上杜绝PtH攻击。但需注意兼容性提前做好测试。实施网络分段与防火墙策略严格限制服务器之间、终端与服务器之间不必要的端口访问如445, 135, 5985。特别是域控制器应只允许必要的管理流量。5.2 检测层面监控异常行为防御不可能万无一失因此检测至关重要。安全团队应建立针对这些攻击特征的监控规则。1. 日志监控关键事件ID事件ID日志来源可能指示的攻击行为关键字段分析4624目标服务器安全日志成功的网络登录PtH登录类型3进程名异常如wmiprvse.exe被非系统进程调用源网络地址异常。4672目标服务器安全日志分配了特殊权限如SeDebugPrivilege常伴随Mimikatz的privilege::debug操作。4768域控制器安全日志Kerberos TGT请求AS-REQ关注请求的加密类型如0x17为RC4可能为黄金票据攻击、客户端地址是否异常。4769域控制器安全日志Kerberos服务票据请求TGS-REQ关注服务名是否敏感服务如cifs/、客户端地址、票据选项。4670目标服务器安全日志对象权限被修改可能伴随攻击者尝试添加后门账户或权限。2. 网络流量分析PtH特征大量重复的、失败的NTLM认证尝试后突然出现成功的认证并伴随SMB或WMI命令执行流量。PtT特征Kerberos票据请求TGS-REQ的频率异常或在非工作时间段出现。来自同一客户端的票据请求针对大量不同的服务。3. 终端行为检测监控lsass.exe进程的非法内存读取操作。监控sekurlsa::logonpasswords、mimikatz等关键字符串在进程命令行参数中出现。监控计划任务、服务的异常创建对应psexec或sc远程创建服务。5.3 响应与溯源事件发生后的行动指南一旦检测到疑似PtH/PtT攻击应急响应流程应立即启动。隔离与遏制立即网络隔离被确认攻陷的主机WORKSTATION01和SERVER01防止攻击进一步扩散。证据收集内存取证对受影响主机进行内存转储使用Volatility等工具分析寻找Mimikatz注入的代码、残留的票据或哈希。磁盘取证检查系统日志、Prefetch文件、Recent文件、临时目录寻找攻击工具残留。网络流量抓包如果部署了全流量设备回溯分析攻击时间段的流量还原攻击链。影响评估确定攻击者访问了哪些系统、窃取了哪些数据、植入了哪些后门如持久化计划任务、服务、WMI订阅等。清除与恢复重置所有可能已泄露的账户密码特别是域管理员和krbtgt账户密码重置两次以废止之前颁发的所有票据。清除攻击者创建的后门账户、计划任务、服务等。从干净备份恢复被篡改的系统或彻底重装系统。溯源与加固分析攻击入口点如最初的钓鱼邮件、漏洞修补漏洞并回顾和加强第5.1节提到的预防措施。横向移动的攻防是一场永不停歇的猫鼠游戏。攻击技术不断演进防御理念也需持续更新。理解PtH和PtT不仅是掌握了两项攻击技术更是打开了一扇深入理解Windows安全核心——身份认证体系的大门。对于防守方而言真正的安全不在于堵住每一个漏洞而在于建立纵深的防御体系确保在单点被突破后能迅速检测、响应和遏制将损失降到最低。