这是一个针对 Microsoft 远程桌面中 CVE-2019-0708 漏洞的简单粗暴扫描器。 目前,公网上约有 90 万台机器受此漏洞影响,因此很多人预计很快会出现类似 WannaCry 和 notPetya 的蠕虫。所以,请扫描你的网络,并对易受攻击的系统打补丁(或至少启用 NLA)。
这是一个命令行工具。你可以自行下载源码编译,也可以从上面的链接下载 Windows 或 macOS 的预编译二进制文件。
此工具完全基于 https://github.com/zerosum0x0/CVE-2019-0708 的 rdesktop 补丁。我只是对代码进行了精简,以便能在 macOS 和 Windows 上轻松编译,并添加了扫描多个目标的功能。
这个工具才诞生几天,属于实验性项目。不过,我正借助 masscan 扫描整个互联网来测试它,因此我很快就能解决大量问题。你可以通过 Twitter(@erratarob) 联系我寻求帮助或发表评论。
要扫描网络,请按如下方式运行:
rdpscan 192.168.1.1-192.168.1.255
这会对每个地址产生以下 3 种结果之一:
当目标 IP 地址上没有任何主机时,旧版本会打印“UNKNOWN - connection timed out”消息。扫描大型网络时,这会让你收到大量与你无关系统的信息,造成过载。因此,新版本默认不输出此类信息,除非你在命令行加上 -v(详细模式)。
你可以通过增加工作线程数来提高扫描大型网络的速度:
rdpscan --workers 10000 10.0.0.0/8
然而,在我电脑上,无论我将该参数配置得多高,由于系统限制,实际只有约 1500 个工作线程。
你还可以配合 masscan 使用来进一步提高速度,详见下文。
通常有三种响应:
我们认为目标安全的原因主要有三种:
这意味着我们已确认该系统存在此漏洞。
UNKNOWN 有无数种变体。
rdpscan 工具相当慢,每秒只能扫描几百个目标。你可以改用 masscan 来提高速度。masscan 工具大约快 1000 倍,但只能提供有关目标的有限信息。
步骤如下:
masscan 的输出交给 rdpscan,这样它只需扫描我们知道处于活动状态的目标。简单的运行方式就是在命令行上将两者组合起来:
masscan 10.0.0.0/8 -p3389 | rdpscan --file -
我的做法分两步:
masscan 10.0.0.0/8 -p3389 > ips.txt
rdpscan --file ips.txt --workers 10000 >results.txt
难点在于安装 OpenSSL 库,并避免与系统上其他版本冲突。在 Debian Linux 上,我会这样做:
$ sudo apt install libssl-dev
一旦解决了这个问题,你只需将所有 .c 文件一起编译即可:
$ gcc *.c -lssl -lcrypto -o rdpscan
我在目录中放了一个 Makefile 来做这件事,所以你很可能只需要:
$ make
该代码用 C 语言编写,因此需要安装 C 编译器,例如执行以下操作:
$ sudo apt install build-essential
本节介绍一些比较明显的构建错误。
ssl.h:24:25: fatal error: openssl/rc4.h: No such file or directory
这意味着你未安装 OpenSSL 头文件,或者它们不在某个路径中。请记住,即使安装了 OpenSSL 二进制文件,也不代表已安装开发组件。你需要同时安装头文件和库。
要在 Debian 上安装这些东西,请执行:
$ sudo apt install libssl-dev
要修复路径问题,请添加编译参数 -I/usr/local/include 或类似的参数。
下面是一个链接器问题的例子:
Undefined symbols for architecture x86_64:
"_OPENSSL_init_ssl", referenced from:
_tcp_tls_connect in tcp-fac73c.o
"_RSA_get0_key", referenced from:
_rdssl_rkey_get_exp_mod in ssl-d5fdf5.o
"_SSL_CTX_set_options", referenced from:
_tcp_tls_connect in tcp-fac73c.o
"_X509_get_X509_PUBKEY", referenced from:
_rdssl_cert_to_rkey in ssl-d5fdf5.o
在 macOS 上我会遇到这个问题,因为存在多个版本的 OpenSSL。我通过硬编码路径来修复:
$ gcc *.c -lssl -lcrypto -I/usr/local/include -L/usr/local/lib -o rdpscan
根据其他人的评论,如果你使用 Homebrew 安装工具,下面的命令行也许能在 macOS 上工作。不过,由于我还安装了其他冲突的 OpenSSL 组件,我仍然会遇到上面的链接错误。
gcc $(brew --prefix)/opt/openssl/lib/libssl.a $(brew --prefix)/opt/openssl/lib/libcrypto.a -o rdpscan *.c
上面的部分提供了运行该程序的快速入门提示。本节提供更深入的帮助。
要扫描单个目标,只需传入目标地址:
./rdpscan 192.168.10.101
你可以传入 IPv6 地址和 DNS 名称,也可以传入多个目标。例如:
./rdpscan 192.168.10.101 exchange.example.com 2001:0db8:85a3::1
你也可以使用起始-结束 IPv4 地址或 IPv4 CIDR 规范来扫描地址范围。不支持 IPv6 范围,因为范围太大了。
./rdpscan 10.0.0.1-10.0.0.25 192.168.0.0/16
默认情况下,它一次只扫描 100 个目标。你可以使用 --workers 参数增加此数量。然而,无论你将此参数设置得多高,实际上同时运行的工作线程数最多约为 500 到 1500 个,具体取决于你的系统。
./rdpscan --workers 1000 10.0.0.0/24
除了在命令行上指定目标之外,你也可以使用名副其实的 --file 参数从文件加载目标:
./rdpscan --file ips.txt
该文件的格式是每行一个地址、名称或范围。它还可以处理 masscan 生成的文本。多余的空格会被去除,空行会被忽略,所有注释行也会被忽略。注释 是指以 # 字符或 // 字符开头的行。
输出发送到 stdout,给出 VULNERABLE、SAFE 或 UNKNOWN 的状态。每种状态可能还有其他原因。这些原因已在上文描述。
211.101.37.250 - SAFE - CredSSP/NLA required
185.11.124.79 - SAFE - not RDP - SSH response seen
125.121.137.42 - UNKNOWN - no connection - refused (RST)
40.117.191.215 - SAFE - CredSSP/NLA required
121.204.186.182 - SAFE - CredSSP/NLA required
99.8.11.148 - SAFE - CredSSP/NLA required
121.204.186.114 - SAFE - CredSSP/NLA required
49.50.145.236 - SAFE - CredSSP/NLA required
106.12.74.155 - VULNERABLE - got appid
222.84.253.26 - SAFE - CredSSP/NLA required
144.35.133.109 - UNKNOWN - RDP protocol error - receive timeout
199.212.226.196 - UNKNOWN - RDP protocol error - receive timeout
183.134.58.152 - UNKNOWN - no connection - refused (RST)
83.162.246.149 - VULNERABLE - got appid
你可以使用 grep 和 cut 等 Unix 命令进一步处理输出。要仅获取易受攻击机器的列表:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
参数 -dddd 表示 诊断 信息,添加的 d 越多,打印的详细信息就越多。这些信息发送到 stderr 而不是 stdout,这样你可以分离两个输出流。在 bash 中可以这样做:
./rdpscan --file myips.txt -ddd 2> diag.txt 1> results.txt
添加 -d 参数会将连接的诊断信息转储到 stderr。
./rdpscan 62.15.34.157 -d
[+] [62.15.34.157]:3389 - connecting...
[+] [62.15.34.157]:3389 - connected from [10.1.10.133]:49211
[+] [62.15.34.157]:3389 - SSL connection
[+] [62.15.34.157]:3389 - version = v4.8
[+] [62.15.34.157]:3389 - Sending MS_T120 check packet
[-] [62.15.34.157]:3389 - Max sends reached, waiting...
62.15.34.157 - SAFE - Target appears patched
在 macOS/Linux 上,你可以按通常方式将 stdout 和 stderr 分别重定向到不同文件:
./rdpscan --file ips.txt 2> diag.txt 1> results.txt
因此它支持 SOCKS5:
./rdpscan --file ips.txt --socks5 localhost --socks5port 9050
这会让连接问题变得更严重,因此你会得到更多“UNKNOWN”结果。