{"id":28427260,"url":"https://github.com/yamato-security/hayabusa-rules","last_synced_at":"2025-07-06T02:36:44.028Z","repository":{"id":37005532,"uuid":"436824802","full_name":"Yamato-Security/hayabusa-rules","owner":"Yamato-Security","description":"Curated Windows event log Sigma rules used in Hayabusa and Velociraptor.","archived":false,"fork":false,"pushed_at":"2025-06-11T21:17:38.000Z","size":24484,"stargazers_count":182,"open_issues_count":4,"forks_count":25,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-06-11T21:47:25.600Z","etag":null,"topics":["analysis","attack","dfir","event","hayabusa","log","mitre","sigma","windows"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Yamato-Security.png","metadata":{"files":{"readme":"README-Japanese.md","changelog":"CHANGELOG-Japanese.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-12-10T02:25:15.000Z","updated_at":"2025-06-11T21:17:42.000Z","dependencies_parsed_at":"2023-09-28T22:10:07.620Z","dependency_job_id":"b08ef1e9-b9b5-45c7-8912-b706679d0d77","html_url":"https://github.com/Yamato-Security/hayabusa-rules","commit_stats":null,"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/Yamato-Security/hayabusa-rules","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yamato-Security%2Fhayabusa-rules","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yamato-Security%2Fhayabusa-rules/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yamato-Security%2Fhayabusa-rules/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yamato-Security%2Fhayabusa-rules/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Yamato-Security","download_url":"https://codeload.github.com/Yamato-Security/hayabusa-rules/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Yamato-Security%2Fhayabusa-rules/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261212483,"owners_count":23125583,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analysis","attack","dfir","event","hayabusa","log","mitre","sigma","windows"],"created_at":"2025-06-05T12:10:06.708Z","updated_at":"2025-07-06T02:36:44.021Z","avatar_url":"https://github.com/Yamato-Security.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\r\n \u003cp\u003e\r\n    \u003cimg alt=\"Hayabusa Logo\" src=\"https://github.com/Yamato-Security/hayabusa/blob/main/logo.png\" width=\"60%\"\u003e\r\n \u003c/p\u003e\r\n  [\u003ca href=\"README.md\"\u003eEnglish\u003c/a\u003e] | [\u003cb\u003e日本語\u003c/b\u003e]\r\n\u003c/div\u003e\r\n\r\n# Hayabusa-Rulesについて\r\n\r\nWindowsのイベントログから攻撃を検出するキュレーションされたSigmaルールをまとめているリポジトリです。\r\n主に[Hayabusa](https://github.com/Yamato-Security/hayabusa)の検知ルールや設定ファイル、[Velociraptor](https://github.com/Velocidex/velociraptor)内蔵のSigma検知などに使用されています。\r\n[上流のSigmaリポジトリ](https://github.com/SigmaHQ/sigma)よりもこのリポジトリを使う利点は、ほとんどのSigmaネイティブツールがパースできるはずのルールだけを含んでいることです。\r\nまた、必要な`Channel`、`EventID`等々のフィールドをルールに追加することで、`logsource`フィールドの抽象化を解除し、ルールが何をフィルタリングしているのかを理解しやすくし、さらに重要なこととして、過検出を減らすようにしています。\r\nまた、`process_creation`ルールと`registry`ベースのルールのフィールド名と値を変換した新しいルールを作成し、SigmaルールがSysmonのログを検知するだけでなく、組み込みのWindowsログも検知できるようにしています。\r\n\r\n# 関連プロジェクト\r\n\r\n* [EnableWindowsLogSettings](https://github.com/Yamato-Security/EnableWindowsLogSettings) - Windowsイベントログを正しく設定するためのドキュメンテーションとスクリプト。\r\n* [Hayabusa](https://github.com/Yamato-Security/hayabusa/blob/main/README-Japanese.md) - Sigmaベースの脅威ハンティングと、Windowsイベントログのファストフォレンジックタイムライン生成ツール。\r\n* [Hayabusa Encoded Rules](https://github.com/Yamato-Security/hayabusa-encoded-rules) - このリポジトリと同じルールですが、ルールと設定ファイルは1つのファイルに保存され、アンチウイルスによる誤検知を防ぐためにXORされる。\r\n* [Hayabusa EVTX](https://github.com/Yamato-Security/hayabusa-evtx) - `evtx`クレートのよりメンテナンスされたフォーク。\r\n* [Hayabusa Sample EVTXs](https://github.com/Yamato-Security/hayabusa-sample-evtx) - Hayabusa/Sigma検出ルールをテストするためのサンプルevtxファイル。\r\n* [Presentations](https://github.com/Yamato-Security/Presentations) - ツールやリソースについて行った講演のプレゼンテーション。\r\n* [Sigma to Hayabusa Converter](https://github.com/Yamato-Security/sigma-to-hayabusa-converter) - 上流のWindowsイベントログベースのSigmaルールを使いやすい形式にキュレーションする。\r\n* [Takajo](https://github.com/Yamato-Security/takajo/blob/main/README-Japanese.md) - Hayabusa結果の解析ツール。\r\n* [WELA (Windows Event Log Analyzer)](https://github.com/Yamato-Security/WELA/blob/main/README-Japanese.md) - PowerShellで書かれたWindowsイベントログの解析ツール。(非推奨となり、Takajoに置き換えられた)\r\n\r\n# 目次\r\n\r\n- [Hayabusa-Rulesについて](#hayabusa-rulesについて)\r\n- [関連プロジェクト](#関連プロジェクト)\r\n- [目次](#目次)\r\n- [ルールファイル作成について](#ルールファイル作成について)\r\n  - [ルールファイル形式](#ルールファイル形式)\r\n- [Details出力の省略](#details出力の省略)\r\n- [detectionフィールド](#detectionフィールド)\r\n  - [selectionの基礎知識](#selectionの基礎知識)\r\n    - [論理積(AND)と論理和(OR)の書き方](#論理積andと論理和orの書き方)\r\n    - [イベントキー](#イベントキー)\r\n      - [イベントキーエイリアス](#イベントキーエイリアス)\r\n      - [注意: 未定義のイベントキーエイリアスについて](#注意-未定義のイベントキーエイリアスについて)\r\n    - [XML属性を条件に使用する方法](#xml属性を条件に使用する方法)\r\n    - [grep検索](#grep検索)\r\n    - [EventData](#eventdata)\r\n    - [EventDataの例外的なパターン](#eventdataの例外的なパターン)\r\n      - [同じ名前の複数のフィールド名からフィールドデータを出力する](#同じ名前の複数のフィールド名からフィールドデータを出力する)\r\n  - [フィールド修飾子 (Field Modifiers)](#フィールド修飾子-field-modifiers)\r\n    - [対応しているSigmaのフィールド修飾子](#対応しているsigmaのフィールド修飾子)\r\n    - [非推奨のフィールド修飾子](#非推奨のフィールド修飾子)\r\n    - [Expandフィールド修飾子](#expandフィールド修飾子)\r\n  - [ワイルドカード](#ワイルドカード)\r\n  - [null keyword](#null-keyword)\r\n  - [condition (条件)](#condition-条件)\r\n  - [notロジック](#notロジック)\r\n- [Sigma相関ルール](#sigma相関ルール)\r\n  - [イベントカウントルール](#イベントカウントルール)\r\n    - [イベントカウントルールの例:](#イベントカウントルールの例)\r\n    - [イベントカウント相関ルール:](#イベントカウント相関ルール)\r\n    - [ログオン失敗 - 誤ったパスワード ルール:](#ログオン失敗---誤ったパスワード-ルール)\r\n    - [非推奨の`count`ルールの例:](#非推奨のcountルールの例)\r\n    - [イベントカウントルールの出力:](#イベントカウントルールの出力)\r\n  - [値カウントルール](#値カウントルール)\r\n    - [値カウントルールの例:](#値カウントルールの例)\r\n    - [値カウント相関ルール:](#値カウント相関ルール)\r\n    - [値カウント ログオン失敗 (存在しないユーザー) ルール:](#値カウント-ログオン失敗-存在しないユーザー-ルール)\r\n    - [非推奨の`count`ルール:](#非推奨のcountルール)\r\n    - [値カウントルールの出力:](#値カウントルールの出力)\r\n  - [Temporal Proximityルール](#temporal-proximityルール)\r\n    - [Temporal Proximityルールの例:](#temporal-proximityルールの例)\r\n    - [Temporal Proximity相関ルール:](#temporal-proximity相関ルール)\r\n  - [Ordered Temporal Proximityルール](#ordered-temporal-proximityルール)\r\n    - [Ordered Temporal Proximityルールの例:](#ordered-temporal-proximityルールの例)\r\n    - [Ordered Temporal Proximity相関ルール:](#ordered-temporal-proximity相関ルール)\r\n  - [相関ルールの注意点](#相関ルールの注意点)\r\n- [非推奨機能](#非推奨機能)\r\n  - [イベントキー内のキーワードのネスト](#イベントキー内のキーワードのネスト)\r\n  - [非推奨の特殊キーワード](#非推奨の特殊キーワード)\r\n    - [regexesとallowlistキーワード](#regexesとallowlistキーワード)\r\n  - [非推奨の集計条件（'count'ルール）](#非推奨の集計条件countルール)\r\n    - [基本事項](#基本事項)\r\n    - [countの4パターン](#countの4パターン)\r\n    - [パターン1の例](#パターン1の例)\r\n    - [パターン2の例](#パターン2の例)\r\n    - [パターン3の例](#パターン3の例)\r\n    - [パターン4の例](#パターン4の例)\r\n    - [Countルールの出力](#countルールの出力)\r\n- [ルール作成のアドバイス](#ルール作成のアドバイス)\r\n    - [悪い例](#悪い例)\r\n    - [良い例](#良い例)\r\n    - [悪い例](#悪い例-1)\r\n    - [良い例](#良い例-1)\r\n- [SigmaルールからHayabusaルール形式への自動変換](#sigmaルールからhayabusaルール形式への自動変換)\r\n- [Twitter](#twitter)\r\n\r\n# ルールファイル作成について\r\n\r\nHayabusaの検知ルールは[YAML](https://en.wikipedia.org/wiki/YAML)形式で記述され、ファイル拡張子は必ず`.yml`にしてください。(`.yaml`ファイルは無視されます。)\r\nSigmaルールのサブセットでありながら、いくつかの付加的な機能を含んでいます。\r\nHayabusaのルールをSigmaに修正し、コミュニティに還元しやすいように、できるだけSigmaルールに近いものを作ろうとしています。\r\n単純な文字列のマッチングだけでなく、正規表現や`AND`、`OR`などの条件を組み合わせて複雑な検知ルールを表現することができます。\r\n本節ではHayabusaの検知ルールの書き方について説明します。\r\n\r\n## ルールファイル形式\r\n\r\n記述例:\r\n\r\n```yaml\r\n#作者セクション\r\nauthor: Zach Mathis\r\ndate: 2022-03-22\r\nmodified: 2022-04-17\r\n\r\n#アラートセクション\r\ntitle: Possible Timestomping\r\ndetails: 'Path: %TargetFilename% ¦ Process: %Image% ¦ CreationTime: %CreationUtcTime% ¦ PreviousTime: %PreviousCreationUtcTime% ¦ PID: %PID% ¦ PGUID: %ProcessGuid%'\r\ndescription: |\r\n    The Change File Creation Time Event is registered when a file creation time is explicitly modified by a process.\r\n    This event helps tracking the real creation time of a file.\r\n    Attackers may change the file creation time of a backdoor to make it look like it was installed with the operating system.\r\n    Note that many processes legitimately change the creation time of a file; it does not necessarily indicate malicious activity.\r\n\r\n#ルールセクション\r\nid: f03e34c4-6432-4a30-9ae2-76ae6329399a\r\nlevel: low\r\nstatus: stable\r\nlogsource:\r\n    product: windows\r\n    service: sysmon\r\n    definition: Sysmon needs to be installed and configured.\r\ndetection:\r\n    selection_basic:\r\n        Channel: Microsoft-Windows-Sysmon/Operational\r\n        EventID: 2\r\n    condition: selection_basic\r\nfalsepositives:\r\n    - unknown\r\ntags:\r\n    - t1070.006\r\n    - attack.defense-evasion\r\nreferences:\r\n    - https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon\r\n    - https://attack.mitre.org/techniques/T1070/006/\r\nruletype: Hayabusa\r\n\r\n#XMLイベントのサンプル\r\nsample-message: |\r\n    File creation time changed:\r\n    RuleName: technique_id=T1099,technique_name=Timestomp\r\n    UtcTime: 2022-04-12 22:52:00.688\r\n    ProcessGuid: {43199d79-0290-6256-3704-000000001400}\r\n    ProcessId: 9752\r\n    Image: C:\\TMP\\mim.exe\r\n    TargetFilename: C:\\Users\\IEUser\\AppData\\Local\\Temp\\Quest Software\\PowerGUI\\51f5c69c-5d16-47e1-9864-038c8510d919\\mk.ps1\r\n    CreationUtcTime: 2016-05-16 09:13:50.950\r\n    PreviousCreationUtcTime: 2022-04-12 22:52:00.563\r\n    User: ZACH-LOG-TEST\\IEUser\r\nsample-evtx: |\r\n    \u003cEvent xmlns=\"http://schemas.microsoft.com/win/2004/08/events/event\"\u003e\r\n        \u003cSystem\u003e\r\n            \u003cProvider Name=\"Microsoft-Windows-Sysmon\" Guid=\"{5770385f-c22a-43e0-bf4c-06f5698ffbd9}\" /\u003e\r\n            \u003cEventID\u003e2\u003c/EventID\u003e\r\n            \u003cVersion\u003e5\u003c/Version\u003e\r\n            \u003cLevel\u003e4\u003c/Level\u003e\r\n            \u003cTask\u003e2\u003c/Task\u003e\r\n            \u003cOpcode\u003e0\u003c/Opcode\u003e\r\n            \u003cKeywords\u003e0x8000000000000000\u003c/Keywords\u003e\r\n            \u003cTimeCreated SystemTime=\"2022-04-12T22:52:00.689654600Z\" /\u003e\r\n            \u003cEventRecordID\u003e8946\u003c/EventRecordID\u003e\r\n            \u003cCorrelation /\u003e\r\n            \u003cExecution ProcessID=\"3408\" ThreadID=\"4276\" /\u003e\r\n            \u003cChannel\u003eMicrosoft-Windows-Sysmon/Operational\u003c/Channel\u003e\r\n            \u003cComputer\u003eZach-log-test\u003c/Computer\u003e\r\n            \u003cSecurity UserID=\"S-1-5-18\" /\u003e\r\n        \u003c/System\u003e\r\n        \u003cEventData\u003e\r\n            \u003cData Name=\"RuleName\"\u003etechnique_id=T1099,technique_name=Timestomp\u003c/Data\u003e\r\n            \u003cData Name=\"UtcTime\"\u003e2022-04-12 22:52:00.688\u003c/Data\u003e\r\n            \u003cData Name=\"ProcessGuid\"\u003e{43199d79-0290-6256-3704-000000001400}\u003c/Data\u003e\r\n            \u003cData Name=\"ProcessId\"\u003e9752\u003c/Data\u003e\r\n            \u003cData Name=\"Image\"\u003eC:\\TMP\\mim.exe\u003c/Data\u003e\r\n            \u003cData Name=\"TargetFilename\"\u003eC:\\Users\\IEUser\\AppData\\Local\\Temp\\Quest Software\\PowerGUI\\51f5c69c-5d16-47e1-9864-038c8510d919\\mk.ps1\u003c/Data\u003e\r\n            \u003cData Name=\"CreationUtcTime\"\u003e2016-05-16 09:13:50.950\u003c/Data\u003e\r\n            \u003cData Name=\"PreviousCreationUtcTime\"\u003e2022-04-12 22:52:00.563\u003c/Data\u003e\r\n            \u003cData Name=\"User\"\u003eZACH-LOG-TEST\\IEUser\u003c/Data\u003e\r\n        \u003c/EventData\u003e\r\n    \u003c/Event\u003e\r\n```\r\n\r\n\u003e ## 作者セクション\r\n\r\n- **author [必須]**: 著者名（複数可）。\r\n- **date [必須]**: ルールが作成された日付。\r\n- **modified** [オプション]: ルールが更新された日付。\r\n\r\n\u003e ## アラートセクション\r\n\r\n- **title [必須]**: ルールファイルのタイトル。これは表示されるアラートの名前にもなるので、簡潔であるほどよいです。(85文字以下でなければなりません。)\r\n- **details** [オプション]: 表示されるアラートの詳細です。Windowsイベントログの中で解析に有効なフィールドがあれば出力してください。フィールドは `\" ¦ \"` で区切られます。フィールドのプレースホルダは `%` で囲まれ (例: `%MemberName%`) 、`rules/config_eventkey_alias.txt` で定義する必要があります。(以下で説明します)\r\n- **description** [オプション]: ルールの説明。これは表示されないので、長く詳細に記述することができます。\r\n\r\n\u003e ## ルールセクション\r\n\r\n- **id [必須]**: ルールを一意に識別するために使用される、ランダムに生成されたバージョン4のUUIDです。 [ここ](https://www.uuidgenerator.net/version4) で生成することができます。\r\n\r\n- **level [必須]**: [sigmaルールの定義](https://github.com/SigmaHQ/sigma/wiki/Specification)に基づく重要度レベル。いずれかを記述してください: `informational`,`low`,`medium`,`high`,`critical`\r\n- **status[必須]**: [sigmaルールの定義](https://github.com/SigmaHQ/sigma/wiki/Specification)に基づくステータス。いずれかを記述してください: `deprecated`, `experimental`, `test`, `stable`\r\n- **logsource [required]**: Sigmaルールと互換性があるようにSigmaのlogsource定義と同様。\r\n- **detection  [必須]**: 検知ロジックはここに入ります。(以下で説明します。)\r\n- **falsepositives [必須]**: 誤検知の可能性について記載を行います。例: `system administrator`, `normal user usage`, `normal system usage`, `legacy application`, `security team`, `none`。 不明な場合は `unknown` と記述してください。\r\n- **tags** [オプション]: [LOLBINS/LOLBAS](https://lolbas-project.github.io/)という手法を利用している場合、`lolbas` タグを追加してください。アラートを[MITRE ATT\u0026CK](https://attack.mitre.org/) フレームワークにマッピングできる場合は、以下のリストから該当するものを追加してください。戦術ID（例：`attack.t1098`）を指定することも可能です。\r\n  - `attack.reconnaissance` -\u003e Reconnaissance (Recon)\r\n  - `attack.resource-development` -\u003e Resource Development  (ResDev)\r\n  - `attack.initial-access` -\u003e Initial Access (InitAccess)\r\n  - `attack.execution` -\u003e Execution (Exec)\r\n  - `attack.persistence` -\u003e Persistence (Persis)\r\n  - `attack.privilege-escalation` -\u003e Privilege Escalation (PrivEsc)\r\n  - `attack.defense-evasion` -\u003e Defense Evasion (Evas)\r\n  - `attack.credential-access` -\u003e Credential Access (CredAccess)\r\n  - `attack.discovery` -\u003e Discovery (Disc)\r\n  - `attack.lateral-movement` -\u003e Lateral Movement (LatMov)\r\n  - `attack.collection` -\u003e Collection (Collect)\r\n  - `attack.command-and-control` -\u003e Command and Control (C2)\r\n  - `attack.exfiltration` -\u003e Exfiltration (Exfil)\r\n  - `attack.impact` -\u003e Impact (Impact)\r\n- **references** [オプション]: 参考文献への任意のリンク。\r\n- **ruletype [必須]**: Hayabusaルールには `Hayabusa` を指定します。SigmaのWindowsルールから自動変換されたルールは `Sigma` になります。\r\n\r\n\u003e ## Sample XML Event\r\n\r\n- **sample-evtx [required]**: Starting forward, we ask rule authors to include sample XML events for their rules.\r\n\r\n# Details出力の省略\r\n\r\nできるだけ簡潔にするために、以下の略語を使用しています:\r\n\r\n- `Acct` -\u003e Account\r\n- `Addr` -\u003e Address\r\n- `Auth` -\u003e Authentication\r\n- `Cli` -\u003e Client\r\n- `Chan` -\u003e Channel\r\n- `Cmd` -\u003e Command\r\n- `Cnt` -\u003e Count\r\n- `Comp` -\u003e Computer\r\n- `Conn` -\u003e Connection/Connected\r\n- `Creds` -\u003e Credentials\r\n- `Crit` -\u003e Critical\r\n- `Disconn` -\u003e Disconnection/Disconnected\r\n- `Dir` -\u003e Directory\r\n- `Drv` -\u003e Driver\r\n- `Dst` -\u003e Destination\r\n- `EID` -\u003e Event ID\r\n- `Err` -\u003e Error\r\n- `Exec` -\u003e Execution\r\n- `FP` -\u003e False Positive\r\n- `FW` -\u003e Firewall\r\n- `GTW` -\u003e Gateway\r\n- `Grp` -\u003e Group\r\n- `Img` -\u003e Image\r\n- `Inj` -\u003e Injection\r\n- `Krb` -\u003e Kerberos\r\n- `LID` -\u003e Logon ID\r\n- `Med` -\u003e Medium\r\n- `Net` -\u003e Network\r\n- `Obj` -\u003e Object\r\n- `Op` -\u003e Operational/Operation\r\n- `Proto` -\u003e Protocol\r\n- `PW` -\u003e Password\r\n- `Reconn` -\u003e Reconnection\r\n- `Req` -\u003e Request\r\n- `Rsp` -\u003e Response\r\n- `Sess` -\u003e Session\r\n- `Sig` -\u003e Signature\r\n- `Susp` -\u003e Suspicious\r\n- `Src` -\u003e Source\r\n- `Svc` -\u003e Service\r\n- `Svr` -\u003e Server\r\n- `Temp` -\u003e Temporary\r\n- `Term` -\u003e Termination/Terminated\r\n- `Tkt` -\u003e Ticket\r\n- `Tgt` -\u003e Target\r\n- `Unkwn` -\u003e Unknown\r\n- `Usr` -\u003e User\r\n- `Perm` -\u003e Permament\r\n- `Pkg` -\u003e Package\r\n- `Priv` -\u003e Privilege\r\n- `Proc` -\u003e Process\r\n- `PID` -\u003e Process ID\r\n- `PGUID` -\u003e Process GUID (Global Unique ID)\r\n- `Ver` -\u003e Version\r\n\r\n# detectionフィールド\r\n\r\n## selectionの基礎知識\r\n\r\nまず、selectionの作り方の基本を説明します。\r\n\r\n### 論理積(AND)と論理和(OR)の書き方\r\n\r\nANDを表現するには辞書（YAMLでは辞書を`:`で表します）を使用します。\r\nこのルールでログが検知されるには、**両方の条件**が真である必要があります。\r\n\r\n- イベントIDが `7040` であること。\r\n- チャンネルが `System` であること。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        Event.System.EventID: 7040\r\n        Event.System.Channel: System\r\n    condition: selection\r\n```\r\n\r\nORを表現するには、配列（YAMLでは配列を`-`で表します）を使用します。\r\nこのルールでログが検知されるには、**片方の条件**が真である必要があります。\r\n\r\n- イベントIDが `7040` であること。\r\n- チャンネルが `System` であること。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        - Event.System.EventID: 7040\r\n        - Event.System.Channel: System\r\n    condition: selection\r\n```\r\n\r\nまた、以下のように「AND」と「OR」を組み合わせることも可能です。\r\nこの場合、以下の2つの条件が両方成立したときに、このルールでログが検知されます。\r\n\r\n- イベントIDが `7040` **または** `7041` のどちらかであること。\r\n- チャンネルが `System` であること。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        Event.System.EventID:\r\n          - 7040\r\n          - 7041\r\n        Event.System.Channel: System\r\n    condition: selection\r\n```\r\n\r\n### イベントキー\r\n\r\nWindowsイベントログをXML形式で出力すると下記のようになります。\r\n上記のルールファイルの例にある`Event.System.Channel`フィールドは、元々のXMLタグを参照しています： `\u003cEvent\u003e\u003cSystem\u003e\u003cChannel\u003eSystem\u003cChannel\u003e\u003cSystem\u003e\u003c/Event\u003e`\r\nネストされたXMLタグはドット(`.`)で区切られたタグ名で置き換えられます。\r\nHayabusaのルールでは、このドットでつながれた文字列のことをイベントキーと呼んでいます。\r\n\r\n```xml\r\n\u003cEvent xmlns='http://schemas.microsoft.com/win/2004/08/events/event'\u003e\r\n    \u003cSystem\u003e\r\n        \u003cEventID\u003e7040\u003c/EventID\u003e\r\n        \u003cChannel\u003eSystem\u003c/Channel\u003e\r\n    \u003c/System\u003e\r\n    \u003cEventData\u003e\r\n        \u003cData Name='param1'\u003eBackground Intelligent Transfer Service\u003c/Data\u003e\r\n        \u003cData Name='param2'\u003eauto start\u003c/Data\u003e\r\n    \u003c/EventData\u003e\r\n\u003c/Event\u003e\r\n```\r\n\r\n#### イベントキーエイリアス\r\n\r\n`.`の区切りが多くて長いイベントキーが一般的であるため、Hayabusaはエイリアスを使って簡単に扱えるようにします。エイリアスは `rules/config/eventkey_alias.txt`ファイルで定義されています。このファイルは `alias` と `event_key` のマッピングで構成されるCSVファイルです。以下に示すように、エイリアスを使用して上記のルールを書き直し、ルールを読みやすくすることができます。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        Channel: System\r\n        EventID: 7040\r\n    condition: selection\r\n```\r\n\r\n#### 注意: 未定義のイベントキーエイリアスについて\r\n\r\nすべてのイベントキーエイリアスが `rules/config/eventkey_alias.txt`に定義されているわけではありません。検知するはずのルールが検知しない場合や、`details`（アラートの詳細）メッセージに`n/a` (not available)が表示されている場合、`rules/config/eventkey_alias.txt`の設定を確認してください。\r\n\r\n### XML属性を条件に使用する方法\r\n\r\nXMLのタグにはタグ名とは別に属性を設定できます。例えば、以下の `Provider Name` の `Name` は `Provider` タグの属性です。\r\n\r\n```xml\r\n\u003cEvent xmlns='http://schemas.microsoft.com/win/2004/08/events/event'\u003e\r\n    \u003cSystem\u003e\r\n        \u003cProvider Name='Microsoft-Windows-Security-Auditing' Guid='{54849625-5478-4994-a5ba-3e3b0328c30d}'/\u003e\r\n        \u003cEventID\u003e4672\u003c/EventID\u003e\r\n        \u003cEventRecordID\u003e607469\u003c/EventRecordID\u003e\r\n        \u003cChannel\u003eSecurity\u003c/Channel\u003e\r\n        \u003cSecurity /\u003e\r\n    \u003c/System\u003e\r\n\u003c/Event\u003e\r\n```\r\n\r\nイベントキーでXMLの属性を指定するには、`{eventkey}_attributes.{attribute_name}`という形式で記述します。例えば、ルールファイルの `Provider` 要素の `Name` 属性を指定する場合は、以下のようになります。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        Channel: Security\r\n        EventID: 4672\r\n        Event.System.Provider_attributes.Name: 'Microsoft-Windows-Security-Auditing'\r\n    condition: selection\r\n```\r\n\r\n### grep検索\r\n\r\nHayabusaではeventkeyを指定せず、WindowsEventログに含まれる文字列にマッチするかどうかを判定する機能も用意されています。この機能をHayabusaではgrep検索と呼んでいます。\r\n\r\ngrep検索をするには下記のようにdetectionを指定します。この場合、`mimikatz`または`metasploit`という文字列がWindowsEventログに含まれる場合に、ルールが検知されます。また、grep検索にはワイルドカードを指定することも可能です。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        - `mimikatz`\r\n        - `metasploit`\r\n```\r\n\r\n\u003e ※ Hayabusaでは内部的にWindowsEventログをJSON形式に変換しています。そのため、grep検索ではXMLのタグをマッチさせることはできません。\r\n\r\n### EventData\r\n\r\nWindowsのイベントログは、基本データ（イベントID、タイムスタンプ、レコードID、ログ名（チャンネル））が書き込まれる`System`タグと、イベントIDに応じて任意のデータが書き込まれる`EventData`もしくは`UserData`タグの2つに分けられます。\r\nその内、`EventData`もしくは`UserData`タグはネストされたタグの名前がすべて`Data`であり、これまで説明したイベントキーでは`SubjectUserSid`と`SubjectUserName`を区別できません。\r\n\r\n```xml\r\n\u003cEvent xmlns='http://schemas.microsoft.com/win/2004/08/events/event'\u003e\r\n    \u003cSystem\u003e\r\n        \u003cEventID\u003e5379\u003c/EventID\u003e\r\n        \u003cTimeCreated SystemTime='2021-10-20T10:16:18.7782563Z' /\u003e\r\n        \u003cEventRecordID\u003e607469\u003c/EventRecordID\u003e\r\n        \u003cChannel\u003eSecurity\u003c/Channel\u003e\r\n        \u003cSecurity /\u003e\r\n    \u003c/System\u003e\r\n    \u003cEventData\u003e\r\n        \u003cData Name='SubjectUserSid'\u003eS-1-1-11-1111111111-111111111-1111111111-1111\u003c/Data\u003e\r\n        \u003cData Name='SubjectUserName'\u003eHayabusa\u003c/Data\u003e\r\n        \u003cData Name='SubjectDomainName'\u003eDESKTOP-Hayabusa\u003c/Data\u003e\r\n        \u003cData Name='SubjectLogonId'\u003e0x11111111\u003c/Data\u003e\r\n    \u003c/EventData\u003e\r\n\u003c/Event\u003e\r\n```\r\n\r\nこの問題に対処するため、`Data`タグの`Name`属性に指定された値をイベントキーとして利用できます。例えば、`EventData`の`SubjectUserName`と`SubjectDomainName` を条件として利用する場合、以下のように記述することが可能です。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        Channel: System\r\n        EventID: 7040\r\n        Event.EventData.SubjectUserName: Hayabusa\r\n        Event.EventData.SubjectDomainName: DESKTOP-HAYBUSA\r\n    condition: selection\r\n```\r\n\r\n### EventDataの例外的なパターン\r\n\r\n`EventData`タグにネストされたいくつかのタグは`Name`属性を持ちません。\r\n\r\n```xml\r\n\u003cEvent xmlns='http://schemas.microsoft.com/win/2004/08/events/event'\u003e\r\n    \u003cSystem\u003e\r\n        \u003cEventID\u003e5379\u003c/EventID\u003e\r\n        \u003cChannel\u003eSecurity\u003c/Channel\u003e\r\n        \u003cSecurity /\u003e\r\n    \u003c/System\u003e\r\n    \u003cEventData\u003e\r\n        \u003cData\u003eAvailable\u003c/Data\u003e\r\n        \u003cData\u003eNone\u003c/Data\u003e\r\n        \u003cData\u003eNewEngineState=Available PreviousEngineState=None (省略)\u003c/Data\u003e\r\n    \u003c/EventData\u003e\r\n\u003c/Event\u003e\r\n```\r\n\r\n上記のようなイベントログを検知するには、`Data`というイベントキーを指定します。\r\nこの場合、`EventData`にネストされたタグの内、`Data`フィールドが`None`になっている場合は、条件にマッチすることになります。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        Channel: Security\r\n        EventID: 5379\r\n        Data: None\r\n    condition: selection\r\n```\r\n\r\n#### 同じ名前の複数のフィールド名からフィールドデータを出力する\r\n\r\nいくつかのイベントは、前の例のように、データをすべて`Data`というフィールド名で保存します。\r\n`details:`に`%Data%`を指定すると、すべてのデータが配列として出力されます。\r\n\r\n例えば：\r\n`[\"rundll32.exe\",\"6.1.7600.16385\",\"4a5bc637\",\"KERNELBASE.dll\",\"6.1.7601.23392\",\"56eb2fb9\",\"c0000005\"]`\r\n\r\nもし、最初の`Data`フィールドのデータだけを出力したい場合は、`details:`に `%Data[1]%` を指定すると `rundll32.exe`のみが出力されます。\r\n\r\n## フィールド修飾子 (Field Modifiers)\r\n\r\nイベントキーにはフィールド修飾子を指定することができます。\r\nここまで説明した書き方では完全一致しか表現できませんでしたが、パイプを使うことでより柔軟な検知ルールを記載できるようになります。\r\n以下の例では、ある`Data`フィールドの値に`EngineVersion=2`という文字列が入っている場合、条件にマッチすることになります。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        Channel: 'Windows PowerShell'\r\n        EventID: 400\r\n        Data|contains: 'EngineVersion=2'\r\n    condition: selection\r\n```\r\n\r\n通常は大文字小文字を区別しませんが、`|re`もしくは`|equalsfield`のキーワードを指定した場合は大文字小文字を区別します。\r\n\r\n### 対応しているSigmaのフィールド修飾子\r\n\r\nHayabusaは現在、Sigma仕様のすべてを完全にサポートする唯一のオープンソースツールです。\r\n\r\nサポートされているフィールド修飾子、サポートされていないフィールド修飾子、およびこれらの修飾子がSigmaとはHayabusaのルールで使用されている回数の現在の状況は、https://github.com/Yamato-Security/hayabusa-rules/blob/main/doc/SupportedSigmaFieldModifiers.md で確認できます。\r\nこの文書は、SigmaやHayabusaのルールが更新されるたびに更新されます。\r\n\r\n- `'|all':`: このフィールド修飾子は、特定のフィールドに適用されるのではなく、すべてのフィールドに適用されるので、他の修飾子とは異なります\r\n\r\n    この例では、`Keyword-1`と`Keyword-2`という文字列の両方が存在する必要がありますが、任意のフィールドのどこにでも存在できます:\r\n    ```\r\n    detection:\r\n        keywords:\r\n            '|all':\r\n                - 'Keyword-1'\r\n                - 'Keyword-2'\r\n        condition: keywords\r\n    ```\r\n- `|base64offset|contains`: データは、エンコードされた文字列内の位置によって、3つの異なる方法でbase64にエンコードされます。この修飾子は、文字列を3つのバリエーションにエンコードし、その文字列がbase64文字列のどこかにエンコードされているかどうかをチェックします。\r\n- `|cased`: 大文字と小文字を区別して検索します。\r\n- `|cidr`: IPv4またはIPv6のCIDR表記をチェックします。（例：`192.0.2.0/24`）\r\n- `|contains`: 指定された文字列が含まれることをチェックします。\r\n- `|contains|all`: 指定された複数の文字列が含まれることをチェックします。\r\n- `|contains|all|windash`: `contains|windash`と同じですが、すべてのキーワードが存在する必要があります。\r\n- `|contains|cased`: フィールドの値が指定された大文字小文字を区別する文字列を含むかをチェックします。\r\n- `|contains|expand`: Checks if a field value contains a string a list defined in a config file.\r\n- `|contains|windash`: 文字列をそのままチェックするだけでなく、最初の`-`文字を`/`文字に変換し、そのバリエーションもチェックします。\r\n- `|endswith`: 指定された文字列で終わることをチェックします。\r\n- `|endswith|cased`: フィールドの値が指定された大文字小文字を区別する文字列で終わることをチェックします。\r\n- `|endswith|windash`: 指定された文字列で終わることをチェックし、最初の`-`文字を`/`、`–` (en dash)、`—` (em dash)、`―` (horizontal bar)文字のバリエーションに変換し、チェックします。\r\n- `|exists`: フィールドが存在するかをチェックします。\r\n- `|expand`: Checks if a field value equals a string defined in a config file.\r\n- `|fieldref`: 2つのフィールドの値が同じかどうかをチェックする。これは `|equalsfield` 修飾子と同じです。\r\n- `|fieldref|contains`: 一方のフィールドの値がもう一方のフィールドに含まれているかどうかをチェックします。\r\n- `|fieldref|endswith`: 左側のフィールドが右側のフィールドの文字列で終わっているかどうかをチェックします。`condition` で `not` を使用することで、それらが異なるかどうかをチェックできます。\r\n- `|fieldref|startswith`: 左側のフィールドが右側のフィールドの文字列で始まっているかどうかをチェックします。`condition` で `not` を使用することで、それらが異なるかどうかをチェックできます。\r\n- `|gt`: フィールドの値が指定した数値より大きいかどうかをチェックします。\r\n- `|gte`: フィールドの値が指定した数値以上かどうかをチェックします。\r\n- `|lt`: フィールドの値が指定した数値より小さいかどうかをチェックします。\r\n- `|lte`: フィールドの値が指定した数値以下かどうかをチェックします。\r\n- `|re`: 大文字と小文字を区別する正規表現を使用する。 (regexクレートを使用しているので、サポートされている正規表現の書き方は以下のドキュメントを参照してください。 \u003chttps://docs.rs/regex/latest/regex/#syntax\u003e)\r\n    \u003e 注意: [Sigma ルールにおける正規表現の構文](https://github.com/SigmaHQ/sigma-specification/blob/main/appendix/sigma-modifiers-appendix.md#regular-expression) PCREを使用しており、文字クラス、ルックビハインド、アトミック・グルーピングなどの特定のメタ文字はサポートされていません。Rust regex crateはSigmaルールですべての正規表現を使用できるはずですが、互換性がない可能性があります。\r\n- `|re|i`: (Insensitive) 大文字小文字を区別しない正規表現を使用する。\r\n- `|re|m`: (Multi-line) 複数行にまたがってマッチする。`^` / `$` は行頭/行末にマッチする。\r\n- `|re|s`: (Single-line) ドット (`.`) は改行文字を含むすべての文字にマッチする。\r\n- `|startswith`: 指定された文字列で始まることをチェックします。\r\n- `|startswith|cased`: フィールドの値が指定された大文字小文字を区別する文字列で始まるかをチェックします。\r\n- `|utf16|base64offset|contains`: UTF-16文字列がBase64文字列内にエンコードされているかどうかをチェックします。\r\n- `|utf16be|base64offset|contains`: UTF-16ビッグエンディアンの文字列がBase64文字列内にエンコードされているかどうかをチェックします。\r\n- `|utf16le|base64offset|contains`: UTF-16リトルエンディアン文字列がBase64文字列内にエンコードされているかどうかをチェックします。\r\n- `|wide|base64offset|contains`: `utf16le|base64offset|contains` のエイリアスで、UTF-16リトルエンディアンの文字列をチェックします。\r\n\r\n### 非推奨のフィールド修飾子\r\n\r\n以下の修飾子は非推奨となり、Sigma仕様の修飾子に置き換えられました。\r\n\r\n- `|equalsfield`: 現在は`|fieldref`に置き換えられています。\r\n- `|endswithfield`: 現在は `|fieldref|endswith`に置き換えられています。\r\n\r\n### Expandフィールド修飾子\r\n\r\n`expand`フィールド修飾子はユニークなもので、使用するために事前に設定を必要とする唯一のフィールド修飾子です。\r\n例えば、`%DC-MACHINE-NAME%`のようなプレースホルダーを使用し、すべてのDCマシン名を含む`/config/expand/DC-MACHINE-NAME.txt`という名前の設定ファイルを必要とします。\r\n\r\nこの設定方法については、[こちら](https://github.com/Yamato-Security/hayabusa?tab=readme-ov-file#expand-list-command)でさらに詳しく説明しています。\r\n\r\n## ワイルドカード\r\n\r\nHayabusaルールではワイルドカードを使用することができます。以下の例では、`ProcessCommandLine` が \"malware\" という文字列で始まる場合、このルールでログが検知されます。この仕様はSigmaルールのワイルドカードと同じく、大文字小文字を区別しません。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        Channel: Security\r\n        EventID: 4688\r\n        ProcessCommandLine: malware*\r\n    condition: selection\r\n```\r\n\r\n以下の2つのワイルドカードを使用することができます。\r\n\r\n- `*`: 0文字以上の任意の文字列にマッチします。(内部的には`.*`という正規表現に変換されます)。\r\n- `?`: 任意の1文字にマッチします。(内部的には`.`という正規表現に変換されます)。\r\n\r\nワイルドカードのエスケープについて\r\n\r\n- ワイルドカード(`*`と`?`)はバックスラッシュでエスケープできます: `\\*` と `\\?`.\r\n- ワイルドカードの直前にバックスラッシュを使用する場合、 `\\\\*` または `\\\\?` と記述してください。\r\n- バックスラッシュを単独で使用する場合、エスケープは不要です。\r\n\r\n## null keyword\r\n\r\n`null`を値に入れることで、フィールドが存在しないことを条件とすることができます。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        EventID: 4688\r\n        ProcessCommandLine: null\r\n    condition: selection\r\n```\r\n\r\n注意: フィールド自体は存在するが、値がヌルであることを確認したい場合は、`ProcessCommandLine: ''`のように定義します。\r\n\r\n## condition (条件)\r\n\r\nこれまで説明した記法では簡単な`AND`や`OR`であれば表現可能ですが、複雑な条件は定義できません。そのような場合、`condition` キーワードを使用します。\r\n\r\n```yaml\r\ndetection:\r\n  SELECTION_1:\r\n    EventID: 3\r\n  SELECTION_2:\r\n    Initiated: 'true'\r\n  SELECTION_3:\r\n    DestinationPort:\r\n    - '4444'\r\n    - '666'\r\n  SELECTION_4:\r\n    Image: '*\\Program Files*'\r\n  SELECTION_5:\r\n    DestinationIp:\r\n    - 10.*\r\n    - 192.168.*\r\n    - 172.16.*\r\n    - 127.*\r\n  SELECTION_6:\r\n    DestinationIsIpv6: 'false'\r\n  condition: (SELECTION_1 and (SELECTION_2 and SELECTION_3) and not ((SELECTION_4 or (SELECTION_5 and SELECTION_6))))\r\n```\r\n\r\n `condition`には、以下の式を用いることができます。\r\n\r\n- `{expression1} and {expression2}`: {expression1} と {expression2} の両方が真である場合にマッチします。\r\n- `{expression1} or {expression2}`: {expression1} または {expression2} のどちらかが真である場合にマッチします。\r\n- `not {expression}`: {expression} の真偽を反転させます。\r\n- `( {expression} )`: `()`で囲まれた {expression} を先に評価します。数学と同じ優先順位に従います。\r\n\r\n上記の例では、 `SELECTION_1`、`SELECTION_2`などの名前が使用されていますが、名前には `a-z A-Z 0-9 _`の文字を使用可能です。ただし、`selection_1`、`selection_2`、 `filter_1`、`filter_2`などの標準的な規則の利用を推奨します。\r\n\r\n## notロジック\r\n\r\nルールを作成する場合、誤検知を減らすためにフィルターを作成することはよくあります。以下に利用例を示します。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        Channel: Security\r\n        EventID: 4673\r\n    filter:\r\n        - ProcessName: C:\\Windows\\System32\\net.exe\r\n        - ProcessName: C:\\Windows\\System32\\lsass.exe\r\n        - ProcessName: C:\\Windows\\System32\\audiodg.exe\r\n        - ProcessName: C:\\Windows\\System32\\svchost.exe\r\n        - ProcessName: C:\\Windows\\System32\\mmc.exe\r\n        - ProcessName: C:\\Windows\\System32\\net.exe\r\n        - ProcessName: C:\\Windows\\explorer.exe\r\n        - ProcessName: C:\\Windows\\System32\\SettingSyncHost.exe\r\n        - ProcessName: C:\\Windows\\System32\\sdiagnhost.exe\r\n        - ProcessName|startswith: C:\\Program Files\r\n        - SubjectUserName: LOCAL SERVICE\r\n    condition: selection and not filter\r\n```\r\n\r\n# Sigma相関ルール\r\n\r\n[こちら](https://github.com/SigmaHQ/sigma-specification/blob/version_2/specification/sigma-correlation-rules-specification.md)に定義されているSigmaバージョン2の相関ルールのすべてを実装しています。\r\n\r\nサポートされている相関ルール:\r\n- イベントカウント (`event_count`)\r\n- 値カウント (`value_count`)\r\n- 時間的近接性 (`temporal`)\r\n- 順序付き時間的近接性 (`temporal_ordered`)\r\n\r\n## イベントカウントルール\r\n\r\nこれらは特定のイベントをカウントし、一定の時間内にそのイベントが多すぎるか、または少なすぎる場合にアラートを発するルールです。\r\n一定の時間内に多数のイベントを検知する一般的な例として、パスワード推測攻撃、パスワードスプレー攻撃、サービス拒否攻撃の検出が挙げられます。\r\nまた、これらのルールを使用して、特定のイベントが特定の閾値を下回った場合など、ログソースの信頼性に関する問題を検出することも可能です。\r\n\r\n### イベントカウントルールの例:\r\n\r\n次の例では、パスワード推測攻撃を検出するために2つのルールを使用しています。\r\n参照されるルールが5分以内に5回以上一致し、これらのイベントのIpAddressフィールドが同じ場合にアラートが発生します。\r\n\r\n\u003e 概念を理解するために必要なフィールドのみを含めています。\r\n\u003e この例に基づく完全なルールは[こちら](https://github.com/Yamato-Security/hayabusa-rules/tree/main/hayabusa/builtin/Security/LogonLogoff/Logon/Sec_4625_Med_LogonFail_WrongPW_PW-Guessing_Correlation.yml) にありますので、ご参照ください。\r\n\r\n### イベントカウント相関ルール:\r\n\r\n```yaml\r\ntitle: PW Guessing\r\nid: 23179f25-6fce-4827-bae1-b219deaf563e\r\ncorrelation:\r\n    type: event_count\r\n    rules:\r\n        - 5b0b75dc-9190-4047-b9a8-14164cee8a31\r\n    group-by:\r\n        - IpAddress\r\n    timespan: 5m\r\n    condition:\r\n        gte: 5\r\n```\r\n\r\n### ログオン失敗 - 誤ったパスワード ルール:\r\n\r\n```yaml\r\ntitle: Failed Logon - Incorrect Password\r\nid: 5b0b75dc-9190-4047-b9a8-14164cee8a31\r\nlogsource:\r\n    product: windows\r\n    service: security\r\ndetection:\r\n    selection:\r\n        Channel: Security\r\n        EventID: 4625\r\n        SubStatus: \"0xc000006a\" #Wrong password\r\n    filter:\r\n       IpAddress: \"-\"\r\n    condition: selection and not filter\r\n```\r\n\r\n### 非推奨の`count`ルールの例:\r\n\r\n上記の相関ルールおよび参照されているルールは、従来の`count`修飾子を使用した以下のルールと同じ結果を提供します。\r\n\r\n```yaml\r\ntitle: PW Guessing\r\nlogsource:\r\n    product: windows\r\n    service: security\r\ndetection:\r\n    selection:\r\n        Channel: Security\r\n        EventID: 4625\r\n        SubStatus: \"0xc000006a\" #Wrong password\r\n    filter:\r\n       IpAddress: \"-\"\r\n    condition: selection and not filter | count() by IpAddress \u003e= 5\r\n    timeframe: 5m\r\n```\r\n### イベントカウントルールの出力:\r\n\r\n上記のルールは次の結果を出力します::\r\n```\r\n% ./hayabusa csv-timeline -d ../hayabusa-sample-evtx -r password-guessing-sample.yml -w\r\n% \r\nTimestamp · RuleTitle · Level · Computer · Channel · EventID · RecordID · Details · ExtraFieldInfo\r\n2016-09-20 01:50:06.513 +09:00 · PW Guessing · med · DESKTOP-M5SN04R · Sec · 4625 · - · Count: 3558 ¦ IpAddress: 192.168.198.149 · -\r\n```\r\n\r\n## 値カウントルール\r\n\r\nこれらのルールは、指定されたフィールドの**異なる**値を持つ同じイベントを一定の時間枠内でカウントします。\r\n\r\n例:\r\n- 1つの送信元IPアドレスが多数の異なる宛先IPアドレスやポートに接続しようとするネットワークスキャン\r\n- 1つの送信元が多数の異なるユーザーに対して認証に失敗するパスワードスプレー攻撃\r\n- 短時間で多数の高権限ADグループを列挙するBloodHoundのようなツールの検\r\n\r\n### 値カウントルールの例:\r\n\r\n次のルールは、攻撃者がユーザー名を推測しようとしている場合を検出します。\r\nつまり、**同じ**送信元IPアドレス (`IpAddress`) が5分以内に3つ以上の**異なる**ユーザー名 (`TargetUserName`) でログオンに失敗した場合です。\r\n\r\n\u003e 概念を理解するために必要なフィールドのみを含めています。\r\n\u003e この例に基づく完全なルールは[こちら](https://github.com/Yamato-Security/hayabusa-rules/tree/main/hayabusa/builtin/Security/LogonLogoff/Logon/Sec_4625_Med_LogonFail_UserGuessing_Correlation.yml)にありますので、ご参照ください。\r\n\r\n### 値カウント相関ルール:\r\n\r\n```yaml\r\ntitle: User Guessing\r\nid: 0ae09af3-f30f-47c2-a31c-83e0b918eeee\r\ncorrelation:\r\n    type: value_count\r\n    rules:\r\n        - b2c74582-0d44-49fe-8faa-014dcdafee62\r\n    group-by:\r\n        - IpAddress\r\n    timespan: 5m\r\n    condition:\r\n        gt: 3\r\n        field: TargetUserName\r\n```\r\n\r\n### 値カウント ログオン失敗 (存在しないユーザー) ルール:\r\n\r\n```yaml\r\ntitle: Failed Logon - Non-Existant User\r\nid: b2c74582-0d44-49fe-8faa-014dcdafee62\r\nlogsource:\r\n    product: windows\r\n    service: security\r\ndetection:\r\n    selection:\r\n        Channel: Security\r\n        EventID: 4625\r\n        SubStatus: \"0xc0000064\" #Username does not exist\r\n    condition: selection\r\n```\r\n\r\n### 非推奨の`count`ルール:\r\n\r\n上記の相関ルールおよび参照されているルールは、従来の`count`修飾子を使用した以下のルールと同じ結果を提供します:\r\n\r\n```\r\ntitle: User Guessing\r\nlogsource:\r\n    product: windows\r\n    service: security\r\ndetection:\r\n    selection:\r\n        Channel: Security\r\n        EventID: 4625\r\n        SubStatus: \"0xc0000064\" #Username does not exist\r\n    condition: selection | count(TargetUserName) by IpAddress \u003e 3 \r\n    timeframe: 5m\r\n```\r\n\r\n### 値カウントルールの出力:\r\n\r\n上記のルールは次の結果を出力します:\r\n```\r\n2018-08-23 23:24:22.523 +09:00 · User Guessing · med · dmz-ftp · Sec · 4625 · - · Count: 4 ¦ TargetUserName: ninja-labs/root/test@ninja-labs.com/sarutobi ¦ IpAddress: - ¦ LogonType: 8 ¦ TargetDomainName:  ¦ ProcessName: C:\\\\Windows\\\\System32\\\\svchost.exe ¦ LogonProcessName: Advapi ¦ WorkstationName: DMZ-FTP · -\r\n\r\n2018-08-28 08:03:13.770 +09:00 · User Guessing · med · dmz-ftp · Sec · 4625 · - · Count: 4 ¦ TargetUserName: root/sarutobi@ninja-labs.com/sarutobi/administrator@ninja-labs.com ¦ IpAddress: - ¦ LogonType: 8 ¦ TargetDomainName:  ¦ ProcessName: C:\\\\Windows\\\\System32\\\\svchost.exe ¦ LogonProcessName: Advapi ¦ WorkstationName: DMZ-FTP · -\r\n\r\n2018-09-01 12:51:58.346 +09:00 · User Guessing · med · dmz-ftp · Sec · 4625 · - · Count: 4 ¦ TargetUserName: root/admin@ninja-labs.com/admin/administrator@ninja-labs.com ¦ IpAddress: - ¦ LogonType: 8 ¦ TargetDomainName:  ¦ ProcessName: C:\\\\Windows\\\\System32\\\\svchost.exe ¦ LogonProcessName: Advapi ¦ WorkstationName: DMZ-FTP · -\r\n\r\n2018-09-02 03:55:13.007 +09:00 · User Guessing · med · dmz-ftp · Sec · 4625 · - · Count: 4 ¦ TargetUserName: root/admin@ninja-labs.com/administrator@ninja-labs.com/admin ¦ IpAddress: - ¦ LogonType: 8 ¦ TargetDomainName:  ¦ ProcessName: C:\\\\Windows\\\\System32\\\\svchost.exe ¦ LogonProcessName: Advapi ¦ WorkstationName: DMZ-FTP · -\r\n```\r\n\r\n## Temporal Proximityルール\r\n\r\nルールフィールドで参照されるルールで定義されたすべてのイベントは、`timespan`で定義された時間内に発生しなければならない。\r\n`group-by` で定義されたフィールドの値はすべて同じ値でなければならない（例：同じホスト、ユーザーなど）。\r\n\r\n### Temporal Proximityルールの例:\r\n\r\n例: 3つのSigmaルールで定義された偵察コマンドが、同一ユーザーによってシステム上で5分以内に任意の順序で起動される\r\n\r\n### Temporal Proximity相関ルール:\r\n\r\n```yaml\r\ncorrelation:\r\n    type: temporal\r\n    rules:\r\n        - recon_cmd_a\r\n        - recon_cmd_b\r\n        - recon_cmd_c\r\n    group-by:\r\n        - Computer\r\n        - User\r\n    timespan: 5m\r\n```\r\n\r\n## Ordered Temporal Proximityルール\r\n\r\n`temporal_ordered` 相関タイプは `temporal` と同じように振る舞い、さらに `rules` 属性で指定された順番でイベントが現れることを要求する\r\n\r\n### Ordered Temporal Proximityルールの例:\r\n\r\n例：上記で定義されたログイン失敗が多数あり、その後1時間以内に同じユーザーアカウントでログインが成功した場合：\r\n\r\n### Ordered Temporal Proximity相関ルール:\r\n\r\n```yaml\r\ncorrelation:\r\n    type: temporal_ordered\r\n    rules:\r\n        - many_failed_logins\r\n        - successful_login\r\n    group-by:\r\n        - User\r\n    timespan: 1h\r\n```\r\n\r\n## 相関ルールの注意点\r\n\r\n1. すべての相関ルールおよび参照されているルールを1つのファイルに含め、YAMLの区切り文字である`---`で区切ってください\r\n\r\n2. デフォルトでは、参照された相関ルールの出力は行われません。参照ルールの出力を確認したい場合は、`correlation`の下に`generate: true`を追加する必要があります。相関ルールを作成する際に有効にして結果を確認すると非常に便利です。\r\n    例:\r\n    ```\r\n    correlation:\r\n        generate: true\r\n    ```\r\n3. ルールを参照する際に、ルールIDの代わりにエイリアス名を使用して、より理解しやすくすることができます\r\n\r\n4. 複数のルールを参照することができます\r\n\r\n5. `group-by`で複数のフィールドを使用することができます。その場合、これらのフィールドのすべての値が同じでないと、アラートは発生しません。多くの場合、誤検知を減らすために特定のフィールドを`group-by`でフィルタリングするルールを作成しますが、より汎用的なルールを作成するために `group-by`を省略することも可能です\r\n\r\n6. 相関ルールのタイムスタンプは攻撃の開始時点になるので、それ以降のイベントを確認し、過検知かどうかを判断する必要があります。\r\n\r\n# 非推奨機能\r\n\r\nこれらの機能はHayabusaでサポートされていますが、今後ルール内で使用されることはありません。\r\n\r\n## イベントキー内のキーワードのネスト\r\n\r\nイベントキーには特定のキーワードをネストすることができます。\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        Channel: System\r\n        EventID: 7045\r\n        ServiceName:\r\n            - value: malicious-service\r\n            - regexes: ./rules/config/regex/detectlist_suspicous_services.txt\r\n        ImagePath:\r\n            min_length: 1000\r\n            allowlist: ./rules/config/regex/allowlist_legitimate_services.txt\r\n    condition: selection\r\n```\r\n\r\n## 非推奨の特殊キーワード\r\n\r\n- `value`: 文字列によるマッチング (ワイルドカードやパイプも指定可能)。\r\n- `min_length`: 指定された文字数以上の場合にマッチします。\r\n- `regexes`: 指定されたファイルに定義された正規表現に1つ以上に一致する場合、**条件にマッチした**ものとして扱われます。\r\n- `allowlist`: 指定されたファイルに定義された正規表現に1つ以上に一致する場合、**条件にマッチしてない**ものとして扱われます。\r\n\r\n### regexesとallowlistキーワード\r\n\r\nHayabusaに`./rules/hayabusa/default/alerts/System/7045_CreateOrModiftySystemProcess-WindowsService_MaliciousServiceInstalled.yml`のルールのために使う2つの正規表現ファイルが用意されています。\r\n\r\n- `./rules/config/regex/detectlist_suspicous_services.txt`: 怪しいサービス名を検知するためのものです。\r\n- `./rules/config/regex/allowlist_legitimate_services.txt`: 正規のサービスを許可するためのものです。\r\n\r\n`regexes` と `allowlist` で定義されたファイルの正規表現を変更すると、それらを参照するすべてのルールの動作を一度に変更できます。\r\n\r\nまた、`regexes` と `allowlist` にはユーザーが独自で作成したファイルを指定することも可能です。\r\nデフォルトの `./rules/config/detectlist_suspicous_services.txt` と `./rules/config/allowlist_legitimate_services.txt` を参考にして、独自のファイルを作成してください。\r\n\r\n\r\n## 非推奨の集計条件（'count'ルール）\r\n\r\n非推奨の特殊キーワードと `count` 集計は、Hayabusaではまだサポートされていますが、今後ルール内では使用されません。\r\n\r\n### 基本事項\r\n\r\n上記の `condition` キーワードは `AND` や `OR` だけでなく、マッチしたイベントの集計も可能です。この機能を利用するには`aggregation condition`を利用します。指定するには条件をパイプでつなぎます。\r\n以下のパスワードスプレー攻撃の例では、5分以内に同じ送信元の`IpAddress`で5個以上の `TargetUserName`があるかどうかを判断します。\r\n\r\n```yaml\r\ndetection:\r\n  selection:\r\n    Channel: Security\r\n    EventID: 4648\r\n  condition: selection | count(TargetUserName) by IpAddress \u003e 5\r\n  timeframe: 5m\r\n```\r\n\r\n`aggregation condition`は以下の形式で定義します。\r\n\r\n- `count() {operator} {number}`: パイプの前の最初の条件にマッチするログイベントに対して、マッチしたログの数が `{operator}` と `{number}` で指定した条件式を満たす場合に条件がマッチします。\r\n\r\n`{operator}` は以下のいずれかになります。\r\n\r\n- `==`: 指定された値と等しい場合、条件にマッチしたものとして扱われる。\r\n- `\u003e=`: 指定された値以上であれば、条件にマッチしたものとして扱われる。\r\n- `\u003e`: 指定された値以上であれば、条件にマッチしたものとして扱われる。\r\n- `\u003c=`: 指定された値以下の場合、条件にマッチしたものとして扱われる。\r\n- `\u003c`: 指定された値より小さい場合、条件にマッチしたものとして扱われる。\r\n\r\n`{number}` は数値である必要があります。\r\n\r\n`timeframe` は以下のように定義することができます。\r\n\r\n- `15s`: 15秒\r\n- `30m`: 30分\r\n- `12h`: 12時間\r\n- `7d`: 7日間\r\n- `3M`: 3ヶ月\r\n\r\n### countの4パターン\r\n\r\n1. countの引数と`by` キーワード共に指定しないパターン。例: `selection | count() \u003e 10`\r\n   \u003e `selection`にマッチしたログが10件以上ある場合、このルールは検知します。\r\n2. countの引数はないが、`by` キーワードはある。例: `selection | count() by date \u003e 10`\r\n   \u003e `selection`にマッチするログが10件以上あるかどうか、日付毎にチェックします。\r\n3. countの引数があるが、`by` キーワードがない場合。例:  `selection | count(TargetUserName) \u003e 10`\r\n   \u003e `selection`に一致する`TargetUserName`が10人以上存在する場合、このルールは検知します。\r\n4. count 引数と `by` キーワードの両方が存在する。例: `selection | count(TargetUserName) by date \u003e 10`\r\n   \u003e `selection`に一致する`TargetUserName`が10人以上存在するかどうか、日付毎にチェックします。\r\n\r\n### パターン1の例\r\n\r\nこれは最も基本的なパターンです：`count() {operator} {number}`. 以下のルールは、`selection`にマッチしたログが3つ以上である場合、このルールが検知されます。\r\n\r\n![](doc/CountRulePattern-1-JP.png)\r\n\r\n### パターン2の例\r\n\r\n`count() by {eventkey} {operator} {number}`： `selection`にマッチしたログは、`{eventkey}`の値が**同じログ毎にグルーピング**されます。各グループにおいて、マッチしたイベントの数が`{operator}`と`{number}`で指定した条件を満たした場合、このルールが検知されます。\r\n\r\n![](doc/CountRulePattern-2-JP.png)\r\n\r\n### パターン3の例\r\n\r\n`count({eventkey}) {operator} {number}`：`selection`にマッチしたログの内、 `{eventkey}` が**異なる**値の数をカウントします。そのカウントされた値が`{operator}`と`{number}`で指定された条件式を満たす場合、このルールが検知されます。\r\n\r\n![](doc/CountRulePattern-3-JP.png)\r\n\r\n### パターン4の例\r\n\r\n`count({eventkey_1}) by {eventkey_2} {operator} {number}`： `selection`にマッチしたログは、`{eventkey}`の値が**同じログ毎にグルーピングし**、各グループに含まれる`{eventkey_1}`が**異なる**値の数をカウントします。各グループでカウントされた値が`{operator}`と`{number}`で指定された条件式を満たした場合、このルールが検知されます。\r\n\r\n![](doc/CountRulePattern-4-JP.png)\r\n\r\n### Countルールの出力\r\n\r\nCountルールのDetails出力は固定で、`[condition]`にcount条件と`[result]`に記録されたイベントキーが出力されます。\r\n\r\n以下の例では、ブルートフォースされた`TargetUserName`のユーザ名のリストと送信元の`IpAddress`が出力されます：\r\n\r\n```\r\n[condition] count(TargetUserName) by IpAddress \u003e= 5 in timeframe [result] count:41 TargetUserName:jorchilles/jlake/cspizor/lpesce/bgalbraith/jkulikowski/baker/eskoudis/dpendolino/sarmstrong/lschifano/drook/rbowes/ebooth/melliott/econrad/sanson/dmashburn/bking/mdouglas/cragoso/psmith/bhostetler/zmathis/thessman/kperryman/cmoody/cdavis/cfleener/gsalinas/wstrzelec/jwright/edygert/ssims/jleytevidal/celgee/Administrator/mtoussain/smisenar/tbennett/bgreenwood IpAddress:10.10.2.22 timeframe:5m\r\n```\r\n\r\nアラートのタイムスタンプには、timeframe内で最初に検知されたイベントの時間が表示されます。\r\n\r\n# ルール作成のアドバイス\r\n\r\n1. **可能な場合は、常に `Channel`もしくは`ProviderName`と`EventID`を指定してください。** デフォルトでは、`./rules/config/target_event_IDs.txt`に記載されているイベントIDしかスキャンされません。スキャン対象にするためには、`./rules/config/target_event_IDs.txt`にイベントIDを追加する必要があります。\r\n\r\n2. **不要な場合は複数の `selection`と`filter`セクションを使用しないでください。**\r\n\r\n### 悪い例\r\n\r\n```yaml\r\ndetection:\r\n    SELECTION_1:\r\n        Channnel: Security\r\n    SELECTION_2:\r\n        EventID: 4625\r\n    SELECTION_3:\r\n        LogonType: 3\r\n    FILTER_1:\r\n        SubStatus: \"0xc0000064\"\r\n    FILTER_2:\r\n        SubStatus: \"0xc000006a\"\r\n    condition: SELECTION_1 and SELECTION_2 and SELECTION_3 and not (FILTER_1 or FILTER_2)\r\n```\r\n\r\n### 良い例\r\n\r\n```yaml\r\ndetection:\r\n    selection:\r\n        Channel: Security\r\n        EventID: 4625\r\n        LogonType: 3\r\n    filter:\r\n        - SubStatus: \"0xc0000064\"   #Non-existent user\r\n        - SubStatus: \"0xc000006a\"   #Wrong password\r\n    condition: selection and not filter\r\n```\r\n\r\n1. **複数のセクションが必要な場合は、チャンネル名とイベントIDの情報を記入する最初のセクションを `section_basic` セクションに、その他のセクションを `section_` と `filter_` の後に意味のある名前を付ける記法を用いてください。また、分かりにくいところはコメントを書いて説明してください。**\r\n\r\n### 悪い例\r\n\r\n```yaml\r\ndetection:\r\n    Takoyaki:\r\n        Channel: Security\r\n        EventID: 4648\r\n    Naruto:\r\n        TargetUserName|endswith: \"$\"\r\n        IpAddress: \"-\"\r\n    Sushi:\r\n        SubjectUserName|endswith: \"$\"\r\n        TargetUserName|endswith: \"$\"\r\n        TargetInfo|endswith: \"$\"\r\n    Godzilla:\r\n        SubjectUserName|endswith: \"$\"\r\n    Ninja:\r\n        TargetUserName|re: \"(DWM|UMFD)-([0-9]|1[0-2])$\"\r\n        IpAddress: \"-\"\r\n    Daisuki:\r\n        - ProcessName|endswith: \"powershell.exe\"\r\n        - ProcessName|endswith: \"WMIC.exe\"\r\n    condition: Takoyaki and Daisuki and not (Naruto and not Godzilla) and not Ninja and not Sushi\r\n```\r\n\r\n### 良い例\r\n\r\n```yaml\r\ndetection:\r\n    selection_basic:\r\n        Channel: Security\r\n        EventID: 4648\r\n    selection_TargetUserIsComputerAccount:\r\n        TargetUserName|endswith: \"$\"\r\n        IpAddress: \"-\"\r\n    filter_UsersAndTargetServerAreComputerAccounts:     #Filter system noise\r\n        SubjectUserName|endswith: \"$\"\r\n        TargetUserName|endswith: \"$\"\r\n        TargetInfo|endswith: \"$\"\r\n    filter_SubjectUserIsComputerAccount:\r\n        SubjectUserName|endswith: \"$\"\r\n    filter_SystemAccounts:\r\n        TargetUserName|re: \"(DWM|UMFD)-([0-9]|1[0-2])$\" #Filter out default Desktop Windows Manager and User Mode Driver Framework accounts\r\n        IpAddress: \"-\"                                  #Don't filter if the IP address is remote to catch attackers who created backdoor accounts that look like DWM-12, etc..\r\n    selection_SuspiciousProcess:\r\n        - ProcessName|endswith: \"powershell.exe\"\r\n        - ProcessName|endswith: \"WMIC.exe\"\r\n    condition: selection_basic and selection_SuspiciousProcess and not (selection_TargetUserIsComputerAccount\r\n               and not filter_SubjectUserIsComputerAccount) and not filter_SystemAccounts and not filter_UsersAndTargetServerAreComputerAccounts\r\n```\r\n\r\n# SigmaルールからHayabusaルール形式への自動変換\r\n\r\nSigmaルールからHayabusaルール形式に自動で変換する[ツール](https://github.com/Yamato-Security/sigma-to-hayabusa-converter)を作成しました。\r\n\r\n# Twitter\r\n\r\n[@SecurityYamato](https://twitter.com/SecurityYamato)でHayabusa、ルール更新、その他の大和セキュリティツール等々について情報を提供しています。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyamato-security%2Fhayabusa-rules","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyamato-security%2Fhayabusa-rules","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyamato-security%2Fhayabusa-rules/lists"}