iT邦幫忙

2026 iThome 鐵人賽

DAY 17
0
Security

《朝 HTB CPTS 前進:資安新手的 30 天實作筆記》系列 第 17 篇

Day 17 —Kerberos 認證:TGT 跟 Service Ticket 到底差在哪

  • 分享至 

  • xImage
  •  

前幾天我們認識了 AD 裡的帳號、群組和服務帳號。今天要進到一個重頭戲——Kerberos,現代 Windows 的主要認證機制,前面認識的那些帳號,登入時怎麼被驗證、拿到什麼權限,幾乎都跟它有關。但說真的,之前考 iPAS 的時候,接觸Kerberos 相關的名詞KDC、TGT、TGS、Golden Ticket與機制,超級霧煞煞、有看沒有懂,覺得好亂......

這次搭配實作重新學,也趁著鐵人賽,我希望能跟大家一起把這些相關概念 KO 掉!想了一個自己覺得還蠻好理解的比喻來重新拆解整個流程。而且在想這個比喻的過程中,意外發現它也能順便把相關的攻擊面串起來,好讚!!!

今天就用這個比喻,先輕鬆地看懂它們各自是什麼,再搭配實作,最後也會分享我覺得最容易搞混的地方!

那就開始今天的Kerberos之旅囉~~~


開始我們的 Kerberos 員工之旅

把 Kerberos 想成參加公司的員工日遊樂園之旅。

遊樂園裡不是只有公司的人——那些由公司舉辦的晚會、抽獎、手作區,只有公司員工能參加,一般遊客不行。

而管這些公司活動的櫃台,就是 KDC:負責驗證我們是不是員工(驗證身分)、發手環(TGT)、換票(Service Ticket)。

① 進園:驗身分,換「大會手環」(= 拿到 TGT)
入口的報到組(就是 AS,Authentication Service)刷我們的報到QRCode證明是本人(這步叫 pre-authentication),確認後會發一條證明是我們的大會手環。這條手環就是 TGT(Ticket Granting Ticket)。

  • 手環只證明「我們是公司員工」,進不了任何一場活動
  • 手環上有大會才驗得出的防偽(= krbtgt 帳號的金鑰保護),我們撕不開也不用管

② 換票:拿手環兌換「單場活動券」(= 拿到 Service Ticket)
想去晚會 → 到兌換處(這個窗口叫 TGS,Ticket Granting Service)亮手環說「我要晚會」→ 拿到一張晚會券,也就是 Service Ticket

  • 這張券只進晚會,進不了抽獎區;想去抽獎,再拿手環回來換
  • 晚會券是用晚會專屬的鎖鎖起來的(= 該服務帳號的密碼),只有晚會入口有鑰匙打得開

③ 入場:拿活動券進那一場(= 存取服務)

  • 拿晚會券(Service Ticket)到入口驗 → 工作人員認得 → 放行

https://ithelp.ithome.com.tw/upload/images/20261001/20184189mTkHrHzxfi.png


我們的 Kerberos 員工之旅專業化版:

① AS-REQ   你 → AS      :用「你的密碼」加密時間戳(pre-auth)
② AS-REP   AS → 你      :TGT(由 krbtgt 帳號的金鑰保護)+ 一段用你的密碼加密的 session key
③ TGS-REQ  你 → TGS     :TGT + 想存取的服務 SPN(例 MSSQL/db01)
④ TGS-REP  TGS → 你     :Service Ticket(用該服務帳號的密碼加密)
⑤ AP-REQ   你 → 目標服務:交出 Service Ticket → 服務自己解開驗證 → 放行

KDC 怎麼知道要用哪個帳號的密碼?SPN 登場

讀到步驟④會冒出一個問題:晚會券(Service Ticket)是用「服務帳號的密碼」鎖起來的,那 到底怎麼知道要用哪個帳號的密碼?

答案是 SPN(ServicePrincipalName)——它就是「服務 → 帳號」的對照標籤。

流程是這樣:

  1. 我們跟 KDC 說「我要存取 Exchange」,這個服務其實是用一個 SPN 來表示,例如 exchangeMDB/EXCH01.htb.local
  2. KDC 拿這個 SPN 去 AD 查:哪個帳號註冊了這個 SPN?
  3. 查到對應的服務帳號 → 就用那個帳號的密碼把票鎖起來

實作時間~~~

這是今天在Forest機器拿到的target ip 10.129.95.210

https://ithelp.ithome.com.tw/upload/images/20261001/20184189lab7EpxMl1.png

Step 1:登入 Forest

用前天沒有帳密就列出的帳號 svc-alfresco,搭配破解出的密碼,直接登入:

evil-winrm -i 10.129.95.210 -u svc-alfresco -p s3rvice

https://ithelp.ithome.com.tw/upload/images/20261001/20184189iLZWQuDKNI.png


Step 2:klist——我手上有哪些票證?

進了 shell,先看看我們手上有哪些 Kerberos 票證:(來看看剛剛提到的TGT 跟 Service Ticket 到底長什麼樣)

klist

https://ithelp.ithome.com.tw/upload/images/20261001/20184189nO202B8L51.png

出現錯誤!!!

Current LogonId is 0:0x47a8cbf
Error calling API LsaCallAuthenticationPackage (ShowTickets substatus): 1312

klist failed with 0xc000005f/-1073741729: A specified logon session does not exist. It may already have been terminated.

這是什麼意思......求救一下AI

AI云:

klist 需要存取 Windows 的 LSA(Local Security Authority)API 來讀票證,但 WinRM Network Logon 沒有建立這個 API 可以讀取的 session

就出錯惹QQ


Step 3:Rubeus—換個工具試試看

klist 跑不了,問了 AI,它說可以試試看 Rubeus——這是 Windows 上的 Kerberos 工具,功能比 klist 強很多,可以在 WinRM 的環境下讀票證(耶!!!!!

試著跑看看:

.\Rubeus.exe klist

https://ithelp.ithome.com.tw/upload/images/20261001/20184189FSB2c7AUZk.png

出現

The term '.\Rubeus.exe' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ .\Rubeus.exe klist
+ ~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (.\Rubeus.exe:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
    

Rubeus 不是 Windows 內建的,需要另外上傳QQ

試著從 Kali 傳進去

# 在 evil-winrm shell 裡
upload /opt/Rubeus/Rubeus.exe

https://ithelp.ithome.com.tw/upload/images/20261001/201841897Gb9zcwxRQ.png

upload Rubeus成功後,下

.\Rubeus.exe klist

https://ithelp.ithome.com.tw/upload/images/20261001/20184189S7rP3VfNC3.png

上傳顯示成功,但 Windows 上找不到檔案QQ

先確認剛剛的upload檔案在不在

ls C:\Users\svc-alfresco\Documents\

https://ithelp.ithome.com.tw/upload/images/20261001/201841898L5KoUXR5e.png

ls 輸出裡沒有 Rubeus.exe......

代表上傳失敗了,雖然顯示 Upload successful——但檔案沒有真的傳進來,或是傳到別的地方了QQ

Get-ChildItem -Path C:\ -Recurse -Filter "Rubeus.exe" -ErrorAction SilentlyContinue 2>$null
  • Get-ChildItem:PowerShell 的列出檔案指令,跟 ls 類似
  • -Path C:\:從 C 槽根目錄開始找
  • -Recurse:遞迴搜尋,進到所有子資料夾裡面找
  • -Filter "Rubeus.exe":只找名字叫 Rubeus.exe 的檔案
  • -ErrorAction SilentlyContinue:遇到沒有權限的資料夾不要報錯,直接跳過
  • 2>$null:把錯誤訊息丟掉,不要顯示在畫面上

https://ithelp.ithome.com.tw/upload/images/20261001/20184189nDSXaLacGS.png
還是沒有——Kali 上根本沒有 /opt/Rubeus/Rubeus.exe,要自己下載。

決定自己去 GitHub 下載!

開新的 Kali 終端機,自己去 GitHub 下載:

# 嘗試下載
wget https://github.com/r3motecontrol/Ghostpack-CompiledBinaries/raw/master/Rubeus.exe -O /opt/Rubeus.exe

# 試 chmod
chmod +x /opt/Rubeus.exe

ls /opt/Rubeus.exe

經歷一連串失敗
https://ithelp.ithome.com.tw/upload/images/20261001/20184189xFdQ4GRwL9.png

求救了AI,AI說/opt/需要 root 權限

腦中迸出sudo!!!

sudo wget https://github.com/r3motecontrol/Ghostpack-CompiledBinaries/raw/master/Rubeus.exe -O ~/Rubeus.exe

https://ithelp.ithome.com.tw/upload/images/20261001/20184189pyhu1A67r6.png
https://ithelp.ithome.com.tw/upload/images/20261001/20184189bY9wtdVanQ.png

終於下載成功!上傳到 Forest:

upload /home/[你的路徑]/Rubeus.exe

https://ithelp.ithome.com.tw/upload/images/20261001/20184189FQ7T73wVIe.png

跑 Rubeus klist:

ls
.\Rubeus.exe klist

https://ithelp.ithome.com.tw/upload/images/20261001/20184189H2kx5DRNwg.png
https://ithelp.ithome.com.tw/upload/images/20261001/20184189FR9AShFR0U.png

Action: List Kerberos Tickets (Current User)
[*] Current LUID : 0x5b621a0

票證是空的——沒有任何 TGT 或 Service Ticket。


Step 4:setspn.exe——Domain 裡有哪些 SPN?

Kerberos 票證看不到,但還有事可以做。用 Windows 內建的 setspn.exe 找有 SPN 的帳號(Domain 裡有 SPN的帳號——可是 Kerberoasting 的目標呢!

setspn.exe -Q */*
  • setspn.exe:Windows 內建工具,管理跟查詢 SPN
  • -Q:查詢模式
  • */*:萬用字元,SPN 格式是「服務類型/主機名稱」,*/* 就是查所有的
    setspn.exe 是Windows 內建工具,查詢 Domain 裡所有設定了 SPN 的帳號

出現
https://ithelp.ithome.com.tw/upload/images/20261001/20184189Soz2sNoX7P.png

詳細結果在這兒

Evil-WinRM* PS C:\Users\svc-alfresco\Documents> setspn.exe -Q */*

Checking domain DC=htb,DC=local
CN=FOREST,OU=Domain Controllers,DC=htb,DC=local
	TERMSRV/FOREST
	TERMSRV/FOREST.htb.local
	exchangeAB/FOREST
	exchangeAB/FOREST.htb.local
	Dfsr-12F9A27C-BF97-4787-9364-D31B6C55EB04/FOREST.htb.local
	ldap/FOREST.htb.local/ForestDnsZones.htb.local
	ldap/FOREST.htb.local/DomainDnsZones.htb.local
	DNS/FOREST.htb.local
	GC/FOREST.htb.local/htb.local
	RestrictedKrbHost/FOREST.htb.local
	RestrictedKrbHost/FOREST
	RPC/236ba33a-7959-4a41-b959-5f82689a0871._msdcs.htb.local
	HOST/FOREST/HTB
	HOST/FOREST.htb.local/HTB
	HOST/FOREST
	HOST/FOREST.htb.local
	HOST/FOREST.htb.local/htb.local
	E3514235-4B06-11D1-AB04-00C04FC2DCD2/236ba33a-7959-4a41-b959-5f82689a0871/htb.local
	ldap/FOREST/HTB
	ldap/236ba33a-7959-4a41-b959-5f82689a0871._msdcs.htb.local
	ldap/FOREST.htb.local/HTB
	ldap/FOREST
	ldap/FOREST.htb.local
	ldap/FOREST.htb.local/htb.local
CN=krbtgt,CN=Users,DC=htb,DC=local
	kadmin/changepw
CN=EXCH01,CN=Computers,DC=htb,DC=local
	IMAP/EXCH01
	IMAP/EXCH01.htb.local
	IMAP4/EXCH01
	IMAP4/EXCH01.htb.local
	POP/EXCH01
	POP/EXCH01.htb.local
	POP3/EXCH01
	POP3/EXCH01.htb.local
	exchangeRFR/EXCH01
	exchangeRFR/EXCH01.htb.local
	exchangeAB/EXCH01
	exchangeAB/EXCH01.htb.local
	exchangeMDB/EXCH01
	exchangeMDB/EXCH01.htb.local
	SMTP/EXCH01
	SMTP/EXCH01.htb.local
	SmtpSvc/EXCH01
	SmtpSvc/EXCH01.htb.local
	WSMAN/EXCH01
	WSMAN/EXCH01.htb.local
	RestrictedKrbHost/EXCH01
	HOST/EXCH01
	RestrictedKrbHost/EXCH01.htb.local
	HOST/EXCH01.htb.local

Existing SPN found!
*Evil-WinRM* PS C:\User

看完發現一件事:

Forest (DC 系統服務的 SPN)——機器帳號密碼是 Windows 自動產生、定期輪換的,較不會有「太久沒換」的問題。

krbtgt——密碼隨機產生,Kerberoasting 幾乎不可能破解。

EXCH01——電腦帳號,密碼通常也會被要求定期變更,不是最好的目標。

真正甜的目標是人工設定密碼的使用者服務帳號——像 svc-alfresco 這種,密碼是人工設的,比較可能有弱密碼之類,這才是 Kerberoasting 最好下手的地方。但 svc-alfresco 在 setspn.exe 的輸出裡根本沒出現——svc-alfresco 沒有 SPN。


好怪!服務帳號svc-alfresco沒有SPN?

其實服務帳號不一定有 SPN——SPN 只有在「這個帳號被 Kerberos 認證機制直接用到的服務」才需要設定。

svc-alfresco 跟 Exchange 有關,但兩個角色不一樣:

  • EXCH01(電腦帳號):Exchange 伺服器本身,SPN 設在這裡——「我是提供 Exchange 服務的機器」
  • svc-alfresco(使用者服務帳號):負責執行 Exchange 程序的帳號,但在這個環境裡沒有設定 SPN
    所以 SPN 在電腦帳號 EXCH01 上,不在 svc-alfresco 上。

Step 5:PowerView Get-DomainUser -SPN——只看使用者帳號的 SPN

PowerView.ps1 是什麼?

PowerShell 寫的 AD 列舉工具

先在 Kali 找它:

find / -name "PowerView.ps1" 2>/dev/null

- find /:從根目錄開始找

  • -name "PowerView.ps1":找名字叫 PowerView.ps1 的檔案
  • 2>/dev/null:把錯誤訊息丟掉,不要顯示「Permission denied」這種雜訊

https://ithelp.ithome.com.tw/upload/images/20261001/201841891GMfwb57h2.png

找到路徑之後,就可以用 evil-winrm 上傳到 Forest:

upload /usr/share/windows-resources/powersploit/Recon/PowerView.ps1

https://ithelp.ithome.com.tw/upload/images/20261001/20184189S9RsIzYNWq.png

奇怪!!!剛剛才看到他的路徑,為什麼不能把它upload到Forest???
齁......查了資料後發現,evil-winrm 把路徑開頭的 / 跟家目錄拼在一起了 QQ

先在 Kali 把 PowerView 複製到家目錄:

cp /usr/share/windows-resources/powersploit/Recon/PowerView.ps1 ~/PowerView.ps1

https://ithelp.ithome.com.tw/upload/images/20261001/201841897pjmTZVI03.png

upload /home/[你的路徑]/PowerView.ps1

https://ithelp.ithome.com.tw/upload/images/20261001/20184189P2otBdmbD3.png

上傳成功後跑:

Import-Module .\PowerView.ps1
Get-DomainUser -SPN | Select SamAccountName, ServicePrincipalName

https://ithelp.ithome.com.tw/upload/images/20261001/20184189KnG5epgC40.png

只有 krbtgt——EXCH01

超怪!!!我又向AI發問了 xddd
為什麼跟 setspn.exe 不一樣?
原來!!!

  • Get-DomainUser -SPN:只找使用者帳號有 SPN 的
  • setspn.exe -Q */*:找所有物件(包含電腦帳號)有 SPN 的
    EXCH01 是電腦帳號,不是使用者帳號,所以 Get-DomainUser 找不到它><

本日回顧

終於對 Kerberos 機制、相關名詞不再那麼陌生了!!!

Day 15 做 AS-REP Roasting 時,只知道「拿到 hash,趕快用 hashcat 破解」,現在才知道那個 hash 是什麼~

它可是 KDC 回傳的 AS-REP 裡,用 svc-alfresco 密碼相關的金鑰加密的部分
不是 TGT 本身喔——TGT 是用 krbtgt 帳號的金鑰保護的!很難直接破解 xddd)

也終於知道為什麼這個東西可以拿去給 Hashcat 做離線破解——
因為我們拿到的是可以用來驗證密碼猜測結果的加密資料,不用一直跟 KDC 互動,就能在自己的機器上慢慢猜 ><

之所以能順順利利拿到 ><
是因為 svc-alfresco 開了 DONT_REQUIRE_PREAUTH——
KDC 不要求這個帳號先完成 Kerberos Pre-Authentication,因此攻擊者可以取得 AS-REP,再把它拿去做離線密碼猜測(太可怕了 QQ

一開始我還把 TGT 跟 Service Ticket 一直搞混——
後來用「Kerberos 員工日遊樂園之旅」來思考,真的釐清超級多~~~希望大家也有同感 ><

明天進入攻擊手法——Kerberoasting 與其他幾個 AD 常見攻擊的超級比一比 👀
我們明天見!!!


上一篇
Day 16 — 使用者、群組、服務帳號:誰有什麼權限?
系列文
《朝 HTB CPTS 前進:資安新手的 30 天實作筆記》 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言