Japan

関連リンク

関連リンク

関連リンク

関連リンク

サイト内の現在位置

MWDBとKartonを用いたマルウェア管理システムの構築方法のご紹介

NECセキュリティブログ

2024年7月26日

NECサイバーセキュリティ戦略統括部 セキュリティ技術センターの松本隆志です。本ブログでは、オープンソースのマルウェア管理システムである「MWDB」とマルウェア分析システムの「Karton」について紹介します。また、それらを用いたマルウェア管理システムの構築方法を紹介します。

目次

MWDBについて

MWDBnew window[1]new window[2]は、CERT Polskanew window[3]によって開発されたオープンソースの自動マルウェア収集・分析用のマルウェアリポジトリです。MWDBには、以下のような機能が備わっています。

  • マルウェアのバイナリファイルや構成情報を保存するストレージ
  • 各オブジェクトの関係の追跡機能と見える化
  • 検索機能
  • データ共有とユーザ管理の仕組み
  • Webhookとプラグインシステムによる統合機能

MWDBは、アップロードされたファイルの管理だけではなく、検索機能も充実しており、図1のような操作で検体の検索ができます。

図1:クエリによる検索
(出典: new window1. Introduction to MWDB — mwdb-core 2.13.0 documentation

図1のページから検体を選択すると、図2のような検体の詳細情報を確認できます。

zoom拡大する
図2: 検体の詳細情報ページ
(出典: new window1. Introduction to MWDB — mwdb-core 2.13.0 documentation

また、図3のようにマルウェアから抽出したConfig情報を検体に紐づけて管理することもできます。

zoom拡大する
図3: マルウェアのConfig情報のページ
(出典: new window3. Storing malware configurations — mwdb-core 2.13.0 documentation

さらに、図4のようにアップロードされたファイルに関連する情報をグラフで確認することもできます。

図4: ファイルの関連情報のグラフ表示
(出典: new window1. Introduction to MWDB — mwdb-core 2.13.0 documentation

Kartonについて

Kartonnew window[4]new window[5]は、バックエンドでのマルウェア分析用のフレームワークです。Kartonは、単一で動作するシステムではなく、マイクロサービスの集合です。公式のリポジトリで公開されているKartonサービスは、以下の通りです。

  • karton:システム内のタスクの管理を担うサービス(Kartonのメインサービス)
  • karton-dashboardnew window[6]: タスクやキューの管理と監視を行うためのダッシュボード
  • karton-classifiernew window[7]: ファイルの種類を識別するサービス
  • karton-archive-extractornew window[8]: 汎用的なアーカイブの展開機能を持つサービス
  • karton-config-extractornew window[9]: マルウェアの設定値を抽出するためのサービス
  • karton-mwdb-reporternew window[10]: 分析中に生成されたファイル、タグ、コメントなどをMWDBに送信するサービス
  • karton-yaramatchernew window[11]: YARAスキャンを行うサービス
  • karton-asciimagicnew window[12]:エンコードされたファイルをデコードするサービス
  • karton-autoit-rippernew window[13]: AutoItファイルからスクリプトとリソースを抽出するサービス

Kartonは、これらのサービスを組み合わせることで、マルウェアの分析を行います。

MWDBは、マルウェアを分析する機能を持っていません。代わりにKartonサービスがマルウェアを分析し、その結果をMWDB側に提供しています。

構築する環境について

本ブログでは、図5のイメージ図の構成でMWDBとKartonサービスを構築する方法について紹介します。

図5: 構築する環境の構成イメージ

実際に以下の設定のVM上に構築できることを確認しました。

  • メモリ: 4GB
  • プロセッサ: 2コア
  • ハードディスク: 25GB
  • OS: Ubuntu 22.04

MWDBの構築手順

MWDBの構築手順について、以下の順に説明します。

  • MinIOのセットアップ
  • PostgreSQLのセットアップ
  • MWDBのセットアップ
  • GunicornとNginxのセットアップ
  • MWDBの動作確認

MinIOのセットアップ

MWDBおよびKartonは、AWSのS3new window[14]互換のストレージサービスであるMinIOnew window[15]を用いてファイルを管理しています。以下にMinIOのセットアップ方法を示します。

MinIOサーバを動作させるユーザを作成します。また、MinIO関連のデータ格納用のディレクトリを作成します。

$ sudo useradd -M minio
$ sudo mkdir -p /opt/minio/bin /opt/minio/data
$ sudo chown -R minio:minio /opt/minio

MinIOサーバとクライアントの実行ファイルをダウンロードします。また、実行権限を与えて、パスの通っている/usr/local/binにシンボリックリンクを作成しておきます。

# MinIOサーバ
$ sudo -u minio wget https://dl.min.io/server/minio/release/linux-amd64/minio -O /opt/minio/bin/minio
$ sudo -u minio chmod +x /opt/minio/bin/minio
$ sudo ln -s /opt/minio/bin/minio /usr/local/bin/

# MinIOクライアント
$ sudo -u minio wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /opt/minio/bin/mc
$ sudo -u minio chmod +x /opt/minio/bin/mc
$ sudo ln -s /opt/minio/bin/mc /usr/local/bin/

MinIOの設定情報を記載したenvファイルを作成します。MINIO_ROOT_USER、MINIO_ROOT_PASSWORDの値は、自身で調整してください。

$ sudo -u minio tee /opt/minio/minio.env << 'EOF' > /dev/null
MINIO_VOLUMES="/opt/minio/data/"
MINIO_OPTS="--address :9000 --console-address :9001"
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadminpass
EOF

minio.envの権限を変更します。

$ sudo chmod 400 /opt/minio/minio.env

MinIOサーバの起動用にSystemdのサービスファイルを作成します。

$ sudo tee /etc/systemd/system/minio.service << 'EOF' > /dev/null
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local/

User=minio
Group=minio

EnvironmentFile=/opt/minio/minio.env
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

Restart=always
LimitNOFILE=1048576
TasksMax=infinity
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target
EOF

Systemdの設定を更新した後、MinIOサービスを有効にして起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now minio.service

MinIOサーバにアクセスし、mwdbという名前のバケットを作成します。なお、「minioadmin」、「minioadminpass」の個所は、MINIO_ROOT_USER、MINIO_ROOT_PASSWORDに設定した値に調整してください。

$ mc alias set myminio http://localhost:9000 minioadmin minioadminpass
$ mc mb myminio/mwdb

PostgreSQLのセットアップ

MWDBは、PostgreSQLnew window[16]を用いてユーザ、グループ、タグ、コメントなどを管理しています。以下に、MWDB用のPostgreSQLのセットアップ方法を示します。

PostgreSQLをインストールします。

$ sudo apt install -y postgresql

mwdbユーザを作成し、PostgreSQLにmwdbロールを作成します。このとき、新規のパスワードの入力が求められます。

$ sudo useradd -M mwdb
$ sudo -u postgres createuser -P mwdb

mwdbデータベースを作成し、その所有者をmwdbユーザに変更します。

$ sudo -u postgres createdb mwdb
$ sudo -u postgres psql -c "ALTER DATABASE mwdb OWNER TO mwdb;"

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

$ sudo systemctl restart postgresql

MWDBのセットアップ

MWDB本体のセットアップ方法について以下に示します。

MWDBのセットアップに必要なパッケージをインストールします。

$ sudo apt install -y \
    gcc \
    libfuzzy-dev \
    python3-pip \
    python3-dev \
    python3-venv \
    postgresql-client \
    postgresql-common

mwdb関連のデータ格納用のディレクトリを作成します。

$ sudo mkdir /opt/mwdb
$ sudo chown mwdb:mwdb /opt/mwdb

mwdbユーザでvirtualenv環境を作成し、アクティベートします。

$ sudo -u mwdb /bin/bash
$ cd /opt/mwdb
$ python3 -m venv venv
$ source ./venv/bin/activate

mwdb-coreをインストールします。

(venv) $ pip install mwdb-core

以下のコマンドでmwdb-coreの設定ファイルを生成します。

(venv) $ mwdb-core configure

上記のコマンドを実行すると、設定ファイルの保存先に関するメッセージが表示されるので、「3」と入力して、カレントディレクトリに保存されるようにします。

Where do you want to place MWDB local files?

1) Global directories (/var/lib/mwdb-core, /etc/mwdb-core)
2) Local user directory (/home/mwdb/.mwdb-core)
3) Current directory
(1, 2, 3): 3

次にPostgreSQLの接続方法に関するメッセージが表示されるので、「postgresql://mwdb:mwdbpass@localhost/mwdb」と入力します。なお、「mwdbpass」の個所は、PostgreSQLのmwdbロールを追加した際に入力したパスワードに調整してください。

PostgreSQL database connection string [postgresql://localhost/mwdb]: postgresql://mwdb:mwdbpass@localhost/mwdb

ファイルのアップロード先とベースURLの入力を求められます。ここはデフォルト値で問題ないので、Enterキーを押します。

Uploads storage path [./uploads]:
Base public URL of MWDB service [http://127.0.0.1]:

ここまでの設定が完了した後、mwdb-core configureコマンドが、PostgreSQLのデータベースを初期化します。最後にMWDBの管理者アカウントのパスワードの入力を求められます。

Provide password for MWDB 'admin' account:
Repeat password:

生成されたmwdb.iniを開き、以下のように設定を変更します。なお、「minioadmin」、「minioadminpass」の個所は、MINIO_ROOT_USER、MINIO_ROOT_PASSWORDに設定した値に調整してください。

(venv) $ vi /opt/mwdb/mwdb.ini
# uploads_folder = ./uploads
storage_provider = s3
s3_storage_endpoint = 127.0.0.1:9000
s3_storage_access_key = minioadmin
s3_storage_secret_key = minioadminpass
s3_storage_bucket_name = mwdb

virtualenv環境をディアクティベートし、元のユーザに戻ります。

(venv) $ deactivate
$ exit

mwdb.iniの権限を変更します。

$ sudo chmod 400 /opt/mwdb/mwdb.ini

GunicornとNginxのセットアップ

MWDBのWebインタフェースは、Flaskアプリケーションnew window[17]として実装されています。本ブログでは、Gunicornnew window[18]とNginxnew window[19]を用いてデプロイする方法について示します。

Nginxをインストールします。

$ sudo apt install -y nginx

MWDBのGunicornサーバの起動用にSystemdのサービスファイルを作成します。

$ sudo tee /etc/systemd/system/mwdb.service << 'EOF' > /dev/null
[Unit]
Description=mwdb gunicorn daemon
Requires=mwdb.socket
After=network.target

[Service]
Type=notify
User=mwdb
Group=mwdb
RuntimeDirectory=gunicorn
WorkingDirectory=/opt/mwdb

ExecStart=/bin/bash -c "source /opt/mwdb/venv/bin/activate; /opt/mwdb/venv/bin/gunicorn -w 4 mwdb.app:app"
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

Nginxがソケット経由でGunicornにアクセスできるようにサービスを追加します。

$ sudo tee /etc/systemd/system/mwdb.socket << 'EOF' > /dev/null
[Unit]
Description=mwdb gunicorn socket

[Socket]
ListenStream=/run/mwdb.sock
SocketUser=www-data

[Install]
WantedBy=sockets.target
EOF

Nginxにリバースプロキシの設定を追加します。

$ sudo tee /etc/nginx/conf.d/mwdb.conf << 'EOF' > /dev/null
server {
    listen 8080;
    server_name 127.0.0.1;
    location / {
        proxy_pass http://unix:/run/mwdb.sock;
    }
}
EOF

Systemdの設定を更新した後、各サービスを起動、再起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now mwdb.socket
$ sudo systemctl enable --now mwdb.service
$ sudo systemctl restart nginx.service

ここまでの設定で、MWDBの初期設定が完了します。

MWDBの動作確認

実際に設定が完了しているかを確認するために、http://127.0.0.1:8080/loginにアクセスします。アクセスすると、図6のようなログインページが表示されるので、adminアカウントでログインできることを確認します。なお、パスワードは、mwdb-core configureコマンドの実行時に入力した値です。

図6: MWDBのログインページ

ログインに成功し、図7のようなページに遷移すれば、設定が完了していることが確認できます。

図7: MWDBのトップページ

KartonのセットアップとMWDBへの統合手順

Karton連携用のアカウント作成

MWDBとKartonを連携させるためには、Karton側からMWDBにアクセスするための権限が必要になります。Karton連携用のアカウントを作成する方法について以下に示します。

http://127.0.0.1:8080/settings/usersにアクセスすると、図8のようなユーザ一覧ページに遷移します。このページの「Register user」を選択します。

図8: MWDBのユーザ一覧ページ

以下の設定でkartonアカウントを追加します。実際に入力した画面を図9に示します。

  • Login: karton
  • E-mail: karton@mwdb.local
  • Additional info: karton-mwdb-reporter account
  • Feed quality: high
  • Send e-mail with set password link: チェックを外す
図9: MWDBのユーザ登録ページ

http://127.0.0.1:8080/settings/user/karton/capabilitiesにアクセスし、kartonユーザに以下の権限を与えます。実際に設定した画面を図10に示します。

  • adding_tags
  • adding_comments
  • adding_parents
  • adding_all_attributes
  • adding_files
  • adding_configs
  • adding_blobs
  • unlimited_requests
  • karton_assign
図10: MWDBのkartonユーザのアクセス権限設定ページ

http://127.0.0.1:8080/settings/user/karton/api-keysにアクセスすると、図11のようなページに遷移します。このページの「Issue new API key」を選択します。

図11: MWDBのAPIキーのページ

図12のようなポップアップが表示されるので、任意の名前でAPI keyを作成します。

図12: MWDBのAPIキー名の設定

APIキーの生成に成功すると図13のようなページ遷移し、APIキーが表示されます。このAPIキーは、kartonの設定ファイルの記載する必要があるので、控えておきます。

zoom拡大する
図13: MWDBに追加したAPIキー

karton-systemサービスのセットアップ

karton-systemサービスは、Kartonのタスク管理を行うメインサービスです。このサービスは、他のKartonサービスに処理を振り分ける機能を持っています。Kartonのメインサービスであるkarton-systemのセットアップ方法について以下に示します。

redisnew window[20]サーバをインストールします。

$ sudo apt install -y redis

MinIOサーバにアクセスし、kartonという名前のバケットを作成します。

$ mc mb myminio/karton

mwdbユーザでvirtualenv環境をアクティベートします。

$ sudo -u mwdb /bin/bash
$ cd /opt/mwdb
$ source ./venv/bin/activate

karton-coreをインストールします。

(venv) $ pip install karton-core

Kartonの設定情報を記載したiniファイルを作成します。なお、「minioadmin」、「minioadminpass」の個所は、MINIO_ROOT_USER、MINIO_ROOT_PASSWORDに設定した値に調整してください。また、「change_me_api_key」の個所は、MWDBで生成したAPI keyを指定してください。

(venv) $ tee /opt/mwdb/karton.ini << 'EOF' > /dev/null
[s3]
access_key = minioadmin
secret_key = minioadminpass
address = http://localhost:9000
bucket = karton

[redis]
host = localhost
port = 6379

[mwdb]
api_url = http://localhost:8080/api/
api_key = change_me_api_key
EOF

virtualenv環境をディアクティベートし、元のユーザに戻ります。

(venv) $ deactivate
$ exit

karton.iniの権限を変更します。

$ sudo chmod 400 /opt/mwdb/karton.ini

karton-systemサーバの起動用にSystemdのサービスファイルを作成します。

$ sudo tee /etc/systemd/system/karton-system.service << 'EOF' > /dev/null
[Unit]
Description=Karton System
Documentation=https://github.com/CERT-Polska/karton
Wants=network-online.target
After=network-online.target

[Service]
WorkingDirectory=/opt/mwdb/

User=mwdb
Group=mwdb

ExecStart=/bin/bash -c "source /opt/mwdb/venv/bin/activate; /opt/mwdb/venv/bin/karton-system"
Restart=always

[Install]
WantedBy=multi-user.target
EOF

Systemdの設定を更新した後、karton-systemサービスを有効にして起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now karton-system

mwdb.iniを編集し、以下の設定を追加します。

$ sudo chmod +w /opt/mwdb/mwdb.ini
$ sudo vi /opt/mwdb/mwdb.ini
[mwdb]
enable_karton = 1 # 追加
$ sudo chmod -w /opt/mwdb/mwdb.ini

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

$ sudo systemctl restart mwdb.service

karton-classifierサービスのセットアップ

karton-classifierは、初めに実行されるサービスです。MWDBにアップロードされたファイルの種類を識別する機能を持っています。後続のKartonサービスは、ここで識別されたファイルの種類に応じた処理を行うことができます。以下にkarton-classifierサービスのセットアップ方法について示します。

mwdbユーザでvirtualenv環境をアクティベートします。

$ sudo -u mwdb /bin/bash
$ cd /opt/mwdb
$ source ./venv/bin/activate

karton-classifierをインストールします。

(venv) $ pip install karton-classifier

virtualenv環境をディアクティベートし、元のユーザに戻ります。

(venv) $ deactivate
$ exit

karton-classifierサーバの起動用にSystemdのサービスファイルを作成します。

$ sudo tee /etc/systemd/system/karton-classifier.service << 'EOF' > /dev/null
[Unit]
Description=karton-classifier
Documentation=https://github.com/CERT-Polska/karton-classifier
Requires=karton-system.service
After=karton-system.service

[Service]
WorkingDirectory=/opt/mwdb/

User=mwdb
Group=mwdb

ExecStart=/bin/bash -c "source /opt/mwdb/venv/bin/activate; /opt/mwdb/venv/bin/karton-classifier"
Restart=always

[Install]
WantedBy=multi-user.target
EOF

Systemdの設定を更新した後、karton-classifierサービスを有効にして起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now karton-classifier

karton-mwdb-reporterサービスのセットアップ

karton-mwdb-reporterは、最後に実行されるサービスです。前段のKartonサービスによって生成されたファイル、タグ、コメントなどの情報をMWDBに通知します。以下にkarton-mwdb-reporterサービスのセットアップ方法について示します。

mwdbユーザでvirtualenv環境をアクティベートします。

$ sudo -u mwdb /bin/bash
$ cd /opt/mwdb
$ source ./venv/bin/activate

karton-mwdb-reporterをインストールします。

(venv) $ pip install karton-mwdb-reporter

virtualenv環境をディアクティベートし、元のユーザに戻ります。

(venv) $ deactivate
$ exit

karton-mwdb-reporterサーバの起動用にSystemdのサービスファイルを作成します。

$ sudo tee /etc/systemd/system/karton-mwdb-reporter.service << 'EOF' > /dev/null
[Unit]
Description=karton-mwdb-reporter
Documentation=https://github.com/CERT-Polska/karton-mwdb-reporter
Requires=karton-system.service
After=karton-system.service

[Service]
WorkingDirectory=/opt/mwdb/

User=mwdb
Group=mwdb

ExecStart=/bin/bash -c "source /opt/mwdb/venv/bin/activate; /opt/mwdb/venv/bin/karton-mwdb-reporter"
Restart=always

[Install]
WantedBy=multi-user.target
EOF

Systemdの設定を更新した後、karton-mwdb-reporterサービスを有効にして起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now karton-mwdb-reporter

ここまでの設定で、Kartonの初期設定が完了します。

Karton連携の動作確認

MWDBとKartonとの連携が取れているかを確認する方法について以下に示します。

http://127.0.0.1:8080/uploadにアクセスし、適当なファイルをアップロードします。図14の例では、「MalwareAnalysisSample.exe」という名前のPEファイルをアップロードしています。

zoom拡大する
図14: MWDBのファイルアップロードページ(PEファイルのアップロード)

アップロードが完了すると図15のようなページに遷移します。

zoom拡大する
図15: MWDBの詳細情報ページ(Kartonの実行中)

図16のように右側のKarton analysisの項目が「processing」から「done」に変化すればKartonサービスによる解析が完了しています。

ここまでのセットアップでは、karton-classifierとkarton-mwdb-reporterのサービスが稼働しています。正常にセットアップできていれば、この2つのサービスによる解析の結果として「runnable:win32:exe」というタグが追加されます。

zoom拡大する
図16: MWDBの詳細情報ページ(Kartonの実行完了)

便利なKartonサービス

ここまでで、MWDBとKartonを最低限動作させるための初期設定が完了しました。さらに追加すると便利である以下の2つのKartonサービスについて紹介します。

  • karton-archive-extractorサービス: 汎用的なアーカイブの展開機能を持つサービス
  • karton-yaramatcherサービス: YARAスキャンを行うサービス

karton-archive-extractorサービス

karton-archive-extractorサービスは、汎用的なアーカイブの展開機能を持つサービスです。zipやrarなどの圧縮されたファイルを展開し、展開後のファイルを自動でMWDBに投稿します。以下に、karton-archive-extractorサービスのセットアップ方法について示します。

karton-archive-extractorの実行に必要なパッケージをインストールします。

$ sudo apt install -y p7zip-full rar unace-nonfree cabextract lzip libjpeg8-dev zlib1g-dev zpaq gnupg

mwdbユーザでvirtualenv環境をアクティベートします。

$ sudo -u mwdb /bin/bash
$ cd /opt/mwdb
$ source ./venv/bin/activate

karton-archive-extractorをインストールします。

(venv) $ pip install karton-archive-extractor

virtualenv環境をディアクティベートし、元のユーザに戻ります。

(venv) $ deactivate
$ exit

karton-archive-extractorのイントール時に追加されるSFlock2new window[21]のバージョン0.3.36の内部で使用されているzipjailnew window[22]が最新版の7zipに対応しておらず、zipファイルの展開に失敗する現象を確認しています(2024年7月19日の執筆時点)。この問題は、手動で最新版のzipjailをコンパイルし、上書きすることで回避できます。

$ sudo apt install -y git linux-libc-dev-i386-cross gcc-x86-64-linux-gnux32 libc6-dev-amd64-cross
$ git clone https://github.com/hatching/tracy.git /tmp/tracy
$ cd /tmp/tracy/src
$ make
$ cd ./zipjail
$ make
$ sudo chown mwdb:mwdb zipjail
$ sudo mv /tmp/tracy/src/zipjail/zipjail $(find /opt/mwdb/venv/ -type f -name zipjail.elf)
$ rm -rf /tmp/tracy

karton-archive-extractorサーバの起動用にSystemdのサービスファイルを作成します。

$ sudo tee /etc/systemd/system/karton-archive-extractor.service << 'EOF' > /dev/null
[Unit]
Description=karton-archive-extractor
Documentation=https://github.com/CERT-Polska/karton-archive-extractor
Requires=karton-system.service
After=karton-system.service

[Service]
WorkingDirectory=/opt/mwdb/

User=mwdb
Group=mwdb

ExecStart=/bin/bash -c "source /opt/mwdb/venv/bin/activate; /opt/mwdb/venv/bin/karton-archive-extractor"
Restart=always

[Install]
WantedBy=multi-user.target
EOF

Systemdの設定を更新した後、karton-archive-extractorサービスを有効にして起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now karton-archive-extractor

動作確認として、http://127.0.0.1:8080/uploadにアクセスし、infectedというパスワードで暗号化されたzipファイルをアップロードします。図17の例では、「MalwareAnalysisSample.zip」という名前の暗号化されたzipファイルをアップロードしています。

zoom拡大する
図17: MWDBのファイルアップロードページ(zipファイルのアップロード)

Kartonによる分析が終了すると、図18のようなページに遷移します。zipファイルが展開され、展開後のファイルがchildとして紐づいていることが分かります。Relationsタブを見るとそれぞれのファイルの親子関係が確認できます。

zoom拡大する
図18: MWDBの詳細ページ(Relationsタブ)

karton-yaramatcherサービス

karton-yaramatcherサービスは、MWDBにアップロードされたファイルに対して、YARAスキャンを行うサービスです。以下に、karton-yaramatcherサービスのセットアップ方法について示します。

mwdbユーザでvirtualenv環境をアクティベートします。

$ sudo -u mwdb /bin/bash
$ cd /opt/mwdb
$ source ./venv/bin/activate

karton-mwdb-reporterをインストールします。

(venv) $ pip install karton-yaramatcher

YARAルール格納用のディレクトリを作成します。

(venv) $ mkdir -p /opt/mwdb/yara_rules

YARAルールを追加します。ここでは、例として以下の2つルールを追加しています。

  • JPCERT/CCが提供しているYARAルールnew window[23]
  • Elastic Securityが提供しているYARAルールnew window[24]

(venv) $ git clone https://github.com/JPCERTCC/jpcert-yara.git /opt/mwdb/yara_rules/jpcert_yara
(venv) $ git clone https://github.com/elastic/protections-artifacts.git /opt/mwdb/yara_rules/elastic_yara

virtualenv環境をディアクティベートし、元のユーザに戻ります。

(venv) $ deactivate
$ exit

karton-yaramatcherサーバの起動用にSystemdのサービスファイルを作成します。

$ sudo tee /etc/systemd/system/karton-yaramatcher.service << 'EOF' > /dev/null
[Unit]
Description=karton-yaramatcher
Documentation=https://github.com/CERT-Polska/karton-yaramatcher
Requires=karton-system.service
After=karton-system.service

[Service]
WorkingDirectory=/opt/mwdb/

User=mwdb
Group=mwdb

ExecStart=/bin/bash -c "source /opt/mwdb/venv/bin/activate; /opt/mwdb/venv/bin/karton-yaramatcher --rules /opt/mwdb/yara_rules"
Restart=always

[Install]
WantedBy=multi-user.target
EOF

Systemdの設定を更新した後、karton-yaramatcherサービスを有効にして起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now karton-yaramatcher

動作確認として、http://127.0.0.1:8080/uploadにアクセスし、YARAルールにマッチするファイルをアップロードします。図19の例では、メモリから抽出したRemcosRATnew window[25]を圧縮したzipファイルをアップロードしています。

zoom拡大する
図19: MWDBのファイルアップロードページ(RemcosRATのアップロード)

Kartonによる分析が終了すると、図20のようなページに遷移します。RemcosRATに対してYARAスキャンが行われ、マッチしたルールがタグとして付与されていることが確認できます。

zoom拡大する
図20: MWDBの詳細ページ(YARAスキャン結果のタグ追加)

まとめ

本ブログでは、マルウェア管理システムである「MWDB」とマルウェア分析システムの「Karton」について紹介し、その構築方法について説明しました。MWDBとKartonを連携させたサービスを構築することで効率よくマルウェアの収集・分析が行えます。

本ブログでは、一部のKartonサービスのみを紹介しましたが、他にもkarton-unpackernew window[26]やmwcfgnew window[27]などの便利なサービスがいくつか存在します。また、Kartonサービス自体も簡単に実装が可能ですので、独自のKartonサービスを追加していくことで、より効率的にマルウェアの分析が行えるようになります。非常に便利なツールの一つですので一度構築してみることをおすすめします。

参考文献

執筆者プロフィール

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

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

執筆者の他の記事を読む

Escキーで閉じる 閉じる