hacktricks/forensics/basic-forensic-methodology/partitions-file-systems-carving/ext.md

19 KiB
Raw Permalink Blame History

htARTEHackTricks AWS Red Team Expert htARTEHackTricks AWS Red Team ExpertでAWSハッキングをゼロからヒーローまで学びましょう

HackTricksをサポートする他の方法

Ext - 拡張ファイルシステム

Ext2は、ブートパーティションのようなほとんど変更されないパーティションに最も一般的なジャーナリングされていないファイルシステムです。Ext3/4ジャーナリングされ、通常は残りのパーティションに使用されます。

ファイルシステム内のすべてのブロックグループは同じサイズで連続して格納されています。これにより、カーネルは整数インデックスからディスク上のブロックグループの場所を簡単に導出できます。

各ブロックグループには、次の情報が含まれています:

  • ファイルシステムのスーパーブロックのコピー
  • ブロックグループ記述子のコピー
  • グループ内の空きブロックを識別するために使用されるデータブロックビットマップ
  • グループ内の空きinodeを識別するために使用されるinodeビットマップ
  • inodeテーブル連続した一連のブロックで構成され、それぞれが事前定義の図1 Ext2 inode番号のinodeを含んでいます。すべてのinodeのサイズは同じです128バイト。1,024バイトのブロックには8つのinodeが含まれ、4,096バイトのブロックには32のinodeが含まれます。Ext2では、inode番号と対応するブロック番号のマッピングをディスク上に保存する必要はないため、後者の値はブロックグループ番号とinodeテーブル内の相対位置から導出できます。たとえば、各ブロックグループに4,096のinodeが含まれ、ディスク上のinode 13,021のアドレスを知りたい場合を考えてみましょう。この場合、inodeは3番目のブロックグループに属し、そのディスクアドレスは対応するinodeテーブルの733番目のエントリに格納されています。inode番号は、Ext2ルーチンがディスク上の適切なinode記述子を迅速に取得するために使用するキーであることがわかります。
  • ファイルを含むデータブロック。意味のない情報を含まないブロックはすべて空きと言われます。

Extオプション機能

機能はデータの配置場所に影響を与え、inode内のデータの格納方法に影響を与え、いくつかは分析のための追加メタデータを提供する可能性があるため、機能はExtで重要です。

ExtにはOSがサポートするかしないかに関わらず、3つの可能性があるオプション機能があります

  • 互換性あり
  • 互換性なし
  • 読み取り専用互換性:マウントできますが書き込みはできません

互換性のない機能がある場合、OSはデータへのアクセス方法を知らないため、ファイルシステムをマウントできません。

{% hint style="info" %} 疑わしい攻撃者は標準外の拡張機能を持っている可能性があります {% endhint %}

スーパーブロックを読む任意のユーティリティは、Extファイルシステム機能を示すことができますが、file -sL /dev/sd*を使用しても同様の情報を取得できます。

スーパーブロック

スーパーブロックは最初の1024バイトから始まり、各グループの最初のブロックに繰り返され、次の情報を含んでいます

  • ブロックサイズ
  • 総ブロック数
  • ブロックグループごとのブロック数
  • 最初のブロックグループの前に予約されたブロック数
  • 総inode数
  • ブロックグループごとのinode数
  • ボリューム名
  • 最終書き込み時刻
  • 最終マウント時刻
  • ファイルシステムが最後にマウントされたパス
  • ファイルシステムのステータス(クリーン?)

Extファイルシステムファイルからこの情報を取得することが可能です

fsstat -o <offsetstart> /pat/to/filesystem-file.ext
#You can get the <offsetstart> with the "p" command inside fdisk

あなたは無料のGUIアプリケーションを使用することもできますhttps://www.disk-editor.org/index.html
また、pythonを使用してスーパーブロック情報を取得することもできます:https://pypi.org/project/superblock/

inodes

inodesには、ファイルの実際のデータを含むブロックのリストが含まれています。
ファイルが大きい場合、inodeにはファイルデータを含むブロック/他のinodeを指すポインタが含まれる場合があります。

Ext2およびExt3のinodeはサイズが128Bであり、Ext4は現在156Bを使用していますが、将来の拡張を許可するためにディスク上に256Bを割り当てています。

Inode構造

オフセット サイズ 名前 説明
0x0 2 ファイルモード ファイルモードとタイプ
0x2 2 UID オーナーIDの下位16ビット
0x4 4 サイズ Il ファイルサイズの下位32ビット
0x8 4 Atime エポックからのアクセス時間(秒単位)
0xC 4 Ctime エポックからの変更時間(秒単位)
0x10 4 Mtime エポックからの変更時間(秒単位)
0x14 4 Dtime エポックからの削除時間(秒単位)
0x18 2 GID グループIDの下位16ビット
0x1A 2 Hlink count ハードリンク数
0xC 4 Blocks Io ブロック数の下位32ビット
0x20 4 フラグ フラグ
0x24 4 Union osd1 LinuxIバージョン
0x28 69 Block[15] 15つのデータブロックを指す
0x64 4 バージョン NFS用のファイルバージョン
0x68 4 File ACL low 拡張属性ACLなどの下位32ビット
0x6C 4 File size hi ファイルサイズの上位32ビットext4のみ
0x70 4 Obsolete fragment 廃止されたフラグメントアドレス
0x74 12 Osd 2 第2のオペレーティングシステム依存のユニオン
0x74 2 Blocks hi ブロック数の上位16ビット
0x76 2 File ACL hi 拡張属性ACLなどの上位16ビット
0x78 2 UID hi オーナーIDの上位16ビット
0x7A 2 GID hi グループIDの上位16ビット
0x7C 2 Checksum Io inodeチェックサムの下位16ビット

"Modify"はファイルの_内容_が最後に変更された時間のタイムスタンプです。これは一般的に"mtime"と呼ばれます。
"Change"はファイルの_inode_が変更された最後の時間のタイムスタンプであり、権限、所有権、ファイル名、およびハードリンクの数などが変更されたことを示します。これは一般的に"ctime"と呼ばれます。

Inode構造の拡張Ext4

オフセット サイズ 名前 説明
0x80 2 追加サイズ 標準の128バイトを超えて使用されるバイト数
0x82 2 チェックサム上位 inodeチェックサムの上位16ビット
0x84 4 Ctime extra 変更時間の追加ビット
0x88 4 Mtime extra 変更時間の追加ビット
0x8C 4 Atime extra アクセス時間の追加ビット
0x90 4 Crtime ファイル作成時間(エポックからの秒数)
0x94 4 Crtime extra ファイル作成時間の追加ビット
0x98 4 Version hi バージョンの上位32ビット
0x9C 未使用 将来の拡張のための予約スペース

特別なinode

Inode 特別な目的
0 そのようなinodeは存在せず、番号付けは1から開始します
1 欠陥ブロックリスト
2 ルートディレクトリ
3 ユーザークォータ
4 グループクォータ
5 ブートローダ
6 削除されたディレクトリ
7 予約されたグループ記述子(ファイルシステムのサイズ変更用)
8 ジャーナル
9 除外inodeスナップショット用
10 レプリカinode
11 最初の非予約inodeしばしばlost + found

{% hint style="info" %} 作成時間はExt4にのみ表示されることに注意してください。 {% endhint %}

inode番号を知っていると、そのインデックスを簡単に見つけることができます

  • inodeが属するブロックグループInode番号 - 1/グループあたりのinode数
  • グループ内のインデックスInode番号 - 1modInodes/groups
  • inodeテーブルへのオフセットInode番号 *Inodeサイズ
  • inode 0は未定義使用されていないため、「-1」があります。
ls -ali /bin | sort -n #Get all inode numbers and sort by them
stat /bin/ls #Get the inode information of a file
istat -o <start offset> /path/to/image.ext 657103 #Get information of that inode inside the given ext file
icat -o <start offset> /path/to/image.ext 657103 #Cat the file

ファイルモード

番号 説明
15 Reg/Slink-13/Socket-14
14 Directory/Block Bit 13
13 Char Device/Block Bit 14
12 FIFO
11 Set UID
10 Set GID
9 Sticky Bit (without it, anyone with Write & exec perms on a directory can delete and rename files)
8 Owner Read
7 Owner Write
6 Owner Exec
5 Group Read
4 Group Write
3 Group Exec
2 Others Read
1 Others Write
0 Others Exec

太字のビット12、13、14、15はファイルの種類を示し、太字のオプションは1つだけ存在します。

ディレクトリ

オフセット サイズ 名前 説明
0x0 4 Inode
0x4 2 Rec len Record length
0x6 1 Name len Name length
0x7 1 File type

0x00 Unknown
0x01 Regular

0x02 Director

0x03 Char device

0x04 Block device

0x05 FIFO

0x06 Socket

0x07 Sym link

0x8 Name Name string (up to 255 characters)

パフォーマンスを向上させるために、Root hash Directory blocks may be used.

拡張属性

保存される場所

  • ード間の余分なスペース256 - イノードサイズ、通常 = 100
  • ード内のfile_aclが指すデータブロック

"ユーザー"で始まる名前の属性を使用して、ユーザーの属性として何でも保存できます。この方法でデータを隠すことができます。

拡張属性エントリ

オフセット サイズ 名前 説明
0x0 1 Name len 属性名の長さ
0x1 1 Name index

0x0 = no prefix

0x1 = user. Prefix

0x2 = system.posix_acl_access

0x3 = system.posix_acl_default

0x4 = trusted.

0x6 = security.

0x7 = system.

0x8 = system.richacl

0x2 2 Value offs 最初のイノードエントリまたはブロックの開始からのオフセット
0x4 4 Value blocks 値が保存されているディスクブロック、またはこのブロックの場合はゼロ
0x8 4 Value size 値の長さ
0xC 4 Hash ブロック内の属性のハッシュ、またはイノード内の場合はゼロ
0x10 Name 末尾のNULLを除いた属性名
setfattr -n 'user.secret' -v 'This is a secret' file.txt #Save a secret using extended attributes
getfattr file.txt #Get extended attribute names of a file
getdattr -n 'user.secret' file.txt #Get extended attribute called "user.secret"

ファイルシステムビュー

ファイルシステムの内容を確認するには、無料ツールを使用できます: https://www.disk-editor.org/index.html
または、mountコマンドを使用してLinuxにマウントすることもできます。

https://piazza.com/class_profile/get_resource/il71xfllx3l16f/inz4wsb2m0w2oz#:~:text=The%20Ext2%20file%20system%20divides,lower%20average%20disk%20seek%20time.