【実務・中級編】 SMBプロトコルにおける横展開(Lateral Movement)の痕跡抽出 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

現場の最前線で語る:SMB経由の横展開(Lateral Movement)を「見逃さない」ための鉄則

インシデントレスポンスの現場で、侵入された後の調査を行うと、攻撃者がいかに「静かに」ネットワーク内を移動しているかに驚かされる。特に、多くのエンジニアが「信頼できる管理ツール」と盲信している PsExec や WMI を悪用したSMB経由の横展開は、まさに盲点だ。

今回は、彼らがどのような足跡を残し、我々がそれをどう封じ込めるべきか、現場の泥臭い知見を共有しよう。

—

1. 攻撃者が好む「正規ツール」の影

攻撃者は新たなマルウェアを持ち込むよりも、OSに標準装備されている機能を悪用する(Living off the Land)。

  • PsExec: サービスをリモートで作成・実行する。SMB経由で ADMIN$ 共有にバイナリを投下し、サービス制御マネージャー経由で実行する。
  • WMI (Windows Management Instrumentation): ネットワーク越しにコマンドを実行する。wmiexec.vbs 等のツールを使えば、ログを残さずメモリ上でプロセスを起動できるため、痕跡が残りづらい。

これらが実行されるとき、ネットワークトラフィック上では必ず SMB(TCP/445) の不自然な通信パターンが発生する。具体的には、特定のホストから短時間に大量の Tree Connect リクエストや、svcctl(サービス制御)パイプへのアクセスが観測されるはずだ。

—

2. ネットワーク検知の勘所

インシデント発生時、まずはネットワークパケット(PCAP)やログから以下のパターンを抽出する。

1. 特定ホストからの急激なトラフィック増: 普段通信しないクライアント同士が445番ポートで頻繁にやり取りしている。
2. パイプ名の異常: SMBのパイプ名に \pipe\svcctl や \pipe\atsvc が頻出していないか。これらはリモート実行のサインだ。
3. 認証の爆発: 同じアカウントで、短期間に多数のホストへ認証試行が行われている。

—

3. 防御の要:横展開を許さない実装と設定

「検知」も大事だが、そもそも「横展開を物理的に封じる」のが一番の防御だ。ここでは、Webアプリケーションやインフラ設定レベルでできる最強の策を紹介する。

3.1 Nginx/WAFでのSMB踏み台防止策

Webアプリケーションが万が一侵害された際、サーバー自体がSMBの踏み台にされないよう、Egress(外向き)通信を制限するのが鉄則だ。

# Nginx設定例:許可されていないIP以外へのSMB通信をフィルタリングする概念
# 注意: Nginx単体でSMBを制御するのではなく、iptablesやクラウドのセキュリティグループで制御するのが正攻法。
# 以下は、Webアプリケーションから不要なポートへの通信を制限するiptablesの設定イメージ
# サーバーから内部ネットワークへの445番ポート(SMB)への通信を全遮断
# Webサーバーがファイルサーバーの役割を持たない限り、この通信は不要であるはずだ
sudo iptables -A OUTPUT -p tcp --dport 445 -j DROP
sudo iptables -A OUTPUT -p tcp --dport 139 -j DROP

3.2 セキュアな認証実装(Python例)

もしあなたが内部管理用のツールを開発しているなら、PsExec のような危険な認証は避け、常に証明書ベースの認証や制限されたAPIを利用すべきだ。

import subprocess
import logging

# 危険なコマンド実行のラッパー(PsExecの代わりにセキュアな設計を考える)
def secure_remote_command(target_ip, command):
    """
    PsExec等のSMB直叩きは避け、認証されたAPIまたはSSH経由の限定的コマンド実行のみを許可する設計
    """
    allowed_commands = ["/usr/bin/status_check", "/usr/bin/disk_usage"]
    
    if command not in allowed_commands:
        logging.error(f"不正なコマンドが要求されました: {command}")
        return False
    
    # 実際にはSSHの鍵認証などを利用したセキュアな通信経路を構築すること
    print(f"安全な経路で {target_ip} に対して {command} を実行します...")
    return True

# 使用例
secure_remote_command("192.168.1.50", "/usr/bin/status_check")

—

4. セキュリティチーフからのアドバイス:盲点を突く

多くのエンジニアが陥る罠は、「自分の管理下にある端末は安全だ」と思い込むことだ。

  • 特権アカウントの使い回しを禁止せよ: 横展開の最大の燃料は、管理者権限を持ったアカウントのパスワードがメモリ上に残っていることだ。LAPS (Local Administrator Password Solution) の導入は必須と言ってもいい。
  • 「見えない通信」を可視化せよ: EDRの導入はもちろんだが、ネットワークのセグメンテーション(マイクロセグメンテーション)を行い、「クライアント同士の通信」をデフォルトで禁止する設計が、攻撃者の動きを物理的に阻害する。

「PsExecを検知する」のは対処療法に過ぎない。「そもそもSMBによるリモート実行が不可能な環境を作る」ことこそが、攻撃者を最も落胆させる防御術だ。

次のインシデントが起きる前に、まずは自身のネットワーク内の445番ポートが「誰と誰の間で会話しているか」を調べてみてほしい。そこに、あなたの組織の最大の脆弱性が隠れているはずだ。

コメント

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