本文將要介紹以下內容:
· 帳戶隱藏的方法
· 編寫腳本實現思路
· 結合遠程桌面多用戶登錄的利用思路
0x02 帳戶隱藏的方法
該方法在網上已有相關資料,本節只做簡單復現
測試系統:·Win7 x86
1、對注冊表賦予權限
默認注冊表HKEY_LOCAL_MACHINE\SAM\SAM\只有system權限才能修改
現在需要為其添加管理員權限
右鍵-權限-選中Administrators,允許完全控制
如下圖
重新啟動注冊表regedit.exe,獲得對該鍵值的修改權限
2、新建特殊帳戶
net user test$ 123456 /addnet localgroup administrators test$ /add
注:
用戶名要以$結尾
添加后,該帳戶可在一定條件下隱藏,輸入net user無法獲取,如下圖
但是,在控制面板能夠發現該帳戶
如下圖
3、導出注冊表
在注冊表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names下找到新建的帳戶test$
獲取默認類型為0x3ea
將注冊表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\test$導出為1.reg
在注冊表下能夠找到對應類型名稱的注冊表項HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users>在注冊表下能夠找到對應類型名稱的注冊表項HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EA<0003EA
如下圖
右鍵將該鍵導出為2.reg,保存的文件信息如下圖
默認情況下,管理員帳戶Administrator對應的注冊表鍵值為HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users>默認情況下,管理員帳戶Administrator對應的注冊表鍵值為HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4<0001F4
同樣,右鍵將該鍵導出為3.reg
將注冊表項HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users>將注冊表項HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EA下鍵F的值替換為HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4下鍵F的值,即2.reg中鍵F的值替換成3.reg中鍵F的值<0003EA下鍵F的值替換為HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users>將注冊表項HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003EA下鍵F的值替換為HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4下鍵F的值,即2.reg中鍵F的值替換成3.reg中鍵F的值<0001F4下鍵F的值,即2.reg中鍵F的值替換成3.reg中鍵F的值
替換后,如下圖
4、命令行刪除特殊帳戶
net user test$ /del
5、導入reg文件
regedit /s 1.regregedit /s 2.reg
隱藏賬戶制做完成,控制面板不存在帳戶test$
通過net user無法列出該帳戶
計算機管理-本地用戶和組-用戶也無法列出該帳戶
但可通過如下方式查看:
net user test$
如下圖
無法通過net user test$ /del刪除該用戶,提示用戶不屬于此組,如下圖
刪除方法:
刪除注冊表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users下對應帳戶的鍵值(共有兩處)
注:
工具HideAdmin能自動實現以上的創建和刪除操作
0x03 編寫腳本實現思路
采用powershell腳本實現的兩種思路:
1、對注冊表添加管理員帳戶的編輯權限
使用regini注冊ini文件為注冊表及其子鍵賦予權限
注:
Powershell通過Set-Acl為注冊表賦予權限,示例代碼:
$acl = Get-Acl HKLM:SAM\SAM$person = [System.Security.Principal.NTAccount]"Administrators"$access = [System.Security.AccessControl.RegistryRights]"FullControl"$inheritance = [System.Security.AccessControl.InheritanceFlags]"None"$propagation = [System.Security.AccessControl.PropagationFlags]"NoPropagateInherit"$type = [System.Security.AccessControl.AccessControlType]"Allow"$rule = New-Object System.Security.AccessControl.RegistryAccessRule( `$person,$access,$inheritance,$propagation,$type)$acl.ResetAccessRule($rule)Set-Acl HKLM:SAM\SAM\Domains\Account\Users\Names $acl
但不支持對子鍵的權限分配,因此不采用該方法
以下內容保存為a.ini:
HKEY_LOCAL_MACHINE\SAM\SAM\* [1 17]
注:
*代表枚舉所有子鍵
1代表Administrators 完全訪問
17代表System 完全訪問
詳細權限說明可通過cmd執行regini獲取幫助,如下圖
通過regini注冊:
regini a.ini
Evilcg就是通過這種方式實現的,腳本地址:
https://github.com/Ridter/Pentest/blob/master/powershell/MyShell/Create-Clone.ps1
注:
使用*需要system權限,但只把相關的列舉出來,只需要管理員權限即可,例如:
HKEY_LOCAL_MACHINESAM [1 17]HKEY_LOCAL_MACHINESAMSAM [1 17]HKEY_LOCAL_MACHINESAMSAMDomains [1 17]HKEY_LOCAL_MACHINESAMSAMDomainsAccount [1 17]HKEY_LOCAL_MACHINESAMSAMDomainsAccountUsers [1 17]HKEY_LOCAL_MACHINESAMSAMDomainsAccountUsersNames [1 17]
2、直接獲得System權限
我在之前的文章《滲透技巧——Token竊取與利用》介紹過通過token復制獲得system權限的方法
所以,可以先獲得System權限,進而擁有對注冊表的編輯權限
簡單的方式,通過Invoke-TokenManipulation.ps1,地址如下:
https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-TokenManipulation.ps1
但我在測試時發現了一個bug,使用Invoke-TokenManipulation -ImpersonateUser -Username "nt authority\system"無法將當前權限切換為System權限
但可以使用Invoke-TokenManipulation -CreateProcess "cmd.exe" -Username "nt authoritysystem"新打開一個System權限的進程
接下來,就是編寫腳本實現注冊表的導出替換功能:
· 新建測試帳戶
· 將注冊表導出到temp目錄,進行替換
· 刪除特殊帳戶
· 導入注冊表文件
我的實現方法參照了Evilcg的最初始版本,做了細節上的優化,下載地址:
https://github.com/3gstudent/Windows-User-Clone
0x04 結合遠程桌面多用戶登錄的利用思路
通過以上的介紹,可得出該方法的優點:
通過克隆的方式能夠繼承原帳戶的權限
在利用上存在以下需要注意的問題:
1、復制管理員帳戶Administrator
需要注意管理員帳戶是否被禁用,如果被禁用,那么克隆出的隱藏帳戶也是被禁用狀態
2、復制已有帳戶
在3389遠程登錄的利用上存在相同帳戶的沖突關系
通過cmd開啟本機的3389遠程登錄功能:
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /fREG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x00000d3d /f
利用以上方法,克隆帳戶a的權限,建立隱藏帳戶aaa$
如果系統當前登錄帳號為a,那么使用隱藏帳戶aaa$登錄的話,會系統被識別為帳戶a,導致帳戶a下線
3、新建帳戶再復制
進一步,大膽的思考
新建管理員帳戶b,克隆帳戶b,建立隱藏賬戶bbb$
刪除管理員帳戶b,隱藏賬戶bbb$仍然有效
4、原帳戶的維持
再進一步
克隆帳戶a的權限,建立隱藏帳戶aaa$
修改帳戶a的密碼,隱藏帳戶aaa$仍然有效
0x05 防御
針對隱藏帳戶的利用,查看注冊表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\即可
當然,默認管理員權限無法查看,需要分配權限或是提升至Sytem權限
隱藏帳戶的登錄記錄,可通過查看日志獲取
0x06 小結
本文介紹了隱藏帳戶的相關利用技巧,如果應用于遠程桌面的多用戶登錄,隱蔽性會大大提高,站在防御的角度,分享出該利用方法,幫助大家更好的認識和防御。
?Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。
一個完整的Docker有以下幾個部分組成:
本篇文章我們通過一個簡單的教程來向大家介紹下,如何在自己的虛擬機里搭建一個私有的Registry,Docker Registry是一個提供存儲Docker鏡像的服務,在一個項目小組中我們可以把我們的project打包成一個Docker image,并且把它push到Registry,當需要測試project的時候我們可以把它從Registry pull下來,并且把它部署到Docker中。
下面我們詳細的描述下整個部署步驟:
步驟一:安裝Docker
yum install -y docker
查看docker版本:
docker --version
啟動docker:
systemctl enable docker systemctl start docker
查看docker服務是否啟動
ps auwx | grep docker
步驟二:Pull Registry鏡像
docker pull docker.io/registry:latest docker pull konradkleine/docker-registry-frontend:v2
查看Docker鏡像
docker images
步驟三:運行Registry和Registry Web UI鏡像
docker run -d \ -p 5000:5000 \ --restart=always \ --name registry \ docker.io/registry:latest
查看Registry是否運行起來
docker ps -a
驗證Registry Service是否正常
curl http://localhost:5000/v2/_catalog
因為我們還沒有向Registry push任何image,所以通過Registry API查詢repositories為空。
運行docker-registry-frontend,主要是提供web UI,方便查看Docker image
docker run -d \ --link registry:registry \ --name registry-frontend \ -e ENV_DOCKER_REGISTRY_HOST=registry \ -e ENV_DOCKER_REGISTRY_PORT=5000 \ -p 9090:80 \ konradkleine/docker-registry-frontend:v2
--link:docker-registry-frontend需要訪問registry后端API,所以需要在這里加上此參數,并且ENV_DOCKER_REGISTRY_HOST參數必須是registry的name;
查看docker-registry-frontend是否運行
docker ps -a
通過瀏覽器訪問registry-frontend web UI,由于虛擬機綁定的靜態IP地址是10.0.0.10,所以訪問URL是http://10.0.0.10:9090
步驟四:驗證整個Registry是否工作正常
pull一個最小的Docker image用于測試
docker pull daocloud.io/library/busybox docker tag daocloud.io/library/busybox:latest 10.0.0.10:5000/test/busybox:latest ? docker push 10.0.0.10:5000/test/busybox The push refers to a repository [10.0.0.10:5000/test/busybox] Get https://10.0.0.10:5000/v1/_ping: http: server gave HTTP response to HTTPS client
出現上面錯誤是由于Client端采用https,而Registry Server端采用http導致的,需要修改docker配置文件統一采用http協議,修改內容如下:
修改后重啟Docker
systemctl restart docker docker push 10.0.0.10:5000/test/busybox
再次調用Registry API查看repositories:
curl http://localhost:5000/v2/_catalog
發現repositories已經有image了,就是我們剛才push到Registry中的。
再次訪問:http://10.0.0.10:9090/repositories
registry-frontend web UI也出現了我們剛才push的image。
到此,一個私有Docker Registry的整個安裝過程已經介紹完了。通過上述步驟,我們看到Registry和Registry frontend在整個系統中扮演的角色非常分明,Registry提供Docker Image存儲功能以及提供API服務,Registry frontend提供Web UI服務,使用戶方便查看存儲在Registry中的鏡像文件。
參考:
https://github.com/docker/distribution
https://github.com/kwk/docker-registry-frontend
文章如有不妥之處,歡迎指正!謝謝!