【入門編】 ネットワーク接続情報のメモリ抽出:アクティブなC2通信の特定 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

こんにちは!日々の開発やインフラの管理、本当にお疲れ様です。

「サーバーがなんだか重い気がする…」「もしかして、どこかから不正なアクセスを受けているのでは?」
そんな不安な瞬間、エンジニアなら一度は経験したことがあるのではないでしょうか。

今回は、セキュリティの現場で私たちが最も頼りにする「メモリフォレンジック」という手法を使って、パソコンの奥深くでコソコソと悪事を働く「攻撃者のC2(Command and Control)サーバーとの通信」を暴き出す方法を、一緒に優しく紐解いていきましょう!

難しい専門用語が出てきても大丈夫です。身近な例えを交えながら一歩ずつ進めていきますので、安心してついてきてくださいね。

—

1. 家の鍵に例える「メモリ」と「ネットワーク接続」のお話

まずは、私たちが普段使っているパソコンやサーバーの状態を、ちょっと「一軒家」に例えて考えてみましょう。

パソコンの電源が入っているとき、メモリ(RAM)という記憶領域の上では、たくさんのプログラムが動き回っています。これは、いわば「家の中で家族がバタバタと動き回り、テーブルの上に今の予定表やメモを広げている状態」です。

そして、ネットワーク接続(通信)は、その家から外の誰かに宛てて出している「手紙」や「電話のつながり」のようなものです。

泥棒が残す「見えない電話のつながり」

もし、悪い人(攻撃者)があなたのパソコンに侵入してしまったらどうなるでしょう?
彼らはパソコンの中を荒らすだけでなく、遠く離れた自分たちの拠点(これがC2サーバーです。司令塔だと思ってください)とこっそり電話回線をつなぎ、「次の命令をくれ!」「このデータを盗み出したぞ!」とやり取りを始めます。

厄介なことに、泥棒は帰るときに自分たちの足跡をキレイに消してしまいます。通常の画面(タスクマネージャーなど)を見て、「変な通信はないな」と思っても、それは巧妙に隠されているだけかもしれないのです。

そこで登場するのが「メモリフォレンジック」!

泥棒がどれだけ上手に足跡を消そうとも、パソコンが動いている最中、メモリ(家のテーブルの上)には、必ず「誰と電話をつないでいたか」の通話履歴や配線の痕跡が残ってしまいます。

電源を切ってしまうと、テーブルの上のメモはすべて消え去ってしまいますが、電源が入っている「その瞬間」のメモリをそっくりそのまま保存し、顕微鏡で覗き見るように解析するのがメモリフォレンジックなんです。

—

2. 実践! Volatility でネットワークの痕跡を暴く

メモリから情報を抜き出すために、セキュリティエンジニアの間でデファクトスタンダード(事実上の標準)となっているツールが Volatility(ボラティリティ) です。

今回は、怪しい挙動をしているサーバーから事前に採取したメモリのデータ(イメージファイル)を手に入れたと仮定して、ネットワークのつながりを調べる魔法の呪文(コマンド)を見ていきましょう。

netscan プラグインを使ってみよう

メモリの中に残されたネットワーク接続の履歴を探すには、netscan という機能(プラグイン)を使います。

黒い画面(コマンドプロンプトやターミナル)に、以下のようなコマンドを入力します。

# ボラティリティを使ってメモリ上のネットワーク接続(ソケット情報)をスキャンするコマンド
python vol.py -f suspicious_memory.raw --profile=Win10x64_19041 netscan
  • -f suspicious_memory.raw: 調査対象となるメモリのファイル名を指定しています。
  • --profile=Win10x64_19041: 調査するパソコンのOSの種類(Windows 10の特定バージョンなど)を伝えています。
  • netscan: これが今回の主役!メモリ上に残るネットワークの接続履歴を探してね、という命令です。

—

3. 画面に出てきた怪しい数字の見方

コマンドを実行すると、たくさんの英語や数字がずらーっと画面に流れてきます。初めて見る時は圧倒されてしまうかもしれませんが、見るべきポイントは実はとてもシンプルです。

出力結果は、だいたい次のような形をしています。

Offset(P)          Proto    Local Address & Port          Foreign Address & Port        State            Pid   Owner
-----------------------------------------------------------------------------------------------------------------------
0x12345678         TCP      192.168.1.50:49152            203.0.113.55:4444             ESTABLISHED      4104  malware.exe

ここから、私たち探偵役のエンジニアが読み解くべき重要なヒントを分解してみましょう。

1. Local Address & Port (192.168.1.50:49152)

  • あなたのパソコン(社内サーバー)のIPアドレスと、通信に使っているポート番号(出口の番号)です。

2. Foreign Address & Port (203.0.113.55:4444)

  • 通信の相手先(接続先)のIPアドレスとポート番号です。ここが一番の注目ポイント! 見覚えのない海外のIPアドレスだったり、後述する「怪しいポート番号」だったりする場合は赤信号です。

3. State (ESTABLISHED)

  • 通信の状態を表します。「ESTABLISHED」は、現在まさに「つながっている(通話中)」状態を意味します。

4. Owner (malware.exe)

  • その通信を行っている「犯人(プログラムの名前)」です。ここにしれっと見慣れない名前や、本来そんな通信をするはずのないプログラム(例: notepad.exe(メモ帳)など)の名前があったら、ほぼ間違いなくアウト(不正アクセス)です。

—

4. 攻撃者がよく使う「怪しい目印」に気づこう

実務でメモリ解析を行う際、攻撃者のC2サーバーを見つけるために私たちがアンテナを張っている「よくある特徴」をいくつかシェアしますね。

① ポート番号「4444」や「8080」「31337」の影

セキュリティの世界では、攻撃ツール(Metasploitなど)の初期設定として「4444」というポート番号がよく使われます。また、企業のファイアウォールをすり抜けるために、あえてウェブ通信のふりをした「80番」や「443番」を使うことも多いです。
「このプログラム、なんでこんな夜中に見知らぬ海外のサーバーと4444番でつながっているんだろう?」という違和感に気づけるかどうかが、エンジニアの腕の見せ所です。

② 親子関係の不自然さ

メモリからは、「どのプログラムが、どのプログラムを起動したか(プロセスの親子関係)」も調べることができます。
例えば、会社の業務で使っているエクセル(excel.exe)から、黒い画面のコマンドプロンプト(cmd.exe)が起動され、そこから外部へのネットワーク接続が生まれていたとしたら……?
これは、メールに添付された悪意あるファイルを開いてしまい、そこから裏でこっそり外部と通信を始められた典型的なシナリオです。

—

5. まとめと、明日からできる一歩

いかがでしたでしょうか?
ネットワーク接続情報のメモリ抽出(netscanの活用)は、一見すると難しそうに見えますが、やっていることは「パソコンが現在進行形で誰とつながっているのかの『電話帳の履歴』をこっそり覗き見ること」です。

もし実務で「なんだかサーバーの動きが怪しいな」と感じたら、慌てて電源を切ってしまうのではなく、まずは今回ご紹介したようなメモリフォレンジックの可能性を思い出してみてください。電源を切ってしまうと、せっかくの「通話履歴」が消えてしまいますからね!

日々のインフラ構築や開発の中でも、「このサーバーは普段、どこのIPアドレスと通信するのが『普通』なのか」を意識しておくことが、いざという時の素早い異常発見につながります。

焦らず、一歩ずつ、安全なシステム環境を作っていきましょう!それではまた次回のセキュリティ解説でお会いしましょう。

コメント

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