hayabusa icon indicating copy to clipboard operation
hayabusa copied to clipboard

Enhancement: Search keyword feature

Open YamatoSecurity opened this issue 2 years ago • 5 comments

Be able to search by keywords, either case-senstive, case-insensitive, or regex pattern either with a single keyword or a file with multiple keywords. It will search all fields in all logs for the keyword(s) and return results with all fields.

search機能の追加。大文字小文字を区別する、区別しない、正規表現の3種類のキーワード検索で、一つの単語もしくはファイルに書いてある複数のキーワードに対応したいです。※色んな組み合わせがあるので、オプションが多くなりそうです。 全ログの全フィールドでキーワード検索をして、--full-dataのように全フィールド情報が入っている結果を出力するイメージです。

Hayabusaのデフォルトオプションをなるべく増やさないよう--searchオプションではなくて、search命令にするのはどうかなと最初思ったけど、やはりいつも通り-s, --searchオプションにした方が良いかも。

cargo build [OPTIONS]のように

./hayabusa search -f file.evtx -k keyword
./hayabusa search -f directory -i -k case-insensitive-keyword
./hayabusa search -f file.evtx -r -k regex-keyword -o results.csv
./hayabusa search -f file.evtx -K keywords-file.txt

--searchオプションではなく、search命令にしておけば、オプションを好きにでそうです。 ※ search命令の場合は-rオプションが-r, --regexに変わるイメージ。--rulessearchでは使わないので。

しかし、3つの問題が出てくる:

  1. 同じオプションで意味が変わるので、分かりにくい

  2. 別のヘルプメニューが必要になってくる: cargo help buildのヘルプメニューのようにsearch命令の別のヘルプメニューを作る必要がある?

また、search命令で対応したいオプションは以下の通り:

--European-time
--RFC-2822
--RFC-3339
--US-military-time
--US-time
-d, --directory <DIRECTORY>
-f, --filepath <FILE_PATH>
-l, --live-analysis
--no-color
-o, --output <CSV_TIMELINE>
-q, --quiet
-k, --keyword
-i, --case-insensitive
-r, --regex
-K, --keywords-file <KEYWORDS_FILE>
--start-timeline
--end-timeline
-t, thread_number <NUMBER>
--target-file-ext
-U, --UTC
  1. なので、開発が大変かも?

もし、search命令ではなく、-S, --searchオプションを追加した方が良さそうのであれば、

-k, --search-keyword
-K, --search-keywords-file <FILE>
-R, --search-regex (※`-R, --hide-record-id`を`--hide-record-id`に変える)
-i, --search-case-insensitive

の4つのオプションを追加しておけば、今のやり方でできそうです。

YamatoSecurity avatar Jul 02 '22 11:07 YamatoSecurity

このsearchで得られた結果を画面出力、もしくはファイル出力することになるとかんがえております。 現在出しているカラムとは別にカラムを追加しますか?それともほかのカラムの表示を置き換える形ですか?

hitenkoku avatar Jul 02 '22 11:07 hitenkoku

  1. について、一応サブコマンド searchを作ったら、別のstructでサブコマンドを管理する必要が出てきます。 一応同じオプション名でもサブコマンドのありとなしで管理はできそうです。

ただ、ご指摘の通り、ユーザは混乱するかと思いますので、あまりよくないとは思います。

下について念のため確認しておくと、

  • -k は1つのキーワードを検索
  • -Kは複数のキーワードを検索
  • -Rは1つの正規表現で検索、
  • -iは、-kや-Kと組み合わせて利用して、使ってなければ大文字小文字区別なし、使った場合は大文字小文字区別ありだと思っていますがあっていますか?

実装を簡単にするために、以下のようにしたほうが良いと思います。

  • キーワード指定をファイル指定をさせるだけで終わらせておきたいので-kは無しにしたいです(1つだけ検索したいのであればファイルに一つだけ書けばいいため)
  • -Rについても正規表現を描いたファイルを1つ参照して対応するだけにしておきたいです(大文字小文字の区別は正規表現内でユーザが書けばいいのでこちらは-iオプションの有無は考えない)

正規表現ですが、おそらく非常に重くなります(以前制御文字を削除しようとしたときに正規表現を利用した時がありましたので同じようなものを作っていく形になると思います)

もし、search命令ではなく、-S, --searchオプションを追加した方が良さそうのであれば、

-k, --search-keyword -K, --search-keywords-file <FILE> -R, --search-regex (※-R, --hide-record-id--hide-record-idに変える) -i, --search-case-insensitive の4つのオプションを追加しておけば、今のやり方でできそうです。

hitenkoku avatar Jul 02 '22 12:07 hitenkoku

このsearchで得られた結果を画面出力、もしくはファイル出力することになるとかんがえております。 現在出しているカラムとは別にカラムを追加しますか?それともほかのカラムの表示を置き換える形ですか?

画面出力もファイル保存の両方に対応したいです。 別のカラムを追加する必要はなくて、逆にルールを使わないので、ルールタイトルとルールファイルパスのカラムを消す必要があると思います。全フィールド情報をdetailsカラムに出力したら良いと思います。その他のカラムはいつもで良いと思います。

YamatoSecurity avatar Jul 03 '22 01:07 YamatoSecurity

-Rは1つの正規表現で検索、

-Rは一つまたはファイル指定で複数のregexキーワード検索したいです。 コマンドラインでキーワード指定や-iオプションを無くしても、なんとかキーワードをファイルに書いて検索できなくはないが、「なんでこんな面倒くさいことをさせるん?」ってブーイングされそうです。。

その辺は次回のミーティングで話し合いましょう。

「ルールタイトルを無くしたい」と書きましたが、やはりイベントのタイトルがあった方が良いので、網羅できないが、statistics_event_info.txtを参照して、RuleTitleカラムにイベントタイトルを出力した方が良さそうです。

YamatoSecurity avatar Jul 03 '22 02:07 YamatoSecurity

一旦話し合うとのことでしたのでpendingラベルをつけておきました

hitenkoku avatar Jul 03 '22 12:07 hitenkoku

お待たせしました。 @hitenkoku 以下の方針でどうですか?

  • サブコマンドは時間がかかるので、OTHER-ACTIONS配下の-s, --searchオプションで検索する。
  • SEARCH-OPTIONSという新しい項目で以下の検索オプションを追加する:
    • -k, --search-keywords (一つまたは複数のキーワードを検索する)
    • -R, --search-regex (一つの正規表現で検索する。遅くなると思うけど。hyperscanで実装した方が早くなるかも?)
    • -i, --search-case-insensitive (大文字小文字を区別しない
    • -F, --search-field (特定のフィールドにキーワードを検索する。Image等々) -> eventkey_alias.txtのエイリアスを参照する

標準出力する場合は固定で以下のフィールドを出力する: %Timestamp% ‖ %Computer% ‖ %Channel% ‖ %EventID% ‖ %RecordID% ‖ %EventTitle% ‖ %AllFieldInfo% ‖ %EvtxFile%

%EventTitle%rules/config/channel_eid_info.txtからタイトルを調べる。不明の場合はUnknown

-oのファイル保存は,にして、CSVで保存する。

JSON対応は取り敢えずしなくて良いと思います。

YamatoSecurity avatar Oct 12 '22 09:10 YamatoSecurity

@itiB さん、Hayabusa v2がリリースされて、新しい情報もあるので、仕様を整理します。

サブコマンド: search: オプション: -k, --keyword (取り敢えず、一つのキーワードにしましょう。実装できそうだったら、-k keyword1 -k keyword2というように複数指定可能にしたいけど、次のバージョンでもOK。) -R, --regex (一つの正規表現で検索する。-k-Rの両方を指定すつことはできない。) -i, --ignore-case (-kのキーワードの大文字小文字を区別しない。デフォルトはcase sensitive) -F, --filter <FIELD:FILTER> (特定のフィールドにキーワードを検索する。例: EventID:4626はイベントID == 4626の結果に絞る) -> eventkey_alias.txtのエイリアスを参照する。これも最初のバージョンでは一つのフィルタだけでOKです。ゆくゆくは複数のフィルタ指定可能にしたい。) -o, --output (csv-timelineのようにCSVに保存する。)

固定で以下のフィールドを出力する: %Timestamp% ‖ %Computer% ‖ %Channel% ‖ %EventID% ‖ %RecordID% ‖ %EventTitle% ‖ %AllFieldInfo% ‖ %EvtxFile%

Timestampでソートする。

%EventTitle%rules/config/channel_eid_info.txtからタイトルを調べる。不明の場合はUnknown

JSON対応は取り敢えずなし。

因みに、rust evtxのフォークを使うevtxgrepというevtx検索ツールがあります。https://github.com/janstarke/evtxgrep  良かったら、ご参考下さい。 この人はrust evtx crateにJSONをパースしなくて良いように(より速く検索できるように直接パースできるように)PRを出していますが、この間マージされませんでした。 https://github.com/omerbenamram/evtx/pull/205 こちらのhayabusa-evtxにこのPRをマージしましたが、速度が約2%落ちたので、現在hayabusa-evtx 0.8.3のまま使っています。 もし、この直接パースがgrep機能で速くなるのであれば、このPRをマージした0.8.4を使いたいと思いますが、この機能を使って、直接パースした方が良さそうなのか、内部で今のJSONパースの方が良いのか、一回調べて頂けますか? https://github.com/Yamato-Security/hayabusa-evtx/releases/tag/v0.8.4 (<= PRがマージされたevtxバージョン) ま、grep機能のために全体が遅くなるのは良くない気がしてきたので、一旦evtxgrepのソースを見て、凄く便利そうな機能であれば、使ったら良いと思いますが、でなければ、今の機能でgrep検索しましょうか?

何か不明点等々ありましたら、お聞き下さい。

YamatoSecurity avatar Jan 11 '23 04:01 YamatoSecurity

サブコマンドの作成部分は @hitenkoku が対応

hitenkoku avatar Jan 12 '23 11:01 hitenkoku

@itiB オプションの例を作ってみました。ご参考に。

hayabusa.exe search -k "192.168.0.1" -d ./dir
hayabusa.exe search -k "192.168.*" -d ./dir
hayabusa.exe search -k "192.168.?.1" -d ./dir
hayabusa.exe search -i -k "aBcDeF.exe" -d ./dir
hayabusa.exe search -R "(192.168\.\d+\.\d+|172.16\.\d+\.\d+)" -d ./dir
hayabusa.exe search -R "C:¥Programfiles¥\.\d+\.\d+¥malicious.exe" -d ./dir
hayabusa.exe search -F "EventID:4625" -d ./dir
hayabusa.exe search -F "User:Taro" -d ./dir
hayabusa.exe search -F "Computer:taro-work" -k "192.168.0.1" -d ./dir
hayabusa.exe search -F "EventID:4624" -i -k "EviL-UseR" -d ./dir
hayabusa.exe search -F "Channel:Security" -R "C:¥Programfiles¥\.\d+\.\d+¥malicious.exe" -d ./dir

ゆくゆくは複数のキーワード(-k)と複数のフィルタ(-F)にも対応したいのですが、取り敢えず、複数のオプション指定なしにしましょうか? -FのフィルタはExact string matchで良いと思います。 ※キーワード検索は?*のワイルドカードに対応したいです。そのため、wildflowerクレートが良さそうです。

YamatoSecurity avatar Jan 21 '23 02:01 YamatoSecurity