<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Segmentation fault &#187; Sécurité informatique</title>
	<atom:link href="http://www.segmentationfault.fr/tag/securite-informatique/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.segmentationfault.fr</link>
	<description>Projets d’un consultant en sécurité informatique</description>
	<lastBuildDate>Fri, 15 Feb 2019 08:02:10 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Exploitation de faille include avec les sessions PHP</title>
		<link>http://www.segmentationfault.fr/securite-informatique/exploitation-de-faille-include-avec-les-sessions-php/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/exploitation-de-faille-include-avec-les-sessions-php/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 19:05:43 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=713</guid>
		<description><![CDATA[Il y a quelques jours, je suis tombé sur un challenge de hack PHP. J&#8217;arrive sur une page avec une URL du type www.site.com/index.php?page=main.php,  qui ressemble étrangement à la célèbre faille include. En effet, quelques tests le démontrent. Autre part sur le site, on trouve une page protégée par un .htaccess. Pour le bypasser, on [...]]]></description>
			<content:encoded><![CDATA[<p>Il y a quelques jours, je suis tombé sur un challenge de hack PHP. J&rsquo;arrive sur une page avec une URL du type <code>www.site.com/index.php?page=main.php</code>,  qui ressemble étrangement à la célèbre faille include. En effet, quelques tests le démontrent. Autre part sur le site, on trouve une page protégée par un .htaccess. Pour le bypasser, on utilise naturellement cette faille include (ou bien <a href="http://www.segmentationfault.fr/securite-informatique/contourner-htaccess-limit-get-post/">cette autre méthode</a>). Mais ce n&rsquo;est pas tout. Outre le fait qu&rsquo;on ne puisse pas inclure de page distante (directive <code>allow_url_include</code> activée), l&rsquo;administrateur n&rsquo;a pas du tout protégé cette faille include. On peut donc inclure tous les fichiers locaux accessibles&#8230;<span id="more-713"></span></p>
<h3>Il était une fois une include non protégée&#8230;</h3>
<p>Je me lance donc dans l&rsquo;exploration de l&rsquo;arborescence en récupérant quelques fichiers intéressants. Commepar exemple /proc/version, qui indique que le serveur tourne sous une Ubuntu basée sur un kernel 2.6.25. Je regarde également  une partie de la configuration Apache dans /etc/apache2/apache2.conf, la liste des utilisateurs dans /etc/passwd. /etc/shadow est bien évidemment non accessible car Apache n&rsquo;est pas lancé par le root. Mais sachant qu&rsquo;un <a href="http://blog.cr0.org/2009/08/linux-null-pointer-dereference-due-to.html">exploit</a> touchant les Linux non patchés a récemment été <a href="http://www.milw0rm.com/exploits/9435">publié</a>,  je me dis qu&rsquo;il doit certainement être possible de rooter le serveur à partir de là. Si j&rsquo;arrive à exécuter des commandes sur le serveur avec les droits d&rsquo;Apache, devenir root ne devrait pas être dur en utilisant cet exploit&#8230;</p>
<p>Je cherche donc un moyen d&rsquo;utiliser la faille include pour pouvoir exécuter du code. Je pense en particulier à l&rsquo;injection de commandes dans les logs Apache. Seul problème : ils ne sont lisibles que par le root, donc pas par Apache (il suffit de tester pour s&rsquo;en rendre compte rapidement). Où vais-je donc pouvoir injecter mes commandes&#8230; ? Quels sont les fichiers manipulés par Apache et PHP dans lesquels on peut écrire indirectement et lire ensuite ? Sur le coup, je sèche&#8230;</p>
<h3>&#8230;un site utilisant les sessions&#8230;</h3>
<p>Là, <a href="http://www.ghostsinthestack.org/">Heurs</a> et <a href="http://virtualabs.fr">Virtualabs</a> me donnent la réponse : les sessions PHP. En effet, PHP stocke les variables de session dans des fichiers (elles sont sérialisées) qui se situent dans /var/lib/php5/. Leur nom suit le format <code>sess_$PHPSESSID</code> où <code>$PHPSESSID</code> est l&rsquo;identifiant de session qui est envoyé dans le cookie, donc facilement récupérable. Et, coup de chance, il se trouve que le challenge en question utilise les sessions pour stocker l&rsquo;utilisateur courant et son mot de passe. Champs qui ne sont sont bien pas vérifiés lors de la soumission du formulaire <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>C&rsquo;est parti ! Je crée un compte bidon avec quelque chose comme <code>&lt;?php system($_GET['c']); ?&gt;</code> pour le login. Je soumet, récupère le cookie contenant l&rsquo;identifiant de session, et inclus le fichier de session correspondant. Et là, j&rsquo;obtiens une jolie backdoor PHP sur le serveur. Rudimentaire, certes, mais fonctionnelle ! A partir de là, j&rsquo;en conçois une légèrement plus élaborée, que je place sur un de mes serveurs, et que je fais télécharger au serveur victime avec un <code>wget</code> (suivi d&rsquo;un <code>mv</code>). Je peux maintenant exécuter des commandes PHP à volonté, lire des fichiers sources, etc. Je récupère une autre backdoor permettant d&rsquo;obtenir un remote shell sur ma machine. J&rsquo;ouvre un port avec Netcat sur ma machine, j&rsquo;upload et lance la backdoor, et le tour est joué.</p>
<h3>&#8230; et un kernel non patché.</h3>
<p>Je peux maintenant exécuter des commandes de façon interactive, mais toujours avec les droits d&rsquo;Apache. Je télécharge un des exploits sock_sendpage de Milw0rm, le compile sur le serveur (gcc y était installé, cool), je lance l&rsquo;exécutable généré, et bing ! Root sur le serveur <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Comme mon but n&rsquo;est pas de planter le serveur, je m&rsquo;arrête ici. Enfin je prends quand même soin de supprimer toute trace de l&rsquo;intrusion dans les logs. Et je garde un petit screenshot, pour envoyer au propriétaire du site, l&rsquo;histoire de le prévenir. Bien entendu, pour envoyer le mail j&rsquo;ai pris soin de créer un mail anonyme et de passer par un proxy, au cas où le propriétaire serait furax et menacerait de porter plainte&#8230; Heureusement, celui-ci est sympa ; il me répond rapidement et me remercie de l&rsquo;avoir prévenu. Et vous savez le comble de l&rsquo;histoire ? Ce serveur ne lui appartenait pas, il ne disposait pas lui-même des droits root <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Conclusion</h3>
<p>Je crois que cette histoire (vraie, pour ceux qui douteraient) illustre plutôt bien et de façon concrète la marche à suivre employée par un attaquant afin de prendre la main sur un serveur : exploitation d&rsquo;une faille distante pour récupérer des informations, exécution de commandes dans le contexte du processus vulnérable, élévation de privilèges en utilisant un local root, et nettoyage des logs. De plus, cet exemple démontre que ce n&rsquo;est pas parce que l&rsquo;on a interdit l&rsquo;inclusion de fichiers distant que l&rsquo;on a un appel à include() sécurisé.</p>
<p>J&rsquo;insiste enfin sur le fait que ce que j&rsquo;ai réalisé ici était à la portée d&rsquo;un script kiddie pour peu qu&rsquo;il connaisse la faille, sache utiliser une backdoor PHP et compiler un exploit. Administrateurs de challenges de hack PHP, méfiez-vous : reproduire des applications vulnérables c&rsquo;est bien, mais pensez à vous protéger un minimum pour éviter le pire&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/exploitation-de-faille-include-avec-les-sessions-php/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Photos NDH 2009</title>
		<link>http://www.segmentationfault.fr/divers/photos-ndh-2009/</link>
		<comments>http://www.segmentationfault.fr/divers/photos-ndh-2009/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 06:24:41 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[Sécurité informatique]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=711</guid>
		<description><![CDATA[News éclair : je viens d&#8217;apprendre sur le blogs de Virtualabs que les photos de la Nuit du Hack 2009 sont en ligne. C&#8217;est par ici.]]></description>
			<content:encoded><![CDATA[<p>News éclair : je viens d&rsquo;apprendre sur le blogs de <a href="http://www.virtualabs.fr">Virtualabs </a>que les photos de la Nuit du Hack 2009 sont en ligne. <a href="http://www.nuitduhack.com/photos-nuit-du-hack-2009.htm">C&rsquo;est par ici</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/divers/photos-ndh-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XeeK, framework d&#8217;exploitation pour XSS</title>
		<link>http://www.segmentationfault.fr/projets/xeek-framework-exploitation-xss/</link>
		<comments>http://www.segmentationfault.fr/projets/xeek-framework-exploitation-xss/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 21:27:15 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[faille web]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[projet]]></category>
		<category><![CDATA[XeeK]]></category>
		<category><![CDATA[XSS]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=307</guid>
		<description><![CDATA[La faille XSS, ou Cross-Site Scripting, est certainement la plus répandue sur le Web. Tous les débutants dans le domaine de la sécurité informatique ou du hacking la connaissent et savent comment voler un cookie ou afficher un message d&#8217;erreur, mais pensent trop souvent à tort que cette faille se limite à cela (j&#8217;ai déjà [...]]]></description>
			<content:encoded><![CDATA[<p>La faille XSS, ou <em>Cross-Site Scripting</em>, est certainement la plus répandue sur le Web. Tous les débutants dans le domaine de la sécurité informatique ou du hacking la connaissent et savent comment voler un cookie ou afficher un message d&rsquo;erreur, mais pensent trop souvent à tort que cette faille se limite à cela (j&rsquo;ai déjà posté un <a href="http://www.segmentationfault.fr/securite-informatique/la-xss-cette-faille-meconnue/">article</a> sur le sujet). D&rsquo;un autre côté, ceux qui programment un minimum en JavaScript/Ajax savent que ce langage permet de faire des merveilles en matière de pages dynamiques et contrôle de navigateur, mais ignorent souvent les possibilités offertes pour une personne malveillante. C&rsquo;est à partir de ces deux constats que m&rsquo;est venue une idée qui est en train de se concrétiser, et qui tient en un mot : XeeK.<span id="more-307"></span></p>
<h3>[EDIT]</h3>
<p>Le projet a subit de nombreux changements depuis la publication de ce billet. J&rsquo;ai publié la première version du projet <a href="http://www.segmentationfault.fr/projets/release-de-xeek-v0-1b/">ici</a> ; en attendant un tutorial vous pouvez retrouver des informations plus à jour <a href="http://www.segmentationfault.fr/projets/conference-sur-xeek-a-la-ndh-2010/">dans ce billet</a>. Gardez à l&rsquo;esprit que les informations qui suivent (et particulièrement le jargon associé à l&rsquo;outil ainsi que les fonctionnalités) ne sont plus complétement valides&#8230;</p>
<h3>Le projet</h3>
<p>XeeK, pour <em>XSS Easy Exploitation Kernel</em>, est un projet dont l&rsquo;objectif est le suivant : démontrer la puissance de la XSS en proposant un outil pour exploiter facilement ce type de faille. Les premières idées qui ont engendré ce projet me sont venues cet été, mais c&rsquo;est uniquement depuis quelques semaines que j&rsquo;ai vraiment commencé à y travailler.</p>
<h3>Un noyau et des modules</h3>
<p>Certains me trouveront peut-être un peu ambitieux, mais mon but serait de faire de XeeK une sorte de <em>Metasploit</em> pour la XSS. Pour dire les choses autrement, l&rsquo;objectif serait de proposer un framework, c&rsquo;est à dire un ensemble de classes, ou de modules capables d&rsquo;interagir ensemble. En fait, si le K de XeeK signifie <em>kernel</em> (noyau) c&rsquo;est parce qu&rsquo;il sera effectivement composé d&rsquo;un noyau proposant les fonctionnalités génériques de base et d&rsquo;une suite de modules qui pourront s&rsquo;y greffer. Dans l&rsquo;idéal, ces modules pourront être développés par n&rsquo;importe qui. A titre de comparaison, considérez le noyau Linux et ses modules, ou bien Firefox et ses extensions.</p>
<h3>Architecture</h3>
<p>Concrètement, XeeK se composera d&rsquo;une interface Web déployée sur un serveur appartenant à un attaquant, disons hacker.com. XeeK étant censé faciliter l&rsquo;exploitation des failles XSS, il appartient à l&rsquo;attaquant de découvrir ces failles ; je n&rsquo;envisage pour le moment pas d&rsquo;intégrer un scanner de ce type dans l&rsquo;outil. Une fois une XSS trouvée sur un site quelconque, disons victime.com, l&rsquo;attaquant pourra utiliser l&rsquo;interface de XeeK afin de générer un exploit personnalisé et paramétrable. Après avoir défini l&rsquo;exploit, celui-ci pourra être intégré à un lien piégé exploitant la XSS sur victime.com. Il ne restera plus à l&rsquo;attaquant qu&rsquo;à faire cliquer la victime sur ce lien&#8230;</p>
<p>Dans le jargon XeeK, l&rsquo;attaquant commencera par créer une <em>session</em>, choisira sa ou ses <em>victimes</em>, et sélectionnera un <em>scheduler</em>, ou ordonnanceur. C&rsquo;est ce composant qui déterminera comment les actions de l&rsquo;exploit seront exécutées sur le navigateur de la victime. J&rsquo;envisage pour le moment deux types de schedulers :</p>
<ul>
<li><em>Statique</em> — toutes les actions de l&rsquo;exploit seront définies à l&rsquo;avance et intégrées &laquo;&nbsp;en dur&nbsp;&raquo; de façon définitive.</li>
<li><em>Dynamique</em> — l&rsquo;exploit chargé sur le navigateur de la victime ne contiendra pas les actions proprement dit, mais un loader qui sera chargé de récupérer les actions sur le serveur XeeK (hacker.com) de façon dynamique et transparente. Ainsi, l&rsquo;attaquant pourra modifier l&rsquo;exploit et suivre la progression de la victime en temps réel.</li>
</ul>
<p>Les actions exécutées chez les victimes seront susceptibles de retourner des résultats qui seront visualisables directement par le biais de l&rsquo;interface. En fait, XeeK cachera l&rsquo;aspect technique de l&rsquo;exploitation et sera conçu pour simplifier au maximum les choses à l&rsquo;attaquant. Plus précisément, l&rsquo;attaquant aura devant lui une interface ressemblant à un debugger, à partir de laquelle il lance son exploit, observe sa progression et visualise les résultats. La différence avec un vrai debugger est que cet exploit sera exécuté sur les victimes et non sur sa propre machine&#8230;</p>
<h3>Une application : BotNet</h3>
<p>Puisque XeeK supportera plusieurs sessions en simultanée, chacune supportant elle-même plusieurs victimes, on en arrive à une des applications potentielles de l&rsquo;outil : faire office de BotNet. Pour ceux qui l&rsquo;ignorent, un botnet est un réseau de machines zombies contrôlable par un attaquant via un protocole quelconque. Ici, il s&rsquo;agira de simples requêtes HTTP. La différence avec les &laquo;&nbsp;vrais&nbsp;&raquo; botnets est qu&rsquo;ici, le code malveillant s&rsquo;exécutera uniquement lorsque la victime aura son navigateur d&rsquo;ouvert sur la page piégée.</p>
<p>Pour aider à la propagation du botnet, la possibilité la plus simple est d&rsquo;utiliser une XSS permanente, c&rsquo;est à dire quand l&rsquo;injection de code est enregistrée en dur sur le site et affecte tous les visiteurs. Ainsi chaque visiteur tombant sur la page piégée rejoindra automatiquement le botnet à son insu et exécutera le même exploit que ses collègues. Tout cela grâce à une malheureuse petite XSS&#8230;</p>
<p>Imaginez qu&rsquo;un site très connu et utilisé par des milliers de visiteurs soit vulnérable à une XSS permanente. Avec XeeK, il devient possible de lancer une attaque de masse contre tous les visiteurs de la page.</p>
<h3>Fonctionnalités</h3>
<p>Qu&rsquo;est-ce que XeeK saura faire ? A vrai dire, les fonctionnalités définitives ne sont pas encore décidées (vu que les modules seront extensibles), mais voici un aperçu de ce que j&rsquo;envisage.</p>
<ul>
<li>Furtivité du point de vue du visiteur (le site exploité continue à fonctionner sans problèmes).</li>
<li>Exécution de code JavaScript arbitraire.</li>
<li>Envoi de requêtes asynchrones (Ajax) vers le site vulnérable. Une des applications pourraît être d&rsquo;exploiter des éventuelles failles XSRF (<em>Cross Site Request Forgery</em>).</li>
<li>Envoi de requêtes asynchrones vers d&rsquo;autres sites.</li>
<li>Détournement de formulaire. Exemple : lorsque la victime remplit un des formulaires de la page, tout son contenu est envoyé sur hacker.com de façon transparente.</li>
<li>Récupération de cookies.</li>
<li>Récupération du contenu de la page (code HTML vu par la victime).</li>
<li>Plus généralement, récupération de n&rsquo;importe quelle variable accessible par JavaScript et DOM.</li>
<li>Traceur de visiteur. L&rsquo;exécution de l&rsquo;exploit continue même si le visiteur change de page, chaque nouvelle page visitée étant loguée et accessible directement par l&rsquo;attaquant.</li>
<li>Simulation de clic sur des liens / boutons / n&rsquo;importe quel élément graphique des pages.</li>
<li>Fonctionne aussi bien en HTTPS qu&rsquo;en HTTP ; cela ne change absolument rien.</li>
</ul>
<h3>Technologies</h3>
<p>XeeK est pour le moment développé à l&rsquo;aide de PHP, JavaScript, Ajax et MySQL. Bien entendu, les langages liés tels que CSS et HTML sont également utilisés à foison. Pour ce qui est de la compatibilité des navigateurs, pour être sincère je n&rsquo;ai encore utilisé que Firefox. Soyons honnête ; je ne suis ni designer ni un pros des subtilités de chaque navigateur. Mais je tiens à préciser qu&rsquo;avant d&rsquo;effectuer une release, je ferais mon possible pour au moins que la partie &laquo;&nbsp;victime&nbsp;&raquo; de l&rsquo;outil fonctionne sur IE qui est toujours, il faut le rappeler, le navigateur le plus utilisé. Je vise au moins IE7, peut-être IE6 mais il ne faut peut-être pas trop en demander pour une 1ère release <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Release</h3>
<p>Je sens venir la question &laquo;&nbsp;<em>Quand XeeK sera-t-il publié ?</em>&laquo;&nbsp;. Je n&rsquo;ai malheureusement pas encore de réponse pour le moment. XeeK est encore au stade de prototype même si plusieurs fonctionnalités marchent déjà bien. Il me reste à concevoir la partie interface de l&rsquo;outil, améliorer deux/trois petites choses, tester la partie exploitation sous IE&#8230; Comme vous pouvez vous en douter je ne travaille pas sur ce projet à plein temps, j&rsquo;ai aussi des études. Pour donner une estimation, j&rsquo;espère pouvoir publier une première release avant 2009. Mais cela ne constitue pas une garantie&#8230; En effet, je préfère prendre mon temps pour bien faire les choses, plutôt que de sortir quelque chose de bancal le plus vite possible. Au pire, je sortirais une alpha ou béta avant sa vraie sortie.</p>
<p>XeeK sera publié sous license GPL (2 ou 3). En d&rsquo;autres termes, n&rsquo;importe qui pourra utiliser, développer et améliorer l&rsquo;outil à condition qu&rsquo;il publie ses travaux également sous GPL.</p>
<h3>Click and hack</h3>
<p>Certains me reprocheront peut-être :</p>
<blockquote><p><em>Tu n&rsquo;as pas honte, de mettre à disposition des scripts kiddies un outil aussi dangereux, où il suffit de cliquer pour pirater ?</em></p></blockquote>
<p>Je leur répondrai tout simplement non pour plusieurs raisons :</p>
<ul>
<li>Il existe des outils similaires encore lus puissants et plus simples à utiliser. Exemple : Metasploit. Personne ne se plaint de cet outil (enfin pas à ma connaissance) alors qu&rsquo;il permet de rooter une machine sans aucune connaissance technique. C&rsquo;est un outil utilisé par des professionnel pour le <em>penetration testing</em>.</li>
<li>Cet outil n&rsquo;est pas plus &laquo;&nbsp;dangereux&nbsp;&raquo; que les possibilités offertes par la faille XSS. Il essaye juste d&rsquo;utiliser ces possibilités au maximum.</li>
<li>En sortant cet outil et en le faisant connaître, j&rsquo;espère faire prendre conscience à plus d&rsquo;un que les failles XSS sont vraiment dangereuses, ce qui semble ne vraiment pas encore être le cas.</li>
</ul>
<p>Sur ce, je crois que j&rsquo;ai tout dit&#8230; Je vais continuer le développement de ce projet en espérant ne pas mettre trop de temps à le publier. Si vous avez des questions ou suggestions, les commentaires sont là pour ça !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/projets/xeek-framework-exploitation-xss/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Netcat, Cryptcat et Socat : 3 outils incontournables de réseau</title>
		<link>http://www.segmentationfault.fr/securite-informatique/netcat-cryptcat-socat/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/netcat-cryptcat-socat/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 16:44:03 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[réseau]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=281</guid>
		<description><![CDATA[En cours de Computer Systems Security, j&#8217;ai eu un TP de réseau sur la manipulation des outils Netcat, Cryptcat et Socat. Si vous faites du réseau mais ne connaissez pas ces outils (au moins Netcat), vous manquez vraiment quelque chose ! Il s&#8217;agit de trois petits outils à utilisation très simple mais aux possibilités innombrables. [...]]]></description>
			<content:encoded><![CDATA[<p>En cours de Computer Systems Security, j&rsquo;ai eu un TP de réseau sur la manipulation des outils Netcat, Cryptcat et Socat. Si vous faites du réseau mais ne connaissez pas ces outils (au moins Netcat), vous manquez vraiment quelque chose ! Il s&rsquo;agit de trois petits outils à utilisation très simple mais aux possibilités innombrables. Les trois ont un point commun : ils vous permettent de créer des connexions TCP ou UDP entre machine, mais chacun a ses particularités, dont je vais essayer de donner un bref aperçu.<span id="more-281"></span></p>
<h3>Netcat : Le couteau-suisse TCP/UDP</h3>
<p><a href="http://netcat.sourceforge.net/" target="_blank">Netcat</a> est disponible pour Linux et Windows et permet basiquement d&rsquo;ouvrir un flux TCP ou UDP entre deux machines. On pourrait considérer Netcat comme un <em>wrapper</em> pour les primitives d&rsquo;ouverture de sockets du système d&rsquo;exploitation. En une ligne de commande, il est possible de créer un serveur écoutant sur un port, ou bien se connecter à un port d&rsquo;une machine distante. Quelques exemples&#8230; Sur une première machine d&rsquo;adresse IP 192.168.0.1, tapez :</p>
<pre>nc -l -p 12345</pre>
<p>Et dans une autre d&rsquo;ip 192.168.0.2, tapez :</p>
<pre>nc 192.168.0.2 12345</pre>
<p>Tapez quelque chose dans une des consoles, suivi d&rsquo;un retour à la ligne ; ce que vous tapez apparaîtra dans l&rsquo;autre console. La 1ère ligne ouvrir un serveur en écoute sur le port 12345 de votre machine, et la 2ème vous permet de vous y connecter. Une fois la connexion établie, tout ce qui entre dans un des processus ressort par l&rsquo;autre : vous venez d&rsquo;établir un flux bi-directionnel entre les deux.</p>
<p>La puissance de Netcat vient du fait qu&rsquo;à la manière de l&rsquo;outil <em>cat</em> d&rsquo;Unix/Linux, il écoute sur l&rsquo;entrée standard et écrit sur la sortie standard. Il est donc possible de combiner les fonctionnalités réseau de Netcat avec la puissance du shell et des outils de communications interprocessus des environnements Unix/Linux. Par exemple, vous pouvez <em>piper</em> l&rsquo;entrée ou la sortie de Netcat, la rediriger dans un fichier&#8230; Quelques exemples simples :</p>
<ul>
<li><em>nc -l -p 12345 &lt; fichier.txt</em> vous permet de créer un serveur en écoute sur le port 12345 de votre machine. Tout client qui s&rsquo;y connectera recevra le fichier fichier.txt. Cela vous permet d&rsquo;envoyer des fichiers en réseau.</li>
<li><em>commande | nc -l -p 12345</em> vous permet d&rsquo;exécuter une commande shell et d&rsquo;envoyer le résultat au client qui se connectera au serveur.</li>
<li>De façon similaire, <em>nc -l -p 12345 | commande</em> permettra au client d&rsquo;envyoer des données à une commande lancée sur le serveur. <em>commande</em> peut être /bin/bash, ce qui vous permettra d&rsquo;exécuter des commandes à distance sur le serveur ! Petit bémol cependant : le client ne verra pas le résultat de la commande, puisque les pipes sont des tubes directionnels.</li>
<li>Pour remédier à cela, il existe une technique utilisant les tubes nommés (<em>named pipes</em>) d&rsquo;Unix: créez un tube nommé avec la commande <em>mkfifo /tmp/tube_test</em> puis lancez la commande <em>nc -l -p 12345 &lt; /tmp/tube_test | /bin/bash &gt; /tmp/tube_test</em>. Le client peut désormais s&rsquo;y connecter avec <em>nc &lt;IP&gt; 12345</em>, taper des commandes et observer le résultat ! Voila comment obtenir une backdoor à moindre coût sur un système <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
</ul>
<p>Netcat n&rsquo;est bien entendu pas limité à se connecter à un autre Netcat ! Vous pouvez tout à fait vous en servir pour vous connecter à un service existant et dialoguer avec lui. Par exemple, en se connectant sur le port 25 d&rsquo;un serveur SMTP il est facile d&rsquo;envoyer un mail.</p>
<p>Netcat peut aussi être utilisé pour faire de la récupération de bannières applicatives (<em>banner grabbing</em>). Connectez-vous sur le port 22 d&rsquo;un serveur SSH : vous obtenez le nom du serveur avec sa version exacte. Idem pour tous les autres services&#8230; C&rsquo;est en utilisant cet outil qu&rsquo;on réalise à quel point certains services sont bavards. Pour vous en persuader, connectez-vous à un serveur Apache avec PHP configuré par défaut, envoyez une simple requête HTTP et observez la réponse ; il y a des fortes chances qu&rsquo;Apache vous révèle son numéro de version, celles de PHP, ainsi que les modules lancés.</p>
<p>Maintenant, rajoutez à cela toute une foule d&rsquo;options, et vous obtenez la réelle puissance de Netcat !</p>
<ul>
<li>L&rsquo;option <em>-c</em> permet de spécifier une commande à lancer et à laquelle se connecter ensuite. En d&rsquo;autre termes, Netcat va relier sa sortie à l&rsquo;entrée de cette commande, et relier la sortie de la commande à sa propre entrée. Exemple : <em>nc -l -p 12345 -c /bin/bash</em> est la version courte de notre dernier exemple, car cela crée automatiquement un serveur qui enverra toutes les entrées à /bin/bash et renverra tous les résultats au client. Mais il y a encore plus fort : vous pouvez utiliser une autre instance de Netcat comme ceci :</li>
</ul>
<blockquote>
<ul>
<li>Lancez sur une première machine IP_A un serveur sur le port 12346 : <em>nc -l -p 12346</em></li>
<li>Sur une deuxième machine IP_B, lancez <em>nc -l -p 12345 -c &lsquo;nc &lt;IP_A&gt; 12346&prime;</em> afin d&rsquo;ouvrir un serveur sur le port 12345 de la machine et de le relier au serveur de la 1ère</li>
<li>Sur une troisième machine, connectez-vous au 2ème serveur avec <em>nc &lt;IP_B&gt; 12345</em>. Tout ce que vous tapez est transmis à la 2ème machine qui retransmet le tout à la 1ère, et vice-cersa pour le retour. En gros, la 2ème machine fait office de proxy, ou <em>bouncer</em>. Le serveur final (1ère machine) ne verra jamais l&rsquo;adresse IP du client.</li>
</ul>
</blockquote>
<ul>
<li>Par défaut, Netcat utilise TCP. L&rsquo;option <em>-u</em> permet dele fiare basculer en mode UDP.</li>
<li>Par défaut, Netcat essaie de résoudre les DNS. Pour éviter cela en réseau local si vous n&rsquo;utilisez que des adresses IP, utilisez l&rsquo;option <em>-n</em>.</li>
<li>L&rsquo;option -z permet de fermer la connexion juste après qu&rsquo;elle ait été ouverte. En fait, cela permet de juste tester si un port est ouvert sans envoyer de données. En scriptantun minimum, il deviant facile de concevoir son propre scanner de port !</li>
</ul>
<p>Il existe bien d&rsquo;autres flags, à vous de les découvrir via l&rsquo;aide (<em>-h</em>) ou le manuel (<em>man nc</em>).</p>
<h3>Cryptcat : Netcat en crypté</h3>
<p>Si vous lancez Wireshark sur vos machines, vous vous apercevrez que vous pouvez tout à fait lire les données envoyées par Netcat. Pour remédier à cela, utilisez <a href="http://sourceforge.net/projects/cryptcat/" target="_blank">Cryptcat</a> à la place de Netcat ! Cet outil s&rsquo;utilise exactement comme Netcat mais encrypte le traffic grâce à un algorithme de chiffrement symétrique. La clé de chiffrement est par défaut <em>metallica</em> mais peut être changée avec l&rsquo;option <em>-k</em>. Attention, lisez bien l&rsquo;aide ou le manuel avant d&rsquo;utiliser Cryptcat car certaines versions ne supportent pas certains flags de Netcat.</p>
<h3>Socat : Relai bidirectionel</h3>
<p><a href="http://www.dest-unreach.org/socat/" target="_blank">Socat</a> (uniquement pour Linux/Unix) vous permet d&rsquo;établir non pas une mais deux connexions à la fois et de les relier. Cet outil possède une quantité phénoménales d&rsquo;options qui lui permettent de réaliser des opérations complexes de façon triviale. Socat est capable de lire/écrire dans tous types de flux, aussi bien réseau (TCP, UDP avec IPv4 et IPv6, SSL&#8230;) que systèmes (fichiers, file descriptors, pipes, terminaux virtuels, processus&#8230;). Comme exemple, recréons un bouncer mais cette fois-ci avec Socat :</p>
<pre>socat TCP4-LISTEN:&lt;port_source&gt; TCP4:&lt;IP_cible&gt;:&lt;port_cible&gt;</pre>
<p>N&rsquo;est-ce pas déconcertant de simplicité ? Et gardez à l&rsquo;esprit que ce n&rsquo;est qu&rsquo;une des possibilités&#8230; Tapez dans l&rsquo;aide pour la liste exhaustives des options supportées.</p>
<h3>Netcat, Cryptcat et Socat : l&rsquo;attirail obligatoire pour le réseau</h3>
<p>En résumé, Netcat permet d&rsquo;exécuter les opérations réseau de base, Cryptcat rajoute une couche de chiffrement à ces flux, et Socat permet de les relier de façon bidirectionnelle. Munis de ces outils, il devient très facile de manier les couches réseau. Outre l&rsquo;aspect &laquo;&nbsp;bidouillage&nbsp;&raquo;, ils permettent de tester rapidement le fonctionnement de certains services. En les combinant à des outils comme Nmap et TCPDump, et en développant un minimum de petits scripts, il est possible de coder des outils vraiment puissants. Bref, j&rsquo;espère vous avoir convaincu d&rsquo;adopter ces outils <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/netcat-cryptcat-socat/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Deuxième semaine de cours</title>
		<link>http://www.segmentationfault.fr/semestre-etats-unis/deuxieme-semaine-de-cours/</link>
		<comments>http://www.segmentationfault.fr/semestre-etats-unis/deuxieme-semaine-de-cours/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 23:38:02 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Un semestre aux États-Unis]]></category>
		<category><![CDATA[Cryptographie]]></category>
		<category><![CDATA[RIT]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[USA]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=221</guid>
		<description><![CDATA[Après un agréable week-end de 3 jours et demi, j&#8217;ai eu ma deuxième semaine de cours, qui est passée encore plus vite que la précédente. J&#8217;ai beau avoir 13 heures de cours, le travail à fournir à côté est assez conséquent. Voici un petit résumé de cette semaine. Week-end : cell phone mission Jeudi midi, [...]]]></description>
			<content:encoded><![CDATA[<p>Après un agréable week-end de 3 jours et demi, j&rsquo;ai eu ma deuxième semaine de cours, qui est passée encore plus vite que la précédente. J&rsquo;ai beau avoir 13 heures de cours, le travail à fournir à côté est assez conséquent. Voici un petit résumé de cette semaine.</p>
<p><span id="more-221"></span></p>
<h3>Week-end : cell phone mission</h3>
<p>Jeudi midi, une fois mon cours de base de données terminé, je suis en week-end. Après avoir déjeuné à Crossroads (un resto non loin du collège d&rsquo;informatique) avec d&rsquo;autres Frenchies, nous décidons de partir en expédition dans le but d&rsquo;acheter des téléphones portables ! Car il faut l&rsquo;avouer : ici, si on n&rsquo;a pas de portable, c&rsquo;est la loose. Skype est très pratique pour communiquer entre amis lorsqu&rsquo;on est chacun chez soi, mais quand on est sur le campus, c&rsquo;est une autre paire de manches. Le campus est tellement grand que l&rsquo;on n&rsquo;a quasiment aucune chance de croiser la personne que l&rsquo;on cherche.</p>
<p>Après avoir un peu recherché sur Internet, nous concluons que l&rsquo;offre qui nous conviendrait le mieux est &laquo;&nbsp;<em>Pay as you go</em>&laquo;&nbsp;. Pour faire simple, il s&rsquo;agit de l&rsquo;équivalent des cartes de recharges en France. Nous repérons une offre de T-Mobile qui a l&rsquo;air intéressante : pour $30, on a un portable avec une carte de $25 gratuite, le tout étant livré gratuitement à domicile. Cependant, impossible de commander en ligne ; la commande échoue au dernier moment, suite à une erreur inconnue. Nous avons essayé de les contacter, mais leur site est tellement bien fait que leur formulaire d&rsquo;envoi de mail ne fonctionne pas non plus.</p>
<p>Motivés, nous décidons de nous rendre dans l&rsquo;agence la plus proche. Nous prenons un bus qui nous dépose à Southtown Plaza, une galerie commerciale. Après une petite reconnaissance, aucune boutique T-Mobile en vue. Nous demandons donc à des commerçants, qui nous indiquent que la boutique la plus proche est en fait au Marketplace Mall, centre commercial qui est très proche quand on a une voiture, mais pas si proche que ça quand on est à pieds&#8230; Nous avons donc l&rsquo;occasion de vérifier une deuxième vérité : ici, si on n&rsquo;a pas de voiture, c&rsquo;est la loose (à peu près autant que quand on n&rsquo;a pas de portable, en fait).</p>
<p>Après une vingtaine de minutes de marche, nous parvenons dans la galerie marchande du Mall. Là, nous repérons une boutique T-Mobile, et nous demandons conseil au vendeur. Celui-ci nous explique que cette boutique ne fait pas l&rsquo;offre que nous voulons, mais qu&rsquo;il y en a une autre qui la fait dans la même galerie. Nous y allons donc, et une fois à l&rsquo;intérieur, on nous explique que l&rsquo;offre que nous avions vue n&rsquo;est en fait disponible que sur Internet&#8230; En fait, ils la font aussi ici, mais sans la carte gratuite. Nous jetons un coup d&rsquo;oeil, et nous trouvons un portable à 20$, le plus basique qui soit. Au niveau des cartes de recharges, il y a plusieurs tarifs, de $20 à $200, suivant le nombre de minutes disponibles. Au passage, on nous explique aussi qu&rsquo;aux USA, votre crédit est aussi débité quand on vous appelle, et même quand vous consultez votre messagerie vocale&#8230; Mais bon, nous n&rsquo;avons pas trop le choix, donc nous optons tous pour cette solution, en achetant le portable ainsi qu&rsquo;une carte de $50. On se retrouve alors avec 7h de crédit d&rsquo;appel/réception à utiliser en 3 mois, sachant que le crédit inutilisé est reporté si on recharge avant la date limite. Bref, le principal est que nous avons désormais chacun un portable !</p>
<h3>Computer System Security</h3>
<p>Lundi, reprise à 8h30 avec sécurité informatique. Bonne nouvelle, je me rends compte que la lecture du livre et son compte rendu n&rsquo;est pas à faire pour les étudiants <em>undergraduate</em> comme moi, c&rsquo;est toujours ça de moins à faire. Le prof continue son introduction sur la sécurité, et insiste sur le fait que dans une entreprise, la véritable menace vient de l&rsquo;intérieur : c&rsquo;est très souvent les employés mécontents qui sont scusceptibles de crasher le réseau, plutôt que des attaquants externes.</p>
<p>Pendant la séance de lab, nous nous remettons par groupes pour préparer la compétition (celle au cours de laquelle nous allons devoir pirater les autres groupes). Avec mon équipe, nous décidons des systèmes d&rsquo;exploitation et des logiciels que nous allons mettre en place sur nos machines. Petit détail qui ne nous facilite pas la tâche : le réseau étant totalement déconnecté d&rsquo;Internet pour éviter la propagation des attaques, il est difficile de télécharger les mises à jour des différents programmes que nous allons utiliser&#8230; Nous répartissons les tâches; pour ma part elle consistera à installer le serveur Web (avec HTTPS), le sécuriser, et créer un mini site web factice, le but étant de fournir un point d&rsquo;accès supplémentaire aux autres équipes.</p>
<h3>Cryptography</h3>
<p>En cryptographie, nous avons un homework à rendre pour le vendredi qui suit. Pour ceux que ça intéresse, parmis les questions posées, il est demandé de décryter le texte suivant :</p>
<pre style="text-align: center;">NAGQNXIIZAGBGIIYXQOMQUGQUZAXTNGMYXQGTTASNISQO
AMFGZAGEZVOOGUZAGIGMTAMQUTZYMXQGUMCMYZDECMLWS
RVQYVIEASVQUTXLMQQSZTZMYZZAGDMOMXQSQMPVMYYESR
WQSNIGUOGZAGEAMZGZSAVQZXLMQAMVIZAGDMQUVYOGZAG
DQSDSYGQSDSYGLMQXGQUVYGZSBGMYZAGBYVQZSRZAGBSS
WTZAMZIXGSVZSQZAGUGTWTMRVIIZAYGGTLSYGSRTGFGYM
IXQTVIZTSRBISZZGUCMOGTMQUTLYMNISRTISFGQIENSYW
ZAMZZAGEAMFGSRRGYGUDGXMDTXLWMQUZXYGUDSYGZAMQM
QEZAYMIIVCSQZAGNSSUTZMLWTNSYWXQONGMYXGUIE</pre>
<p>Deux indices :</p>
<ul>
<li>Il s&rsquo;agit d&rsquo;un chiffrage par substitution monoalphabétique, autrement dit chaque lettre du texte crypté correspond en réalité à une autre lettre.</li>
<li>Le texte original est en Anglais.</li>
</ul>
<p>Allez, un petit effort, il n&rsquo;y a que 26! = 403291461126605635584000000 possibilités&#8230; Mais pour nous aider, nous sommes libres d&rsquo;utiliser quelques astuces ainsi que le langage de programmation de notre choix ; pour ma part j&rsquo;ai choisi Python. Je m&rsquo;acharne un peu dessus, et au bout de quelques heures, j&rsquo;en viens enfin à bout. Je donnerais la solution plus tard pour ceux qui souhaitent chercher eux mêmes <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Pour ceux qui en veulent encore, je peux leur donner le deuxième texte que nous avions à décrypter, cette-fois çi en Hollandais&#8230;</p>
<p>Au niveau des cours, ils sont assez intéressants. Nous finissons la série des cryptosystèmes classiques tels que Hill et Vigenère, puis nous entamons RSA (un des plus utilisés de nos jours) à la fin de la semaine.</p>
<p>Pour ceux qui sont vraiment motivés, je pourrais vous filer mon homework de chaque semaine, si vous voulez le faire à ma place&#8230; Non, je plaisante, je ne voudrais surtout pas enfreindre le règlement du RIT ! En effet, ici ils ne plaisantent pas : tricher ou copier le travail d&rsquo;un autre est puni d&rsquo;un F, qui est la pire note (l&rsquo;équivalent d&rsquo;un 0 chez nous).</p>
<h3>Database System Implementation</h3>
<p>Lorsque nous arrivons en cours de bases de données, le professeurs procède au tirage au sort pour la composition des groupes de projet. Je me retrouve avec 2 américains, qui ont l&rsquo;air plutôt motivés pour faire du C/C++, comme moi. Il faut ensuite choisir quel système de base de données reprendre. Nous partons sur PostgreSQL, mais après quelques concertations, nous changeons d&rsquo;avis et décidons que nous allons plutôt travailler avec MySQL, qui a l&rsquo;air plus simple et mieux documenté.</p>
<p>Le travail va consister à récupérer son code source, l&rsquo;analyser pour comprendre son fonctionnement. Nous devrons ensuite proposer 3 améliorations, puis nous les ajouter au code source, pour finir avec une démonstration et la rédaction d&rsquo;un rapport de projet.</p>
<p>Niveau cours, nous commençons par parler des moyens de stockage de données. Nous voyons le fonctionnement des disques durs, avec un jargon (plateau, piste, cylindre, secteur&#8230;) qui me rappelle étrangement ce que nous voyons en cours de Système à l&rsquo;INSA. Nous en venons ensuite à la structure des fichiers contenant les tables des bases de donnée, en abordant l&rsquo;indexation des blocs de données. Cela me rappelle beaucoup certaines parties du cours de Base de Données de 4INFO, mais en plus condensé. En tout cas, j&rsquo;en profite pour enrichir mon vocabulaire anglo-saxon.</p>
<h3>De nouveau en week-end</h3>
<p>Et voila, ma semaine est déjà finie. J&rsquo;ai déjà quelques soirées de prévues, dont un resto — je vais tester Buffalo Wild Wings, qui a l&rsquo;air d&rsquo;être assez connu ici —, un ciné @ RIT (ils projettent <em>The Kingdom</em> ce soir en amphi), ainsi qu&rsquo;une super French Crêpes Party organisée par tous les INSAliens exilés au RIT. Il ne faudra quand même pas que j&rsquo;oublie de travailler, pour éviter de prendre trop de retard dans mes projets&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/semestre-etats-unis/deuxieme-semaine-de-cours/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>La XSS, cette faille méconnue</title>
		<link>http://www.segmentationfault.fr/securite-informatique/la-xss-cette-faille-meconnue/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/la-xss-cette-faille-meconnue/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 17:33:31 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[faille web]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[XSS]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=70</guid>
		<description><![CDATA[En matière de sécurité des sites Web, la XSS est sans doute la faille incontournable, tant au niveau de sa popularité auprès des hackers débutants que du nombre impressionnant de sites vulnérables. Pour s&#8217;en rendre compte, il n&#8217;y a qu&#8217;à comparer le nombre de sites vulnérables aux XSS et ceux touchés par les injections SQL [...]]]></description>
			<content:encoded><![CDATA[<p>En matière de sécurité des sites Web, la XSS est sans doute la faille incontournable, tant au niveau de sa popularité auprès des hackers débutants que du nombre impressionnant de sites vulnérables. Pour s&rsquo;en rendre compte, il n&rsquo;y a qu&rsquo;à comparer le nombre de sites vulnérables aux XSS et ceux touchés par les injections SQL — qui, rien qu&rsquo;eux, sont déjà nombreux. Cependant, contrairement aux injections SQL, les failles de type XSS ne sont pas exploitables au niveau du serveur lui-même, mais nécessitent la présence d&rsquo;un client. C&rsquo;est justement cette différence fondamentale qui, à mon avis, entraîne les gens à penser que la XSS est moins dangereuse que l&rsquo;injection SQL. Beaucoup (trop) de développeurs pensent que la XSS ne permet que de voler les cookies des visiteurs, et imaginent que pour sécuriser leur site il suffit de faire des vérifications sur leurs IP. Comme nous allons le voir, ces deux idées reçues sont complètement fausses.</p>
<p>J&rsquo;ai justement décidé de rédiger ce billet afin de sensibiliser les lecteurs aux véritables dangers qui se trouvent dans la face cachée de cet iceberg qu&rsquo;est la faille XSS. Comme mon but n&rsquo;est pas d&rsquo;aider les <em>script-kiddies</em> à exploiter cette faille, je ne donnerai pas de code ni d&rsquo;exploit tout fait. Je suppose que les lecteurs ayant quelques connaissances en JavaScript pourront tester eux-mêmes et vérifier la véracité de mes propos&#8230;<span id="more-70"></span></p>
<h3>Les « vraies » possibilités de la XSS</h3>
<p>Pour comprendre les enjeux qui se cachent derrière la faille XSS, revenons à la base : qu&rsquo;est-ce qu&rsquo;une XSS ? Les initiales XSS signifient <em>Cross Site Scripting</em>, le C ayant été remplacé par le X du fait que CSS signifie déjà <em>Cascade Style Sheets</em>. La faille XSS permet à un attaquant potentiel d&rsquo;exécuter du code (un <em>script</em>) sur le navigateur du client. Elle apparaît quand un site Web affiche des variables provenant d&rsquo;une entrée utilisateur sans les filtrer. Ainsi, le simple code PHP suivant est vulnérable :</p>
<pre>&lt;?php
echo $_GET['var'];
?&gt;</pre>
<p>En effet, un attaquant visitant cette page contrôle directement (par le biais de l&rsquo;URL) le contenu de la variable <code>$_GET['var']</code>. Il peut alors insérer du code HTML ou JavaScript, et il s&rsquo;exécutera comme s&rsquo;il faisait partie du site Web.</p>
<p>Quel intérêt ? Tout simplement le fait de pouvoir manipuler un visiteur en lui donnant un lien piégé. En cliquant sur un lien exploitant la faille XSS, le navigateur du visiteur va afficher le code HTML du site et exécuter le code JavaScript. Cela permet alors de récupérer des informations propres au visiteur, puisque tout le code est exécuté comme s&rsquo;il provenait du site original. En effet, il faut savoir que si un site X envoie par exemple un cookie à un visiteur, le site Y ne pourra pas le lire. Le fait que la XSS permette d&rsquo;injecter un script malveillant directement dans le code envoyé par X va donc autoriser ce script à récupérer des informations telles que des cookies.</p>
<p>Mais la récupération de cookie est loin d&rsquo;être la seule possibilité des XSS. A vrai dire, la XSS offre absolument toutes les possibilités qu&rsquo;offre JavaScript, puisqu&rsquo;elle permet l&rsquo;exécution de code JS arbitraire sur le navigateur. Citons quelques exemples :</p>
<ul>
<li>Vol de cookies, détournement de session</li>
<li>Accès aux mêmes privilèges que la victime</li>
<li>Accès au contenu de pages protégées (du moment que la victime peut y accéder)</li>
<li>Exécution de requêtes arbitraires en se faisant passer pour la victime</li>
<li>Espionnage de la victime, récupération de toutes les actions effectuées telles que les pages visitées, les saisies dans les formulaires — qui contiennent au passage probablement des mots de passe</li>
<li>Ouverture de fenêtres de téléchargement de logiciels (pouvant être des spywares, trojans, rootkits&#8230;) lorsque la victime surfe sur ce site auquel elle fait confiance — et par conséquent, baisse sa garde</li>
</ul>
<p>Il faut bien comprendre que la faille XSS permet à l&rsquo;attaquant d&rsquo;avoir un accès direct au navigateur de la victime, et qu&rsquo;il peut alors absolument tout faire sur le site en se faisant passer pour la victime. Si la victime est par exemple un utilisateur lambda d&rsquo;un forum, l&rsquo;attaquant pourra poster des messages sous son nom, modifier son profil, et même dans certains cas changer son mot de passe. Si la victime est l&rsquo;administrateur du forum, je vous laisse imaginer les possibilités offertes&#8230;</p>
<p>Attention, il faut cependant bien voir que la XSS ne permet pas l&rsquo;élévation de privilèges au delà de ceux de la victime, autrement dit un attaquant ne pourra pas faire plus que ne le peut sa victime. Par exemple, s&rsquo;il piège un utilisateur lambda du forum, il ne pourra pas effectuer des tâches d&rsquo;administration — à moins bien sûr qu&rsquo;une autre faille soit présente sur le site.</p>
<h3>Est-ce difficile à exploiter ?</h3>
<p>Non ! Et c&rsquo;est une raison de plus pour prendre au sérieux la menace réelle que constitue cette faille ! Concrètement, il suffit d&rsquo;avoir quelques connaissances en JavaScript pour pouvoir exploiter une faille XSS sur un site de base non protégé. De plus, la popularité grandissante d&rsquo;<em>Ajax</em> offre encore de nouvelles possibilités, puisque l&rsquo;objet XMLHttpRequest permet d&rsquo;effectuer des requêtes asynchrones sur le serveur. Cela permet d&rsquo;effectuer des requêtes en se faisant passer pour la victime tout en restant invisible. Et même si Ajax ne permet pas d&rsquo;effectuer de requêtes sur un autre serveur (les requêtes sur des serveurs autres que celui visité ne sont pas permises par le navigateur), il existe une <a href="http://blog.pascal-martin.fr/post/Requete-Ajax-Cross-domain-balise-script" target="_blank">technique</a> permettant de passer outre et d&rsquo;effectuer des requêtes <em>cross-domain</em> de façon détournée. Il devient alors possibles d&rsquo;envoyer des requêtes sur un site distant, comme par exemple le site Web de l&rsquo;attaquant.</p>
<p>Ainsi, en ayant un minimum de connaissances JavaScript, il est possible de concevoir un exploit permettant de dumper un site Web vers une base de données contrôlée par l&rsquo;attaquant, tout en se faisant passer pour un visiteur et donc en ayant accès à toutes les pages qu&rsquo;il peut voir. Ainsi, même si l&rsquo;attaquant n&rsquo;a aucune connaissance au préalable d&rsquo;un site Web et des éventuelles zones à accès réservés, il peut étudier ces dumps en off-line de façon totalement invisible puisqu&rsquo;il ne consulte jamais le serveur directement. Il pourra alors mettre au point un second exploit qui lui permettra par la suite d&rsquo;effectuer véritablement l&rsquo;attaque en effectuant des requêtes pour le compte de la victime.</p>
<h3>Les techniques qui <span style="text-decoration: underline;">ne protègent pas</span> un site contre les XSS</h3>
<p>Les pratiques suivantes ne protègent en rien un site Web contre les XSS :</p>
<ul>
<li>Vérification les IP des visiteurs authentifiés — inutile puisque le code est exécuté par la victime !</li>
<li>Protections par .htaccess — inutile puisque si la victime est authentifiée, la requête forgée pourra être exécutée</li>
<li>Utilisation de HTTPS — ne change absolument rien, JavaScript et Ajax fonctionnent très bien en HTTPS&#8230;</li>
</ul>
<p>Attention, je n&rsquo;ai pas dit que ces mesures de protections étaient complètement inutiles ; juste que <span style="text-decoration: underline;">dans le cas de la XSS</span>, elles le sont.</p>
<h3>La seule solution pour en finir avec les XSS</h3>
<p>On ne le répétera jamais assez, il faut <strong>filtrer toutes les entrées utilisateur</strong>, en particulier celles que l&rsquo;on <strong>affiche</strong> sur le site. Cela est valable pour toutes les variables envoyées par GET, POST, récupérées via les cookies, et plus généralement tout ce qui transite dns les requêtes HTTP, comme les entêtes (dont le célèbre <em>X</em>-<em>Forwarded-For</em>) donc même certaines variables du tableau <code>$_SERVER</code> de PHP. Pour être efficace, la fonction de filtrage doit :</p>
<ul>
<li>Remplacer les caractères spéciaux par leurs entités HTML correspondantes</li>
<li>Supprimer toutes les balises HTML (dont &lt;script&gt;)</li>
</ul>
<p>En fait, le deuxième point est inclus dans le premier, puisque les caractères &lt; et &gt; sont spéciaux et peuvent donc être remplacés.</p>
<p>En PHP, pour sécuriser efficacement les entrées utilisateurs contre les XSS, il faut utiliser la fonction <code>htmlentities()</code> en n&rsquo;oubliant pas de lui passer la constante <code>ENT_QUOTES</code> en deuxième argument afin de considérer les guillemets simples et doubles comme des caractères spéciaux et de les remplacer elles aussi. Un exemple :</p>
<pre>&lt;?php
echo <strong>htmlentities(</strong>$_GET['var'], <strong>ENT_QUOTES)</strong>;
?&gt;</pre>
<p>Ainsi ce code est sécurisé, contrairement au premier. L&rsquo;utilisation de cette fonction permet de sécuriser des variables affichées aussi bien entre des balises que dans des valeurs d&rsquo;attributs de balises, comme c&rsquo;est le cas dans des champs de formulaires. En effet, comme les caractères &lt;, &gt;, &lsquo; et &nbsp;&raquo; sont filtrés, il est impossible de s&rsquo;évader des champs et d&rsquo;injecter du code JavaScript.</p>
<p>Il s&rsquo;agit à ma connaissance de la seule protection valable pour sécuriser une variable contre les XSS dans toutes les conditions. L&rsquo;utilisation d&rsquo;autres fonction, comme par exemple <code>striptags()</code>, ne suffit pas dans toutes les conditions puisques les guillemets ne sont pas filtrées, laissant la possibilité d&rsquo;injecter des attributs supportant le JavaScript comme <code>onload</code>, <code>onmouseover</code>, etc.</p>
<h3>La XSS, une faille finalement pas si inoffensive que ça&#8230;</h3>
<p>Pour conclure, j&rsquo;espère vous avoir convaincu que la faille XSS représente une réelle menace, et qu&rsquo;il est très important de la prendre au sérieux. Si le filtrage des variables contre les injections SQL commence à rentrer dans les mœurs, on ne peut pas en dire autant pour les XSS. Et pourtant, cette dernière permet dans certains cas de rooter complétement un site&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/la-xss-cette-faille-meconnue/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
