【入門編】 DNS tunneling(DNSトンネリング)のパケット構造解析と不正検知 – サイバーセキュリティとプライバシー保護実践ガイド

こんにちは!企業のネットワークを守るセキュリティスペシャリストの私です。日々、巧妙化するサイバー攻撃の影を追いかけ、企業のインフラを守る最前線に立っています。

さて、ネットワークやセキュリティの世界に一歩足を踏み入れたばかりの皆さん、こんな疑問を持ったことはありませんか?
「ファイアウォールで厳重に守られた社内ネットワークから、どうやってマルウェアはこっそりデータを盗み出すんだろう?」って。

通常、企業のセキュリティゲートウェイは非常に優秀です。Web(HTTP/HTTPS)やメール以外の通信は、基本的にガチガチにブロックされています。じゃあ、攻撃者はどうやって外の悪意あるサーバー(C2サーバー)と会話するのでしょうか?

答えは、私たちが普段、当たり前のように使っている「DNS(ドメインネームシステム)」に隠されています。今回は、このDNSを悪用した隠し通路「DNSトンネリング」の仕組みと、そのパケットの裏側、そして現場での見破り方について、身近な例えを交えながら優しく紐解いていきましょう!一歩ずつ理解していけば、決して難しくありませんよ。

—

1. そもそもDNSってどんな仕組み?(身近な例えで理解しよう)

インターネットの世界で、私たちは「example.com」のような人間が覚えやすい名前を使ってウェブサイトにアクセスしますよね。でも、ルーターやコンピューターは「192.0.2.1」のような数字のIPアドレスしか理解できません。

ここで登場するのがDNS(Domain Name System)です。DNSは、いわば「インターネットの電話帳」です。
私たちが「example.comのIPアドレスを教えて!」と尋ねる(これをDNSクエリと呼びます)と、DNSサーバーが「それは192.0.2.1だよ」と教えてくれます。

郵便配達でイメージしてみましょう

DNSのやり取りを、手紙を送る郵便配達に例えてみましょう。

1. あなたは宛先の住所(IPアドレス)がわからないので、封筒の宛名書き(ドメイン名)のところに「example.comの住所を教えて」と書いて、最寄りの郵便局(社内のDNSサーバー)に投げ入れます。
2. 郵便局は、その手紙をインターネットという大きな配送網に乗せて、大元の案内所(権威DNSサーバー)まで届けます。
3. 案内所から返事が返ってきて、あなたの手元に住所が届きます。

通常、この手紙のやり取り(DNS通信)は、企業のセキュリティでも「絶対に止めちゃいけない必須の通信」として、ファイアウォールの穴が特別に開けられています。攻撃者は、この「誰も疑わない安全な通路」に目をつけたのです。

—

2. DNSトンネリングの正体:QNAMEに隠された秘密のメッセージ

では、マルウェアはこの安全な通路をどう悪用するのでしょうか?

先ほどの郵便配達の例を思い出してください。封筒の宛名(ドメイン名)には、普通は www.example.com のように書きますよね。
しかし、もし攻撃者のマルウェアが、盗み出した機密データ(パスワードやクレジットカード情報など)を、宛名の文字列の中にこっそり混ぜて送ってきたらどうでしょう?

例えば、こんな感じです:
秘密のデータ文字列.attacker.com

このドメイン名を受け取ったDNSサーバーは、「秘密のデータ文字列.attacker.com のIPアドレスを教えてね」というリクエストだと勘違いし、その問い合わせをインターネットの海を越えて、攻撃者が管理するDNSサーバー(権威DNSサーバー)へと転送してしまいます。

このドメイン名(QNAME:Query Nameと呼ばれる、問い合わせるドメイン名のフィールド)にデータを乗せて通信する手法を、DNSトンネリングと呼びます。

なぜこれが厄介なのか?

ファイアウォールは、「あ、これはただのDNSの問い合わせ(名前解決)だな」と思ってスルーしてしまいます。中身のデータが暗号化されていたり、アルファベットと数字の羅列(Base64エンコードなど)になっていたりすると、人間が見てもまさかデータが盗み出されているとは気づきません。まさに、郵便封筒の宛名書きの隙間に、極秘暗号を書き込んでこっそり外に持ち出すような巧妙な手口です。

—

3. パケットの裏側を覗いてみよう(パケット構造解析)

実際に、ネットワーク上を流れるDNSのパケットを、少しだけ覗き見してみましょう。難しいビット数や細かいヘッダーの仕様は置いておいて、注目すべきポイントはズバリ「QNAME(問い合わせる名前)」と「パケットの長さ(サイズ)」です。

通常のDNSクエリ:
www.google.com (スッキリしていて短い)

DNSトンネリングのDNSクエリ:
aHR0cHM6Ly9zZWNyZXQucGFzc3dvcmQub3JnCg==.attacker.com (前半の文字列がやけに長く、意味不明な英数字が続いている)

この長くて不自然な文字列こそが、マルウェアが社内から持ち出そうとしている機密データの断片です。DNSの規格上、ドメイン名の長さに一定の制限はありますが、攻撃者はギリギリの長さを攻めたり、何回も細かく分割して何度も問い合わせを繰り返したりして、大量のデータを外へ持ち出します。

—

4. 現場でどう見破る?ネットワーク異常検知のアプローチ

「じゃあ、こんな巧妙な手口、どうやって防げばいいの?」と不安になりますよね。ご安心ください!セキュリティエンジニアたちは、次のような視点でこの不正な通信をあぶり出しています。

① パケット長(サイズ)の異常

通常のDNSクエリは、そこまで長くありません。しかし、DNSトンネリングはデータを乗せるため、クエリのパケットサイズやURLの文字数が異常に長くなります。「やけに長い名前を調べるリクエストが多いな?」という傾向を見つけ出すのが第一歩です。

② 通信の頻度とボリューム

DNSの問い合わせは、通常であればユーザーがウェブサイトを開いた時や、システムが名前解決を行うタイミングで発生します。しかし、DNSトンネリングを使っているマルウェアは、データを細切れにして絶え間なく送り続けます。
「特定の外部ドメインに対して、数秒おきに何千回もリクエストが飛んでいるぞ」という頻度の異常は、強力な検知のシグナルになります。

③ 宛先ドメインの評判(レピュテーション)

問い合わせ先のドメインが、最近作られたばかりの怪しいものではないか、セキュリティベンダーのデータベースと照合します。

—

5. 実務で使える!Pythonを使った簡易DNSトラフィック分析のイメージ

インフラエンジニアやSOC(セキュリティオペレーションセンター)の現場では、こうした異常を検知するためにログ解析ツールやスクリプトを活用します。ここでは、Pythonを使って「DNSクエリの長さ」をチェックする簡単な概念実習コードを見てみましょう。

# ネットワークログからDNSクエリの長さを検査するサンプルスクリプト
# ※実務ではSIEMやIDS/IPSツールがこの処理を高速に行っています。

# 模擬的なDNSクエリのリスト(通常のものと、トンネリングが疑われるもの)
dns_queries = [
    "www.example.com",
    "api.service.internal",
    # 以下のクエリは、ベース64エンコードされたデータが含まれていると仮定
    "aHR0cHM6Ly9hHR0cHM6Ly9leGFtcGxlLmNvbQ==.evil-attacker-dns.com",
    "update.os.net"
]

# 異常検知のための閾値(文字数がこの長さを超えたら怪しいとみなす)
THRESHOLD_LENGTH = 50

print("=== DNSクエリの異常検知スキャンを開始します ===\n")

for query in dns_queries:
    query_length = len(query)
    
    # 簡易的な判定ロジック
    if query_length > THRESHOLD_LENGTH:
        print(f"[警告] 異常検知!怪しい長さのDNSクエリを発見しました。")
        print(f"       - クエリ名: {query}")
        print(f"       - 文字数: {query_length} 文字 (閾値: {THRESHOLD_LENGTH}文字超過)")
        print(f"       => 【対策】この端末のマルウェア感染や、外部C2通信の疑いを調査してください。\n")
    else:
        print(f"[正常] スムーズな通信です: {query} ({query_length}文字)")

print("=== スキャンが完了しました ===")

このように、コードで条件を定義してあげるだけで、異常な兆候を自動的に拾い上げることができます。現場のエンジニアは、こうした検知ロジックをファイアウォールやDNSサーバーのログ監視ツール(SplunkやElasticsearchなど)に組み込んで、日々の安全を守っているのです。

—

まとめ

いかがでしたでしょうか?今回は、一見難しそうな「DNSトンネリング」について、郵便配達の例えを交えながら紐解いてみました。

  • DNSトンネリングとは:ファイアウォールの目を盗み、DNSの「問い合わせる名前(QNAME)」にデータを隠して外部と通信するマルウェアの手口。
  • 見破るポイント:パケットやクエリの「長さ(サイズ)」、異常な「頻度」、そして「宛先の怪しさ」。
  • 防御へのアプローチ:インフラのログを監視し、こうした不審なパターンをいち早く検知する仕組みを作ることが重要。

セキュリティ対策は、目に見えないパケットの流れを想像する力から始まります。「なぜこの通信が発生しているのか?」という好奇心を大切に、一歩ずつ知識を深めていきましょう。皆さんのインフラライフが、より安全で楽しいものになることを応援しています!それではまた次の技術解説でお会いしましょう。

コメント

タイトルとURLをコピーしました