前幾天我們認識了 AD 裡的帳號、群組和服務帳號。今天要進到一個重頭戲——Kerberos,現代 Windows 的主要認證機制,前面認識的那些帳號,登入時怎麼被驗證、拿到什麼權限,幾乎都跟它有關。但說真的,之前考 iPAS 的時候,接觸Kerberos 相關的名詞KDC、TGT、TGS、Golden Ticket與機制,超級霧煞煞、有看沒有懂,覺得好亂......
這次搭配實作重新學,也趁著鐵人賽,我希望能跟大家一起把這些相關概念 KO 掉!想了一個自己覺得還蠻好理解的比喻來重新拆解整個流程。而且在想這個比喻的過程中,意外發現它也能順便把相關的攻擊面串起來,好讚!!!
今天就用這個比喻,先輕鬆地看懂它們各自是什麼,再搭配實作,最後也會分享我覺得最容易搞混的地方!
那就開始今天的Kerberos之旅囉~~~
把 Kerberos 想成參加公司的員工日遊樂園之旅。
遊樂園裡不是只有公司的人——那些由公司舉辦的晚會、抽獎、手作區,只有公司員工能參加,一般遊客不行。
而管這些公司活動的櫃台,就是 KDC:負責驗證我們是不是員工(驗證身分)、發手環(TGT)、換票(Service Ticket)。
① 進園:驗身分,換「大會手環」(= 拿到 TGT)
入口的報到組(就是 AS,Authentication Service)刷我們的報到QRCode證明是本人(這步叫 pre-authentication),確認後會發一條證明是我們的大會手環。這條手環就是 TGT(Ticket Granting Ticket)。
② 換票:拿手環兌換「單場活動券」(= 拿到 Service Ticket)
想去晚會 → 到兌換處(這個窗口叫 TGS,Ticket Granting Service)亮手環說「我要晚會」→ 拿到一張晚會券,也就是 Service Ticket
③ 入場:拿活動券進那一場(= 存取服務)

① 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 → 服務自己解開驗證 → 放行
讀到步驟④會冒出一個問題:晚會券(Service Ticket)是用「服務帳號的密碼」鎖起來的,那 到底怎麼知道要用哪個帳號的密碼?
答案是 SPN(ServicePrincipalName)——它就是「服務 → 帳號」的對照標籤。
流程是這樣:
exchangeMDB/EXCH01.htb.local
這是今天在Forest機器拿到的target ip 10.129.95.210

用前天沒有帳密就列出的帳號 svc-alfresco,搭配破解出的密碼,直接登入:
evil-winrm -i 10.129.95.210 -u svc-alfresco -p s3rvice

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

出現錯誤!!!
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
klist 跑不了,問了 AI,它說可以試試看 Rubeus——這是 Windows 上的 Kerberos 工具,功能比 klist 強很多,可以在 WinRM 的環境下讀票證(耶!!!!!
試著跑看看:
.\Rubeus.exe klist

出現
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

upload Rubeus成功後,下
.\Rubeus.exe klist

上傳顯示成功,但 Windows 上找不到檔案QQ
先確認剛剛的upload檔案在不在
ls C:\Users\svc-alfresco\Documents\

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:把錯誤訊息丟掉,不要顯示在畫面上
還是沒有——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
經歷一連串失敗
求救了AI,AI說/opt/需要 root 權限
腦中迸出sudo!!!
sudo wget https://github.com/r3motecontrol/Ghostpack-CompiledBinaries/raw/master/Rubeus.exe -O ~/Rubeus.exe


終於下載成功!上傳到 Forest:
upload /home/[你的路徑]/Rubeus.exe

跑 Rubeus klist:
ls
.\Rubeus.exe klist


Action: List Kerberos Tickets (Current User)
[*] Current LUID : 0x5b621a0
票證是空的——沒有任何 TGT 或 Service Ticket。
Kerberos 票證看不到,但還有事可以做。用 Windows 內建的 setspn.exe 找有 SPN 的帳號(Domain 裡有 SPN的帳號——可是 Kerberoasting 的目標呢!
setspn.exe -Q */*
setspn.exe:Windows 內建工具,管理跟查詢 SPN-Q:查詢模式*/*:萬用字元,SPN 格式是「服務類型/主機名稱」,*/* 就是查所有的出現
詳細結果在這兒
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 程序的帳號,但在這個環境裡沒有設定 SPNEXCH01 上,不在 svc-alfresco 上。PowerView.ps1 是什麼?
PowerShell 寫的 AD 列舉工具
先在 Kali 找它:
find / -name "PowerView.ps1" 2>/dev/null
- find /:從根目錄開始找
-name "PowerView.ps1":找名字叫 PowerView.ps1 的檔案2>/dev/null:把錯誤訊息丟掉,不要顯示「Permission denied」這種雜訊
找到路徑之後,就可以用 evil-winrm 上傳到 Forest:
upload /usr/share/windows-resources/powersploit/Recon/PowerView.ps1

奇怪!!!剛剛才看到他的路徑,為什麼不能把它upload到Forest???
齁......查了資料後發現,evil-winrm 把路徑開頭的 / 跟家目錄拼在一起了 QQ
先在 Kali 把 PowerView 複製到家目錄:
cp /usr/share/windows-resources/powersploit/Recon/PowerView.ps1 ~/PowerView.ps1

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

上傳成功後跑:
Import-Module .\PowerView.ps1
Get-DomainUser -SPN | Select SamAccountName, ServicePrincipalName

只有 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 常見攻擊的超級比一比 👀
我們明天見!!!