メモリフォレンジックCTF「MemLabs」Lab4のWriteUp(Volatility2,3)

# はじめに
前回に続きLab4を解いていく，また使用するツールなどの備忘録を残す．
しかし，今回は問題を解く過程でVolatility2でないと詰んだので，Volatility2を使用する．

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

https://github.com/stuxnet999/MemLabs

# Writeup
## 使用したツール
* Volatility2
## 問題
>My system was recently compromised. The Hacker stole a lot of information but he also deleted a very important file of mine. I have no idea on how to recover it. The only evidence we have, at this point of time is this memory dump. Please help me.
Note: This challenge is composed of only 1 flag.
The flag format for this lab is: inctf{s0me_l33t_Str1ng}
>>最近、私のシステムが危険にさらされました。
ハッカーは多くの情報を盗んだのですが、私のとても重要なファイルも削除してしまいました。
どうやったら復元できるか分からない。
現時点での唯一の証拠は、このメモリダンプです。どうか助けてください。
注：この課題は、1つのフラグのみで構成されています。
このラボのフラグフォーマットは次のとおりです：inctf{s0me_l33t_Str1ng}。

https://github.com/stuxnet999/MemLabs/tree/master/Lab%204
## 初動調査
今回の場合，ファイルの復元がメインになるが取り敢えず，メモリダンプ取得時に起動していたプロセス情報を確認．
![画像_2023-01-03_191711345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086568/95605f09-fb9a-f7c3-14d0-1c48c408a47a.png)
StikyNot.exe(PID:2432)が気になるので，調査してみる．
StikyNot.exeのバックアップファイルとして`StickyNotes.snt`が 存在している可能性があるので，filescanプラグインで確認．ファイルをダンプしてみる．
```
$ vol3 -f MemoryDump_Lab4.raw windows.filescan | grep -i ".snt"
0x3eec02f0 100.0\Windows\System32\sysntfy.dll	216
0x3fd40910	\Users\SlimShady\AppData\Roaming\Microsoft\Sticky Notes\StickyNotes.snt	216
```
ダンプしたファイルには以下の記載がありました。
>The clipboard plugin works well but it doesn't give the flag
>>クリップボードプラグインはうまく動きますが、フラグが立ちません.

特に情報はないですね．他に情報がないか探していきたいと思う．
実行結果の中からいくつか気になるファイルをピックアップして記載する．
```
$ vol3 -f MemoryDump_Lab4.raw windows.filescan | grep -i "Desktop"
0x3e8ad250	\Users\eminem\Desktop\galf.jpeg	216
0x3e8d19e0	\Users\eminem\Desktop\Screenshot1.png	216
0x3fc398d0	\Users\SlimShady\Desktop\Important.txt	216
0x3ebe2a20	\Users\eminem\Desktop\DumpIt\2PAC-20190629-072925.raw	216
```
DumpItのデータはそのままの意味と思うので，`galf.jpeg`,`Screenshot1.png`,`Important.txt`をダンプしてみる．
結果として，いかにもな名前の`Important.txt`のダンプは失敗して，`galf.jpeg`,`Screenshot1.png`に情報はなしでした．
```
$ vol3 -f MemoryDump_Lab4.raw windows.dumpfiles --physaddr 0x3e8ad250
$ vol3 -f MemoryDump_Lab4.raw windows.dumpfiles --physaddr 0x3e8d19e0
$ vol3 -f MemoryDump_Lab4.raw windows.dumpfiles --physaddr 0x3fc398d0
Volatility 3 Framework 2.4.1
Progress:  100.00		PDB scanning finished                        
Cache	FileObject	FileName	Result
```

## Flag
ファイルの名前からも`Important.txt`が今回削除されて復元が必要なファイルであると推測できるため，復元を試みる．
NTFSファイルシステムのMFTからデータ属性のデータを取得したいと思い，Volatility3でも実現可能か調べたがプラグインもなく無理そうだ...
大人しくVolatility2を使いたいと思う．
```
$ vol.py -f MemoryDump_Lab4.raw --profile=Win7SP1x64 mftparser | grep -i important.txt -C 20
MFT entry found at offset 0x3bd8ac00
Attribute: In Use & File
Record Number: 60583
Link count: 2

$STANDARD_INFORMATION
Creation                       Modified                       MFT Altered                    Access Date                    Type
------------------------------ ------------------------------ ------------------------------ ------------------------------ ----
2019-06-27 13:14:13 UTC+0000 2019-06-27 13:26:12 UTC+0000   2019-06-27 13:26:12 UTC+0000   2019-06-27 13:14:13 UTC+0000   Archive

$FILE_NAME
Creation                       Modified                       MFT Altered                    Access Date                    Name/Path
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------
2019-06-27 13:14:13 UTC+0000 2019-06-27 13:14:13 UTC+0000   2019-06-27 13:14:13 UTC+0000   2019-06-27 13:14:13 UTC+0000   Users\SlimShady\Desktop\IMPORT~1.TXT

$FILE_NAME
Creation                       Modified                       MFT Altered                    Access Date                    Name/Path
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------
2019-06-27 13:14:13 UTC+0000 2019-06-27 13:14:13 UTC+0000   2019-06-27 13:14:13 UTC+0000   2019-06-27 13:14:13 UTC+0000   Users\SlimShady\Desktop\Important.txt

$OBJECT_ID
Object ID: 7726a550-d498-e911-9cc1-0800275e72bc
Birth Volume ID: 80000000-b800-0000-0000-180000000100
Birth Object ID: 99000000-1800-0000-690d-0a0d0a0d0a6e
Birth Domain ID: 0d0a0d0a-0d0a-6374-0d0a-0d0a0d0a0d0a

$DATA
0000000000: 69 0d 0a 0d 0a 0d 0a 6e 0d 0a 0d 0a 0d 0a 63 74   i......n......ct
0000000010: 0d 0a 0d 0a 0d 0a 0d 0a 66 7b 31 0d 0a 0d 0a 0d   ........f{1.....
0000000020: 0a 5f 69 73 0d 0a 0d 0a 0d 0a 5f 6e 30 74 0d 0a   ._is......_n0t..
0000000030: 0d 0a 0d 0a 0d 0a 5f 45 51 75 34 6c 0d 0a 0d 0a   ......_EQu4l....
0000000040: 0d 0a 0d 0a 5f 37 6f 5f 32 5f 62 55 74 0d 0a 0d   ...._7o_2_bUt...
0000000050: 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 5f 74 68 31 73   ..........._th1s
0000000060: 5f 64 30 73 33 6e 74 0d 0a 0d 0a 0d 0a 0d 0a 5f   _d0s3nt........_
0000000070: 6d 34 6b 65 0d 0a 0d 0a 0d 0a 5f 73 33 6e 0d 0a   m4ke......_s3n..
0000000080: 0d 0a 0d 0a 0d 0a 73 33 7d 0d 0a 0d 0a 47 6f 6f   ......s3}....Goo
0000000090: 64 20 77 6f 72 6b 20 3a 50                        d.work.:P

***************************************************************************
```
DATA属性に文字が出てきたので，いい感じに調整するとFlagが手に入る．
![画像_2023-01-04_000759979.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086568/08c21990-d667-60e9-402c-61b24dbb232b.png)
<details><summary>Flag</summary>

```rb:Flag
inctf{1_is_n0t_EQu4l_7o_2_bUt_th1s_d0s3nt_m4ke_s3ns3}
```
</details>

# おまけ
## galf.jpegの画像
![galf.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086568/995a6b9b-6576-a23d-60eb-c4310c8d9f86.jpeg)
## Screenshot1.pngの画像
![Screenshot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086568/a3e314ca-6233-5c05-505e-900cd71d9656.png)

## MFTについて
NTFSファイルシステムにはMFTという領域が存在している．
MFTは，ボリューム全体の管理情報やボリューム内の全ファイル，フォルダのエントリや属性情報を持っている．
また，MFTは$で始まるメタファイルの群と、各ファイル/フォルダのレコード (1 KBytes 固定長) で構成されている[^1]．

複数の属性[^2]がある中で`$DATA`属性には，ファイルのデータが記録されており，1レコードの上限である1KBを超えない限りファイルのデータはMFT内に保存されることになる．そのため，比較的ファイルサイズが小さい傾向のあるtxtファイルだとMFTにデータが残っていることが期待される．

より詳細に知りたい場合は，注釈[^1]の「【図解】NTFSファイルシステムの仕組みと構造解析～MFT, 拡張属性, 代替データストリーム～」を読むと理解しやすい．

[^1]:[【図解】NTFSファイルシステムの仕組みと構造解析～MFT, 拡張属性, 代替データストリーム～](https://milestone-of-se.nesuke.com/sv-basic/windows-basic/ntfs-filesystem-structure/)
[^2]:[ATTRIBUTE_LIST_ENTRY構造体](https://learn.microsoft.com/ja-jp/windows/win32/devnotes/attribute-list-entry#members)