LoginSignup
15
15

More than 3 years have passed since last update.

SplunkでJPCERTログ分析トレーニング(ハンズオン その1)

Last updated at Posted at 2020-07-29

https://blogs.jpcert.or.jp/ja/2020/07/log_analysis_training.html
で「インシデント対応ハンズオン」でやってきたデータが公開されたのでSplunkでやってみる。

2020/08/12 準備その3でCommandLineが上手く抽出できていなかったので、transforms.confを修正

準備

https://jpcertcc.github.io/log-analysis-training/
から
https://github.com/JPCERTCC/log-analysis-training
に飛んで、
git clone https://github.com/JPCERTCC/log-analysis-training.git

レポジトリがダウンロードできるので
tar cvf Handson1.tar.gz Handson1 で固めて、そのままSplunkにファイルアップロード。設定は全部デフォルト。
:sweat:本当に適当

check.spl
source="Handson1.tar.gz:*"

で結果がでれば大丈夫。
:koala:フィールド抽出は?

準備その2

感想とか見て、やっぱりフィールドを抽出したほうがいいと思ったので、props.confを書いてみた

Security.csv

props.conf
[security_csv]
FIELD_NAMES = level,date,source,eventID,category,data
INDEXED_EXTRACTIONS = csv
LINE_BREAKER = ([\r\n]+)情報
NO_BINARY_CHECK = true
SEDCMD-trim = s/^レベル.*//
SHOULD_LINEMERGE = false
category = Structured
description = CSV
disabled = false
pulldown_type = true
field_exstraction.spl
source="Security.csv" sourcetype="security_csv" 
| rex field=data max_match=0 "(?m)^\s+(?<name>[^:]+):\s+(?<value>\S+)$"
| rex field=data "(?m)(?<message>^.*)"
| rex field=name mode=sed "s/(?m)^(.*)$/\"\1\"/g" 
| rex field=value mode=sed "s/(?m)^(.*)$/\"\1\",/g s/\\\/¥/g" 
| eval tmp=mvzip(name,value,": ") 
| nomv tmp 
| eval tmp=rtrim(tmp,",") 
| eval json="{".tmp."}" 
| spath input=json
| fields - tmp json data name value

kvが使えなかっため、無理やりJSON
途中のs/\\\/¥/gはパスの\が悪さをしていたので、windows表記に変換しています。

これで、左側にずらっと日本語フィールドが出てきます。
:sweat:こんなにフィールドあったのね

これでSplunkっぽく調査が可能

準備その3

SPLでいっぱいやるより、やっぱり最初からフィールド抽出がしたい

props.conf
[security_csv]
FIELD_NAMES = level,date,source,eventID,category,data
INDEXED_EXTRACTIONS = csv
LINE_BREAKER = ([\r\n]+)情報
NO_BINARY_CHECK = true
PREAMBLE_REGEX = 日付と時刻
SHOULD_LINEMERGE = false
category = Structured
disabled = false
pulldown_type = true
SEDCMD_id = s/\sID:/_ID:/g s/\"+//g
TRANSFORMS-kv = security_kv1, security_kv2
transforms.conf
[security_kv1]
INGEST_EVAL = data:=replace(data,"\"+","")
WRITE_META = true

[security_kv2]
SOURCE_KEY = field:data
REGEX = (?m)^\s*(?<name>[^:]+):[\t ]+(?<value>.+)$
FORMAT = "$1"::"$2"
REPEAT_MATCH = true
WRITE_META = true

:heart_eyes: props.conftransforms.confを先に書いておいてデータをアップロードした時設定したときフィールドが抽出されているのが嬉しい。

search.spl
source="Security.csv"

これで左側にもいっぱいフィールドが抽出される。

なお、いったん取り込んだデータを再度取り込み直したいときは

delete.spl
source="Security.csv"
| delete

で消して再取り込み。

props.conftransforms.confを修正した時は再設定を忘れずに。

:sweat: これを作るのに10回は繰り返してます。

:koala: transforms.confを頑張ったのでzip -r Handson1.zip ./Handson1で固めてアップロード、ソースタイプをsecurity_csvに設定でも動くよ。

報告書

いつでも便利なJPCERTの報告書。今回も適宜みることになる。
第1版
第2版
ツール分析結果シート

マルウェアの通信先IPアドレスを特定してください

log-analysis_handson.pdf を見つつ実施する。
win.exeをウィルス検知したということなので、

win_exe.spl
source="Handson1.tar.gz:*" win.exe 
| rex "(?ms)(?<level>[^,]+),(?<date>[^,]+),(?<source>[^,]+),(?<eventID>\d+),(?<category>.*)" 
| reverse

で結果を確認してみる。
フィールド抽出は説明通りにしている。

ログがでてくるので、もう一つの情報Win7_64JP_01のIPアドレス192.168.16.101を追加して検索する。
ついでに宛先アドレスも抽出してみる。

dest.spl
source="Handson1.tar.gz:*" win.exe 192.168.16.101
| rex "(?ms)(?<level>[^,]+),(?<date>[^,]+),(?<source>[^,]+),(?<eventID>\d+),(?<category>.*)" 
| reverse
| rex field=category "宛先アドレス:\s*(?<dest>\S+)"

destフィールドに値が抽出される。 :sweat:あってた。

マルウエアの動作開始時刻とマルウエアの実行方法を特定してください。

いったん検索を戻してみる

win_exe.spl
source="Handson1.tar.gz:*" win.exe 
| rex "(?ms)(?<level>[^,]+),(?<date>[^,]+),(?<source>[^,]+),(?<eventID>\d+),(?<category>.*)" 
| reverse

ログをつらつら見ていくと、Security.csvSysmon.csvの両方にログがでている時間があり、そこでコマンドが実行されているのがわかる。

cmd.exe /c ....C:\Windows\System32\taskeng.exe Task Scheduler Engineに登録されて、動作していることがわかる。
報告書第1版のP22を見ても、これで合っていると思う。

answer.spl
source="Handson1.tar.gz:*" win.exe 
| rex "(?ms)(?<level>[^,]+),(?<date>[^,]+),(?<source>[^,]+),(?<eventID>\d+),(?<category>.*)" 
| reverse
| search eventID=4688

とかでもいいみたいです。

攻撃者はWin7_64JP_01から別のマシンに侵入を試みています。侵入を試みた別の端末(ホスト名orIPアドレス)を特定してください。

ヒントをみるとnet useがキーワードらしい

commandline.spl
source="Handson1.tar.gz:*" "Microsoft-Windows-Sysmon" "chiyoda.tokyo"| rex "(?ms)(?<level>[^,]+),(?<date>[^,]+),(?<source>[^,]+),(?<eventID>\d+),(?<category>.*)"  | reverse
| rex field=category "CommandLine:\s*(?<CommandLine>.*)"
| stats count by CommandLine
| sort - count

一覧を出して、確認するとホスト名が出てくる
pingは別なIPアドレスに打っているけど、これは侵入ではないよな。 
:sweat:これまたなんとか

攻撃者はWin7_64JP_01に別のマシンから侵入しています。不正ログオン元のIPアドレスと使用されたアカウント名は何ですか?

win_exe.spl
source="Handson1.tar.gz:*" win.exe 
| rex "(?ms)(?<level>[^,]+),(?<date>[^,]+),(?<source>[^,]+),(?<eventID>\d+),(?<category>.*)" 
| reverse

また、最初の検索に戻って、一番最初のログをみると、送信元のIPアドレスとアカウント名が出ている。
:sweat:Splunkだとこうなります。

Win7_64JP_01でPowerShellファイルが実行されたようです。このファイルは何を行うものですか?

ps.spl
source="Handson1.tar.gz:*" .ps1
| rex "(?ms)(?<level>[^,]+),(?<date>[^,]+),(?<source>[^,]+),(?<eventID>\d+),(?<category>.*)" 
| reverse

powershellなので.ps1で検索
コマンドが出てくるので、見てみるとwebか〜
8個のイベントを見てみると2個のファイルダウンロードが確認できる。

準備その2をした人向け

まずは日本語のフィールドを全て選択して、表示させる。

win_exe.spl
source="Security.csv" sourcetype="security_csv"
| rex field=data max_match=0 "(?m)^\s+(?<name>[^:]+):\s+(?<value>\S+)$" | rex field=data "(?m)(?<message>^.*)" 
| rex field=name mode=sed "s/(?m)^(.*)$/\"\1\"/g"  
| rex field=value mode=sed "s/(?m)^(.*)$/\"\1\",/g s/\\\/¥/g"  
| eval tmp=mvzip(name,value,": ")  | nomv tmp  
| eval tmp=rtrim(tmp,",")  | eval json="{".tmp."}"  
| spath input=json | fields - tmp json data name value
| search win.exe
| reverse

左側に抽出されている気になるフィールドの値を見つつ

  • クリックして調査
  • ブラウザーで戻る
  • タイムラインを絞る
  • | search "調べたいこと" OR "調べたいことsono2"を追加してみる。

とかを繰り返していく。

フィールドはオブジェクト名がお薦めです。

準備その3をした人むけ

新しいプロセス名とか、アカウント名とかクリックしていくことになります。

まとめ

ハンズオン資料がgrepメインに対して、Splunkの場合フィールド抽出すれば俯瞰もできるし時間も絞れるので楽だと思います。

その2はまたの機会に

15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15