
CVE-2019-0708 "BlueKeep" 脆弱性のための高速スキャナー。
これは、Microsoft Remote Desktopの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と組み合わせて使用します(下記の2番目の説明を参照)。
主な応答は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ライブラリをインストールし、システム上の他のバージョンと競合しないようにすることです。テストしたいくつかのLinuxバージョンの例を以下に示しますが、パッケージ名はディストリビューションによって異なります。また、OpenSSL互換API(BoringSSLやLibreSSLなど)にも多くのオプションがあります。
$ sudo apt install libssl-dev
$ sudo yum install openssl-devel
この問題を解決したら、次のようにすべての.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
これは、複数のバージョンのOpenSSLが存在するためmacOSで発生します。パスをハードコードすることで修正します:
$ 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
また、begin-end 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
追加のunixコマンド(grepやcutなど)で処理できます。脆弱なマシンのリストだけを取得するには:
./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"結果が得られます。
このプロジェクトにリリースとして添付されているWindowsおよびmacOSバイナリをリリースするために、OpenSSLを静的にリンクしているため、別途含める必要がなく、プログラムがそのまま動作します。このセクションでは、その方法に関する注意事項を説明します。特に、OpenSSL自身のページの説明は古くなっているようです。
どちらの手順も、OpenSSLソースをダウンロードしてrdpscanディレクトリの隣に配置することから始まります:
git clone https://github.com/openssl/openssl
Windowsの場合、最初に何らかのバージョンのPerlをインストールする必要があります。ActiveStateのものを使用しています。
次に、特別な「アセンブラ」が必要です。推奨されるNASMを使用します。
次に、コンパイラが必要です。VisualStudio 2010を使用しています。代わりに、Microsoftから最新の「Visual Studio Community Edition」(2019)をダウンロードできます。
次に、メイクファイルをビルドする必要があります。これは、OpenSSLディレクトリに移動してConfigure Perlプログラムを実行することで行います:
perl Configure VC-WIN32
Windowsでは32ビットを選択しました。古いWindowsが多く存在するため、プログラムをできるだけ古いバージョンと互換性を持たせたいからです。
完全に静的なビルド(Cランタイムを含む)が必要です。そのために、結果のメイクファイルをエディタで開き、Cコンパイルフラグを/MD(DLL使用)から/MTに変更しました。その際、CPPFLAGSに-D_WIN32_WINNT=0x501を追加しました。これにより、OpenSSLがWindows XPおよびServer 2003まで遡って動作する機能に制限されます。そうしないと、これらの古いシステムで実行した場合にbcrypt.dllが見つからないというエラーが発生します。
次に、すべてがパスに含まれていることを確認する必要があります。nasm.exeをPATH内のディレクトリにコピーしました。Visual Studio 2010では、vcvars32.batプログラムを実行してコンパイラのパス変数を設定しました。
この時点でコマンドラインで、次のように入力しました:
nmake
これによりライブラリが作成されます。静的なものはlibssl_static.libとlibcrypto_static.libであり、これらをrdpscanでリンクするために使用します。
まず、コンパイラをインストールする必要があります。AppleのDeveloper Toolsを使用し、XCodeとコンパイラをインストールしています。Homebrewを使用してgccをインストールすることもできると思います。
次に、OpenSSLのソースディレクトリに移動し、メイクファイルを作成します:
perl Configure darwin64-x86_64-cc
次に、単に作成します:
make depend
make
この時点で、動的(.dylib)ライブラリと静的(.lib)ライブラリの両方が作成されます。動的ライブラリを削除して、デフォルトで静的ライブラリが使用されるようにしました。
次に、rdpscanでmacOSのメイクファイルをビルドします:
make -f Makefile.macos
これにより、すべてのrdpscanソースファイルがコンパイルされ、先ほどビルドした../opensslディレクトリ内のOpenSSLライブラリにリンクされます。
これにより、3メガバイトの実行可能ファイルが生成されるはずです。代わりに200キロバイトの実行可能ファイルしか得られなかった場合は、誤って動的ライブラリにリンクしたことになります。