Académique Documents
Professionnel Documents
Culture Documents
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"
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
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)
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_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
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 :
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 :
Pour les exécutables ELF (Linux), nous pouvons également utiliser readelf :
readelf -h hello
readelf -a hello
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
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
…
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…