Azure リソースの Dangling DNS (未解決の DNS エントリ) を特定する


# 1. はじめに
サブドメインテイクオーバーは、多くのリソースを作成/削除する企業で発生しやすいセキュリティ攻撃の1つです。
Azure などのクラウドから IaaS や PaaS などのリソースを展開すると、固有の FQDN が割り当てられます。CNAME レコードを利用し、IaaS や PaaS サービスに構築したシステムに自社ドメインでアクセスさせることが多いと思いますが、リソース削除後に CNAME レコードの削除を忘れることで、Dangling DNS (未解決のDNS レコード) が発生します。
脅威アクターが Dangling DNS を発見すると、フィッシングサイトや 閲覧者からの Cookie 情報取得などに利用され、企業の信頼の損失やさらなるセキュリティリスクにつながる恐れがあります。 
サブドメインテイクオーバー対策として、 Azure リソースの Danling DNS を特定する方法をご紹介します。

サブドメインテイクオーバーの仕組みについては、マイクロソフト社のドキュメントの絵がわかりやすいです。
* [サブドメインの乗っ取りとは](https://learn.microsoft.com/ja-jp/azure/security/fundamentals/subdomain-takeover#what-is-a-subdomain-takeover)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/9f682945-4730-f266-7d6a-bb9d0ec6e6e9.png)

また、JPRS さんが公開している `5分で学べる！サブドメインテイクオーバー` がわかりやすいので、ご参照ください。  
<iframe width="560" height="315" src="https://www.youtube.com/embed/tmfgNERuTwM?si=COCyqHb4Oy9zFCtJ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 2. Dangling DNS の特定ツール
マイクロソフトが作成した Azure リソースの Dangling DNS を特定するツールを、Github で公開しています。
* [Find Dangling DNS Records](https://github.com/Azure/Azure-Network-Security/tree/master/Cross%20Product/DNS%20-%20Find%20Dangling%20DNS%20Records)

本ツールは、Azure で利用しているすべてのサブスクリプションを対象に DNS ゾーンをレビューすることで、 「Dangling DNS (未解決の DNS エントリ)」 および 「乗っ取られている CNAME レコード」を検出することが可能ですが、以下の権限が必要です。
*  Azure サブスクリプションへの閲覧者レベルのアクセス権
*  Azure Resource Graph への読み取りアクセス権

以下の Azure サービスで Dangling DNS を検知することが可能です。
|サービス|種類|FQDN|例|
|--|--|--|--|
| Azure Front Door | microsoft.network/frontdoors | properties.cName | `abc.azurefd.net`|
| Azure Blob Storage  | microsoft.storage/storageaccounts | properties.primaryEndpoints.blob| `abc.blob.core.windows.net` |
| Azure CDN | microsoft.cdn/profiles/endpoints| properties.hostName | `abc.azureedge.net`|
| Public IP addresses | microsoft.network/publicipaddresses | properties.dnsSettings.fqdn | `abc.EastUs.cloudapp.azure.com`|
| Azure Traffic Manager | microsoft.network/trafficmanagerprofiles| properties.dnsConfig.fqdn | `abc.trafficmanager.net`|
| Azure Container Instance | microsoft.containerinstance/containergroups | properties.ipAddress.fqdn| `abc.EastUs.azurecontainer.io`|
| Azure API Management| microsoft.apimanagement/service | properties.hostnameConfigurations.hostName | `abc.azure-api.net` |
| Azure App Service | microsoft.web/sites | properties.defaultHostName | `abc.azurewebsites.net`|
| Azure App Service - Slots | microsoft.web/sites/slots | properties.defaultHostName  | `abc-def.azurewebsites.net`|

# 3. ツールを使ってみよう
Azure リソースの Dangling DNS 特定ツールは Github で公開されています。PowerShell Gallery からインストール可能です。
カスタムドメインを Azure DNS ゾーンでホストしている場合、コマンドを実行するだけで CNAME レコードと FQDN の状態を確認できます。
他 DNS サーバーがホストしている場合は、CNAME と FQDN の情報を CSV ファイルか JSON ファイルで準備して読み込ませることで、Dangling DNS を検出が可能です。

## 3.1 ツールのインストール
下記のコマンドでツールをインストールします。

```Powershell
# ツールのインストール
Install-Module -Name AzDanglingDomain
Import-Module  -Name AzDanglingDomain
```

## 3.2 ツールの実行
### Azure DNS ゾーンを利用している場合
ツールがサポートしている 8つのサービスに対する CNAME レコードを Azure DNS ゾーンでホストしている場合、以下のコマンドで Dangling DNS の状態を確認できます。
```PowerShell
# カスタムドメインを Azure DNS ゾーンでホストしている場合
Get-DanglindDNSRecords -FetchDnsRecordsFromAzureSubscription
```

### 他 DNS サーバーを利用している場合
他 DNS サーバーを利用している場合は、CNAME と FQDN を記載した CSV もしくは JSON ファイルが必要です。下記のように CSV や JSON ファイルを準備してください。

* CSV ファイル

```PowerShell
CNAME,FQDN
testwanperfdiag,testwanperfdiag.blob.core.windows.net
testapp,testapp.azurewebsites.net
testcdn,testcdn.azureedge.net
```

* JSON ファイル
```json
[
  {
    "CNAME": "testwanperfdiag",
    "FQDN": "testwanperfdiag.blob.core.windows.net"
  },
  {
    "CNAME": "testapp",
    "FQDN": "testapp.azurewebsites.net"
  },
  {
    "CNAME": "testcdn",
    "FQDN": "testcdn.azureedge.net"
  }
]
```
ファイルを準備したら次のコマンドを実行します。

```PowerShell
# 他 DNS サーバーでホストしている場合 (CSV もしくは JSON ファイルを指定)
Get-DanglingDnsRecords -InputFileDNSRecords .\CNameToDNSMap.json
```

# 3.3 出力結果の確認
コマンドを実行後、Dangling DNS があるか出力結果が表示されます。
以下はわたしが試した出力例です。

```PowerShell
Found 1 CName records missing Azure resources; saved the file as: C:\Users\xxxx\AzureCNameMissingResources.csv
Fetched 21 Azure resources; Saved the file as: C:\Users\xxxx\AzureResources.csv
Fetched 1 Azure CName records; Saved the file as: C:\Users\xxxx\AzureDnsCNameRecordSets.csv

NameOfProcessSection            : Time in Milliseconds
InputFileProcessingTime         : 2
AzureLibrariesLoadTime          : 7
AzureResourcesFetchTime         : 1521
AzureDnsRecordsFetchTime        : 5673
InputDnsCNameListProcessingTime : 7
AzureCNameListProcessingTime    : 2
SummarizeTime                   : 41
ScriptExectionTime              : 17816

TypeOfRecords               : Details
ProcessedType               : Parallel
AzureSubscriptions          : 8
AzureResources              : 21
AzureDnsZones               : 1
AzureDnsRecordSets          : 4
InputDnsCNameList           : 0
AzureDnsCNameRecordSets     : 1
AzureCNameMatchingResources : 0
AzureCNameMissingResources  : 1



AzureResourceProviderName AzureResourceCount AzureCNameMatchingResources AzureCNameMissingResources
------------------------- ------------------ --------------------------- --------------------------
Azure API Management                       0                           0                          0
Azure Container Instance                   0                           0                          0
Azure CDN                                  0                           0                          0
Azure Front Door                           0                           0                          0
Azure App Service                          4                           0                          1
Azure Blob Storage                        16                           0                          0
Azure Public IP addresses                  1                           0                          0
Azure Classic Cloud                        0                           0                          0
Azure Traffic Manager                      0                           0                          0
```

表の `AzureCNameMissingResources` 列にDangling DNS レコードの数が表示されます。こちらの結果では、App Service で 1つの Dangling DNS があることが確認できます。

コマンドの出力だけでなく、CSV ファイルが出力され、CNAME や FQDN の詳細情報を確認することができます。
出力されたファイルパスは、最初に表示されるため確認してください。
```PowerShell
Found 1 CName records missing Azure resources; saved the file as: C:\Users\xxxx\AzureCNameMissingResources.csv
Fetched 21 Azure resources; Saved the file as: C:\Users\xxxx\AzureResources.csv
Fetched 1 Azure CName records; Saved the file as: C:\Users\xxxx\AzureDnsCNameRecordSets.csv
```

Dangling DNS のあり、なしで出力されるファイルが異なります。
`AzureCNameMissingResources.csv` を確認すると、CNAME レコードや App Service リソースの対象を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/67913e40-edbf-8e16-9123-20e50a8d9199.png)

このコマンドを定期的に確認することで、組織内で Dangling DNS が発生しているかを特定できるため、`CNAME レコードの削除` や `削除した App Service のリストア` などによる Dangling DNS への対応が可能になります。

# 4. ツール以外の Dangling DNS 検出方法
Azure ではクラウドワークロードの保護機能として、Defender for Cloud を提供しています。
IaaS VM、ストレージアカウント、コンテナ、App Service など様々なクラウドワークロード保護機能が適用されていますが、Defender for App Service では App Service の Dangling DNS を検出する機能が提供されています。

* [App Serviceの未解決の DNS の検出](https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/defender-for-app-service-introduction#dangling-dns-detection)

この機能を利用することで、どの DNS に CNAME レコードがホストされているか関係なく、Dangling DNS 状態を検出することが可能になります。

重要度低でアラートが検出されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/96346c80-6f18-a834-1269-0bc62ca2ef13.png)

Defender for AppService の有効化は、Defender for Cloud の環境設定から簡単に有効化することができますので、試してみてください。初めて利用する場合、30日間は無料のお試し期間が提供されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/2ebf8b46-2042-ea03-2140-d44c7c1b3bfc.png)

ドキュメントはこちらです。
* [Defender for App Service プランを有効にする](https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/tutorial-enable-app-service-plan#enable-the-defender-for-app-service-plan)

# 5. まとめ
脅威アクターは Web アプリケーションをプローブして Dangling DNS を探しており、見つけるとフィッシングサイトなどに悪用され、企業の信頼損失にも繋がるセキュリティリスクになります。
最近では、`鹿児島餃子の王将` のWeb サイトが改ざんにより破産宣告の偽情報を公開される事件がありました。フェイクニュースにより経営破綻につながることもあるようです。
* [2023.09.06 WEBサイト改ざん事例｜飲食店がサイト改ざんをされて破産宣告の偽情報を公開](https://secuas-cloud.com/column/1070/#:~:text=2023%E5%B9%B49%E6%9C%881%E6%97%A5%E3%81%AB%E9%B9%BF%E5%85%90%E5%B3%B6%E7%8E%8B%E5%B0%86%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%EF%BC%88%E4%BB%A5%E4%B8%8B%E3%80%81%E5%90%8C%E7%A4%BE%EF%BC%89%E3%81%AF%E3%80%81%E5%90%8C%E7%A4%BE%E3%81%8C%E9%81%8B%E5%96%B6%E3%81%99%E3%82%8B%E3%80%8C%E9%B9%BF%E5%85%90%E5%B3%B6%E9%A4%83%E5%AD%90%E3%81%AE%E7%8E%8B%E5%B0%86%E3%80%8D%E3%81%AE%E5%85%AC%E5%BC%8FWEB%E3%82%B5%E3%82%A4%E3%83%88%20%28%E4%BB%A5%E4%B8%8B%E3%80%81%E5%90%8C%E3%82%B5%E3%82%A4%E3%83%88%29%E3%81%8C%E7%84%A1%E8%A8%B1%E5%8F%AF%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%95%E3%82%8C%E3%80%81%E3%81%9D%E3%81%AE%E5%86%85%E5%AE%B9%E3%81%8C%E5%81%BD%E6%83%85%E5%A0%B1%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%95%E3%82%8C%E3%81%9F%E3%81%93%E3%81%A8%E3%82%92%E5%85%AC%E8%A1%A8%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82,WEB%E3%82%B5%E3%82%A4%E3%83%88%E6%94%B9%E3%81%96%E3%82%93%E3%81%AE%E8%A9%B3%E7%B4%B0%20%E5%90%8C%E7%A4%BE%E3%81%AE%E7%99%BA%E8%A1%A8%E3%81%AB%E3%82%88%E3%82%8B%E3%81%A8%E3%80%812023%E5%B9%B48%E6%9C%8831%E6%97%A5%E3%81%8B%E3%82%892023%E5%B9%B49%E6%9C%881%E6%97%A5%E3%81%AE%E9%96%93%E3%81%AB%E7%AC%AC%E4%B8%89%E8%80%85%E3%81%8C%E5%90%8C%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AB%E4%B8%8D%E6%AD%A3%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%92%E8%A1%8C%E3%81%84%E3%82%B5%E3%82%A4%E3%83%88%E5%86%85%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%A6%E3%81%84%E3%81%9F%E3%81%A8%E3%81%84%E3%81%86%E3%80%82)

Web サイトが乗っ取られることでも同じリスクがあると思いますし、他者に危害が及ぶことも考えられます。
本ツールや Defender for Cloud により Dangling DNS の検知し、より安全な環境を運用につながればいいなと思っています！