メモリフォレンジック係備忘録として残しておく。
どういうテクニックなのか
簡単にいうと、なんでもいいから特定の文字列をもとに、その文字列を使ったプロセスを特定するということ。
タイトルではドメインとなっているが、実際には、ドメインやURLのような通信に関わるものでもいいし、それ以外の画面描画される文字でもいいし単なる内部データでもいい。
むしろ文字列である必要もなく、理論上バイナリ列でもいい。
なんだかよくわからないと思うので、使いみちとして一例を挙げると
- インシデントレスポンスで、悪性通信先のドメインやURLをもとに、そこに通信をしたプロセスを特定する
- 特定のユーザ名を使用したプロセスを特定する
- 特定のファイルにアクセスしたプロセスを特定する
- 特定のパス情報をヒープ上に展開したプロセスを特定する
といった使い方ができそうだ。
アプローチとしてはメモリダンプに対するメモリフォレンジック。
結構簡単にできるので、(信頼性はさておき)やってみると面白いかもしれない。
プロセスの特定手法
前提条件
今回の手法はWindows10Homeのメモリを対象にしている。
LinuxやMacは試していない。
また、成功するためには
- メモリダンプの保全
- ダンプ取得時に対象のプロセスが終了していないこと
が条件となる。
特定の流れ(理論)
メモリダンプに対して以下の流れで解析を行う。
- メモリ上の仮想アドレスをターゲットとして、検索対象の文字列があるかどうかスキャンする
- 検索対象文字列を含む仮想アドレス特定
- 各プロセス(PID)に割り当てられたVAD範囲を特定
- 特定した仮想アドレスとプロセスを紐づけする
結構シンプルよね。
使用するツール
Volatility3でOK。(うさみみハリケーンで全部やって地獄を見た)
え、なに?Volatility3インストールしてない?
今すぐREMnuxダウンロードしよう。
実行例
サンプルメモリダンプの作成
まずは解析用のサンプルを作る。
今回は、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をインストールするだけでいいのでお手軽だしお金もかからない。
ただ、メモリダンプを瞬間証拠保全しないといけないかったり、時間がたったりプロセスが閉じられると途端に難しくなるなど、前提条件が少し厳しめなのがネック。
コメント