Compact
true
担当領域:セキュリティ技術センター リスクハンティング・アナリシスグループ
マルウェア解析や攻撃者の行動分析などの業務を経て、現在はペネトレーションテスト、脆弱性診断などに従事。これまでに Botconf や JSAC で講演。趣味は、CTFとコーヒーを飲むこと。

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

MWDBについて

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

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

図1:クエリによる検索(出典: 1. Introduction to MWDB — mwdb-core 2.13.0 documentation)
図1:クエリによる検索(出典: 1. Introduction to MWDB — mwdb-core 2.13.0 documentation)
https://mwdb.readthedocs.io/en/latest/user-guide/1-Introduction-to-MWDB.html
100

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

図2: 検体の詳細情報ページ(出典: 1. Introduction to MWDB — mwdb-core 2.13.0 documentation)
図2: 検体の詳細情報ページ(出典: 1. Introduction to MWDB — mwdb-core 2.13.0 documentation)
https://mwdb.readthedocs.io/en/latest/user-guide/1-Introduction-to-MWDB.html
50

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

図3: マルウェアのConfig情報のページ(出典: 3. Storing malware configurations — mwdb-core 2.13.0 documentation)
図3: マルウェアのConfig情報のページ(出典: 3. Storing malware configurations — mwdb-core 2.13.0 documentation)
https://mwdb.readthedocs.io/en/latest/user-guide/1-Introduction-to-MWDB.html
50

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

図4: ファイルの関連情報のグラフ表示(出典: 1. Introduction to MWDB — mwdb-core 2.13.0 documentation)
図4: ファイルの関連情報のグラフ表示(出典: 1. Introduction to MWDB — mwdb-core 2.13.0 documentation)
https://mwdb.readthedocs.io/en/latest/user-guide/1-Introduction-to-MWDB.html
100

Kartonについて

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

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

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

構築する環境について

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

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

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

MWDBの構築手順

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

MinIOのセットアップ

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

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

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

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/
1
1

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
1
1

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

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

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
1
1

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

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

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

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

PostgreSQLのセットアップ

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

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

$ sudo apt install -y postgresql
1
1

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

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

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

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

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

$ sudo systemctl restart postgresql
1
1

MWDBのセットアップ

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

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

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

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

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

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

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

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

(venv) $ pip install mwdb-core
1
1

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

(venv) $ mwdb-core configure
1
1

上記のコマンドを実行すると、設定ファイルの保存先に関するメッセージが表示されるので、「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
1
1

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

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

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

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

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

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

生成された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
1
1

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

(venv) $ deactivate
$ exit
1
1

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

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

GunicornとNginxのセットアップ

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

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

$ sudo apt install -y nginx
1
1

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
1
1

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
1
1

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
1
1

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

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

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

MWDBの動作確認

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

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

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

図7: MWDBのトップページ
図7: MWDBのトップページ
50

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

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

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

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

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

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

図9: MWDBのユーザ登録ページ
図9: MWDBのユーザ登録ページ
50

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

図10: MWDBのkartonユーザのアクセス権限設定ページ
図10: MWDBのkartonユーザのアクセス権限設定ページ
100

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

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

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

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

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

図13: MWDBに追加したAPIキー
図13: MWDBに追加したAPIキー
50

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

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

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

$ sudo apt install -y redis
1
1

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

$ mc mb myminio/karton
1
1

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

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

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

(venv) $ pip install karton-core
1
1

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
1
1

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

(venv) $ deactivate
$ exit
1
1

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

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

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
1
1

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

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

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
1
1

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

$ sudo systemctl restart mwdb.service
1
1

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

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

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

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

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

(venv) $ pip install karton-classifier
1
1

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

(venv) $ deactivate
$ exit
1
1

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
1
1

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

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

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
1
1

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

(venv) $ pip install karton-mwdb-reporter
1
1

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

(venv) $ deactivate
$ exit
1
1

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
1
1

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

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

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

Karton連携の動作確認

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

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

図14: MWDBのファイルアップロードページ(PEファイルのアップロード)
図14: MWDBのファイルアップロードページ(PEファイルのアップロード)
50

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

図15: MWDBの詳細情報ページ(Kartonの実行中)
図15: MWDBの詳細情報ページ(Kartonの実行中)
50

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

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

図16: MWDBの詳細情報ページ(Kartonの実行完了)
図16: MWDBの詳細情報ページ(Kartonの実行完了)
50

便利なKartonサービス

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

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
1
1

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

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

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

(venv) $ pip install karton-archive-extractor
1
1

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

(venv) $ deactivate
$ exit
1
1

karton-archive-extractorのイントール時に追加されるSFlock2[21]のバージョン0.3.36の内部で使用されているzipjail[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
1
1

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
1
1

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

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

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

図17: MWDBのファイルアップロードページ(zipファイルのアップロード)
図17: MWDBのファイルアップロードページ(zipファイルのアップロード)
50

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

図18: MWDBの詳細ページ(Relationsタブ)
図18: MWDBの詳細ページ(Relationsタブ)
50

karton-yaramatcherサービス

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

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

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

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

(venv) $ pip install karton-yaramatcher
1
1

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

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

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

(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
1
1

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

(venv) $ deactivate
$ exit
1
1

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
1
1

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

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

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

図19: MWDBのファイルアップロードページ(RemcosRATのアップロード)
図19: MWDBのファイルアップロードページ(RemcosRATのアップロード)
50

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

図20: MWDBの詳細ページ(YARAスキャン結果のタグ追加)
図20: MWDBの詳細ページ(YARAスキャン結果のタグ追加)
50

まとめ

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

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

参考文献

[1] GitHub - CERT-Polska/mwdb-core: Malware repository component for samples & static configuration with REST API interface.
https://github.com/CERT-Polska/mwdb-core

[2] Set up your own malware repository with MWDB Core | CERT Polska
https://cert.pl/en/posts/2020/10/set-up-your-own-malware-repository-with-mwdb-core/

[3] About us | CERT Polska
https://cert.pl/en/about-us/

[4] GitHub - CERT-Polska/karton: Distributed malware processing framework based on Python, Redis and S3.
https://github.com/CERT-Polska/karton

[5] Set up your own malware analysis pipeline with Karton | CERT Polska
https://cert.pl/en/posts/2020/12/set-up-your-own-malware-analysis-pipeline-with-karton/

[6] GitHub - CERT-Polska/karton-dashboard: A small Flask application that allows for Karton task and queue introspection.
https://github.com/CERT-Polska/karton-dashboard

[7] GitHub - CERT-Polska/karton-classifier: File type classifier for the Karton framework.
https://github.com/CERT-Polska/karton-classifier

[8] GitHub - CERT-Polska/karton-archive-extractor: Extractor of various archive formats for Karton framework
https://github.com/CERT-Polska/karton-archive-extractor

[9] GitHub - CERT-Polska/karton-config-extractor: Static configuration extractor for the Karton framework
https://github.com/CERT-Polska/karton-config-extractor

[10] GitHub - CERT-Polska/karton-mwdb-reporter: Karton service that uploads analyzed artifacts and metadata to MWDB Core
https://github.com/CERT-Polska/karton-mwdb-reporter

[11] GitHub - CERT-Polska/karton-yaramatcher: File and analysis artifacts yara matcher for Karton framework
https://github.com/CERT-Polska/karton-yaramatcher

[12] GitHub - CERT-Polska/karton-asciimagic: Various decoders for ascii-encoded executables for Karton framework
https://github.com/CERT-Polska/karton-asciimagic

[13] GitHub - CERT-Polska/karton-autoit-ripper: AutoIt script ripper for Karton framework
https://github.com/CERT-Polska/karton-autoit-ripper

[14] Amazon S3(拡張性と耐久性を兼ね揃えたクラウドストレージ)|AWS
https://aws.amazon.com/jp/s3/

[15] MinIO | S3 & Kubernetes Native Object Storage for AI
https://min.io/

[16] PostgreSQL: The world's most advanced open source database
https://www.postgresql.org/

[17] Welcome to Flask — Flask Documentation (3.0.x)
https://flask.palletsprojects.com/en/3.0.x/

[18] Gunicorn - Python WSGI HTTP Server for UNIX
https://gunicorn.org/

[19] nginx
https://nginx.org/en/

[20] Redis - The Real-time Data Platform
https://redis.io/

[21] GitHub - CAPESandbox/sflock: Sample staging & detonation utility to be used in combination with Cuckoo Sandbox.
https://github.com/CAPESandbox/sflock

[22] GitHub - tracy/src/zipjail at main · hatching/tracy
https://github.com/hatching/tracy/tree/main/src/zipjail

[23] GitHub - JPCERTCC/jpcert-yara: JPCERT/CC public YARA rules repository
https://github.com/JPCERTCC/jpcert-yara

[24] GitHub - elastic/protections-artifacts: Elastic Security detection content for Endpoint
https://github.com/elastic/protections-artifacts

[25] MalwareBazaar | SHA256 653f628893de874793983dc90b8868c7e56229e28f7eaf79d615c55490179411 (RemcosRAT)
https://bazaar.abuse.ch/sample/653f628893de874793983dc90b8868c7e56229e28f7eaf79d615c55490179411/

[26] GitHub - https://github.com/c3rb3ru5d3d53c/karton-unpacker
https://github.com/c3rb3ru5d3d53c/karton-unpacker

[27] GitHub - c3rb3ru5d3d53c/mwcfg: A Feature Rich Modular Malware Configuration Extraction Utility for MalDuck
https://github.com/c3rb3ru5d3d53c/mwcfg

執筆者プロフィール

執筆者
original
50

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

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