ネットワーク運用の現場に身を置いていると、夜中に突然「社内セグメントから妙な通信が出ている」「なんだかファイルサーバの動きがおかしいぞ」というアラートが飛んできたりしますよね。そんな時、私たちNOCのエンジニアが頼るべき相棒は、単なる勘や経験ではなく、冷徹な「パケットの記録」です。
今回は、パケットキャプチャの山から、怪しいホストの正体や、やり取りされたファイルを鮮やかに掘り起こす「フォレンジック的アプローチ」について、現場の空気感を交えながら優しく紐解いていきたいと思います。
一歩ずつ、一緒に理解していきましょう!
—
1. パケットキャプチャの世界は「巨大な郵便局」
ネットワークを流れるデータ(パケット)を覗き見ると聞くと、何やら難解な暗号の解読のように思えるかもしれません。でも、難しく考える必要はありません。ネットワークの本質は「郵便配達」と全く同じです。
私たちが普段使っているパソコンやスマホは、宛先と差出人の書かれた「封筒(パケット)」を世界中に送り出しています。
通常の ping や traceroute は、「あそこに手紙が届くかな?」と確認する不在票のようなもの。一方で、今回お話しするパケットキャプチャは、「郵便局の仕分け棚にカメラを置いて、通過したすべての手紙のやり取りを記録する」ような作業になります。
インシデント(障害やセキュリティ事故)が起きたとき、この「記録された郵便の束(PCAPファイル)」から、犯人(不正なホスト)の足跡をたどり、中身の荷物(流出したファイル)を丸裸にするのが、今回のテーマであるフォレンジック調査なのです。
—
2. コマンドラインとGUIのハイブリッド:NetworkMinerの立ち位置
パケット解析の王様といえば Wireshark ですよね。画面いっぱいに広がるパケットの一覧を眺めているだけで、コーヒーが何杯も進んでしまう名作ツールです。
しかし、実際の現場では「何ギガバイトもある巨大なPCAPファイルから、瞬時に怪しいファイルだけをごっそり抜き出したい!」というスピード感が求められます。そこで登場するのが、パケット解析の強力な補助ツール、NetworkMiner のようなセッション・ホスト抽出ツールです。
NetworkMiner(今回はコマンドラインからも活用できる側面や、フォレンジック的なデータ抽出の思想にフォーカスします)は、郵便局のカメラ映像から「誰が、誰に、どんな荷物を送ったのか」を自動で整理し、以下のような情報を綺麗にまとめてくれます。
- 通信しているホストのOS(Windowsなのか、Linuxなのか、スマホなのか)
- やり取りされた画像、ドキュメント、実行ファイルなどの「実体」
- どのセッション(会話)でそれがやり取りされたか
なぜOSの推定ができるのか?
「相手がどのOSを使っているかなんて、どうやって分かるの?」って思いますよね。
これは、人間で言うところの「方言」や「歩き方の癖」のようなものです。TCP/IPの通信を始めるとき(3ウェイハンドシェイク)、最初に交わす挨拶のパケットにある細かい設定値(ウィンドウサイズやパケットのオプションなど)は、OSによって好みが分かれます。
「あ、この歩き方はWindows 10のそれだな」「こっちは最新のLinuxカーネルの癖だ」というのを、ツールが瞬時に見抜いて教えてくれるわけです。
—
3. 実践!CLI補助ツールとPythonで実現するフォレンジック的アプローチ
GUIツールも便利ですが、インフラエンジニアたるもの、CUI(コマンドライン)を組み合わせて自動化したり、サクッと情報を引き出したりするロマンを忘れてはいけません。
ここでは、キャプチャファイル(traffic.pcap)から、Pythonのライブラリ(dpkt や scapy など)の思想を借りて、ホスト情報やセッションを抽出するイメージをコードで覗いてみましょう。
import dpkt
import socket
def analyze_pcap(file_path):
"""
PCAPファイルを読み込み、通信しているIPアドレスと
推測されるセッションの情報を簡易抽出するスクリプトのイメージ
"""
print(f"[*] 解析対象のファイル: {file_path} の読み込みを開始します...")
try:
with open(file_path, 'rb') as f:
pcap = dpkt.pcap.Reader(f)
host_list = set()
for timestamp, buf in pcap:
# イーサネットフレームをデコード
eth = dpkt.ethernet.Ethernet(buf)
# 中身がIPパケットかどうかをチェック
if not isinstance(eth.data, dpkt.ip.IP):
continue
ip = eth.data
src_ip = socket.inet_ntoa(ip.src)
dst_ip = socket.inet_ntoa(ip.dst)
# 登場したIPアドレスをセットに蓄積
host_list.add(src_ip)
host_list.add(dst_ip)
print(f"\n[+] 検出されたユニークなホスト数: {len(host_list)}")
print("[+] 検出されたホスト一覧:")
for host in host_list:
print(f" - 1台のホストを確認: {host}")
except FileNotFoundError:
[-] print("エラー: 指定されたキャプチャファイルが見つかりません。パスを確認してください。")
if __name__ == "__main__":
# 実際の現場ではここに調査対象のダンプファイルを指定します
analyze_pcap("incident_sample.pcap")
このように、コードを書くことで「大量のパケットから、まずはノイズを削ぎ落として主要なプレイヤー(IPアドレス)を洗い出す」という初動対応を素早く行うことができます。
—
4. 現場の教訓:慌てず、騒がず、証拠を保全する
ネットワーク障害やセキュリティインシデントの現場に直面すると、焦ってその場で対象のサーバーを再起動してしまったり、パケットの記録を取る前に回線を切断してしまったりしがちです。
ですが、私たちシニアエンジニアが口を酸っぱくして後輩に伝えるのは、「フォレンジックの基本は、証拠の保全(ノーインバージョン:現状維持)」ということです。
1. まずはパケットをキャプチャし続ける(またはダンプファイルを安全な場所にコピーする)
2. NetworkMiner や解析スクリプトを使って、オフライン環境でホストやファイルの抽出を行う
3. OSの推定や、やり取りされたファイルの中身(本当に機密情報が盗まれたのか、あるいは単なるノイズなのか)を冷静に突き止める
このステップを踏むことで、闇雲にパケットの海を泳ぐのではなく、ピンポイントで「あ、こいつが犯人のセッションだ」と特定できるようになります。
—
おわりに
今回は、CLI補助ツールやフォレンジック的アプローチの考え方について、郵便配達のたとえを交えてお話ししました。
最初は難しく見えるパケットの解析も、「誰が、どこから、何を運んできたのか」というストーリーを追う視点を持つと、途端にミステリー小説のように面白くなってきます。日々の運用監視の中で、ぜひ「パケットの裏側にある物語」を読み解く楽しさを感じてみてくださいね。
それでは、次のNOCの現場でお会いしましょう!
コメント