tools
CTF
Forensics

ちょっとThe Sleuth Kit使ってみたその1

はじめに

フォレンジック超絶初心者だけど、ちょっと使えたらかっこよさそう(便利そう)だと思ったのでこれから少しずつ使っていって忘れないように書いていこうと思いました。The Sleuth Kitは主にファイルシステムの解析するのに便利なツールキットで、ディスクイメージ内の削除ファイルの復元もできます。

The Sleuth Kitの詳細はこちら
https://www.sleuthkit.org/sleuthkit/

環境

$ uname -a
Linux ubuntu 4.4.0-112-generic #135-Ubuntu SMP Fri Jan 19 11:48:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

ファイルシステムの調査

fsstat

ディスクイメージのファイルシステムの詳細情報が表示されます。
ここでは主ボリューム記述子と副ボリューム記述子のファイルシステム、メタデータ、コンテンツの情報が出力されています。

$ fsstat ubuntu-ja-16.04-desktop-amd64.iso

=== PRIMARY VOLUME DESCRIPTOR 1 ===
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: ISO9660
Volume Name: Ubuntu 16.04 LTS ja amd64
Volume Set Size: 1
Volume Set Sequence: 1
Publisher:
Data Preparer: XORRISO-1.4.2 2015.11.28.140001, LIBISOBURN-1.4.2, LIBISOFS-1.4.2, LIBBURN-1.4.2
Recording Application:
Copyright:

METADATA INFORMATION
--------------------------------------------
Path Table Location: 93-93
Inode Range: 0 - 445
hoge Directory Block: 20

CONTENT INFORMATION
--------------------------------------------
Sector Size: 2048
Block Size: 2048
Total Sector Range: 0 - 677943
Total Block Range: 0 - 677943

=== SUPPLEMENTARY VOLUME DESCRIPTOR 1 ===
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: ISO9660
Volume Name:
Volume Set Size: 1
Volume Set Sequence: 1
Publisher:
Data Preparer:
Recording Application:
Copyright:


METADATA INFORMATION
--------------------------------------------
Path Table Location: 155-155
hoge Directory Block: 94
Joliet Name Encoding: UCS-2 Level 3

CONTENT INFORMATION
--------------------------------------------
Sector Size: 2048
Block Size: 2048
Total Sector Range: 0 - 677943
Total Block Range: 0 - 677943

ファイルネームの取得

fls

ディスクイメージ内のファイル名、ディレクトリ名が出力されます。1番左に表示されているのはファイルタイプでd/dがディレクトリ、r/rがファイルを指します。

$ fls ubuntu-ja-16.04-desktop-amd64.iso
d/d 1:  .disk
d/d 2:  EFI
r/r 3:  README.diskdefines
d/d 4:  boot
d/d 5:  casper
d/d 6:  dists
d/d 7:  isolinux
r/r 8:  md5sum.txt
d/d 9:  pool
d/d 10: preseed
d/d 445:    $OrphanFiles

オプションの一部を紹介します。
fls -lのファイルやディレクトリの詳細情報が表示されます。
表示内容を説明すると左からファイルタイプ、iノード番号、ファイル又はディレクトリ名、mtime(ファイルデータの最終修正日時)、atime(ファイルデータの最終アクセス日時)、ctime(ファイルデータとステータスの最終修正日時)、ファイル作成日時、ファイルサイズ、uid(ユーザーID)、gid(グループID)が表示されています。

$ fls -l ubuntu-ja-16.04-desktop-amd64.iso
d/d 1:  .disk   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   2016-04-26 01:52:35 (JST)   2048    0   0
d/d 2:  EFI 0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   2016-04-20 22:29:18 (JST)   2048    0   0
r/r 3:  README.diskdefines  0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   2016-04-20 22:28:35 (JST)   230 0   0
d/d 4:  boot    0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   2016-04-20 22:29:18 (JST)   2048    0   0
d/d 5:  casper  0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   2016-04-26 01:42:08 (JST)   2048    0   0
d/d 6:  dists   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   2016-04-20 22:28:35 (JST)   2048    0   0
d/d 7:  isolinux    0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   2016-04-26 01:54:46 (JST)   6144    0   0
r/r 8:  md5sum.txt  0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   2016-04-26 01:57:13 (JST)   20821   0   0
d/d 9:  pool    0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   2016-04-20 22:28:36 (JST)   2048    0   0
d/d 10: preseed 0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   2016-04-26 01:55:54 (JST)   2048    0   0
d/d 445:    $OrphanFiles    0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0000-00-00 00:00:00 (UTC)   0   0   0

fls -rでイメージ内のファイルやディレクトリを再帰的に表示することができます。
ただし、削除済みディレクトリには適応されません。ディレクトリ階層は+によって表記されています。
iノード番号の前に*がついているファイルは削除済みファイルです。出力された情報が多いので省略しています。

$  fls -r ubuntu-ja-16.04-desktop-amd64.iso
d/d 1:  .disk
+ r/r 11:   base_installable
+ r/r 12:   casper-uuid-4.4.0-21-generic
+ r/r 13:   cd_type
+ r/r 14:   info
+ r/r 15:   release_notes_url
d/d 2:  EFI
+ d/d 16:   BOOT
++ r/r 125: BOOTx64.EFI
++ r/r 126: grubx64.efi
r/r 3:  README.diskdefines
d/d 4:  boot
+ d/d 17:   grub
++ r/r 127: efi.img
++ r/r 128: font.pf2
++ r/r 129: grub.cfg
++ r/r 130: loopback.cfg
++ d/d 131: x86_64-efi
+++ r/r 146:    acpi.mod
+++ r/r 147:    adler32.mod
+++ r/r 148:    ahci.mod
(省略)
d/d 10: preseed
+ r/r 122:  cli.seed
+ r/r 123:  ltsp.seed
+ r/r 124:  ubuntu.seed
d/d 445:    $OrphanFiles
+ -/r * 441:    OrphanFile-441
+ -/r * 442:    OrphanFile-442
+ -/r * 443:    OrphanFile-443
+ -/r * 444:    OrphanFile-444

-pでファイルやディレクトリのフルパスを表示させることができるので、fls -prと実行することで、ファイル、ディレクトリのフルパスを出力することができます。出力された情報が多いので省略しています。

$ fls -pr ubuntu-ja-16.04-desktop-amd64.iso
d/d 1:  .disk
r/r 11: .disk/base_installable
r/r 12: .disk/casper-uuid-4.4.0-21-generic
r/r 13: .disk/cd_type
r/r 14: .disk/info
r/r 15: .disk/release_notes_url
d/d 2:  EFI
d/d 16: EFI/BOOT
r/r 125:    EFI/BOOT/BOOTx64.EFI
r/r 126:    EFI/BOOT/grubx64.efi
r/r 3:  README.diskdefines
d/d 4:  boot
d/d 17: boot/grub
r/r 127:    boot/grub/efi.img
r/r 128:    boot/grub/font.pf2
r/r 129:    boot/grub/grub.cfg
r/r 130:    boot/grub/loopback.cfg
d/d 131:    boot/grub/x86_64-efi
r/r 146:    boot/grub/x86_64-efi/acpi.mod
r/r 147:    boot/grub/x86_64-efi/adler32.mod
r/r 148:    boot/grub/x86_64-efi/ahci.mod
(省略)
d/d 10: preseed
r/r 122:    preseed/cli.seed
r/r 123:    preseed/ltsp.seed
r/r 124:    preseed/ubuntu.seed
d/d 445:    $OrphanFiles
-/r * 441:  $OrphanFiles/OrphanFile-441
-/r * 442:  $OrphanFiles/OrphanFile-442
-/r * 443:  $OrphanFiles/OrphanFile-443
-/r * 444:  $OrphanFiles/OrphanFile-444

-dで削除済みエントリのみの表示が可能になるので多くの情報の中の削除済みファイルなどを見つける際には-drを付けるとがイメージファイル全体から削除ファイルやディレクトリを見つけやすいと思います。

$ fls -dr ubuntu-ja-16.04-desktop-amd64.iso
-/r * 441:  $OrphanFiles/OrphanFile-441
-/r * 442:  $OrphanFiles/OrphanFile-442
-/r * 443:  $OrphanFiles/OrphanFile-443
-/r * 444:  $OrphanFiles/OrphanFile-444

ffind

イメージファイルとiノード番号を指定してそのiノード番号が割り当てられているファイル、ディレクトリを表示します。
例えば、先程のflsコマンドでiノード番号1には.diskが割り当てられていることがわかっています。
試しに、iノード番号1を指定してffindを実行してみると.diskディレクトリが見つかります。
(-aでオプション指定すると指定したiノード番号に関係するファイルやディレクトリが表示されます。)

$ ffind -a ubuntu-ja-16.04-desktop-amd64.iso 1
/.disk
/.disk/.
/.disk/..

参考

https://www.kazamiya.net/

終わりに

正直、ffindを使う場面があまりわかっていないので、教えていただきたい...。