後滲透之權限維持 — 隱藏用戶的創建和使用
0x00 前言
在滲透過程中拿下一台主機後很多時候會選擇開3389進遠程桌面查看一下對方主機內有無一些有價值的東西可以利用,但是這也引出了一個問題,只要是登錄進程就一定會留下痕迹,雖然在滲透完成後可以通過痕迹清理的方法清除自己登錄的”證據”,但是在多次滲透的過程中我不禁產生了思考,有沒有一種方法能夠最大化的隱藏自己登陸過對方主機呢,於是便有了下文
0x01 隱藏用戶(影子用戶)的創建與利用進行權限維持
這裡先提一個概念,在windows環境下創建用戶如果後面帶了一個”$”符號,在net use時默認是不顯示的,下文基於這個特性展開
利用條件:①獲得管理員權限;②得到cmdshell等shell環境(即管理員cmd)
操作步驟(我這裡以Windows10 為例):
1.首先利用cmdshell添加一個用戶名帶$的用戶,如:admin$:123456
命令如下:
net user admin$ 123456 /add #添加用戶admin$
net localgroup administrators admin$ /add #將admin$用戶添加到管理員組administrators
使用命令net user查看用戶發現並沒有這個用戶
此時可以直接登錄3389進行操作,但隱蔽性仍不足,可以在控制面板的管理工具中用戶與用戶組查看到該用戶的存在,還需要進一步操作
2.對註冊表進行修改,在命令提示符與管理工具中無法查看
當你利用shell創建了一個影子用戶的時候,利用這個影子用戶可以開啟3389進行登錄,在目標機上對註冊表進行數據操作,達到提高影子用戶的隱蔽性
利用 運行 輸入regedit 打開註冊表 ,找到如下圖的SAM
選擇SAM 項 ,在工具欄上的「編輯 > 權限」 中設置權限 ,將 Administrators組 的權限設置為完全控制 後保存
(拒絕修改不可逆,出錯會造成大問題,別點到完全操控的拒絕項,該操作不可逆,利用這個思路,我們可以在修改註冊表後再對System與Administrators權限進行拒絕訪問,可防止管理員刪除這個用戶)
兩個權限都修改為允許
設置好後,回到註冊表主頁面 ,發現SAM項下出現了隱藏的子項,找到
SAM > Domains > Account > Users 和 Names
分別找到Administrator用戶和admin$用戶的兩個項
Administrator用戶的F值(SID):
將Administrator F表內的二進制數據複製下來
找一下admin$用戶對應的SID和F值,如下所示:
將admin$目錄下的F值修改為從administrator複製得來的F值
複製後如圖所示
導出Users下對應admin$項
我這裡保存到桌面
再把Names下對應的admin$項導出
同樣導出到桌面
導出後如圖所示
利用cmdshell(管理員權限)將admin$刪除,刪除後發現註冊表中的admin$用戶相關項已經消失
net user admin$ /del
這時候我們導入已經備份好的項與數值(導出後雙擊進行導入或者在註冊表中導入)
我這裡在註冊表進行導入
可以看見導入已經成功了
導入成功後回到管理工具中的查看用戶與用戶組的頁面,發現用戶組和用戶已經沒有admin$這個用戶的存在了,但實際上我們仍可以用這個用戶的密碼進行登錄RDP,而且可以相當於Administrator管理員進行登錄操作
開啟3389進行登錄,發現問題
發現用戶未授權,這時候又多了一個利用條件,要在右下的選擇用戶下,添加admin$用戶的用戶名,才能正常登錄3389
修改後成功登錄
0x02 細節拓展
那我們在實戰中,是以遠程登錄界面為基礎的。這時,我們又要拓展另一個權限,userauthentication權限 ,該權限主要是用於遠程連接的身份驗證,稱之為鑒權
我們以圖片直觀地查看該權限開啟與關閉的區別:
開啟狀態:
關閉狀態就會直接進入遠程桌面鎖屏處
這裡有一個重點:
鑒權開啟時,我們在不知道賬號密碼的情況下無法登錄到遠程界面,但是鑒權關閉之後,無論我們輸入的賬號和密碼是否正確,都可以進入遠程界面窗口
首先關閉鑒權模式,我們採用如下命令,這裡0代表關閉,1代表開啟
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0
關閉鑒權模式還不夠,還需要關閉securitylayer安全層驗證
securitylayer這個安全層驗證簡單來說就是保證了對話傳輸保密性更高,它的默認值為1,指定在建立遠程桌面連接之前,服務器和客戶端需要進行身份驗證,如果這個地方安全層驗證的默認值為1,服務器和客戶端就必須要進行身份驗證,也就是輸入帳號密碼的操作,所以我們需要將安全層驗證的這個值改為0
這裡貼一下微軟官方對這個驗證的解釋://docs.microsoft.com/en-us/windows-hardware/customize/desktop/unattend/microsoft-windows-terminalservices-rdp-winstationextensions-securitylayer
概括起來就是:
0 就是連接前使用 rdp 協議進行身份驗證,rdp 即遠程桌面連接,可以簡單理解為就是關閉驗證。1 是指在連接前兩端協商來進行身份驗證,這個是默認值。2 就是使用 tls 協議來進行
將其參數設置為0,命令如下:
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SecurityLayer /t REG_DWORD /d 0
這裡注意一下,我在測試過程中,兩個參數同時關閉(也存在關掉一個參數而不用驗證的情況,但最好還是兩個參數都關閉)才可以不用輸入正確憑證進入3389的登錄頁面
以上操作的基礎是目標機開啟了遠程桌面連接,如果沒有開啟遠程連接需要先配置一下防火牆,設置為允許遠程桌面連接,命令:
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
這裡解釋一下:
netsh 是 windows 的網絡配置命令,advfirewall firewall 意思為防火牆的高級設置,add rule 是添加一條規則,name 指定規則名稱,protocol 指定協議,dir 指定是出站還是入站,localport 指定端口,action 指定動作 allow 允許
設置後,我們再通過註冊表來設置一下允許遠程桌面連接,執行以下命令:
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\TerminalServer" /v fDenyTSConnections /t REG_DWORD /D 0 /f
做好以上工作,服務器的RDP遠程登錄界面就可以在無輸入正確密碼的情況下打開,遠程桌面連接輸入 ip 就會直接跳到目標鎖屏頁
不用憑證驗證進入到登錄頁面:
0x03 思路拓展
在這裡展示的是代表新用戶的影子用戶的創建利用,如果遇上有意識的管理員,極有可能會在註冊表中被發現,如果設置不可逆性的權限(查看訪問設置完全控制的拒絕選項)可以暴力有效解決這個賬號被刪除的問題,但後面也會引發更大的問題
利用新的影子用戶登錄3389,會生成數據容易被發現,而且還需要在3389上添加條件才能進行正常登錄(Windows10下是如此情況)
此處可以擴展兩種方法:
①所以說這裡我們可以開啟來賓賬戶Guest在註冊表對其F值進行更換,開啟Guest賬戶,我們就可以登錄而且減少了一些不必要的關注。
②在添加授權用戶那個選項中,將所有已知的用戶進行添加,防止管理員過早發現創建的影子用戶的存在。