サイト内の現在位置

オープンソースの自動マルウェア解析システム「CAPEv2」のご紹介

NECセキュリティブログ

2023年11月24日

NECサイバーセキュリティ戦略統括部セキュリティ技術センターの松本隆志です。今回は、オープンソースの自動マルウェア解析システムの1つである「CAPEv2」について紹介します。

注意: 本ブログの内容の悪用は厳禁です。本ブログの内容を使用したことによって発生する不利益等について筆者はいかなる責任も負いません。

CAPEv2とは

CAPE(Config And Payload Extraction)new window[1]は、Cuckoo Sandbox new window[2]を基に開発されたマルウェア自動解析システムの1つです。CAPEは、これまでのCuckoo Sandboxと異なり、マルウェアのペイロードや設定情報の抽出を行う機能が追加されていることが特長です。もともとはPython 2をベースにCAPEv1 new window[3]の開発が進められていましたが、2019年10月20日にPython3に対応したCAPEv2が公開されました。現在はこちらのバージョンで開発が進められています。

また、CAPEv2は、誰でも使用可能なオンライン版のインスタンス new window[4]が無償で公開されています。手軽にCAPEv2を試したい場合は、こちらをご使用ください。本ブログでは、ローカルの環境にCAPEv2を構築する方法と実際の解析例について紹介します。

CAPEv2の構築手順

本ブログでは、図1のような構成での構築手順について紹介します。Ubuntu 22.04上にCAPEv2をインストールします。マルウェアを動作させるサンドボックスとして、QEMU-KVMを用意します。また、ゲストOSは、Windows 10 20H2を採用しました。

図1: CAPEv2の構成図

1. Ubuntu 22.04の事前準備

CAPEv2には、いくつか自動インストール用のスクリプトが用意されています。これらのスクリプトの一部に「cape」というユーザに依存した設定があるようです。安定したインストールを行うためには、事前に「cape」ユーザを作成し、このユーザで構築を進めていくことをお勧めします。

$ sudo adduser cape

2. QEMU/KVMのインストール

CAPEv2には、KVM/QEMUを自動的にインストールするスクリプトが付属しています。こちらを使用してインストールします。

$ wget https://raw.githubusercontent.com/kevoreilly/CAPEv2/master/installer/kvm-qemu.sh
$ chmod +x ./kvm-qemu.sh
$ sudo ./kvm-qemu.sh all cape | tee kvm-qemu.log

インストールが完了したら、PCを再起動します。

次に、Virtual Machine Manager(virt-manager)をインストールします。こちらも同様のスクリプトでインストールできます。なお、一部足りていないパッケージがあったので、追加でインストールしています。

$ sudo apt install -y dbus-x11
$ sudo ./kvm-qemu.sh virtmanager cape | tee kvm-qemu-virt-manager.log

インストールが完了したら、PCを再起動します。

3. CAPEv2のインストール

CAPEv2も自動的にインストールするスクリプトが付属しています。まずは、このスクリプトをダウンロードします。

$ wget https://raw.githubusercontent.com/kevoreilly/CAPEv2/master/installer/cape2.sh

このスクリプトには、いくつかパラメータを設定する項目があります。エディタでcape2.shを開き、次の項目を編集します。

# PASSWD=”SuperPuperSecret”
PASSWD=”<任意のパスワード>” # データベースのパスワードとして使用されます。

編集が完了したら、実行権限を与えてスクリプトを実行します。

$ chmod +x ./cape2.sh
$ sudo ./cape2.sh all cape | tee ./cape.log

インストールが完了したら、PCを再起動します。

次にオプションとして導入されるパッケージの依存関係を解決します。基本的には、/opt/CAPEv2/extra/optional_dependencies.txtのパッケージをインストールすれば良いですが、一部足りていないパッケージやバージョンの指定が必要な項目がありました。

$ cd /opt/CAPEv2
$ sudo apt install -y libgraphviz-dev
$ sed -ie "s/flask-sqlalchemy/flask-sqlalchemy==3.0.5/" optional_dependencies.txt
$ poetry run pip install -r extra/optional_dependencies.txt

これで、CAPEv2のインストールが完了しました。ただし、実際に解析を始めるには、仮想マシンの用意やCAPEv2の設定変更が必要です。

4. 仮想マシンの用意

次にマルウェアを動作させる仮想マシンを作成します。virt-managerを起動して、「File」→「New Virtual Machine」から仮想マシンを作成できます。ここでは図2の設定で作成しました。

図2: 仮想マシンの構成

また、ゲストOSは、Windows 10 20H2を採用しました。インストールメディアとして、Windows 10 20H2のISOファイル指定しています。以上の設定で、仮想マシンを作成し、ゲストOSをインストールします。

ゲストOSのインストールが完了したら、以下の設定を行い、マルウェア解析が行える状態にします。

  • ファイアウォールの無効化
  • Windows Updateの自動更新の無効化
  • Windows Defenderの無効化
  • ユーザーアカウント制御(UAC)の無効化
  • ノイズの多いネットワークサービスの無効化
  • CAPEv2エージェントのインストール
  • ネットワークの設定
  • スナップショットの取得

4-1. ファイアウォールの無効化

次の手順でファイアウォールを無効にできます。

  1. 「コントロールパネル」→「システムとセキュリティ」→「Windows Defender ファイアウォール」→「Windows Defenderファイアウォールの有効化または無効化」を開きます。
  2. 「Windows Defenderファイアウォールを無効にする(推奨されません)」を2つ選択して、ファイアウォールを無効にします(図3)。
図3: ファイアウォールの無効化の設定箇所

4-2. Windows Updateの自動更新の無効化

次の手順でWindows Updateの自動更新を無効にできます。

  1. ローカルグループポリシーエディター(gpedit.msc)を開きます。
  2. 「コンピューターの構成」→「管理用テンプレート」→「Windowsコンポーネント」→「Windows Update」→「自動更新を構成する」を開きます(図4)。
  3. 「自動更新を構成する」を無効に設定します(図5)。
図4: 「自動更新を構成する」の設定箇所(1)
図5: 「自動更新を構成する」の設定箇所(2)

4-3. Windows Defenderの無効化

次の手順でWindows Defenderによる検出を無効にできます。

  1. 「設定」→「プライバシーとセキュリティ」→「Windowsセキュリティ」→「ウイルスと脅威の防止」→「設定の管理」を開きます(図6)。
  2. 次の項目のチェックを外します。
    • リアルタイム保護
    • クラウド提供の保護
    • サンプルの自動送信
    • 改ざん防止
  3. ローカルグループポリシーエディター(gpedit.msc)を開きます。
  4. 「コンピューターの構成」→「管理用テンプレート」→「Windowsコンポーネント」→「Windows Defenderウイルス対策」→「リアルタイム保護」→「リアルタイム保護を無効にする」を開きます(図7)。
  5. 「リアルタイム保護を無効にする」を有効にします(図8)。
  6. 「コンピューターの構成」→「管理用テンプレート」→「Windowsコンポーネント」→「Windows Defenderウイルス対策」→「Windows Defenderウイルス対策を無効にする」を開きます(図9)。
  7. 「Windows Defenderウイルス対策を無効にする」を有効にします(図10)。
図6: 「ウイルスと脅威の防止の設定」の設定箇所
図7: 「リアルタイム保護を無効にする」の設定箇所(1)
図8: 「リアルタイム保護を無効にする」の設定箇所(2)
図9: 「Microsoft Defenderウイルス対策を無効にする」の設定箇所(1)
図10: 「Microsoft Defenderウイルス対策を無効にする」の設定箇所(2)

4-4. ユーザーアカウント制御(UAC)の無効化

次の手順でUACを無効にできます。

  1. 「コントロールパネル」→「システムとセキュリティ」→「ユーザーアカウント制御の設定」を開きます。
  2. 「ユーザーアカウント制御の設定」を一番下の「通知しない」に設定します(図11)。
図11: ユーザーアカウント制御の設定

4-5. ノイズの多いネットワークサービスの無効化

まずは、次の手順でTeredoを無効にします。

  1. 管理者権限でコマンドプロンプトを開きます。
  2. 次のコマンドを実行します。

> netsh interface teredo set state disabled

次に、LLMNR(Link Local Multicast Name Resolution)を無効にします。

  1. ローカルグループポリシーエディター(gpedit.msc)を開きます。
  2. 「コンピューターの構成」→「管理用テンプレート」→「ネットワーク」→「DNSクライアント」→「マルチキャスト名前解決をオフにする」を開きます(図12)。
  3. 「マルチキャスト名前解決をオフにする」を有効にします(図13)。
図12: 「マルチキャストの名前解決をオフにする」の設定箇所(1)
図13: 「マルチキャストの名前解決をオフにする」の設定箇所(2)

最後に、ネットワーク接続の状態確認やエラー報告などの通信を制限します。

  1. ローカルグループポリシーエディター(gpedit.msc)を開きます。
  2. 「コンピューターの構成」→「管理用テンプレート」→「システム」→「インターネット通信の管理」→「インターネット通信を制限する」を開きます(図14)。
  3. 「インターネット通信を制限する」を有効にします(図15)。
図14: 「インターネット通信を制限する」の設定箇所(1)
図15: 「インターネット通信を制限する」の設定箇所(2)

4-6. CAPEv2のエージェントのインストール

まずは、Pythonをインストールします。本ブログでは、Python 3.12.0を使用しました。

  1. Pythonの公式サイト new window[5]からPython(バージョン3.6以上の32bit版)のインストーラをダウンロードします。64bit版は、サポートされていないので注意してください。
  2. 次の項目にチェックを入れて、Pythonをインストールします。
    • Add python.exe to PATH(図16)
    • Install Python 3.12 for all users(図17)
図16: Pythonのインストール(1)
図17: Pythonのインストール(2)

次に、エージェントの実行に必要なパッケージをインストールします。

> python -m pip install --upgrade pip
> python -m pip install Pillow==9.5.0

最後に、エージェントが自動的に起動するようにします。

  1. CAPEv2エージェント(agent.py)new window[6]をダウンロードします。
  2. agent.pyをagent.pywに名前を変更します。
  3. 「タスクスケジューラ」→「基本タスクの作成」からタスクを作成します。
    • 名前: <任意のタスク名>
    • トリガー: ログオン時
    • 操作: 「プログラムの開始」
    • プログラム/スクリプト: C:\Program Files (x86)\Python3.12-32\pythonw.exe
    • 引数の追加: <agent.pywの保存先パス>
  4. 作成したタスクのプロパティを開き、「最上位の特権で実行する」にチェックを入れます(図18)。
図18: 作成したタスクのプロパティ

4-7. ネットワーク設定

まずは、次の手順でVirtual Network Interface(hostonly)を作成します。

  1. ゲストOSをシャットダウンします。
  2. virt-managerを起動して、「Edit」→「Preferences」を開きます。
  3. 「Enable XML editing」にチェックを入れ、XMLを編集できるようにします(図19)。
  4. 仮想マシンを選択した状態で、「Edit」→「Connection Details」→「Virtual Networks」を開きます。
  5. 左下の+マークから、 Virtual Network Interface(hostonly)を図20の設定で作成します。
  6. 作成した Virtual Network Interface(hostonly)を選択し、XMLから次の項目を追記します(図21)。

<dns enable=”no”/>

図19: virt-managerのPreferences
図20: virtual networkの設定内容
図21: hostonlyのXMLの編集

次に作成した Virtual Network Interface(hostonly)を仮想マシンに割り当てます。

  1. 仮想マシンを選択した状態で「Open」を選択します。
  2. 「View」→「Details」→「NIC」を選択します。
  3. 「Virtual Network Interface」を「Virtual network ‘hostonly’: Isolated network」に変更します。

次にダミーサーバとして使用するINetSim new window[7]をインストールします。

$ sudo apt install -y inetsim

/etc/inetsim/inetsim.confを次のように編集します。

#service_bind_address 10.10.10.1
service_bind_address 192.168.55.1 # virbr1に割り当てられたIPアドレスを指定します。

#dns_default_ip 10.10.10.1
dns_default_ip 192.168.55.1 # virbr1に割り当てられたIPアドレスを指定します。

INetSimのサービスを再起動します。

$ sudo systemctl restart inetsim.service

最後に、ゲストOSを起動して固定IPアドレスの設定をします。「設定」→「ネットワークとインターネット」→「プロパティ」→「編集」から設定可能です。ここでは、図22の設定にしました。

図22: 固定IPアドレスの設定

固定IPアドレスの設定が完了したら、ホストOSから次のコマンドを実行して応答が返ってくることを確認します。アクセスに成功すると、図23のような応答が返ってきます。

curl http://192.168.55.2:8000

図23: CAPEエージェントの応答確認

4-8. スナップショットの取得

ゲストOSを起動した状態で、スナップショットを作成します。スナップショットは、「View」→「Snapshots」から作成できます。ここでは、スナップショット名を「cape_snapshot」とします(図24)。

図24: スナップショットの作成

5. CAPEv2の設定変更

次にCAPEv2の各種設定を行います。
[1] /opt/CAPEv2/conf/cuckoo.confを次のように編集します。

[cuckoo]
# freespace = 50000
freespace = 0 # ディスクの空き容量確認を無効にします。
# freespace_processing = 15000
freespace_processing = 0 # メモリの空き容量確認を無効にします。

[resultserver]
# ip = 192.168.1.1
ip = 0.0.0.0 # resultserverのbindするアドレスを指定します。

[2] /opt/CAPEv2/conf/reporting.confを次のように編集します。

[mongodb]
# enabled = no
enabled = yes # mongodbの有効化(レポートの管理に使用されます)

[3] /opt/CAPEv2/conf/kvm.confを次のように編集します。

[kvm]
# machines = cuckoo1
machines = win10 # win10という名前の仮想マシンを作成したので、ラベルを合わせます。

# [cuckoo1]
[win10] # 同上

# label = cuckoo1
label = win10 # 同上

# ip = 192.168.122.105
ip = 192.168.55.2 # ゲストOSに割り当てたIPアドレスを指定します。

# snapshot = Snapshot1
snapshot = cape_snapshot # 取得したスナップショット名を指定します。

# interface = virbr0
interface = virbr1 # pcapを取得するインタフェース

# resultserver_ip = 192.168.122.101
resultserver_ip = 192.168.55.1 # 結果を受け取るサーバを指定します。

# arch = x86
arch = x64 # 仮想マシンのアーキテクチャを指定します。

[4] /opt/CAPEv2/conf/routing.confを次のように編集します。

[routing]
# enable_pcap = no
enable_pcap = yes # pcapを取得するように変更します。

[inetsim]
# enabled = no
enabled = yes # INetSimを有効にします。
# server = 192.168.1.2
server = 192.168.55.1 # virbr1に割り当てられたIPアドレスを指定します。

すべての設定が完了したらPCを再起動します。再起動後にhttp://localhost:8000にアクセスして、CAPEv2のWebインタフェースにアクセスできることを確認します(図25)。

図25: CAPEv2 のWebインタフェース

CAPEv2を使ったマルウェアの自動解析の検証

構築したCAPEv2を用いて、3つの検体の解析を行ってみました。サンプルとして次の3検体をCAPEv2に投入し、設定値の抽出が可能かを確認しました。

  • Remcos new window[8]
  • AgentTesla new window[9]
  • DarkGate new window[10]から抽出したペイロード

実際に投入した結果のサマリは、図26の通りです。3つの検体のファミリ名が特定できていることが分かります。

図26: 実行結果のサマリ

さらに、図27、28、29の結果からそれぞれ設定値を抽出できていることが確認できました。

図27: Remcosの設定値の抽出結果
図28: AgentTeslaの設定値の抽出結果
図29: DarkGateの設定値の抽出結果

まとめ

オープンソースの自動マルウェア解析システムの1つである「CAPEv2」について紹介しました。実際にローカルの環境にCAPEv2を構築し、マルウェアファミリの判定や設定値の抽出が行えることを確認しました。CAPEv2をローカル環境に用意しておけば、情報公開範囲が限定的なマルウェアであっても、通信先の確認や設定値の抽出などを容易に行えます。また、CAPEv2が対応していないマルウェアもありますが、簡単にカスタマイズ可能な設計となっているため、自身で実装すれば最新のマルウェアの解析なども行えます。大量のマルウェアを自動解析させたい場合や、早急な解析が求められるインシデントレスポンスの中で活用できる非常に便利なツールですので、構築してみることをお勧めします。

参考資料

執筆者プロフィール

松本 隆志(まつもと たかし)
セキュリティ技術センター リスクハンティング・アナリシスグループ

マルウェア解析や攻撃者の行動分析などの業務を経て、現在はペネトレーションテスト、脆弱性診断などに従事。
これまでに Botconf や JSAC で講演。
趣味は、CTFとコーヒーを飲むこと。

執筆者の他の記事を読む

アクセスランキング