見出し画像

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の対応です。楽しくなってきました。

明日に続く


いいなと思ったら応援しよう!

twsnmp
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。