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

:::note info
これは [ZOZO Advent Calendar 2024](https://qiita.com/advent-calendar/2024/zozo) カレンダーVol.1の5日目の記事です。昨日の投稿は@satto_sannさんでした。
:::

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

https://qiita.com/schectman-hell/items/c8f41750f6037a5aae78

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

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

## マルウェア解析で確認するポイント（おさらい）
マルウェア解析を行う際には以下のポイントを重点的に確認します。

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

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

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

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


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

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

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

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

https://github.com/LAC-Japan/Ghidra_AntiDebugSeeker

https://www.lac.co.jp/lacwatch/people/20240906_004107.html

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

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

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

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

https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/111900071/052100019/

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

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

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

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

https://www.winitor.com/download

`sections`のタブを開いて`entropy`を確認します。
![スクリーンショット 2024-11-17 213546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a11eba22-cd8e-491b-5d8b-a96a2e7c4670.png)
`.text`セクション（実行するコードがある領域）が異様に高いエントロピーを持っていることが分かるので、パックされている可能性が高いです。

[UPX](https://github.com/upx/upx)などのパッカーツールだと以下のようにセクション名が特殊だったりします。
![スクリーンショット 2024-11-17 212124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a166d292-fd09-4dca-ea17-a00d31114acd.png)

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

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

https://bazaar.abuse.ch/sample/b5e250a95073b5dfe33f66c13cc89da0fc8d3af226e5efb06bb8fcfd9a4cd6ec/

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

https://github.com/horsicq/Detect-It-Easy

![スクリーンショット 2024-11-17 215217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1cbc12e7-a065-ff43-0d61-626989c6a7cd.png)
`UPX`を利用されていることが分かります。また、エントロピーも確認できます。
![スクリーンショット 2024-11-17 215853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/ef0cc2c1-b9e1-5230-71d1-43b02e7ccae7.png)

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

https://github.com/4n0nym0us/4n4lDetector

![スクリーンショット 2024-11-18 215432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/7c8430a3-1ebe-c44a-de38-019997e28f88.png)

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

```:コマンド
upx.exe -d RedLineStealer.exe -o RedLineStealer_unpacked.exe
```
![スクリーンショット 2024-11-17 215650.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/fcc57e2a-4e5a-01ef-7f61-778b12fbbf02.png)

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

https://bazaar.abuse.ch/sample/68917e12e63c559b219ea1d2a032a684d28eb43feaf12ea6a2210cac1e774116/

Detect-It-Easyに食わせます。
![スクリーンショット 2024-11-20 202131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/8023d461-3f82-8a87-34b8-e0ed43b80b83.png)
おそらくPackerを利用していることが分かりますが、どういったパッカーツールを使っているかは分かりません。
4n4lDetectorにも食わせてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/3edde9a2-8e76-500b-83f1-83cd7db050e0.png)
こちらも同様にパッカー特定といったところまではいきませんでした。独自実装かもしれません。

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

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

https://github.com/x64dbg/x64dbg

x32のほうに食わせます。
![スクリーンショット 2024-11-20 204022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/0d09bdc8-e59c-44e2-8397-71614fa729b2.png)
とりあえず適当に以下のBreakpoint（以下BP）を打ちます。
![スクリーンショット 2024-11-20 204424.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/699c649c-c111-e2e5-6676-82efd859be7a.png)

+ VirtualAlloc
+ VirtualProtect
+ WriteProcessMemory

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

+ CreateProcess
+ CreateProcessInternal

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

+ IsDebuggerPresent

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

https://github.com/x64dbg/ScyllaHide

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

回していきます。
最初に`IsDebuggerPresent`にヒットします。
![スクリーンショット 2024-11-20 210410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/746de77d-9714-e5e2-55a4-a94ffd16d38d.png)
returnまで回すと`0x0`が返されScyllaHideさんによってデバッカ検知回避出来ていることが分かります。
![スクリーンショット 2024-11-20 210627.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/2aa76c98-52be-68f3-cbfa-d6f0938787b9.png)
続いて回します。`VirtualAlloc`にヒットします。
![スクリーンショット 2024-11-20 210808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/568cea0c-8dbb-5570-7daf-2a259be3e842.png)
returnまで回し、`eax`で返されるアドレスをFollow Dumpします。
![スクリーンショット 2024-11-20 210900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/08f9312f-8b54-611d-2816-48ac1ba2f2fb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/430da8ec-27ca-98db-78ce-b5dc79245737.png)
Alloc直後なので`0x0`で埋められてます。続いて回します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/74bb6f7f-af6c-fbb3-d5d8-ec8bf194b7d5.png)
よくわかりません。Follow in Disassemblerします。
![スクリーンショット 2024-11-20 211611.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a8ec8708-254c-ea34-a9c3-2e025fa8215e.png)
![スクリーンショット 2024-11-20 211638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/904ea3da-3e31-778a-b0a7-d138987eaa69.png)
winapiの難読化解除のメモリ領域ぽいですね。Blue側はwinapiを頼りに解析を行うことが多いので、ここら辺のapiはハッシュ化されて難読化しているマルウェアはよくいると思います。

続いて回します。また`VirtualAlloc`にヒットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/b01555d8-503f-4043-b241-75828fefbc1e.png)
同じようにreturnまで回し、`eax`で返されるアドレスをFollow Dumpします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1163ff13-6e01-2a9b-7a3d-be1407295d5b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/447ba7c1-33be-93d6-f8cc-ce0896f9cb3b.png)
回します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/07fcea64-c620-0181-066e-0c14c4fd0881.png)
`0x4D 0x5A`なのでPEファイルぽいですね。
ちなみにここでヒットしてるBPは`CreateProcessW`なので、Stackに積まれている`RegSvcs.exe`を実行しそうです。
このProcessにアンパックしたマルウェアをリモートインジェクションする形かなと推測出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/51ba95b2-4881-10f1-8080-3f7a1b40ca58.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/f496d389-6e95-b925-3364-3c7100c3a2fb.png)
![スクリーンショット 2024-11-20 212900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a6ca5e87-a444-e33e-7bfe-51b6e8d7eb82.png)

この`0x04BD0000`のアドレスから始まるメモリ領域をダンプすればアンパックされたマルウェアが取れるはずです。
適当にBinaryからSave to a Fileします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/5a01a610-4b3a-4fa6-2431-ef5b0885c91f.png)

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

https://github.com/hasherezade/pe_unmapper

Detect-It-Easyに食わせます。
![スクリーンショット 2024-11-20 214304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/ab1ac7d6-f018-215a-3fc7-aae954b45979.png)
.NETマルウェアぽいですね。これでアンパックは完了かなと思いますが、チラッと中身を確認します。

dnSpyで解析していきます。

https://github.com/dnSpy/dnSpy

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/5424a545-5b8d-9458-2468-df7c4d4c96fe.png)
`Main()`に飛ぶとなんじゃこりゃって感じで難読化されてますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/15b12dd8-dbe1-63b3-ead7-b40843e4bff0.png)
Unicodeエンコードされてそうです。

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

https://github.com/de4dot/de4dot

```:コマンド
de4dot unpack.bin
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/7a107d16-e5c4-43a5-23c7-910119ba1179.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/9204be72-5558-34bb-c946-9f188d0b1711.png)
難読化解除できてそうですね。
#### 解析レポート
おそらくこのSnakeKeyloggerは以下のSplunkの記事と似たような動作をすると考えられます。

https://www.splunk.com/ja_jp/blog/security/under-the-hood-of-snakekeylogger-analyzing-its-loader-and-its-tactics-techniques-and-procedures.html

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

https://github.com/hasherezade/mal_unpack

https://github.com/hasherezade/hollows_hunter

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

# お試しAntiDebugSeeker 
最後にAntiDebugSeekerを使ってみます。先ほどのSnakeKeyloggerの検体を利用します。
この検体はキルスイッチとサンドボックス検知の機構があるので、そのメソッド名を検知するルールをAntiDebugSeekerに以下のようにカスタムします。
![スクリーンショット 2024-11-20 234237.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/be3ea218-909e-41c4-2fc8-45f427b46a50.png)
![スクリーンショット 2024-11-20 234250.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/b0120a75-227c-515c-13d8-e282bf8fda43.png)

実際に回してみます。
![スクリーンショット 2024-11-20 234359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/cec449b8-4aee-6fb1-27c6-fbcbe902f408.png)
![スクリーンショット 2024-11-20 234415.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/3ec15fec-729f-7c6d-6e66-2b930ab6423a.png)
![スクリーンショット 2024-11-20 234457.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/e1c05f18-e807-d429-4a2b-7d6b36921c0e.png)
AntiDebug検出してます!
カスタムしやすいですね!

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

明日は@Ichi0124さんです。