文章來源:安全客

原文鏈接:Kerberos協議探索系列之掃描與爆破篇 - 安全客,安全資訊平臺

0x00 前言

Kerberos是一種由MIT(麻省理工大學)提出的一種網路身份驗證協議。它旨在通過使用密鑰加密技術為客戶端/伺服器應用程序提供強身份驗證。

在瞭解Kerberos的過程中,發現很多網站上的相關文章有一些是機器直接翻譯過來的,也有一些寫的比較優秀的文章,但是實操性比較弱,可能第一次瞭解Kerberos的同學會不知道怎麼上手。所以本文主要是通過更詳細的實驗結合原理來說明與Kerberos相關的一些攻擊手法。

本文將分為三篇。第一篇也就是這一篇的內容主要包括域環境和Kerberos協議的說明以及Kerberoasting的攻擊方式。第二篇主要包括MS14068漏洞和Kerberos票據的利用說明。第三篇的內容主要說明關於Kerberos委派的攻擊方式及原理。

0x01域環境

由於Kerberos主要是用在域環境下的身份認證協議,所以在說之前先說下域環境的一些概念。首先域的產生是為瞭解決企業內部的資源管理問題,比如一個公司就可以在網路中建立一個域環境,更方便內部的資源管理。在一個域中有域控、域管理員、普通用戶、主機等等各種資源。

在下圖中YUNYING.LAB為其他兩個域的根域,NEWS.YUNYING.LAB和DEV.YUNYING.LAB均為YUNYING.LAB的子域,這三個域組成了一個域樹。子域的概念可以理解為一個集團在不同業務上分公司,他們有業務重合的點並且都屬於YUNYING.LAB這個根域,但又獨立運作。同樣TEST.COM也是一個單獨的域樹,兩個域樹YUNYING.LAB和TEST.COM組合起來被稱為一個域林。

本文就以根域為YUNYING.LAB的這個域來演示,YUNYING.LAB的域控是DC.YUNYING.LAB,子域NEWS.YUNYING.LAB和DEV.YUNYING.LAB的域控分別為NEWSDC.NEWS.YUNYING.LAB和DEVDC.DEV.YUNYING.LAB。

上面說的都是FQDN(Fully Qualified Domain Name)名稱,也就是全限定域名,是同時包含主機名和域名的名稱。

例:DC.YUNYING.LAB中DC為主機名,域名為YUNYING.LAB,那他的FQDN名稱就是DC.YUNYING.LAB。

如何搭建域環境以及如何建立子域可參考網上的一些說明,這裡放兩個鏈接作為參考。

jingyan.baidu.com/artic

blog.51cto.com/vbers/20

本域中採用的操作系統為Windows Server 2008 R2+Windows 7。

0x02Kerberos簡介

在Kerberos認證中,最主要的問題是如何證明「你是你」的問題,如當一個Client去訪問Server伺服器上的某服務時,Server如何判斷Client是否有許可權來訪問自己主機上的服務,同時保證在這個過程中的通訊內容即使被攔截或篡改也不影響通訊的安全性,這正是Kerberos解決的問題。在域滲透過程中Kerberos協議的攻防也是很重要的存在。

1 Kerberos協議框架

在Kerberos協議中主要是有三個角色的存在:

  1. 訪問服務的Client
  2. 提供服務的Server
  3. KDC(Key Distribution Center)密鑰分發中心

其中KDC服務默認會安裝在一個域的域控中,而Client和Server為域內的用戶或者是服務,如HTTP服務,SQL服務。在Kerberos中Client是否有許可權訪問Server端的服務由KDC發放的票據來決定。

如果把Kerberos中的票據類比為一張火車票,那麼Client端就是乘客,Server端就是火車,而KDC就是就是車站的認證系統。如果Client端的票據是合法的(由你本人身份證購買並由你本人持有)同時有訪問Server端服務的許可權(車票對應車次正確)那麼你才能上車。當然和火車票不一樣的是Kerberos中有存在兩張票,而火車票從頭到尾只有一張。

由上圖中可以看到KDC又分為兩個部分:

Authentication Server: AS的作用就是驗證Client端的身份(確定你是身份證上的本人),驗證通過就會給一張TGT(Ticket Granting Ticket)票給Client。

Ticket Granting Server: TGS的作用是通過AS發送給Client的票(TGT)換取訪問Server端的票(上車的票ST)。ST(Service Ticket)也有資料稱為TGS Ticket,為了和TGS區分,在這裡就用ST來說明。

KDC服務框架中包含一個KRBTGT賬戶,它是在創建域時系統自動創建的一個賬號,可以暫時理解為他就是一個無法登陸的賬號。

2 Kerberos認證流程

當Client想要訪問Server上的某個服務時,需要先向AS證明自己的身份,然後通過AS發放的TGT向Server發起認證請求,這個過程分為三塊:

The Authentication Service Exchange:Client與AS的交互

The Ticket-Granting Service (TGS) Exchange:Client與TGS的交互

The Client/Server Authentication Exchange:Client與Server的交互

(1)The Authentication Service Exchange

KRB_AS_REQ

Client->AS:發送 Authenticator1(Client密碼加密TimeStamp)

第一步Client先向KDC的AS發送Authenticator1,內容為通過Client密碼Hash加密的時間戳、Client ID、網路地址、加密類型等內容。

KRB_AS_REP

AS-> Client:發送Client密碼加密的sessionkey-as 和票據TGT(KRBTGT HASH加密的sessionkey-as和TimeStamp)

在KDC中存儲了域中所有用戶的密碼HASH,當AS接收到Client的請求之後會根據KDC中存儲的密碼來解密,解密成功並且驗證信息。驗證成功後返回給Client由Client密碼HASH加密的sessionkey-as和TGT(由KRBTGT HASH加密的sessionkey-as和TimeStamp等信息)。

(2)The Ticket-Granting Service (TGS) Exchange

KRB_TGS_REQ

Client ->TGS 發送 Authenticator2 (sessionkey-as加密TimeStamp) 和 票據TGT(KRBTGT HASH加密的sessionkey-as和TimeStamp)

Client接收到了加密後的Sessionkey-as和TGT之後,用自身密碼解密得到Sessionkey-as,TGT是由KDC密碼加密,Client無法解密。這時Client再用Sessionkey-as加密TimeStamp和TGT一起發送給KDC中的TGS(Ticket Granting Server)票據授權伺服器換取能夠訪問Server的票據。

KRB_TGS_REP

TGS-> Client發送 密文1(sessionkey-as加密sessionkey-tgs) 和 票據ST(Server密碼HASH加密sessionkey-tgs)

TGS收到Client發送過來的TGT和Sessionkey-as加密的TimeStamp之後,首先會檢查自身是否存在Client所請求的服務。如果服務存在,則用KRBTGT密碼解密TGT。一般情況下TGS會檢查TGT中的時間戳查看TGT是否過期,且原始地址是否和TGT中保存的地址相同。驗證成功之後將用sessionkey-as加密的sessionkey-tgs和Server密碼HASH加密的Sessionkey-tgs發送給Client。

(3)The Client/Server Authentication Exchange

KRB_AP_REQ

Client ->Server 發送 Authenticator3(sessionkey-tgs加密TimeStamp) 和 票據ST(Server密碼HASH加密sessionkey-tgs)

Client收到sessionkey-as加密的sessionkey-tgs和Server密碼HASH加密的sessionkey-tgs之後用sessionkey-as解密得到sessionkey-tgs,然後把sessionkey-tgs加密的TimeStamp和ST一起發送給Server。

KRB_AP_REP

Server-> Client

server通過自己的密碼解密ST,得到sessionkey-tgs,再用sessionkey-tgs解密Authenticator3得到TimeStamp,驗證正確返回驗證成功。

這就是Kerberos認證的流程,篇幅所限所以盡量簡化說明,更詳細的信息可以參考下面鏈接。

tools.ietf.org/html/rfc

3 PAC

在Kerberos最初設計的幾個流程裏說明瞭如何證明 Client是Client而不是由其他人來冒充的,但並沒有聲明Client有沒有訪問Server服務的許可權,因為在域中不同許可權的用戶能夠訪問的資源是有區別的。

所以微軟為瞭解決這個問題在實現Kerberos時加入了PAC的概念,PAC的全稱是Privilege Attribute Certificate(特權屬性證書)。可以理解為火車有一等座,也有二等座,而PAC就是為了區別不同許可權的一種方式。

(1)PAC的實現

當用戶與KDC之間完成了認證過程之後, Client需要訪問Server所提供的某項服務時, Server為了判斷用戶是否具有合法的許可權需要將Client的User SID等信息傳遞給KDC, KDC通過SID判斷用戶的用戶組信息, 用戶許可權等, 進而將結果返回給Server, Server再將此信息與用戶所索取的資源的ACL進行比較, 最後決定是否給用戶提供相應的服務。

PAC會在KRB_AS_REP中AS放在TGT里加密發送給Client,然後由Client轉發給TGS來驗證Client所請求的服務。

在PAC中包含有兩個數字簽名PAC_SERVER_CHECKSUM和PAC_PRIVSVR_CHECKSUM,這兩個數字簽名分別由Server端密碼HASH和KDC的密碼HASH加密。

同時TGS解密之後驗證簽名是否正確,然後再重新構造新的PAC放在ST裏返回給客戶端,客戶端將ST發送給服務端進行驗證。

(2)Server與KDC

PAC可以理解為一串校驗信息,為了防止被偽造和串改,原則上是存放在TGT裏,並且TGT由KDC hash加密。同時尾部會有兩個數字簽名,分別由KDC密碼和server密碼加密,防止數字簽名內容被篡改。

同時PAC指定了固定的User SID和Groups ID,還有其他一些時間等信息,Server 的程序收到ST之後解密得到PAC會將PAC的數字簽名發送給KDC,KDC再進行校驗然後將結果已RPC返回碼的形式返回給Server。

0x03 Kerberos與SPN

1 SPN簡介

服務主體名稱(SPN:Service Principal Names)是服務實例(可以理解為一個服務,比如HTTP、MSSQL)的唯一標識符。Kerberos身份驗證使用SPN將服務實例與服務登錄帳戶相關聯。如果在整個林或域中的計算機上安裝多個服務實例,則每個實例都必須具有自己的SPN。如果客戶端可能使用多個名稱進行身份驗證,則給定服務實例可以具有多個SPN。SPN始終包含運行服務實例的主機的名稱,因此服務實例可以為其主機的每個名稱或別名註冊SPN。

如果用一句話來說明的話就是如果想使用Kerberos協議來認證服務,那麼必須正確配置SPN。

2 SPN格式與配置:

在SPN的語法中存在四種元素,兩個必須元素和兩個額外元素,其中<service class>和<host>為必須元素:

<service class>/<host>:<port>/<service name>

<service class>:標識服務類的字元串

<host>:服務所在主機名稱

<port>:服務埠

<service name>:服務名稱

例:

如果我想把域中一臺主機S2中的MSSQL服務註冊到SPN中則可以使用命令Setspn -A MSSQLSvc/s2.yunying.lab:1433 tsvc

註冊成功之後可以通過命令setspn -T yunying.lab –q */*或者setspn –q */*來查看已經註冊的SPN。SPN在其註冊的林中必須是唯一的。如果它不唯一,則身份驗證將失敗。

在註冊SPN時,可以使用NetBIOS名稱,如s2。也可以使用FQDN(Fully Qualified Domain Name全限定域名) ,如s2.yunying.lab。有可能存在某一種名稱註冊的SPN不能成功訪問的情況,如果沒有配置正確可以換一種名稱試一試。

一般情況下基於主機的服務會省略後面兩個組件,格式為<service class>/<host>:

MSSQLSvc/s2.yunying.lab

如果服務使用非默認埠或者此主機存在多個服務實例的情況下,需要包括埠號或服務名:

MSSQLSvc/ s2.yunying.lab:1433

3 SPN掃描

在瞭解了Kerberos和SPN之後我們可以通過SPN來獲取我們想要的信息,比如想知道域內哪些主機安裝了什麼服務,我們就不需要再進行批量的網路埠掃描。在一個大型域中通常會有不止一個的服務註冊SPN,所以可以通過「SPN掃描」的方式來查看域內的服務。相對於通常的網路埠掃描的優點是不用直接和服務主機建立連接,且隱蔽性更高。

(1)掃描工具

掃描工具有多種,下面挑選幾種較為常見的工具來說明一下:

Discover-PSMSSQLServers:

Discover-PSMSSQLServers是Powershell-AD-Recon工具集中的一個工具,用來查詢已經註冊了的MSSQL類型的SPN。

GetUserSPNs:

GetUserSPNs是Kerberoast工具集中的一個powershell腳本,用來查詢域內註冊的SPN。

PowerView:

PowerView是由Will Schroeder(twitter.com/harmj0y)開發的Powershell腳本,在Powersploit和Empire工具裏都有集成,PowerView相對於上面幾種是根據不同用戶的objectsid來返回,返回的信息更加詳細。

還有一些其他的腳本,使用方法基本類似,可以自己選擇合適的工具使用,而且GitHub上面大多數都有下載鏈接。

(2)原理說明

在SPN掃描時我們可以直接通過腳本,或者命令去獲悉內網已經註冊的SPN內容。那如果想了解這個過程是如何實現的,就需要提到LDAP協議。

LDAP協議全稱是Lightweight Directory Access Protocol,一般翻譯成輕量目錄訪問協議。是一種用來查詢與更新 Active Directory 的目錄服務通信協議。AD 域服務利用 LDAP 命名路徑(LDAP naming path)來表示對象在 AD 內的位置,以便用它來訪問 AD 內的對象。

LDAP 數據的組織方式:

更直觀的說可以把LDAP協議理解為一個關係型資料庫,其中存儲了域內主機的各種配置信息。

在域控中默認安裝了ADSI編輯器,全稱Active Directory Service Interfaces Editor (ADSI Edit),是一種LDAP的編輯器,可以通過在域控中運行adsiedit.msc來打開(伺服器上都有,但是隻有域控中的有整個域內的配置信息)。

通過adsiedit.msc我們可以修改和編輯LADP,在SPN查詢時實際上就是查詢LADP中存儲的內容。

比如在我們是實驗環境域YUNYING.LAB中,存在名為svcserver的一個OU(Organization Unit,可以理解為一個部門,如開發部、財務部等等),其中包含了tsvc這個用戶,從用戶屬性中可以看到tsvc註冊過的SPN內容。

當我們在一臺主機執行setspn -T yunying.lab -q */*命令查詢域內SPN時,通過抓包可以看到正是通過LDAP協議向域控中安裝的LDAP服務查詢了SPN的內容。

所以其實那些Powershell腳本其實主要就是通過查詢LDAP的內容並對返回結果做一個過濾,然後展示出來。

0x04 Kerberoasting

在前面介紹Kerberos的認證流程時說到,在KRB_TGS _REP中,TGS會返回給Client一張票據ST,而ST是由Client請求的Server端密碼進行加密的。當Kerberos協議設置票據為RC4方式加密時,我們就可以通過爆破在Client端獲取的票據ST,從而獲得Server端的密碼。

下圖為設置Kerberos的加密方式,在域中可以在域控的「組策略管理」中進行設置:

設置完成之後運行裏輸入「gpupdate」刷新組策略,策略生效。

1 早期的Kerberoasting

Kerberoasting這種攻擊方式最初應該是由TimMedin(twitter.com/TimMedin)提出,下面我們通過實驗來進行演示。

實驗環境:

域:YUNYING.LAB

域控:Windows Server 2008 R2 x64(DC)

域內主機:Windows 7 x64(s1):用戶ts1

域內主機:Windows Server 2008 R2 x64(s2):用戶tsvc

所需工具:

Kerberoast工具包

Mimikatz

攻擊流程:

  • 在域內主機s1中通過Kerberoast中的GetUserSPNs.ps1或者GetUserSPNs.vbs進行SPN掃描。

  • 根據掃描出的結果使用微軟提供的類KerberosRequestorSecurityToken發起kerberos請求,申請ST票據。

docs.microsoft.com/en-u

PS C:> Add-Type -AssemblyName System.IdentityModel

PS C:> New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList 「MSSQLSvc/s2:1433」

可以看到這個過程通過AS-REQ、AS-REP、TGS-REQ、TGS-REP這四個認證流程,獲取到RC4方式加密的票據。

  • Kerberos協議中請求的票據會保存在內存中,可以通過klist命令查看當前會話存儲的kerberos票據。

使用mimikatz導出。

使用kerberoast工具集中的tgsrepcrack.py工具進行離線爆破,成功得到tsvc賬號的密碼admin1234!

2 Kerberoasting的「新姿勢」

實驗環境:

域:YUNYING.LAB

域控:Windows Server 2008 R2 x64(DC)

域內主機:Windows 7 x64(s1):用戶ts1

域內主機:Windows Server 2008 R2 x64(s2):用戶tsvc

所需工具:

Invoke-Kerberoast.ps1

HashCat

攻擊流程:

在之前的Kerberoasting中需要通過mimikatz從內存中導出票據,Invoke-Kerberoast通過提取票據傳輸時的原始位元組,轉換成John the Ripper或者HashCat能夠直接爆破的字元串。

環境不變,在s1主機上使用Invoke-Kerberoast腳本(這裡使用的是Empire中的Invoke-Kerberoast.ps1)。

Invoke-kerberoast –outputformat hashcat | fl

這裡–outputformat參數可以指定輸出的格式,可選John the Ripper和Hashcat兩種格式,這裡以Hashcat做演示。

這個腳本申請訪問的是MSSQLSvc/s2.yunying.lab:1433這個SPN。查看數據包可以看到Invoke-Kerberoast輸出的Hash值就是TGS-REP中返回的票據內容,然後拼接成了Hashcat可以直接爆破的格式(以$krb5tgs$23*開頭的)。

把內容保存至文檔,也可以直接重定向到TXT文件:

PS C:> Invoke-Kerberoast -Outputformat Hashcat | fl > test1.txt

使用HASHCAT工具進行破解:

PS C:> hashcat64.exe –m 13100 test1.txt password.list –force

可以看到這裡已經離線破解成功,輸出了s2的密碼admin1234!。在這裡–m表示選擇不同的加密類型,其中13100對應的是Kerberos 5 TGS-REP類型的密文。

更多的Hashcat的類型可以參考:hashcat.net/wiki/doku.p

3 Invoke-kerberoast的實現

最初進行這個實驗的時候是直接在GitHub上搜索的Invoke-kerberoast,當時下載的是github.com/malachitheni這個地址的,但是下載完之後發現這個地址的工具並不能正常使用,查看代碼發現在字元串拼接時格式的問題,輸出的內容並不符合Hashcat的格式。然後直接使用了Empire中的Invoke-kerberoast.ps1腳本(下載地址:github.com/EmpireProjec)。下面就拿這個腳本來說明。

在Invoke-kerberoast中通過兩個關鍵函數看腳本執行的主要流程,一個是function Invoke-Kerberoast {}一個是function Get-DomainSPNTicket {}。

首先在Invoke-Kerberoast函數中通過腳本中的函數Get-DomainUser查詢組內所有用戶LDAP庫中存儲的內容,並去除krbtgt之後通過管道符傳給Get-DomainSPNTicket。

Get-DomainUser輸出的值(-erroraction 「Silentlycontinue」消除powershell中的紅字告警,也可以直接去掉):

函數Get-DomainSPNTicket在接收到Get-DomainUser的輸出結果後提取SPN(ServicePrincipalName)欄位的值,然後取其中的第一個賦值給變數UserSPN。我們在代碼中添加echo語句,然後再執行可以看到本次的結果選取了SPN列表中的第一條MSSQLSvc/s2:SQLEXPRESS。

通過KerberosRequestorSecurityToken類的GetRequest()函數發起kerberos請求。隨後通過匹配返回值,提取票據內容。

將提取的票據的值組合成Hashcat要求的格式之後賦值給變數HashFormat,也就是最終我們可以用Hashcat或者John the Ripper來爆破的值。

同樣,上圖框中的變數$Etype的值是23,實際上就是RC4加密演算法的代號。

Kerberoasting的本質是通過破解在Kerberos認證流程中的KRB_TGS_REP這個過程中TGS返回給Client的票據內容來進行密碼的獲取,在一個大型的域中還是有一定的利用價值,並且這種方式是離線爆破,過程較為隱蔽。

0x05小結

本文主要說明瞭kerberos的基本原理以及SPN掃描的內容,介紹了Kerberoasting的攻擊手法,Kerberos的原理較為複雜,但是深刻理解之後有助於對於瞭解其他Kerberos攻擊手法是由很大幫助的。同時kerberos在windows的實現中與其他的協議也有一些相關聯,多瞭解一點其他協議也是有必要的。下一篇中我將對MS14068漏洞和銀票據金票據的利用和原理進行探究,感謝閱讀。

實驗工具

github.com/nidem/kerber

github.com/PyroTek3/Pow

github.com/EmpireProjec

參考鏈接

pentestlab.blog/2018/06

harmj0y.net/blog/active

skypacer210.github.io/2

docs.microsoft.com/en-u

tools.ietf.org/html/rfc


推薦閱讀:
相關文章