
このツールは、対象ホスト上のいくつかの一般的な公開サービスをスキャンして、Microsoft Exchange Server を検出し、可能であればそのソフトウェアバージョンをフィンガープリントします。
これを実現するために、以下の手法を使用します。
検出されたビルド番号は、Microsoft からスクレイピングされたバージョンテーブルと照合されます。このテーブルは、Exchange Server 5.5 から Exchange Server Subscription Edition (SE) までのすべてのリリースをカバーし、Service Pack (SP)、Cumulative Update (CU)、Security Update (SU)、Hotfix Update (HU)、Update Rollup (RU) レベルを含みます。一致した場合は、製品名、リリース日、NVD 辞書形式の CPE 文字列が報告されます。
スキャナーを実行する推奨方法は Docker です。Docker 自体以外のローカル依存関係は不要です。代わりにスクリプトを直接実行する場合は、64 ビットの Debian Linux での使用を想定して設計されていますが、Python 3、dnsx、fingerprintx がサポートする Linux ディストリビューションであれば(インストールスクリプトに若干の変更を加えることで)動作するはずです。
イメージをビルドします。このイメージには Python、固定された Python パッケージ、バージョン固定された dnsx および fingerprintx バイナリがバンドルされており、ビルド時に Microsoft から Exchange Server のバージョンテーブルをスクレイピングします。
docker build -t exchange-scanner .
次に、スクリプトに渡すのと同じ引数を指定してスキャナーを実行します(引数の詳細は後述の「使用法」を参照してください)。
# Scan a single target
docker run --rm exchange-scanner -q -t 192.168.5.3
# Scan a list of targets (mount the file into the container)
docker run --rm -v "$PWD/targets.txt:/app/targets.txt" exchange-scanner -l targets.txt
バージョンテーブルを更新するには、イメージを再ビルドしてください。
scripts/install-requirements.sh を実行して、必要なツール、パッケージ、その他の依存関係をインストールします。Python パッケージは scripts/requirements.txt で特定のバージョンに固定されています。
scripts/get-exchange-versions.py をいつでも個別に再実行して、exchange-versions.json にあるソフトウェアバージョンテーブルを更新できます。
exchange-scanner.py スクリプトを -h 付きで実行すると、使用法の詳細が表示されます。
❯ ./exchange-scanner.py -h
usage: exchange-scanner.py [-h] [-q] [-d] [-x TIMEOUT] [-o OUTFILE] (-t TARGET | -l LIST)
optional arguments:
-h, --help show this help message and exit
-q, --quiet Suppress log output (except errors)
-d, --debug Print debugging messages
-x TIMEOUT, --timeout TIMEOUT
Set timeout for HTTP requests (defaults to 3 seconds)
-o OUTFILE, --outfile OUTFILE
Save output to a file instead of writing to stdout
-t TARGET, --target TARGET
A single hostname or IP address to scan
-l LIST, --list LIST File containing a list of hostnames and/or IP addresses to scan (one per line)
必須: -t または -l
-t に単一のホスト名または IP アドレスを指定します。ホスト名が複数の IP に解決される場合、スクリプトはそれぞれを個別にスキャンします。-l にそのファイル名を指定します。ログ: ほとんどのログ出力を抑制するには -q を使用します。より詳細なログを表示するには -d を使用します。
タイムアウト: HTTP リクエストごとの最大応答時間を変更するには、タイムアウト値を秒単位で指定します(デフォルトは 3 秒)。特定の状況では単一の IP アドレスに対して 200 を超えるリクエストが発生する可能性があることに注意してください(ただし、ほとんどのスキャンはこの量に達しません)。そのため、一般的には短いタイムアウトが推奨されます。
出力: スキャン結果はデフォルトで JSON 形式で出力されます。stdout に出力する代わりにファイルへ保存するには、-o にファイル名を指定します。
$ ./exchange-scanner.py -q -t 192.168.5.3
[
{
"hostname": "192.168.5.3",
"ip_address": "192.168.5.3",
"build_number": "15.2.1118",
"exchange_services": [
"https://192.168.5.3:443",
"imaps://192.168.5.3:993"
],
"product_name": "Exchange Server 2019 CU12 (2022H1)",
"major_version": "2019",
"update": "Cumulative Update 12",
"security_update": null,
"release_date": "2022-04-20",
"recalled": false,
"cpes": [
"cpe:2.3:a:microsoft:exchange_server:2019:cumulative_update_12:*:*:*:*:*:*",
"cpe:2.3:a:microsoft:outlook_web_access:2019:cumulative_update_12:*:*:*:*:*:*"
]
}
]
事前の相互同意なしにターゲットを攻撃する目的でこのツールを使用することは違法です。適用されるすべての地方、州、連邦の法律を遵守する責任はエンドユーザーにあります。開発者は一切の責任を負わず、このプログラムによって引き起こされた誤用や損害についても責任を負いません。
このプロジェクトは GNU General Public License の下でライセンスされています。
recalled フィールドでフラグ付けします。