TWLogEye開発12日目:Windowsのイベントログの検査ができた
今朝は5時に助手の猫さんが起こしに来ました。昨日、近くの温泉に行ったのでよく眠れて自力で起きられませんでした。
浦和レッズレディースが皇后杯優勝しました。PK戦は、ドキドキします。
昨日作っていたWindowsのイベントログの処理の続きです。
Windowsのイベントログは、だいぶ前に作った
を応用して処理します。WIndowsのイベントログはwevtutil.exeというWindows標準のプログラムで取得します。このプログラムの出力はXMLなので、XMLからGo言語で処理できるデータに変換する必要があります。Go言語のXMLのパッケージを使って変換する方法で作ってみたのですが、うまく変換できません。Go言語のJSONのパッケージほど賢くないようです。いろいろ悩んだ末、良いパッケージを発見しました。
XMLからJSONに変換するパッケージです。
これを試してみました。
変換はうまくいきました。ただし、標準の使用方法だとEvnetIDなどの数値が文字列として扱われるという問題がありました。 SigmaのルールでEventIDなどを文字列として判断するように書き換える必要があります。
goxml2jsonの説明をよく読むと数値を変換する方法が書いてありました。
package main
import (
"fmt"
"strings"
xj "github.com/basgys/goxml2json"
)
func main() {
// xml is an io.Reader
xml := strings.NewReader(`<?xml version="1.0" encoding="UTF-8"?><price>19.95</price>`)
json, err := xj.Convert(xml, xj.WithTypeConverter(xj.Float))
if err != nil {
panic("That's embarrassing...")
}
fmt.Println(json.String())
// {"price": 19.95}
}
のサンプルです。変更してみましたが、エラーでビルドできません。調べてみると、どうやら、バージョン番号のついたコミットには、このオプションが含まれていないようです。最後のコミットのパッケージを使うことで解決できました。
この問題が解決したので、Windowsのイベントログを検査して、syslog./trapで通知するところまできました。
テストのルールは、
title: windows test rule time changed
id: 2320ab71-d690-41e5-998e-428af26a63d4
status: test
description: windows test rule time changed
author: Masayuki Yamai(twsnmp@gmail.com)
date: 2025-01-25
modified: 2025-01-25
tags:
- attack.discovery
- attack.t1083
logsource:
category: test
product: windows
detection:
selection:
EventID: 1
condition: selection
falsepositives:
- Unknown
level: medium
です。Windowsの時刻の再設定が発生すると記録されるログです。時々記録されているのでテストには最適です。
検知してsyslogで通知できました。
できたところまで、絵に書いてみました。
Flowチャートを描くソフトの調子が悪いので、VSCodeのDarwioで描いてみました。少しなれれば、こちらのほうが便利かもしれません。
いよいよgRPCの対応です。楽しくなってきました。
明日に続く