【CyberDefenders】Obfuscated【Walkthrough】

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

# はじめに
本記事は ___CyberDefenders___（以下リンク参考）の「__Obfuscated__」にチャレンジした際のWalkthroughになります

https://cyberdefenders.org/blueteam-ctf-challenges/76

※本チャレンジについてはRed側のペネトレというよりはBlue側の分析力を問われるものになります。
※今回のチャレンジはマルウェア解析メインでしたね。

# チャレンジ開始前
## 問題について
以下の画像の「__Download challenge__」に問題ファイルのリンクがあります。
アーカイブファイルで圧縮されているので仮想環境で解凍してください。
※ホストで解凍しないでください。本物のマルウェアが入ってたりします。

この解凍したファイルを解析して左側の「__Questions__」に解答します。
![スクリーンショット 2023-12-01 154944.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1a20cdaf-9c68-5298-3d57-cb5bb5972c13.png)

## 環境
この ___CyberDefenders___ を解く際には仮想環境でマルウェア解析やメモリフォレンジックを行う環境を用意する必要があります。
今回は以下のような環境を用意しました。
+ [remnux](https://remnux.org/)
+ Windows 10

基本的な解析はToolが豊富に揃ってるREMuxで行い、どうしても動的解析でデバッグを簡易に行いたい場合にはWindowsOSを利用しました。

# Q1
__What is the sha256 hash of the doc file?__
以下のコマンドで確認出来ます。
```bash
sha256sum 49b367ac261a722a7c2bbbc328c32545
```

# Q2
__Multiple streams contain macros in this document. Provide the number of lowest one.__
`oledump.py`を使って確認します。
```bash
remnux@remnux:~/Downloads$ oledump.py 49b367ac261a722a7c2bbbc328c32545 -i
  1:       114             '\x01CompObj'
  2:       284             '\x05DocumentSummaryInformation'
  3:       392             '\x05SummaryInformation'
  4:      8017             '1Table'
  5:      4096             'Data'
  6:       483             'Macros/PROJECT'
  7:        65             'Macros/PROJECTwm'
  8: M    7117   5667+1450 'Macros/VBA/Module1'
  9: m    1104     947+157 'Macros/VBA/ThisDocument'
 10:      3467             'Macros/VBA/_VBA_PROJECT'
 11:      2964             'Macros/VBA/__SRP_0'
 12:       195             'Macros/VBA/__SRP_1'
 13:      2717             'Macros/VBA/__SRP_2'
 14:       290             'Macros/VBA/__SRP_3'
 15:       565             'Macros/VBA/dir'
 16:        76             'ObjectPool/_1541577328/\x01CompObj'
 17: O   20301             'ObjectPool/_1541577328/\x01Ole10Native'
 18:      5000             'ObjectPool/_1541577328/\x03EPRINT'
 19:         6             'ObjectPool/_1541577328/\x03ObjInfo'
 20:    133755             'WordDocument'
remnux@remnux:~/Downloads$ 
```
Macroが含まれている場合は上記のように`m,M`が付与されます。
最低値を答えれば解答となります。

# Q3
__What is the decryption key of the obfuscated code?__
とりあえずOLEファイルについては`olevba`を使って置けばある程度解析出来ます。
回します。
```bash
remnux@remnux:~/Downloads$ olevba 49b367ac261a722a7c2bbbc328c32545 
XLMMacroDeobfuscator: pywin32 is not installed (only is required if you want to use MS Excel)
olevba 0.60.1 on Python 3.8.10 - http://decalage.info/python/oletools
===============================================================================
FILE: 49b367ac261a722a7c2bbbc328c32545
Type: OLE
-------------------------------------------------------------------------------
VBA MACRO ThisDocument.cls 
in file: 49b367ac261a722a7c2bbbc328c32545 - OLE stream: 'Macros/VBA/ThisDocument'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
(empty macro)
-------------------------------------------------------------------------------
VBA MACRO Module1.bas 
in file: 49b367ac261a722a7c2bbbc328c32545 - OLE stream: 'Macros/VBA/Module1'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

...省略

OBKHLrC3vEDjVL = B8qen2T433Ds1bW & "\" & "maintools.js"
Open (OBKHLrC3vEDjVL) For Binary As #K764B5Ph46Vh
Put #K764B5Ph46Vh, 1, Wk4o3X7x1134j
Close #K764B5Ph46Vh
Erase Wk4o3X7x1134j
Set R66BpJMgxXBo2h = CreateObject("WScript.Shell")
R66BpJMgxXBo2h.Run """" + OBKHLrC3vEDjVL + """" + " EzZETcSXyKAdF_e5I2i1"
ActiveDocument.Save
Exit Sub
MnOWqnnpKXfRO:
Close #K764B5Ph46Vh
ActiveDocument.Save
End Sub








+----------+--------------------+---------------------------------------------+
|Type      |Keyword             |Description                                  |
+----------+--------------------+---------------------------------------------+
|AutoExec  |AutoOpen            |Runs when the Word document is opened        |
|AutoExec  |AutoClose           |Runs when the Word document is closed        |
|Suspicious|Environ             |May read system environment variables        |
|Suspicious|Open                |May open a file                              |
|Suspicious|Put                 |May write to a file (if combined with Open)  |
|Suspicious|Binary              |May read or write a binary file (if combined |
|          |                    |with Open)                                   |
|Suspicious|Kill                |May delete a file                            |
|Suspicious|Shell               |May run an executable file or a system       |
|          |                    |command                                      |
|Suspicious|WScript.Shell       |May run an executable file or a system       |
|          |                    |command                                      |
|Suspicious|Run                 |May run an executable file or a system       |
|          |                    |command                                      |
|Suspicious|CreateObject        |May create an OLE object                     |
|Suspicious|Windows             |May enumerate application windows (if        |
|          |                    |combined with Shell.Application object)      |
|Suspicious|Xor                 |May attempt to obfuscate specific strings    |
|          |                    |(use option --deobf to deobfuscate)          |
|Suspicious|Base64 Strings      |Base64-encoded strings were detected, may be |
|          |                    |used to obfuscate strings (option --decode to|
|          |                    |see all)                                     |
|IOC       |maintools.js        |Executable file name                         |
+----------+--------------------+---------------------------------------------+
```
`WScript.Shell`を実行して`maintools.js`を動かしてるのが何となく分かると思います。
後はQ3の入力文字列欄と比較してdecryption keyぽいのを選べば良いです。

# Q4
__What is the name of the dropped file?__
先ほどの`olevba`の結果にIOCで出ています。

# Q5
__This script uses what language?__
ファイルの拡張子から予測値を答えます。

# Q6
__What is the name of the variable that is assigned the command-line arguments?__
実際に`maintools.js`を見ないと何とも言えないです。
なので公開されている脅威情報から件のJSファイルを探します。
以下のサイトから落としてきましょう。

https://tria.ge/231024-xjwafagb27/behavioral1

![6-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/845f1a61-33a1-c1c6-262f-7c9a98e3fe64.png)
下層にDownloads項目があります。
![6-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/4e2e1eea-4e77-c309-50c0-d3f1cfdb81d0.png)
ログイン状態であればダウンロード可能です。
![6-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/5170a705-1355-f1d1-413a-fc8d4ad4162f.png)
末尾`193b3-21`のファイルが例のJSです。
中身を確認します。
![6-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/5b85066f-de35-da03-acf4-a1c2a10d7519.png)
コマンドライン引数の入る変数は何かは分かると思う。一応見やすいように以下のサイトで整形します。

http://www.jsnice.org/

![6-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/cca69014-ab2a-cc14-8acd-472a5dbb66f2.png)
スクリプトの実行順序も分かりやすくなりました。
これで解答できますね。

# Q7
__How many command-line arguments does this script expect?__
このJSに渡していたものはQ3で解答したkeyのみです。

# Q8
__What instruction is executed if this script encounters an error?__
整形したコードでエラーハンドリングの該当箇所が見えます。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/7a608275-fd30-7a34-555d-7dbf96efc4f6.png)

# Q9
__What function returns the next stage of code (i.e. the first round of obfuscated code)?__
最初に実行されている関数をみればよい。
![9-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/e3c8cbe6-d082-86f0-65b7-3927f2a90535.png)
中身を確認する。
![9-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/efd86d09-c702-04f6-a2ad-eaa61a055196.png)
reternは何がされているかは見ればわかります。

# Q10
__The function LXv5 is an important function, what variable is assigned a key string value in determining what this function does?__
関数の中を確認します。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/2fe04d25-8b4b-900a-a371-b2864e2c3bd7.png)
この文字列は、Base64では！！！
その前に変数を解答します。

# Q11
__What encoding scheme is this function responsible for decoding?__
前の問題が分かれば自ずと導くことが可能です。

# Q12
__In the function CpPT, the first two for loops are responsible for what important part of this function?__
何にも分からないのでこういうものはChatGPTに聞きます。
![12-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/3dc1fe69-e688-f78c-7a4d-4a945ab3ba8b.png)
RC4らしいのでアルゴリズムを検索する。

https://www.geeksforgeeks.org/rc4-encryption-algorithm/

https://gist.github.com/farhadi/2185197

そうすると似たようなコーディングをしているGistを見つけます。
![12-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a06edacb-b642-1267-fa79-0f65d7cd9f11.png)

あたりっぽいのでこのRC4の中でそれっぽいアルゴリズムを解答すればよい。

# Q13
__The function CpPT requires two arguments, where does the value of the first argument come from?__
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/e2f266ce-fd82-1e05-3b89-1bc5682bc018.png)
見れば一発で分かります。

# Q14
__For the function CpPT, what does the first argument represent?__
Q13が何だったのか、Q3をもう一度思い出せばよい。

# Q15
__What encryption algorithm does the function CpPT implement in this script?__
Q12が分かれば分かるはずです。

# Q16
__What function is responsible for executing the deobfuscated code?__
エラーハンドリングされる前のコードを見れば分かります。
よくJSなどスクリプトマルウェアで第2のPayloadを落としてきて実行するときに使う関数です。

# Q17
__What Windows Script Host program can be used to execute this script in command-line mode?__
一般的なコマンドを書けばよい。Windowsでスクリプトを回すときはよく使うコマンドです。

# Q18
__What is the name of the first function defined in the deobfuscated code?__
実物のスクリプトに以下のように`WScript.Echo`を追加し、`ES3c`を出力してみます。
![18-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/411bd795-6b92-c575-21f3-979d7a3f03c7.png)
実行結果は以下です。
![18-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/d7346d57-dab0-7e2f-42e2-6ee32c41814b.png)
スクリプトが出力されるので、最初の行を確認すればよいです。
![18-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/8b65a9fd-efe0-66b9-86ea-980accbd56b8.png)

# 最後に
スクリプトを用いたマルウェア解析でよくある解析てんこ盛りと言ったチャレンジでした。
Deobfuscationは楽しいですね！？いいチャレンジになりました。

ちなみにこのチャレンジは以下の`Turla APT group`の攻撃チェインの途中までの流れを問うたものになってます。
興味があればレポートもご覧ください。

https://blog.angelalonso.es/2017/10/analysis-of-malicious-doc-used-by-turla.html

明日は@yamajoooonさんです。