メモリフォレンジックCTF「MemLabs」Lab3のWriteUp(Volatility3)

# はじめに
前回に続きLab3を解いていく，また使用するツールなどの備忘録を残す．

# MemLabs
P.Abhiram Kumar氏が公開しているCTFスタイルでメモリフォレンジックを学ぶことができる教材で，Githubにて公開されています。

https://github.com/stuxnet999/MemLabs

# Writeup
## 使用したツール
* steghide 
* feh
## 問題
>A malicious script encrypted a very secret piece of information I had on my system. Can you recover the information for me please?
Note: This challenge is composed of only 1 flag and split into 2 parts.
Hint: You’ll need the first half of the flag to get the second.
You will need this additional tool to solve the challenge,
```$ sudo apt install steghide```
The flag format for this lab is: inctf{s0me_l33t_Str1ng}
>>悪意のあるスクリプトによって、私のシステム上にある非常に秘密の情報が暗号化されました。
あなたは私のために情報を回復することができますか？
注1：この課題は、1つのフラグのみで構成されています。フラグは2つの部分に分かれています。
注2: あなたは2番目のフラグを取得するために、フラグの前半が必要になります。
この課題を解決するためには、この追加ツールが必要です。
```$ sudo apt install steghide```
このラボのフラグのフォーマットは次の通りです：inctf{s0me_l33t_Str1ng}。

https://github.com/stuxnet999/MemLabs/tree/master/Lab%203
## 初動調査
取り敢えず，メモリダンプ取得時に起動していたプロセス情報を確認．
![画像_2023-01-03_155350136.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086568/700c9b83-24c7-9e3f-5993-6fa905636255.png)
気になる点としては，notepad.exe(PID:3432,3736)が2つ起動していますが，それ以外に特に目立つアノマリは見つけられず．．
取り敢えず，起動時のコマンドライン引数を調査してみる．
```
$ vol3 -f MemoryDump_Lab3.raw windows.cmdline --pid 3432 3736
olatility 3 Framework 2.4.1
Progress:  100.00		PDB scanning finished                        
PID	Process	Args

3736	notepad.exe	"C:\Windows\system32\NOTEPAD.EXE" C:\Users\hello\Desktop\evilscript.py
3432	notepad.exe	"C:\Windows\system32\NOTEPAD.EXE" C:\Users\hello\Desktop\vip.txt
```
## Flag前半
`evilscript.py`と`vip.txt`をnotepad.exeで開いていることが分かるので，まずは`evilscript.py`をダンプしていきたいと思う．
```
$ vol3 -f MemoryDump_Lab3.raw windows.filescan | grep -i evilscript.py
0x3de1b5f0 100.0\Users\hello\Desktop\evilscript.py.py	128
$ vol3 -f MemoryDump_Lab3.raw windows.dumpfiles --physaddr 0x3de1b5f0
```
ダンプしたファイルを開くと，以下のようなコードが組まれていました．
```ruby:evilscript.py 
import sys
import string
def xor(s):
	a = ''.join(chr(ord(i)^3) for i in s)
	return a
def encoder(x):
	return x.encode("base64")
if __name__ == "__main__":
	f = open("C:\\Users\\hello\\Desktop\\vip.txt", "w")
	arr = sys.argv[1]
	arr = encoder(xor(arr))
	f.write(arr)
	f.close()
```

1\. コマンドライン引数として文字列を受け取る
2\. その文字列を個々の文字に分解し、各文字を3でXORする
3\. XORされた文字列をBase64としてエンコードする。
4\. Base64エンコードされた文字列をファイルvip.txtに書き込む
というわけで`vip.txt`をダンプしに行きます．
```
$ vol3 -f MemoryDump_Lab3.raw windows.filescan | grep -i vip.txt
0x3e727e50 100.0\Users\hello\Desktop\vip.txt	128
$ vol3 -f MemoryDump_Lab3.raw windows.dumpfiles --physaddr 0x3e727e50
```
`vip.txt`の中身は以下のようになっていました．
```ruby:vip.txt
am1gd2V4M20wXGs3b2U=
```
`evilscript.py`の逆の処理を組んでもいいですが，~~めんどくさいので~~CyberChefという便利なツールを使いました．
非常に楽ですね，OutputにFlagの前半が出力されてました．
![画像_2023-01-03_172322080.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086568/a37a1a09-a020-a2ca-e6e2-fdaec35b1852.png)
<details><summary>Flag前半</summary>

```rb:Flag前半
inctf{0n3_h4lf
```
</details>

## Flag後半
問題文にもあるように今回の問題では`steghide`を使用することが言及されているので，調査してみる，
ちなみに，steghideはBMP,JPEG,AU,WAVファイルに対して使用できるため，まずはこれらのファイルを中心に調査する．
```
$ vol3 -f MemoryDump_Lab3.raw windows.filescan | grep -i ".bmp"
0x361519f0 100.0\ProgramData\Microsoft\User Account Pictures\user.bmp	128
0x3dea1978	\Python27\Lib\test\imghdrdata\python.bmp	128
$ vol3 -f MemoryDump_Lab3.raw windows.filescan | grep -i ".jpeg"
0x4f34148  100.0\Users\hello\Desktop\suspision1.jpeg	128
```
ここまでで，`suspision1.jpeg`が気になるのでダンプしてツールにかけてみる．
ツールにかけてみると，パスワードがかかっておりファイルの抽出をできなかったが，当たりのようだ．
次にパスワードを探しに行きたいと思う．
```
$ vol3 -f MemoryDump_Lab3.raw windows.dumpfiles --physaddr 0x4f34148
$ file suspision1.jpeg 
suspision1.jpeg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 256x197, components 3
$ steghide info suspision1.jpeg 
"suspision1.jpeg":
  format: jpeg
  capacity: 581.0 Byte
Try to get information about embedded data ? (y/n) y
Enter passphrase: 
steghide: could not extract any data with that passphrase!
```
ちなみに，画像は次のようになっている．
![画像_2023-01-03_180407824.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086568/1da895d0-e473-2c29-ca11-07c320b30429.png)
ここで，問題の注釈を振り返ると次のような記載があるため，前半のFlagをパスワードとして入力してみるとファイルの抽出が行われFlagの後半が手に入った．
>あなたは2番目のフラグを取得するために、フラグの前半が必要になります。
```
$ steghide extract -sf suspision1.jpeg -p inctf{0n3_h4lf
wrote extracted data to "secret text".
```
<details><summary>Flag後半</summary>

```rb:Flag後半
_1s_n0t_3n0ugh}
```
</details>

<details><summary>Flag</summary>

```rb:Flag
inctf{0n3_h4lf_1s_n0t_3n0ugh}
```
</details>

# おまけ
Flag前半で`evilscript.py`を調査するタイミングで，Recentにevilscript.py.lnkが作成されており，最近使用したファイルであることが分かる．
```
$ vol3 -f MemoryDump_Lab3.raw windows.filescan | grep -i evilscript.py
0x3de1b5f0 100.0\Users\hello\Desktop\evilscript.py.py	128
0x3e727490	\Users\hello\AppData\Roaming\Microsoft\Windows\Recent\evilscript.py.lnk	128
```