hayabusa
hayabusa copied to clipboard
Enhancement: Search keyword feature
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
に変わるイメージ。--rules
はsearch
では使わないので。
しかし、3つの問題が出てくる:
-
同じオプションで意味が変わるので、分かりにくい
-
別のヘルプメニューが必要になってくる:
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
- なので、開発が大変かも?
もし、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つのオプションを追加しておけば、今のやり方でできそうです。
このsearchで得られた結果を画面出力、もしくはファイル出力することになるとかんがえております。 現在出しているカラムとは別にカラムを追加しますか?それともほかのカラムの表示を置き換える形ですか?
- について、一応サブコマンド 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つのオプションを追加しておけば、今のやり方でできそうです。
このsearchで得られた結果を画面出力、もしくはファイル出力することになるとかんがえております。 現在出しているカラムとは別にカラムを追加しますか?それともほかのカラムの表示を置き換える形ですか?
画面出力もファイル保存の両方に対応したいです。
別のカラムを追加する必要はなくて、逆にルールを使わないので、ルールタイトルとルールファイルパスのカラムを消す必要があると思います。全フィールド情報をdetails
カラムに出力したら良いと思います。その他のカラムはいつもで良いと思います。
-Rは1つの正規表現で検索、
-R
は一つまたはファイル指定で複数のregexキーワード検索したいです。
コマンドラインでキーワード指定や-i
オプションを無くしても、なんとかキーワードをファイルに書いて検索できなくはないが、「なんでこんな面倒くさいことをさせるん?」ってブーイングされそうです。。
その辺は次回のミーティングで話し合いましょう。
「ルールタイトルを無くしたい」と書きましたが、やはりイベントのタイトルがあった方が良いので、網羅できないが、statistics_event_info.txt
を参照して、RuleTitleカラムにイベントタイトルを出力した方が良さそうです。
一旦話し合うとのことでしたのでpendingラベルをつけておきました
お待たせしました。 @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対応は取り敢えずしなくて良いと思います。
@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検索しましょうか?
何か不明点等々ありましたら、お聞き下さい。
サブコマンドの作成部分は @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クレートが良さそうです。