內網滲透-windows認證
前言:全國HW剛結束,加強一波內網概念,去年11月紅隊成績並不理想,這次必拿下好成績。沖!!!
0x00 本地認證
本地認證基礎知識
在本地登錄Windows的情況下,作業系統會使用用戶輸入的密碼作為憑證去與系統中的密碼進行驗證,但是作業系統中的密碼存儲在哪裡呢?
%SystemRoot%\system32\config\sam
當我們登錄系統的時候,系統會自動地讀取SAM文件中的「密碼」與我們輸入的「密碼」進行比對,如果相同,證明認證成功!
這個SAM文件中保留了電腦本地所有用戶的憑證資訊,可以理解為是一個資料庫。
上面認證的過程只是粗略的說法,整個認證過程並沒有那麼簡單,從作業系統的角度來看,還是需要鋪墊很多概念的。
Windows本身不保存明文密碼,只保留密碼的Hash。
Hash,一般翻譯做「散列」,也有直接音譯為「哈希」的,就是把任意長度的輸入(又叫做預映射pre-image)通過散列演算法變換成固定長度的輸出,該輸出就是散列值。
這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說
就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。為了保證存儲的不是明文,從而採用Hash,但是密碼Hash也需要特定的生成演算法以及表現形式。
NTLM Hash與NTLM
在Windows中,密碼Hash目前稱之為NTLM Hash,其中NTLM全稱是:「NT LAN Manager」。
這個NTLM是一種網路認證協議,與NTLM Hash的關係就是:* NTLM網路認證協議是以NTLM Hash作為根本憑證進行認證的協議。
也就是說,NTLM與NTLM Hash相互對應。
在本地認證的過程中,其實就是將用戶輸入的密碼轉換為NTLM Hash與SAM中的NTLM Hash進行比較。
NTLM Hash的產生
假設我的密碼是admin,那麼作業系統會將admin轉換為十六進位,經過Unicode轉換後,再調用MD4加密演算法加密,這個加密結果的十六進位就是NTLM Hash。
admin -> hex(16進位編碼) = 61646d696e
61646d696e -> Unicode = 610064006d0069006e00
610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634
本地認證流程
winlogon.exe -> 接收用戶輸入 -> lsass.exe -> (認證)
首先,用戶註銷、重啟、鎖屏後,作業系統會讓winlogon顯示登錄介面,也就是輸入框,接收輸入後,將密碼交給lsass進程,這個進程中會存一份明文密碼,將明文密碼加密成NTLM Hash,對SAM資料庫比較認證。
○ Windows Logon Process(即 winlogon.exe),是Windows NT 用戶登 陸程式,用於管理用戶登錄和退出。
○ LSASS用於微軟Windows系統的安全機 制。它用於本地安全和登陸策略。
LM Hash
在NTLM協議問世之前,它對前身就是LM(LAN Manager)協議。
LM與NTLM協議的認證機制相同,但是加密演算法不同。
目前大多數的Windows都採用NTLM協議認證,LM協議已經基本淘汰了。
0x01 網路認證
NTLM 協議
Chalenge/Response
NTLM V2協議
NTLM v1與NTLM v2最顯著的區別就是Challenge與加密演算法不同,共同點就是加密的原料都是NTLM Hash。
下面細說一下有什麼不同:
• Challage:NTLM v1的Challenge有8位,NTLM v2的Challenge為16位。
• Net-NTLM Hash:NTLM v1的主要加密演算法是DES,NTLM v2的主要加密演算法是HMAC-MD5。
需掌握NTLM、NTLM Hash、LM、LM Hash、Net NTLM Hash的概念
NTLM是一種網路認證協議,是以HTLM Hash作為根本憑據進行認證的協議。
NTLM Hash:先hex(16)進位,而後unicode轉換,再MD4加密演算法加密。
與之對應,LM和LM Hash關係一樣,只不過LM被遺棄
而在HTLM 協議中,經過NTLM Hash加密(16位隨機值)的結果稱為Net NTLM Hash
Pass The Hash
·哈希傳遞
哈希傳遞是能夠在不需要賬戶密碼的情況下完成認證的一個技術
·哈希傳遞的作用
解決了獲取不了明文密碼,拿到NTLM Hash無法破解,而又想擴大戰果
需注意,server每次生成的challenge都會變化
pass the hash的工具:
·smbmap
·CrackMapEXEC
·Smbexec
·Metasploit
0x02 Kerberos域認證
Active Directory(活動目錄)概念
Windows提供了為企業管理資產、服務、網路對象進行組織化的管理,這非常符合企業架構的管理模式。而承載這些管理機制的就是活動目錄服務。如果要搭建一個域,就需要安裝活動目錄服務,當然,這個不在我們的討論範圍。
活動目錄服務以域名來劃分域的邊界,域外就不屬於管理範圍了,也就是說,一個域對應一個域名,域之間也可以相互信任。
• Active Directory存儲了有關網路對象的資訊,並且讓管理員和用 戶能夠輕鬆地查找和使用這些資訊。Active Directory使用了一種 結構化的數據存儲方式,並以此作為基礎對目錄資訊進行合乎邏 輯的分層組織。
• 網路對象分為:用戶、用戶組、電腦、域、組織單位以及安全 策略等。
Active Directory(活動目錄)功能
• 軟體集中管理,統一推送軟體,統一安裝網路印表機等。利用軟體發布策略分發軟體,可以讓用戶自由選擇安裝軟體。
• 帳號集中管理,所有帳號均存在伺服器上,方便對帳號的重命令/重置密碼。
• 環境集中管理,利用AD可以統一客戶端桌面,IE,TCP/IP等設置。
• 增強安全性,統一部署殺毒軟體和掃毒任務,集中化管理用戶的電腦許可權、統一制訂用戶密碼策略等,可監控網路,資料統一管理。
• 更可靠,更少的宕機時間。如:利用AD控制用戶訪問許可權,利用群集、負載均衡等技術對文件伺服器進行容災設定,更可靠,宕機時間更少。
• 活動目錄為Microsoft統一管理的基礎平台,其它isa,exchange,sms等服務都依賴於這個基礎平台。
域中,網路對象可以互相訪問,真實情況下,需要對某些進行限制,這個中間就需要kerberos認證協議來驗證網路對象的許可權
域認證體系 – Kerbroes
kerberos是一種網路認證協議,設計目標是通過密鑰系統為客戶機/伺服器應用程式提供強大的認證服務。該認證過程的實現不依賴於主機作業系統的認證,無需基於主機地址的信任,不要求網路上所有的主機的物理安全,並假定網路上傳送的數據包可以被任意的讀取,修改,和插入數據。kerberos作為一種可信任的第三方服務,是通過傳統的密碼技術執行認證服務的。
域認證所參與的角色 (三隻狗頭)
kerberos標誌是三隻狗頭,代表:
·Client
·Sever
·KDC(Key Distribution Center)= DC(Domain Controller)
Kerberos認證協議的基礎概念:
票據(Ticket):是網路對象互相訪問的憑證。TGT(Ticket Granting Ticket):入場券,通過入場券能夠獲得票據,是一種臨時憑證的存在。(類似於cookie)
KDC負責管理票據,認證票據,分發票據,但是KDC不是一個獨立的服務,它由以下服務組成:
·Authentication Service:為client生成TGT的服務
·Ticket Granting Service:為Client生成某個服務的ticket
另外還需要介紹一個類似於本機SAM的一個資料庫:AD,全稱為account database,存儲所有client的白名單,只有存在於白名單的client才能順利申請到TGT。
物理層看,AD和KDC均為域控制器
域認證粗略流程
1.client向kerberos服務請求,希望獲取訪問server的許可權。kerberos得到了這個消息,首先判斷client是否為可依賴,也就是黑名單和白名單的說法。這就是AS服務完成的工作,通過在AD中存儲黑名單還是白名單來區分client。成功後,返回AS返回TGT給Client
2.Client得到TGT後,繼續向kerberos請求,希望獲得訪問server的許可權。kerberos又得到了這個消息,這時候通過client消息中的TGT,判斷出了client擁有了這個許可權,給了client訪問server的許可權ticket
3.clinet得到ticket後,終於可以成功訪問server。這個ticket只是針對這個server,其他server需要向TGS申請
域認證
首先,客戶端需要發送自己的身份資訊到KDC,身份資訊中包含用戶名,KDC根據用戶名在AD中尋找是否在白名單中,然後根據用戶名提取到對應的NTLM Hash
KDC此時生成一個隨機字元串,叫session key,使用用戶名對應的NTLM Hash加密session Key,叫做AS數據,使用KDC中某個用戶的NTLM Hash加密session key和客戶端的資訊,生成TGT
·Session Key用於客戶端向TGS服務通訊
·域內所有網路對象的憑證都在AD中保存
·KDC中某個用戶指的是Krbtgt
數據結構:
TGT的到期時間為8個小時,如果超過了8小時,還需要重新申請TGT,不能之間進入下一步獲取Ticket
Kerberos是一個假設網路環境不安全的情況下能夠正常進行認證工作的協議
第一步中,KDC返回的TGT客戶端是無法進行解密的,因為它沒有KDC Hash,如果有,我們就可以偽造黃金票據
第二步客戶端需要提供TGT與第一步中使用自己NTLM Hash解密出來的Session Key加密的客戶端資訊跟時間戳
如果假設這個數據被中間人竊聽到,也無法在短時間內破解,因為KDC會校驗時間戳
KDC接收到TGT與其他內容後,會首先解密TGT,只有KDC可以解密TGT,從TGT中提取到Session Key,再使用Session Key解密其他內容,解密出來的內容同TGT中的資訊進行校驗來確認客戶端是否受信
驗證通過後,就會生成一個新的Session Key,我們稱之為Sever Session Key,這個Server Session Key,這個Sever Session Key主要用於和放伺服器通訊,同時還會生成一個Ticket,也就是最後的票據了。
Ticket組成:
Server Hash:這個Hash是在AD中伺服器電腦的NTLM Hash
在第三步里,客戶端向伺服器請求,需要提供Ticket,Sever Session Key加密的客戶端資訊與時間戳
·Ticket客戶端無法解密
·伺服器端通過解密Ticket解密Sever Session Key(Client info + Timestamp)
·比較時間長度
校驗通過後,認證成功,該票據會一直存在於客戶端記憶體中
白銀票據(Silver Tickets)
白銀票據特點:
·不需要與KDC進行交互
·需要目標服務的NTLM hash
在第三步認證中的Ticket的組成:
Ticket = Sever Hash(Sever Session Key + Client info + End Time)
當擁有Sever Hash時,我們可以偽造一個不經過KDC認證的一個Ticket
Sever Session Key在未發送Ticket之前,伺服器是不知道sever Session Session Key是什麼。所以,一切青桔都來源於Sever Hash
偽造白銀票據(Silver Tickets)
首先需要導出Sever Hash:
mimikatz.exe “privilege::debug」 “sekurlsa::logonpasswords” “exit” > log.txt
偽造票據:
mimikatz 「kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目標伺服器主機名> /service:<服務類型> /rc4:
other:
·kerberos::list #列出票決
·kerberos::purge #清楚票據
由於白銀票據需要目標伺服器的Hash,所以沒辦法生成對應域內 所有伺服器的票據,也不能通過TGT申請。因此只能針對伺服器 上的某些服務去偽造,偽造的服務類型列表如下:
白銀票據(Silver Tickets)演示
mimikatz抓取
白銀票據(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
這裡的krbtgt hash就是之前講的KDC hash
黃金票據(Golden Tickets)-MSF kiwi
使用meterpreter中的Wiki模組:
load kiwi 創建票據—注入到記憶體中—使用wmic在目標伺服器上創建一個進程
黃金票據(Golden Tickets) – 偽造
偽造票據:
mimikatz 「kerberos::golden /domain:<域名> /sid:<域SID> /rc4:
黃金票據(Golden Tickets) – 演示
偽造黃金票據訪問域內任意伺服器服務
Tickets 總結
·黃金票據:從攻擊面看,獲取krbtgt用戶的hash後,可以在域中進行持久性的隱藏,並且日誌無法進行溯源,但是需要拿到DC許可權,使用黃金票據能夠在一個與環境中長時間控制整個域
·從防禦角度看,需要經常更新krbtgt的密碼,才能使原有的票據失效,最根本的辦法是不允許域管賬戶登陸其他伺服器
·白銀票據:從攻擊來看,偽造白銀票據的難度比偽造黃金票據的難度較小,因為一個域中的伺服器如果對外的話,非常容易被入侵,並且容易被轉儲server
·從防禦角度看,開啟PAC認證,但是會增加DC的負擔,最根本還是得加固伺服器本身對外的服務
0x03 Windows Access Token
Windows Access Token 簡介
Windows Token其實叫Access Token(訪問令牌),它是一個描 述進程或者執行緒安全上下文的一個對象。不同的用戶登錄電腦後, 都會生成一個Access Token,這個Token在用戶創建進程或者執行緒 時會被使用,不斷的拷貝,這也就解釋了A用戶創建一個進程而該 進程沒有B用戶的許可權。
Access Token種類:
• 主令牌
• 模擬令牌
一般情況下,用戶雙擊運行一個程式,都會拷貝「explorer.exe」的Access Token。
當用戶註銷後,系統將會使主令牌切換為模擬令牌,不會將令牌清除,只有在重啟機器後才會清除。
Windows Access Token組成
• 用戶帳戶的安全標識符(SID)
• 用戶所屬的組的SID
• 用於標識當前登錄會話的登錄SID
• 用戶或用戶組所擁有的許可權列表
• 所有者SID
• 主要組的SID
• 訪問控制列表
• 訪問令牌的來源
• 令牌是主要令牌還是模擬令牌
• 限制SID的可選列表
• 目前的模擬等級
• 其他統計數據
Windows Access Token – SID (Security Identifiers)安全標識符
安全標識符是一個唯一的字元串,它可以代表一個賬戶、一個用戶 組、或者是一次登錄。通常它還有一個SID固定列表,例如 Everyone這種已經內置的賬戶,默認擁有固定的SID。
SID的表現形式:
• 域SID-用戶ID
• 電腦SID-用戶ID
• SID列表都會存儲在域控的AD或者電腦本地賬戶資料庫中。
Windows Access Token產生過程
每個進程創建時都會根據登錄會話許可權由LSA(Local Security Authority)分配一個Token(如果CreaetProcess時自己指定了 Token, LSA會用該Token, 否則就用父進程Token的一份拷貝。
Windows Access Token令牌假冒實戰
當用戶註銷後,系統將會使主令牌切換為模擬令牌,不會將令牌清 除,只有在重啟機器後才會清除。
可以使用多種工具查看目前系統上存在的模擬令牌:
• Incognito
• Powershell – Invoke-TokenManipulation.ps1
• Cobalt Strike – steal_token
Windows Access Token令牌假冒實戰
meterpreter > getsystem
meterpreter > load incognito meterpreter > list_tokens –u
Delegation Tokens Available ============================== NT AUTHORITY\LOCAL SERVICENT AUTHORITY\NETWORK SERVICENT AUTHORITY\SYSTEM PAYLOADS\Administrator PAYLOADS\w7
meterpreter > impersonate_token “PAYLOADS\Administrator」
[+] Delegation token available
[+] Successfully impersonated user PAYLOADS\Administrator
Windows Access Token令牌假冒防禦
禁止Domain Admins登錄對外且未做安全加固的伺服器,因為一旦伺服器被入侵,域管理員的令牌可能會被攻擊者假冒,從控制DC。
如果想清除假冒,重啟伺服器即可。
0x04 知識點總結
簡單闡述了Pass the hash,silver Tickets,Impersonation Token的原理,主要是內網中維持許可權,以及提權。