
CVE-2019-0708「BlueKeep」脆弱性のクイックスキャナー。
これは、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(verbose)を追加してください。
ワーカー数を増やすことで、大規模ネットワークのスキャン速度を向上できます。
rdpscan --workers 10000 10.0.0.0/8
ただし、私のコンピュータでは、システムの制限により、このパラメータをいくら高く設定しても、 約 1500 ワーカーしか生成されません。
さらに速度を上げるには、後述のように masscan と組み合わせて使用することもできます。
一般的な応答は 3 つあります。
ターゲットが安全と考える主な理由は 3 つあります。
これは、システムがこのバグに対して脆弱であることを確認したことを意味します。
UNKNOWN には無数のバリエーションがあります。
この rdpscan ツールはかなり遅く、1 秒あたり数百ターゲットしかスキャンできません。
代わりに masscan を使用して高速化できます。
masscan ツールはおよそ 1000 倍高速ですが、ターゲットに関する情報は限られています。
手順は次のとおりです。
masscan の出力を rdpscan に渡して、既知のアクティブなターゲットのみを
スキャンします。簡単な実行方法は、コマンドラインでそれらを組み合わせることです。
masscan 10.0.0.0/8 -p3389 | rdpscan --file -
私の場合は、2 つのステップで行います。
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
ファイルの形式は、1 行に 1 つのアドレス、名前、または範囲です。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 を多く追加するほど、より詳細な情報が出力されます。
これは stdout ではなく stderr に送信されるため、ストリームを分離できます。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" の結果がはるかに多くなります。