Splunk Addon BuilderでSplunk からShodanのREST API にアクセスするAddonを作ってみた

Splunkbase に Shodan へのアクセスする為にaddon がなかったので、インターネットの情報を見ながら Splunk Addon Builder を使って作ってみました。

REST APIへのアクセスし定期的にデータを取ってくるだけであれば30分くらいで作成できたので共有しておきます。

1.新しいAddonの作成

Splunk Addon Builderの画面から「New Add-on」を選択します。

Splunk Addon Builder

すると以下の画面が表示されるので、「Configure Data Collection」を選択します。

Splunk Addon Builder

次にAddonの名前を決めます。

Splunk Addon Builder

そしてデータのインプット方法を聞かれるので左端の「REST API」を選択します。

Splunk Addon Builder

次に、sourcetypeなどを設定していきます。

Splunk Addon Builder

そして、REST APIでどんな情報をサーバに投げてデータをGETするかを設定します。

ここではサンプルとして2つ記載しておきます。

(1)指定したIPアドレスの情報を取得するサンプル

https://api.shodan.io/shodan/host/8.8.8.8?key=(API Kye)
Splunk Addon Builder

(2)ポート22が空いている日本のドメイントップ100を取得する場合

https://api.shodan.io/shodan/host/count?key=(API Key)&query=port:22 country:JP&facets=domain:100
Splunk Addon Builder

「テスト」ボタンでデータが正しく取得できることを確認したが、「保存」ボタンを押します。

この後、Splunkの再起動を手動で行う必要がありますので注意してください。

ちなみに私の環境(Mac)では以下のコマンドでSplunkの再起動を行いました。

/Applications/Splunk/bin/splunk restart

2.新しいインプットの作成

「Create New Input」ボタンを押し、入力の名前やデータ取得間隔をあらためて設定します。(なぜあらためて入力させているのかは不明。。。)

Splunk Addon Builder

3.サーチの実行

すると指定した間隔でデータを取得してくれるので、トップのメニューバーから「サーチ」を選択し、以下のようなサーチ文を入力します。

sourcetype="shodan-ssh"
| table facets.domain{}.value, facets.domain{}.count

すると定期的に取得したデータを元に以下のような検索結果を表示してくれます。

Splunk 新規サーチ画面

参考サイト:

・SplunkのAdd-on Builderで自前のアドオンを作成してみる(REST API編)-クラスメソッド株式会社-(https://dev.classmethod.jp/articles/splunk-add-on-builder-rest-api/)
・Shodan API Reference – Shodan- (https://developer.shodan.io/api)

Virus TotalのSplunk用Addonであるvt4splunkを使ってみた(IPアドレス編)

Virus TotalのSplunk用Addonであるvt4splunkを使ってみたのでここに記録しておきます。

vt4splunkにIPアドレスを直接渡す

vt4splunkをSplunkにインストール後、Search画面から以下のコマンドを打つと、testipで指定したIPアドレスに対する Virus Totalでの評価結果を検索結果の一部として表示することができるようになります。

| makeresults
| eval testip="8.8.8.8"
| vt4splunk ip=testip
Splunk サーチ実行結果1

念のため、Virus Totalでも 8.8.8.8 の評価結果を確認したところ、上記と同じく2/88という結果が得られました。

Virus Total

vt4splunkに検索結果を渡す

なお、上の方法を応用し、以下のようにあるsourcetype で httpの通信が 400(Bad Request)であったログを検索し、その検索結果の中の”dest_ip”をIPアドレスとしてvt4splunkに渡すことも可能でした。

sourcetype="stream:http" status=400
| vt4splunk ip=dest_ip
| table _time,dest_ip, vt_detections,vt_total_engines,vt_reputation,vt_info

なお、この実行結果は以下の通りです。

Splunk サーチ実行結果2

<参考文献>

hiro_ さんのツイート(https://twitter.com/papa_anniekey/status/1593064221235097600)

MISP と Splunk をREST APIで連携させて、特定のイベントのMD5をSplunk上に表示させてみた

MISP で集めたIoCをうまくSplunkで活用できないかと思い、まずはSplunk上で MISP からとってきた特定イベントの IoC(MD5)を表示させてみました。

なお、これから説明する手順の前準備として、SplunkとMISPを連携させる為に、MISPのApp(MISP42)をSplunkにインストールしています。

1.MISPのインスタンスを作成

MISPのAppのメニューバーから「設定」を選択後、「追加」ボタンを押します。

Splunk – MISP42 App

すると以下の設定画面が表示されますので、MISPの「URL」「API Key」を設定します。

なお「Check MISP Certificate」のチェックは今回テスト利用の為、外しておきました。

Splunk – MISP42 App

2.MISPのイベントIDを検索

MISPのAppのメニューバーの「MISP CUSTOME COMMAND」のプルダウンから「MISP custome command mispgetioc」を選択すると以下の画面が表示されます。

今回は赤枠の「misp instance」「eventid」「タイプ」を設定し「実行」ボタンを押してます。

Splunk – MISP42 App

すると画面の下の方に検索結果が表示され、MISP と同じ情報が表示されていることが確認できました。

Splunk – MISP42 App

これとSplunkのログを突き合わせることができれば、悪性のIoCをキーにアラートが出せそうです。

MISP にてIoCを集めてみたがダッシュボードのどこに記載されているかわかりにくかった件

諸事情により先日、MISP をインストールして画面を触ってみたのですが、ぱっと見、どこにIoCが格納されているのかわかりづらかったので、ここに記載しておきます。

1.イベントIDをクリック

MISPのトップページ(Home)にてEventリストが表示されていると思いますので、その項目の中からIoCを確認したいEventの「ID」をクリックします。

MISPダッシュボード1

このEventが個々の脅威と考えてようさそうです。

2.イベント画面を下にスクロール

Eventの「ID」をクリックするとそのEventの詳細情報が表示されますので、画面を下にスクロールさせます。

MISPダッシュボード2

3.IoCを確認

すると、マルウェアのハッシュや Virus Totalのレポートへのリンクと思われる情報を見つけることができます。

MISPダッシュボード3

Splunkのlookupファイルの内容を表示させてみた

Splunk に入っている lookupファイルの中身の確認の仕方がわからなかったので、操作方法を確認してみました。

1.設定からルックアップを選択

メニューバーの「設定」から「ルックアップ」を選択を選択します。

Splunkコンソール1

2.ルックアップテーブルファイル

すると以下の「ルックアップ」画面が表示されるので、その中から「ルックアップテーブルファイル」を選択します。

Splunkコンソール2

3.ルックアップファイル名の確認

後ほどSPL言語で中身を表示させるルックアップファイルのファイル名を確認しておきます。(ここでは、「miter_techniques.csv」)

Splunkコンソール3

4.Search & Reporting Appを選択

画面左ペインから「Search & Reporting」Appを選択します。

Splunkコンソール4

5.lookupファイルの内容を表示

サーチ用のテキストフィールドから以下のコマンドを入力し、ルックアップファイルの内容を表示させます。

| inputlookup mitre_techniques.csv
Splunkコンソール5

Power Automate(無償版)で作成したフローを定期的に実行する

以下サイトを参考にさせていただき、Power Automate(無償版)で作成したフローをWindows のタスクスケジューラで自動起動させてみました。

参考サイト
[Power Automate Desktop]名前を指定してフローを実行するPowerShellスクリプト(初心者備忘録)
https://www.ka-net.org/blog/?p=13647

【DX】PowerAutomate Desktop無料版を自動定期実行してみた!(株式会社エアリー)
https://note.com/airily_inc/n/n6ab8b688d4ad?utm_source=pocket_saves

基本的に上記サイトのとおり実施すれば、Power Automateのフローを指定した時間や定期的に起動させることができますが、一点注意事項がありましたので記載しておきます。

外部入出力変数を設定している場合

フローに対して外部からデータを渡している場合、タスクスケジュールで Power Automateのフローを自動起動させたとしても、以下のように入出力変数の確認画面が表示され止まってしまいます。

Power Automate – 外部入出力変数

この回避のために入出力変数を機密情報扱いにしたり、ピン留めしたししてみましたがそれでは回避できないようです。

したがって、今のところ自動起動させたいフローがあった場合、入出力変数は使わない(直接アクションに埋め込むか、ファイルなどから読み込むか)ようにするしかないかと考えています。

SplunkのSPLで検索対象とするログの時間帯を指定する

Splunkでログを検索するときに、検索フィールドの横にある選択リスト?から対象となるログの時間帯を選ぶことが多いですが、SPLで直接指定する方法もあると思い調べてみました。

以下のように記載すると、10年前から1年前までのログを検索してくれるようです。

index=botsv1 earliest=-10y@y latest=-1y@y

なお、以下のように記述すると、統計的に20件以上発生しているsrc_ip をトップから表示してくれます。

index=botsv1 earliest=-10y@y latest=-1y@y| top limit=20 src_ip

また table を利用すると項目を絞って(以下の例の場合、_time, app, dest_ipのみ)ログを表示してくれます。

index=botsv1 earliest=-10y@y latest=-1y@y
| table _time, app, dest_ip

Power Automate で Splunkの操作を自動化してみた

Power Automate のブラウザ操作機能で実際に Splunk のWeb画面をどこまで操作できるか試してみました。

試してみる前は Power Automateのレコーダー機能で何も考えずにできてしまうのではないかと楽観視していましたが、そうすんなりいかないことがわかりました。

ただし、コツさえつかめば比較的簡単に解決できるようなので、Power Automateはやはり自動化しやすいなという思いを新たに持ちました。

1.ブラウザ操作をレコーダーで記録

まずざっとPower AutomateのレコーダーでSplunkの操作を記録した結果は以下の通りです。

Power Automate – レコーダー記録直後

この中からまずは不要そうなアクションを削除します。具体的には赤枠でかこった部分が不要と思われる部分です。

2.とりあえず動かしてみる

不要そうなアクションを削除した後とりあえず動かしてみると、まず以下の赤枠で囲われた部分で処理がエラーになりました。

Power Automete – Error 1

3.エラー部分のUI要素を編集する

具体的には、ログの検索時間を「最新24時間」から「全時間」変えるところで失敗しています。

Splunk 自動化失敗箇所1

そこで、Power Automateの右端のアイコンメニューの内、上から2つ目の「UI要素」を選択し、「Anchor ‘全時間’」となっている部分を確認することにします。

Power Automate – UI要素

「Anchor ‘全時間’」部分から右クリックでメニューを表示させ、そこから「編集」を選びます。

Power Automate – UI要素 – 編集

すると以下の通り複数の要素が選択されている状態になっていますので、とりあえず一番したの「Anchor ‘全時間’」だけ選択された状態にします。

Power Automate – UI要素2

結果として下部の「セレクターをプレビューする」が「a[Text=”全時間”]」とシンプルな形になります。

Power Automate – UI要素3

これで保存すると、処理を流したときにうまく「全時間」を選択してくれるようになりました。

4.再度動かしてみる

そこで再度動かしてみましたが、今度はテキストフィールドを選択するところでエラーになりました。

Power Automate – Error 2

おそらくDiv の後ろの “id-“が動的なUI要素として生成されているからではないかと思われます。

5.エラー部分の動的なUI要素に対処する

具外的にはSplunk画面の以下の赤枠部分のテキストフィールド選択が失敗しています。

Splunk 自動化失敗箇所2

そこで、エラーが出ていたアクションの編集画面を右クリックで表示し、以下の画面のようにUI要素として「Text area ‘サーチ’」を選択します。

Power Automate – UI要素の変更

こうすることで以下のとおりアクションの表示が変わりますが、よく見てみると「Test area ‘サーチ’に”を入力する」となっており、テキストフィールドに入力したはずのSPL文が入っていません。

Power Automate – 入出力変数1

そこで右上の赤枠の通り、「入出力変数」から「入力」を選択し新しい入出力変数としてSPL文を設定しておきます。

Power Automate- 入出力変数2

この入出力変数(NewInput)を設定してくことで、下図の通り先ほどのアクションの編集画面から入力値として NewInput を選択できるようになります。

Power Automate- 入出力変数3

これで、NewInput の値を変えるだけで、いろいろなSPLを検索することができるようになりますね。

Power Automate – 完成

6.自動化成功

最終的に最後まで自動化した結果が以下の通りです。

Splunk自動化結果

SPL で表示した結果をCSV でローカルに保存するところまで自動化できました。

AbuseIPDBにアクセスするPythonプログラムを試してみた

ある理由から AbuseIPDB にIPアドレスを投げてその評価結果を受け取るPythonプログラムを作成しようと思いググったところ、以下のYoutube動画を見つけました。

AbuseIPDB API Python Script(Mostafa Yahia)

そこで真似して作成してみることにしました。

なお、上記動画で紹介しているPythonプログラムは以下のGitHubで公開されています。

https://github.com/Mostafayahia-hunter/AbuseIPDB-API-Python

だだし、最近、AbuseIPDBからのレスポンスが変わったのか、一部の箇所でエラーがでたので、csv_columnsの定義の部分を以下の通り書き換えました。(’isTor’を追加しました。)

csv_columns = ['ipAddress','isPublic','ipVersion','isWhitelisted','abuseConfidenceScore','countryCode','usageType','isp','domain','hostnames','isTor','totalReports','numDistinctUsers','lastReportedAt']

また、Pythonプログラム実行時に要求される IPリストとして入力するcsvファイルとしては、以下のような内容を用意しました。

IP,
88.29.56.3,
1.158.10.11,
161.35.146.242,
177.84.141.183

そしてコマンドプロンプト上で実行した結果がこちらです。

Python実行画面

実行するとAbuseIP_results.csvというファイルが出来上がっており、それを開いてみた結果は以下の通りです。

Python実行結果

プログラムをいろいろいじってみて CSVライブラリの使い方あたりがとても勉強になりました。

Power AutomateからVirus Total にアクセスするPythonを呼び出して入力したサイトの安全性を確認してみた

最近、Power Automateをいろいろといじり始めていますが、今回は、Power Automateから Virus TotalにアクセスするPythonプログラムを呼び出してみましたので、そのときの設定を記録しておきます。

なお、処理の流れは以下の通りです。

1.入出力変数(NewInput)にVirus Totalで評価するURLを設定
2.NewInputの内容をinput.txtに書き込み
3.Virus TotalにアクセスするPythonプログラムを呼び出し
  (input: input.txt, output:output.txt, scan_result.json)
4.Virus Totalでの評価結果をoutput.txtファイル等から読み込み
5.Gmailをつかって評価結果をメール送信

Power Automate全体フロー

以下、フローを作成していて苦労した点を少し説明していきます。

2.NewInputの内容をinput.txtに書き込み

Power Automateの機能メニューから「テキストをファイルに書き込む」を選択した際に、エンコードがデフォルトでUTF-8になっていましたが、それだとなぜが Pythonで読み込んだときに半角が全角になってしましいました。

そこでエンコードの設定を「UTF-8」から「システムの規定値」に変えたところ、半角のままpythonで処理することができました。

Power automate – テキストをファイルに書き込む

3.Virus TotalにアクセスするPythonプログラムを呼び出し

正直このPythonプログラムは ChatGPTにお願いして大部分を作成してもらいました。

手直ししたのは、「json_response[‘positives’]」を「json_response[“positives”]」を書き換えたくらいです。

あとはそのまま動いてくれました。

import requests
import json

# VirusTotalのAPIキーを設定します。
api_key = 'virus totalのapiキーをここに設定'

# VirusTotalのURLスキャンAPIエンドポイントを設定します。
url_scan_endpoint = 'https://www.virustotal.com/vtapi/v2/url/scan'

# ファイルを読み込みモードで開きます。
with open('c:\\tmp\\input.txt', 'r') as file:

# ファイルから文字列を読み込み、調査したいURLを設定します。
url_to_check = file.read()
print(url_to_check)

# APIリクエストのパラメータを設定します。
params = {'apikey': api_key, 'url': url_to_check}

# URLスキャンAPIにリクエストを送信します。
response = requests.post(url_scan_endpoint, data=params)

# レスポンスをJSON形式で取得します。
json_response = response.json()

# スキャンIDを取得します。
scan_id = json_response["scan_id"]

# VirusTotalのURLレポートAPIエンドポイントを設定します。
url_report_endpoint = 'https://www.virustotal.com/vtapi/v2/url/report'

# APIリクエストのパラメータを設定します。
params = {'apikey': api_key, 'resource': scan_id}

# URLレポートAPIにリクエストを送信します。
response = requests.get(url_report_endpoint, params=params)

# レスポンスをJSON形式で取得します。
json_response = response.json()

# URLが安全かどうかを判断します。
if json_response["positives"] > 0:
    text_to_write = 'The URL is not safe.'
else:
    text_to_write = 'The URL is safe.'

# ファイルを書き込みモードで開きます。
with open('output.txt', 'w') as file:
    # 文字列をファイルに書き出します。
    file.write(text_to_write)

# レスポンスをファイルに保存します。
with open('scan_result.json', 'w') as outfile:
    json.dump(json_response, outfile)

5.Gmailをつかって評価結果をメール送信

ここでは、Gmailサーバにアクセスする為のポート番号の設定や、2段階認証していたのでアプリパスワードの設定に少してこずりました。