これは 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
を確認します。
.text
セクション(実行するコードがある領域)が異様に高いエントロピーを持っていることが分かるので、パックされている可能性が高いです。
UPXなどのパッカーツールだと以下のようにセクション名が特殊だったりします。
マルウェアのアンパック
では実際にマルウェアのアンパックを行ってみます。実際に手を動かしながらやってみると理解が深まると思います。
SOCでも定期的にマルウェア解析を行って日々研鑽を積んでいます。
RedLineStealer
RedLineStealerの検体を使って解析を行います。
Detect-It-Easyに最初食わせることで簡易に表層解析が出来ます。
UPX
を利用されていることが分かります。また、エントロピーも確認できます。
4n4lDetectorにも食わせてみます。MarsStealerなどは此奴でThemida
検知してくれることがあり、便利です。
同じようにUPX
を利用していることが分かります。この場合はUPX
を利用して簡単にアンパックできます。
upx.exe -d RedLineStealer.exe -o RedLineStealer_unpacked.exe
SnakeKeylogger
SnakeKeyloggerの検体を使って解析を行います。といっても最近の検体ではなく、今年の夏から秋頃に流行った検体です。
Detect-It-Easyに食わせます。
おそらくPackerを利用していることが分かりますが、どういったパッカーツールを使っているかは分かりません。
4n4lDetectorにも食わせてみます。
こちらも同様にパッカー特定といったところまではいきませんでした。独自実装かもしれません。
こういった場合は古典的な方法でアンパックしていくといいかもしれません。
動的解析を行い、メモリ上に出現するアンパックされたマルウェアをハントしていけば良いです。
具体的にはx64dbgを利用してアンパックを行います。
x32のほうに食わせます。
とりあえず適当に以下のBreakpoint(以下BP)を打ちます。
- VirtualAlloc
- VirtualProtect
- WriteProcessMemory
この辺りはマルウェアが難読化解除したPayloadをメモリ上に展開するときよく利用するwinapiなので打っておいて損はないです。
- CreateProcess
- CreateProcessInternal
EvasionのためにPayloadをインジェクトするときによく使います。RemoteThreadに注入する際にはそのProcessに対してデバッカをアタッチしたいのでその前にBPで止めるようにします。
- IsDebuggerPresent
アンチデバックのために使われるwinapiです。この関数の結果を改ざんするためにBP打っておきます。ScyllaHideとか入れておけばIsDebuggerPresent
は省略してもいいかもですね。
さっと適当に打ちましたが、解析によって打つBPを調整するといいと思います。
静的解析と並行して気になるアドレスやwinapiにBPを打つでもいいと思います。
回していきます。
最初にIsDebuggerPresent
にヒットします。
returnまで回すと0x0
が返されScyllaHideさんによってデバッカ検知回避出来ていることが分かります。
続いて回します。VirtualAlloc
にヒットします。
returnまで回し、eax
で返されるアドレスをFollow Dumpします。
Alloc直後なので0x0
で埋められてます。続いて回します。
よくわかりません。Follow in Disassemblerします。
winapiの難読化解除のメモリ領域ぽいですね。Blue側はwinapiを頼りに解析を行うことが多いので、ここら辺のapiはハッシュ化されて難読化しているマルウェアはよくいると思います。
続いて回します。またVirtualAlloc
にヒットします。
同じようにreturnまで回し、eax
で返されるアドレスをFollow Dumpします。
回します。
0x4D 0x5A
なのでPEファイルぽいですね。
ちなみにここでヒットしてるBPはCreateProcessW
なので、Stackに積まれているRegSvcs.exe
を実行しそうです。
このProcessにアンパックしたマルウェアをリモートインジェクションする形かなと推測出来ます。
この0x04BD0000
のアドレスから始まるメモリ領域をダンプすればアンパックされたマルウェアが取れるはずです。
適当にBinaryからSave to a Fileします。
このDumpされたファイルを動的実行するためにはメモリアンマップする必要があるので、以下のToolなどを用いてアンマップするといいです。
Detect-It-Easyに食わせます。
.NETマルウェアぽいですね。これでアンパックは完了かなと思いますが、チラッと中身を確認します。
dnSpyで解析していきます。
Main()
に飛ぶとなんじゃこりゃって感じで難読化されてますね。
Unicodeエンコードされてそうです。
de4dotを利用して難読化解除します。
de4dot unpack.bin
解析レポート
おそらくこのSnakeKeyloggerは以下のSplunkの記事と似たような動作をすると考えられます。
自動アンパックツール
ここまでデバッカをごちゃごちゃしなくても自動でアンパックしてくれるツールもあります。
例えば以下のツールがあります。とても便利なので使って見るといいかもしれませんが、実際にマルウェアが実行されてメモリに展開したものを取って来るので、アンチVM機能に引っかかることがあります。
SOCでデバッカを利用して手間をかけるよりは自動化した方が楽なので、基本はこっちを使うといいかもしれません。
お試しAntiDebugSeeker
最後にAntiDebugSeekerを使ってみます。先ほどのSnakeKeyloggerの検体を利用します。
この検体はキルスイッチとサンドボックス検知の機構があるので、そのメソッド名を検知するルールをAntiDebugSeekerに以下のようにカスタムします。
実際に回してみます。
AntiDebug検出してます!
カスタムしやすいですね!
まとめ
SOCにおけるマルウェア解析で詰まる部分と、その解決方法となる手段の紹介をしました。
楽しいと思いますので、是非ともSOCでマルウェア解析を行ってみて頂ければと思います。
明日は@Ichi0124さんです。