
Modular framework for discovering and analyzing open directories on the web. Crawls URLs, extracts content, applies YARA/ClamAV scanning, and outputs results to MISP, SQLite, or console for threat intelligence.
SubCrawlは、HP Inc.のThreat Researchチームに所属するPatrick Schläpfer、Josh Stroschein、Alex Hollandによって開発されたフレームワークです。SubCrawlは、公開ディレクトリを発見、スキャン、分析するために設計されています。このフレームワークはモジュール式で、入力モジュール、処理モジュール、出力モジュール、そしてコアのクローリングエンジンの4つのコンポーネントで構成されています。主要な入力値はURLであり、フレームワークはこれを解析し、キューシステムに追加してからクロールします。URLの解析は重要な最初のステップです。このプロセスでは、送信されたURLからサブディレクトリを1つずつ削除して、残りがなくなるまで追加のURLを生成します。これにより、Webサーバーに対するより完全なスキャン試行が保証され、追加のコンテンツの発見につながる可能性があります。特に、SubCrawlはURLの発見にブルートフォース方式を使用しません。スキャンされるすべてのコンテンツは、入力URL、URLの解析プロセス、およびクロール中の発見から得られます。公開ディレクトリが発見されると、クローリングエンジンはディレクトリからリンクを抽出して評価します。クローリングエンジンは、リンクが別のディレクトリかファイルかを判断します。ディレクトリはクローリングキューに追加され、ファイルは処理モジュールによる追加分析を受けます。スキャンされた各URLに対して、コンテンツのSHA256ハッシュやファジーハッシュ、公開ディレクトリが発見されたかどうか、YARAルールとの一致など、結果が生成され保存されます。最後に、結果データは1つ以上の出力モジュールに従って処理されます。現在は3つの出力モジュールがあります。1つ目はMISPとの統合を提供し、2つ目は単にデータをコンソールに出力し、3つ目はデータをSQLiteデータベースに保存します。フレームワークはモジュール式であるため、必要な入力モジュール、処理モジュール、出力モジュールを簡単に設定できるだけでなく、新しいモジュールを開発することも容易です。
図1 - SubCrawlのアーキテクチャ
SubCrawlは2つの異なる動作モードをサポートしています。まず、SubCrawlは1回限りの実行モードで起動できます。このモードでは、ユーザーはスキャンするURLをファイルに指定し、各入力値は改行で区切られます。2つ目の動作モードはサービスモードです。このモードでは、SubCrawlはバックグラウンドで実行され、入力モジュールがスキャンするURLを提供します。図1はSubCrawlのアーキテクチャの概要を示しています。両方の動作モードで使用されるコンポーネントは青色、1回限り実行モードのコンポーネントは黄色、サービスモードのコンポーネントは緑色です。
選択した実行モードに応じて、他の前提条件を満たす必要があります。
SubCrawlはPython3で記述されています。さらに、SubCrawlを実行する前に必要なパッケージがいくつかあります。以下のコマンドを使用して、SubCrawlを実行する前に必要なすべてのパッケージをインストールできます。crawlerディレクトリから、次のコマンドを実行します。
$ sudo apt install build-essential
$ pip3 install -r requirements.txt
SubCrawlをサービスモードで起動する場合、Dockerを使用して行うことができます。そのため、DockerとDocker Composeのインストールが必要です。良いインストール手順はDocker.comのWebサイトに直接あります。
SubCrawlには、-h/--help 引数を使用するか、スクリプトを引数なしで実行することで、組み込みのヘルプがあります。
******** ** ****** **
**////// /** **////** /**
/** ** **/** ** // ****** ****** *** ** /**
/*********/** /**/****** /** //**//* //////** //** * /** /**
////////**/** /**/**///**/** /** / ******* /** ***/** /**
/**/** /**/** /**//** ** /** **////** /****/**** /**
******** //******/****** //****** /*** //******** ***/ ///** ***
//////// ////// ///// ////// /// //////// /// /// ///
~~ Harvesting the Open Web ~~
usage: subcrawl.py [-h] [-f FILE_PATH] [-k] [-p PROCESSING_MODULES] [-s STORAGE_MODULES]
optional arguments:
-h, --help show this help message and exit
-f FILE_PATH, --file FILE_PATH
Path of input URL file
-k, --kafka Use Kafka Queue as input
-p PROCESSING_MODULES, --processing PROCESSING_MODULES
Processing modules to be executed comma separated.
-s STORAGE_MODULES, --storage STORAGE_MODULES
Storage modules to be executed comma separated.
Available processing modules:
- ClamAVProcessing
- JARMProcessing
- PayloadProcessing
- TLSHProcessing
- YARAProcessing
Available storage modules:
- ConsoleStorage
- MISPStorage
- SqliteStorage
このモードは、管理可能な数のドメインをすばやくスキャンしたい場合に適しています。この目的のために、スキャンするURLをファイルに保存し、それがクローラへの入力として機能します。以下は、1回限り実行モードでの実行例です。-f 引数がファイルへのパスとともに使用されていることに注意してください。
python3 subcrawl.py -f urls.txt -p YARAProcessing,PayloadProcessing -s ConsoleStorage
サービスモードを使用すると、より多くのドメインをスキャンし、結果を保存できます。選択したストレージモジュールに基づいて、データをより詳細に分析および評価できます。サービスモードの実行をユーザーにとってできるだけ簡単にするために、すべての機能をDockerイメージに組み込みました。サービスモードでは、スキャンするドメインは入力モジュールを介して取得されます。デフォルトでは、新しいマルウェアおよびフィッシングURLがURLhausとPhishTankからダウンロードされ、スキャンのためにキューに入れられます。希望する処理モジュールとストレージモジュールはconfig.ymlに直接入力できます。デフォルトでは、以下の処理モジュールがアクティブ化され、SQLiteストレージが使用されます。
SQLiteストレージモジュールに加えて、スキャンされたドメインとURLを表示および管理できるシンプルなWeb UIも開発されました。

ただし、このUIでデータのその後の評価に不十分な場合は、MISPストレージモジュールを代わりにまたは追加でアクティブ化できます。対応する設定はconfig.ymlのMISPセクションで行う必要があります。
以下の2つのコマンドで、GITリポジトリをクローンし、Dockerコンテナを作成して直接起動できます。その後、Web UIはアドレスhttps://localhost:8000/でアクセスできます。コンテナが起動すると、入力モジュールが処理キューにURLを追加し始め、エンジンがホストのクロールを開始することに注意してください。
git clone https://github.com/hpthreatresearch/subcrawl.git
docker-compose up --build
入力モジュールはサービスモードでのみ使用されます。SubCrawlが1回限り実行モードで起動された場合は、スキャンするURLを含むファイルを指定する必要があります。以下の2つの入力モジュールが実装されています。
URLhausは、悪意のあるURLを追跡する著名なWebサービスです。このWebサービスは、新しく検出されたURLを含むエクスポートも提供しています。これらのマルウェアURLは、主に悪意のあるドメインを分析したいため、クローラへの完璧な入力となります。最近送信されたURLが取得され、APIリクエスト(タグやその他の利用可能なパラメータなど)によって検索結果は絞り込まれません。この入力モジュールでURLHaus APIに対して行われるHTTPリクエストは、取得結果をさらに絞り込むために変更できます。
PhishTankは、フィッシングURLを収集するWebサイトです。ユーザーは新しく見つかったフィッシングページを送信できます。アクティブなフィッシングURLを含むエクスポートを生成し、APIを介してこのWebサービスからダウンロードできます。これはクローラにとっても理想的なコレクションです。
SubCrawlにはいくつかの処理モジュールが含まれています。処理モジュールはすべて、結果をコアエンジンに提供する方法について同様の動作に従います。一致が見つかると、結果がコアエンジンに返され、その後ストレージモジュールに提供されます。以下は処理モジュールのリストです。
SDHash処理モジュールは、HTTP応答の類似性ハッシュを計算するために使用されます。ハッシュを正常に計算するには、コンテンツの最小サイズが512バイトである必要があります。これはおそらくインストールが最も複雑な処理モジュールであり、Protobufが必要であり、ターゲットホストによっては再コンパイルする必要があります。そのため、この処理モジュールはデフォルトで無効になっています。コンパイル済みのバージョンはcrawler/processing/minisdhash/にあります。これにはprotobuf-2.5.0とpython3.6が必要です。これらのバイナリはUbuntu 18.04.5 LTS x64上でコンパイルされました。インストール手順は次のとおりです。
# Protobufのインストール
> apt-get update
> apt-get -y install libssl-dev libevent-pthreads-2.1-6 libomp-dev g++
> apt-get -y install autoconf automake libtool curl make g++ unzip
> wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.zip
> unzip protobuf-2.5.0.zip
> cd protobuf-2.5.0
> ./configure
> make
> sudo make install
# Python3.6のインストール
> apt-get install python3.6-dev
> sudo ldconfig
# SDHashのインストール
> git clone https://github.com/sdhash/sdhash.git
> cd sdhash
> make
> make install
> ldconfig
JARMは、Salesforceによって開発されたTLS接続をフィンガープリントするツールです。JARM処理モジュールは、ドメインのスキャンを実行し、JARMハッシュをドメインとともにコアエンジンに返します。Webサーバーの構成に応じて、TLSハンドシェイクには異なる特性があります。このハンドシェイクの属性のハッシュを計算することにより、これらの違いを使用してWebサーバー構成を追跡できます。
TLSH処理モジュールは、類似性ハッシュを計算するために使用されるSDHash処理モジュールと同様です。TLSHの利点は、インストールがはるかに簡単で、入力の最小サイズが50バイトと小さいことです。ほとんどのWebシェルログインはかなり小さく、私たちの研究の焦点であったため、この処理モジュールをデフォルトで有効にしました。
YARA処理モジュールは、HTTP応答コンテンツをYARAルールでスキャンするために使用されます。この処理モジュールを呼び出すには、処理モジュールの引数として値YARAProcessingを指定します。たとえば、次のコマンドはYARA処理モジュールをロードし、ConsoleStorageストレージモジュールを介して出力をコンソールに生成します。
python3 subcrawl.py -p YARAProcessing -s ConsoleStorage
現在、YARA処理モジュールはWebシェルログインやその他のさまざまな興味深いコンテンツを識別するために使用されています。このプロジェクトに含まれるYARAルール:
サンプル出力:

追加のYARAルールを追加するには、yara-rulesフォルダに.YARファイルを追加し、combined-rules.yarにincludeステートメントを追加してルールファイルを含めます。
ClamAV処理モジュールは、スキャン中にHTTP応答コンテンツをClamAVでスキャンするために使用されます。一致が見つかった場合、それはさまざまな出力モジュールに提供されます。この処理モジュールを呼び出すには、処理モジュールの引数として値ClamAVProcessingを指定します。たとえば、次のコマンドはClamAV処理モジュールをロードし、ConsoleStorageストレージモジュールを介して出力をコンソールに生成します。
python3 subcrawl.py -p ClamAVProcessing -s ConsoleStorage
サンプル出力:

このモジュールを利用するには、ClamAVをインストールする必要があります。ターミナルから、APTパッケージマネージャーを使用してClamAVをインストールします。
$ sudo apt-get install clamav-daemon clamav-freshclam clamav-unofficial-sigs
インストール後、ClamAVアップデートサービスはすでに実行されているはずです。ただし、freshclamを使用して手動で更新する場合は、サービスを停止してください。
sudo systemctl stop clamav-freshclam.service
そして、freshclamを手動で実行します。
$ sudo freshclam
最後に、ClamAVサービスのステータスを確認します。
$ sudo systemctl status clamav-daemon.service
サービスが実行されていない場合は、systemctlを使用して起動できます。
$ sudo systemctl start clamav-daemon.service
Payload処理モジュールは、libmagicライブラリを使用してHTTP応答コンテンツを識別するために使用されます。さらに、SubCrawlは、PEファイルやアーカイブなど、関心のあるコンテンツを保存するように設定できます。この処理モジュールを呼び出すには、処理モジュールの引数として値PayloadProcessingを指定します。たとえば、次のコマンドはPayload処理モジュールをロードし、出力をコンソールに生成します。
python3 subcrawl.py -p PayloadProcessing -s ConsoleStorage
このモジュールに追加の依存関係はありません。
サンプル出力:

ストレージモジュールは、キュー内のすべてのURLがスキャンされた後、SubCrawlエンジンによって呼び出されます。これらは2つの目的で設計されました。1つ目は、スキャンキューが終了した直後にスキャン結果を取得すること、2つ目は長期保存と分析を可能にすることです。そのため、ConsoleStorageモジュールだけでなく、MISP統合とSQLiteストレージモジュールも実装しました。
URLをスキャンした直後に結果をすばやく分析するために、整形された出力がコンソールに出力されます。この出力は、SubCrawlを1回限り実行モードで使用する場合に最適です。このアプローチは単一のドメインをスキャンしたり、簡単な出力を生成したりするのには適していますが、長期的な研究や分析には扱いにくいです。

Elasticクラスターとの統合も利用可能です。各URLとそのデータはイベントとしてインデックス化され、Yaraなどの他のモジュールからの出力も含まれます。このモジュールを使用するためのデフォルトのダッシュボードも追加されています。_elasticsearch_セクションの更新が必要です。これには以下が含まれます。
この出力モジュールを使用するには、-s 引数で値 ElasticStorage を指定します。
MISPのインストールと設定には時間がかかる可能性があるため、データをSQLiteデータベースに保存する別のモジュールを実装しました。ユーザーにデータをできるだけシンプルかつ明確に提示するために、シンプルなWeb GUIも開発しました。このWebアプリケーションを使用して、スキャンされたドメインとURLをすべての属性とともに表示および検索できます。これは初期バージョンであるため、複雑な比較機能はまだ実装されていません。

MISPは、柔軟なデータモデルとAPIを備えたオープンソースの脅威インテリジェンスプラットフォームであり、脅威データを保存および分析します。SubCrawlはクロールされたデータをMISPイベントに保存し、ドメインごとに1つのイベントを公開し、特定されたオープンディレクトリを属性として追加します。MISPでは、ユーザーがイベントと属性にタグを定義することもできます。これはイベントの比較やリンク分析に役立ちます。これは私たちの主要な研究目標の1つであったため、SubCrawlの出力をMISPにエクスポートする際にURLHausのデータを強化しました。URLHausはタグを使用してデータに注釈を付け、URLに関連付けられたマルウェアファミリや脅威アクターを識別できます。各オープンディレクトリURLについて、モジュールはローカルに保存されたURLHausデータをクエリし、一致する場合にURLHausタグをMISPイベントに追加します。各MISPイベントに関連のない属性が集まらないように、スキャンされたURL用にopendir-urlという新しいMISPオブジェクトを作成しました。これにより、関連する属性がまとめられ、データの概要を把握しやすくなります。

処理モジュールとストレージモジュールのテンプレートがフレームワークの一部として提供されています。
処理モジュールは crawler->processing にあり、サンプルモジュールファイル example_processing.py がこのディレクトリにあります。テンプレートは、フレームワークによる実行を保証するために必要な継承とインポートを提供します。init 関数はモジュールの初期化を提供し、ロガーとグローバル設定のインスタンスを受け取ります。ロガーは、処理モジュールおよびフレームワーク全体のログ情報を提供するために使用されます。
process 関数は、各HTTP応答を処理するために実装されます。このために、URLと生の応答コンテンツを受け取ります。ここでモジュールの作業が実装されます。この関数は、以下のフィールドを持つ辞書を返す必要があります。
一意のクラス名を定義する必要があり、-p 引数でこのモジュールを含める場合や、設定ファイルでデフォルトの処理モジュールとして定義する場合に使用されます。
最後に、__init__.py にクラス名を使用してインポートステートメントを追加します。
from .<REPLACE>_processing import <REPLACE>Processing
ストレージモジュールは crawler->storage にあり、サンプルモジュールファイル example_storage.py がこのディレクトリにあります。処理モジュールと同様に、init 関数はモジュールの初期化を提供し、ロガーとグローバル設定のインスタンスを受け取ります。store_results 関数は、設定ファイルのバッチサイズで定義された間隔でエンジンから構造化データを受け取ります。
一意のクラス名を定義する必要があり、-s 引数でこのモジュールを含める場合や、設定ファイルでデフォルトの処理モジュールとして定義する場合に使用されます。
2021年:
SubCrawlはMITライセンスの下でライセンスされています。