Dionaea と VirusTotal を自動連携して、未知のマルウェアと出会いたい


Dionaea は攻撃者が送りつけてきたマルウェアを収集できるハニーポットです。ハニーポットを運営する者としては、どのようなマルウェアが送りつけられたのか気になるものですが、Dionaea はマルウェアに関する情報を収集してくれません。
そこで、Dionaea と VirusTotal を連携し、VirusTotal に掲載されているかどうかを確認できるようにしました。これにより、VirusTotal に掲載されていれば既知のマルウェア、掲載されていなければ未知のマルウェアということが分かり、解析対象が絞り込みやすくなります。

Dionaea と VirusTotal の連携に関するサイトは検索すればたくさんあるので基本的には焼き直しですが、マルウェアの既知と未知を区別できるように一手間加えたところがこの記事のミソです。

1. VirusTotal API の準備

まずは VirusTotal のアカウントを作ってログインします。ログイン後、右上のアイコンをクリックし、「API Key」をクリックします。

API Key が表示されるので、この文字列をコピーしておきます。

2. Dionaea の VirusTotal 連携設定ファイル作成

T-Pot へ SSH で接続し、root ユーザーになります。

Bash
$ sudo su

Dionaea の設定ファイルを保存するディレクトリに移動し、設定ファイル(virustotal.yaml)を新規作成します。

Bash
# cd /opt/tpot/docker/dionaea/dist/etc/ihandlers
# vi virustotal.yaml

以下のコードを貼り付けます。"API Key" の箇所は、先程 VirusTotal でコピーした API Key をダブルコートの中に貼り付けます。

Bash
- name: virustotal
 config:
   # grab it from your virustotal account at My account -> Inbox -> Public API
   apikey: "API Key"
   file: "/opt/dionaea/var/dionaea/vtcache.sqlite"

3. T-Pot に virustotal.yaml を読み込む設定

T-Pot を停止します。

Bash
# systemctl stop tpot

T-Pot の設定ファイル(tpot.yml)を変更します。

Bash
# cd /opt/tpot/etc
# vi tpot.yml

# Dionaea Service の「volume」に以下を追加します。

Bash
- /opt/tpot/docker/dionaea/dist/etc/ihandlers/virustotal.yaml:/opt/dionaea/etc/dionaea/ihandlers/virustotal.yaml

具体的な箇所は、ここです。

T-Pot のサービスを開始します。

Bash
# systemctl start tpot

4. 動作確認

Dionaea のログ(dionaea.json)が更新されていることを確認します。更新されていなければ、攻撃が来るまでしばらく待ちましょう。

Bash
# docker_id=`docker ps -aqf name=dionaea`
# docker exec -it $docker_id ls -al /opt/dionaea/var/log/dionaea.json
-rwxrwx--- 1 dionaea dionaea 17781908 May  5 14:42 /opt/dionaea/var/log/dionaea.json

5. VirusTotal 分析結果の確認

Dionaea が受けた攻撃は dionaea.sqlite に記録されます。T-Pot は sqlite が入っていないので、自分でインストールします(すでにインストールしている場合はこの作業は不要です)

Bash
# apt install -y sqlite3

sqlite3 が /usr/bin/sqlite3 にインストールされたことを確認します。

Bash
# which sqlite3
/usr/bin/sqlite3

Dionaea のコンテナから dionaea.sqlite をホスト側にコピーします。

Bash
# docker_id=`docker ps -aqf name=dionaea`
# docker cp $docker_id:/opt/dionaea/var/log/dionaea.sqlite dionaea.sqlite

sqlite で dionaea.sqlite を開きます。

Bash
# sqlite3 dionaea.sqlite

テーブル一覧を確認します。きちんと virustotal と、virustotalscans のテーブルがあります。

SQL
sqlite> .tables

6. 既知のウイルスを確認する

以下の SQL を実行し、VirusTotal のスキャン結果を確認します。

SQL
SELECT virustotals.virustotal, virustotal_md5_hash, virustotal_permalink, COUNT(virustotals.virustotal)
FROM virustotals INNER JOIN virustotalscans
ON virustotals.virustotal = virustotalscans.virustotal
WHERE virustotalscan_result <> ""
GROUP BY virustotals.virustotal
ORDER BY count(virustotals.virustotal) DESC;

この SQL では、以下の内容が確認できます。

  • レコード番号
  • ハッシュ(MD5)
  • VirusTotal URL
  • レスポンスを返したベンダーの数

これらのハッシュは VirusTotal に掲載されているため、既知のウイルスであることが分かります。多くのベンダーが反応しているマルウェアがどのようなものなのかを確認するのも良いでしょう。

7. 未知のウイルスを確認する

長くなりましたが本題です。以下の SQL を実行し、VirusTotal のスキャン結果を確認します。

SQL
SELECT virustotals.virustotal, virustotals.virustotal_md5_hash
FROM virustotals LEFT JOIN virustotalscans
ON virustotals.virustotal = virustotalscans.virustotal
WHERE virustotalscans.virustotal ISNULL;

この SQL では、「Dionaea で観測されたハッシュだが、VirusTotal に掲載されていないハッシュ」を抽出します。つまり VirusTotal に掲載されていないため、まだ世の中に出回っていない未知のマルウェアである可能性が高いです。
ちなみに、私の環境ではまだ未知のマルウェアは見つかっていません。早く来てほしいものです。

8. 半自動化

dionaea.sqlite を手作業でコピーするのが面倒なので、わたしは以下のシェルを cron で自動実行して日次でホスト側にコピーしています。あとは、7. のSQLを貼り付けれて実行するだけです。運が良ければ未知のウイルスに出会えるでしょう。

Bash
#!/bin/bash
docker_id=`docker ps -aqf name=dionaea`
docker cp $docker_id:/opt/dionaea/var/log/dionaea.sqlite dionaea.sqlite
chmod 755 dionaea.sqlite
sqlite3 dionaea.sqlite

9.(おまけ)ウイルスを自分で解析したい場合

※※※※※※※※※※※※※※※ 注意 ※※※※※※※※※※※※※※※
- 本物のマルウェアの可能性が非常に高いため、誤って開いても影響が無い環境で作業してください
- アンチウイルスソフトが反応して消されてしまうかもしれません
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

マルウェア自体は、Dionaea コンテナ内の、以下ディレクトリに保存されています。

/opt/dionaea/var/dionaea/binaries/

これらのファイルをホスト側にコピーします。

Bash
# docker_id=`docker ps -aqf name=dionaea`
# docker cp $docker_id:opt/dionaea/var/dionaea/binaries/[hash] malware

ホスト側のカレントディレクトリにコピーされます。SCPでローカルの端末にダウンロードもできますので、あとはお好きなように分析してください。

それでは、楽しいハニーポットライフを引き続きお楽しみください。