【CTF】SECCON 2018 「History」 解説
はじめに
過去問リポジトリ
前提
-
問題一式
question.txt-
J.zip_4c7050d70c9077b8c94ce0d76effcb8676bed3ba(リポジトリのfilesディレクトリに存在するファイルです.) flag.txt- フォレンジクス問題
- 環境
- macOS
- M1 チップ
-
pipがインストールされている -
brewがインストールされている
- 目標
-
question.txtとJ.zip_4c7050d70c9077b8c94ce0d76effcb8676bed3baの2種類のファイルからflag.txtと同じ情報を取り出す.
-
本題
問題把握
cat コマンド
cat コマンドを使って,問題を把握しましょう.
$ cat question.txt
History
Check changed filename.
file:J.zip_4c7050d70c9077b8c94ce0d76effcb8676bed3ba
ほう. J.zip_4c7050d70c9077b8c94ce0d76effcb8676bed3ba ファイルから「History」的な内容である「名前変更されたファイル」を確認するって感じか?
mv コマンド
まず,わずわらしいから, mv コマンドを使って, J.zip_4c7050d70c9077b8c94ce0d76effcb8676bed3ba というファイル名を J.zip に変えておこう.
files/ ディレクトリにこのファイルを持ってる人は,
$ mv files/J.zip_4c7050d70c9077b8c94ce0d76effcb8676bed3ba J.zip
ファイルを既に question.txt と同じディレクトリに持ってきてる人は,
$ mv J.zip_4c7050d70c9077b8c94ce0d76effcb8676bed3ba J.zip
を実行しよう.
file コマンド
file コマンドを使って, J.zip がなんのファイルか確認しよう.本当に zip ファイルだろうか.
$ file J.zip
J.zip: Zip archive data, at least v2.0 to extract, compression method=deflate
まあ, zip ファイルっぽいな.
unzip コマンド
とりあえず,展開してみるか.
$ unzip J.zip
Archive: J.zip
inflating: J
ファイル J が得られましたね.
ファイル J の正体を探る
file コマンド
ファイルがどういう種類か見てくれる file コマンド君で正体を探るか.
$ file J
J: data
なんの情報も得られませんでしたね. file コマンド君は,何かしらのデータであるとしか,判断できなかったらしいですね.
strings コマンド
バイナリデータから何かしらの文字列を探ってくれる strings コマンド君で正体を探るか.出力が多くなるかもしれんから,パイプ | で less コマンドちゃんに渡してあげよう.
$ strings J | less
t cI
t cI
t cI
t cI
<省略>
a1`@
a1`@
a1`@
a1`@
a1`@
a1`@
ダメみたいですね.有益な情報は得られそうにありません.うーん.
hexdump コマンド
ASCII 文字で見たら何かワンチャン得られないかな.ということで, hexdump コマンドちゃんで正体を探るか.これも出力が多いかもしれんから, less コマンドちゃんに渡してあげよう.
| オプション | 説明 |
|---|---|
| -C | ASCII と 16進数で出力する. |
$ hexdump -C J | less
00000000 60 00 00 00 02 00 00 00 55 ed 00 00 00 00 23 00 |`.......U.....#.|
00000010 61 08 00 00 00 00 01 00 d0 73 3f 01 00 00 00 00 |a........s?.....|
00000020 a4 df f6 d3 62 49 d1 01 00 01 00 00 00 00 00 00 |....bI..........|
00000030 00 00 00 00 20 00 00 00 22 00 3c 00 6e 00 67 00 |.... ...".<.n.g.|
00000040 65 00 6e 00 5f 00 73 00 65 00 72 00 76 00 69 00 |e.n._.s.e.r.v.i.|
00000050 63 00 65 00 2e 00 6c 00 6f 00 63 00 6b 00 00 00 |c.e...l.o.c.k...|
00000060 60 00 00 00 02 00 00 00 a7 56 00 00 00 00 01 00 |`........V......|
なんか, s.e.r.v.i.c.e...l.o.c.k とか意味のある文字っぽいのが見えた!!
gstrings コマンド
ドット (.) 区切りで文字が出てるってことは, ASCII のような1バイトの文字ではなく,2バイトの文字である予想ができる.
なので, gstrings コマンド君を使って,バイト数を指定して文字列を探索するか.
$ brew install binutils
<省略>
If you need to have binutils first in your PATH, run:
echo 'export PATH="/opt/homebrew/opt/binutils/bin:$PATH"' >> ~/.zshrc
<省略>
パスを通すのめんどいから,フルパスで実行するか.
gstrings
| オプション | 説明 |
|---|---|
| -n | 引数に指定した「数字バイト」で文字を解釈する. |
出力が改行('\n')区切りなので, tr コマンド君を使って,出力を見やすくする.
tr
| オプション | 説明 |
|---|---|
| -d | 引数に指定した文字を削除する. |
出力はどうせめっちゃ多いから, less コマンドちゃんを使う.ちなみに, less コマンド内で, vim のコマンドが一部使えるので,色々検索ができる.
では,実際にコマンドを実行してみるか.
$ /opt/homebrew/opt/binutils/bin/gstrings -n 1 J | tr -d '\n' | less
`U#as?bI "<ngen_service.lock`Va0t?bI <ngen_service.log`Vat?
<省略>
とある本によると,この出力を見ると,なんやかんやこれは Windows の USN(Updated Sequence Number) ジャーナルであるとわかるらしい.
USN ジャーナルを調べる
usnparser ライブラリ
というわけで, USN ジャーナルをパースしてみよう.今回は Python の usnparser を利用する.まずはインスコ.
$ pip install usnparser
そしたら,実行しよか.
| オプション | 説明 |
|---|---|
| -f | 引数に対象ファイル |
| -o | 引数に出力先ファイル |
$ usn.py -f J -o output.txt
ほんで, output.txt が出力された.
less コマンド
ちょっと覗いてみようか.
$ less output.txt
2016-01-07 15:48:18.224937 | ngen_service.lock | ARCHIVE | FILE_CREATE
2016-01-07 15:48:18.224937 | ngen_service.log | ARCHIVE | DATA_EXTEND
2016-01-07 15:48:18.224937 | ngen_service.log | ARCHIVE | DATA_EXTEND CLOSE
2016-01-07 15:48:18.224937 | ngen_service.lock | ARCHIVE | FILE_CREATE FILE_DELETE CLOSE
2016-01-07 15:48:18.224937 | ngenservicelock.dat | ARCHIVE | FILE_CREATE FILE_DELETE CLOSE
ちゃんと意味ある文字列が得られたぞーー.
答え合わせ
grep コマンド
問題文に立ち返ると,「History」的な内容である「名前変更されたファイル」を確認するって感じだった気がする.だから, grep コマンド君を使って,候補を絞ろうか. RENAME で絞ってみよか.
$ cat output.txt|grep "RENAME" | less
2016-01-07 15:48:18.661808 | AuditPolicyGPManagedStubs.Interop.dll | ARCHIVE | RENAME_OLD_NAME
2016-01-07 15:48:18.661808 | AuditPolicyGPManagedStubs.Interop.ni.dll | ARCHIVE | RENAME_NEW_NAME
2016-01-07 15:48:18.661808 | AuditPolicyGPManagedStubs.Interop.ni.dll | ARCHIVE | RENAME_NEW_NAME CLOSE
2016-01-07 15:48:18.864639 | BDATunePIA.dll | ARCHIVE | RENAME_OLD_NAME
<省略>
うーん.絞っただけでも膨大でワロた.
実は,このセキュリティコンテストは flag が SECCON{} で囲まれていることが既知です.なので,ちょっとその実行の状態で, /{ と入力してみましょうか.そしたら,ちょっと前後を見てみると...
<省略>
2018-09-29 07:51:24.557945 | SEC.txt | ARCHIVE | RENAME_OLD_NAME
2018-09-29 07:51:24.557945 | CON{.txt | ARCHIVE | RENAME_NEW_NAME
2018-09-29 07:51:24.557945 | CON{.txt | ARCHIVE | RENAME_NEW_NAME CLOSE
2018-09-29 07:52:22.779984 | CON{.txt | ARCHIVE | RENAME_OLD_NAME
2018-09-29 07:52:22.779984 | F0r.txt | ARCHIVE | RENAME_NEW_NAME
2018-09-29 07:52:22.779984 | F0r.txt | ARCHIVE | RENAME_NEW_NAME CLOSE
2018-09-29 07:52:26.330582 | WmiApRpl_new.h | ARCHIVE | RENAME_OLD_NAME
2018-09-29 07:52:26.330582 | WmiApRpl.h | ARCHIVE | RENAME_NEW_NAME
2018-09-29 07:52:26.330582 | WmiApRpl.h | ARCHIVE | RENAME_NEW_NAME CLOSE
2018-09-29 07:52:26.330582 | WmiApRpl_new.ini | ARCHIVE | RENAME_OLD_NAME
2018-09-29 07:52:26.330582 | WmiApRpl.ini | ARCHIVE | RENAME_NEW_NAME
2018-09-29 07:52:26.330582 | WmiApRpl.ini | ARCHIVE | RENAME_NEW_NAME CLOSE
2018-09-29 07:52:53.691992 | F0r.txt | ARCHIVE | RENAME_OLD_NAME
2018-09-29 07:52:53.691992 | ensic.txt | ARCHIVE | RENAME_NEW_NAME
2018-09-29 07:52:53.691992 | ensic.txt | ARCHIVE | RENAME_NEW_NAME CLOSE
2018-09-29 07:53:08.622816 | ensic.txt | ARCHIVE | RENAME_OLD_NAME
2018-09-29 07:53:08.622816 | s.txt | ARCHIVE | RENAME_NEW_NAME
2018-09-29 07:53:08.622816 | s.txt | ARCHIVE | RENAME_NEW_NAME CLOSE
2018-09-29 07:54:24.492611 | s.txt | ARCHIVE | RENAME_OLD_NAME
2018-09-29 07:54:24.492611 | _usnjrnl.txt | ARCHIVE | RENAME_NEW_NAME
2018-09-29 07:54:24.492611 | _usnjrnl.txt | ARCHIVE | RENAME_NEW_NAME CLOSE
2018-09-29 07:54:38.376635 | _usnjrnl.txt | ARCHIVE | RENAME_OLD_NAME
2018-09-29 07:54:38.376635 | 2018}.txt | ARCHIVE | RENAME_NEW_NAME
2018-09-29 07:54:38.376635 | 2018}.txt | ARCHIVE | RENAME_NEW_NAME CLOSE
2018-09-29 07:55:37.377165 | AccessData_FTK_Imager_4.1.1_x64.exe | ARCHIVE NOT_CONTENT_INDEXED | RENAME_OLD_NAME
2018-09-29 07:55:37.377165 | AccessData_FTK_Imager_4.1.1_x64.exe | ARCHIVE NOT_CONTENT_INDEXED | RENAME_NEW_NAME
2018-09-29 07:55:37.377165 | AccessData_FTK_Imager_4.1.1_x64.exe | ARCHIVE NOT_CONTENT_INDEXED | RENAME_NEW_NAME CLOSE
うを. XXX.txt というファイルの変更履歴っぽいところを追ってみると,ななななんと
SEC + CON{ + F0r + ensic + s + _usnjrnl + 2018}
という文字が見えますねぇ.
これは確かに, flag.txt と中身(SECCON{F0rensics_usnjrnl2018})が合致します.
おわりに
まとめ
- 今回の題材がフォレンジクスと書いてあるように, USN ジャーナルというのは, Windows のファイルシステムの変更履歴が見えるやつらしいですね.
参考文献
Discussion