La mascotte BSD dessinée par Tatsumi Hosokawa
  Chuck's corner (intitulé du site)

Accueil
  Bienvenue !
  Who's that Chuck ?

Articles
  Investigation numérique
  Virtual-to-Remote-Physical
  Prométhée, intranet éduc.
  Frenzy, mini CD live
  Sécu. Open/Closed Source
  Installer FreeBSD 5
  Powered by Unknown !

  En cours d'élaboration :
  Analyseurs d'empreintes

Logiciels
  Portages
  Projet HeV

Liens
  Sites BSD en français
  Liste systèmes BSD
  Projets à l'honneur

Recherche
  avec Logo Google

  sur le site :
  
  sur BSD en général :
  

Un peu d'investigation numérique avec FreeBSD et VirtualBox

Résumé : L'objectif de cet article est d'illustrer les capacités du couple FreeBSD / VirtualBox pour la réalisation d'investigations numériques.

Public visé : Le contenu, plutôt technique, s'adresse aux praticiens ou aux curieux. Si vous appartenez aux commanditaires potentiels d'opérations de ce type, chinez parmi les puces d'exemples (à partir de la troisième partie) pour vous faire une idée des résultats envisageables.

1) Obtenir une image exacte d'un disque dur

Une relation m'a récemment demandé de lui donner un coup de main pour "faire parler" un disque dur, ce que dans le jargon des experts judiciaires on appelle de l'investigation numérique (légale) (ou plus couramment, du computer forensics en VO).

Comme toujours dans ces cas-là, le premier souci est d'obtenir une image exacte du disque dur, sans modifier celui-ci, ce qui permettra ensuite de faire toutes les analyses voulues sans plus toucher au disque d'origine.

Lorsqu'on n'est pas dans la situation où l'on veut récupérer les données (en mémoire vive) d'un système en cours de fonctionnement, le plus simple est de redémarrer la machine analysée sur un LiveCD (après s'être bien sûr assuré que le paramétrage de son BIOS la fera démarrer en priorité sur CD/DVD).

Le LiveCD proposé par le projet FreeBSD est tout à fait adapté à cet usage.

Alternativement, on peut retirer le disque dur à analyser de sa machine d'origine et le monter dans une machine d'analyse en tant que disque secondaire, mais dans ce cas il faut vérifier attentivement que le système contenu sur le disque ne servira pas à amorcer la machine d'analyse (ce qui peut arriver selon l'ordre de priorité des disques IDE, SATA ou SCSI) et que le système de la machine d'analyse ne modifiera pas le contenu du disque dur à analyser avant que l'on ait pu en faire une image (ce qui peut arriver quand celui-ci gère des systèmes de fichiers de même nature que ceux à analyser), raisons pour lesquelles je préfère la première méthode...

Après avoir booté sur le CD, il suffit de choisir le pays ("France") et le clavier à utiliser ("French ISO (Accent)"),

puis l'option "Fixit" :

puis le fonctionnement à partir du CD :

avant d'accéder au prompt :

A partir de là, on pourrait imaginer d'employer une foultitude d'outils de création d'images de disques durs (notamment pour les cas où les disques ont des défauts), mais le plus simple et le plus universel reste encore la commande Unix dd (abréviation de Disk Dump).

La syntaxe précise à utiliser dépend du media sur lequel vous allez faire la copie :

  • Par exemple, pour copier l'image de disque dur sur un disque USB formatté en FAT32 (donc limité à des fichiers de 4 Go) en tronçons de 4000 Mo nommés disque-aa à disque-XX (et en supposant que le disque dur soit reconnu sur /dev/ad4 et le disque USB sur /dev/da0) :
        # mount_msdosfs -o large /dev/da0s1 /mnt
        # cd /mnt
        # dd if=/dev/ad4 | split -b 4000m - disque-    
        # cd
        # umount /mnt

    Les différents tronçons pourront ensuite être rassemblés avec la commande :
        # cat disque-* > disque.img    

  • Sinon, si le disque USB avait été formatté en UFS (système de fichiers utilisé sous BSD), il aurait suffi de faire :
        # mount /dev/da0s1 /mnt
        # cd /mnt
        # dd if=/dev/ad4 of=disque.img    
        # cd
        # umount /mnt

A toutes fins utiles, pensez à noter la géométrie du disque dur et le nombre de secteurs jusqu'à la partition susceptible de vous intéresser, avant d'arrêter le système :

    # fdisk /dev/ad4
    ******* Working on device /dev/ad4 *******
    parameters extracted from in-core disklabel are:
    cylinders=310101 heads=16 sectors/track=63 (1008 blks/cyl)
    
    Figures below won't work with BIOS for partitions not in cyl 1    
    parameters to be used for BIOS calculations are:
    cylinders=310101 heads=16 sectors/track=63 (1008 blks/cyl)
    
    Media sector size is 512
    Warning: BIOS sector numbering starts with sector 1
    Information from DOS bootblock is:
    The data for partition 1 is:
    sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
        start 63, size 312575697 (152624 Meg), flag 80 (active)
            beg: cyl 0/ head 1/ sector 1;
            end: cyl 846/ head 15/ sector 63

2) Obtenir une image virtuelle du disque et/ou de ses partitions

Avant de commencer les analyses, il nous reste à préparer une image virtuelle (c'est-à-dire utilisable avec un logiciel de virtualisation tel que VirtualBox, VMware, Hyper-V, etc.) à partir de notre image disque, ce qui nous permettra ultérieurement d'étudier celle-ci avec des outils natifs au(x) système(s) d'exploitation qu'elle contient.

Après avoir transféré l'image disque précédemment réalisée sur son système FreeBSD préféré, il suffit en théorie de mapper cette image sur un périphérique md (Memory Disk). Cette opération s'effectue habituellement avec une commande du type :

    # mdconfig -a -t vnode -f disque.img -u 0    
    # export PARTITION=/dev/md0s1

Où le chiffre derrière l'option -u détermine le numéro du périphérique md à utiliser (md0 dans cet exemple) et le chiffre en fin de variable PARTITION détermine le numéro de la partition à analyser (la première partition, md0s1, dans cet exemple).

Petite subtilité à prévoir : de temps à autre, des problèmes de géométrie de disque ne permettront pas au système de reconnaître directement les partitions contenues dans une image disque et de créer les périphériques mdXsY nécessaires.

Dans ce cas, pas de panique, il suffit d'extraire la partition qui nous intéresse de l'image disque en sautant le nombre de secteurs jusqu'à son début. Dans l'exemple de géométrie précédemment indiqué, la partition commencait au 64ème secteur de 512 octets (512 étant la valeur par défaut pour dd, vous pouvez omettre le bs=512 dans ce qui suit, si c'est la valeur que vous indique votre disque dur) :

    # dd if=disque.img of=partition.img bs=512 skip=63    
    # export PARTITION=partition.img

Pour obtenir l'image virtuelle proprement dite, nous allons utiliser la version Open Source de VirtualBox (que vous pouvez installer par un simple : pkg_add -r virtualbox-ose), et ce quel que soit le logiciel de virtualisation que vous voudrez ensuite utiliser, puisque vous noterez que VirtualBox sait produire par P2V (Physical to Virtual) des images virtuelles pour lui-même (format VDI), pour VMware (format VMDK) et pour Hyper-V (format VHD) :

    # VBoxManage convertfromraw
    Sun VirtualBox Command Line Management Interface Version 3.1.8_OSE
    (C) 2005-2010 Sun Microsystems, Inc.
    All rights reserved.
    
    Usage:
    
    VBoxManage convertfromraw    
                                [--format VDI|VMDK|VHD]
                                [--variant Standard,Fixed,Split2G,Stream,ESX]
    VBoxManage convertfromraw   stdin  
                                [--format VDI|VMDK|VHD]
                                [--variant Standard,Fixed,Split2G,Stream,ESX]    

Par exemple, pour obtenir une image virtuelle dynamique (où seuls les secteurs utilisés occupent de l'espace disque) pour VirtualBox, vous utiliserez la commande :

    # VBoxManage convertfromraw ${PARTITION} partition.vdi --format VDI    

Si, en revanche, vous souhaitez obtenir une image virtuelle statique (avec tous les secteurs) pour VirtualBox, vous utiliserez la commande :

    # VBoxManage convertfromraw ${PARTITION} partition.vdi --format VDI --variant Fixed    

Si vous comptez tenter une récupération des fichiers effacés sur le disque à analyser, c'est cette seconde option que vous devez utiliser. Dans l'exemple ci-dessus, j'ai naturellement pris soin de vérifier que VirtualBox reprenait bien la totalité des secteurs d'origine (je n'ai pas fait cette vérification pour les formats VMDK et VHD).

3) Premières analyses de l'image depuis FreeBSD

Selon le système de fichier utilisé, il faut utiliser l'une des commandes mount_ pour accéder aux fichiers contenus sur la partition qui nous intéresse. Dans le cas des systèmes de fichiers NTFS et FAT32 qui sont les plus couramment rencontrés sur les disques à analyser :

    # mount_ntfs ${PARTITION} /mnt    

Ou :

    # mount_msdosfs -o large ${PARTITION} /mnt    

Pour des types de partitions plus exotiques, il vous faudra peut-être installer et utiliser le package fusefs...

A partir de là, on peut selon vos objectifs imaginer de mener toutes sortes de traitements et analyses, par exemple :

  • Enregistrer votre session de travail dans une main courante (tout ce qui est saisi ou affiché) :

        # script main_courante.txt    

  • Récupérer tout ou partie des fichiers (archivage avec tar, compression avec gzip, bzip ou p7zip (à installer avec pkg_add -r p7zip), externalisation avec scp, etc.), par exemple : base de registre Windows, fichiers de mots de passe, clés cryptographiques, etc.

  • Rechercher tous les fichiers modifiés depuis une certaine date :

        # touch -t AAAAMMJJHHMM /root/date_de_reference
        # find /mnt -newer /home/date_de_reference -ls > /root/liste1.txt    

  • Examiner rapidement le contenu d'un fichier (et ce, quelle que soit sa taille) et y rechercher des séquences de caractères (more avec commande "/" pour chercher une chaîne de caractères en avant du fichier et "?" en arrière), par exemple : journaux divers (d'événements, notamment), cookies, historique de navigation, etc. :

        # more Fichier    

  • Rechercher une chaîne de caractères dans l'ensemble des fichiers (sans prêter attention à la casse, c'est-à-dire aux combinaisons de majuscules et minuscules) :

        # find /mnt -type f -exec grep -il "Chaîne de caractères" {} \; > /root/liste2.txt    

    Alternativement, vous pouvez utiliser la commande agrep (à installer avec pkg_add -r agrep) plutôt que grep pour faire des recherches approchées...

  • Extraire les chaînes de caractères affichables d'un fichier binaire (noms de fonctions, chemin d'accès de fichiers, etc.) :

        # strings Fichier | more    

    Une petite subtilité pour les ruches NTUSER.DAT où vous verrez parfois des chemins de fichiers étranges, ceux-ci sont codés en "chiffre de César" plutôt que dans une langue d'Europe de l'Est, et vous pouvez les décoder avec la commande rot13 :

        # strings NTUSER.DAT | grep HRZR
        HRZR_EHACNGU:P:\JVAQBJF\ertrqvg.rkr
    
        # strings NTUSER.DAT | grep HRZR | rot13    
        UEME_RUNPATH:C:\WINDOWS\regedit.exe

  • Rechercher une chaîne de caractères (sans prêter attention à la casse) dans un fichier binaire, en affichant le décalage en octets par rapport au début du fichier de toutes les occurrences :

        # Cherche() { CHAINE=`echo "$*" | sed "s/./& */g"`; grep -i "${CHAINE}"; }    
        # od -A d -t c Fichier | Cherche "Chaîne de caractères"

    Par exemple, pour trouver le début de la partition NTFS dans l'image disque VDI précédemment réalisée :

        # od -A d -t c partition.vdi | Cherche "NTFS"
        0153600    ë   R 220   N   T   F   S                  \0 002  \b  \0  \0    

  • Rechercher des virus et autres applications indésirables avec ClamAV (anti-virus Unix) :

        # pkg_add -r clamav
        # freshclam
        # clamscan -r --detect-pua=yes /mnt    

  • Calculer des empreintes numériques de fichiers pour les comparer ensuite à des versions de référence (avec cksum, md5, sha1, sha256 ou encore rmd160), par exemple :

        # cksum partition.vdi | awk '{printf "CRC32 (%s) = %lx\n", $3, $1}'
        CRC32 (partition.vdi) = 83e05088
        # md5 partition.vdi
        MD5 (partition.vdi) = 7210ae3940cfd35ad0c2ed0cd3a8d8f3
        # sha1 partition.vdi
        SHA1 (partition.vdi) = 0979ce19982fa5fbba99b549e1e31b0d3e33c7d5
        # sha256 partition.vdi
        SHA256 (partition.vdi) = c788ab904c2c7c69fa66b557d6c7056ff2c4f1c93583a1e048d2313c74bca109    

    Pour ce besoin, vous pouvez également utiliser mon script Baseline, qui produit pour chaque fichier d'une arborescence une ligne d'enregistrements séparés par le caractère ";" (donc un fichier immédiatement importable dans Excel au format .csv) comportant : chemin d'accès complet jusqu'au fichier, répertoire contenant le fichier, nom du fichier, extension de fichier, type de fichier (indiqué par la commande file), dates et heures de création, modification et dernier accès, taille, empreintes aux formats CRC32, MD5, SHA1, SHA2 et RIPEMD160, utilisateur et groupe propriétaires, permissions, drapeaux, label MAC, numéro et compteur d'i-nœuds.

  • Forcer des mots de passe avec John the Ripper (à installer avec pkg_add -r john).

  • Etc.

La bibliothèque logicielle de FreeBSD contient plein d'autres utilitaires intéressants pour la réalisation d'investigations numériques, parmi lesquels on peut notamment citer :

  • ftimes (pour calculer une empreinte de référence d'un système de fichiers),
  • vinetto (pour examiner les fichiers Thumbs.db d'un système Windows, dans lesquels on peut retrouver la trace de photos effacées),
  • afflib (pour manipuler des images disque au format AFF - Advanced Forensic Format),
  • aimage (pour créer des images au format AFF),
  • autopsy (une IHM pour le Sleuth Kit),
  • dcfldd (imageur de disque dérivé de dd créé au Department of Defense Computer Forensics Lab, permettant notamment de mieux gérer les secteurs disque défectueux),
  • fatback (un déseffaceur de fichiers pour disques FAT12, FAT16 et FAT32),
  • ou le Sleuth Kit (pour examiner des disques durs, et notamment des partitions Macintosh ou Sun).

4) Analyses de l'image avec des outils natifs de son système d'exploitation

Même s'il est très pratique d'analyser un système de fichier tiers (Windows le plus souvent) à partir d'un système d'exploitation Unix (qui est, bien plus qu'un simple système d'exploitation, en soi un véritable système de traitement de données en masse), certains traitements et analyses ne sont aujourd'hui disponibles que dans l'environnement natif du système d'exploitation analysé.

Le principe général pour ces opérations est :

  1. de préparer une machine virtuelle contenant le système d'exploitation natif (pas obligatoirement de même version que celui analysé),
  2. d'y installer les outils dont vous pouvez avoir besoin,
  3. d'en faire une copie de référence,
  4. puis de raccorder le disque à analyser en disque secondaire d'une instance de cette copie de référence
    (à ne jamais réutiliser pour l'analyse d'autres disques, afin d'éviter tout problème de sécurité ou de divulgation de données confidentielles. Si d'ailleurs vous craignez un problème de contagion virale, il peut être prudent de débrancher le cable réseau virtuel de cette instance, voire de désactiver purement et simplement sa carte réseau virtuelle...)

Après avoir démarré cette instance dans votre logiciel de virtualisation préféré, vous pourrez procéder à tous les traitements et analyses souhaités, par exemple :

  • Récupérer des fichiers effacés (pour Windows, voir à ce sujet Comment récupérer des données effacées ?, Récupération de données perdues ou encore hard drive restore software. Personnellement, pour Windows / NTFS j'ai obtenu toute satisfaction du logiciel NTFS Undelete) ;

  • Utiliser les outils natifs ou des visionneuses permettant de visualiser le contenu de certains types de fichiers ;

  • Passer différents outils de sécurité ou d'analyse anti-virale (rien de tel que de passer une dizaine d'anti-virus différents pour apprécier la possibilité d'un faux-positif en cas de détection par l'un d'entre eux...) ;

  • Etc.

5) Analyses du comportement de l'image en bac à sable

Il me reste à signaler une variante intéressante du cas précédent : l'utilisation directe de l'image disque virtuelle dans votre logiciel de virtualisation (donc en disque primaire).

Selon vos objectifs, il sera alors intéressant d'utiliser un pare-feu dans votre système hôte pour soit bloquer, soit intercepter (et stocker) tout le trafic réseau en entrée ou sortie de la machine virtuelle (on peut certes le faire également avec un pare-feu ou une sonde réseau disposés en coupure sur une autre machine, mais si vous utilisez VirtualBox sous FreeBSD, vous avez déjà sous la main tout ce qu'il faut pour faire ce genre de chose, y compris en utilisant le pare-feu du système en mode "pont" pour plus de discrétion).

Parmi les utilisations possibles (mais un peu plus complexes que ce qui a été évoqué jusqu'ici), on peut par exemple citer :

  • Etudier les entrées/sorties réseau du système analysé, les machines contactées, le contenu des échanges non chiffrés, etc. ;

  • Utiliser la fonctionnalité de réalisation de clichés (snapshots) du logiciel de virtualisation pour capturer l'état de la mémoire de la machine virtuelle à des instants choisis, le fichier résultant pouvant alors être analysé avec les outils précédemment mentionnés, par exemple pour étudier le contenu des paramètres, des variables et de la mémoire allouée par certains programmes actifs, pour tenter de découvrir mots de passe et clés de (dé)chiffrement qui ne seraient pas simplement stockés dans le système de fichiers et apparaîtraient "en clair" en mémoire, etc. ;

  • Etc.

Voilà, j'arrête-là ces exemples puisque mon propos était simplement d'illustrer les capacités du couple FreeBSD / VirtualBox pour la réalisation d'investigations numériques.

Comme dans ces affaires les traitements et analyses à réaliser dépendent beaucoup de la mission qui vous est confiée, il ne me reste plus qu'à vous souhaiter créativité, intuition et chance pour adapter ces techniques à vos cas de figure et exhumer tous les secrets enfouis dans les médias à analyser.

--
Hubert Tournier, le 1er novembre 2010.
Dernière mise à jour le 8 novembre 2010.


Si par hasard l'un des liens externes ne fonctionnait plus, tentez votre chance sur la machine à voyager dans le temps d'Internet !


[ Drapeau anglais English version | Informations légales | Ours | Manifeste | Charte | Nous contacter | Commenter cette page ]
[ Anneau FreeBSD | Liste des sites | Aller à : 5 précédents - précédent - au hasard - suivant - 5 suivants ]