🕊️

【CTF】SECCON 2018 「History」 解説

2024/06/26に公開

はじめに

過去問リポジトリ

https://github.com/SECCON/SECCON2018_online_CTF/tree/master/Forensics/History

前提

  • 問題一式
    • question.txt
    • J.zip_4c7050d70c9077b8c94ce0d76effcb8676bed3ba(リポジトリの files ディレクトリに存在するファイルです.)
    • flag.txt
    • フォレンジクス問題
  • 環境
    • macOS
    • M1 チップ
    • pip がインストールされている
    • brew がインストールされている
  • 目標
    • question.txtJ.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 ジャーナルをパースしてみよう.今回は Pythonusnparser を利用する.まずはインスコ.

$ 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
<省略>

うーん.絞っただけでも膨大でワロた.
実は,このセキュリティコンテストは flagSECCON{} で囲まれていることが既知です.なので,ちょっとその実行の状態で, /{ と入力してみましょうか.そしたら,ちょっと前後を見てみると...

<省略>
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 のファイルシステムの変更履歴が見えるやつらしいですね.

参考文献

https://gihyo.jp/book/2022/978-4-297-13180-7

その他

Discussion