von Thomas
Erstellt am 31.03.2022
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.
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.
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:
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/.. …
# 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 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.