Sigmaルールのすすめ

自組織で検知能力を上げる方法の一つとして、ログ監視を行っている機器に検知ルールを実装する方法があります。しかしながら、検知ルールの作成は攻撃の検証や過剰検知がないか確認する必要があり、いくつものルールを作成しようと思うと大変です。ネットワークトラフィックではSnort、ファイルではYaraといったルールがありますが、最近ではログファイルに対しても実装することが多いと思います。
ログファイルを対象としているルールとしてSigmaルールがあり、今回はSigmaルールについて自分の知識の整理するためにもこちらの記事に記載しています。

何か誤りがありましたら、Twitterやコメントで教えてもらえると助かります。
また、何か追加で分かったことがあれば、こちらの記事に記載していこうと思います。

#1.Sigmaルールとは
Sigmaルールとはログファイルに対する汎用的なシグネチャフォーマットです。
ログファイルを対象にしていることから主にログファイルを集約している製品で利用することが多いと思います。Sigmaルールでサポートされている機器は以下となります。

＜サポートされている製品＞

+ Splunk (plainqueries and dashboards)
+ ElasticSearch Query Strings
+ ElasticSearch Query DSL
+ Kibana
+ Elastic X-Pack Watcher
+ Logpoint
+ Microsoft Defender Advanced Threat Protection (MDATP)
+ Azure Sentinel / Azure Log Analytics
+ Sumologic
+ ArcSight
+ QRadar
+ Qualys
+ RSA NetWitness
+ PowerShell
+ Grep with Perl-compatible regular expression support
+ LimaCharlie
+ ee-outliers
+ Structured Threat Information Expression (STIX)
+ LOGIQ
+ uberAgent ESA
+ Devo
+ LogRhythm

また、Sigmaルールは以下のプロジェクトや製品にも利用されています。

+ MISP (since version 2.4.70, March 2017)
+ Atomic Threat Coverage (since December 2018)
+ SOC Prime - Sigma Rule Editor
+ uncoder.io - Online Translator for SIEM Searches
+ THOR - Scan with Sigma rules on endpoints
+ Joe Sandbox
+ ypsilon - Automated Use Case Testing
+ RANK VASA
+ TA-Sigma-Searches (Splunk App)
+ TimeSketch
+ SIΣGMA - SIEM consumable generator that utilizes Sigma for query conversion

#2.Sigmaルールでできること
Sigmaルールですが、以下のようなことを行うことが可能です。

+ Sigmaルールから他の製品サーチ文への変換
+ SigmaルールのタグにMITRE社のATT&CKフレームワークをマッピングすることでATT&CK Navigator による可視化が可能
+ 公開されているSigmaルールを活用することで自組織の検知ルールの追加による検知能力の向上が可能

など

以降でそれぞれについて解説していきたいと思います。

## 2.1 Sigmaルールによる変換
SigmaルールはSignaルールと対応している各製品のサーチ文へ変換することが可能です。変換の方法はツールもしくはサイトにて変換可能です。個別のルールを変換するだけであれば、サイトの利用で十分で問題ないと思います。ツールはオプションを利用することでフィルタ機能やディレクトリ単位での操作を行うことが出来るので、多数のSigmaルールを取り扱いたい場合はツールを利用すると便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573683/6234e15b-8967-4d9b-4f8c-8ded1a31c303.png)

##2.2 サイト(uncoder.io)による変換
URL：https://uncoder.io/

uncoder.ioはSigmaルールから他製品のクエリ文へ変換する際に便利なサイトです。
Sigmaルールから他製品のクエリ文に変換する場合は以下の手順で簡単に変換することが可能です。
1.左の入力欄にSigmaルールを入力
2.右の選択欄から検索したい製品を選択
3.Translateをクリック
4.右側に表示されたクエリ文をコピーして製品で検索

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573683/3532672e-e473-65e3-8e49-e0f14a7805ea.png)

##2.3 ツールによる変換
ツール Sigmacを利用するでCUIベースによる変換が可能となります。
インストールはpipからsigmatoolsをインストールすることで利用可能です。

```
pip3 install sigmatools
```

単一のルールを変換する場合は以下のようなコマンドを入力すると変換できます。

```
tools/sigmac -t splunk -c splunk-windows rules/windows/sysmon/\sysmon_accessing_winapi_in_powershell_credentials_dumping.yml
(source="WinEventLog:Microsoft-Windows-Sysmon/Operational" (EventCode="8" OR EventCode="10") SourceImage="*\\powershell.exe" TargetImage="*\\lsass.exe")
```

他にも入力方法はありますので、興味がある方は本家のサイトを参考にして下さい。
https://github.com/SigmaHQ/sigma

##2.4 SigmaルールのATT&CKによるフレームワークに基づいた可視化
ツール sigma2attack を利用することでATT&CKフレームワークのマッピングをATT&CK Navigatorを利用して行うことが出来ます。やり方は以下のコマンドでATT&CK Navigatorで利用するファイルを作成し、アップロードすることで可視化することが出来ます。

```
# Use the default "rules" folder
./tools/sigma2attack

# ... or specify your own
./tools/sigma2attack --rules-directory ~/hunting/rules
```
上記のコマンドを入力するとheatmap.jsonが作成されるので、ATT&CK NavigatorのUpload from localからheatmap.jsonをアップロードすることで作成できます。
URL:https://mitre-attack.github.io/attack-navigator/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573683/f173e12e-e1b4-eedf-08eb-f1b56b4a63c5.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573683/eeea6f55-3c5e-bd45-fd9b-bc5a46be6133.png)

#3 Sigmaルールの構造
Sigmaルールの構造はYaraルールに似ており、以下のような構造になっています。

```
title　※ルールのタイトル
id [optional] ※ルールのID
related [optional] ※関連するルールの情報
   - type {type-identifier} ※関連するルールのタイプ
     id {rule-id} ※ルールのID
status [optional] ※ルールのステータス
description [optional]　※簡易的なルールの説明
author [optional] ※ルールの作成者
references [optional]　※参考情報
logsource ※対象のログソース
   category [optional] ※ログソースのカテゴリ(例:firewall, web, antivirus)
   product [optional] ※製品(例:windows, apache, check point fw1)
   service [optional] ※サービス(例:sshd, applocker)
   definition [optional] ※対象のログソースにおける補足情報
   ...
detection ※ログの検索条件
   {search-identifier} [optional] ※リスト形式、マップ形式でデータ構造を記載
      {string-list} [optional] ※リスト形式の記載方法
      {field: value} [optional] ※マップ形式の記載方法
   ...
   timeframe [optional] ※検索範囲時間（手動で設定する必要有）
   condition ※検索の条件式（ORやAND条件などでログをどのような条件で検索するか定義）
fields [optional] ※表示するべきフィールド
falsepositives [optional] ※偽陽性についての情報
level [optional] ※レベル(informational,low,medium,high,critical)
tags [optional] ※タグ(標準的なタグの情報: https://github.com/SigmaHQ/sigma/wiki/Tags)
...
[arbitrary custom fields] ※カスタムフィールド
```

Sigmaルールの構造で必須もしくは任意の項目は以下の図の通りになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573683/2b288198-eb1f-49f4-4b46-9b80c963961e.png)

Sigmaルールの構造について記載しましたが、実際のSigmaルールを見たほうが理解しやすいと思いますので、実際のSigmaルールを用いて説明します。今回はCobaltStrikeのサービスインストールに関するルールを例にして説明します。

```
title: CobaltStrike Service Installations
id: 5a105d34-05fc-401e-8553-272b45c1522d
description: Detects knownu malicious service installs that appear in cases in which a Cobalt Strike beacon elevates privileges or lateral movement
status: experimental
author: Florian Roth, Wojciech Lesicki
references:
    - https://www.sans.org/webcasts/119395
    - https://www.crowdstrike.com/blog/getting-the-bacon-from-cobalt-strike-beacon/
    - https://thedfirreport.com/2021/08/29/cobalt-strike-a-defenders-guide/
date: 2021/05/26
modified: 2021/09/21
tags:
    - attack.execution
    - attack.privilege_escalation
    - attack.lateral_movement 
    - attack.t1021.002
    - attack.t1543.003
    - attack.t1569.002
logsource:
    product: windows
    service: system
detection:
    selection_id:
        EventID: 7045
    selection1:
        ImagePath|contains|all: 
            - 'ADMIN$'
            - '.exe'
    selection2:
        ImagePath|contains|all: 
            - '%COMSPEC%'
            - 'start'
            - 'powershell'
    selection3:
        ImagePath|contains: 'powershell -nop -w hidden -encodedcommand'
    selection4:
        ImagePath|base64offset|contains: "IEX (New-Object Net.Webclient).DownloadString('http://127.0.0.1:"
    condition: selection_id and (selection1 or selection2 or selection3 or selection4)
falsepositives:
    - Unknown
level: critical
```

このSigmaルールはCobaltStrikeのサービスをインストールしようとするプロセスを検知するとなります。
ここではいくつかの項目に注目して解説したいと思います。

### description:
ルールの概要が記載されているため、どのような内容を検知するようなルールなのか把握するために利用します。今回はCobalt Strikeビーコンによる特権昇格や横移動の際に現れる既知の悪意のあるサービスのインストールを検出するものとなっています。

```
description: Detects knownu malicious service installs that appear in cases in which a Cobalt Strike beacon elevates privileges or lateral movement
```

### tags:
tagsには主にMitre社のATT&CKによるカテゴリが指定されることが多いため、どの段階の攻撃を検知するか把握するのに役立ちます。

```
tags:
    - attack.execution
    - attack.privilege_escalation
    - attack.lateral_movement 
    - attack.t1021.002
    - attack.t1543.003
    - attack.t1569.002
```

### logsource:
ここではどのログを対象にしているか把握することが出来ます。今回はWindowsのシステムログが対象になっています。

```
logsource:
    product: windows
    service: system
```

### detection:
ルールの条件にあたる部分で該当する条件を定義していきます。
それぞれの細かな条件については以下のURLを参照してください。
https://github.com/SigmaHQ/sigma/wiki/Specification


今回のSigmaルールにおける条件は以下のようになっています。

・selection_id:
　EventIDが「7045」であること
・selection1:
  ImagePathに以下の文字列を含む
  - 'ADMIN$'および'.exe'
・selection2:
  ImagePathに以下の文字列を含む
  - '%COMSPEC%'および'start'および'powershell'
・selection3:
  ImagePathに以下の文字列を含む
  - 'powershell -nop -w hidden -encodedcommand'
・selection4:
  ImagePathに以下の文字列をBase64エンコードされた文字列を含む
  - "IEX (New-Object Net.Webclient).DownloadString('http://127.0.0.1:"
 

上記の条件をどう満たすのか記載したものがconditionであり、今回は以下の条件を満たすときに一致すると判断します。

```
selection_id and (selection1 or selection2 or selection3 or selection4)
```
EventIDが「7045」であり、selection1～selection4のいずれかの条件に一致した場合に検知対象となります。

```
selection_id:
        EventID: 7045
    selection1:
        ImagePath|contains|all: 
            - 'ADMIN$'
            - '.exe'
    selection2:
        ImagePath|contains|all: 
            - '%COMSPEC%'
            - 'start'
            - 'powershell'
    selection3:
        ImagePath|contains: 'powershell -nop -w hidden -encodedcommand'
    selection4:
        ImagePath|base64offset|contains: "IEX (New-Object Net.Webclient).DownloadString('http://127.0.0.1:"
    condition: selection_id and (selection1 or selection2 or selection3 or selection4)
```

結果変換すると以下のような検索文になります。

### Splunkでの検索文：
(source="WinEventLog:System" source="WinEventLog:*" EventCode="7045" ((ImagePath="*ADMIN$$*" ImagePath="*.exe*") OR (ImagePath="*%COMSPEC%*" ImagePath="*start*" ImagePath="*powershell*") OR ImagePath="*powershell -nop -w hidden -encodedcommand*" OR (ImagePath="*SUVYIChOZXctT2JqZWN0IE5ldC5XZWJjbGllbnQpLkRvd25sb2FkU3RyaW5nKCdodHRwOi8vMTI3LjAuMC4xO*" OR ImagePath="*lFWCAoTmV3LU9iamVjdCBOZXQuV2ViY2xpZW50KS5Eb3dubG9hZFN0cmluZygnaHR0cDovLzEyNy4wLjAuMT*" OR ImagePath="*JRVggKE5ldy1PYmplY3QgTmV0LldlYmNsaWVudCkuRG93bmxvYWRTdHJpbmcoJ2h0dHA6Ly8xMjcuMC4wLjE6*")))

### Elastic Queryでの検索文：
(winlog.channel:"System" AND winlog.event_id:"7045" AND ((winlog.event_data.ImagePath:*ADMIN$* AND winlog.event_data.ImagePath:*.exe*) OR (winlog.event_data.ImagePath:*%COMSPEC%* AND winlog.event_data.ImagePath:*start* AND winlog.event_data.ImagePath:*powershell*) OR winlog.event_data.ImagePath:*powershell\ \-nop\ \-w\ hidden\ \-encodedcommand* OR winlog.event_data.ImagePath:(*SUVYIChOZXctT2JqZWN0IE5ldC5XZWJjbGllbnQpLkRvd25sb2FkU3RyaW5nKCdodHRwOi8vMTI3LjAuMC4xO* OR *lFWCAoTmV3LU9iamVjdCBOZXQuV2ViY2xpZW50KS5Eb3dubG9hZFN0cmluZygnaHR0cDovLzEyNy4wLjAuMT* OR *JRVggKE5ldy1PYmplY3QgTmV0LldlYmNsaWVudCkuRG93bmxvYWRTdHJpbmcoJ2h0dHA6Ly8xMjcuMC4wLjE6*)))

慣れ親しんでいる機器での検索文で見てみると理解しやすいと思います。

#5.まとめ
Sigmaルールについて本記事にまとめてみました。ログに対しての検知ルールが増えると検知能力が向上すると思いますので、ぜひ活用してみてください。

## 参考URL
■BlueTeamを勉強したいんじゃ！~Covenantハンティング編~
https://qiita.com/ninja400/items/196dabfb76e668299f20
■SigmaHQ
https://github.com/SigmaHQ/sigma
■uncoder.io
https://uncoder.io/
■A Guide to Generic Log Sources in Sigma
https://patzke.org/a-guide-to-generic-log-sources-in-sigma.html