一个用于远程验证与 Microsoft 远程桌面网关漏洞相关的补丁行为的仅检测型小型 Python 实用工具:
这些漏洞通常与 BlueGate 研究相关联,影响 Microsoft 远程桌面网关(RD Gateway),并可能允许未经认证的远程攻击者在未修补的服务器上执行任意代码。
此工具不实现远程代码执行、拒绝服务、持久化或载荷投递功能。
它仅执行一次协议级验证请求,并评估 RD Gateway 的响应。
| 属性 | 详情 |
|---|---|
| CVE 编号 | CVE-2020-0609, CVE-2020-0610 |
| 受影响组件 | Microsoft 远程桌面网关 |
| 漏洞类型 | 远程代码执行 |
| 是否需要认证 | 否 |
| 是否需要用户交互 | 否 |
| 攻击向量 | 网络 |
| 严重程度 | 严重 |
| CVSS v3.1 | 9.8 |
| CVSS 向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 主要协议 | RD Gateway UDP 传输 |
| 默认 UDP 端口 | 3391/UDP |
| 公开名称 | BlueGate |
受影响的 Windows Server 系列包括:
Windows Server 2012
Windows Server 2012 R2
Windows Server 2016
Windows Server 2019
已安装 Microsoft 2020 年 1 月安全更新或更高版本累积更新的系统应包含相关修复。
RD Gateway 部署可能暴露多个相关服务。
例如:
Microsoft RD Gateway
|
+------------+------------+
| |
TCP/443 UDP/3391
| |
HTTPS / RDWeb RD Gateway UDP
RPC-over-HTTPS DTLS 传输
RDWeb 门户可通过浏览器访问:
https://gateway.example/RDWeb/
RD Gateway 功能也可能通过 TCP/443 暴露。
然而,此 BlueGate 风格验证器所测试的攻击面是 RD Gateway UDP 传输,通常监听于:
UDP/3391
因此,扫描器使用 基于 UDP/3391 的 DTLS,而非基于 TCP/443 的 HTTPS。
将脚本改为端口 443 意味着测试:
UDP/443
这与以下内容不是同一回事:
TCP/443
在运行漏洞验证器之前,可以使用 Nmap 检查 UDP/3391:
nmap -Pn -sU -p3391 --reason <TARGET>
示例:
PORT STATE SERVICE
3391/udp open savant
savant 服务标签只是 Nmap 的端口名称映射,并不一定标识实际服务。
可以使用 OpenSSL 更可靠地确认 RD Gateway DTLS 服务。
openssl s_client \
-dtls1 \
-connect <TARGET>:3391 \
-state
openssl s_client \
-dtls1_2 \
-connect <TARGET>:3391 \
-state
成功的握手确认 UDP/3391 上有 DTLS 服务在响应。
典型的成功输出包括:
SSL handshake has read ...
New, SSLv3, Cipher is ...
Protocol: DTLSv1
或:
Protocol: DTLSv1.2
验证器:
验证过程不需要任何认证凭据。
该工具特意不包含:
无反向 Shell
无命令执行
无漏洞利用载荷
无拒绝服务循环
无重复的畸形数据包传输
已在以下环境中测试:
Python 3
OpenSSL 命令行客户端
Linux
验证 OpenSSL:
openssl version
验证 Python:
python3 --version
不需要 Python OpenSSL 模块,因为脚本调用系统自带的 openssl s_client 实现。
这避免了旧版 BlueGate 实现因依赖已弃用的 Python/OpenSSL API(例如)而遇到的兼容性问题:
DTLSv1_client_method
基本扫描:
python3 BlueGate.py <TARGET>
示例:
python3 BlueGate.py 192.0.2.10
默认目标地址为:
UDP/3391
python3 BlueGate.py \
-P 3391 \
192.0.2.10
python3 BlueGate.py \
--dtls 1 \
192.0.2.10
python3 BlueGate.py \
--dtls 1.2 \
192.0.2.10
同时测试两种版本可能很有用:
python3 BlueGate.py --dtls 1 192.0.2.10
python3 BlueGate.py --dtls 1.2 192.0.2.10
来自已修补 RD Gateway 的示例结果:
[*] Target: 192.0.2.10:3391/udp
[*] DTLS mode: 1.2
[*] Starting OpenSSL DTLS client...
[+] DTLS handshake completed.
[*] Probe (11 bytes): 0500070000004100010041
[*] Sending one validation packet...
[*] Response length: 16
[*] Response hex: 02000c0000000000ffffffffffff0080
[*] Status: 0x8000ffff
[+] PATCHED SIGNATURE RECEIVED
Server returned 0x8000ffff, which is
the rejection value used by the public
CVE detector to identify a patched host.
相同的已修补响应也可能通过 DTLS 1.0 返回:
Response length: 16
Response hex: 02000c0000000000ffffffffffff0080
Status: 0x8000ffff
0x8000ffff以以下内容结尾的响应:
0x8000ffff
是公开 BlueGate/RD Gateway 扫描器用于识别畸形分片条件已被拒绝的拒绝值。
因此,该工具报告:
PATCHED SIGNATURE RECEIVED
这提供了强有力的协议级证据,表明针对 CVE-2020-0609/CVE-2020-0610 测试的特定条件无法使用已知的公开检测技术进行利用。
如果收到 16 字节的 RD Gateway 响应,但最终 DWORD 不是:
0x8000ffff
该工具报告:
DETECTOR POSITIVE
这应被视为:
可能易受攻击
而非成功远程代码执行的直接证据。
该结果最好通过以下方式加以佐证:
Windows 构建信息
已安装的 KB 信息
Microsoft 补丁清单
需要凭据的漏洞扫描
然后再将该漏洞报告为确定可利用。
如果未收到应用程序响应:
INCONCLUSIVE
该工具有意不将超时归类为易受攻击。
超时可能由以下原因引起:
因此:
无响应 != 易受攻击
公开的 BlueGate/RDG 检测方法使用包含异常分片计数的 RD Gateway 分片数据包。
概念上:
DTLS 连接
|
v
+-----------------------+
| RD Gateway UDP 解析器 |
+-----------------------+
|
| 分片验证数据包
v
+-----------------------+
| 分片验证 |
+-----------------------+
|
+---- 已修补 ----> 拒绝
| 0x8000ffff
|
+---- 意外结果 --> 需要进一步调查
此工具使用的验证数据包仅发送一次。
本项目仅供以下用途:
仅可测试您拥有明确授权的系统。
作者对因使用或修改本软件而导致的滥用、未经授权访问、服务中断、数据丢失或其他后果不承担任何责任。
检测方法基于对 Microsoft RD Gateway 漏洞 CVE-2020-0609 和 CVE-2020-0610 的公开文档化研究,包括 BlueGate 和 RD Gateway 安全研究社区所做的工作。
本项目主要通过使用系统 OpenSSL DTLS 实现(而非已弃用的 pyOpenSSL DTLS 内部机制)来现代化验证工作流程。