hunting-for-dns-tunneling-with-zeek について
DNSを使った隠密通信やデータ持ち出しを調査する、セキュリティ分析担当者向けのZeek活用ガイドです。クエリ長、サブドメインのエントロピーと固有数、レコード種別、時間パターンを分析します。
主な機能
- 01DNSクエリ長の分布分析
- 02サブドメインのエントロピーと固有数の測定
- 03DNSレコード種別と通信量の確認
- 04クエリ時間パターンの分析
- 05conn.logとドメイン情報の相関
活用シーン
- 01DNS経由のデータ持ち出し疑いの調査
- 02頻繁なクエリや長いサブドメインの確認
- 03iodineやdnscat2などのトンネル探索
- 04脅威情報が示すDNS C2の分析
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill hunting-for-dns-tunneling-with-zeekインストール後、Claude Code で/hunting-for-dns-tunneling-with-zeekを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
Zeek で DNS トンネリングをハンティングする
使用する場面
- DNS の隠蔽チャネルを介したデータ流出をハンティングするとき
- 脅威インテリジェンスにより、自組織の業界を標的とする DNS ベースの C2 フレームワークが示された後
- dns.log で特定のドメインへのクエリ数が異常に多いことが確認されたとき
- HTTP/S による流出が見つからない、データ窃取の疑いがある事案を調査するとき
- iodine、dnscat2、DNSExfiltrator、DNS-over-HTTPS トンネリングなどのツールを監視するとき
前提条件
- DNS トラフィックをキャプチャするネットワーク TAP または SPAN ポートに Zeek が導入されていること
- クエリと応答の全フィールドを含む Zeek の dns.log があること
- dns.log の分析に使う SIEM プラットフォーム(Splunk、Elastic)
- DNS 分析を自動化する RITA(Real Intelligence Threat Analytics)
- ドメイン解決の過去の状況を把握するためのパッシブ DNS データ
ワークフロー
- クエリ長の分布を分析する:DNS トンネリングではサブドメインのラベルにデータをエンコードするため、通常より大幅に長いクエリが生成されます。通常の DNS クエリは平均 20~30 文字ですが、トンネリングのクエリは 50 文字を超えることがよくあります。ドメインごとにクエリ長の平均値と標準偏差を計算します。
- サブドメインのエントロピーを計算する:トンネリングでは Base32/Base64 を使ってデータをエンコードするため、エントロピーの高いサブドメイン文字列が生成されます。サブドメインのラベルのシャノンエントロピーを計算します。値が 3.5 ビット/文字を超える場合、エンコードされたデータである可能性が高いことを強く示します。
- ドメインごとの一意なサブドメイン数を数える:正規のドメインに含まれる一意なサブドメインは比較的少数です。DNS トンネリングでは、単一の親ドメインの下に数百から数千の一意なサブドメインが生成されます。
- DNS レコードタイプの分布を監視する:TXT、NULL、CNAME、MX レコードは、A レコードより多くのデータを運べます。単一ドメインへの TXT クエリが過剰な場合、DNS を介したデータ転送が示唆されます。
- クエリ数の多さを検出する:特にサブドメインの一意性の高さを伴う場合、単一の送信元から 1 時間に 100 件を超えるクエリを受信したドメインにフラグを付けます。
- クエリのタイミングを分析する:DNS トンネリングツールは、規則的なクエリパターン(ビーコン)やバーストパターン(データ転送)を生成します。DNS クエリのタイムスタンプに頻度分析を適用します。
- conn.log と相互参照する:DNS クエリを接続メタデータと関連付けて、不審なクエリを生成しているプロセスまたはエンドポイントを特定します。
- ドメインインテリジェンスで検証する:不審なドメインを WHOIS データ、証明書の透明性データ、脅威インテリジェンスフィードと照合します。
主な概念
| 概念 | 説明 |
|---|---|
| T1071.004 | アプリケーション層プロトコル:DNS |
| T1048.003 | 代替プロトコルを介したデータ流出:DNS |
| T1572 | プロトコルトンネリング |
| シャノンエントロピー | サブドメイン文字列のランダム性の尺度 |
| Zeek dns.log | DNS クエリ/応答のメタデータ |
| RITA | Zeek ログから DNS トンネリングを自動検出 |
| iodine | IPv4-over-DNS トンネリングツール |
| dnscat2 | DNS ベースのコマンド&コントロールツール |
| DNSExfiltrator | DNS リクエストを使ったデータ流出ツール |
検出クエリ
Zeek スクリプト -- DNS トンネルの検出
@load base/protocols/dns
module DNSTunnel;
export {
redef enum Notice::Type += { DNSTunnel::Long_DNS_Query };
const query_length_threshold = 50 &redef;
const query_count_threshold = 100 &redef;
}
event dns_request(c: connection, msg: dns_msg, query: string, qtype: count, qclass: count) {
if ( |query| > query_length_threshold ) {
NOTICE([$note=DNSTunnel::Long_DNS_Query,
$msg=fmt("Long DNS query detected: %s (%d chars)", query, |query|),
$conn=c]);
}
}
Splunk -- Zeek による DNS トンネリングの指標
index=zeek sourcetype=bro_dns
| rex field=query "(?<subdomain>[^.]+)\.(?<basedomain>[^.]+\.[^.]+)$"
| stats count dc(subdomain) as unique_subs avg(len(query)) as avg_len max(len(query)) as max_len by src basedomain
| where count > 100 AND (unique_subs > 50 OR avg_len > 40)
| sort -unique_subs
Splunk -- エントロピーの高いサブドメインの検出
index=zeek sourcetype=bro_dns
| rex field=query "^(?<subdomain>[^.]+)"
| where len(subdomain) > 20
| eval char_count=len(subdomain)
| stats count dc(query) as unique_queries avg(char_count) as avg_sub_len by src query_type_name basedomain
| where unique_queries > 30 AND avg_sub_len > 25
| sort -unique_queries
RITA による分析
rita import /path/to/zeek/logs dataset_name
rita show-dns-fqdn-ips-long dataset_name
rita show-exploded-dns dataset_name
rita show-dns-tunneling dataset_name --csv > dns_tunnel_results.csv
よくあるシナリオ
- dnscat2 C2:Base64 でエンコードしたサブドメインラベルを含む DNS CNAME/TXT クエリに、コマンド&コントロールのトラフィックをエンコードします。クエリ数が多く、長さとエントロピーが高いサブドメインが生成されます。
- iodine IPv4 トンネル:DNS を介してすべての IP トラフィックをトンネリングする仮想ネットワークインターフェースを作成します。NULL レコードタイプを使った大量の DNS クエリが生成されます。
- DNS を介したデータ流出:機密データをサブドメインラベル(例:
aGVsbG8gd29ybGQ.exfil.attacker.com)にエンコードし、A または TXT クエリとして送信します。各クエリで約 63 バイトのデータを運べます。 - DNS-over-HTTPS トンネリング:DNS クエリを HTTPS でパブリックリゾルバー(8.8.8.8、1.1.1.1)に送信し、従来の DNS 監視を回避します。検出には TLS インスペクションが必要です。
- Cobalt Strike DNS ビーコン:設定可能なサブドメインのエンコード方式を使い、DNS A/TXT レコードで C2 通信を行います。
出力形式
Hunt ID: TH-DNSTUNNEL-[DATE]-[SEQ]
Source IP: [Internal IP]
Source Host: [Hostname]
Target Domain: [Base domain]
Query Count: [Total queries in window]
Unique Subdomains: [Count]
Avg Query Length: [Characters]
Max Query Length: [Characters]
Subdomain Entropy: [Bits per character]
Primary Record Type: [A/TXT/CNAME/NULL]
Data Volume Estimate: [Bytes exfiltrated]
Risk Level: [Critical/High/Medium/Low]
コメント
Markdown 対応