【入門編】 メモリ上のネットワークソケット情報抽出とC2通信の特定 – インシデントレスポンス & フォレンジック(DFIR)防御ガイド

こんにちは!セキュリティやインフラの現場に飛び込んだばかりの頃って、専門用語の壁にぶつかって「何から手を付けたらいいんだろう…」と途方に暮れてしまいますよね。

今回は、インシデントレスポンス(事故調査)の現場で私たちが一番最初に行うことの多い、「メモリフォレンジックを使った怪しい通信の見つけ方」についてお話しします。

難しそうに聞こえるかもしれませんが、身近な「防犯」の仕組みに例えながら一歩ずつ優しく紐解いていきますので、安心してついてきてくださいね!

—

家の鍵と泥棒に例える「メモリフォレンジック」

突然ですが、みなさんのご自宅を想像してみてください。夜中に玄関の鍵はしっかり閉めました。でも、もし泥棒が家に侵入してきて、リビングのテーブルの引き出しをあさり、どこかの誰かとこっそり電話で連絡を取り合っていたとしたら……?

警察(私たちセキュリティアナリスト)が駆けつけたとき、泥棒はすでに逃げているかもしれません。でも、「いま誰と電話で話していたか」という通話履歴や、テーブルに残されたメモを見れば、泥棒がどこに連絡しようとしていたのかがわかりますよね。

コンピュータの世界でも全く同じことが起きるんです。

  • コンピュータ(パソコンやサーバー) = あなたの家
  • メモリ(RAM:作業用の机) = リビングのテーブル
  • 不審な通信(C2サーバーとの通信) = 泥棒がこっそり外の仲間と話している電話

電源を切ってしまうと、メモリ(テーブル)の上のデータはすべて消えてしまいます。だからこそ、電源が入ったままの状態(あるいはメモリが保存された「メモリダンプ」という状態)から、「今、誰と通信しているか(ネットワークソケットの情報)」を抜き出す技術が、私たちインシデントレスポンスの現場ではとても重要になってくるんです。

—

メモリ上の「ネットワークソケット」ってなに?

少しだけ技術的なお話をしますね。
私たちが普段、ブラウザでウェブサイトを見たり、チャットアプリを使ったりするとき、パソコンは外部のサーバーと「ここをつないでくださいね」という目に見えない通路を作ります。これがネットワークソケット(TCP/UDP接続)です。

悪意のあるプログラム(マルウェア)がパソコンに侵入すると、こっそり裏側で外部の司令塔(これをC2サーバー:Command and Controlサーバーと呼びます)と接続を確立し、「準備完了したよ、指示をちょうだい!」と待ち構えます。

この時、メモリの中には「どのプログラムが、どこの怪しいIPアドレスとつながっているか」というリストが必ず足跡として残ります。今回はその足跡を見つけ出す方法を見ていきましょう。

—

実践!メモリから怪しい通信を暴き出す手順

現場の調査では、オープンソースの強力なメモリ解析ツールである Volatility(ボラティリティ) というツールをよく使います。

今回は、Windowsのメモリダンプファイル(memdump.raw とします)から、アクティブなネットワーク接続の一覧を抜き出す手順を、分かりやすいコマンドと共にご紹介しますね。

1. 接続一覧を抽出する基本のコマンド

まずは、メモリ上に残っているすべてのネットワーク接続(TCPやUDPのソケット)のリストを引っ張り出してみましょう。

# Volatilityを使ってネットワーク接続の一覧(netscanプラグイン)を取得するコマンド
python vol.py -f memdump.raw --profile=Win10x64_19041 netscan

このコマンドを実行すると、以下のようなずらっとしたリストが画面に表示されます。

  • Offset: メモリ上のどこにそのデータが存在するか
  • Proto: プロトコル(TCPv4やUDPv4など)
  • Local Address: パソコン側のIPアドレスとポート番号
  • Foreign Address: 接続先のIPアドレスとポート番号(★ここが一番重要!)
  • State: 接続の状態(ESTABLISHED=つながっている、LISTENING=待ち受け中など)
  • Pid / Process: その通信を行っているプログラムのプロセスIDと名前

—

2. 怪しい通信を見分けるための「3つのチェックポイント」

抽出したリストを見るとき、私たちは次のようなポイントに注目して「怪しいかどうか」を判断しています。

1. 見覚えのない外部IPアドレスとつながっていないか?

  • 社内のシステムや、よく知るクラウドサービス(MicrosoftやGoogleなど)以外の、聞いたこともない海外のIPアドレスと ESTABLISHED(接続中)になっていないかチェックします。

2. 身元不明のプログラム(プロセス)が通信していないか?

  • 例えば、普段は使わないようなランダムな英数字のファイル名(例: a1b2c3.exe)や、Windowsの正当なシステム名を装った偽物のプログラム(例: svchost.exe なのに変な場所から実行されている)が通信の主になっていないかを確認します。

3. 不自然なポート番号を使っていないか?

  • 通常のウェブ閲覧(80番や443番ポート)とは違う、見たこともない高い番号や、攻撃者がよく使う特定のポートになっていないか疑います。

—

3. 怪しいプログラムの正体をさらに深掘りする

もし「おや、この通信先とプログラムは怪しいぞ」というものが見つかったら、今度はそのプログラムがメモリ上で何をしているのかをさらに詳しく調べます。

例えば、怪しいプロセスのID(PID)が 3456 だったとしましょう。そのプロセスの実行ファイルがどこにあったのかを調べるには、次のようなコマンドを使います。

# 指定したプロセスID(PID: 3456)の実行パスや起動引数を調べるコマンド
python vol.py -f memdump.raw --profile=Win10x64_19041 cmdline -p 3456

これで、その怪しいプログラムが「パソコンのどこに隠れていて、どんな命令で動いたのか」のしっぽを掴むことができます。

—

一歩ずつ対策を学んでいきましょう!

メモリフォレンジックというと、何やら黒い画面に難しい文字がたくさん流れて、天才ハッカーしかできない特殊な技のように思えるかもしれません。

ですが、基本にあるのは「お部屋(メモリ)に残された足跡(通信ログ)を一つずつ丁寧に探していく」という、とても地道で泥臭い作業です。

今回のポイントをまとめると:

  • 電源を切ると消えてしまうメモリには、「今誰とつながっているか」という貴重な通信の足跡が残っている。
  • Volatilityなどのツールを使ってネットワーク接続一覧(netscan)を抽出し、見知らぬIPや怪しいプログラムを見つけ出す。
  • 見つけた怪しいプロセスをさらに深掘りして、攻撃の痕跡を突き詰める。

最初はコマンドのオプションを覚えるだけでも大変だと思いますが、焦る必要は全くありません。一つひとつ、実際のインフラや開発の現場で試しながら、確実にスキルを自分のものにしていきましょうね。

あなたのセキュリティエンジニアとしての第一歩を、心から応援しています!

コメント

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