セキュリティ関連の調査に利用できるWebサービスについて
OSINT(Open Source Intellihence)というそうですね。いつの間にそういった言葉ができたのか、知りませんでしたが、どんな分野でも有用なWebサービスにはお世話になるものです。
セキュリティのWebサービスで有名どころと言えば VirusTotal があります。検体を投稿し、各ベンダーの製品でスキャンした結果を表示してくれます。他に、Webサイトのスキャンやファイルのハッシュ値でのスキャン結果の検索、IP、ドメインの情報の検索 など、利用可能な情報は多岐にわたります。
VirusTotalだけの話ではありませんが、投稿するファイルに機密な情報が含まれていないかは確認しておきましょう。こうした外部Webサイトへのファイルのアップロードは一般公開されても困らないもののみに限定すべきです。
こういった外部情報サイトは他にもあります。Webサイトの情報に特化したもの、マルウェア解析に特化したものなど、それぞれの特性に合わせて利用すれば、特別なツールなど使わなくても、かなりの調査が可能です。 いくつか挙げてみます。
Webサイト調査系
aguse.jp: ウェブ調査 - Webサイトの情報の調査ができる。ゲートウェイではサイトを画像として表示してくれて、リンクをたどることもできるので便利。時々ちょっと重い。
urlquery.net - Free URL scanner - Webサイトの調査。埋め込まれたスクリプトなどを見やすく表示してくれる。
Rex Swain's HTTP Viewer - サイトのコンテンツをそのまま表示してくれる。バイナリファイルもダンプして表示してくれるのが便利。
マルウェア解析系
Malwr - Malware Analysis by Cuckoo Sandbox - Cuckoo Sandboxでのマルウェアの解析結果を表示してくれるサイト。Sign Upしないと使いにくいかもしれない。
Free Automated Malware Analysis Service - powered by VxStream Sandbox - こちらもマルウェアのサンドボックス解析の結果を表示してくれる。
IP/ドメイン調査
DomainTools - ドメインのwhois情報などを引いたりしてくれるサイト。
Threat Crowd | Threatcrowd.org Open Source Threat Intelligence - ドメインやIPからそこに関連する別のIPやドメインを表示してくれる。視覚的に面白い。
RiskIQ - PassiveTotal - ドメインやIPの情報を表示したり、そこに関連するIPやドメインの情報を表示したり。機能は豊富。登録が必要。
その他
他に同じようなサービスは様々あります。用途に応じて自分の使いやすいサービスを探すのが良いかと思います。
また、もう少し凝ったことをしたいという時には、こういったいくつかのサービスではAPIを提供しています。
例えば、VirusTotalではアカウントを作成し、APIキーを入手すれば、1分で4リクエストまでという制限はありますが、API経由での調査が可能です。
Public API version 2.0 - VirusTotal
こういうAPIの利用方法は公式のドキュメントが一番わかりやすかったりするので、そちらを読んで利用するのが良いと思います。
PythonでAPIを利用してみます。 (APIを利用する時のためのモジュールを作っておくと、後々便利なんだじゃないかと思いました)
‘virustotal.py'として以下のようなスクリプトを用意します。
import requests apikey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' url_hash = 'https://www.virustotal.com/vtapi/v2/file/report' url_scan_url = 'https://www.virustotal.com/vtapi/v2/url/scan' url_report_url = 'http://www.virustotal.com/vtapi/v2/url/report' url_ip = 'http://www.virustotal.com/vtapi/v2/ip-address/report' url_domain = 'http://www.virustotal.com/vtapi/v2/domain/report' def getHashReport(filehash): params = {'apikey': apikey, 'resource':filehash} headers = { "Accept-Encoding": "gzip, deflate"} response = requests.get(url_hash ,params=params, headers=headers) json_response = response.json() return json_response def getUrlScan(url): params = {'apikey': apikey, 'url':url} response = requests.post(url_scan_url, data=params) json_response = response.json() return json_response def getUrlReport(url): headers = { "Accept-Encoding": "gzip, deflate"} params = {'apikey': apikey, 'resource':url} response = requests.post(url_report_url, params=params, headers=headers) json_response = response.json() return json_response def getIPReport(ip): params = {'apikey': apikey, 'ip': ip} response = requests.get(url_ip, params=params) json_response = response.json() return json_response def getDomainReport(domain): params = {'apikey': apikey, 'domain': domain} response = requests.get(url_domain, params=params) json_response = response.json() return json_response
APIキーは各自のものを使ってください。 これを用意しておけば、後は使いたいときに外からこのスクリプトを読み込んで関数を呼び出すだけです。
テスト用のスクリプトを用意。
import virustotal as vt import time import json if __name__ == '__main__': hashsum = 'ffffffffffffffffffffffffffffffff' url_scan = 'www.xxx.xyz/index.php' domain = 'www.xxx.xyz' ip_addr = 'XX.XX.XX.XX' print '--File Report--' result = vt.getHashReport(hashsum) print json.dumps(result, indent=2) time.sleep(16) print '--URL Scan--' result = vt.getUrlScan(url_scan) print json.dumps(result, indent=2) time.sleep(16) print '--URL Report--' result = vt.getUrlReport(url_scan) print json.dumps(result, indent=2) time.sleep(16) print '--IP Report--' result = vt.getIPReport(ip_addr) print json.dumps(result, indent=2) time.sleep(16) print '--Domain Report--' result = vt.getDomainReport(domain) print json.dumps(result, indent=2)
1分に4リクエストまでなので、一応1回ごとに16秒のインターバルをいています。ハッシュ値とか、URLとかは適当なものを入れてください。
結果はjsonで返ってきます。'virustotal.py'ではそれを辞書型にして返してくれます。テストスクリプトではそれを改めてjsonとしてダンプします。
結果は出力されたものを見てもらえば、どのように結果が出るかわかると思います。うまいこと必要な情報を抜き出していきましょう。
こういう感じで、他のサービスのAPIも手軽に扱えるよう、準備しておきたいですね。色々なサービスを連携して簡単に情報を収集できるような環境を目指しましょう。