Inhalt Allgemeines zu Dateisystemen Linux-Dateisysteme am Beispiel von ext2/ext3 Microsoft-Dateisysteme FAT NTFS Harald Baier Computerforensik h_da WS 2009/2010 101
Grundlegendes zu NTFS (1/2) NTFS = New Technologies File System Standard-Dateisystem von Microsoft ab Windows NT/2000 Verbreitetstes Dateisystem auf Endanwender-Rechnern Design-Prinzipien für NTFS: Zuverlässigkeit Sicherheit Unterstützung für große Speichermedien Skalierbarkeit Deutlich komplexer als FATx Harald Baier Computerforensik h_da WS 2009/2010 102
Grundlegendes zu NTFS (2/2) Keine offizielle Spezifikation für NTFS veröffentlicht: Zahlreiche detaillierte inoffizielle Beschreibungen (z.b. Carrier) Immer bessere Unterstützung für UNIX / Linux (z.b. durch Debian-Paket ntfsprogs) Zentrales Paradigma: Everything is a file Jedes Byte eines NTFS-Dateisystems gehört zu einer Datei Auch Dateisystem- und Metadaten stehen in Dateien Organisation der HDD-Blöcke in Cluster Cluster 0 startet am Anfang des Laufwerks Am Anfang von Cluster 0 steht der Bootsektor Harald Baier Computerforensik h_da WS 2009/2010 103
Master File Table (MFT) MFT ist das Herzstück von NTFS: Besteht aus MFT-Einträgen: MFT-Record = MFT-Entry Jeder MFT-Record hat gleiche Größe Typischerweise 1 KByte Größe eines MFT-Records steht in Bootsektor Empfehlung von Microsoft: Am Anfang ist die MFT minimal Dann wächst die MFT dynamisch bei Bedarf Daher kann sie fragmentiert sein Records sind beginnend von 0 durchnummeriert Harald Baier Computerforensik h_da WS 2009/2010 104
Zwei Bereiche eines MFT-Records MFT-Entry-Header: Größe: 42 Byte Strukturiert: 12 Felder: 'Signature' (FILE oder BAAD), Belegtstatus, Verwendete Bytes in MFT-Record,... MFT-Entry-Body: Größe: 982 Byte 'unstrukturiert', enthält MFT-Attribute Attribute speichern u.a. Folgendes: Metadaten wie Besitzer, Rechte, MAC-Zeiten, Inhaltsdaten, Dateinamen Unbenutzter Bereich Harald Baier Computerforensik h_da WS 2009/2010 105
Zwei Bereiche eines MFT-Attributs Attribute Header: Größe ist immer 16 Byte Struktur ist allgemein vorgegeben: Attributtyp (= type identifier) Attribute identifier: Eindeutig innerhalb des MFT-Eintrags Größe des Attributs Länge u. Offset des Attributnamens (beginnt mit '$') Attribute Body: Größe wird in Header festgelegt (Keine allgemein vorgegebene Struktur) Speicherung der Attributinhalte: Residentes Attribut: Inhaltsdaten in MFT-Record Nicht-residentes Attribut: MFT-Record enthält Adressen der Datencluster, in denen Attributinhalt gespeichert ist Harald Baier Computerforensik h_da WS 2009/2010 106
Cluster Runs für nicht-residente Attribute Cluster Run = Sequenz aufeinanderfolgender Cluster Speicherung nicht-residenter Attribute in Cluster Runs Jeder Cluster Run enthält folgende Information: Clusteradresse des ersten Clusters des Runs Anzahl der Cluster des Runs Beispiel für Cluster Runs eines Attributs: Start: 12, Length: 4 Start: 80, Length: 3 Start: 56, Length: 5 Harald Baier Computerforensik h_da WS 2009/2010 107
Zeitstempel in NTFS Vier Zeitstempel werden gespeichert: Creation Time: Datei wurde angelegt Modified Time: Letzter schreibender Zugriff MFT Modified Time: Letzte Änderung des MFT-Records Accessed Time: Letzter lesender Zugriff Zeitstempel werden in 64-Bit Integer-Werten gespeichert Anzahl der 0.1 μs seit 01. Januar 1601, 00:00 Uhr UTC Granularität aller Zeiten: Auf 0.1 μs = 100 ns genau Sinnvolles Referenzdatum? EPOCH = 116.444.736.000.000.000 Harald Baier Computerforensik h_da WS 2009/2010 108
Standardattribute (1/3) Type identifier 16: $STANDARD_INFORMATION Immer resident Enthält Besitzer, MAC-Zeitstempel, Flags (Hidden, System,...) Relevante Zeitstempel, da bei Zugriff jeweils aktualisiert Type identifier 48: $FILE_NAME Immer resident Enthält Dateinamen, Elternverzeichnis und MAC-Zeitstempel Weniger relevante Zeitstempel: Zeitpunkt der Dateierstellung Harald Baier Computerforensik h_da WS 2009/2010 109
Standardattribute (2/3) Type identifier 128: $DATA Enthält Inhalt der Datei Resident für 'kleine' Dateien (ca. 700 Bytes) Genau ein Standarddatenfeld: Hat keinen Namen (Anzeige im TSK: $Data) Dateigröße = Größe von $Data Weitere Datenfelder beachten: Alternate Data Streams: Mehrere $DATA-Attribute Weitere Datenattribute müssen Namen besitzen Beispiel: D:> echo Hello world > out.file:foo legt weiteres Datenfeld mit Namen $foo an Harald Baier Computerforensik h_da WS 2009/2010 110
Standardattribute (3/3) Type identifier 80: $SECURITY_DESCRIPTOR Legt Zugriffsrechte und weitere Sicherheitseigenschaften der Datei fest Type identifier 256: $LOGGED_UTILITY_STREAM Enthält Daten zur Entschlüsselung (z.b. für EFS): Verschlüsselten File Encryption Key (FEK) Type identifier 176: $BITMAP Belegtstatus der Datenblöcke (z.b. für MFT oder Verzeichnis) Harald Baier Computerforensik h_da WS 2009/2010 111
Weitere Attribute-Konzepte MFT-Basiseinträge: Relevant, falls ein MFT-Entry nicht alle Attribute speichert Erster MFT-Eintrag ist MFT-Basiseintrag der Datei MFT-Basiseintrag enthält Zuordnung Attributen --> Adressen des zugehörigen MFT-Eintrags in $ATTRIBUTE_LIST Sparse Attributes: Cluster, die nur Nullen speichern, werden nicht auf Datenträger geschrieben Speicherung in Sparse Runs: Kein Startcluster, nur Länge Beispiel: Start: 123, Length: 12 Start: -----, Length: 5 Harald Baier Computerforensik h_da WS 2009/2010 112
File System Metadata Files (1/3) File System Metadata Files = Metadateien: Dienen zur Speicherung von Dateisystemdaten Die ersten 16 MFT-Records sind dafür reserviert Oft beginnen die Benutzerdateien erst bei 64 Einfache Konsequenz aus Paradigma Everything is a file Namen der Metadateien beginnen mit '$' u. Großbuchstaben: Records der MFT: Record 0: $MFT (Eintrag für die MFT selbst) Record 1: $MFTMirr (Backup der ersten MFT-Entries) Harald Baier Computerforensik h_da WS 2009/2010 113
File System Metadata Files (2/3) Record 2: $LogFile Journal für Metadaten-Änderungen Record 3: $Volume Enthält Informationen über Label, Identifier und Version des Volumes Record 4: $AttrDef Werte der im Dateisystem verwendeten Type Identifier der Attribute Größe der Attribute Henne-Ei-Problem (z.b. wie soll man Attribut $DATA lesen, wenn man dessen Type identifier nicht kennt?) Harald Baier Computerforensik h_da WS 2009/2010 114
File System Metadata Files (3/3) Record 5: '.' Wurzelverzeichnis des Dateisystems Record 6: $Bitmap Belegtstatus der Cluster im Dateisystem Record 7: $Boot Bootsektor (beginnt immer ab Cluster 0) Record 9: $Secure Informationen über Sicherheitsstatus und Zugriffskontrollen der Dateien (Security Descriptors) Harald Baier Computerforensik h_da WS 2009/2010 115
Adressierung von MFT-Records Besteht aus zwei Anteilen: File number (Nummer des MFT-Records von oben): 48-Bit Feld Maximale Anzahl an MFT-Records: 2 4 8 (Großteil nicht alloziert) Sequence number: 16-Bit Feld Inkrementiert bei jeder neuen Belegung des Records File reference := Sequence number File number 64-Bit Wert Eindeutig für jede Generation einer Datei Beispiel 0002 0000 0000: 'Dritte' Generation der MFT Harald Baier Computerforensik h_da WS 2009/2010 116
Beispiel: Zugriff auf MFT-Record von $MFT mittels istat baier@watson $ istat /dev/sdb1 [REMOVED] $FILE_NAME Attribute Values: Flags: Hidden, System Name: $MFT [REMOVED] Attributes: Type: $STANDARD_INFORMATION (16-0) Name: N/A Resident size: 72 Type: $FILE_NAME (48-3) Name: N/A Resident size: 74 Type: $DATA (128-1) Name: $Data Non-Resident size: 262144 8533 8534 8535 8536 8537 8538 8539 8540 [REMOVED] Type: $BITMAP (176-5) Name: N/A Non-Resident size: 4104 8532 8018 Harald Baier Computerforensik h_da WS 2009/2010 117
Essentielle Daten des NTFS-Bootsektors ($Boot) Byte-Nr. (dez.) Beschreibung 11 12 Größe eines HDD-Blocks in Bytes 13 13 Größe eines Clusters in HDD-Blöcken 40 47 Größe des Dateisystems in HDD-Blöcken 48 55 Clusteradresse des ersten Clusters der MFT 64 64 Größe eines MFT-Records Berechnung hängt vom Vorzeichen ab 68 68 Größe der Index-Records in Clustern Harald Baier Computerforensik h_da WS 2009/2010 118
Beispiel: Bootsektor einer NTFS-Partition baier@watson $ xxd /dev/sdb1 less 0000000: eb52 904e 5446 5320 2020 2000 0208 0000.R.NTFS... 0000010: 0000 0000 00f8 0000 3f00 ff00 8000 0000...?... 0000020: 0000 0000 8000 0000 ff1f 0300 0000 0000... 0000030: 5521 0000 0000 0000 0200 0000 0000 0000 U!... 0000040: f600 0000 0100 0000 c60a dcee 3fdc ee24...?..$ 0000050: 0000 0000 fa33 c08e d0bc 007c fb68 c007...3....h.. 0000060: 1f1e 6866 00cb 8816 0e00 6681 3e03 004e..hf...f.>..N 0000070: 5446 5375 15b4 41bb aa55 cd13 720c 81fb TFSu..A..U..r... 0000080: 55aa 7506 f7c1 0100 7503 e9dd 001e 83ec U.u...u... 0000090: 1868 1a00 b448 8a16 0e00 8bf4 161f cd13.h...h... 00000a0: 9f83 c418 9e58 1f72 e13b 060b 0075 dba3...x.r.;...u.. Harald Baier Computerforensik h_da WS 2009/2010 119
Interpretation von Bytemustern im Bootsektor (1/2) Größe eines HDD-Blocks in Bytes (11-12, essentiell): Hexdump: Entspricht folgender Hex-Zahl: Entspricht folgender Dezimalzahl: Größe eines Clusters in HDD-Blöcken (13, essentiell): Hexdump: Entspricht folgender Hex-Zahl: Entspricht folgender Dezimalzahl: Harald Baier Computerforensik h_da WS 2009/2010 120
Interpretation von Bytemustern im Bootsektor (2/2) Adresse des ersten Clusters der MFT (48-55, essentiell): Hexdump: Entspricht folgender Hex-Zahl: Entspricht folgender Dezimalzahl: Größe eines MFT-Records (64, essentiell): Interpretation als signed int (mittels Zweierkomplement) Berechnung für positive u. negative Zahlen Hexdump: Entspricht vorzeichenbehafteter Zahl: Größe eines MFT-Records in Bytes: Harald Baier Computerforensik h_da WS 2009/2010 121
Zugriff auf Hexdump der MFT mittels dcat und icat baier@watson $ dcat /dev/sdb1 xxd less 0000000: 4649 4c45 3000 0300 f622 1000 0000 0000 FILE0..."... 0000010: 0100 0100 3800 0100 a001 0000 0004 0000...8... 0000020: 0000 0000 0000 0000 0600 0000 0000 0000... 0000030: 0200 0000 0000 0000 1000 0000 6000 0000...`... baier@watson $ icat /dev/sdb1 xxd less 0000000: 4649 4c45 3000 0300 f622 1000 0000 0000 FILE0..."... 0000010: 0100 0100 3800 0100 a001 0000 0004 0000...8... 0000020: 0000 0000 0000 0000 0600 0000 0000 0000... 0000030: 0200 0000 0000 0000 1000 0000 6000 0000...`... Harald Baier Computerforensik h_da WS 2009/2010 122
Zugriff auf MFT-Record von $Boot mittels istat baier@watson $ istat /dev/sdb1 [REMOVED] $FILE_NAME Attribute Values: Flags: Hidden, System Name: $Boot [REMOVED] Attributes: Type: $STANDARD_INFORMATION (16-0) Name: N/A Resident size: 48 Type: $FILE_NAME (48-2) Name: N/A Resident size: 76 Type: $SECURITY_DESCRIPTOR (80-3) Name: N/A Resident size: 116 Type: $DATA (128-1) Name: $Data Non-Resident size: 8192 0 1 Harald Baier Computerforensik h_da WS 2009/2010 123
Demo: Sicheres Löschen unter NTFS Beispieltool: shred (gängig unter Linux) Möglicher Aufruf: shred -uv file.txt Szenario: Datei anlegen Nummer des MFT-Records herausfinden Datencluster notieren Sicheres Löschen mit shred Auswirkungen auf MFT-Record und Datencluster beobachten Harald Baier Computerforensik h_da WS 2009/2010 124