ごちゃごちゃしたIT勉強記録

自分用メモ。主にセキュリティで、その他色々書きたい。

VirusTotal APIを使ってみた

皆さんご存知VirusTotalAPIを少し試してみようと思います。

他の方のブログを見ていると、ハニーポットVirusTotalを連携させてDionaeaに保全されたマルウェアを自動的に判定するようなものを作ったりしているのをみて、非常にそそられました。

なので、まずは「そもそもVirusTotal APIってなんぞ?」というところからはじめて、簡単な使い方などをまとめておこうと思います。

VirusTotalとは

まずは基本的な話として、VirusTotalとは何かという話からはじめます。

簡単にまとめるとこんな感ですね。

  • ファイルをアップロードしたり、URLやファイルのハッシュ値をサーバーに問い合わせることによって、それがマルウェアなのか判定してくれたり、URLであれば攻撃サーバ(Command and Control Server: C2, C&C)なのかを判定してくれるWebサービス
  • 有料会員になると、アップロードされたファイルを取得することも可能
  • APIを使って、他のアプリケーションとの連携を行うことができる
  • Desktopアプリケーションもあるらしい

フォレンジックとかでもよくありますが、マルウェアに感染した端末の調査をする際に、ディスクに残っているマルウェアをアップロードして、そのようなマルウェアなのかを判定してもらい、そこから調査すべきポイントを洗い出すということをやります。

動的解析を行える環境があれば、そちらで監視ツール(WireShark, Process Monitor, ProcessHackerなどのツール、もしくはCuckooなどのサンドボックス)を使ってログを取りそこから調査すべき部分を洗い出したりします。


ただ、調査の際には時間が限られているので、時間短縮の為にもまずはマルウェアと思しきファイルのハッシュ値を取り、それをVirusTotalにぶん投げるという感じですね。

で、調査の際には検体をそのままアップロードをすることはしません。というのも、もし検体内にセンシティブなデータがそのまま入っている場合(特に高度標的型攻撃になると、ターゲットとなっている企業の情報が入ってしまっている)があります。かつ、有料会員であればそれをダウンロードできてしまうので、「どこが攻撃を受けてしまったのかわかってしまう可能性」があります。なので、まずは「すでに同じ検体が解析されているか、またどのような結果が出ているか」を調べる為にハッシュ値を算出しVirusTotalに投げる、という流れになります。

個人利用ではそこまで気をつける必要はないかもしれませんが、企業の方で利用している場合には注意が必要です。

VirusTotal APIとは

今回の本題、VirusTotal APIです。

  • VirusTotal上の情報を、ブラウザを使わずにスクリプトでアクセスできるようにするためのAPI
  • json形式のレスポンスデータを取得することができる
  • 制限が色々とある(1分あたり4回のリクエストしかできないなど)

Web系の知識は乏しいのであれですが、これはいわゆるRESTful APIということなのでしょうか?
まぁそんなことはいいとして、公式サイトにある説明では、以下の項目ができるとあります。

  • Sending and scanning files
  • Rescanning already submitted files
  • Retrieving file scan reports
  • Retrieving URL scan reports
  • Retrieving domain reports


それぞれどのURLにリクエストを投げるか決まっていて、ちゃんとうまくいけばレスポンスとしてjsonデータが手に入ります。


というわけで、実際にローカル端末からPythonスクリプトVirusTotalにリクエストをしてみましょう。
今回やってみたのは「Retrieving file scan reports」の項目です。

実際にやってみた

やってみた際の環境は以下の通りです。

というわけで、ハッシュ値を投げて検索結果をもらうスクリプトは以下の通りです。
試しに検索対象のマルウェアはWannacryを選んでみました。

# -*- coding:utf-8 -*-

import json
import urllib
import urllib2

# malware hash value that is sent to VT
hash = '2f76b88b420003516f90062940ef7881'

# file scan reportを取得する際に指定するURL
url = "https://www.virustotal.com/vtapi/v2/file/report"

params = {'apikey': '自分のpublic api key',
          'resource': hash}

data = urllib.urlencode(params)
request = urllib2.Request(url, data)
response = urllib2.urlopen(request)
json_response = response.read()

print json_response


上記のPythonスクリプトを実行した結果得られた結果は以下の通り

{
    "scans": {
        "Bkav": {
            "detected": false,
            "version": "1.3.0.9466",
            "result": null,
            "update": "20180310"
        },
        "MicroWorld-eScan": {
            "detected": true,
            "version": "14.0.297.0",
            "result": "Trojan.GenericKD.12015782",
            "update": "20180310"
        },
        "nProtect": {
            "detected": true,
            "version": "2018-03-10.02",
            "result": "Ransom/W32.WannaCry.5267459",
            "update": "20180310"
        },
        ...............
},
    "scan_id": "1c4a7589d26c97c38d4f826242b6740b35441e43ddd7394d399dbf94ab868483-1520716198",
    "sha1": "08b943a7b7f4d368ed0c66afa4c98087be5efd4b",
    "resource": "2f76b88b420003516f90062940ef7881",
    "response_code": 1,
    "scan_date": "2018-03-10 21:09:58",
    "permalink": "https://www.virustotal.com/file/1c4a7589d26c97c38d4f826242b6740b35441e43ddd7394d399dbf94ab868483/analysis/1520716198/",
    "verbose_msg": "Scan finished, information embedded",
    "total": 67,
    "positives": 58,
    "sha256": "1c4a7589d26c97c38d4f826242b6740b35441e43ddd7394d399dbf94ab868483",
    "md5": "2f76b88b420003516f90062940ef7881"
}


Pythonスクリプトを作成するにあたり、以下の先生方のブログを参考(というか丸写しw)にさせていただきました。
www.morihi-soc.net
qiita.com
blog.daruyanagi.jp

今回はハッシュ値を投げるだけでしたが、ファイルを投げるスクリプトも書いて試そうかと思います。
というわけで、今回はここまで。







<ちょっとだけ気になったもの>
VirusTotal API Documentationの説明の中で特に個人的に面白いものはこちら。

The API must not be used in commercial products or services, it can not be used as a substitute for antivirus products and it can not be integrated in any project that may harm the antivirus industry directly or indirectly. Noncompliance of these terms will result in immediate permanent ban of the infractor individual or organization.

どの会社に向けたものでしょうね〜w

おそらくセキュリティ界隈でお仕事をされている方であればわかるかと。