
Crawlectorは、悪意のあるオブジェクトをスキャンするために設計された脅威ハンティングフレームワークです。
Crawlector(名前CrawlectorはCrawler(クローラー)と Detector(検出器)を組み合わせたものです)は、Webサイトを悪意のあるオブジェクトについてスキャンするために設計された脅威ハンティングフレームワークです。
注1: このフレームワークは、2022年10月22日にイタリア・ベルガモで開催されたNo Hatカンファレンスで初めて発表されました(スライド、YouTube録画)。また、2022年12月2日にシンガポールで開催されたAVARカンファレンスでも2回目の発表が行われました。
注2: トークで言及された関連ツールEKFiddle2Yara(EKFiddleルールを取得し、Yaraルールに変換するツール)も両カンファレンスでリリースされました。
注3: バージョン2.0(Photoidビルド:180923)は、マイルストーンリリースとして2023年9月18日にリリースされました。
注4: バージョン2.1(Universe-647ビルド:031023)は2023年10月3日にリリースされました。主な追加機能はSlackアラート通知機能です。
注5: バージョン2.2(Hallstattビルド:051123)は2023年11月5日にリリースされました。主な追加機能はSlackリモートコントロール機能です。
注6: バージョン2.3(Munichビルド:241123)は2023年11月24日にリリースされました。主な追加機能はDNSネームサーバー機能です。
注6: バージョン2.3.1(Neroビルド:131225)は2025年12月13日にリリースされました。これはメンテナンスリリースです。
これは、スキャンされるすべてのページに対して悪意のあるURLをチェックするためのものです。フレームワークは、URLHausサーバーから悪意のあるURLのリストをクエリするか(設定: url_list_web)、ディスク上のファイルからクエリするか(設定: url_list_file)を使用します。後者が指定された場合は、前者よりも優先されます。
これは、各ページのコンテンツをurl_list_webまたはurl_list_file内のすべてのURLエントリに対して検索し、すべての出現をチェックすることで機能します。さらに、一致した場合、設定オプションcheck_url_apiがtrueに設定されていると、Crawlectorは設定オプションurl_apiで設定されたAPI URLにPOSTリクエストを送信し、一致したURLに関する追加情報を含むJSONオブジェクトを返します。その情報には、urlh_status(例:online、offline、unknown)、urlh_threat(例:malware_download)、urlh_tags(例:elf、Mozi)、urlh_reference(例:https://urlhaus.abuse.ch/url/1116455/)が含まれます。この情報は、check_url_apiがtrueに設定されている場合にのみ、ログファイルcl_mlog_<current_date><current_time><(pm|am)>.csv(以下を参照)に含まれます。それ以外の場合、ログファイルには、check_urlがtrueに設定されている場合に限り、列urlh_url(一致した悪意のあるURLのリスト)とurlh_hit(一致した悪意のあるURLごとの出現回数)が含まれます。
URLHaus機能は、設定オプションcheck_urlをfalseに設定することで完全に無効にできます。
この機能はスキャンを遅くする可能性があることに注意してください。これは、チェックする必要がある悪意のあるURLの膨大な数(執筆時点で約1億3000万エントリ)と、URLHausサーバーから追加情報を取得するのにかかる時間(オプションcheck_url_apiがtrueに設定されている場合)によるものです。
セッションを実行する前に、設定ファイルcl_config.iniをよく理解しておく必要があります。すべてのセクションとパラメータは設定ファイル自体に文書化されています。
Yaraオフラインスキャン機能はスタンドアロンのオプションです。つまり、有効にすると、Crawlectorは他の有効な機能に関係なく、この機能のみを実行します。また、ドメイン/サイトのデジタル証明書のクロール機能も同様です。いずれにせよ、設定ファイルで未使用の機能をすべて無効にすることをお勧めします。
log_to_fileまたはlog_to_cons)に応じて、Yaraルールがモジュールの属性(例:PE、ELF、Hashなど)のみを参照している場合、Crawlectorはマッチ時にルール名のみを表示し、オフセットと長さのデータは除外します。注意: パスを取るオプションについては、常に絶対パスを指定してください。
Webサイトにアクセス/スキャンするには、URLのリストをテキストファイルに保存し、ディレクトリ「cl_sites」に配置する必要があります。
Crawlectorは3種類のURLを受け入れます。
[a-zA-Z0-9_-]{1,128} = <url><id>[depth:<0|1>-><\d+>,total:<\d+>,sleep:<\d+>] = <url>
例えば、
mfmokbel[depth:1->3,total:10,sleep:0] = https://www.mfmokbel.com
これは以下と同等です:
mfmokbel[d:1->3,t:10,s:0] = https://www.mfmokbel.com
ここで、<id> := [a-zA-Z0-9_-]{1,128}
depth、total、sleepは、それぞれ短縮版のd、t、sに置き換えることもできます。
40 (10 + (10*3))個のURLになります。注1: タイプ3のURLは、設定ファイルのスパイダーセクションで設定パラメータlive_crawlerをfalseに設定することで、タイプ1のURLに変換できます。
注2: 空行および「;」、「#」または「//」で始まる行は無視されます。
スパイダー機能は、Crawlectorにターゲットページ上の追加リンクを見つける機能を提供します。スパイダーは以下の機能をサポートします。
Type 3である必要がありますexclude_url設定オプションを使用して、一致するURLのスパイダリングを防ぐためのワイルドカードパターンのリスト(パイプ区切り)を指定できます。例: *.zip|*.exe|*.rar|*.zip|*.7z|*.pdf|.*bat|*.dbinclude_url設定オプションを使用して、パターンに一致するURLのみをスパイダーするためのワイルドカードパターンのリスト(パイプ区切り)を指定できます。例: */checkout/*|*/products/*exclude_httpsを使用して、HTTPS URLを除外できますadd_ext_linksを使用して、メインページのみについて外部リンクも考慮できます。この機能はexclude_urlおよびinclude_url設定オプションを尊重します。ext_links_onlyを使用して、他のすべてのURLを除外し、メインページの外部リンクのみを考慮できます。この機能はexclude_urlおよびinclude_url設定オプションを尊重します。リリース2.0では、IDには次のタイプのいずれかをID自体に追加することで、タイプが明示的に割り当てられます。
各IDがそのタイプを保持することで、結果の参照とフィルタリングが容易になります。さらに、これは内部で様々な理由で使用されます。
site_rankingには、CSVファイルの読み取り方法を変更するためのいくつかのオプションが用意されていますsiteセクションは、同じドメインに対して利用可能なすべてのトップレベルドメイン(TLD)やサブドメインを見つけようとすることで、特定のサイトを拡張する機能を提供します。見つかった場合、新しいTLD/サブドメインは他のドメインと同様にチェックされます。rapid_api_keyにプラグインします。find_tldsが有効な場合、Omnisint Labs APIのtlds結果に加えて、フレームワークはtlds_fileまたはtlds_url内のすべてのtldエントリをチェックすることで、他のアクティブ/登録済みドメインを見つけようとします。tlds_urlが設定されている場合、TLDをホストするURL(各行に1つのTLD)を指す必要があります(「;」、「#」、または「//」のいずれかの文字で始まる行は無視されます)。tlds_fileは、TLDのリストを含むファイル名を保持します(tlds_urlと同じ;TLDのみが存在し、「.」は除外されます。例:「com」、「org」)。tlds_fileが設定されている場合、tlds_urlよりも優先されます。tld_dl_time_outは、問題のドメインが解決するかどうかをチェックする際のdnslookup機能の最大タイムアウトを設定するためのものです。以前のリリースのURLリダイレクト機能は壊れていました。このリリースでは、その操作を制御するための高度なパラメータ化を備えた、リダイレクト機能の完全な書き直しが提供されています。リリースバージョン2.0では、リダイレクトには設定ファイルに専用のセクション**[redirect]があります。リダイレクト機能全体は、セクション[default]のオプションfollow_redir**でオン/オフを切り替えることができます。
リダイレクト関数は、HTTP応答ステータスコード301、302、303、307、308をチェックします。一致した場合、CrawlectorはLocationヘッダーを解析してリダイレクト先のURLを取得し、絶対URLと相対URLの両方に対応します。Crawlectorのリダイレクト機能は、パフォーマンスと機敏性を考慮して設計されています。**[redirect]**セクションでは、次のオプションが提供されています。
depthオプションは、値lastまたはallのいずれかを取ります。これは、visitオプションが有効かどうかに応じて、見つかったどのリダイレクトURLにアクセスするかを制御します。allは、見つかったすべてのリダイレクトURLにアクセスするためのものです。lastは、最後のリダイレクトURLにアクセスするためのものです。これらのURLへのアクセスは、同じ/現在のセッションで行われます。depthの値に関係なく、Crawlectorは見つかったすべてのリダイレクト先URLのリストを絶対形式で記録し、総数も記録することに注意してください。これらはcl_mlog CSVファイルの列_redirect_urls_および_redirect_total_に書き込まれます。
オプションmax_redirectは、発見するURLリダイレクトの総数の上限を設定します。
オプションskip_similarは、次の例で最もよく説明されます。
リリース2.0の主要な追加機能の1つは、ページからさまざまなタイプのオブジェクトを抽出し、ディスクに保存し、YaraおよびURLHausでスキャンし、結果をCSVファイルに保存する機能です。この機能を有効にするには、セクション**[page]のオプションextract_obj**をtrueに設定します。オブジェクト深層抽出機能の実装は、WebページからMHT Webアーカイブファイルを作成し、外部スクリプト、画像、CSSファイルを含めることで機能します。埋め込まれたすべてのファイルは、オプション obj_dir で指定されたパス(パス: obj_dir/objects/)に抽出され、各ファイルがスキャンされます。この実装は、ヘッドレスブラウザ機能と混同しないでください。DOEは異なり、動的にクエリされたすべてのURLを取得するためにページをロードする必要はありません。したがって、制限があります。
抽出されたすべてのオブジェクトは、そのメタデータの一部がCSVファイルに書き込まれます。CSVファイルを読み取る際に注意すべき点:抽出されたオブジェクトを含むドメインのIDは、次のような一意の形式を持ちます。<domain_id>_<type>_p_obj_<counter> (例: _mfa_gov_cef40bc5-ba6a-41_t1_p_obj_0_) 。また、URLは次の形式になります。<url>__<object_filename> (例: _https://www.mfa.gov.law\_\_bilmur.min.js_)。
オプション delete_obj が true に設定されている場合、Yara によって検出されなかった抽出オブジェクトはすべてディスクから削除されます。 オプション log_all_objs が true に設定されている場合、抽出されたすべてのオブジェクトのメタデータが同じ cl_mlog CSV ファイルに記録されます。 [page] セクションのオプション check_urlhaus が true に設定されている場合、抽出されたすべてのオブジェクトが URLHaus でスキャンされます。このオプションの設定は [urlhaus] セクションから継承されることに注意してください。
注: クロール対象のドメインが別のドメインにリダイレクトする場合、DOE が機能するには最後のリダイレクト先の URL を渡す必要があります。さらに、DOE が機能するには、ドメインが "HTTP(S)://" で始まる必要があります。
場合によっては、たとえば Alexa 上位 100 万サイトをクロールするなど、完了までに数日かかる Crawlector セッションを実行したいことがあります。そのようなシナリオでは、フレームワークの動作と進捗をリモートで監視する方法が必要です。そのため、リリース2.1では、Yara のアラート、std::exit() イベント、プロセスの警告やエラーを任意の Slack チャンネルに送信することで、Crawlector の実行をリアルタイムで監視するメカニズムを提供する Slack アラート通知機能を追加しました。さらに、Crawlector はコンソールハンドラーをインストールし、ctrl_c、ctrl_close、ctrl_break、ctrl_logoff、ctrl_shutdown などの特定のイベントタイプを監視しようとします。重要なのは、Crawlector はデフォルトのハンドラーの動作を変更/改変しないことです。リストされたイベントのいずれかを受信したことを Slack チャンネルに報告するだけです。これは将来、他のタイプのイベントに対応するために拡張される可能性があります。
この機能は Slack REST API を使用し、サーバーとの認証には OAuth 2.0 を使用します。使用するには Slack API トークンと、適切な権限で設定されたチャンネルが必要です。この機能は Slack チャンネルにメッセージを投稿するだけで、受信メッセージを受信したり処理したりしません。
[slack_alert] セクションでは、次のオプションリストが提供されます。
この機能を無効または有効にするには、オプション alert を true または false に設定するだけです。さらに、api_token と channel 名を指定する必要があります。
注-1: Crawlector の初期化フェーズでは、提供された認証トークンが有効かどうか、またはチャンネルが設定されているかどうかをテストし、失敗した場合、この機能は自動的に無効になります。
Slack チャンネルに報告されるすべてのアラートは、ユーザー名 Crawlector v<バージョン番号> で報告されます。例: Crawlector v2.1。ユーザーのアイコンはクモの巣です。さらに、すべてのアラートはスレッド化されており、最初の開始メッセージ以降のすべてのアラートは返信として投稿されます。これは設計上の決定であり、同じチャンネルに報告する複数のセッションを同時に実行している場合に役立ちます。一部のアラートは、書式設定にマークダウンマークアップ言語を使用しています。
プロセスが正常に終了し、終了しようとしているときは、次のメッセージを投稿します。
Crawlector は正常に終了し、シャットダウンしています
注-2: Slack の投稿メッセージ API のレート制限は、1秒あたり1メッセージで、多少のバーストは許容されます。Crawlector は、1秒あたりの投稿数を増やすためにメッセージをキューイングしません。これは、必要に応じて将来変更される可能性があります。ただし、オプション sleep により、メッセージが正常に投稿されるたびに、指定された時間だけプロセスをスリープさせることができます。
リリース2.2(コードネーム Hallstatt)では、特別に設計された一連の制御コマンドを介して Crawlector をリモート制御する機能を導入しています。この機能を導入した理由は、数時間または数日間実行されるセッションの特定の動作を監視および制御するためです。たとえば、Slack アラート機能のオン/オフ、Crawlector の終了、設定ファイルのアップロードなどが可能です。
この機能は Slack REST API を使用し、サーバーとの認証には OAuth 2.0 を使用します。使用するには Slack API トークンと、適切な権限で設定されたチャンネルが必要です。API トークンは [slack_alert] セクションのオプション api_token で使用されるものと同じです。
[slack_alert] セクションでは、リモートコントロール機能のために次の追加オプションリストが提供されます。
この機能を無効または有効にするには、オプション control を true または false に設定するだけです。ctrl_channel 名はチャンネル名ではなくチャンネルID名である必要があります。これは、チャンネル名を右クリック -> チャンネル詳細を表示 -> ウィンドウの下部までスクロールすると、チャンネルID: <channel_id> フィールドが表示されます。
オプション ctrl_sleep は、制御コマンドを取得するために ctrl_channel オプションで指定された制御チャンネルに呼び出す頻度を決定します。このオプションは、制御コマンド cl_update_delay <時間_ミリ秒> を介して更新することもできます。
サポートされている制御コマンドのリストは次のとおりです。
注-1: Crawlector の初期化フェーズでは、提供された認証トークンが有効かどうか、またはチャンネルが設定されているかどうかをテストし、失敗した場合、この機能は自動的に無効になります。
この機能が有効になり、API トークンの検証に合格すると、Crawlector は指定された ctrl_channel にメッセージ「Crawlector は制御コマンドを受信する準備ができています。サポートされている制御コマンドのリストについては、コマンド cl_help を入力してください。」を送信します。
特定の制御コマンドへの応答はすべてスレッド化されます。さらに、制御コマンドはセッションごとに、セッションが開始された時点から読み取られます。
注-2: Slack の取得(会話履歴)メッセージ API のレート制限は、1秒あたり1リクエストで、多少のバーストは許容されます。そのため、ctrl_sleep オプションが1秒未満または1秒超に設定されている場合、Crawlector は1秒あたりの制御コマンドを増やすためにメッセージをキューイングし、受信した順に実行します。
リリース2.3(コードネーム Munich)では、Crawlector が試行するすべての DNS クエリおよび DNS から IP への解決に対して、DNS ネームサーバーのリストを高い制御レベルで指定する機能が導入されました。これは、ブロックされた Web サイトや悪意のある Web サイトをクロールする場合に重要です。この機能は、Crawlector 内で DNS クエリまたは DNS から IP への要求が行われるすべての関数に適用されます。さらに重要なことに、それをサポートするすべてのネームサーバーに対して DNS over TLS を実行する機能を提供します。
[dns_ns] セクションでは、この機能を管理するための次のオプションリストが提供されます。
オプション name_servers は、カンマ区切りで使用する DNS ネームサーバーのパラメータ化されたリストを受け取ります。このオプションの値は形式 <IPv4_address>(<tls_option>) で、<tls_option> は値 "d_tls" または "e_tls" のいずれかです。オプション "d_tls" または "e_tls" は、対象のネームサーバーが DNS over TLS をサポートしているかどうかをそれぞれ示します。このオプションは、オプション dns_tls に設定された値に応じて適用されます。たとえば、エントリ 8.8.8.8(e_tls) は Google DNS サーバー 8.8.8.8 を TLS サポート付きで使用することを示し、エントリ 12.13.14.15(d_tls) は DNS サーバー 12.13.14.15 を TLS サポートなしで使用することを示します。
オプション dns_tls は、必要な TLS 適用レベルを指定します。このオプションは "yes" "no" または "force" のいずれかの値を取ります。
オプション keep_default は、デフォルトのネームサーバーをネームサーバーのリストに追加するかどうかを指定します。デフォルトのネームサーバーは TLS をサポートしていないと見なされます。
オプション conn_time_out は、DNS クエリの応答を待機する時間をミリ秒単位で指定します。
オプション enable は、この機能のオン/オフを切り替えます。
cl_sites 内のドメイン/URL の重複は許可されています。プルリクエストとイシューは歓迎します。コメントや提案は大変ありがたく受け付けています。
Mohamad Mokbel (@MFMokbel)
| id_postfix (タイプ) | 説明 |
|---|
| _t1_p | IDなしのプレーンタイプ1 |
| _sd | サブドメイン用のサブタイプ |
| _tld | TLD用のサブタイプ |
| _t2_p | ID付きのプレーンタイプ2 |
| _t3_s | スパイダリングされたドメインのタイプ3 |
| _t3_sc | 子ノードを持つスパイダリングされたドメインのタイプ3 |
| _t3_ss | タイプ3(_t3_s)URLがタイプ1URLに変換された場合のタイプ3 |
| _t3_s_e | タイプ3スパイダリングされたドメインの外部リンク |
| _obj_ | 深層スキャンとオブジェクト抽出用 |
| _t4_ru | リダイレクトURL用(全タイプ) |
tld_use_connectは、オプションtlds_connect_portsで定義されたポートリストに対して問題のドメインに接続する機能を有効にします。tlds_connect_portsは、カンマ区切りのポートリスト、または範囲のリスト(例:25-40,90-100,80,443,8443(範囲の開始と終了を含む))を受け入れます。
tld_con_time_outは、接続機能の最大タイムアウトを設定するためのものです。tld_con_use_sslは、ドメインに接続しようとする際のSSLの使用を有効/無効にします。save_to_file_subdがtrueに設定されている場合、発見されたサブドメインは「\expanded\exp_subdomain_<pm|am>.txt」に保存されます。save_to_file_tldがtrueに設定されている場合、発見されたドメインは「\expanded\exp_tld_<pm|am>.txt」に保存されます。exit_hereがtrueに設定されている場合、Crawlectorはこの[site]機能を実行した後に終了し、他の有効なオプションは無視されます。つまり、見つかったサイトはクロール/スパイダリングされません。| 制御コマンド | 説明 |
|---|
| cl_get_date | Crawlector が開始された日時と現在の日時を取得します。 |
| cl_ping | メッセージ「Pong...」を返信します。C&C チャンネルが機能していることを確認するためです。 |
| cl_get_config | 現在使用中の設定ファイル(例: cl_config.ini)をテキストファイルとしてアップロードします。 |
| cl_update_delay <整数_ミリ秒> | 制御コマンドのプルリクエスト間のチェックイン時間を更新します。 - 現在のセッションのみの値(ctrl_sleep)を変更します。 |
| cl_turn_off_slack_alert | 現在アクティブなセッションの Slack アラート機能を_オフ_にします。 |
| cl_turn_on_slack_alert | 現在アクティブなセッションの Slack アラート機能を_オン_にします。 |
| cl_help | このヘルプメッセージを表示します。 |
| cl_exit | Crawlector を強制終了します。 |