IT-Forensik | gelöschte Dateien unter Linux wiederherstellen

von Thomas


Erstellt am 31.03.2022


IT Forensik

Einführung

Der Artikel soll Grundlagen in der IT-Forensik vermitteln um versehentlich gelöschte Daten unter Linux wiederherzustellen. Das Tutorial beschränkt sich auf die Dateisysteme ext2, ext3 und ext4. Sollte ein LVM installiert sein, ist die Wiederherstellung mit den hier beschriebenen Bordmitteln nicht möglich.
Zum Einsatz kommen die Kommandozeilen-Tools von The Sleuth Kit (TSK). Der Artikel wird exemplarisch an der lokalen Festplatte einer Kali Linux VM in VirtualBox durchgeführt.
Alle Befehle können auch an einem forensischem Image gemacht werden. Ersetzt dazu in den kommenden Befehlen /dev/sda mit dem Pfad zu eurem Image.

Partitionstabellen analysieren

Um Partitionen auf einer Festplatte oder Image anzeigen zu lassen, eignet sich das Tool mmls.

# mmls /dev/sda
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

      Slot      Start        End          Length       Description
000:  Meta      0000000000   0000000000   0000000001   Primary Table (#0)
001:  -------   0000000000   0000002047   0000002048   Unallocated
002:  000:000   0000002048   0165771263   0165769216   Linux (0x83)
003:  -------   0165771264   0165773311   0000002048   Unallocated
004:  Meta      0165773310   0167770111   0001996802   DOS Extended (0x05)
005:  Meta      0165773310   0165773310   0000000001   Extended Table (#1)
006:  001:000   0165773312   0167770111   0001996800   Linux Swap / Solaris x86 (0x82)
007:  -------   0167770112   0167772159   0000002048   Unallocated

Die Kerninformation welche wir mit mmls bekommen ist, dass die Festplatte über zwei Partitionen verfügt. Die ext4 Partition startet am Sektor 2048 und ist über 0x83 als ext4 identifizierbar. Die Swap Partition startet beim Sektor 165773312.

Informationen über das Dateisysteme ermitteln

Um weitere Informationen über das verwendete Dateisystem ab Sektor 2048 herauszufinden kann das Kommando fsstat verwendet werden. Der Offset, ab welchem Sektor das Dateisystem startet, muss mit dem Parameter -o angegeben werden. Verwendet less und die Linux Pipe, da die Ausgabe sehr groß sein wird.

# fsstat -o 2048 /dev/sda | less
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext4
Volume Name:
Volume ID: 5633bf09493b21972442040de585e517

Last Written at: 2022-03-31 03:30:11 (EDT)
Last Checked at: 2021-09-08 05:20:39 (EDT)

Last Mounted at: 2022-03-30 02:43:35 (EDT)
Unmounted properly
Last mounted on: /

Source OS: Linux
Dynamic Structure
Compat Features: Journal, Ext Attributes, Resize Inode, Dir Index
InCompat Features: Filetype, Extents, 64bit, Flexible Block Groups,
Read Only Compat Features: Sparse Super, Large File, Huge File, Extra Inode Size

Journal ID: 00
Journal Inode: 8

METADATA INFORMATION
--------------------------------------------
Inode Range: 1 - 5185537
Root Directory: 2
Free Inodes: 4751402
Inode Size: 256

CONTENT INFORMATION
--------------------------------------------
Block Groups Per Flex Group: 16
Block Range: 0 - 20721151
Block Size: 4096
Free Blocks: 12551431

BLOCK GROUP INFORMATION
--------------------------------------------
Number of Block Groups: 633
Inodes per group: 8192
Blocks per group: 32768

Group: 0:
  Block Group Flags: [INODE_ZEROED]
  Inode Range: 1 - 8192
  Block Range: 0 - 32767
  Layout:
    Super Block: 0 - 0
    Group Descriptor Table: 1 - 10
    Group Descriptor Growth Blocks: 11 - 1034
    Data bitmap: 1035 - 1035
    Inode bitmap: 1051 - 1051
    Inode Table: 1067 - 1578
    Data Blocks: 9259 - 32767
  Free Inodes: 8171 (99%)
  Free Blocks: 11171 (34%)
  Total Directories: 2
  Stored Checksum: 0xAE70
  ...

fsstat liefert uns eine Menge an Informationen über das Dateisystem. Hier die wichtigsten zusammengefasst:

  • Dateisystem - File System Type: Ext4
  • Letzter Zugriffszeitpunkt - Last Written at: 2022-03-31 03:30:11 (EDT)
  • Letzter Mount - Last Mounted at: 2022-03-30 02:43:35 (EDT)
  • Metainformationen - Inode Range: 1 - 5185537; Root Directory: 2; Free Inodes: 4751402; Inode Size: 256
  • Blockgruppen Informationen - Number of Block Groups: 633; Inodes per group: 8192; Blocks per group: 32768

Dateien und Verzeichnisse analysieren

Mit dem Kommando fls können wir uns Dateien und Verzeichnisse auf der Kommandozeile visualisieren lassen. Auch hier muss der Offsetparameter angegeben werden.

# fls -o 2048 /dev/sda  | less
d/d 2883585:    home
d/- * 6(realloc):       var
l/l 12: bin
d/d 786433:     usr
l/l 13: sbin
l/l 14: lib
l/l 15: lib32
l/l 16: lib64
l/l 17: libx32
d/d 1572865:    boot
d/d 1441793:    dev
d/d 4456449:    proc
d/d 3014657:    root
d/d 3145729:    run
d/d 2359297:    sys
d/d 4325377:    tmp
d/d 2097153:    mnt
d/d 2621441:    srv
d/d 3407873:    opt
d/d 3670017:    .cache
r/r * 23:       hakusujb.tmg
…

Zusätzlich werden die Inodes zu den Dateien, Verzeichnisse und symbolischen Links angezeigt. Dateien werden als r/r (regular file) identifiziert. Verzeichnisse werden über d/d und symbolische Links als l/l angezeigt. Nun kann über den Inode 2883585 das /home Verzeichnis genauer angezeigt werden.

# fls -o 2048 /dev/sda 2883585
d/d 3157119:    kali

Offensichtlich ist darin der Nutzer kali mit seinen Daten enthalten.
Alternativ kann dafür auch das Kommando ffind genutzt werden. Hier exemplarisch am /home/kali Verzeichnis

# ffind -o 2048 -a /dev/sda 3157119
/home/kali
/home/kali/.
/home/kali/.config/..
/home/kali/.ghidra/..
…

Inodes analysieren

Nutzen wir das Kommando istat können Informationen über Inodes herausgefunden werden. Nehmen wir beispielsweise den Inode 3157119, den wir im vorherigem Kapitel als Inode für das Verzeichnis /home/kali identifizieren konnten. Bei istat benötigen wir auch wie bei den bisherigen Tools den Offset.

# istat -o 2048 /dev/sda 3157119
inode: 3157119
Allocated
Group: 385
Generation Id: 2403438401
uid / gid: 1000 / 1000
mode: drwxr-xr-x
Flags: Extents,
size: 4096
num of links: 32

Inode Times:
Accessed:       2022-03-31 03:33:45.506693783 (EDT)
File Modified:  2022-03-31 03:30:51.454713884 (EDT)
Inode Modified: 2022-03-31 03:30:51.454713884 (EDT)
File Created:   2021-09-08 05:45:57.073264774 (EDT)

Direct Blocks:
12592355

Gelöschte Dateien wiederherstellen

Gelöschte Dateien können mit dem Kommando fls herausgefunden werden. Die ganz Festplatte kann rekursiv (-r) nach Dateien (-F) die gelöscht (-d) durchsucht werden.

# fls -Frd -o 2048 /dev/sda
…
r/r * 788095(realloc):  usr/bin/mktemp
r/r * 788096(realloc):  usr/bin/mv
r/r * 788097(realloc):  usr/bin/pwd
r/r * 788098(realloc):  usr/bin/readlink
r/r * 788099(realloc):  usr/bin/rm
r/r * 788100(realloc):  usr/bin/rmdir
r/r * 788101(realloc):  usr/bin/sleep
r/r * 788102(realloc):  usr/bin/stty
r/r * 788103(realloc):  usr/bin/sync
r/r * 788104(realloc):  usr/bin/touch
r/r * 788105(realloc):  usr/bin/true
r/r * 788106(realloc):  usr/bin/uname
r/r * 788107(realloc):  usr/bin/vdir
r/r * 788108(realloc):  usr/bin/[
r/r * 788109(realloc):  usr/bin/arch
r/r * 788110(realloc):  usr/bin/b2sum
…

Die Ausgabe können wir in eine Textdatei umleiten, mit less untersuchen oder mittels grep filtern. Zuvor habe ich ein gelöschtes JPG identifiziert, nachdem ich mit Hilfe von grep exemplarisch filtere.

# fls -Frd -o 2048 /dev/sda | grep -i .jpg$
r/r * 3542991(realloc): usr/share/basemap/data/bmng.jpg
r/r * 3543003(realloc): usr/share/basemap/data/etopo1.jpg
r/r * 3543044(realloc): usr/share/basemap/data/shadedrelief.jpg

Das Bild war an Inode 3542991 gespeichert. Um herauszufinden welche Dateien an diesem Inode gespeichert wurden, nutzen wir das Kommando ffind mit dem Parameter -a (für alle Dateien).

# ffind -o 2048 -a /dev/sda 3542991
* /usr/share/basemap/data/bmng.jpg
* /usr/share/basemap/data/bmng.jpg.dpkg-tmp

Mit dem Kommando icat kann das Bild wiederhergestellt werden.

# icat -o 2048 /dev/sda 3542991 » bmng.jpg

Mit einem beliebigen Tool kann das Bild (falls es vollständig wiederhergestellt werden konnte) angesehen werden. Damit haben wir das Dateisystem forensisch analysiert und eine gelöschte Datei wiederhergestellt.