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.33k stars 203 forks source link

Separate MITRE ATT&CK Tags and Other Tags when outputting #637

Closed hitenkoku closed 2 years ago

hitenkoku commented 2 years ago

TagsフィールドにMitreAttackの情報も出力されるので、MitreAttack情報が2回出力されてしまいます。TagsフィールドはMitreAttack以外のタグだけ出力できますか?

ref: https://github.com/Yamato-Security/hayabusa/pull/631#issuecomment-1200305628

YamatoSecurity commented 2 years ago

%MitreAttack%%MitreAttackTags%%OtherTags%に分けますか?

--all-tags Output all tags when saving to a CSV fileのオプションが不要になるので、削除して大丈夫ですよね?

hitenkoku commented 2 years ago

はい、一応確認したいのですが、おそらくタグの出力抑制をconfig/output_tag.txtで行っていましたがそちらの機能も削除して問題ないでしょうか(output_tag.txtに書かれたもの以外は --all-tagsがないと出力しないようになっている)

%MitreAttackTags%は「attack.xxx」もしくは「t.xxx」のフォーマットにあっているもののみで、それ以外のタグは%OtherTags%で対応する形でよいでしょうか。

YamatoSecurity commented 2 years ago

情報ありがとうございます。なるほど。

  1. %MitreAttackTags%だと、テクニックも入ってしまうので、 %MitreTactics%で「attack.xxx」を出力する。 %MitreTechniques%で「t.xxx」を出力する。 %OtherTags%でその他のタブを出力する。 という風に分けたいのですが、大丈夫ですか?
  2. --all-tagsの指定の代わりに、スキャンプロファイルに%OtherTags%の有無で全て出力するかどうか判定するのはどうですか?
  3. タグ名が長すぎる場合があるので、%MitreTactics%%MitreTechniques%%OtherTags%config/output_tag.txtで自由に文字列の置換できるようにしたいのですが、大丈夫ですか?
hitenkoku commented 2 years ago

@YamatoSecurity コメントありがとうございます。

  1. については対応可能です。
  2. についても可能です。--record-idなどと同じように--all-tagsは削除する方針にしようと思います。
  3. については少しイメージが合ってるか確認したいです。 以下ルールで例を書いてみました。認識があっているか確認いただけますでしょうか。
    • %MitreTactics% : ルール内で tagsの中にattack.Executionとattack.Impactが書いてるとする
    • config/output_tag.txtで attack.Exection, Exeと書いてある(attack.Impactについては記載がない) 期待する出力はExe | attack.Impactになる。(書いていないものはそのまま出す)

一応この文字列の置き換えのルールは完全一致であることを条件にしたいと思いますが問題ないでしょうか。(attack.ExecutionとExectionが別のものを指している可能性もあるため)

YamatoSecurity commented 2 years ago

ありがとうございます! -R, --hide-record-id Do not display EventRecordID numbersを忘れました。これも不要になりますね。削除しましょう。

3. については、Sigmaルールのタグは基本的に小文字のようなので、完全一致で良いと思います。 良く考えたら、output_tag.txtをTacticsタグ専用にした方が良さそうなので、まずmitre_tactics.txtにファイル名を変更しましょう。 %MitreTactics%mitre_tactics.txtを参照して、定義されているものを書き換えて、出力します。書いていないものはattack.t1560.001hacktoolsattack.g0092等のその他のタグになるので、無視しましょう。 %MitreTechniques%を作りたいと書きましたが、確認したら、attack.g0045のグループタグもattack.s0111のsoftwareもありました。テクニック、グループ、ソフトウェアのoutput_tags.txtのような設定ファイルはあった方が良いかなと考えましたが、1) リストが非常に長いので管理が難しい 2) 出力する情報が大きくなるので、G0045S001のIDのまま出力したいと思います。 attack.g0092等は長いので、attack.を消したいのと、Gを大文字にしたいです。また、グループ、テクニック、ソフトウェアを別々に分けた方が良いのかなと考えましたが、(例: %MitreTechniques%, %MitreGroups%, %MitreSoftware%) 変数が増えるのと、あまり分ける必要が無い気がするので、全部%MitreTags%にしたいと思います。

まとめると、タグ出力のロジックは:

  1. %MitreTactics%mitre_tactics.txtで定義されているかどうかチェックします。定義されている場合、出力します(例: attack.execution => Exec。定義されていないものを無視します。
  2. %MitreTags%attack.sattack.gattack.tから始まるタグを探します。あった場合は最初のattack.を消して、残った文字列を大文字にする。 例: attack.t1003 => T1003 attack.g0004 => G0004 attack.s0029 => S0029

(T、G、Sから始まるTacticはないので、Tacticとの勘違いはないはずです)

  1. %OtherTags%attack.から始まっていないタグをそのまま出力します。 例: hacktools => hacktools

色々ややこしくてすみません。まだ分かりにくいところがあったら、聞いて下さい!

hitenkoku commented 2 years ago

ありがとうございます。問題ないと思いますので一旦それで作ってみます。

hitenkoku commented 2 years ago

機能の作成は出来ました。現在2GBのデータを使って実行時間の比較を行いたいと思います