Yamato-Security / hayabusa

Hayabusa (隼) is a sigma-based threat hunting and fast forensics timeline generator for Windows event logs.
GNU Affero General Public License v3.0
2.26k stars 200 forks source link

[bug] Rules that use `Data` field won't work #775

Closed YamatoSecurity closed 1 year ago

YamatoSecurity commented 1 year ago

Describe the bug Data|contains|Data:等を使うルールは正しく検知しません。Applicationログの15件のルールがそれを使っています。 例: application/win_esent_ntdsutil_abuse.yml 元々のルール:

detection:
    selection:
        Provider_Name: 'ESENT'
        EventID:
            - 216
            - 325
            - 326
            - 327
        Data|contains: 'ntds.dit'
    condition: selection

Hayabusaルールに変換されるとData: '*ntds.dit*'になります。

イベントログはこんな感じ:

Screen Shot 2022-10-22 at 18 21 34

複数のDataフィールドがあります。

hayabusa-rulesレポジトリのReadmeに書いてありますが、複数のDataフィールドで検索したい場合はData:ではなくて、EventData:というフィールドを使う必要があります。rules/sigma/builtin/application/win_esent_ntdsutil_abuse.ymlのhayabusaルールでData: '*ntds.dit*'EventData: '*ntds.dit*'に変えたら正しく検知できました。

イベントキーアリアス(rules/config/eventkey_alias.txt)で直せるかなと試しましたが、駄目でした。 Data,Event.EventData.DataData,Event.EventDataを試しましたが、駄目でした。

なので、Hayabusaの方で修正する必要があります。 Dataフィールドを検索しているのに、EventDataを指定する必要があるのは分かりにくいのと、SigmaルールはDataを使っているので、EventDataの利用をやめて、Sigmaルールに合わせたいです。

※現在、EventData: hogehogeを使うhayabusaルールは3件ありますが、1.8.0をリリースしたら、Data:に変更しようと思っています。

Step to Reproduce ./hayabusa-1.8.0-dev -d ../hayabusa-sample-evtx -r rules/sigma/builtin/application/win_esent_ntdsutil_abuse_susp_location.yml

Expected behavior Ntdsutil Abuseのアラートが出るはずです。

hitenkoku commented 1 year ago

事象をこちらでも確認しました。対応策を考えます。

hitenkoku commented 1 year ago

おそらく現象としてはEventDataで指定した場合はDataのすべてを見ることができるためヒットするが、Dataを指定した場合は配列の最初のもののみをデータとして取得していることになるためヒットしないという事象のように見えました。

対策は2つ考えられます。いったん2番目のパターンで対応できないか検討します

YamatoSecurity commented 1 year ago

なるほど。私が見た限り、複数の同じフィールド名があるのは、Dataのみなので、Dataは少し例外的な扱いで、複数があった場合はData[0] 〜 Data[max]まで順番にチェックしたら良いかもしれません。

同一階層に複数のデータが存在した場合は一括して取得するようにする

Data[0] 〜 Data[max]の中身を一個の文字列等にするというイメージですか?

|endswith等の条件もあるので、一個ずつ条件を確認した方が良いかもしれません。(一括されたら、|endswithの条件が正しく動かないはずです)

YamatoSecurity commented 1 year ago

EventDataが定義された時と同じように全フィールドをチェックするのが一番ラクかも? https://github.com/Yamato-Security/hayabusa-rules/blob/main/README-Japanese.md#eventdata%E3%81%AE%E4%BE%8B%E5%A4%96%E7%9A%84%E3%81%AA%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

hitenkoku commented 1 year ago

同一階層に複数のデータが存在した場合は一括して取得するようにする

Data[0] 〜 Data[max]の中身を一個の文字列等にするというイメージですか?

|endswith等の条件もあるので、一個ずつ条件を確認した方が良いかもしれません。(一括されたら、|endswithの条件が正しく動かないはずです)

はい、その想定でした。たしかにコメントの通り、本来の今までの挙動に対して影響を与える可能性が大きいので、 EventDataが定義されたときと同じように処理を回すことが出来ないか確認してみます。

hitenkoku commented 1 year ago

@YamatoSecurity 対応が完了しました。hayabusa-rulesの方もEventDataをDataに変更するpull-requestを出しておきましたのでご確認のほどよろしくお願いいたします。