这是一个用于检测 Microsoft 远程桌面中 CVE-2019-0708 漏洞的快速但粗糙的扫描器。 目前,公共互联网上约有 70 万台机器受此漏洞影响, 而约有 200 万台机器暴露了远程桌面,但已修补/可安全抵御利用。许多人预计在 未来几个月内将出现类似 WannaCry 和 notPetya 的毁灭性互联网蠕虫。 因此,请扫描你的网络并修补你的系统。此工具可让你轻松扫描网络 以发现易受攻击的机器。
要使用此工具,你可以下载一个“二进制”文件从命令行运行,也可以下载 源代码并自行编译。对于 Windows,有预编译二进制文件 可用。
此工具完全基于 https://github.com/zerosum0x0/CVE-2019-0708 的 rdesktop 补丁。
我只是精简了代码,以便能在 macOS 和 Windows 上轻松编译,
并添加了扫描多个目标的功能。
这个工具才出现几天,还处于实验阶段。不过,我正在通过扫描
整个互联网来测试它(借助 masscan),因此我正在快速解决
很多问题。你可以尝试在 Twitter(@erratarob)上联系我以获取帮助/评论。
要扫描网络,请按如下方式运行:
rdpscan 192.168.1.1-192.168.1.1.255
这会对每个地址打印一行结果,如果存在该漏洞则显示 VULNERABLE, 如果(可能)安全则显示 SAFE,如果程序无法弄清楚状态则显示 UNKNOWN, 例如目标无响应时。由于大多数目标不会响应,从统计上看,大多数结果将是 UNKNOWN。
它的速度相当慢。你可以通过添加命令行参数
--workers 1000 来提高速度。但你还可以通过先使用 masscan 作为前端
快速找出开放 3389 端口的机器,然后仅使用
rdpscan 扫描这些结果机器来进一步提升速度。
masscan 10.0.0.0/8 -p3389 --rate 1000000 >ips.txt
rdpscan --file ips.txt > results.txt
或者,一步到位,将前一个命令的输出通过管道传给后一个命令:
masscan 10.0.0.0/8 -p3389 --rate 1000000 | rdpscan --file -
你可以使用 -d 参数获得更详细的诊断信息,这些信息会
打印到 sterr。这是我通常运行程序的方式:
rdpscan --file ips.txt 2> diag.txt 1> 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 参数增加此数量。但是,无论你将此参数设置得多高,
实际上根据你的系统,同时运行的 worker 最多约为 500 到 1500 个。
./rdpscan --workers 1000 10.0.0.0/24
除了在命令行上指定目标,你还可以
从文件中加载它们,使用命名恰当的 --file 参数:
./rdpscan --file ips.txt
文件格式是每行一个地址、名称或范围。它还可以
消耗由 masscan 生成的文本。多余的空格会被修剪,
空行会被忽略,任何注释行也会被忽略。注释 是
以 # 字符或 // 字符开头的行。
输出发送到 stdout,给出 VULNERABLE、SAFE
或 UNKNOWN 状态。每种状态可能还有其他原因。
149.129.120.24 - UNKNOWN - FIN received
45.60.213.160 - SAFE - not RDP but HTTP
208.43.229.89 - SAFE - CredSSP required
170.104.127.137 - UNKNOWN - FIN received
86.188.190.117 - UNKNOWN - connect timeout
62.15.34.157 - SAFE - Target appears patched
216.15.251.120 - VULNERABLE -- got appid
69.62.158.174 - VULNERABLE -- got appid
92.111.20.13 - SAFE - Target appears patched
你可以使用 grep 和 cut 等附加 unix 命令处理此输出。
要仅获取易受攻击机器的列表:
./rdpscan 10.0.0.0/8 | grep 'VULN' | cut -f1 -d'-'
那些标记为“UNKNOWN”的可能值得稍后扫描,尤其是
“FIN received”,这通常意味着对端因互联网延迟而提前
终止了连接。将它们保存到文件中,然后在下次扫描时
使用 --file 选项读回。
“CredSSP required”(表示需要 NLA)是否算“SAFE”尚有争议。 这意味着在我们测试/触发漏洞之前,需要密码 登录。它可能未修补,并且对经过身份验证的用户存在漏洞, 只是无法被蠕虫或未经身份验证的用户利用。
对于你扫描的每个 IP 地址,你应该总是在 stdout 上获得且仅获得一个状态。
当然,如果你多次指定一个 IP 地址,你将获得该地址的多个
状态。
然而,由于此代码基于 rdestkop,某些协议
错误不会产生状态。如果你在互联网上有一个公共 IP 地址
产生了这些错误之一,那么我很乐意修复它。
添加 -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”结果。