【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