原文地址: https://adsecurity.org/?page_id=1821
原文作者: Sean Metcalf
译者注:
由于 原文 中,作者( Sean Metcalf )已经明确的指出 “未经本文作者明确的书面同意,请勿复制包含在此页面的全部或部分内容。” ,因此为了分享此佳作,译者与作者( Sean Metcalf )在推上取得了联系,沟通之后,作者允许我将此文完整翻译并分享给其他人。在此也感谢 Sean Metcalf 大牛将有关 Mimikatz 的全部内容做了系统的整理并分享出来。以下是原文作者(Sean Metcalf)回复的截图,以作授权说明:
Mimikatz 作为当下内网渗透神器之一,看起来似乎很少有人真正关注它的全部功能(Sean Metcalf 在原文开头也表示了这样的疑惑),在一些诸如 “十大黑客工具” 的文章中也看不到 Mimikatz 的影子。 Sean Metcalf 大牛将有关 Mimikatz 的相关技术做了系统的整理,遂做粗糙翻译并作分享。译文难免有误,望各位看官及时指正。
此文是译文的第三部分也是最后一部分。其余两部分的译文链接如下:
下面就介绍一些最流行的 Mimikatz 命令及相关功能。
Mimikatz 的模块如下:
Mimikatz 的 LSADUMP 模块用于与 Windows 本地安全验证(Windows Local Security Authority )(LSA) 进程进行交互来提取凭证数据。这个模块的大多数命令都需要 Debug 权限(privlege::debug) 或者是 SYSTEM 权限。默认情况下,管理员组(Administrators)拥有 Debug 权限,但是依旧需要运行“privilege::debug”进行激活。
需要管理员权限。
需要管理员权限。
获取 SysKey 用于解密 NLKM 和 MSCache(v2)(来自注册表或 hive 文件) 。
向 DC 发起同步一个对象(获取帐户的密码数据)的质询。
需要域管理员,域管理员组或者自定义委派的一个成员权限 。
在 2015 年八月, Mimikatz 加入了一个新的特性—— “DCSync”,可以有效地“假冒”一个域控制器,并可以向目标域控制器请求帐户密码数据。此功能是由Benjamin Delpy 和 Vincent Le Toux 一起编写的。
之前利用 DCSync 的攻击方法是在域控制器上运行 Mimikatz 或 Invoke-Mimikatz 得到 KRBTGT 账户的密码哈希创建黄金票证。如果使用适当的权限执行 Mimikatz 的 DCSync 功能,攻击者就可以通过网络远程读取域控制器的密码哈希,以及以前的密码的哈希,且无需交互式登录或复制 Active Directory 的数据库文件(NTDS.DIT)。
运行 DCSync 所要求的特殊权限有管理员组(Administrators),域管理员组( Domain Admins)或企业管理员组(Enterprise Admins)以及域控制器计算机帐户的任何成员都能够运行 DCSync 去读取密码数据。需要注意的是只读域控制器默认是不允许读取用户密码数据的。
DCSync 是何如工作的:
我之前捕获了一些域控制器复制数据的数据包,并确认了有关域控制器如何复制内部 DC 数据的通讯流。
Samba Wiki 描述了 DSGetNCChanges 函数,如下:
“当第一个得到的 AD 对象从第二个更新时,客户端 DC 会向服务器发送 DSGetNCChanges 请求。响应的数据包含了一组客户端必须应用到其 NC 副本的更新。
当 DC 收到一个 DSReplicaSync 请求后,它会执行一个复制周期,去复制每一个它要复制的 DC (存储在 RepsFrom 数据结构中),此时它的行为就像一个客户端,会发送 DSGetNCChanges 请求到那个所要复制的 DC 去。所以它获得了每个它所复制的 DC 的最新的 AD 对象。
DCSync 选项:
DCSync 命令行示例:
拉取 rd.adsecurity.org 域中的 KRBTGT 用户帐户的密码数据:
Mimikatz "privilege::debug" "lsadump::dcsync /domain:rd.adsecurity.org /user:krbtgt" exit
拉取 rd.adsecurity.org 域中的 Administrator 用户帐户的密码数据:
Mimikatz "privilege::debug" "lsadump::dcsync /domain:rd.adsecurity.org /user:Administrator" exit
拉取 lab.adsecurity.org 域中 ADSDC03 域控制器的计算机帐户的密码数据:
Mimikatz "privilege::debug" "lsadump::dcsync /domain:lab.adsecurity.org /user:adsdc03$" exit
向 LSA Server 质询检索 SAM/AD 的数据(正常或未打补丁的情况下)。可以从 DC 或者是一个 lsass.dmp 的转储文件中导出所有的 Active Directory 域凭证数据。同样也可以获取指定帐户的凭证,如 krbtgt 帐户,使用 /name 参数,如:“/name:krbtgt”需要 Debug 或 SYSTEM 权限。
通常,服务帐户是域管理员组(或同等权限)的一个成员,或者是一个攻击者导出凭证的最近登录到计算机的域管理员用户。使用这些凭证,一个攻击者可以获得DC的访问权限并且能够得到整个域的凭证,包括被用于创建 Kerberos 黄金票证的 KRBTGT 帐户的 NTLM 哈希。
在 DC 中执行此命令可以转储活动目录中域的凭证数据。
需要管理员权限(使用 DEBUG 权限即可)或者是 SYSTEM 权限。
RID 为 502 的帐户是 KRBTGT 帐户,RID 为 500 的帐户是默认的域管理员账户。
下图是运行 LSADUMP::lsa /patch 命令后只导出了 NTLM 密码哈希的执行结果。
LSADUMP::SAM– 获得用于解密 SAM 项目(从注册表或hive中获取)数据的 Syskey。SAM 连接到了本地安全帐户管理器(SAM)数据库并且会转储本地帐户的凭证数据。
需要 SYSTEM 或 DEBUG 权限。
它包含用户密码的 NTLM 和 一些 LM 哈希。此命令可以在两种模式下工作,在线模式(使用 SYSTEM 的用户或token)或者是离线模式(使用 SYSTEM & SAM hives数据 或备份数据)
针对一个“在线”的 SAM 文件,需要管理员权限(使用 DEBUG 权限即可)或者本地 SYSTEM 权限。
获取一个模拟的 SYSTEM 令牌: Mimikatz “PRIVILEGE::Debug” “TOKEN:elevate”
LSADUMP::Secrets– 获取用于解密 SECRETS 项(从注册表或hive数据中获取)数据的 Syskey。
需要 SYSTEM 或 DEBUG 权限。
质询 LSA 服务器检索信任认证信息。
需要 SYSTEM 或 DEBUG 权限。
从活动目录中已有的域信任关系中提取数据。信任的密钥(密码)也将会显示出来。
Mimikatz 的 MISC 模块是一个包含了一些相当不合适的其他的命令。
在这个模块中有几个比较知名的命令, MISC::AddSID, MISC::MemSSP, and MISC::Skeleton 。
MISC::AddSid – 将用户账户添加到 SIDHistory 中。第一个值是目标账户,第二个值是账户/组名称(或 SID)。
需要 SYSTEM 或 DEBUG 。
MISC::Cmd- 命令行提示(无 DisableCMD)。
需要管理员权限。
MISC::Detours– (实验) 尝试使用 Detours HOOK 列举所有的模块。
需要管理员权限。
MISC::MemSSP– 注入一个记录本地身份认证凭证的恶意的 Windows SSP,通过在内存中对 LSASS 进程使用新的 SSP 进行补丁,此操作无需重启,重启会清除 Mimikatz 注入的 SSP。详情请见 《Mimikatz SSP 内存补丁以及更多 SSP 持久化技术》 。
需要管理员权限。
曼迪昂特对 MemSSP 的介绍
MISC::Ncroutemon– Juniper 管理器 (无 DisableTaskMgr)
MISC::Regedit– 注册表编辑器 (无 DisableRegistryTools)
需要管理员权限。
MISC::Skeleton – 在 DC 上将 Skeleton 密钥注入到 LSASS 进程中。
需要管理员权限。
此操作会对 DC 进行补丁,使得所有用户将使用的 “主密码” (又名万能钥匙)以及他们自己通常使用的密码进行身份验证。
MISC::Taskmgr– 任务管理器(无 DisableTaskMgr)
需要管理员权限。
MINESWEEPER::Infos– 提供 minesweeper 的雷达信息。
NET::User
NET::Group
NET::LocalGroup
PRIVILEGE::Debug– 获取 DEBUG 权限。(DEBUG 或 SYSTEM 权限是很多 Mimikatz 命令所需要的权限)
默认情况下:管理员组拥有 DEBUG 权限。但是依旧需要使用 “privilege::debug” 命令进行激活。
DEBUG 权限允许你对一个没有其他方式接触的进程进行调试。例如,一个拥有DEBUG权限的用户进程的令牌可以对一个使用本地 SYSTEM 权限运行的服务进程调试。
http://msdn.microsoft.com/library/windows/hardware/ff541528.aspx
Benjamin 对此命令的备注信息:
如果执行此命令出现 ERROR kuhl_m_privilege_simple ; RtlAdjustPrivilege (20) c0000061 错误,可能你没有使用管理员权限执行此命令。
Mimikatz 的 PROCESS 模块提供了收集进程的数据和与进程进行交互的功能。
PROCESS::Exports– 列出进程可执行文件的导出表
PROCESS::Imports– 列出进程可执行文件的导入表
PROCESS::List– 列出正在运行的进程。
需要管理员权限。
PROCESS::Resume– 恢复一个进程
PROCESS::Start– 启动一个进程
PROCESS::Stop– 结束一个进程
PROCESS::Suspend– 挂起一个进程
SERVICE::List– 列出所有服务
SERVICE::Preshutdown– 预关掉服务
SERVICE::Remove– 卸载服务
SERVICE::Resume– 恢复服务
SERVICE::Shutdown– 关掉服务
SERVICE::Start– 启动一个服务
SERVICE::Stop– 停止服务
SERVICE::Suspend– 挂起服务
Mimikatz 的 SEKURLSA 模块提供了与被保护的内存进行交互的功能。此模块能够从 LSASS(本地安全认证子系统服务) 进程的内存中提取密码,密钥,pin 码,票证。为了能够与 LSASS 进程进行交互,Mimikatz 进程需要适当的权限:
转储 LSASS 进程内存文件,不需要进程权限提升操作。
SEKURLSA::Backupkeys- 获得首选备份的主密钥。
SEKURLSA::Credman– 列出凭证管理器
SEKURLSA::Dpapi– 列出已缓存的主密钥
SEKURLSA::DpapiSystem– 获取 DPAPI_SYSTEM 密文
SEKURLSA::Ekeys– 列出 Kerberos 加密密钥
![p26][288]
SEKURLSA::Kerberos– 列出所有已通过验证的用户(包括服务和计算机帐户)的 Kerberos 凭证。
SEKURLSA::Krbtgt– 获取域 Kerberos 服务帐户(KRBTGT)密码数据
SEKURLSA::LiveSSP– 列出 LiveSSP 凭证
SEKURLSA::LogonPasswords– 列出所有可用的提供者的凭证数据。命令执行结果会显示最近登陆的用户和计算机的凭证。
同样可以使用此命令将使用帐户凭证运行的服务的凭证进行转储。需要注意的是,只有服务正在运行(运行后凭证才会存储在内存中)才可以使用此方式进行转储。
SEKURLSA::Minidump– 切换到“轻量级”转储 LSASS 进程上下文
需要注意的是,Minidumps 是对相同的平台上进行转储的数据进行读取, NT5 Win32 or NT5x64 or NT6 Win32 or NT6 x64。
SEKURLSA::MSV– 列出 LM 和 NTLM 凭证数据
SEKURLSA::Process– 转换到 LSASS 进程上下文
SEKURLSA::Pth– Hash 传递, key 传递
Mimikatz 可以执行众所周知的“Hash 传递”,使用另一个用户密码的 NTLM 哈希上下文代替其真实的明文密码运行一个进程。为此,它会启动一个带有假冒身份信息的进程,之后会替换假信息(假密码的 NTLM 哈希)为真实的信息(真正的密码的 NTLM 哈希)。
Benjamin 对此命令的备注:
Benjamin 发表了一篇关于密钥传递的文章 。
SEKURLSA::SSP- 列出 SSP 凭证。
SEKURLSA::Tickets– 列出最近所有已经过身份验证的用户的可用的 Kerberos 票证,包括使用用户帐户的上下文运行的服务和本地计算机在 AD 中的计算机帐户。
与 kerberos::list 不同的是 sekurlsa 使用内存读取的方式,它不会受到密钥导出的限制。
类似于从 LSASS 中转储凭证数据,利用 SEKURLSA 模块,攻击者可以获取到所有在内存中的 Kerberos 票证数据,包括那些属于管理员或服务的票证。
如果攻击者已经入侵了一台使用 Kerberos 委派配置的 Web 服务器,在用户访问后端的 SQL 服务器时,这是非常有用的。这使得攻击者能够捕捉和重用该服务器上内存中的所有用户的票证。
Mimikatz 的 “kerberos::tickets” 命令可以转储当前已登陆的用户的 Kerberos 票证并且不需要权限提升。利用 SEKURLSA 模块的功能,可以读取被保护的内存(LSASS),在系统中的所有的 Kerberos 票证均可以转储。
下图显示了转储另外一个域管理员(LukeSkywalker)的密码和Kerberos票证(TGS 和 TGT)。
下图显示了转储另外一个域管理员(HanSolo)的密码和Kerberos票证(TGS 和 TGT)。
下图显示了转储一个 SQL 服务帐户(svc-SQLDBEngine01)的密码和Kerberos票证(TGS 和 TGT)。
SEKURLSA::Trust– 获取信任密钥
(我认为此命令已过时,可以使用 lsadump::trust /patch)
SEKURLSA::TSPKG- 列出 TsPkg 凭证。
SEKURLSA::Wdiget– 列出 Wdiget 凭证。
STANDARD::Base64– 转换输出到 Base64 输出
STANDARD::CD– 改变或显示当前文件夹
STANDARD::CLS– 清屏
STANDARD::Exit– 退出 Mimikatz
STANDARD::Log– 记录 Mimikatz 数据到日志文件中
STANDARD::Sleep– 指定毫秒级的延时
STANDARD::Version– 显示版本信息
Mimikatz 的 Token 模块能够与 Windows 身份验证令牌进行交互,包括抓取,伪造假冒的已存在的令牌。
TOKEN::Elevate– 假冒令牌。用于提升权限至 SYSTEM 权限(默认)或者使用 Windows API 找到域管理员令牌。
需要管理员权限。
找到一个域管理员凭证并且使用该域管理员的令牌:
TOKEN::List– 列出系统中所有的令牌
TOKEN::Revert– 恢复进程令牌
TOKEN::Whoami– 显示当前身份信息
TS::Multirdp– (实验) 补丁终端服务器服务允许多个用户连接
VAULT::List– 列出 Vault 凭证