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

## はじめに

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

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

## 環境

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

```sh
$ 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`がファイルを指します。

```sh
$ 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)が表示されています。

```sh
$ 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ノード番号の前に`*`がついているファイルは削除済みファイルです。出力された情報が多いので省略しています。

```sh
$  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`と実行することで、ファイル、ディレクトリのフルパスを出力することができます。出力された情報が多いので省略しています。

```sh
$ 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`を付けるとがイメージファイル全体から削除ファイルやディレクトリを見つけやすいと思います。

```sh
$ 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ノード番号に関係するファイルやディレクトリが表示されます。)

```sh
$ ffind -a ubuntu-ja-16.04-desktop-amd64.iso 1
/.disk
/.disk/.
/.disk/..
```
## 参考
https://www.kazamiya.net/

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