AbuseIPDBのSplunk用AddonであるAbuseIPDB Checkを使ってみた

タイトルのとおり、SplunkのAddonとして提供されているAbuseIPDB Check をSplunkにインストールして軽く使ってみましたので、その時の操作をここに記録しておきます。

1.Addonのダウンロード

以下のサイトからAbuseIPDB Check の Addonをダウンロードできますので、Splunkサイトにログインの上、ダウンロードします。

https://splunkbase.splunk.com/app/4903

2.Addonのインストール

Splunkダッシュボードの左上にある「Appの管理」(歯車マーク)をクリックし、Appの管理画面の右上にある「ファイルからAppをインストール」から、1.でダウンロードした tgzファイルをインストールします。

3.config.jsonファイルをコピー&編集

Macの場合、/Applications/Splunk/etc/apps/abuseipdb_check フォルダにAppの本体がインストールされます。

さらにその配下の defaultフォルダにconfig.json ファイルが置かれていますので、 defaultフォルダと同じ階層にある localフォルダにコピーします。

cd /Applications/Splunk/etc/apps/abuseipdb_check/default/
cp config.json ../local

そして、localフォルダにコピーしたconfig.jsonファイルを編集します。

config.jsonファイルを vi などで開くと以下の通り書かれていますので、「yourkeyhere」の部分の AbuseIPDBサイトの自分のアカウントからとってきた API Keyに置き換えます。

{
    "abuseip": [
            {
                    "api_key": "yourkeyhere"
            }
    ]
}

4.Splunkの再起動

3.まで実施したら以下のコマンドでSplunkを再起動します。

/Applications/Splunk/bin/splunk restart

5.AbuseIPDB Check App確認

Splunk が再起動したら、再度「Appの管理」を確認すると、以下の通りAbuseIPDB Checkが登録されているはずです。

Splunk – Appの管理

6.abuseipコマンドを試してみる

これで AbuseIPDB Check Appの abuseip コマンドが利用できるようになっているはずですので、以前対応した Virus Totalの vt4splunk と同じ要領で指定したIPの評価をAbuseIPDBからとってきます。

| makeresults
| eval testip="8.8.8.8"
| abuseip ipfield=testip
Splunk – abuseip 実行例

なお、Virus Totalと同時に評価をとってくることも可能なようです。

| makeresults
| eval testip="8.8.8.8"
| abuseip ipfield=testip
| vt4splunk ip=testip
Splunk – abuseip & vt4splunk 同時実行例

ちょっとテーブルの体裁を整えてみたのがこちら。

sourcetype=stream:http
| vt4splunk ip=dest_ip
| abuseip ipfield=dest_ip
| table _time,dest_ip, AbuseConfidence, vt_detections,vt_total_engines,vt_reputation
Splunk – abuseip & vt4splunk 同時実行例2

いい感じにAbuseIPDB と Virus Total の評価結果が表示できていると思います。

<参考サイト>

splunkbase AbuseIPDB Check(https://splunkbase.splunk.com/app/4903)
AbuseIPDB Splunk+AbuseIPDB(https://www.abuseipdb.com/splunk)

Virus TotalのSplunk用Addonであるvt4splunkを使ってみた(ハッシュ編)

Virus TotalのSplunk用Addonであるvt4splunkを使ってファイルハッシュの調査をしてみたのでここに記録しておきます。

1.ハッシュ値の準備

vt4splunk経由で確認するファイルのハッシュ値を準備します。

今回は、MISPにて収集した IoCデータの中から以下の赤枠のハッシュ値でテストしてみることにしました。

MISP – IoCサンプル1

なお、MISPではこのハッシュはまず、Payload delivery というタイプで2019-04-10 に配布されており、その後、md5 のタイプで 2019-04-12に配布されているようです。

MISP – IoCサンプル2

2.vt4splunkにハッシュデータを直接渡す

それでは先ほどのMISPから取り出したハッシュをvt4splunkを使って評価してみます。

Search画面から以下のコマンドを打つと、testhashで指定したファイルハッシュに対する Virus Totalでの評価結果を検索結果の一部として表示することができるようになります。

Splunk vt4splunk addon

これをみるとこのハッシュが最初に報告されたのが、2019-04-12 となっています。

ほぼ同時期ですが、Payload delivery というタイプでMISPを確認しておけば、2日早くこのファイルをハッシュにて検知できていたようですね。

MISP が ThreatFox から集めてきたIoCに C2 サイトかどうかの記載があるか確認してみた。

ThreatFox から収集した イベントの一例です。

misp – ThreatFox

イベントには複数の IoC が登録されていますが、それぞれの IoC についてどのマルウェアの C2 なのかが記載されています。

misp – ThreatFox

OpenCTI のAPIにPythonから Accessし、登録されたindicatorを表示できるか確認してみた

先日構築したOpenCTIに登録された indicatorにAPIからアクセスできるか確認してみました。

できれば指定した indicator をピンポイントで検索できればと思っていますが、その前に取り合えず、APIから登録した indicator をリストで表示させることができたので、ここに記録しておきます。

なお、APIの使い方については以下のサイトに記載されています。

https://github.com/OpenCTI-Platform/client-python/blob/master/docs/client_usage/getting_started.rst

1.pycti のインストール

もしOpenCTIの環境に pycti を入れていないようであれば、以下の要領でインストールしておきましょう。

sudo apt install python3-pip
pip3 install pycti

2.Indicatorの登録

冒頭で紹介したサイトにサンプルが掲載されていますので、それをすこしいじって OpenCTI に indicator を登録します。

おもに以下の太字の部分を環境に合わせて修正すれば大丈夫です。

from dateutil.parser import parse
from pycti import OpenCTIApiClient
from stix2 import TLP_GREEN

# OpenCTI API client initialization
opencti_api_client = OpenCTIApiClient("http://localhost:8080", "<ローカルに立てたOpenCTIのAPI Keyを設定>")

# Define an OpenCTI compatible date
date = parse("2023-07-16").strftime("%Y-%m-%dT%H:%M:%SZ")

# Get the OpenCTI marking for stix2 TLP_GREEN
TLP_GREEN_CTI = opencti_api_client.marking_definition.read(id=TLP_GREEN["id"])

# Use the client to create an indicator in OpenCTI
indicator = opencti_api_client.indicator.create(
    name="C2 server of the new campaign",
    description="This is the C2 server of the campaign",
    pattern_type="stix",
    pattern="[IPv4-Addr:value = '100.172.180.181']",
    x_opencti_main_observable_type="IPv4-Addr",
    valid_from=date,
    update=True,
    markingDefinitions=[TLP_GREEN_CTI["id"]],
)

上記プログラムを「create_indicator.py」という名前で保存して、以下の通り OpenCTIのサーバ上で実行します。

$ python3 create_indicator.py 
INFO:pycti.entities:Listing Threat-Actors with filters null.
INFO:pycti.entities:Reading Marking-Definition {marking-definition--34098fce-860f-48ae-8e50-ebd3cc5e41da}.
INFO:pycti.entities:Creating Indicator {C2 server of the new campaign}.
OpenCTI – indicatorリスト

3.Indicatorのリスト表示

それでは次に、OpenCTI に登録した Indicator をリストで表示してみます。
プログラムについては以下のサイトのものを参考にカスタマイズしています。

https://github.com/OpenCTI-Platform/client-python/blob/master/examples/get_all_indicators_using_pagination.py

以下、カスタマイズ後のプログラムです。
実行時に「pattern」や「description」などを表示するようにしています。

from pycti import OpenCTIApiClient

# Variables
api_url = "http://localhost:8080"
api_token = "ローカルに立てたOpenCTIのAPI Keyを設定>"

# OpenCTI initialization
opencti_api_client = OpenCTIApiClient(api_url, api_token)

# Get all reports using the pagination
custom_attributes = """
    id
    pattern_type
    pattern
    created
    description
"""

final_indicators = []
data = {"pagination": {"hasNextPage": True, "endCursor": None}}
while data["pagination"]["hasNextPage"]:
    after = data["pagination"]["endCursor"]
    if after:
        print("Listing indicators after " + after)
    data = opencti_api_client.indicator.list(
        first=50,
        after=after,
        customAttributes=custom_attributes,
        withPagination=True,
        orderBy="created_at",
        orderMode="asc",
    )
    final_indicators += data["entities"]

for indicator in final_indicators:
    print("[" + indicator["created"] + "] " + indicator["pattern"] + ", " + indicator["description"])

そしてこれが実行結果です。

$ python3 get_all_indicators.py
INFO:pycti.entities:Listing Threat-Actors with filters null.
INFO:pycti.entities:Listing Indicators with filters null.
[2023-07-17T00:58:42.733Z] [domain-name:value = 'www.5z8.info'], This is the C2 server of the campaign
[2023-07-17T01:18:55.912Z] [IPv4-Addr:value = '100.172.180.180'], This is the C2 server of the campaign
[2023-07-17T01:34:48.208Z] [IPv4-Addr:value = '100.172.180.181'], This is the C2 server of the campaign

indicator やそのdescriptionがきちんと表示されています。

MISP の効果的な利用方法2:インシデント調査で集めたIoCが、外部から収集したIoCと一致していないか確認する

MISP には複数のイベントでIoCが一致していないかチェックする機能があります。

それをうまく利用すれば、インシデント調査で収集したIoCが外部から収集したIoCと一致していないか、また、外部から新たに収集したIoCが、過去のインシデント調査した際のIoCと一致していないかを確認することが可能です。

1.インシデント対応で抽出したIoCの登録

以下の通り、インシデント対応で抽出したIoCを「Add Event」から登録します。

なお、インシデント対応で抽出したIoCを登録する際はイベント名を「SOC-Insident 001」などとするとわかりやすいと思います。

MISP – Add Event

上記画面で「Submit」後に、下図の赤枠で囲った部分にあるアイコン(populate using the Freetext Import tool)をクリックします。

MISP – using Freetext Import tool

すると以下のようなFreetext Import Tool のポップアップが表示されるので、インシデント対応の中で収集したIoCをペーストし、「Submit」します。

Freetext Import tool

このツールはとても優秀で、IoC 以外の情報もまとめて放り込んでも、綺麗にIoCだけ抽出し、以下の通りピックアップしてくれます。

MISP – Freetext Import Results

Freetext での取り込み結果を確認し、問題なければ「Submit attributes」ボタンを押します。

2.IoC提供元のFeedとの関連を確認

インシデント調査で収集したIoCの登録が完了すると、すでに登録されているイベントのIoCと重複していないか、赤枠の通り表示してくれます。

MISP – IoC list

また重複している場合は、「+Correlation Graph」を選択することで、重複しているイベントとの相関図を以下のとおり表示してくれます。

MISP – correlation graph

3.新しいFeedを取り込んだときの既存インシデントとの重複確認にも

なお、標的型攻撃などの場合には、インシデント調査で抽出したIoCが各Feed提供元のIoCリストにはまだ登録されていない、といったこともままあると思います。

したがって、新しくFeed提供元からIoCを取得した際に、そのIoCがすでにインシデント対応で抽出していたIoCと一致していないか確認する、といった使い方も可能です。

MISP – IoC list

ちなみに、他のイベントとIoCが重なった数はイベントリストの「Corr」カラムに記載されていますので、探しやすいと思います。

MISP – Events