9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ZOZOAdvent Calendar 2024

Day 5

【続】SOCから始めるマルウェア解析

Last updated at Posted at 2024-12-04

これは ZOZO Advent Calendar 2024 カレンダーVol.1の5日目の記事です。昨日の投稿は@satto_sannさんでした。

はじめに

こちらの記事は昨年度の以下アドベントカレンダーで紹介した記事に関連する内容です。

SOCでは日々監視対応、インシデント対応を行なっています。その中ではファストフォレンジックを行う事も想定しなければなりません。前回の記事ではその一環として行っているマルウェア解析の一例を紹介しました。
また、世間で流行っているマルウェアを分析し動作をある程度把握しておくことはSOC対応の手助けになることも多いと思います。C2などのIOC情報を抽出してインジケータ登録しておくことも良いですね。

今回は前回紹介したマルウェア解析から少しだけ踏み込んだマルウェア解析のお話でもしようと思います。
(アンパックのお話です)

マルウェア解析で確認するポイント(おさらい)

マルウェア解析を行う際には以下のポイントを重点的に確認します。

  • マルウェアの通信先(C2アドレス)
  • 永続化設定(レジストリ操作など)
  • ファイル生成(第2のPayloadからファミリーの特定など)

それ以外の従来マルウェアとの違いを洗い出すといった動作は基本的にやりません。
※今回はWindowsマルウェアに焦点を当てていきます。

マルウェア解析で詰まる部分

前回の記事ではマルウェア解析をする際に動的解析を行い、実際にC2情報を抽出していました。
ですが、アンチデバッグやアンチVM検知技術を組み込んでいるマルウェアについては容易に動的解析を行うことが出来ません。

実際に解析する際はネットワーク的に閉じられた仮想環境で解析してください。
危ないです。

使われる技術

アンチデバッグやアンチVM検知で使われる技術を一部紹介します。

  • CPUやRAMのチェック(仮想環境は少ないので)
  • レジストリのチェック(HKLM\SOFTWARE\VMware, Inc.\VMware Toolsなど)
  • IsDebuggerPresentをコールしてデバッカチェック

これらを利用して解析されることを回避してきます。

アンチデバッグ検出ツール - AntiDebugSeeker

これらの技術が使われているかどうかを判断し、無力化すれば動的解析を行うことが出来ます。
アンチデバッグを簡単に検出することが出来るToolについてはLACさんの AntiDebugSeeker が役立ちます。

CODE BLUE 2024でも紹介されていましたがとても良さそうでした!
これを利用して無力化を実施していけばいいのですが、一つ問題があります。

マルウェアのアンパックを行うことが前提

アンパックを行うにもコツが要り、マルウェア解析初心者は辛いかもしれないので、本記事ではマルウェアのアンパックに焦点を当ててここからは記載していきます。

マルウェアのアンパック

パック

そもそもマルウェアのパックって何?っていうところですが、簡単に言うと「分析を困難にするための難読化」です。詳しくはMBSDさんの以下の日経記事が参考になるかと思います。

この難読化を解除(アンパック)することで、先ほどのAntiDebugSeekerの性能を活かすことが出来ます。

マルウェアのパック有無判断

マルウェアがパックされているかどうかの判定はエントロピーを見ることである程度判断することが出来ます。
エントロピーは0から8の間で値を取り、高ければ高いほど規則性がなくランダムなバイト列になっている指標となり、マルウェアのパック有無判断の手助けになります。

pestudio

エントロピーを確認するためのToolは何でもいいのですが、ここではpestudioを利用してみます。

sectionsのタブを開いてentropyを確認します。
スクリーンショット 2024-11-17 213546.png
.textセクション(実行するコードがある領域)が異様に高いエントロピーを持っていることが分かるので、パックされている可能性が高いです。

UPXなどのパッカーツールだと以下のようにセクション名が特殊だったりします。
スクリーンショット 2024-11-17 212124.png

マルウェアのアンパック

では実際にマルウェアのアンパックを行ってみます。実際に手を動かしながらやってみると理解が深まると思います。
SOCでも定期的にマルウェア解析を行って日々研鑽を積んでいます。

RedLineStealer

RedLineStealerの検体を使って解析を行います。

Detect-It-Easyに最初食わせることで簡易に表層解析が出来ます。

スクリーンショット 2024-11-17 215217.png
UPXを利用されていることが分かります。また、エントロピーも確認できます。
スクリーンショット 2024-11-17 215853.png

4n4lDetectorにも食わせてみます。MarsStealerなどは此奴でThemida検知してくれることがあり、便利です。

スクリーンショット 2024-11-18 215432.png

同じようにUPXを利用していることが分かります。この場合はUPXを利用して簡単にアンパックできます。

コマンド
upx.exe -d RedLineStealer.exe -o RedLineStealer_unpacked.exe

スクリーンショット 2024-11-17 215650.png

SnakeKeylogger

SnakeKeyloggerの検体を使って解析を行います。といっても最近の検体ではなく、今年の夏から秋頃に流行った検体です。

Detect-It-Easyに食わせます。
スクリーンショット 2024-11-20 202131.png
おそらくPackerを利用していることが分かりますが、どういったパッカーツールを使っているかは分かりません。
4n4lDetectorにも食わせてみます。
image.png
こちらも同様にパッカー特定といったところまではいきませんでした。独自実装かもしれません。

こういった場合は古典的な方法でアンパックしていくといいかもしれません。
動的解析を行い、メモリ上に出現するアンパックされたマルウェアをハントしていけば良いです。

具体的にはx64dbgを利用してアンパックを行います。

x32のほうに食わせます。
スクリーンショット 2024-11-20 204022.png
とりあえず適当に以下のBreakpoint(以下BP)を打ちます。
スクリーンショット 2024-11-20 204424.png

  • VirtualAlloc
  • VirtualProtect
  • WriteProcessMemory

この辺りはマルウェアが難読化解除したPayloadをメモリ上に展開するときよく利用するwinapiなので打っておいて損はないです。

  • CreateProcess
  • CreateProcessInternal

EvasionのためにPayloadをインジェクトするときによく使います。RemoteThreadに注入する際にはそのProcessに対してデバッカをアタッチしたいのでその前にBPで止めるようにします。

  • IsDebuggerPresent

アンチデバックのために使われるwinapiです。この関数の結果を改ざんするためにBP打っておきます。ScyllaHideとか入れておけばIsDebuggerPresentは省略してもいいかもですね。

さっと適当に打ちましたが、解析によって打つBPを調整するといいと思います。
静的解析と並行して気になるアドレスやwinapiにBPを打つでもいいと思います。

回していきます。
最初にIsDebuggerPresentにヒットします。
スクリーンショット 2024-11-20 210410.png
returnまで回すと0x0が返されScyllaHideさんによってデバッカ検知回避出来ていることが分かります。
スクリーンショット 2024-11-20 210627.png
続いて回します。VirtualAllocにヒットします。
スクリーンショット 2024-11-20 210808.png
returnまで回し、eaxで返されるアドレスをFollow Dumpします。
スクリーンショット 2024-11-20 210900.png
image.png
Alloc直後なので0x0で埋められてます。続いて回します。
image.png
よくわかりません。Follow in Disassemblerします。
スクリーンショット 2024-11-20 211611.png
スクリーンショット 2024-11-20 211638.png
winapiの難読化解除のメモリ領域ぽいですね。Blue側はwinapiを頼りに解析を行うことが多いので、ここら辺のapiはハッシュ化されて難読化しているマルウェアはよくいると思います。

続いて回します。またVirtualAllocにヒットします。
image.png
同じようにreturnまで回し、eaxで返されるアドレスをFollow Dumpします。
image.png
image.png
回します。
image.png
0x4D 0x5AなのでPEファイルぽいですね。
ちなみにここでヒットしてるBPはCreateProcessWなので、Stackに積まれているRegSvcs.exeを実行しそうです。
このProcessにアンパックしたマルウェアをリモートインジェクションする形かなと推測出来ます。
image.png
image.png
スクリーンショット 2024-11-20 212900.png

この0x04BD0000のアドレスから始まるメモリ領域をダンプすればアンパックされたマルウェアが取れるはずです。
適当にBinaryからSave to a Fileします。
image.png

このDumpされたファイルを動的実行するためにはメモリアンマップする必要があるので、以下のToolなどを用いてアンマップするといいです。

Detect-It-Easyに食わせます。
スクリーンショット 2024-11-20 214304.png
.NETマルウェアぽいですね。これでアンパックは完了かなと思いますが、チラッと中身を確認します。

dnSpyで解析していきます。

image.png
Main()に飛ぶとなんじゃこりゃって感じで難読化されてますね。
image.png
Unicodeエンコードされてそうです。

de4dotを利用して難読化解除します。

コマンド
de4dot unpack.bin

image.png
image.png
難読化解除できてそうですね。

解析レポート

おそらくこのSnakeKeyloggerは以下のSplunkの記事と似たような動作をすると考えられます。

自動アンパックツール

ここまでデバッカをごちゃごちゃしなくても自動でアンパックしてくれるツールもあります。
例えば以下のツールがあります。とても便利なので使って見るといいかもしれませんが、実際にマルウェアが実行されてメモリに展開したものを取って来るので、アンチVM機能に引っかかることがあります。

SOCでデバッカを利用して手間をかけるよりは自動化した方が楽なので、基本はこっちを使うといいかもしれません。

お試しAntiDebugSeeker

最後にAntiDebugSeekerを使ってみます。先ほどのSnakeKeyloggerの検体を利用します。
この検体はキルスイッチとサンドボックス検知の機構があるので、そのメソッド名を検知するルールをAntiDebugSeekerに以下のようにカスタムします。
スクリーンショット 2024-11-20 234237.png
スクリーンショット 2024-11-20 234250.png

実際に回してみます。
スクリーンショット 2024-11-20 234359.png
スクリーンショット 2024-11-20 234415.png
スクリーンショット 2024-11-20 234457.png
AntiDebug検出してます!
カスタムしやすいですね!

まとめ

SOCにおけるマルウェア解析で詰まる部分と、その解決方法となる手段の紹介をしました。
楽しいと思いますので、是非ともSOCでマルウェア解析を行ってみて頂ければと思います。

明日は@Ichi0124さんです。

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?