taibeihacker
Moderator
Windows 认证
Windows 本地认证
本地认证基础
在本地登錄Windows 的情況下,操作系統會使用用戶輸入的密碼作為憑證去與系統中的密碼進行驗證,但是操作系統中的密碼存儲在哪裡呢?路徑:%SystemRoot%\system32\config\sam
當我們登錄系統的時候,系統會自動地讀取SAM 文件中的“密碼”與我們輸入的“密碼”進行比對,如果相同,證明認證成功!

這個SAM 文件中保留了計算機本地所有用戶的憑證信息,可以理解為是一個數據庫。
NTLM(NT LAN Manager) Hash
NTLM Hash 是支持Net NTLM 認證協議及本地認證過程中的一個重要參與物,其長度為32 位,由數字與字母組成。Windows 本身不存儲用戶的明文密碼,它會將用戶的明文密碼經過加密算法後存儲在SAM 數據庫中。
當用戶登錄時,將用戶輸入的明文密碼也加密成NTLM Hash,與SAM 數據庫中的NTLM Hash 進行比較。 NTLM Hash 的前身是LM Hash,目前基本淘汰,但是還是存在。
NTLM Hash——产生

admin=209c6174da490caeb422f3fa5a7ae634
admin - hex(16進制編碼)=61646d69e
61646d69e - unicode=610064006d0069006e00
610064006d0069006e00 - MD4=209c6174da490caeb422f3fa5a7ae634
本地认证流程
Windows Logon Process(即winlogon.exe 是Windows NT 用戶登陸程序,用於管理用戶登錄和退出。LSASS 是微軟Windows 系統的安全機制。用於本地安全和登陸策略。

LM Hash
將所有小寫字母轉換為大寫字母123ABC //未達到7個字符
將密碼轉化為16 進制,分兩組,填充為14 個字符,空餘位使用0x00 字符填補
31323341424300000000000000 將密碼分割為兩組7 個字節的塊
31323341424300 000000000000 //16 進制
將每組轉化為比特流,不足56Bit 則在左邊加0
31323341424300 - (轉換為二進制)
11000100110010001100110100001010000100100001100000000-(補足56Bit)
00110001001100100011001101000001010000100100001100000000
將比特流按照7 比特一組,分出8 組,末尾加0
由於後者都為0,結果可想而知,那就都是0;
將每組比特流轉換為16 進製作為被加密的值,使用DES 加密,字符串KGS!@#$% 為Key(0x4B47532140232425),得到8 個結果,每個結果轉換為16 進制。
- 00110000100110001000110001101000000101000001001000001100 00000000
-30988C6814120C00 - DES(30988C6814120C00) - 48-D7-EB-91- 2F-5E-69-7C
由於我們的密碼不超過7 字節,所以後面的一半是固定的:
AA-D3-B4-35-B5-14-04-EE
連接兩個DES 加密字符串。這是LM 哈希。
48-D7-EB-91-2F-5E-69-7C-AA-D3-B4-35-B5-14-04-EE
Windows网络认证
在內網滲透中,經常遇到工作組環境,而工作組環境是一個邏輯上的網絡環境(工作區),隸屬於工作組的機器之間無法互相建立一個完美的信任機制,只能點對點,是比較落後的認證方式,沒有信託機構。假設A 主機與B 主機屬於同一個工作組環境,A 想訪問B 主機上的資料,需要將一個存在於B 主機上的賬戶憑證發送至B 主機,經過認證才能夠訪問B 主機上的資源。
這是我們接觸比較多的SMB 共享文件的案例,SMB 的默認端口是445。
早期SMB 協議在網絡上傳輸明文口令。後來出現LAN Manager Challenge/Response 驗證機制,簡稱LM,它是如此簡單以至很容易就被破解,現在又有了NTLM v2 以及Kerberos。
Challenge/Response
第一步:協商客戶端主要在這一步向服務器確認協議的版本,是v1 還是v2。不止者一點點

第二步:質詢完整過程:
客戶端向服務器端發送用戶信息(用戶名)請求
服務器接受到請求,生成一個16 位的隨機數,被稱之為“Challenge”, 使用登錄用戶名對應的NTLM Hash 加密Challenge (16 位隨機字符),生成Challenge1。同時,生成Challenge1 後,將Challenge (16 位隨機字符)發送給客戶端。 //Net NTLM Hash=NTLM Hash(Challenge)
客戶端接受到Challenge 後,使用將要登錄到賬戶對應的NTLM Hash 加密Challenge 生成Response,然後將Response 發送至服務器端。
第三步:驗證
服務器端收到客戶端的Response 後,比對Chanllenge1 與Response 是否相等,若相等,則認證通過。

使用另外一種方式解讀:
Server 接收到Client 發送的用戶名後,判斷本地賬戶列表是否有用戶名share_user,
如果沒有,返回認證失敗;
如果有,生成Chanllenge,並且從本地查找share_user 對應的NTLM Hash,使用NTLM Hash 加密Chanllenge,生成一個Net-NTLM Hash 存在內存中,並將Chanllenge 發送給Client。
Client 接收到Chanllenge 後,將自己提供的share_user 的密碼轉換為NTLM Hash,使用NTLM Hash 加密Chanllenge,這個結果叫Response,表現形式是Net-NTLM Hash,最後將Response 發送給Server。
Server 接收到Client 發送的Response,將Response 與之前的Net-NTLM Hash 進行比較,如果相等,則認證通過。
注意:
Chanllenge 是Server 產生的一個16 字節的隨機數,每次認證都不同
Response 的表現形式是Net-NTLM Hash,它是由客戶端提供的密碼Hash 加密Server 返回的Chanllenge 產生的結果。
NTLM v2
NTLM v1 與NTLM v2 最顯著的區別就是Challenge 與加密算法不同,共同點就是加密的原料都是NTLM Hash。下面細說一下有什麼不同:
Challenge:NTLM v1 的Challenge 有8 位,NTLM v2 的Challenge 為16 位
Net-NTLM Hash:NTLM v1 的主要加密算法是DES,NTLM v2 的主要加密算法是HMAC-MD5。
//Responder、smbexec
Pass The Hash
在內網滲透中,我們經常會需要抓取管理員的密碼、NTLM Hash,通過蒐集這些信息有助於我們擴大戰果,尤其是在域環境下。什麼是哈希傳遞?
哈希傳遞是能夠在不需要賬戶明文密碼的情況下完成認證的一個技術。
哈希傳遞的作用?
解決了我們滲透中獲取不到明文密碼、破解不了NTLM Hash 而又想擴大戰果的問題。
必要条件
哈希傳遞需要被認證的主機能夠訪問到服務器哈希傳遞需要被傳遞認證的用戶名
哈希傳遞需要被傳遞認證用戶的NTLM Hash
原理分析
要完成一個NTLM 認證,第一步需要客戶端將自己要參與認證的用戶名發送至服務器端,等待服務器端給出的Challenge其實哈希傳遞就是使用用戶名對應的NTLM Hash 將服務器給出的Chanllenge 加密,生成一個Response,來完成認證。
Pass The Hash 能夠完成一個不需要輸入密碼的NTLM 協議認證流程,所以不算是一個漏洞,算是一個技巧。
Pass The Hash的工具:
Smbmap
CrackMapExec
Smbexec
Metasploit
使用CrackMapExec 實現Hash 傳遞:
1
2
3
4
5
6
7
root@kali:~/cache# cme smb 192.168.3.5 -u administrator -H dab7de8feeb5ecac65faf9fdc6cac3a9 -x whoami
SMB 192.168.3.5 445 LIYINGZHEA30B
[*] Windows 7 Ultimate 7601 Service Pack 1 x64 (name:LIYINGZHEA30B)
(domain

SMB 192.168.3.5 445 LIYINGZHEA30B
[+] PAYLOADS\administrator dab7de8feeb5ecac65faf9fdc6cac3a9
(Pwn3d!)SMB 192.168.3.5 445 LIYINGZHEA30B [+] Executed command
Kerberos域认证
Active Directory(活动目录)的概念
Windows 提供了為企業管理資產、服務、網絡對象進行組織化的管理,這非常符合企業架構的管理模式。而承載這些管理機制的就是活動目錄服務。如果要搭建一個域,就需要安裝活動目錄服務。活動目錄服務以域名來劃分域的邊界,域外就不屬於管理範圍了,也就是說,一個域對應一個域名,域之間也可以相互信任。
Active Directory 存儲了有關網絡對象的信息,並且讓管理員和用戶能夠輕鬆地查找和使用這些信息。 Active Directory 使用了一種結構化的數據存儲方式,並以此作為基礎對目錄信息進行合乎邏輯的分層組織。
網絡對象分為:用戶、用戶組、計算機、域、組織單位以及安全策略等。
Active Directory(活动目录)的概念
服務器及客戶端計算機管理:管理服務器及客戶端計算機賬戶, 所有服務器及客戶端計算機加入域管理並實施組策略。用戶服務:管理用戶域賬戶、用戶信息、企業通訊錄(與電子郵件系統集成)、用戶組管理、用戶身份認證、用戶授權管理等,按省實施組管理策略。
資源管理:管理打印機、文件共享服務等網絡資源。
桌面配置:系統管理員可以集中的配置各種桌面配置策略,如: 用戶使用域中資源權限限制、界面功能的限制、應用程序執行特徵限制、網絡連接限制、安全配置限制等。
應用系統支撐:支持財務、人事、電子郵件、企業信息門戶、辦公自動化、補丁管理、防病毒系統等各種應用系統。
在域中,網絡對象可以相互訪問,但是在真實情況中,需要對某些部門的計算機進行限制,例如:銷售部門不能訪問技術部門的服務器。
這個中間就需要Kerberos 認證協議來驗證網絡對象間的權限。
域认证体系 - Kerberoes
Kerberos 是一種網絡認證協議,其設計目標是通過密鑰系統為客戶機/服務器應用程序提供強大的認證服務。該認證過程的實現不依賴於主機操作系統的認證,無需基於主機地址的信任,不要求網絡上所有主機的物理安全,並假定網絡上傳送的數據包可以被任意地讀取、修改和插入數據。在以上情況下,Kerberos作為一種可信任的第三方認證服務,是通過傳統的密碼技術(如:共享密鑰)執行認證服務的。域认证所参与的角色
Kerberos的標誌是三隻狗頭,狗頭分別代表以下角色:Client
Server
KDC(Key Distribution Center)=DC(Domain Controller)
域认证所参与的角色
AD(Account database): 存儲所有client 的白名單,只有存在於白名單的client 才能順利申請到TGTAuthentication Service: 為client 生成TGT 的服務
Ticket Granting Service: 為client 生成某個服務的ticket

從物理層面看,AD 與KDC 均為域控制器(Domain Controller)。
域认证粗略流程
client 向kerberos 服務請求,希望獲取訪問server 的權限。 kerberos 得到了這個消息,首先得判斷client 是否是可信賴的,也就是白名單黑名單的說法。這就是AS 服務完成的工作,通過在AD 中存儲黑名單和白名單來區分client。成功後,返回AS 返回TGT 給client。client 得到了TGT 後,繼續向kerberos 請求,希望獲取訪問server 的權限。 kerberos 又得到了這個消息,這時候通過client 消息中的TGT,判斷出了client 擁有了這個權限,給了client 訪問server 的權限ticket。
client 得到ticket 後,終於可以成功訪問server。這個ticket 只是針對這個server,其他server 需要向TGS 申請。
第一步 Session Key 与 Ticket Granting Ticket



第二步 Session Key 与 Ticket Granting Ticket


第三步 Server Session Key 与 Ticket

白银票据
白銀票據的特點:不需要與KDC 進行交互
需要目標服務的NTLM Hash
在第三步認證中的Ticket 的組成:
Ticket=Server Hash(Server Session Key + Client info + End Time)
當擁有Server Hash 時,我們就可以偽造一個不經過KDC 認證的一個Ticket。
PS:Server Session Key 在未發送Ticket 之前,服務器是不知道Server Session Key 是什麼的。 所以,一切憑據都來源於Server Hash。
伪造白银票据
首先需要導出Server Hash:1
C:\filesmimikatz.exe 'privilege:debug” 'sekurlsa:logonpasswords' 'exit' log.txt
偽造票據:
1
mimikatz “kerberos:golden /domain:域名/sid:域SID /target:目標服務器主機名/service:服務類型/rc4:NTLM Hash /user:用戶名/ptt' exit
Other:
kerberos:list #列出票據
kerberos

由於白銀票據需要目標服務器的Hash,所以沒辦法生成對應域內所有服務器的票據,也不能通過TGT申請。因此只能針對服務器上的某些服務去偽造,偽造的服務類型列表如下:
服務註釋
服務名
WMI
HOST、RPCSS
Powershell Remoteing
HOST、HTTP
WinRM
HOST、HTTP
Scheduled Tasks
HOST
LDAP 、DCSync
LDAP
Windows File Share (CIFS)
CIFS
Windows Remote ServerAdministration Tools
RPCSS、LDAP、CIFS
白银票据(Silver Tickets)防御
盡量保證服務器憑證不被竊取開啟PAC (Privileged Attribute Certificate) 特權屬性證書保護功能,PAC主要是規定服務器將票據發送給kerberos服務,由kerberos服務驗證票據是否有效。
開啟方式:
將註冊表中HKEY_LOCAL_MACHINE\SYSTEM \ CurrentControlSet\Control\Lsa\Kerberos\Parameters中的ValidateKdcPacSignature設置為1
黄金票据(Golden Tickets)
黃金票據特點:需要與DC通信
需要krbtgt用戶的hash
PS:這裡的krbtgt hash就是之前講的KDC Hash

注意:這裡的krbtgt hash就是之前講的KDC Hash
黄金票据(Golden Tickets)-MSF kiwi
使用meterpreter中的kiwi模塊: load kiwi


黄金票据(Golden Tickets) - 伪造
偽造票據:1
mimikatz “kerberos:golden /domain:域名/sid:域SID /rc4:KRBTGT NTLM Hash /user:任意用戶名/ptt' exit
Tickets 总结
黃金票據:從攻擊面來看,獲取krbtgt用戶的hash後,可以在域中進行持久性的隱藏,並且日誌無法溯源,但是需要拿到DC權限, 使用黃金票據能夠在一個域環境中長時間控制整個域。從防禦角度來看,需要經常更新krbtgt的密碼,才能夠使得原有的票據失效。