DNS関連のログに迫ってみる。 Sysmon | MS:AD:DNS | Stream(DNS)

はじめに
---
- sysmonにdnsクエリログが出力されるようになって(2019.06)からようやっと検証することができました。
    - （Win2012Serverの検証環境ではsysmonにDNSイベントが記録されなかったため。後回しにしていましたが、ようやくWin10とWin2019Serverの環境を準備できました）
- 検証きっかけは以下の**良記事**をみて、splunkで各種DNS関連のログを比較して見てみたくなり試してみました
    - [Sysmon 10.1の新機能：プロセスのDNSクエリーログをElasticsearchで採取してみる （動作確認編）
](https://qiita.com/rhpenguin/items/660f6e53ba7a49a1459c)
- せっかくなのでちまたでよく使われるDNSログ収集先2種も合わせて比較
    - [Splunk Stream DNS](https://qiita.com/odorusatoshi/items/1a9efe222ba6e8c4c454)：ネットワークLayer
    - Active DirectoryサーバのDNSログ：サーバLayer
    - Sysmon：エンドポイントLayer


構成イメージ
----
<img width="914" alt="スクリーンショット 2020-05-07 18.01.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/3f697675-24da-a871-fb35-1e78859503db.png">

- 余談だが、Splunk Streamは収集ポイントによって①クライアント→DNSサーバ間、②DNSサーバ→上位DNSサーバ間のクエリログも取得できる。今回はActive Directoryサーバ上のNICにIN/OUTするトラフィックをモニターして収集したため、①②両方のDNSクエリログを収集。

 
検証データ
---

ケース①： エンドポイントにて、[blackhat.com]ページをGoogleChromeで表示
---

<img width="272" alt="スクリーンショット 2020-05-01 22.38.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/56d8e259-5511-6226-d3f7-486f603956e7.png">

- SPLは3つのデータソースを一度に検索して必要なフィールドにtableコマンドで絞った結果を出力比較

```shell:SPL
(source=win*sysmon* OR sourcetype=stream:dns OR sourcetype="msad:nt6:dns") blackhat.com earliest=1588339080 latest=1588339110
|eval bytes_size = len(_raw)
|table _time bytes_size sourcetype Image query QueryName host_addr{} QueryResults questiontype record_type QueryStatus
```

- **各DNSログの見え方を整理**
<img width="1621" alt="スクリーンショット 2020-05-07 17.32.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/57e6bcd9-64df-5282-fe79-c6d9a492bfd3.png">


ケース②： エンドポイントにて、[blackhat.com]ページをcmd上でpingを実施
---
<img width="994" alt="スクリーンショット 2020-05-01 22.36.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/e3563d5d-ca29-6c49-c8f0-78d48c64fcba.png">

- SPLは3つのデータソースを一度に検索して必要なフィールドにtableコマンドで絞った結果を出力比較

```shell:SPL
(source=win*sysmon* OR sourcetype=stream:dns OR sourcetype="msad:nt6:dns") blackhat.com earliest=1588339864 latest=1588340164
|eval bytes_size = len(_raw)
|table _time bytes_size sourcetype EventID Image CommandLine query QueryName host_addr{} QueryResults questiontype record_type QueryStatus
```

- SPL結果（ケース①と差はない）

<img width="1668" alt="スクリーンショット 2020-05-07 18.10.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/2847beec-27bb-0c79-a387-dc56eb5567bc.png">


ケース③： エンドポイントにて、[blackhat.com]とnslookupコマンドで実行
---
<img width="554" alt="スクリーンショット 2020-05-01 22.44.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/f5638016-9c49-6512-cf55-0efe24557e6f.png">

- SPLは3つのデータソースを一度に検索して必要なフィールドにtableコマンドで絞った結果を出力比較

```shell:SPL
(source=win*sysmon* OR sourcetype=stream:dns OR sourcetype="msad:nt6:dns") blackhat.com earliest=1588340403 latest=1588340523
|eval bytes_size = len(_raw)
|table _time bytes_size sourcetype EventID Image CommandLine query QueryName host_addr{} QueryResults questiontype record_type QueryStatus
```

- SPL結果
<img width="1528" alt="スクリーンショット 2020-05-07 18.15.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/6ca6f870-40ee-976d-6fd1-977ef727c536.png">

- **sysmonイベントはあるが、実はDNSクエリイベント（EventCode=22）ではなく、Process Creation（EventCode=1）のみ記録された。**

<img width="861" alt="スクリーンショット 2020-05-07 18.17.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/92ebf3f9-c48a-fb2d-3e3a-c0445de6906e.png">

- nslookupコマンドは**DnsQuery_A等のAPI**を利用していないためsysmonのdnsクエリイベントに記録されなかった模様。
    - [参考記事:Evading Sysmon DNS Monitoring](https://blog.xpnsec.com/evading-sysmon-dns-monitoring/)


ケース④： エンドポイントにて、Powershellスクリプトを実行
---
<img width="894" alt="スクリーンショット 2020-05-07 18.25.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/469cf0c5-cf1e-b163-e2c6-a6b89db42bbc.png">

- ポイントはpoweshellスクリプトのencodeされた文字列の中にもC&Cサーバに対するCallBack URL（AWSのパブリックDNS名）が記載されています。

<img width="1023" alt="スクリーンショット 2020-05-07 18.49.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/30dc57cd-251c-5772-b839-1b5759a33d6e.png">

- SPLは3つのデータソースを一度に検索して必要なフィールドにtableコマンドで絞った結果を出力比較

```shell:SPL
(source=win*sysmon* OR sourcetype=stream:dns OR sourcetype="msad:nt6:dns") ec2-13-52-103-131.us-west-1.compute.amazonaws.com earliest=1588817760 latest=1588817784
|eval bytes_size = len(_raw)
|table _time bytes_size sourcetype EventID Image CommandLine query QueryName host_addr{} QueryResults questiontype record_type QueryStatus
|sort - _time
```

- SPL結果

![スクリーンショット 2020-05-07 18.55.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/6b535685-fb63-499f-40e0-dd5eb6b16745.png)

- sysmonのみに拡大

<img width="1491" alt="スクリーンショット 2020-05-07 18.59.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/a95150b4-a430-a2d3-2501-e7569e9900ce.png">

- 一番上のイベントがsysmonデータです。powershell.exeがDNSクエリーをかけていることが分かります。つまり**不審なドメインアクセス**調査を行う際に、**sysmonのログから影響のある端末のリストアップ**と、**DNSクエリを行うプロセスを特定**できる可能性があります。


おまけ
---
- sysmon v10以降を使ってDNSクエリを収集する際に利用してもらいやすいように以下2つのアイテムを紹介
    - sysmonダッシュボード(DNSクエリ対応)
        - https://github.com/odorusatoshi/jp_sysmon_dashbboard
    - sysmonのconfig(splunkプロセスのロギングを除外)
        - https://github.com/odorusatoshi/sysmon-config

- sysmon(dnsクエリ）はいい仕事してくれそうです
<img width="1670" alt="dashboard_sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/6547d249-d088-f161-65d4-a8c1decbbb0d.png">