
Web Exploit Detector は、ウェブホスティング環境における感染の可能性、悪意のあるコード、および不審なファイルを検出するための Node.js アプリケーション(および NPM モジュール)です。このアプリケーションは、1 つ以上のウェブサイトをホストするウェブサーバー上で実行することを目的としています。アプリケーションを実行すると、感染している可能性のあるファイルのリストが、感染の説明や関連するオンラインリソースへの参照とともに生成されます。
バージョン 1.1.0 では、ディレクトリ構造のスナップショットを生成および比較するユーティリティも含まれており、ユーザーはファイルが変更、追加、または削除されたかどうかを確認できます。
このアプリケーションは GitHub 上でホストされており、他のユーザーが恩恵を受けられるようにするとともに、他のユーザーが独自の検出ルールを提供できるようにしています。
Web Exploit Detector をインストールする最も簡単な方法は、グローバル NPM モジュールとしてインストールすることです:
npm install -g web_exploit_detector
Linux またはその他の Unix ベースの OS を実行している場合は、root としてこのコマンドを実行する必要があるかもしれません(例: sudo npm install -g web_exploit_detector)。
モジュールは定期的に更新し、すべての最新の検出ルールが存在することを確認する必要があります。上記のコマンドを実行すると、常に最新の安定版(テスト済み)バージョンがダウンロードされます。すでにインストールされているバージョンを更新するには、次のコマンドを実行するだけです:
npm update -g web_exploit_detector
ここでも、上記のように sudo コマンドを使用する必要があるかもしれません。
Git リポジトリをクローンして、スクリプトを直接実行することもできます:
git clone https://github.com/polaris64/web_exploit_detectorcd web_exploit_detectornpm installWeb Exploit Detector を NPM モジュールとしてインストールした場合(上記参照)、以下のコマンドを実行し、ウェブルート(ウェブサイトファイルの場所)へのパスを指定するだけでスキャナーを実行できます:
wed-scanner --webroot=/var/www/html
他のコマンドラインオプションも利用可能です。wed-scanner --help を実行すると、それらを説明するヘルプメッセージが表示されます。
この方法でスクリプトを実行すると、人間が読める形式の出力がコンソールに表示されます。これは、たとえば cron でスクリプトを実行する場合に非常に便利です。スクリプトが実行されるたびに出力を電子メールで送信できるからです。
スクリプトは、結果をよりコンピューターに適した JSON 形式で保存することもサポートしています。この出力を有効にするには、--output コマンドライン引数を参照してください。
node 経由でスクリプトを呼び出し、ウェブルートへのパスを次のように指定します:
node index.js --webroot=/var/www/html
Web Exploit Detector には、予期せず変更された可能性のあるファイルを特定するのに役立つ 2 つのユーティリティも付属しています。サイトへの攻撃が成功すると、通常、ファイルの削除、新しいファイルの追加、または既存のファイルの変更が行われます。
スナップショット(これらのユーティリティで使用される)は、スナップショットが作成された時点でのすべてのファイルとその内容の説明をリストした JSON ファイルです。たとえば、月曜日にスナップショットを生成し、火曜日にサイトが攻撃された場合、その後このスナップショットと現在のサイトファイルを比較すると、1 つ以上のファイルが追加、削除、または変更されたことがわかります。したがって、これらのユーティリティの目的は、必要なときにスナップショットを作成し、比較を実行できるようにすることです。
スナップショットは、各ファイルパスとファイル内容の SHA-256 ハッシュを保存します。ハッシュ(またはダイジェスト)は、メッセージの小さな要約であり、この場合はファイルの内容です。ファイルの内容がほんの少しでも変更されると、ハッシュは完全に異なるものになります。これにより、ファイル内容の変更を検出する優れた方法が提供されます。
以下の 2 つのユーティリティも Web Exploit Detector の一部としてインストールされます:
wed-generate-snapshot: このユーティリティは、"--webroot" で指定されたディレクトリ内のすべてのファイル(再帰的に)のスナップショットを生成できます。スナップショットは "--output" オプションで指定されたファイルに保存されます。wed-compare-snapshot: スナップショットが生成されたら、同じディレクトリの現在の内容と比較できます。チェックするスナップショットは "--snapshot" オプションで指定します。チェック対象のベースディレクトリはスナップショット内に保存されていますが、スナップショット生成後にベースディレクトリが変更された場合は、--webroot オプションを使用できます。スナップショットは必要な頻度で生成できますが、一般的な目安としては、サイトがクリーン(感染していない)状態にあるとき、および正当な変更が行われたときに生成する必要があります。WordPress のような CMS ベースのサイトでは、新しいアップロードにより新しい状態が保存されたスナップショットと異なるため、スナップショットを定期的に作成する必要があります。ファイルが決して変更されるべきではないサイトの場合は、単一のスナップショットを生成し、その後無期限に使用して、実際に何も変更されないことを確認できます。
src/web-exploit-detector.js スクリプトは、ルールセットを rules としてエクスポートし、さらにいくつかの関数をエクスポートする ES6 モジュールです:
executeTests(settings): 渡された settings オブジェクトに基づいてエクスプロイトチェッカーを実行します。使用方法については、index.js スクリプトを参照してください。formatResult(result): executeTests() から返された配列から単一のテスト result を受け取り、そのテストの出力用の結果文字列を生成します。getFileList(path): readDirRecursive() を使用してベース path からファイルの配列を返します。processRulesOnFile(file, rules): 配列 rules のすべてのルールを単一の file(文字列パス)に対して処理します。readDirRecursive(path): 再帰関数。path とサブディレクトリ内のすべてのファイルの配列で解決される Promise を返します。src/cli.js スクリプトは、wed-scanner スクリプトで使用されるこのモジュールのシンプルなコマンドラインインターフェース (CLI) です。このスクリプトを読むことで、このモジュールの使用方法の一例がわかります。
プロジェクトは Babel を使用して、"src" 内の ES6 モジュールを "lib" 内のプレーンな JavaScript モジュールにコンパイルします。古いバージョンの Node.js を実行している場合は、代わりに "lib" ディレクトリからモジュールを require() できます。
パッケージには Babel が devDependency として含まれており、"build" および "watch:build" スクリプトが含まれています。"build" スクリプト(npm run build)を実行すると、"./src" 内の ES6 モジュールがコンパイルされ "./lib" に保存され、CLI スクリプトによってインクルードされます。
"./lib" ディレクトリはリポジトリに含まれているため、ユーザーは devDependency をインストールしてアプリケーションをビルドしなくても、リポジトリをクローンして直接アプリケーションを実行できます。
場合によっては、特に suspicion タグが付いたルールは、クリーンなファイルを潜在的なエクスプロイトとして識別することがあります。このため、ファイルをルールのチェック対象から除外できるシステムも含まれています。
wed-results-to-exceptions スクリプトは、メインの検出スクリプトからの出力ファイル(--output オプションを参照)を受け取り、各ファイルを各ルールごとに順に除外するかどうかを選択できます。除外されたすべてのファイルは、wed-exceptions.json というファイル(ユーザーのホームディレクトリ内)に保存され、メインスクリプトがスキャンを実行する前に読み取られます。このファイルにファイルがリストされている場合、そのファイルをチェックするときに、添付されたすべてのルール(ID による)がスキップされます。
使用方法については、wed-results-to-exceptions を実行するだけです。事前に --output オプションを使用してメインの検出スクリプトを実行し、有効な出力 JSON を用意しておく必要があります。
Git リポジトリを直接使用しているユーザーは、プロジェクトルートディレクトリで node results_to_exceptions.js を実行してください。
アプリケーションは、アプリケーションの実行時にロードされる「ルール」のコレクションを使用して動作します。各ルールは、ID、名前、説明、URL のリスト、タグ、非推奨フラグ、そして最も重要なことに一連のテストで構成されます。
個々のテストは、次のいずれかでなければなりません:
次のテストタイプがサポートされています:
ウェブベースのエクスプロイトは常に進化しており、新しいエクスプロイトが作成されているため、ルールセットも更新する必要があります。私は多数のウェブサイトをホストしているため、常に新しい種類のエクスプロイトを観察しており、可能な限りルールセットに追加していきます。このツールを自分のサーバーで実行しているので、もちろん可能な限り機能的なものにしたいと考えています!
ここで、このアプリケーションをオープンソースプロジェクトとして公開した理由に話が移ります。第一に、あなたや他の人が恩恵を受けられるようにするため、第二に、私たち全員が協力して検出ルールを提供し、アプリケーションが常に最新の状態になるようにするためです。
このツールで検出されないエクスプロイトを発見した場合は、私に連絡して知らせるか、さらに良いのは、独自のルールを作成してサードパーティのルールセット(rules/third-party/index.js)に追加し、プルリクエストを送信してください。
独自のルールの作成方法がわからなくても心配しないでください。最も重要なことはルールが追加されることですので、エクスプロイトについて可能な限り多くの情報を私に送ってください。私が独自のルールを作成するよう努めます。
ルールはカテゴリ分けされていますが、独自のルールを追加する最も簡単な方法は、上記のサードパーティのルールセットに追加することです。ルール ID は次の形式で記述されます: "author:type:sub-type(s):rule-id"。たとえば、私自身のルールの 1 つは "P64:php:cms:wordpress:wso_webshell" です。"P64" は私(作成者)、"php:cms:wordpress" はグループ化(WordPress というコンテンツ管理システム (CMS) のための PHP 固有のルール)、"wso_webshell" は特定のルール ID です。独自のルールを作成するときは、この形式に従い、"P64" を自分の GitHub ユーザー名またはその他の一意の ID に置き換えてください。
プロジェクトには Jasmine テストのセットが含まれており、npm test で実行できます。また、ESLint 設定も含まれており、ESLint は npm run lint で実行できます。
開発中は、npm run watch:test を実行することで、ソースファイルが変更されるたびにテストを実行することもできます。テストと ESLint を実行するには、npm run watch:all スクリプトを使用できます。
Jasmine や nodemon がまだインストールされていない場合は、devDependency が確実にインストールされるように、非本番モードで npm install を実行する必要があることに注意してください。
1.1.0 で追加されたディレクトリスナップショット機能と、近日追加予定の新しいルールを提案してくれた Reddit ユーザーの mayupvoterandomly に感謝します。
ISC ライセンス
Copyright (c) 2017, Simon Pugnet
ここに、以下の条件に従い、本ソフトウェアを無償で使用、複製、修正、および/または配布する許可を、有料か無料かを問わず、すべての人に付与します。上記の著作権表示およびこの許可表示が、本ソフトウェアのすべての複製または重要な部分に含まれているものとします。
本ソフトウェアは「現状のまま」提供され、商品性または特定目的への適合性に関する暗黙の保証を含むがこれに限定されない、明示的または暗黙的な一切の保証を放棄します。いかなる場合においても、著作者は、契約行為、不法行為、またはその他の行為の如何を問わず、本ソフトウェアの使用またはその他の取扱いに起因または関連して生じる、特別、直接的、間接的、または結果的な損害(データの損失、使用機会の損失、利益の損失、または事業の中断を含むがこれに限定されない)について、一切の責任を負いません。