Giter Site home page Giter Site logo

yamato-security / hayabusa Goto Github PK

View Code? Open in Web Editor NEW
1.9K 42.0 167.0 144.82 MB

Hayabusa (隼) is a sigma-based threat hunting and fast forensics timeline generator for Windows event logs.

License: GNU General Public License v3.0

Rust 100.00%
dfir threat hunting windows event logs rust sigma detection attack

hayabusa's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hayabusa's Issues

check_obfu()のバグ

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)

[SIGMAルール] contains,startsWith,endsWith対応

正規表現は処理に時間がかかるので、下記ルールを記述できるようにしたい。
・文字列の完全一致
・文字列の部分一致

正規表現が使えるので既存ルールでも同じことはできるが、正規表現は処理に時間がかかる。完全一致や部分一致ならもっと処理速度を速くできるので、新しくルールを書けるようにしたい。

EventDataの中のDataの配列対応

現状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>

特定の2つのフィールドの値が一致していることを検知するルールを書きたい。

例えば、下記のような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>
```

clap使ってcargo testをすると引数がプログラムに渡されてしまう

cargo test -- --nocapture

など、test以降の引数がプログラムの引数として渡されてしまって、
テストのオプションを設定することができない(やり方がわからない)

引数を入れてのテストを行うためにこのような動きになることが正常のようで、
どうしたらcargo test自体の引数として受け取れるのか調査が必要。

Error : An error occurred while trying to deserialize evtx stream.

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"

--low-memoryモードの実装

ライブ調査でなるべくメモリを汚さないように(メモリを使わないように)シングルスレッドで一つのイベントログだけに対して攻撃検知を行い、検知した段階で標準出力を行う

ルールを足したい

正規表現は処理に時間がかかるので、下記ルールを追加したい。
・文字列の完全一致
・文字列の部分一致

[SIGMAルール]count処理対応

SIGMAルールのcount処理を作成する


以下のruleがあった際にselectionに合致レコード数を数え上げ、条件式に当てはまるかの真偽値を返す処理

...
detection:
selection:
EventID: XXXX
condition: selection | count() > 2000
...

タイムライン機能(サービス)の出力

タイムライン機能の作成でサービスの出力機能を作成するものとする。
想定としてdetectionとは別にソースを作成することを想定している。

yamlのパス出力

現在検知できたときに、どのルールなのかわからないのでパスを出したい。

ディレクトリ指定した場合とファイル指定した場合で検出結果項目が異なる

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=


Log

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=

ルールファイルでEventIdが検知できない

  • 背景はこのあたり

  • XMLにはタグの中に属性が書ける(上記Slackの例でいうと、Qualifiers=“0”というのが属性)。EvtxParserはXML形式のイベントログをJSONに変換しているのだが、そのXMLのタグに属性がある場合とない場合とで、EvtxParserが出力するJSONの構造が変わってしまうらしい。

XMLタグに属性がない場合
{ 
 “EventID”: 400
}
XMLタグに属性がある場合
{ “EventID”: 
 {“#attributes”: 
  {“Qualifiers”: 0}
 }
  , “#text”: 400
}
  • 今まではXMLのタグに属性がない場合しか想定していないコードになっており、XMLのタグに属性があるケースを想定していなかったため、バグが発生した。

エラーメッセージフォーマットのテスト部分が常に通ってしまっている

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.exe

running 1 test
[ERROR] TEST!
test detections::print::tests::test_error_message ... ok

test 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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.