Parties
- culture générale
- culture générale-1
- disques
- commande df
- df peripherique
- disque principal
- fdisk
- table de partition actuelle
- swap
- création d'une partition
- après redemarrage
- création d'un système de fichiers
- types de systèmes de fichiers
- types de systèmes de fichiers et OS
- mount
- mount utilisation
- mount vérification
- umount
- umount
- fstab
- fstab, exemple
- fstab, exemple2
- donéées et sauvegardes - importance des données / RAID
- durée de vie
- importance de données
- importance de données
- raid
- raid-5
- raid-5
- raid-5 parité
- raid-5 parité
- raid risques
- données et sauvegardes - copies, machines distantes
- transfert de données
- ftp non securise
- scp
- scp distant vers local
- scp ethereal
- rsync
- sauvegarde par duplication
- sauvegarde incrementale
- sauvegarde lourde
- sécurité
- buffer overflow
- buffer overflow - le programme
- bufer overflow: gdb
- buffer overflow: hexa A
- buffer overflow: hexa B
- bufer overflow: adresse de retour AAA
- bufer overflow: adresse de retour BBB
- bufer overflow: explication, recherche d'adresse
- bufer overflow: protection
- buffer overflow: problème
- Sécurité et PHP
- vulnerabilités php: installation
- php: include dangereux
- php:system
- unlink
1. culture générale
1.2 culture générale-1
Pour chacun des composants logiciels suivants (apache, cygwin, gtk...) :
- prenez le temps de faire une recherche internet. Au minimum, visitez la page principale du logiciel en plus de sa page
wikipedia.
-
vérifiez que vous comprenez les grandes lignes du logiciel. A quoi il
sert, comment il s'insère dans le fonctionnement du système. A quoi il
pourrait vous être utile. Imaginez des scénarios d'utilisation.
- oui, c'est correct
- non, il y a une erreur
- principal système de gestion du son sous linux : alsa
- librairie pour créer des interfaces graphiques : gtk
- environnement de bureau : gnome
- environnement "pseudo-graphique" en mode texte : ncurses
- le noyau linux : kernel
- gestionnaire de boot, pour le démarrage de la machine : grub
- gestionnaire de versions, pour le travail à plusieurs sur des fichiers : cvs
- compression de fichiers : gzip
- exécuter des programmes windows dans linux : wine
- environnement ressemblant à linux dans windows : cygwin
- transfert de courrier électronique : exim
- serveur web : apache
2. disques
2.2 commande df
Quelle
est la commande permettant d'afficher la quantité d'espace libre
restant sur les différents disques montés sur le système?
2.3 df peripherique
Sur cet ordinateur, quel est le périphérique associé au répertoire racine du système de fichiers ?
- [ ]*\/dev\/sda1 *
- [ ]*sda1 * : oui, mais le nom complet est: /dev/sda1
2.4 disque principal
le péripherique associé au répertoire racine se trouve sur quel type de controleur?
- ide : non: hda,hdb,hdac ... sont des peripheriques ide
- scsi
: le nom "sda" pourrait indiquer un périphérique scsi, mais les
périphériques scsi sont chers et ne sont généralement utilisés que sur
des machines professionnelles...
- sata : oui
- usb
fdisk
"fdisk" est un petit utilitaire en mode texte qui permet de manipuler la table des partitions.

Souvenez
vous, la table des partitions se trouve au tout début du disque (MBR).
Elle définit, entre autres, le début et la fin de chaque partition.
Attention: la table des partitions se trouve sur le disque (c'est à dire
/dev/sda ) et pas sur une partition particulière ( comme
/dev/sda1 )
Lancez la commande "
sudo fdisk /dev/sda "
Appuyez sur la touche "m" pour lister les différentes options possibles.
Quelle touche permet d'afficher la table des partitions?
2.6 table de partition actuelle
Combien de partitions est-ce qu'il y a actuellement sur votre disque?
La
deuxième partition (/dev/sda2) n'était pas visible avec la commande
"df". En effet, il s'agit d'une partition pour le "swap" : lorsque votre
ordinateur n'a pas assez de mémoire vive, il utilise cette partition
comme un "prolongement" de sa mémoire.
Swap (mémoire)
Dans un ordinateur, opération fréquente consistant à vider une
portion moins utilisée des données situées en mémoire (page) et à la
stoker sur le disque temporairement, permettant à d'autres données
d'être traitées pendant ce temps.
Cette opération ralentie le
traitement des données, mais permet de disposer d'une mémoire de
traitement supérieure à la mémoire réellement disponible : la mémoire
virtuelle.
Source : http://www.guideinformatique.com/definition-s...
Voir aussi :
http://fr.wikipedia.org/wiki/M%C3%A9moire_virtuelle2.8 création d'une partition
Création d'une partition
"fdisk" n'écrit rien sur le MBR tant que vous n'utilisez pas la commande "w".
N'hésitez donc pas à expérimenter: en quittant ("q") vous abandonnez tous vos changements.
Si vous regardez de près, vous remarquerez qu'il reste beaucoup de place libre (non partitionné) sur votre disque.
Créez deux nouvelles partitions primaires (no. 3 et 4). La partition 3 fera 1Go et la 4 prendra toute la place restante.
Une fois que vous êtes 100% surs de vous, écrivez votre table de partions sur le disque avec "w".
Comme le disque dont vous changez la MBR est en cours d'utilisation, vous devez redémarrer votre ordinateur pour que les changements soient pris en compte.
Indications:
fdisk affiche le début et la fin de chaque partition en cylindres, ce qui n'est pas très intuitif.
Quand vous créez une partition, fdisk vous demande le cylindre ou vous voulez qu'elle commence.
fdisk vous propose une valeur par défaut (appuyez sur entrée pour la valider).
fdisk vous demande aussi le cylindre ou vous voulez qu'elle termine.
Il est souvent plus pratique de spécifier la taille avec un "+"
Par exemple: +2G pour une partition de deux gigaoctets
3. après redemarrage
3.1 après redemarrage
après redemarrage
3.2 création d'un système de fichiers
Création d'un système de fichiers
Vous
venez de créer deux partitions. Pour l'instant elles ne contiennent
rien : c'est juste une série d'octets disponibles. Tapez "sudo fdisk -l"
pour obtenir une liste des partitions des périphériques branchés.
Dans
des cas rarissimes, on pourrait utiliser ces partitions directement (en
"brut"), mais en général on souhaite y mettre des fichiers, il nous
faut donc créer un système de fichiers dessus:
Pour créer un système de fichiers sur la 3ème partition du disque /dev/sda , tapez la commande "sudo mkfs -t ext3 /dev/sda3"
3.3 types de systèmes de fichiers
parmi les suivants, lesquels sont des types de systèmes de fichiers?
(dans le doute, regardez votre cours ou recherchez sur internet)
- ext3
- ext2
- fat32
- ReiserFS
- ntfs
- solaris
- bsd
- irix
3.4 types de systèmes de fichiers et OS
En général, un système d'exploitation a un système de fichiers natif préféré.
(Ca ne veut pas pour autant dire qu'un système d'exploitation utilise necesairement ce système de fichier)
Faites les liens:
(en cas de doute, cherchez sur internet)
- oui, très bien
- non
- GNU/Linux : ext3
- irix (silicon graphics) : xfs
- windows 98 : fat32
- windows xp : ntfs
- Mac OS X : hfs plus
Quel est le nom de la commande (juste son nom) permettant d'associer un peripherique à un répertoire ?
3.6 mount utilisation
Utilisation de la commande "mount"
Pour l'instant nous avons:
- crée une partition
- crée un système de fichiers sur la partition
Pour pouvoir utiliser notre système de fichiers, il faut l'associer à un répertoire.
Tapez la commande "df" et vérifiez que /dev/sda3 n'est encore associé à aucun répertoire.
En tant que root, créez un répertoire /root/essai-mount
Créez un fichier dedans et vérifiez qu'il est bien là.
Ensuite, sortez de ce répertoire.
Quelle commande faut-il taper pour associer le périphérique /dev/sda3 au répertoire /root/essai-mount ?
- [ ]*(sudo |)mount( +-t +ext3)? +\/dev\/sda3 +\/root\/essai-mount\/? *
3.7 mount vérification
Vérification du montage
Vérifiez avec "df" que la commande mount a bien fonctionné.
Rentrez dans le répertoire /root/essai-mount et regardez son contenu.
Est-ce que le fichier crée toute à l'heure est là ?
- non
: en effet, nous sommes maintenant dans le système de fichiers crée sur
/dev/sda3 et plus réellement dans le répertoire /root/essai-mount
- oui
3.8 umount
Lorsqu'un
rentre dans le repertoire /root/essai-mount on est redirigé vers notre
système de fichiers, grace à l'association faite avec "mount".
Créez quelques fichiers et répertoires dans le nouveau système de fichiers (donc dans /root/essai-mount).
Umount
Pour des-associer le système de fichiers d'un répertoire, on utilise la commande "umount".
Tout en restant dans "/root/essai-mount" tapez la commande "umount /root/essai-mount".
Que se passe-il?
- une
erreur: le périphérique est occupé : En effet: on ne peut pas démonter
un périphérique tant qu'il est encore utilisé... par exemple, si vous
avez un shell dont le répertoire courant est sur le périphérique.
- ca marche, on peut vérifier que /dev/sda3 n'est plus là avec "df"
- une erreur: le répertoire n'existe pas
- ca marche, mais "df" indique que le système de fichiers est encore monté.
3.9 umount
Utilisation de umount
Il
arrive souvent qu'un fichier ou répertoire soit encore en utilisation
sur un péripherique que l'on veut démonter (umount). Vous devez trouver
le programme (souvent un shell) coupable.
Sortez du répertoire /root/essai-mount puis tapez la commande "sudo umount /root/essai-mount"
vérifiez avec "df" que le disque n'est plus là.
rentrez dans le répertoire /root/essai-mount et vérifiez que son contenu (celui d'avant "mount") est bien revenu.Le fichier /etc/fstab
Le
fichier /etc/fstab enregistre les correspondances entre des
périphériques et des répertoires (points de montage), utilisés par
défaut (par exemple, au démarrage).
Sur votre machine, à quel répertoire est associé le périphérique /dev/fd0 (lecteur disquette) ?
3.11 fstab, exemple
Dans le fichier fstab suivant:
#
# /etc/fstab
#
/dev/hdb1 / ext2 defaults 1 1
/dev/hdb5 /usr ext2 defaults 1 2
/dev/hdb2 /usr/X11R6 ext2 defaults 0 2
/dev/hdb7 /usr/local ext2 defaults 0 2
/dev/hdb6 /home ext2 defaults 1 2
/dev/sbpcd /mnt/cdrom iso9660 ro,noauto
/dev/fd0 /mnt/floppy ext2 defaults,noauto
/dev/hda1 /root/dosc msdos defaults
/dev/hdb8 /root/dosd msdos defaults
/dev/hdb3 none ignore
/dev/hdb4 none ignore
/proc /proc proc defaults
/dev/hda2 none swap sw
A
quel répertoire est associé la deuxième partition primaire se trouvant
sur le deuxième disque de la première nappe (contrôleur) IDE ?
- /usr/X11R6 : oui: premiere nappe = (hda,hdb) .... deuxième disque = hdb ... deuxième partition primaire = hdb2
3.12 fstab, exemple2
Dans le fichier fstab suivant:
#
# /etc/fstab
#
/dev/hdb1 / ext2 defaults 1 1
/dev/hdb5 /usr ext2 defaults 1 2
/dev/hdb2 /usr/X11R6 ext2 defaults 0 2
/dev/hdb7 /usr/local ext2 defaults 0 2
/dev/hdb6 /home ext2 defaults 1 2
/dev/sbpcd /mnt/cdrom iso9660 ro,noauto
/dev/fd0 /mnt/floppy ext2 defaults,noauto
/dev/hda1 /root/dosc msdos defaults
/dev/hdb8 /root/dosd msdos defaults
/dev/hdb3 none ignore
/dev/hdb4 none ignore
/proc /proc proc defaults
/dev/hda2 none swap sw
A
quel type de système de fichier est associé la première partition
primaire se trouvant sur le premier disque de la première nappe
(contrôleur) IDE ?
4. donéées et sauvegardes - importance des données / RAID
4.1 donéées et sauvegardes - importance des données / RAID
4.2 durée de vie
Durée de vie d'un disque dur
La tête de lecture d'un disque dur vole sur un coussin d'air a un dizaine de nanomètres de la surface du disque dur (voir
http://fr.wikipedia.org/wiki/Disque_dur) ... par comparaison un cheveu humain a un diamètre d'environ 100 micromètres (soit 10 000 fois plus).
Un disque standard tourne à 7200 tours par minute.
A votre avis, que se passe-il si une poussière rentre dans votre disque dur ?
A votre avis, que se passe-il si votre disque dur prend un coup lorsqu'il est en fonctionnement ?
Les
fabriquants de disque dur donnent des durées de vie de leurs disques
durs de l'ordre de 3 à 5 ans. Et des garanties de l'ordre de 1 à 3 ans.
Sur des serveurs très sollicités, il arrive de devoir changer des disques tous les ans.
4.3 importance de données
Importance des données
Considérons une personne payé 15 euros de l'heure, donc coûtant 30 euros de l'heure à une entreprise.
Cette personne travaille 35 heures par semaine, 4 semaines par mois.
Quel est le coût pour l'entreprise si suite a un crash de disque dur, 6 mois de travail sont perdus?
4.4 importance de données
Par comparaison le prix d'un disque dur est de l'ordre de 100 euros. (un peu moins)
Combien de disque durs peut-on acheter avec la somme calculée précédemment?
4.6 raid-5
Considerons une configuration raid-5 de 3 disques de 300 Go, combien de Go pouvez vous stocker ?
4.7 raid-5
Considerons une configuration raid-5 de 10 disques de 300 Go, combien de Go pouvez vous stocker ?
4.8 raid-5 parité
Le raid-5 utilise la parité pour pouvoir recuperer des données en cas de perte d'un disque.
La parité peut-etre implementé simplement en utilisant l'operateur binaire "ou exclusif".
Donnez la table de verité de cet opérateur:
- oui
- non
- 0 xor 0 : 0
- 0 xor 1 : 1
- 1 xor 0 : 1
- 1 xor 1 : 0
4.9 raid-5 parité
Supposons que des données soient sur un raid-5 composé de trois disques : A, B et C
Dans cet exemple, les données de parité sont sur C
Une panne survient sur le disque B.
Recalculez, à l'aide de l'opérateur xor les données perdues sur le disque B.
num. ligne
|
disque A
|
disque B
|
disque C
|
1
|
0
|
?
|
0
|
2
|
1
|
?
|
0
|
3
|
1
|
?
|
1
|
4
|
1
|
1
|
0
|
5
|
0
|
1
|
1
|
6
|
1
|
?
|
1
|
- oui
- non
- ligne-1 : 0
- ligne-2 : 1
- ligne-3 : 0
- ligne-6 : 0
4.10 raid risques
Risques
Un raid-5 vous protège contre quels risques?
Indications
RAID:
N'oubliez pas: une donnée écrite/effacée sur le disque "virtuel" formée
par un raid est immédiatement écrite/effacée sur l'ensemble des disques
le constituant.
Piratage:
Lorsqu'une machine est piratée, le pirate modifie des fichiers. Il est
souvent très difficile de trouver quels fichiers ont été modifiés. On
souhaite donc pouvoir restaurer les fichiers tels qu'ils étaient avant
le piratage.
Interruption de service:
un serveur très utilisé (exemple: serveur web) doit tourner en
permanence. On ne peut pas se permettre que le service qu'il fournit
soit interrompu.
- panne d'un disque dur
- suppression par erreur d'un ou plusieurs fichiers
- incendie ou vol d'une machine
- guerre nucléaire
- panne de plus d'un disque
- piratage de votre machine
- interruption de service en cas de panne d'un disque-dur
5. données et sauvegardes - copies, machines distantes
5.1 données et sauvegardes - copies, machines distantes
5.2 transfert de données
Transfert de données entre machines
De nombreux moyens existent pour transferer des données entre deux machines.
Lisez (sur internet ou avec dans man) des elements sur les trois protocoles suivants:
- oui
- non
- un
protocole simple mais non-securisé (sans cryptage) qui ne conserve pas
fiablement les attributs des fichiers (proprietaires, groupes, droits
d'acces ...) : ftp
- copie distante sécurisé : scp
- copie distante. ne copie que les differences, donnant lieu à d\'enormes gains de temps : rsync
5.3 ftp non securise
Service FTP
Nous
allons démarrer un serveur ftp et voir les informations qui circulent
sur le réseau lorsqu'on s'y connecte. Vous pouvez faire cet exercice sur
votre propre machine, ou le faire avec votre voisin (c'est plus
parlant).
Demandez à votre voisin de modifier d'installer un
serveur ftp (vsftpd), et de modifier son fichier de config
(/etc/vsftpd.conf) en de-commentant la ligne : "local_enable=YES"
- Demandez à votre voisin de démarrer le service "vsftpd" (le serveur ftp).
- Lancez le programme sudo wireshark (anciennement "ethereal").
wireshark est un "sniffer", qui permet d'écouter et enregistrer
(capturer) les paquets circulant sur le réseau.
- Lancez la capture (menu capture -> interface -> eth0 -> start ... ou bien eth1 selon la config de votre machine).
- Ensuite connectez vous sur le serveur ftp avec le client ftp
(commande "ftp"). Utilisez le login et mot de passe d'un des comptes
utilisateur de la machine.
- Une fois connecté, arrêtez la capture des paquets. Cherchez les
paquets correspondant au protocole "ftp" (vous pouvez trier les paquets
par protocole, en cliquant tout en haut de cette colonne). Vous devriez
voir votre login/mot de passe apparaître!
La commande "scp" permet de copier des fichiers d'une machine à l'autre en utilisant ssh.
En
lisant la page man de "scp" (ou en cherchant sur internet), quelle
commande faut-il taper pour copier un fichier "essai.txt" se trouvant
sur votre machine, vers le répertoire personnel d'un utilisateur "toto"
sur une machine appelé "zozo.org" ?
(on utilisera le compte de "toto" sur la machine distante zozo.org)
- [ ]*scp[ ]+essai.txt[ ]+toto@zozo.org:[ ]*
5.5 scp distant vers local
Quelle
commande taper pour copier un fichier "essai.txt" se trouvant dans le
répertoire "/tmp" d'une machine distante "zozo.org" vers le répertoire
courant (de votre machine)? L'utilisateur à utiliser sur la machine
distante est "toto".
- [ ]*scp +toto@zozo.org:\/tmp\/essai\.txt +\. *
5.6 scp ethereal
Lancez wireshark (anciennement appelé "ethereal") et démarrez la capture de paquets.
Ensuite copiez des fichiers avec scp, puis arrêtez la capture.
Cherchez les paquets correspondants (ssh).
Est-ce que votre mot de passe apparaît?
La commande "rsync" est très utilisé. Elle a une syntaxe très proche de celle de "scp".
On peut l'utiliser pour copier des fichiers d'une machine à une autre, ou bien pour copier des fichiers sur une même machine.
Quelques options très courantes (voir "man rsync" pour plus de détails):
"-a" : à la place de "-r" et "-p".
"-v" : verbose, la commande décrit tout ce qu'elle fait.
"--delete" : effacer les fichiers absents présents dans le répertoire destination mais pas dans le source.
Un petit détail: "rsync" est sensible à la presence d'un / à la fin d'un nom de répertoire.
Utilisez
"rsync" pour copier les fichier et répertoires précedents de votre
machine vers celle de votre voisin et reciproquement. On utilisera ce
type de commandes:
rsync -av --delete repertoire-source/ toto@adresse_ip_voisin:/tmp/essai/- Tapez plusieurs fois la même commande et comparez l'affichage.
- Modifiez un fichier dans le répertoire source, puis retapez la commande. Comparez l'affichage.
- Supprimez un fichier dans le répertoire source, puis retapez la commande. Comparez l'affichage.
- Supprimez un autre fichier dans le répertoire source, puis retapez la commande sans --delete. Comparez l'affichage.
5.8 sauvegarde par duplication
Conscient de la faible fiabilité des disques durs, vous achetez un
deuxième disque dur que vous installez sur la même machine. Vous utilisez un programme qui duplique
automatiquement votre premier disque sur le deuxième toutes les
semaines.
Contre quels risques êtes vous protégés?
percu=on remarque bien l'existence du problème avant la sauvegarde
inapercu=on ne remarque pas l'existence du problème avant la sauvegarde
- panne d'un disque dur
- suppression par erreur d'un ou plusieurs fichiers (inapercue)
- suppression par erreur d'un ou plusieurs fichiers (percue)
- incendie ou vol d'une machine
- piratage de votre machine (inapercu)
- piratage de votre machine (percu)
- interruption de service en cas de panne de disque-dur
5.9 sauvegarde incrementale
Sur une machine sans raid, on met en place une politique de sauvegarde incrémentale.
Ce type de sauvegarde permet de conserver un historique complet des fichiers.
Vous pouvez lire, par exemple: http://fr.wikipedia.org/wiki/Sauvegarde
La machine contenant les sauvegardes est dans un bâtiment différent.
Contre quels risques êtes vous protégés?
- panne d'un disque dur
- suppression par erreur d'un ou plusieurs fichiers
- incendie ou vol d'une machine
- panne de plus d'un disque
- piratage de votre machine
- interruption de service en cas de panne de disque-dur
5.10 sauvegarde lourde
Dans
un service administratif d'une université, l'administrateur système
équipe tous les ordinateurs d'un graveur de CD-ROM et demande au
personnel du service de sauvegarder régulièrement leurs propres données
importantes.
Est-ce que cela vous parait être une bonne politique de sauvegarde?
Imaginez quelques scénarios.
Quelle espace est disponible sur un CD?
Quel est la taille du disque dur de chaque utilisateur?
Combien
de temps à votre avis est-ce que chaque utilisateur doit passer à
chaque sauvegarde pour choisir les données importantes ?
Est-ce que vous pensez que les utilisateurs vont réellement faire ces sauvegardes ?
Est-ce que ce système de sauvegarde est efficace ?
6. sécurité
6.1 sécurité
Dans les exercices suivants nous allons aborder des problèmes de sécurité.
Les failles de sécurité dans les systèmes informatiques ne sont pas faites exprès.
Elles résultant souvent d'erreurs ou oublis subtils dans des systèmes complexes.
L'exploitation de ces erreurs est souvent difficile et donne lieu a des manipulations complexes.




7. buffer overflow
7.2 buffer overflow - le programme
Saisissez le programme overflow.c suivant et lisez le très attentivement.
Essayez de comprendre en détail chaque ligne.
#include<stdio.h>
void ma_fonction()
{
char chaine[10];
printf("saisissez une chaine:");
scanf("%s",chaine);
printf("vous avez ecrit:%s\n",chaine);
}
int main()
{
ma_fonction();
printf("de retour dans main\n");
return 0;
}
- compilez-le avec "gcc -g overflow.c -o overflow"
- ensuite exécutez-le
- Faites plusieurs essais, en saisissant des chaînes de caractères de tailles différentes (entre 0 et 50 caractères)
Quelle est la ligne d'erreur affichée?
- Segmentation fault
- Erreur de segmentation
7.3 bufer overflow: gdb
"gdb" est un debugger vous permettant de suivre l'exécution de votre programme.
Tapez "gdb ./overflow"
Puis tapez "run" pour lancer le programme.
Saisissez une longue chaîne, et regardez le résultat.
Maintenant, nous voulons exécuter le programme pas-par-pas.
Tapez "break ma_fonction"pour arrêter l'exécution à ma_fonction
Puis relancez le programme avec "run".
pour avancer d'un pas, tapez "next".
Saisissez une longue chaîne.
et tapez next, jusqu'à ce que le programme plante.
A quel moment est-ce que le programme plante?
- à la fin de ma_fonction
- au début de ma_fontion
- au moment du scanf
- a la fin de main
- le programme ne plante pas
7.4 buffer overflow: hexa A
Quel est la valeur ascii de la lettre 'A' (majuscule) en hexadécimal?
(cherchez sur internet, ou écrivez un programme C simple)
7.5 buffer overflow: hexa B
Quel est la valeur ascii de la lettre 'B' (majuscule) en hexadécimal?
7.6 bufer overflow: adresse de retour AAA
Quittez gdb (quit), puis relancez le.
Lancez le programme dans gdb, et saisissez la chaîne de caractères:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Le programme plante avec le message suivant:
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
(gdb)
Gdb vous dit que le programme est en train de s'exécuter à l'adresse mémoire 0x41414141
Réfléchissez bien à ce que ca veut dire.
Un programme C compilé est une suite d'instructions en langage machine.
Chaque instruction se trouve à une adresse dans la mémoire.
Est-ce
que cette adresse 0x41414141 mémoire vous semble être une adresse
normale à la quelle on trouverait un bout de notre programme?
Qu'est-ce qu'il s'est passé ?
7.7 bufer overflow: adresse de retour BBB
Recommencez cette opération, en saissisant la chaine:
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
A quelle adresse de la mémoire se retrouve l'execution du programme lors du plantage?
7.8 bufer overflow: explication, recherche d'adresse
Comme
vous l'avez vu, en dépassant le nombre de caractères permis dans le
tampon "chaine", on a réussi à modifier l'adresse d'exécution du
programme.
En effet, normalement, à la fin de "ma_fonction", le
programme retourne à la fonction appelante (main) dont l'adresse est
mémorisé en fin de la pile. Or, nous avons écrasé cette adresse de
retour par notre saisie trop longue. Si, en plus, on avait réussi a
placer un programme à cette nouvelle adresse, on pourrait faire exécuter
au programme d'origine un code à nous.
Regardez votre cours pour bien comprendre le mécanisme.

Une
difficulté ici pour un pirate serait de trouver exactement combien de
caractères il faut saisir pour remplacer l'adresse de retour d'origine
par une adresse à nous. Il ne connaît pas forcément la taille de la pile
et les autres données qui pourraient y figurer.
En saisissant des chaînes contenant un grand nombre de "A" suivi d'un grand nombre de "B", du type:
AAAAAAAAAAAAAAAAAABBBBBBBBB
déterminez combien de lettres A faut-il saisir pour obtenir l'adresse de retour suivante:
0x42424141
faites de nombreux essais, en sachant que :
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB
retournerait sur 0x41414141 -> on a ecrasé l'adresse de retour avec des 'A'
et que
AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
retournerait sur 0x42424242 -> on a ecrasé l'adresse de retour avec des 'B'
7.9 bufer overflow: protection
bufer overflow: protection
Le
buffer overflow peut se retrouver dans de nombreux contextes. Ici c'est
la fonction scanf qui est fautive. Mais ca pourrait être une autre
fonction.
Dés qu'un programme reçoit des données, il est
susceptible d'être abusé par ce genre d'attaques. Pour éviter ce type
d'attaques, la gestion de toutes les données reçues d'une source
extérieure doit être faite avec prudence.
Est-ce que le problème
dans "overflow.c" est résolu en augmentant la taille de la chaîne de
caractères (par exemple 1000 au lie de 10) ?
- non : en effet: il suffira juste au pirate de saisir une chaine plus longue
- oui
7.10 buffer overflow: problème
Le
problème dans le programme "overflow.c" est la fonction "scanf". Elle
ne vérifie pas une taille maximale de la saisie. On peut utiliser un
tableau aussi grand qu'on veut, l'utilisateur pourra rentrer une saisie
plus grande.
Certaines fonctions comme scanf ne doivent donc pas être utilisés.
Parmi
les fonctions suivantes, lesquelles ne doivent jamais être utilisées
pour traiter des données fournies par une source extérieure?
Il faut vérifier qu'elles permettent d'indiquer la taille maximale des données.
(regardez leurs page "man" pour comprendre)
Dans chaque cas, imaginez un scénario ou ces fonctions pourraient être abusées.
Écrivez un petit programme C pouvant être abusé.
Ensuite, écrivez un programme ayant la même fonctionnalité, mais utilisant les fonctions sécurisés.
8. Sécurité et PHP
8.1 Sécurité et PHP
Dans ces exercices nous allons aborder quelques exemples de failles de sécurité en PHP.


8.2 vulnerabilités php: installation
Installation du PHP
Installez les paquets php5 et php5-gd puis redémarrez apache, pour qu'il en tienne compte.
Créez le fichier "essai.php" suivant dans votre document root apache, et vérifiez son bon fonctionnement.
<?php
echo "bonjour";
phpinfo();
?>
Demandez de l'aide à votre enseignant s'il y a un problème.
Les erreurs courantes sont:
- vous n'avez pas installé PHP
- vous avez installé php4 et pas php5
- vous n'avez pas redémarré apache2
- votre navigateur a gardé en cache le fichier PHP erroné ... videz votre cache
8.3 php: include dangereux
Une
grande partie des failles de sécurité en PHP provient d'une validation
insuffisante des données fournies par l'utilisateur. Les variables $_GET
et $_POST proviennent directement de l'utilisateur qui peut (s'il est
hostile) leur donner des valeurs arbitraires.
Pour que cet
exercice puisse fonctionner, votre voisin doit changer l'option
allow_url_include (=On) dans le fichier de configuration du php :
/etc/php5/apache2/php.ini et redemarrer le serveur web.
Attention,
cet exercice peut-etre un peu déroutant. On vous conseille vivement de
faire un schéma sur un papier. Travaillez à deux (sur deux machines :
"pirate" et "victime" ) et ne désarchivez ces fichiers que sur la
machine "victime". N'oubliez pas que le but, ici c'est que le pirate, à
partir de la machine "pirate", réussisse à lire des informations
confidentielles qui se trouvent sur la machine "victime".
Important:
pour faire cet exercice vous n'avez pas besoin de modifier les fichiers
sur la machine victime (ce serait trop facile..., si le pirate a déjà
accès à la machine, il n'a pas besoin de la pirater...). Vous devez donc
laissez les fichiers index.php, vendre.php et acheter.php tels quels.
- Des-archivez le fichier insecure.tar.gz dans le document root (normalement /var/www) de la machine "victime"
- Dans votre navigateur, prenez connaissance des pages.
- Lisez attentivement le code PHP.
- Ajoutez votre nom dans le fichier "secret.txt" (pour le
personnaliser et qu'il le fichier soit diffèrent de celui de votre
voisin) et deplacez-le dans /tmp sur la machine "victime"
- La directive "include" lit un fichier php et l'exécute. Elle peut
aussi inclure un fichier distant (http://....). C'est sur cette faille
que le pirate va jouer. Au lieu d'inclure les fichiers sur la machine
"victime" comme c'est prévu dans le programme, il va faire en sorte
d'inclure des fichiers sur la machine "pirate".
- Dans le navigateur de la machine "pirate", modifiez l'URL pour inclure un fichier qui se trouve sur la machine "pirate"
IMPORTANT:
Faites un schéma détaillé, sur un papier, ou figurent les deux
machines, les serveurs apache, les fichiers PHP, le fichier "secret.txt"
et l'interpréteur PHP. Représentez sur ce schéma les différentes
requêtes et les informations qui circulent. Les aller-retours
d'information sont complexes, si vous ne faites pas de schéma, vous avez
peu de chances de comprendre ce qui se passe et de réussir à pirater la
machine de votre voisin.
- Le but du pirate est d'exécuter du php qu'il a écrit sur la
machine "victime". Écrivez des fichiers contenant du code php sur la
machine "pirate" pour qu'ils soient inclus par le programme sur la
machine "victime". Attention: ne donnez pas un nom en '.php' à ces
fichiers, sinon il seront exécutés d'abord par le serveur apache de la
machine "pirate".
- Piratez le site de votre voisin de façon à afficher son fichier
"secret.txt". Attention essayez de bien comprendre sur quelle machine
s'exécute le script et ce qu'il doit générer.
Aidez vous des fonctions PHP system("pwd") ou system("cat nom_fichier") qui permettent d'exécuter des commandes shell.
Que se passe-il si votre voisin a laissé les droits d'écriture sur son répertoire et ses fichiers?
(par exemple en faisant un chmod 777 ... sans réfléchir)
8.4 php:system
Demandez à votre voisin de copier le fichier suivant dans un répertoire accessible par le web.
Ce programme php comporte une faille.
Comme
souvent, la faille est liée au fait qu'on ne v'a pas vérifié les
données vennant de l'exterieur: $_GET['nom']. Donc, quelqu'un de
l'extérieur peut faire prendre à la variable "$nom" la valeur qu'il
veut.
Exploitez cette faille pour exécuter d'autres commandes
shell que celle qui est prévue (touch) et affichez le contenu du fichier
/etc/passwd de la machine de votre voisin.
<?php
// .....
$nom=$_GET['nom'];
echo "mise à jour des données de l'utilisateur $nom<br/>";
system("touch donnees/fichier-$nom.xml");
// ....
?>
Ensuite, protégez le programme pour qu'il ne soit plus vulnérable, tout en ayant l'effet prévu.
8.5 unlink
Considérez le programme suivant:
<?php
// .....
$nom=$_GET['nom'];
echo "supression des données de l'utilisateur $nom<br/>";
unlink("donnees/$nom");
// ....
?>
Qu'arrive-il si des répertoires du système ont le droit d'écriture pour l'utilisateur avec le quel tourne le serveur web?
Supposons
qu'un administrateur système debutant lance le serveur web en tant que
root. Que faut-il faire pour supprimer le fichier /etc/passwd ?