Retrouvez cet article dans : Misc 18
Rappels sur les systèmes de fichiers ext2/ext3
Quelques termes techniques à connaître
Il est nécessaire de connaître quelques termes qui reviendront de manière récurrente tout au long de l'article. Le terme bloc désigne un bloc logique, c'est-à -dire un regroupement de 2, 4 ou 8 blocs physiques. Ces blocs physiques représentent l'unité du disque dur (il est divisé en blocs, pistes et secteurs) et ont une taille de 512 octets. Un inode, avec une taille fixe de 128 octets, est un bloc particulier du disque dur regroupant les informations essentielles d'un fichier et assurant la liaison entre ce fichier et le reste du système (issu du jargon français :)).Structure physique du système de fichiers ext2
Chaque partition ext2 est découpée en blocs de taille identique. Seul le premier bloc réservé pour la partition boot sector n'est pas utilisé par le système de fichiers. Il contient un programme qui permet d'initialiser et de lancer le système. Il a une taille fixe de 1024 octets. Le reste de la partition est organisé en groupes de blocs de taille identique qui eux-mêmes sont structurés de la manière suivante :- le super bloc ;
- les descripteurs de groupe ;
- la table bitmap d'état d'allocation des blocs du groupe ;
- la table bitmap d'état d'allocation des inodes du groupe ;
- la table des inodes du groupe ;
- les blocs de données.
La table des inodes
La table des inodes (dernière structure définie dans un groupe de blocs) est la structure qui nous intéresse le plus. Nous laissons donc de côté les autres. Il faut savoir que tout est fichier sur un système ext2 et qu'à chaque fichier est associé un inode unique. Cela peut être un répertoire, un lien symbolique... Chaque inode a un numéro unique sachant que les inodes de 1 à 10 sont réservés, l'inode 11 représente le premier inode utilisable :$ cat /usr/include/ext2fs/ext2_fs.h [...] /* * Special inode numbers */ #define EXT2_BAD_INO 1 /* Bad blocks inode */ #define EXT2_ROOT_INO 2 /* Root inode */ #define EXT2_ACL_IDX_INO 3 /* ACL inode */ #define EXT2_ACL_DATA_INO 4 /* ACL inode */ #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ /* First non-reserved inode for old ext2 filesystems */ #define EXT2_GOOD_OLD_FIRST_INO 11 [...]Parmi les inodes réservés,
$ ls -ila /
total 32980
2 drwxr-xr-x 20 root root 4096 2004-11-10 07:00 ./
2 drwxr-xr-x 20 root root 4096 2004-11-10 07:00 ../
971521 drwxr-xr-x 2 root root 4096 2005-01-29 00:09 bin/
129537 drwxr-xr-x 2 root root 4096 2005-01-31 18:57 boot/
1101117 drwxr-xr-x 2 root root 4096 2004-03-27 00:33 cdrom/
987713 drwxr-xr-x 13 root root 28672 2005-02-01 08:09 dev/
388609 drwxr-xr-x 94 root root 8192 2005-02-01 11:43 etc/
2 drwxrwsr-x 4 root staff 4096 2004-12-07 21:57 home/
663885 drwxr-xr-x 2 root root 4096 2004-03-27 00:33 initrd/
44 -rw------- 1 root root 33554432 2004-08-17 01:44 .journal
194305 drwxr-xr-x 7 root root 8192 2005-01-29 00:09 lib/
11 drwx------ 2 root root 16384 2004-03-27 00:14 lost+found/
1036289 drwxr-xr-x 3 root root 4096 2004-06-28 13:51 mnt/
2 drwxr-xr-x 22 root root 4096 2005-01-31 18:47 opt/
1 dr-xr-xr-x 54 root root 0 2005-02-01 08:08 proc/
97153 drwxr-xr-x 24 root root 4096 2005-02-01 11:14 root/
372417 drwxr-xr-x 2 root root 4096 2005-01-29 00:09 sbin/
130146 drwxr-xr-x 2 root root 4096 2004-10-13 21:40 sys/
161921 drwxrwxrwt 10 root root 57344 2005-02-01 14:02 tmp/
340033 drwxr-xr-x 14 root root 4096 2005-01-23 11:00 usr/
615297 drwxr-xr-x 15 root root 4096 2005-01-12 13:43 var/
Les répertoires . et .. qui représentent la racine de la partition  Un cas particulier d'inode : les répertoires
Les répertoires sont considérés comme un fichier et possèdent donc un numéro d'inode (le répertoire racine a son numéro d'inode prédéfini :Différence entre ext2 et ext3
Le système de fichiers ext3 est complètement compatible avec le système de fichiers ext2. Même les outils du package- Seules les structures ext2 sont enregistrées dans le journal et écrites sur le disque après les données.
- Seules les structures ext2 sont enregistrées dans le journal mais elles peuvent être écrites sur le disque avant les données.
- Tout est sauvegardé dans le journal (structure ext2 et données).
# ls -ialp /tmp/blaat 162599 -rw-r--r-- 1 compaq compaq 6 2005-02-01 19:17 /tmp/blaat # debugfs /dev/hda1 debugfs 1.35 (28-Feb-2004) debugfs: stat <162599> Inode: 162599 Type: regular Mode: 0644 Flags: 0x0 Generation: 2017214494 User: 1000 Group: 1000 Size: 6 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 8 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x41ffc7a9 -- Tue Feb 1 19:17:13 2005 atime: 0x41ffc7a9 -- Tue Feb 1 19:17:13 2005 mtime: 0x41ffc7a9 -- Tue Feb 1 19:17:13 2005 BLOCKS: (0):330468 TOTAL: 1
Cacher les données
Quel que soit le système de fichiers sur lequel vous souhaitez cacher des données, celles-ci ne doivent être détectées d'aucun outil forensics pour qu'elles soient efficaces. C'est évident mais cela sous-entend que vos données doivent être cachées à des endroits du système de fichiers que les outils forensics n'analysent pas. À cette condition s'ajoute le fait que le système de fichiers doit rester sans anomalie pour d'une part éviter d'alerter le système (nous verrons par quoi plus tard) et par conséquent l'utilisateur et d'autre part pour éviter de perdre ces fameuses données cachées. D'une manière générale, pour que la solution fonctionne pleinement, les données cachées doivent rester présentes sur le système. Un exemple simple voire très stupide : Jean-Kevin cache ses données dans le fichier ' Les outils forensics
Comme nous venons de le dire, cacher des données ne veut pas dire nommer son fichieratimeÂ: modifié par des accès en lecture (read(),mmap(),execve(),...)mtimeÂ: modifié par des accès en écriture(write(),truncate(),mknod(),...)ctimeÂ: modification au niveau inode (chown(),link(),...)
# touch -r /bin/ls blaat # ls -alp /bin/ls -rwxr-xr-x 1 root root 75948 2004-07-16 13:37 /bin/ls # ls -alp blaat -rw-r--r-- 1 compaq compaq 6 2004-07-16 13:37 blaatSeulement, quelle que soit l'option utilisée, le jour de
# debugfs -f cmd.fs [...] ctime: 0x4204ab58 -- Sat Feb 5 12:17:44 2005 atime: 0x4204ab06 -- Sat Feb 5 12:16:22 2005 mtime: 0x40f7bde1 -- Fri Jul 16 13:37:05 2004 [...]Les données peuvent donc être facilement retrouvées. Si l'on connaît approximativement la date d'intrusion sur le système, une recherche à partir de cette date sur
Un exemple concret
Il existe un bug (ou un défaut d'implémentation, peu importe) dans la$ cat sleuthkit-1.73/src/fstools/ext2fs.c
[...]
/*
* Sanity check.
*/
if ((inum < fs->first_inum) || (inum > fs->last_inum))
error("invalid inode number: %lu", (ULONG) inum);
[...]
Par conséquent, si vous créez un fichier avec un inode = 0, il ne sera visible d'aucun utilitaire lié à la libc et d'aucun outil forensics. Cette solution anti-forensics est une solution parmi tant d'autres. Elle prouve cependant que les outils forensics contiennent des failles dans leur implémentation.
Techniquement, pour créer un fichier avec un inode = 0, le plus simple est de créer un fichier normal et de modifier son numéro d'inode. Ce qui implique qu'il faut repérer son inode dans la table des inodes et par conséquent localiser cette table dans un groupe de blocs. Connaissant l'offset de l'inode, il sera ensuite possible de modifier son numéro d'inode et d'accéder aux blocs de données de cet inode (chaque inode contient les pointeurs vers les blocs de données).
Ne pas être détecter par fsck
L'exemple de l'inode = 0 est un exemple parmi tant d'autres pour montrer que les outils forensics sont une barrière à franchir afin que les solutions anti-forensics soient efficaces. Il est ensuite nécessaire de s'assurer que le système de fichiers ne soit pas altéré, au risque de perdre nos données, de rendre le système inutilisable ou bien que l'utilitaire fsck disponible dans# debugfs debugfs 1.35 (28-Feb-2004) debugfs: open /dev/hda1 debugfs: stats [...] Filesystem state: clean [...] Last mount time: Fri Feb 4 08:06:21 2005 Last write time: Fri Feb 4 08:06:21 2005 Mount count: 4 Maximum mount count: 20 Last checked: Thu Feb 3 14:05:40 2005 Check interval: 15552000 (6 months) Next check after: Tue Aug 2 15:05:40 2005 [...]Revenons à la solution anti-forensics précédemment évoquée. Passe-t-elle à travers les mailles du filet de
$ cat e2fsck/pass1.c
[...]
void e2fsck_pass1(e2fsck_t ctx)
{
[...]
pctx.errcode = ext2fs_get_next_inode(scan, &ino, &inode);
[...]
while (ino) {
[...]
if (ino == EXT2_BOOT_LOADER_INO) {
if (LINUX_S_ISDIR(inode.i_mode))
problem = PR_1_RESERVED_BAD_MODE;
} else if (ino == EXT2_RESIZE_INO) {
if (inode.i_mode &&
!LINUX_S_ISREG(inode.i_mode))
problem = PR_1_RESERVED_BAD_MODE;
} else {
if (inode.i_mode != 0)
problem = PR_1_RESERVED_BAD_MODE;
}
[...]
}
Pour résumer, il récupère la liste des numéros d'inodes et regarde leurs valeurs. S'ils ne correspondent à aucun numéro d'inode réservé (Un exemple concret : les bad blocks
Nous avons vu que la solution de cacher nos données dans un fichier avec inode = 0 fonctionne à moitié, ce qui évidemment nous satisfait ... à moitié.   /*
    * Sanity check.
    */
   if (inum < EXT2_ROOT_INO || inum > ext2fs->fs.s_inodes_count)
      error("invalid inode number: %lu", (ULONG) inum);
Sauf qu'avant l'inode  # df -k
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda1 429490 154468 252848 38% /
# ./mkrune -v /dev/hda1
+++ bb_blk +++
bb_blk->start = 205509
bb_blk->end = 212992
bb_blk->group = 25
bb_blk->size = 7484
+++
rune size: 7M
# df -k
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda1 429490 161983 245333 40% /
L'espace pour cacher nos données est créé c'est-à -dire que des blocs de données sont alloués à l'inode 1. C'est vérifiable avec l'utilitaire # debugfs debugfs 1.27 (8-Mar-2002) debugfs: open /dev/hda1 debugfs: stat <1> Inode: 1 Type: bad type Mode: 0000 Flags: 0x0 Generation: 0 User: 0 Group: 0 Size: 7663616 File ACL: 0 Directory ACL: 0 Links: 0 Blockcount: 14968 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x3bd5eee8 -- Wed Oct 24 00:27:52 2001 atime: 0x4204c2d4 -- Sat Feb 5 13:57:56 2005 mtime: 0x4204c2d4 -- Sat Feb 5 13:57:56 2005 BLOCKS: (0-11):205509-205520, (IND):285, (12-267):205521-205776, [...] (7180-7435):212689-212944, (IND):640, (7436-7483):212945-212992 TOTAL: 7515Si vous avez bien suivi :) vous pouvez voir que le premier bloc alloué est bien égal Ã
 # cat /etc/syslog.conf | ./runewr /dev/hda1 # debugfs debugfs 1.27 (8-Mar-2002) debugfs: open /dev/hda1 debugfs: cat cat: Usage: cat <file> debugfs: dump <1> /tmp/dump debugfs: # head /tmp/dump # /etc/syslog.conf Configuration file for syslogd. # # For more information see syslog.conf(5) # manpage. [...]Du fait que
Les autres techniques
Toutes les techniques qui suivent ont été créées par the grugqWaffen FS
Cette technique consiste à créer un faux journal ext3 dans un système de fichiers ext2. Techniquement, cela consiste à créer un fichier normal qui contiendra des fausses en-têtes meta-data de journal. La description de l'en-tête est présent dans le fichierKy FS
Kyfs prend un fichier répertoire (rappelez vous que tout est fichier sur un système ext2 et ext3) et modifie sa structure de cette manière :struct ext2_dir_entry_2 {
inode = 0;
reclen = <blocksize>;
namelen = 0;
file_type;
name[];
}
Les données seront enregistrées dans Data mule FS
Cette technique complète les 3 précédentes du fait qu'elle permet de cacher des données dans tous les endroits du système de fichiers pas encore pris en compte : l'espace réservé, l'espace restant dans les structures (padding), etc. Un exemple est le super bloc. Il correspond à un bloc de 1024 octets (cf. SConclusion
The grugq a quasiment fait tout le tour des possibilités de cacher des données dans un système de fichiers ext2/ext3. Nous pouvons en imaginer d'autres, mais peut-être un peu tirées par les cheveux et certainement détectables par les outils forensics ou- créer un fichier et marquer l'inode comme free. Il vaut mieux certainement créer le fichier avec un inode très élévé pour éviter qu'il soit écraser.
- l'inode d'indice 6 est réservé à la restauration des fichiers effacés. Un répertoire interne caché regroupe les enregistrements des fichiers effacés s'ils ont la propriété restauration, permettant ainsi une restauration après effacement. L'idée est donc d'effacer un fichier mais en prenant bien soin qu'il ait la propriété restauration.
- [ext3] Michael K. Johnson - " Whitepaper: Red Hat's New Journaling File System: ext3 " http://www.redhat.com/support/wpapers/redhat/ext3/
- [chkrootkit] http://www.chkrootkit.org
- [sleuthkit]Â Brian Carrier - " Sleuthkit " ; http://www.sleuthkit.org
- [runefs] The grugq - " Defeating Forensic Analysis on Unix " : http://www.phrack.org/phrack/59/p59-0x06.txt
- [tct]Â Dan Farmer, Wietse Venema - " TCT " : http://www.fish.com/security
- [the grugq] The grugq - " The Art of Defiling: Defeating Forensic Analysis on Unix File Systems " http://www.blackhat.com/presentations/bh-europe-04/bh-eu-04-grugq.pdf
 Retrouvez cet article dans : Misc 18





Donnez votre avis
Vous devez avoir ouvert une session pour écrire un commentaire.