はじめに
前回に続きLab3を解いていく,また使用するツールなどの備忘録を残す.
MemLabs
P.Abhiram Kumar氏が公開しているCTFスタイルでメモリフォレンジックを学ぶことができる教材で,Githubにて公開されています。
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}。
初動調査
取り敢えず,メモリダンプ取得時に起動していたプロセス情報を確認.
気になる点としては,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
ダンプしたファイルを開くと,以下のようなコードが組まれていました.
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
の中身は以下のようになっていました.
am1gd2V4M20wXGs3b2U=
evilscript.py
の逆の処理を組んでもいいですが,めんどくさいのでCyberChefという便利なツールを使いました.
非常に楽ですね,OutputにFlagの前半が出力されてました.
Flag前半
inctf{0n3_h4lf
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!
ちなみに,画像は次のようになっている.
ここで,問題の注釈を振り返ると次のような記載があるため,前半のFlagをパスワードとして入力してみるとファイルの抽出が行われFlagの後半が手に入った.
あなたは2番目のフラグを取得するために、フラグの前半が必要になります。
$ steghide extract -sf suspision1.jpeg -p inctf{0n3_h4lf
wrote extracted data to "secret text".
Flag後半
_1s_n0t_3n0ugh}
Flag
inctf{0n3_h4lf_1s_n0t_3n0ugh}
おまけ
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