yamato-security / hayabusa Goto Github PK
View Code? Open in Web Editor NEWHayabusa (隼) is a sigma-based threat hunting and fast forensics timeline generator for Windows event logs.
License: GNU General Public License v3.0
Hayabusa (隼) is a sigma-based threat hunting and fast forensics timeline generator for Windows event logs.
License: GNU General Public License v3.0
itiBさんの #7 でわかったことだが、
check_command()の中で、呼び出されるcheck_obfu()がバグってる。
何を持って、バグかと言うと、以下のようにdeepbluecliとYea!の出力結果が違う。Possible command のところ。
deepbluecliと同じ出力になるように直します。
DeepBlueCLIの出力結果サンプル
Date : 2017/08/31 4:16:25
Log : Powershell
EventID : 4104
Message : Suspicious Command Line
Results : Long Command Line: greater than 1000 bytes
Possible command obfuscation: only 6% alphanumeric and common symbols
Command : <HOGEHOGE>
Decoded :
YEA出力結果
EventID : 4104
Message : Suspicious Command Line
command : <HOGEHOGE>
result : Long Command Line: greater than 1000bytes
Possible command obfuscation: zeroes and ones (possible numeric or binary encoding)
追加したconfigモジュールのwhitelistを使うように修正した関連のエラー対応
正規表現は処理に時間がかかるので、下記ルールを記述できるようにしたい。
・文字列の完全一致
・文字列の部分一致
正規表現が使えるので既存ルールでも同じことはできるが、正規表現は処理に時間がかかる。完全一致や部分一致ならもっと処理速度を速くできるので、新しくルールを書けるようにしたい。
現状EventDataの中身を検知したい場合でDataの中身を対象としたルールの書き方が存在しない。
具体的には下記のようなケースでDataの中身によって検知したい場合がある
<EventData>
<Data>Available</Data>
<Data>None</Data>
<Data>NewEngineState=Available PreviousEngineState=None SequenceNumber=9 HostName=ConsoleHost HostVersion=2.0 HostId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx EngineVersion=2.0 RunspaceId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx PipelineId= CommandName= CommandType= ScriptName= CommandPath= CommandLine=</Data>
</EventData>
個別のタイムライン機能を実装するための大枠を準備する
例えば、下記のようなEventLogで、param1とparam2の値が一致しているような場合を検知したい。
cobalt strikeの検知でこういうルールが必要になりそう。
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name="Microsoft-Windows-DistributedCOM" Guid="{1B562E86-B7AA-4131-BADC-B6F3A001407E}" EventSourceName="DCOM" />
<EventID Qualifiers="0">10016</EventID>
<Version>0</Version>
<Level>3</Level>
<Task>0</Task>
<Opcode>0</Opcode>
<Keywords>0x8080000000000000</Keywords>
<TimeCreated SystemTime="2021-05-13T10:57:54.3440147Z" />
<EventRecordID>14802</EventRecordID>
<Correlation ActivityID="{63a6236e-b6d4-455b-94f0-03fb1f2e4ff7}" />
<Execution ProcessID="1624" ThreadID="3452" />
<Channel>System</Channel>
<Computer>DESKTOP-ICHIICHI</Computer>
<Security UserID="S-1-5-21-2673273881-979819022-3746999991-1001" />
</System>
- <EventData>
<Data Name="param1">ローカル</Data>
<Data Name="param2">ローカル</Data>
<Data Name="param3">アクティブ化</Data>
<Data Name="param4">{C2F03A33-21F5-47FA-B4BB-156362A2F239}</Data>
<Data Name="param5">{316CDED5-E4AE-4B15-9113-7055D84DCC97}</Data>
<Data Name="param6">DESKTOP-ICHIICH</Data>
<Data Name="param7">takai</Data>
<Data Name="param8">S-1-5-21-2673273881-979819022-3746999991-1001</Data>
<Data Name="param9">LocalHost (LRPC 使用)</Data>
<Data Name="param10">Microsoft.Windows.ShellExperienceHost_10.0.19041.964_neutral_neutral_cw5n1h2txyewy</Data>
<Data Name="param11">S-1-15-2-155514346-2573954481-755741238-1654018636-1233331829-3075935687-2861478708</Data>
</EventData>
</Event>
```
cargo test -- --nocapture
など、test以降の引数がプログラムの引数として渡されてしまって、
テストのオプションを設定することができない(やり方がわからない)
引数を入れてのテストを行うためにこのような動きになることが正常のようで、
どうしたらcargo test自体の引数として受け取れるのか調査が必要。
どのルールに反応したかわかるようにルール名を出力するようにする
エラーメッセージのフォーマットを統一するための構造体作成
RustyBlueと同じ。
DeepBlueCLIのevtxを実行していくとエラー(An error occurred while trying to deserialize evtx stream.)が表示される。
以下、コマンド実行
$ pwd
/Users/kazuminn/DeepBlueCLI/evtx
$ ls | xargs -L 1 ../../YamatoEventAnalyzer/target/debug/yamato_event_analyzer -f
date:"2017-08-30 19:14:24.534748 UTC - 2017-08-30 19:14:24.537128 UTC" record-id: "640738 - 640744"
.
.
.
date:"2017-08-30 19:25:20.783764 UTC - 2017-08-30 19:25:48.631790 UTC" record-id: "714840 - 719151"
date:"2017-08-30 19:25:48.631790 UTC - 2017-08-30 19:25:48.647009 UTC" record-id: "719151 - 719154"
An error occurred while trying to deserialize evtx stream.
total_admin_logons:390
admin_logons:{"SYSTEM": {"S-1-5-18": 358}, "IEUser": {"S-1-5-21-3463664321-2923530833-3546627382-1000": 32}}
multiple_admin_logons:{"SYSTEM": 1, "IEUser": 1}
total_admin_logons:1
admin_logons:{"tbt570": {"S-1-5-21-1552841522-3835366585-4197357653-1004": 1}}
multiple_admin_logons:{}
total_admin_logons:2
admin_logons:{"SYSTEM": {"S-1-5-18": 2}}
multiple_admin_logons:{"SYSTEM": 1}
date:"2013-10-23 16:22:39.973500 UTC - 2013-10-23 16:22:40.004750 UTC" record-id: "113 - 116"
date:"2016-09-19 16:51:15.033474 UTC - 2016-09-19 16:51:15.075732 UTC" record-id: "3992 - 3994"
タイムライン機能の作成でネットワークアクティビティを出力する機能を作成するものとする。
想定としてdetectionとは別にソースを作成することを想定している。
yaml に書かれた level: <hoge>
レベルに応じて出力をする結果を絞る
#43 (comment)
の問題点を修正する
ライブ調査でなるべくメモリを汚さないように(メモリを使わないように)シングルスレッドで一つのイベントログだけに対して攻撃検知を行い、検知した段階で標準出力を行う
タイムライン機能の作成でPowerShellの実行の出力を作成するものとする。
想定としてdetectionとは別にソースを作成することを想定している。
正規表現は処理に時間がかかるので、下記ルールを追加したい。
・文字列の完全一致
・文字列の部分一致
現状、evtxファイルに全てのレコードを読み込んでいるが、
実際に検知対象となるのはルールファイルに記載されているEventIDのレコードのみである。
ルールファイルに記載されているEventIDのレコードのみ読み込むようにすることで、
メモリ使用量が減り、速度も改善されるはず。
タイムライン機能の作成で以下機能を作成するものとする。
想定としてdetectionとは別にソースを作成することを想定している。
出力する内容としては以下の通り。
SIGMAルールのcount処理を作成する
以下のruleがあった際にselectionに合致レコード数を数え上げ、条件式に当てはまるかの真偽値を返す処理
...
detection:
selection:
EventID: XXXX
condition: selection | count() > 2000
...
タイムライン機能の作成でサービスの出力機能を作成するものとする。
想定としてdetectionとは別にソースを作成することを想定している。
現在検知できたときに、どのルールなのかわからないのでパスを出したい。
タイムライン機能作成でログオンイベントの出力をするものとする
想定としてdetectionとは別にソースを作成することを想定している。
参考: Chrono FixedOffset
https://docs.rs/chrono/0.4.0/chrono/offset/struct.FixedOffset.html
evtxのディレクトリ指定の際の結果とディレクトリ内の各ファイルのevtxファイルを指定した結果が一致しない。
ディレクトリ指定時には以下の検知ログが出てくる
2021-04-29T16:56:22.887415+09:00,PowerShell Execution Pipeline,command=
2021-04-29T18:23:58.691090+09:00,Check for unsigned EXEs/DLLs,Message: Unsigned Image(DLL)¥n Result : Loaded by: %event_data.Image%¥nCommand : %event_data.ImageLoaded%
ディレクトリ内にあるevtxファイルを指定した場合は以下のログのみ出てくる。
2021-04-29T16:56:22.887415+09:00,PowerShell Execution Pipeline,command=
2021-04-29T18:23:58.691090+09:00,PowerShell Execution Pipeline,command=
PS \YamatoEventAnalyzer> ls .\kerberoast_evtx\
directory: <folder>\YamatoEventAnalyzer\kerberoast_evtx
Mode LastWriteTime Length Name
-a---- 2021/04/30 23:09 69632 asreproasting.evtx
-a---- 2021/04/30 23:10 69632 kerberoasting.evtx
PS \YamatoEventAnalyzer> .\yamato_event_analyzer.exe -d .\kerberoast_evtx
Time,Title,Message
2021-04-29T16:56:22.887415+09:00,PowerShell Execution Pipeline,command=
2021-04-29T18:23:58.691090+09:00,Check for unsigned EXEs/DLLs,Message: Unsigned Image(DLL)¥n Result : Loaded by: %event_data.Image%¥nCommand : %event_data.ImageLoaded%
PS \YamatoEventAnalyzer> .\yamato_event_analyzer.exe -f .\kerberoast_evtx\asreproasting.evtx
Time,Title,Message
2021-04-29T16:56:22.887415+09:00,PowerShell Execution Pipeline,command=
PS \YamatoEventAnalyzer> .\yamato_event_analyzer.exe -f .\kerberoast_evtx\kerberoasting.evtx
Time,Title,Message
2021-04-29T18:23:58.691090+09:00,PowerShell Execution Pipeline,command=
SILGMAルールの対応
複数のイベントファイルを指定した場合に、
どのイベントファイルが検知したのか現状では分かりにくい。
ログ出力されるCSVのカラムにイベントファイルのパスを追加したい。
背景はこのあたり
XMLにはタグの中に属性が書ける(上記Slackの例でいうと、Qualifiers=“0”というのが属性)。EvtxParserはXML形式のイベントログをJSONに変換しているのだが、そのXMLのタグに属性がある場合とない場合とで、EvtxParserが出力するJSONの構造が変わってしまうらしい。
XMLタグに属性がない場合
{
“EventID”: 400
}
XMLタグに属性がある場合
{ “EventID”:
{“#attributes”:
{“Qualifiers”: 0}
}
, “#text”: 400
}
alwarys passed test case in test_error_message function
エラーメッセージのフォーマット部分がstdoutを指定しているとexpectでどのような文字列を比較しても成功していると判断されてしまっていることを確認したため修正
expected error test case
fn test_error_message() {
let input = "TEST!";
let stdout = std::io::stdout();
let mut stdout = stdout.lock();
AlertMessage::alert(&mut stdout, input.to_string()).expect("[ERROR] error!");
}
result
cargo test test_error_message
warning: unused manifest key: target.i686-pc-windows-gnu.linker
warning: unused manifest key: target.x86_64-pc-windows-gnu.linker
Compiling yamato_event_analyzer v0.1.0 (D:\gitprojects\YamatoEventAnalyzer)
Finished test [unoptimized + debuginfo] target(s) in 2.77s
Running target\debug\deps\yamato_event_analyzer-5839d1cdde102c18.exerunning 1 test
[ERROR] TEST!
test detections::print::tests::test_error_message ... oktest result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 9 filtered out; finished in 0.00s
Running target\debug\deps\yamato_event_analyzer-f275bacecc3704d0.exe
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s
yaml に書かれた level: <hoge>
レベルに応じて出力をする結果を絞る
println!("[ERROR] ...");
上の形のようにエラー出力をprintlnで実施している個所をAlertMessage構造体から呼び出す形に変更する
%タグがそのまま出力されているケースがあるので対応を行う。
タイムライン機能の作成で以下機能を作成するものとする。
想定としてdetectionとは別にソースを作成することを想定している。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.