2021年12月31日金曜日

セキュリティ・ミニキャンプオンライン2021 参加記 ~内容編1:ファイルシステムについて仕組みを知ろう~

ミニキャンプオンライン2021「ファイルシステムについて仕組みを知ろう」の募集課題、事前課題、講義、修了試験についての記事です。

他講義リンク

 

ファイルシステムについて仕組みを知ろう

FAT32ファイルシステムのデータ構造についての講義でした。事前課題はありませんでした。

普段意識しないファイルシステムの構造を触れ、作った人はやっぱり賢いな〜という気持ちや、削除されたファイルにちゃんとアクセス出来たときは達成感がありました……

一年前(5iiのユメ)の伏線回収。

募集課題

USBメモリダンプの一部を渡され、削除された可能性のあるファイルの名前を答える問題でした。ミニキャンプオンライン概要ページ(https://www.security-camp.or.jp/minicamp/online2021.html)募集要項の問題1にあたります。

自分はhttp://elm-chan.org/docs/fat.htmlを参考に解きました。

ファイルの削除はSFNエントリのDIR_Name[0]に0xE5をセットするとのことなので、0x1fc520のファイルが削除されたことがわかりました。0x1fc500がLFNエントリと考えられ、sec.txtが削除されたと考えられます。(この記事執筆してるときに、提出物のアドレスが間違ってることに気づきました…)

また、自分は

「0x1fc53aから2バイトがファイルの実体の先頭を指すクラスタ番号のため、7番目のクラスタを調べると復元できる可能性がある」

とドヤ顔で書いて提出しましたが、間違っています。

クラスタ番号はDIR_FstClusHi(オフセット0x14、クラスタ番号の上位16bitを格納)とDIR_FstClusLo(オフセット0x1A、クラスタ番号の下位16bitを格納)と分かれており、今回はDIR_FstClusHiが0(課題の0x1fc534から2byte)だったため7番目というのは合っているのですが、説明として不適切です。二度とドヤ顔しません。

講義

初めにデジタルフォレンジックで行うこと、その時使うツールなどについて学び、その次に募集課題で行ったディレクトリエントリ構造体を手動で読み、最後にファイルへのアクセスを行いました。

ファイルへのアクセス

ファイルへのアクセスを行うには

  1. 1クラスタのサイズ
  2. 第2クラスタのディスク上の位置
  3. アクセスしたいデータのクラスタ番号
  4. FATテーブルの割り当て状況

が必要なことがわかりました。1と2はFATのヘッダ、3がディレクトリ構造体、4がブートセクタ等の直後にFATテーブルがあり、そこで確認することができます。今回は修了試験のイメージを使って説明していきます。

1.1クラスタのサイズ

1クラスタのサイズを求めるには、1クラスタが何セクタで構成されているか(BPB_SecPerClus)と1セクタが何バイトなのか(BPB_BytePerSec)を読む必要があります。

この二つの値はFATのヘッダにあり、BPB_ByteSecがオフセット0xBにサイズが2byte、BPB_SecPerClusがオフセット0xDにサイズが1byteで格納されています。

修了試験のイメージで確認すると


となっています。赤がBPB_ByteSec、青がBPB_SecPerClusです。

FATはx86向けに開発されてきたという歴史があるらしく、値はすべてリトルエンディアンで格納されています。

そのため、BPB_ByteSecが0x200=512byte、BPB_SecPerClusが0x08であり、1クラスタ=8セクタ=4096byteであることがわかります。

2.第2クラスタのディスク上の位置

第1クラスタはFATのメタデータ等の領域となっており、上記クラスタサイズに従っていないらしいです。転載許可が出ているため、以下に資料のファイルシステム図を示します。

引用:セキュリティキャンプ

先頭のブートセクタはBPB_ResvdSecCnt(オフセット0xE、2byte)、FATテーブルの個数はBPB_NumFATs(0x10、1byte)、FATテーブルのサイズはBPB_FATSz32(0x24、4byte)で確認することができます。

修了試験のイメージでは

となっていて、赤がBPB_ResvdSecCnt、青がBPB_NumFATs、緑がBPB_FATSz32です。

したがって、BPB_ResvdSecCntが0x20=32セクタ=16,384byte、BPB_NumFATsが0x2=2個、BPB_FATSz32が0x1ff8=8184セクタ=4,190,208byteとなります。

これらより、第2セクタは16,384+4,190,208*2=8,396,800byteから始まっていることがわかります。

3.アクセスしたいデータのクラスタ番号

2.よりディレクトリエントリ構造体を見ることができます。


今回は削除されたPASSWORD.TXTにアクセスするとします。

アクセスに必要なパラメータは募集課題で扱ったDIR_FstClusHi、DIR_FstClusLoとDIR_FileSize(オフセット0x1c、4byte)です。

PASSWORD.TXTのところを詳しく見ると、

となっています。DIR_FstClusHiが赤、DIR_FstClusLoが青、DIR_FileSizeが緑です。

従ってクラスタ番号は0x000018e8=6376番、ファイルサイズが0x00000110=272byteであることがわかります。

4.FATテーブルの割り当て状況

FATテーブルの割り当てを確認する理由は、ファイルサイズが大きい場合に1クラスタに収まらず複数クラスタにわたっていたり、ファイルの断片化で順番通り記録されていない場合があるからです。

2.で示した通り、FATテーブルはブートセクタ等の直後にあります。そして、4byte(FAT32なので)で割り当てが記述してあり、値の意味は

 

引用:セキュリティキャンプ

となっています。今回は6876番のクラスタがどう割当たっているかを調べるため、skipでBPB_ResvdSec(16384byte、この時点でブートセクタがカットされる)+(4byte*6875)=41880を飛ばし、4byte読むことでわかります。

出力が0x0fffffffなのが確認でき、最終ブロックであることがわかりました。

ファイルへアクセス

ファイルのセクタの位置は

第2セクタの位置+((クラスタ番号-2)*BPB_SecPerClus)

で求められ、バイト位置は上記のBPB_BytesPerSec倍になります。

今回は第2セクタが8,396,800byte(16,388セクタ)で始まっていて、読みたいクラスタが((6376-2)*8)=50,992セクタ=26,107,904byteにあるので、合計で34,504,704byteから272byte読めばいいことがわかります。

やったね!

修了試験

FAT32のイメージが与えられ、その中からFlagを探すという問題。

自分は最後の40分程度で取り組みましたが、結果から言うと時間内に解けませんでした。

試したこと

まず、お得意のstringsコマンド+grepコマンドを使い、フラグ形式"mc2021{"を探してみましたが見つからず。

次にマウントしてみると、以下のように3つの画像ファイルと1つのパスワード付きZipファイルが見えました。

 


ここで求め方がパスワードを探し解凍、その中の画像ファイルにフラグがあるのだと理解しました。

その後、講義で習ったディレクトリ構造体を読むと、PASSWORD.TXTが削除されているので、これを見つけに行く旅に出ました。

裏でstringsコマンドを回し、それっぽいのを試しながら必要な情報を集めてました。

…とここでFATテーブルの割り当てを読んでいるところで時間が来てしまいました。

 

解説時「stringsコマンドで見つけられるようなヤワな問題ではないので」と言われ、まんまとひっかかってしまったワタクシでありました。"ミニ"キャンプ?

また、kaitoさんのWriteUp(https://blog.uta8a.net/post/2021-11-20-minicamp-writeup)見たらツール使ってて、その手があったか~~~ってなりました、完敗です。



0 件のコメント:

コメントを投稿