特定のドメインに通信したプロセスをメモリから特定する方法【メモリフォレンジック】

フォレンジック
この記事は約5分で読めます。

メモリフォレンジック係備忘録として残しておく。

どういうテクニックなのか

簡単にいうと、なんでもいいから特定の文字列をもとに、その文字列を使ったプロセスを特定するということ。
タイトルではドメインとなっているが、実際には、ドメインやURLのような通信に関わるものでもいいし、それ以外の画面描画される文字でもいいし単なる内部データでもいい。
むしろ文字列である必要もなく、理論上バイナリ列でもいい。

なんだかよくわからないと思うので、使いみちとして一例を挙げると

  • インシデントレスポンスで、悪性通信先のドメインやURLをもとに、そこに通信をしたプロセスを特定する
  • 特定のユーザ名を使用したプロセスを特定する
  • 特定のファイルにアクセスしたプロセスを特定する
  • 特定のパス情報をヒープ上に展開したプロセスを特定する

といった使い方ができそうだ。

アプローチとしてはメモリダンプに対するメモリフォレンジック。

結構簡単にできるので、(信頼性はさておき)やってみると面白いかもしれない。

プロセスの特定手法

前提条件

今回の手法はWindows10Homeのメモリを対象にしている。
LinuxやMacは試していない。

また、成功するためには

  • メモリダンプの保全
  • ダンプ取得時に対象のプロセスが終了していないこと

が条件となる。

特定の流れ(理論)

メモリダンプに対して以下の流れで解析を行う。

  1. メモリ上の仮想アドレスをターゲットとして、検索対象の文字列があるかどうかスキャンする
  2. 検索対象文字列を含む仮想アドレス特定
  3. 各プロセス(PID)に割り当てられたVAD範囲を特定
  4. 特定した仮想アドレスとプロセスを紐づけする

結構シンプルよね。

使用するツール

Volatility3でOK。(うさみみハリケーンで全部やって地獄を見た)

え、なに?Volatility3インストールしてない?
今すぐREMnuxダウンロードしよう。

REMnux: A Linux Toolkit for Malware Analysts

実行例

サンプルメモリダンプの作成

まずは解析用のサンプルを作る。

今回は、VirtualBox上のwindows10homeで、Chromeを起動してhttps://muchipopo.comにアクセス後、FTKImagerでメモリダンプを作った。

VADに対する文字列スキャン

まずはステップ1「仮想アドレスをターゲットに検索対象の文字列があるかどうかスキャンする」を行う。

具体的には、「muchipopo.com」を検索文字列にする。

こういうとき、文字列検索ツールに何を使うか悩むところだ。
Strings?grep?それともほかのツール?

ということで、結局はYaraを採用。
理由は簡単でVolatlility3に最初から入っているし、Yaraルールもあって拡張性も高いから。
(取り掛かり始めた当初は別のスキャン方法を考えていて、メモリフォレンジックツールとの食い合わせなんかで無間地獄に足を踏み入れて後悔した。)

さて、Volatility3でのYaraスキャンは以下のように実行できる。
ワンライナースキャンさせていただけることに、超モウレツ感謝である。

ちなみに対象はノーマルアドレスとVADとを選べるが、VADを選択する。
今回は仮想アドレスからのアプローチをするからだ。

以下の画像では文字コードに指定をしていないため、ASCII文字列を対象に抽出しているが、Unicodeも必要であれば–wideオプションを付ければOK。

しばらく待つとヒットした番地が出てくる。
この時点でPIDとして6832が見えているが、不安定なメモリデータなのでダブルチェックもかねてVADからのチェックもする。

これでステップ2「文字列を含む仮想アドレス特定」はOK。
ターミナルでの出力結果は、一応テキストに出力して保存しておくのがベスト。

VADツリー情報の抽出

お次はステップ3「各プロセス(PID)に割り当てられたVAD範囲を特定」となる。

これもVolatility3に感謝しながら出力しよう。

この出力結果のStartVPNとEndVPNの範囲がそのプロセスに割り当てられたVAD範囲となる。
ちなみにVPNはいつものVPNではなく、VirtualPageNumberなので注意。

その範囲にMappedAllocation(いろいろなファイル、主にdll)であったり、PrivateAllocation(主にヒープ)があるということだ。

これでステップ3は終了。
あと、結果はテキストに出力しておく。

情報の突合

ステップ4は「特定した仮想アドレスとプロセスを紐づけする」。

これは例で紹介。

以下の画像はステップ2で出力したテキストだ。
黄色塗りした「0x277000026b38」という仮想アドレス番地に「muchipopo.com」という文字があるということだ。

次に、先ほどステップ3で出力したVAD情報を調べる。
上の「0x277000026b38」を含むVAD範囲を割り当てられたプロセスを探していく。
目grepはちょっときついよ。

すると、PID:6832のchrome.exeが見つかった。
黄色塗している部分がそうで、確かに「0x277000026b38」がStart-End間に含まれている。

これで少なくとも、chrome.exeがmuchipopo.comという文字を操作していたのがわかる。

まとめ

簡単にだが備忘録として手順をまとめた。

ヒープあたりから文字列スキャンで情報を読み取り、プロセスと紐づけるというシンプルな手法だが、サイバーノーガード組織で端末の調査をする際には使える場面がある(かもしれない)。
dnscacheと紐づけるだけでもだいぶ違うんじゃないの?知らんけど。

解析環境としてはVirtualBoxにRemnuxをインストールするだけでいいのでお手軽だしお金もかからない。

ただ、メモリダンプを瞬間証拠保全しないといけないかったり、時間がたったりプロセスが閉じられると途端に難しくなるなど、前提条件が少し厳しめなのがネック。

コメント

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