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

<channel>
	<title>Segmentation fault &#187; hacking</title>
	<atom:link href="https://www.segmentationfault.fr/tag/hacking/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.segmentationfault.fr</link>
	<description>Projets d’un consultant en sécurité informatique</description>
	<lastBuildDate>Fri, 15 Feb 2019 08:02:10 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Release de XeeK v0.1b</title>
		<link>https://www.segmentationfault.fr/projets/release-de-xeek-v0-1b/</link>
		<comments>https://www.segmentationfault.fr/projets/release-de-xeek-v0-1b/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 16:15:21 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[XeeK]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=833</guid>
		<description><![CDATA[Comme promis, voici la toute première release de XeeK, en direct de la Nuit Du Hack 2010. Comme son numéro de version le suggère, il s&#8217;agit d&#8217;une version BETA donc potentiellement buggée . XeeK v0.1b : archive comportant le client, le serveur, ainsi que l&#8217;aide (fichiers INSTALL.txt et README.txt) Slides de la conférence (PDF) J&#8217;éditerai [...]]]></description>
			<content:encoded><![CDATA[<p>Comme promis, voici la toute première release de XeeK, en direct de la Nuit Du Hack 2010. Comme son numéro de version le suggère, il s&rsquo;agit d&rsquo;une version BETA donc potentiellement buggée <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<span id="more-833"></span></p>
<ul>
<li><a href="http://www.segmentationfault.fr/wp-content/uploads/2010/06/xeek-0.1b.zip">XeeK v0.1b</a> : archive comportant le client, le serveur, ainsi que l&rsquo;aide (fichiers INSTALL.txt et README.txt)</li>
<li><a href="http://www.segmentationfault.fr/wp-content/uploads/2010/06/XeeK.pdf">Slides de la conférence</a> (PDF)</li>
</ul>
<p>J&rsquo;éditerai ce billet prochainement pour y ajouter un petit tutorial concernant l&rsquo;installation et l&rsquo;utilisation de XeeK.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/projets/release-de-xeek-v0-1b/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>De retour du SSTIC 2010</title>
		<link>https://www.segmentationfault.fr/securite-informatique/sstic-2010/</link>
		<comments>https://www.segmentationfault.fr/securite-informatique/sstic-2010/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 12:08:41 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[hacking]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=812</guid>
		<description><![CDATA[Me voici de retour de l&#8217;édition 2010 du SSTIC. C&#8217;était la première fois que j&#8217;allais à cette excellente conférence, réunissant pas moins de 450 personnes autour de différents thèmes centrés sur la sécurité des systèmes d&#8217;information. Au programme : 3 jours de conférences, des rump sessions, un social event, des geeks, des trolls, du code [...]]]></description>
			<content:encoded><![CDATA[<p>Me voici de retour de l&rsquo;édition 2010 du <a href="http://www.sstic.org/2010">SSTIC</a>. C&rsquo;était la première fois que j&rsquo;allais à cette excellente conférence, réunissant pas moins de 450 personnes autour de différents thèmes centrés sur la sécurité des systèmes d&rsquo;information. Au programme : 3 jours de conférences, des <em>rump sessions</em>, un <em>social event</em>, des geeks, des trolls, du code qui défile, bref une super ambiance. <a href="http://sid.rstack.org/blog/index.php">Plusieurs</a> <a href="http://www.n0secure.org/">personnes</a> ont déjà fait un compte rendu détaillé de chaque conf (qui plus est en temps réel, chapeau à eux !), aussi je ne détaillerai ici que celles que j&rsquo;ai trouvées les plus marquantes. Ce billet est pour le moment incomplet, il sera terminé très prochainement.<span id="more-812"></span></p>
<h3>Enjeux et défis pour le renseignement technique</h3>
<p>La première conférence est présentée par Bernard Barbier, directeur technique de la <a href="http://fr.wikipedia.org/wiki/Direction_g%C3%A9n%C3%A9rale_de_la_s%C3%A9curit%C3%A9_ext%C3%A9rieure">DGSE</a>. Il y présente les activités pratiquées par l&rsquo;agence à l&rsquo;extérieur du territoire français, principalement en matière de renseignement d&rsquo;origine technique, et rappelle les différents enjeux liés à la sécurité des systèmes d&rsquo;information, en particulier les moyens de communication  et la cryptographie. Quelques méthodes techniques d&rsquo;obtention de renseignement sont illustrées, tout en rappelant leur aspect souvent clandestin et les conséquences que cela peut avoir dans certains pays. On y apprend (ou pas) que la DGSE pratique l&rsquo;écoute téléphonique, analyse des photos satellite, utilise des super-calculateurs à des fins de cryptanalyse, et met en œuvre des techniques visant à fragiliser les méthodes de chiffrement lorsque celles-ci ne sont pas cassable en un temps raisonnable. Le tout étant présenté avec une transparence relative mais appréciable, du moins tant qu&rsquo;on ne demande pas de la taille des clés RSA que l&rsquo;agence est en mesure de casser <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . La conf se termine par un message clair : la DGSE recrute 100 personnes par an. Candidats, faites-vous connaître&#8230;</p>
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Keynote par Bernard Barbier, directeur technique de la DGSE" src="http://lh5.ggpht.com/_Rzr3MErwyvk/TBOUhP91uPI/AAAAAAAAFRE/rqeGABYqB3I/s640/IMG_8780.JPG" alt="Keynote par Bernard Barbier, directeur technique de la DGSE" width="448" height="336" /><p class="wp-caption-text">Keynote par Bernard Barbier, directeur technique de la DGSE</p></div>
<h3>CASTAFIOR : Détection automatique de tunnels illégitimes par analyse statistique</h3>
<p>Fabien Allard et Mathieu Morel (Thales) présentent un outil permettant de détecter l&rsquo;utilisation de différents protocoles encapsulés dans du HTTPS. Leur méthode est basée sur un apprentissage utilisant un ensemble d&rsquo;exemples traité en utilisant différentes méthodes de classification, les paramètres étant principalement la longueur des paquets et le temps entre chacun. Leurs expériences montrent que les meilleurs résultats sont obtenus en combinant <a href="http://en.wikipedia.org/wiki/Random_forest">Random Forest</a> et les <a href="http://fr.wikipedia.org/wiki/Mod%C3%A8le_de_Markov_cach%C3%A9">modèles de Markov cachés</a>. Au final, on obtient 96% de bonnes classifications, et aux alentours de 5%.</p>
<h3>virtdbg : un débogueur noyau utilisant la virtualisation matérielle</h3>
<p>Damien Aumaitre et Christophe Devine (<a href="http://esec.fr.sogeti.com/blog/index.php">SOGETI ESEC</a>) dévoilent un debugger au but simple mais ambitieux : pouvoir debugger un système Windows 7 64 bits sans activer le flag /DEBUG, ni désactiver <a href="http://en.wikipedia.org/wiki/Kernel_Patch_Protection">PatchGuard</a>. Deux problèmes : impossible de charger un driver non signé par la méthode classique, ni de patcher l&rsquo;<a href="http://en.wikipedia.org/wiki/Interrupt_descriptor_table#IDT">IDT</a> (PatchGuard l&rsquo;en empêche). Leur technique consiste à utiliser le <a href="http://fr.wikipedia.org/wiki/Acc%C3%A8s_direct_%C3%A0_la_m%C3%A9moire">DMA</a> afin d&rsquo;injecter leur driver comprenant leur hyperviseur. Pour ce faire, ils utilisent un FPGA connecté par PCMCIA sur la machine à debugger, et en USB sur le debugger. L&rsquo;hyperviseur utilise la virtualisation hardware basée sur la technologie <a href="http://en.wikipedia.org/wiki/X86_virtualization#Intel_Virtualization_Technology_for_x86_.28Intel_VT-x.29">Intel  VT-x</a> (à la <a href="http://bluepillproject.org/">BluePill</a>), et permet d&rsquo;intercepter les interruptions 1 et 3. L&rsquo;interface de leur debugger est codée en Python, et dialogue avec l&rsquo;hyperviseur en utilisant le protocole <a href="http://davis.lbl.gov/Manuals/GDB/gdb_31.html">GDB</a>. Le tout avec une démo qui marche, bravo à eux <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Démo de virtdbg par Damien Aumaitre et Christophe Devine" src="http://lh3.ggpht.com/_Rzr3MErwyvk/TBOUiLGfRkI/AAAAAAAAFRI/QCEJbZXqTpY/s640/IMG_8790.JPG" alt="Démo de virtdbg par Damien Aumaitre et Christophe Devine" width="448" height="336" /><p class="wp-caption-text">Démo de virtdbg par Damien Aumaitre et Christophe Devine</p></div>
<h3>Analyse de programme par traçage</h3>
<p>Pour Daniel Reynaud, Jean-Yves Marion et Wadie Guizani, l&rsquo;analyse statique de blob binaire c&rsquo;est bien, mais pas suffisant. Surtout dans le cas de binaires packés par couches. On propose donc un outil libre nommé <a href="http://code.google.com/p/tartetatintools/">TraceSurfer</a> basé sur <a href="http://www.pintool.org/">PIN</a>, permettant de suivre de déroulement d&rsquo;un programme en générant des traces, puis de les importer dans des outils comme <a href="http://www.hex-rays.com/idapro/">IDA Pro</a>. Le résultat est assez sexy ; on peut alors visualiser les instructions effectivement exécutées par le programme, et détecter les éventuelles protections anti-debugging comme les auto-modifications ou contrôles d&rsquo;intégrité. Il est possible de générer des graphes mettant en évidences les différentes couches d&rsquo;un binaire packé. Pour tester sa performance, l&rsquo;outil a été lancé sur un cluster dans le but de détecter des protections anti-VM de plusieurs milliers de malwares obtenus grâce à un honeypot. Les résultats sont assez intéressants, bien que je ne me souvienne plus des chiffres&#8230; À tester !</p>
<div class="wp-caption aligncenter" style="width: 458px"><img title="TraceSurfer en action dans IDA Pro" src="http://lh6.ggpht.com/_Rzr3MErwyvk/TBOUi5QLErI/AAAAAAAAFRQ/p73mEPYc5Mg/s640/IMG_8801.JPG" alt="TraceSurfer en action dans IDA Pro" width="448" height="336" /><p class="wp-caption-text">TraceSurfer en action dans IDA Pro</p></div>
<h3>Intéressez-vous au droit&#8230; avant que le droit ne s&rsquo;intéresse à vous.</h3>
<p>Éric Barbry nous livre un véritable <em>one man show</em> qui contraste fortement avec le caractère technique des conférences précédentes. La France possède toute une série de lois relative aux systèmes d&rsquo;informations, dont certaines difficilement applicables, et en pratique rarement appliquées en intégralité : Informatique et libertés, LSQ, LCEN, HADOPI, LOPPSI, etc. Et pourtant, «nul n&rsquo;est censé ignorer la loi»&#8230; L&rsquo;accent est porté sur la responsabilité, autour de questions concrètes telles que «Qui est le responsable si un employé télécharge illégalement du contenu ou parie en ligne sur des sites non autorisés depuis son bureau ?». Une très bonne intervention qui aura su capter l&rsquo;intérêt de l&rsquo;auditoire tout en traitant d&rsquo;un sujet souvent considéré comme barbant <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Les multiples casquettes du RSSI" src="http://lh6.ggpht.com/_Rzr3MErwyvk/TBOUjZ0h14I/AAAAAAAAFRU/e2cxD2MGMlE/s640/IMG_8802.JPG" alt="Les multiples casquettes du RSSI" width="448" height="336" /><p class="wp-caption-text">Les multiples casquettes du RSSI</p></div>
<h3>Résultats et solution du challenge</h3>
<p>Le lendemain matin, on présente les résultats du <a href="http://communaute.sstic.org/ChallengeSSTIC2010">challenge</a> de cette année, qui en a dérouté plus d&rsquo;un. Les solutions sont en ligne, je vous invite donc à les lire car je doute vraiment être le mieux placé pour les exposer ici&#8230; On a droit à un résumé par Arnaud Ébalard (EADS Innovation Works) dont la solution a été classée 1ère en terme de qualité. En vrac, on notera la récupération des .APK en utilisant les spécificités du format ZIP et un bruteforce sur les pages physiques, une couche crypto ressemblant à du Vigenère, une clé publique dont la seule composante utile était la sous-clé ElGamal, l&rsquo;utilisation de <a href="http://pari.math.u-bordeaux.fr/">PARI/GP</a> pour l&rsquo;attaquer, la décompilation des .DEX avec <a href="http://code.google.com/p/smali/">Baksmali</a>, du reversing de librairie .SO, des énigmes tordues, et un hash Shabal 256 mal utilisé. Un grand bravo à lui ainsi qu&rsquo;à tous ceux qui ont réussi le challenge !</p>
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Mentions spéciales pour le challenge du SSTIC 2010" src="http://lh5.ggpht.com/_Rzr3MErwyvk/TBOUjqE3rtI/AAAAAAAAFRY/oUtNwupLilw/s640/IMG_8806.JPG" alt="Mentions spéciales pour le challenge" width="448" height="336" /><p class="wp-caption-text">Mentions spéciales pour le challenge</p></div>
<h3>Analyse de l&rsquo;efficacité du service fourni par une IOMMU</h3>
<p>Par Éric Lacombe, Fernand Lone Sang, Vincent Nicomette et Yves Deswarte (LAAS/CNRS). Le but d&rsquo;une <a href="http://en.wikipedia.org/wiki/IOMMU">IOMMU</a> est de contrôler les accès à la mémoire par les différents périphériques d&rsquo;entrée/sortie, telle que la MMU vis-à-vis du CPU. Dans le cadre des attaques DMA, une IOMMU traduit les adresses virtuelles demandées par le périphériques en adresses physique en se basant sur deux critères principaux : le source-id identifiant le périphérique, et des tables de traductions internes. La conférence présente deux attaques visant chacun de ces critères : la reconfiguration des tables et le spoofing de source-id. La deuxième attaque est mise en œuvre en utilisant un pont PCI &#8211; PCI Express, fréquent surtout pour les machines anciennes. Un tel pont permet de connecter des devices PCI sur l&rsquo;interface PCI Express ; le problème étant que tous les devices PCI rattachés partagent alors le même source-id. Une démo faisant intervenir un iPod malveillant et une carte réseau connecté sur un tel pont montre comment il est possible de déclencher une attaque d&rsquo;ARP Cache Poisonning. Les paquets ARP étant injectés par l&rsquo;iPod dans les buffers de réception gérés par les drivers de la carte réseau, l&rsquo;attaquant n&rsquo;a plus besoin d&rsquo;envoyer de trames. On a ainsi droit à un hijacking en live d&rsquo;un épisode de The Big Bang Theory regardé en streaming <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Quelques éléments en matière de sécurité des cartes réseau</h3>
<p>Par Guillaume Valadon, Loic Duflot, Olivier Levillain et Yves-Alexis Perez (ANSSI). Cette excellente conférence revient sur l&rsquo;exploitation d&rsquo;une <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-0104">vulnérabilité</a> des cartes réseau Broadcom, patchée depuis. On y apprend avec stupéfaction (du moins pour ma part !) qu&rsquo;une carte réseau est très loin d&rsquo;être un élément &laquo;&nbsp;simple&nbsp;&raquo;. En effet, celle-ci possède un firmware qu&rsquo;il est possible de flasher temporairement, qui gère certains protocoles de façon automatique et ce sans que le CPU en ait conscience ! Ainsi, ces carte réseau comportent leur propre pile IP et est même capable de gérer des messages SOAP&#8230; Le problème, c&rsquo;est que celles-ci sont parfois implémentées sans notion de sécurité. Ici en l&rsquo;occurrence, les auteurs mettent en évidence un buffer overflow touchant le champ &laquo;&nbsp;username&nbsp;&raquo; du protocole <a href="http://en.wikipedia.org/wiki/Alert_Standard_Format">ASF</a>,  utilisé pour le management et le monitoring. Pour être en mesure de l&rsquo;exploiter, ils ont du coder un debugger de carte réseau, en utilisant le fait que les registres de la carte sont mappés en mémoire, et que celle-ci possède des options de debug (mode single-step, breakpoint&#8230;). En live, ils exploitent la vulnérabilité et montrent comment déclencher un remote root shell en envoyant un message ICMP. Vraiment bluffant&#8230;</p>
<p style="text-align: left;">
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Exploitation de buffer overflow dans le firmware d'une carte réseau" src="http://lh5.ggpht.com/_Rzr3MErwyvk/TBOUmMplNsI/AAAAAAAAFRo/XmpPSp3IucQ/s640/IMG_8820.JPG" alt="Exploitation de buffer overflow dans le firmware d'une carte réseau" width="448" height="336" /><p class="wp-caption-text">Exploitation de buffer overflow dans le firmware d&#39;une carte réseau</p></div>
<h3>Applications Facebook : Quels Risques pour l&rsquo;Entreprise ?</h3>
<p>Alban Ondrejeck, Francois-Xavier Bru et Guillaume Fahrner montrent les résultats d&rsquo;une expérience intéressante visant à mettre à l&rsquo;épreuve le (non) contrôle des applications Facebook. Sous le couvert d&rsquo;une application &laquo;&nbsp;Who crashed you?&nbsp;&raquo; codée maison et a priori &laquo;&nbsp;utile&nbsp;&raquo;, ils récoltent des informations personnelles sur les utilisateurs l&rsquo;ayant installé, et exploitent le caractère viral du réseau social. En créant une vingtaine de profils fictifs et en ajoutant divers personnes comme amies, ils parviennent très rapidement à répandre l&rsquo;application et à collecter des informations sur tous leurs utilisateurs (dommage, je n&rsquo;ai pas noté les chiffres). Cela montre une absence de contrôle concernant les permissions de telles applis.</p>
<h3>Projet OpenBSC</h3>
<p>Harald Welte part d&rsquo;un constat simple : les protocoles GSM et 3G sont documentés publiquement, mais les études de sécurité à ce sujet sont très peu nombreuses, du fait que l&rsquo;industrie de la téléphonie est un monde très fermé (coût très élevé du hardware, notamment). Et pourtant, ces protocoles sont beaucoup plus répandus que ce que l&rsquo;on pourrait croire. Comme le dit si bien l&rsquo;orateur, «GSM is more than phone calls» : ce protocole est utilisé non seulement par les téléphones, mais aussi par certaines voitures, trains, systèmes d&rsquo;alarmes, distributeurs, etc. Après avoir exposé rapidement l&rsquo;architecture d&rsquo;un réseau GSM, l&rsquo;auteur introduit le projet <a href="http://openbsc.osmocom.org/trac/">OpenBSC</a>, qui vise à fournir les éléments nécessaires à la réalisation de son propre réseau GSM. Une sorte d&rsquo;Asterisk pour le GSM, en gros&#8230; Les différents problèmes de sécurité du GSM sont rapidement abordés : pas d&rsquo;authentification entre le téléphone et le réseau, chiffrement faible, optionnel et non explicite (rien ne permet à un utilisateur de savoir si ses communications sont véritablement chiffrées), dénis de service possibles, géolocalisation&#8230; N&rsquo;ayant jamais étudié ces protocoles, je suis loin d&rsquo;avoir tout saisis, mais la conférence était très intéressante et incite à en savoir plus.</p>
<p style="text-align: center;">
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Architecture d'un réseau GSM" src="http://lh4.ggpht.com/_Rzr3MErwyvk/TBOUn2WB6GI/AAAAAAAAFR0/aE1cbJAa3Wk/s640/IMG_8833.JPG" alt="Architecture d'un réseau GSM" width="448" height="336" /><p class="wp-caption-text">Architecture d&#39;un réseau GSM</p></div>
<h3>Rumps sessions</h3>
<p>Pour les néophytes du SSTIC, les <em>rumps sessions</em> sont des mini exposés de 4 ou 5 minutes présentables par n&rsquo;importe qui et sur n&rsquo;importe quel sujet, lié de près ou de loin à la sécurité. Je n&rsquo;ai pas tout noté (pas comme <a href="http://sid.rstack.org/blog/index.php/411-en-direct-du-sstic-le-retour">Sid</a>), donc voici en vrac quelques une d&rsquo;entre elles :</p>
<ul>
<li><em>Kesske SSTIC</em>, qui dévoile pas mal de chiffres sur l&rsquo;édition 2010 du SSTIC. Pour ne citer que le minimum : 450 places écoulées en 25 heures, près de 2/3 du budget passe dans la bouffe (social event et resto universitaire), et un taux d&rsquo;acceptation de 60% pour les soumissions de papier.</li>
<li><em>Timing attack sur machine à café</em>, ou comment exploiter une vulnérabilité de machine à café pour gagner de la fidélité sur sa carte, et donc des café gratuits. Le principe est simple : retirer la carte après que la machine ait incrémenté la fidélité, et avant le débit <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><em><a href="http://www.netglub.org/">Netglub</a></em>, où on a le droit à une super démo d&rsquo;un outil Maltego-like en C++/Qt et &laquo;&nbsp;vraiment OpenSource&nbsp;&raquo; permettant de faire de la recherche d&rsquo;information. Vraiment sympa, j&rsquo;ai hâte que ça sorte.</li>
<li>Deux projets qui vont bientôt sortir : le moteur de recherche de vulnérabilités QSWX et son spider Bubulle, et SecurityGarden, une sorte de PaketStorm en mieux.</li>
<li><em><a href="http://www.decalage.info/exefilter">ExeFilter</a> contre les méchants PDF</em> : outil de nettoyage de fichiers, utilisable pour désactiver les contenus malveillants dans un PDF et accessoirement se protéger des 0-days potentiels.</li>
<li><em><a href="http://boss.gipsa-lab.grenoble-inp.fr/Warming/">BOSS</a> : Break Our Steganography System</em>, un challenge de stégano débutant à la fin du mois.</li>
<li><em>Scapytain</em> : Philipe Biondi expose de façon inédite un outil de gestion de campagne de tests basé sur <a href="http://www.secdev.org/projects/scapy/">Scapy</a>.</li>
</ul>
<p style="text-align: center;">
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Présentation de Scapytain sous GIMP" src="http://lh5.ggpht.com/_Rzr3MErwyvk/TBOUoSRcf1I/AAAAAAAAFR4/gMaPQEygi1o/s640/IMG_8836.JPG" alt="Présentation de Scapytain sous GIMP" width="448" height="336" /><p class="wp-caption-text">Présentation de Scapytain sous GIMP</p></div>
<h3>JBOSS AS: Exploitation et sécurisation</h3>
<p>Renaud Dubourguais (HSC) présente un état de l&rsquo;art des vulnérabilités touchant le middleware JBOSS AS, démos à l&rsquo;appui. Dès le début, c&rsquo;est très clair : il n&rsquo;y a pas de mécanismes de sécurité par défaut. Autrement dit, il y a de quoi faire&#8230; Console d&rsquo;administration JMX accessible sans authentification (ou avec admin/admin), déploiement de backdoor sous forme d&rsquo;application SAR, utilisation du protocole RMI, accès à la web console&#8230; Des mécanismes de sécurité existent (JBOSS SX, sandboxing) mais sont rarement implémentés en pratique. Une conférence très intéressante qui donne envie d&rsquo;auditer du JBOSS&#8230;</p>
<h3>Audit d&rsquo;applications .NET complexes</h3>
<p>Nicolas Ruff (EADS) dresse un état de l&rsquo;art des techniques de reversing de code .NET permettant d&rsquo;auditer les applications Microsoft. Une fois compilé, le bytecode .NET conserve la sémantique du code source, et il est possible de le décompiler avec des softs adaptés comme l&rsquo;excellent <a href="http://www.red-gate.com/products/reflector/">Reflector</a>, et d&rsquo;utiliser l&rsquo;API de reflexion pour récupérer de nombreuses informations. La compilation de ce bytecode en langage machine peut se réaliser à la volée (Just In Time) ou bien sous forme de DLL dans le Global Assembly Cache, que l&rsquo;on peut également analyser avec des outils comme IDA. J&rsquo;y apprend également que Windbg supporte le debugging d&rsquo;applications .NET avec l&rsquo;extension <a href="http://msdn.microsoft.com/en-us/library/bb190764.aspx">SOS</a> accessible par la commande <code>.loadby sos mscorwks</code>. Démonstration pratique avec Songsmith, et hop.</p>
<h3>PoC(k)ET, les détails d&rsquo;un rootkit pour Windows Mobile 6</h3>
<p>Cédric Halbronn expose les spécificités de l&rsquo;implémentation d&rsquo;un rootkit pour smartphone Windows Mobile 6. Ce genre de plateforme impose certaines contraintes, principalement la quantité de mémoire et la consommation de la batterie. Cependant comme le dit si bien l&rsquo;auteur, le modèle de sécurité de Windows Mobile est très permissif. Les applications doivent être signées pour pouvoir s&rsquo;installer&#8230; mais cette restriction est implémentée par le simple affichage d&rsquo;un message d&rsquo;avertissement. D&rsquo;autre part, il est possible d&rsquo;installer facilement un certificat dans le magasin de certificats privilégiés du téléphone, qui est invisible et inaccessible pour l&rsquo;utilisateur. Il est alors facile de mettre en place un système de download &amp; execute furtif. En outre, le passage en mode noyau se fait on ne peut plus simplement, grâce à l&rsquo;appel à l&rsquo;API SetKMode() ! Il devient alors possible de hooker le driver baseband gérant les commandes AT, la saisie du code PIN (qui transite en clair entre le baseband et le CPU), les SMS&#8230; L&rsquo;injection de DLL est aussi possible, donc camoufler des fichiers peut se faire de la façon habituelle avec un hook des API FindFirstFile() etc. Le rootkit exposé ici est injecté par WAP Push, est contrôlable par une interface graphique, et n&rsquo;est pas détecté par les anti-virus, qui d&rsquo;après l&rsquo;auteur «ne détectent qu&rsquo;entre 5 et 10 virus»&#8230; Une question est posée : «Comment se protège-t-on alors ?». La réponse est claire : «On ne prend pas Windows Mobile» <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: center;">
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Interface d'admin d'un rootkit Windows Mobile" src="http://lh4.ggpht.com/_Rzr3MErwyvk/TBOUpXCnUoI/AAAAAAAAFSA/gPzw4GpZWlU/s640/IMG_8842.JPG" alt="Interface d'admin du rootkit" width="448" height="336" /><p class="wp-caption-text">Interface d&#39;admin du rootkit</p></div>
<h3>Projet OsmocomBB</h3>
<p>Harald Welte nous parle maintenant du projet OsmocomBB, visant cette fois-ci à fournir un baseband OpenSource pour téléphone mobile. J&rsquo;ai été un peu largué, mais la démo super visuelle et intéressante a retenue mon attention. Il s&rsquo;agissait de sniffer les communications GSM avec un mobile Motorola (coutant aux alentours de 15€) connecté à un laptop, puis et de les rendre affichables dans Wireshark (sans les déchiffrer). Le tout dans un amphi plongé dans le noir et illuminé par le code défilant à l&rsquo;écran&#8230; Comme le disaient certains, «Le SSTIC revient aux sources» !</p>
<p style="text-align: left;">
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Wieshark sniffant du GSM" src="http://lh5.ggpht.com/_Rzr3MErwyvk/TBOUqbE8e8I/AAAAAAAAFSE/enTQJI5gTbs/s640/IMG_8848.JPG" alt="Wieshark sniffant du GSM" width="448" height="336" /><p class="wp-caption-text">Wieshark sniffant du GSM</p></div>
<h3 style="text-align: left;">Conclusion</h3>
<p style="text-align: left;">Comme je le disais en intro, j&rsquo;ai volontairement omis quelques conférences (notamment celle de clôture), principalement car car la mémoire me fait défaut, ou bien parce que j&rsquo;estime que des bien meilleurs résumés ont été fait avant moi&#8230;</p>
<p style="text-align: left;">Globalement les conférences étaient d&rsquo;excellente qualité. Mes coups de cœur restent les interventions techniques, (virtdbg, l&rsquo;IOMMU, la sécurité des cartes réseau, JBOSS, le reversing d&rsquo;applis .NET, PoC(k)ET, GSM&#8230;) même si les autres ne manquaient pas de qualité. Concernant la conférence sur OPA que je n&rsquo;ai pas mentionnée ici, je suis assez d&rsquo;accord avec ce qu&rsquo;a exposé Sid sur son <a href="http://sid.rstack.org/blog/index.php/412-en-direct-du-sstic-la-revanche">blog</a>. Son contenu aurait pu être beaucoup plus intéressant, dommage qu&rsquo;elle visait le mauvais public&#8230;</p>
<p style="text-align: left;">En tout cas, chapeau aux comités d&rsquo;organisation et de programme ! J&rsquo;espère pouvoir revenir l&rsquo;année prochaine. En attendant, rendez-vous à la <a href="http://www.nuitduhack.com/">Nuit Du Hack</a> le week-end prochain <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: left;">Mes photos sont disponibles sur ma <a href="http://picasaweb.google.com/emilien.girault/SSTIC2010#">galerie Picasa</a>.</p>
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/securite-informatique/sstic-2010/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Résumé partiel des DC18 CTF Quals</title>
		<link>https://www.segmentationfault.fr/securite-informatique/resume-dc18-ctf-quals/</link>
		<comments>https://www.segmentationfault.fr/securite-informatique/resume-dc18-ctf-quals/#comments</comments>
		<pubDate>Mon, 24 May 2010 19:29:25 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[challenge]]></category>
		<category><![CDATA[Cryptographie]]></category>
		<category><![CDATA[hacking]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=796</guid>
		<description><![CDATA[Contrairement à ce que certains pensent peut-être en voyant ce blog à l&#8217;abandon depuis plusieurs mois, non, je ne suis pas mort ! J&#8217;ai simplement été assez pris ces derniers temps, et j&#8217;essaye au passage de finaliser ma première release de XeeK pour la NDH le 19 juin&#8230; Ce week-end, j&#8217;ai rapidement participé aux qualifications [...]]]></description>
			<content:encoded><![CDATA[<p>Contrairement à ce que certains pensent peut-être en voyant ce blog à l&rsquo;abandon depuis plusieurs mois, non, je ne suis pas mort ! J&rsquo;ai simplement été assez pris ces derniers temps, et j&rsquo;essaye au passage de finaliser ma première release de <a href="http://www.segmentationfault.fr/projets/conference-sur-xeek-a-la-ndh-2010/">XeeK</a> pour la <a href="http://www.nuitduhack.com">NDH</a> le 19 juin&#8230;</p>
<p>Ce week-end, j&rsquo;ai rapidement participé aux qualifications du CTF de la <a href="http://www.defcon.org/">DefCon</a> 18. Je n&rsquo;avais pas refait de challenge depuis <a href="http://www.segmentationfault.fr/securite-informatique/insomnihack2010-hzv-won/">Insomni&rsquo;hack 2010</a> donc je me suis senti obligé de me décrasser un peu le cerveau. Ma participation à ces qualifications est toutefois restée limitée ; n&rsquo;ayant pas pu m&rsquo;inscrire à temps j&rsquo;ai du rejoindre une team à l&rsquo;arrache (Big-Daddy).<span id="more-796"></span></p>
<h3>Vue d&rsquo;ensemble</h3>
<p>Le challenge consistait en 6 séries de 5 épreuves, chacune intitulée de la sorte :</p>
<ul>
<li>Poursuit trivial (épreuves générales)</li>
<li>Crypto Badness (cryptographie)</li>
<li>Packet Madness (réseau)</li>
<li>Binary L33tness (cracking, applicatif)</li>
<li>Pwtent Pwnables (exploitations de services)</li>
<li>Forensics (analyse de fichiers)</li>
</ul>
<p>N&rsquo;ayant pas énormément de temps à consacrer à ce challenge, je n&rsquo;ai pas vraiment touché à tout mais me suis focalisé sur la crypto et le réseau.</p>
<p>Dans l&rsquo;ensemble j&rsquo;ai trouvé ça plutôt sympa, même si j&rsquo;ai quand même deux remarques négatives à faire :</p>
<ul>
<li>L&rsquo;interface du panneau d&rsquo;équipe codée en Java était vraiment plus que foireuse. Je ne sais pas si c&rsquo;était du au fait qu&rsquo;on soit plusieurs à partager le même compte, mais il fallait bouriner comme un dingue sur le bouton de validation afin d&rsquo;avoir un espoir de valider les réponses (valides), voire même parfois se reconnecter.</li>
<li>Certaines épreuves étaient relativement <a href="http://www.dico-des-mots.com/definitions/capilotracter.html">capilotractées</a>, dans le sens ou elles n&rsquo;étaient pas réalistes du tout et qu&rsquo;il fallait être à peu près aussi dingue que leur concepteur pour la valider. Enfin je pense que ça doit être à peu près pareil sur tous les challenges du genre&#8230;</li>
</ul>
<p>Étant loin d&rsquo;avoir réussi à valider toutes les épreuves, je vous propose de dévoiler la solution de deux d&rsquo;entre elles que j&rsquo;ai trouvées assez sympathiques.</p>
<h3>Packet Madness 200</h3>
<p>Dans cette épreuve, on fournissait une <a href="http://www.segmentationfault.fr/wp-content/uploads/2010/05/Copie-de-pkt200_55216efa7a182fb0.pcap_.txt">capture de paquets</a> (à renommer en .pcap), le but étant comme toutes les autres épreuves de trouver une passphrase de validation.</p>
<p>Sous Wireshark, on constate qu&rsquo;il s&rsquo;agit d&rsquo;un trafic TCP entre un client et un serveur. En utilisant l&rsquo;option &laquo;&nbsp;Follow TCP Stream&nbsp;&raquo;, on constate qu&rsquo;il semble s&rsquo;agir de trafic binaire&#8230;</p>
<div id="attachment_799" class="wp-caption aligncenter" style="width: 496px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2010/05/pkt200_1.png"><img class="size-full wp-image-799" title="pkt200_1" src="http://www.segmentationfault.fr/wp-content/uploads/2010/05/pkt200_1.png" alt="" width="486" height="246" /></a><p class="wp-caption-text">Capture Wireshark</p></div>
<p style="text-align: left;">Cependant, l&rsquo;indice laissé par l&rsquo;épreuve suggère que les deux machines communiquent avec une &laquo;&nbsp;langue&nbsp;&raquo; inhabituelle. S&rsquo;agirait-il d&rsquo;un encodage connu mais peu courant ? En regardant un peu les encodages supportés par Wireshark, on s&rsquo;aperçoit rapidement qu&rsquo;ils &lsquo;agit en fait de l&rsquo;<a href="http://fr.wikipedia.org/wiki/Extended_Binary_Coded_Decimal_Interchange_Code">EBCDIC</a>, encodage créé par IBM qui semble remonter à l&rsquo;époque quasi-préhistorique des cartes perforées&#8230; En utilisant cet encodage, on y voit tout de suite plus clair :</p>
<div id="attachment_800" class="wp-caption aligncenter" style="width: 647px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2010/05/pkt200_2.png"><img class="size-full wp-image-800" title="pkt200_2" src="http://www.segmentationfault.fr/wp-content/uploads/2010/05/pkt200_2.png" alt="Trafic décodé" width="637" height="293" /></a><p class="wp-caption-text">Trafic décodé</p></div>
<p style="text-align: left;">Il s&rsquo;agit donc d&rsquo;une sorte de telnet encodé en EBCDIC. Visiblement, le serveur propose plusieurs options, comme la création d&rsquo;un compte, l&rsquo;authentification, un mode maintenance et un affichage de news. L&rsquo;IP du serveur visible dans le dump, 192.42.96.121, existe bel et bien et héberge bien ce service sur le port 8686. Il semble donc que la réponse à l&rsquo;épreuve doive être obtenue en s&rsquo;y connectant. Malheureusement les outils classiques comme telnet et netcat ne supportent pas l&rsquo;EBCDIC. Mais c&rsquo;est sans compter Python, qui le supporte nativement, et qui va ainsi nous permettre de se coder un petit client maison :</p>
<pre style="text-align: left;">#!/usr/bin/python

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.41.96.121", 8686))

while True:
 data = s.recv(3000)
 print data.decode('EBCDIC-CP-BE').encode('ascii')

 input = raw_input()
 input_to_send = input.decode('ascii').encode('EBCDIC-CP-BE')+"%"
 s.send(input_to_send)</pre>
<p style="text-align: left;">Ce client permet d&rsquo;envoyer des commandes au service tout en affichant ses réponses. Toutefois, j&rsquo;ai constaté qu&rsquo;il était toujours en retard d&rsquo;un message par rapport au serveur. N&rsquo;ayant pas le temps d&rsquo;être perfectionniste, je m&rsquo;en suis contenté et ai pu me créer un compte sur le serveur avec la commande &laquo;&nbsp;a&nbsp;&raquo;, puis me loguer avec ce même compte (&laquo;&nbsp;l&nbsp;&raquo;). Le mode administrateur &laquo;&nbsp;m&nbsp;&raquo; ne fonctionnant pas, il ne restait que l&rsquo;affichage des news (&laquo;&nbsp;n&nbsp;&raquo;), qui donnait cette sortie :</p>
<pre>5/21/2010 - Defcon qualifiers are underway.

5/18/2010 - It's Bob Randolph's birthday today, wish him well
 if you see him

5/16/2010 - It's IBM old timer's night at the bowling alley.
 The key thing to remember at these things is that:
 once upon a time IBM ruled the world

4/29/2001 - First post! w00t!</pre>
<p>La news du 16 mai 2010 m&rsquo;interpelle du fait de la présence du mot &laquo;&nbsp;key&nbsp;&raquo;&#8230; Nous testons donc la réponse &laquo;&nbsp;<em>once upon a time IBM ruled the world</em>&nbsp;&raquo; à l&rsquo;épreuve, et après un léger acharnement collectif sur le team board, nous parvenons à valider ! Finalement, ce n&rsquo;était pas compliqué&#8230;</p>
<h3>Crypto Badness 400</h3>
<p>Dans cette épreuve épinglée de l&rsquo;indice &laquo;&nbsp;crack me&nbsp;&raquo;, on fournit une <a href="http://www.segmentationfault.fr/wp-content/uploads/2010/05/c400_95bcb7c5807a366d.tgz_.txt">archive tgz</a> (encore une fois à renommer). Celle-ci contient un fichier blob.dat visiblement chiffré et une clé publique pubkey.pem. Il s&rsquo;agit donc visiblement de casser la <a href="http://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique">clé publique</a> afin de retrouver la clé privée et déchiffrer le fichier .dat. Voici la clé publique :</p>
<pre>-----BEGIN RSA PUBLIC KEY-----
MGgCYQDK2YRVfJfgOUMaImrXJ/DG1D7z1BhGnxs3UEmyKYQ+6fg7H5dzisJ09fYf
QB8h8ZE+S2S7MbVaONOYwN/tALE5LwiJcRxEs1nnl2xhf8xzTwbj6VwmR2CRtS9G
LnlBPbUCAwEAAQ==
-----END RSA PUBLIC KEY-----</pre>
<p>Il s&rsquo;agit d&rsquo;une clé <a href="http://en.wikipedia.org/wiki/RSA">RSA</a>. Pour analyser ce genre de clé, l&rsquo;outil tout indiqué est <a href="http://www.openssl.org/">OpenSSL</a>. Cependant, une mauvaise surprise nous attend&#8230;</p>
<pre>$ openssl rsa -pubin -in pubkey.pem -text
unable to load Public Key
20934:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:647:Expecting: PUBLIC KEY</pre>
<p>Impossible de lire la clé avec cet outil, donc. Un peu de recherche Google, et je trouve <a href="http://barelyenough.org/blog/2008/04/fun-with-public-keys/">quelqu&rsquo;un</a> qui a eu le même problème :</p>
<blockquote><p>The problem is this an RSA public key PEM or <a href="http://en.wikipedia.org/wiki/Distinguished_Encoding_Rules">DER</a> generated by Ruby’s <a href="http://ruby-doc.org/stdlib/libdoc/openssl/rdoc/index.html"><code>OpenSSL::PKey::RSA</code></a> are unreadable by <a href="http://www.openssl.org/">OpenSSL</a>, <a href="http://www.bouncycastle.org/">Bouncy Castle</a> and probably other  crypto tools.</p>
<p>The actual issue is that Ruby’s <code>OpenSSL::PKey::RSA#to_pem</code> and <code>#to_der</code> generate a <a href="http://tools.ietf.org/html/rfc3447#appendix-A.1.1">PKCS#1 public  key format</a> while the <code>openssl rsa</code> command only works <a href="http://en.wikipedia.org/wiki/PKCS">PKCS#8</a> formatted public keys.</p></blockquote>
<p>Ainsi, la clé semble avoir été générée avec le module OpenSSL de Ruby, et son format PKCS#1 empêche sa lecture avec OpenSSL. Qu&rsquo;à cela ne tienne, nous allons utiliser ce même module pour la lire ! On ouvre le shell Ruby (IRB) et on tape :</p>
<pre>$ irb
irb(main):001:0&gt; require 'openssl'
=&gt; true
irb(main):002:0&gt; a=OpenSSL::PKey::RSA.new(File.read("pubkey.pem"))
=&gt; -----BEGIN RSA PUBLIC KEY-----
MGgCYQDK2YRVfJfgOUMaImrXJ/DG1D7z1BhGnxs3UEmyKYQ+6fg7H5dzisJ09fYf
QB8h8ZE+S2S7MbVaONOYwN/tALE5LwiJcRxEs1nnl2xhf8xzTwbj6VwmR2CRtS9G
LnlBPbUCAwEAAQ==
-----END RSA PUBLIC KEY-----

irb(main):003:0&gt; a.params
=&gt; {"dmq1"=&gt;0, "dmp1"=&gt;0, "iqmp"=&gt;0, "n"=&gt;12301866845301177551304949
58384962720772853569595334792197322452151726400507263657518745202199
78646938995647494277406384592519255732630345373154826850791702612214
29134616704292143116022212404792747377940806653514195974598569021434
13, "d"=&gt;0, "p"=&gt;0, "e"=&gt;65537, "q"=&gt;0}</pre>
<p>On arrive ainsi à extraire le module (n) et l&rsquo;exposant public (e). Ce dernier étant quasiment toujours le même, seul le module importe ici. Pour savoir si nous avons une chance de le casser, regardons sa taille en bits :</p>
<pre>$ python
&gt;&gt;&gt; import math
&gt;&gt;&gt; n=12301866845301177551304949583849627207728535695953347921973224
52151726400507263657518745202199786469389956474942774063845925192557
32630345373154826850791702612214291346167042921431160222124047927473
7794080665351419597459856902143413
&gt;&gt;&gt; math.log(n, 2)
767.66426718447133</pre>
<p>Il semble codé sur 768 bits&#8230; Cela ne vous rappelle rien ? Le nombre <a href="http://en.wikipedia.org/wiki/RSA_numbers#RSA-768">RSA-768</a> a été cassé en décembre dernier. Et comme par hasard, c&rsquo;est bien le même qui est utilisé ici&#8230; Nous allons donc pouvoir utiliser sa factorisation pour générer la clé privée correspondante. Par chance, <a href="http://blog.stalkr.net/">StalkR</a> de la team <a href="http://nibbles.tuxfamily.org">Nibbles</a> a posté un <a href="http://nibbles.tuxfamily.org/?p=1040">article très similaire</a> issu du CTF <a href="http://www.codegate.org/Eng/">Codegate</a> il y a quelques mois. Il y indique la procédure à suivre pour générer le certificat, qui pour simplifier se résume à télécharger un <a href="http://stalkr.net/files/codegate/2010/7/e_os.h">en-tete d&rsquo;OpenSSL</a> ainsi qu&rsquo;un <a href="http://stalkr.net/files/codegate/2010/7/create_private.c">programme C</a> servant à générer la clé. On lance tout ça :</p>
<pre>$ gcc -lssl -o create_private create_private.c
$ ./create_private</pre>
<p>La clé privée est générée dans le fichier private.pem. Il ne reste alors plus qu&rsquo;à décrypter le fichier blob.dat en utilisant la commande :</p>
<pre>$ openssl rsautl -decrypt -inkey private.pem -in blob.dat -out output.txt</pre>
<p>Moment de vérité&#8230;</p>
<pre>$ cat output.txt
how long until 1024 falls by the wayside?</pre>
<p>Il s&rsquo;agit bien de la réponse à l&rsquo;épreuve (validée encore une fois grâce à un acharnement collectif).</p>
<p>Comme l&rsquo;épreuve précédente, ce n&rsquo;était techniquement pas compliqué, l&rsquo;obstacle majeur étant la non-reconnaissance de la clé par OpenSSL&#8230; En tout cas merci à StalkR pour son article qui a été d&rsquo;une grande aide.</p>
<h3>Conclusion</h3>
<p>Ces épreuves ont été l&rsquo;occasion pour moi de me remettre un peu dans le bain des CTFs. Le niveau était globalement assez élevé (plus dur que l&rsquo;année dernière à en croire certains), et nous n&rsquo;avons réussi à valider que quelques épreuves; les résultats sont disponibles <a href="http://www.ddtek.biz/qualsDC18scores.txt">ici</a>. Pour ceux que ça intéresse, vous trouverez le résultat de la dernière épreuve du Poursuit trivial <a href="http://scott.wolchok.org/t500.html">ici</a>.</p>
<p>Chapeau à Nibbles pour avoir terminé 10ème ; un grand bravo à eux. Et merci à tous ceux avec qui j&rsquo;ai challengé, en particulier à <a href="http://silkcut.wordpress.com/">Silkut</a>, MatToufoutu, et Dad. En espérant que nous parviendrons à créer une équipe HZV l&rsquo;année prochaine, du moins si nous avons plus de temps et de ressources&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/securite-informatique/resume-dc18-ctf-quals/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Conférence sur XeeK à la NDH 2010</title>
		<link>https://www.segmentationfault.fr/projets/conference-sur-xeek-a-la-ndh-2010/</link>
		<comments>https://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&rsquo;ai repris le développement de <a href="http://www.segmentationfault.fr/projets/xeek-framework-exploitation-xss/">XeeK</a>, un projet de framework d&rsquo;exploitation de faille XSS. J&rsquo;ai déjà présenté une ébauche de ce projet à la Nuit Du Hack 2009, que j&rsquo;ai stoppé entre temps, faute de temps (oui, je sais, c&rsquo;est mal). Mais rassurez-vous : début janvier, je me suis remis en tête de reprendre ce projet et d&rsquo;en publier une version stable à la NDH 2010. En attendant la mise en place d&rsquo;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&rsquo;un mois. J&rsquo;ai profité de l&rsquo;expérience de mes collègues pour faire une petit brainstorm sur l&rsquo;é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&rsquo;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&rsquo;ai préféré m&rsquo;inspirer de ces outils afin d&rsquo;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&rsquo;évoluer dans les mois à venir)</p>
<ul>
<li>L&rsquo;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&rsquo;exploits : suite d&rsquo;instructions qui s&rsquo;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&rsquo;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&rsquo;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&rsquo;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&rsquo;hésitez pas <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>https://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>https://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-georges-hotz/</link>
		<comments>https://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&rsquo;é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&rsquo;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&rsquo;<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&rsquo;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&rsquo;est pas réservé aux VIP. Nous recherchons d&rsquo;ailleurs activement des volontaires souhaitant présenter leurs travaux pour des conférences d&rsquo;une trentaine de minutes. Si vous êtes intéressés, n&rsquo;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&rsquo;année dernière, l&rsquo;é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&rsquo;accueillir pas moins de 400 participants.</p>
<h3>Do you speak English?</h3>
<p>Jusqu&rsquo;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&rsquo;événement accessible à nos amis anglophones venant de toute l&rsquo;Europe, des États-Unis, et partout ailleurs. Certaines conférences seront données en Anglais, d&rsquo;autres en Français.</p>
<h3>Ateliers</h3>
<p>A l&rsquo;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&rsquo;outils tels que Metasploit, Maltego, etc), n&rsquo;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&rsquo;année dernière, le challenge sera un &laquo;&nbsp;Capture The Flag&nbsp;&raquo;. Pour les néophytes, il s&rsquo;agit d&rsquo;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&rsquo;adversaire. Le staff disposera en parallèle d&rsquo;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&rsquo;ayant que peu d&rsquo;expérience en pentesting, nous mettrons à disposition de tous un challenge ouvert. Il s&rsquo;agira d&rsquo;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&rsquo;infos</h3>
<p>Pour vous inscrire ou pour toute information complémentaire, n&rsquo;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&rsquo;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>https://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>https://www.segmentationfault.fr/securite-informatique/insomnihack2010-hzv-won/</link>
		<comments>https://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&rsquo;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&rsquo;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&rsquo;entre-aidaient. Le but était simple : valider un maximum d&rsquo;épreuves avant 1h du matin. Au final, c&rsquo;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&rsquo;épreuves, chacune étant d&rsquo;un type différent. Décidés à en valider un maximum, nous nous sommes répartis le travail entre tous les membres de l&rsquo;équipe, en centralisant les solutions. Et c&rsquo;est moi qui me suis retrouvé désigné comme étant la personne en charge de tout valider <img src='https://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&rsquo;é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&rsquo;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&rsquo;agissait de décrypter un fichier chiffré avec l&rsquo;algorithme <a href="http://fr.wikipedia.org/wiki/One_Time_Pad" target="_blank">One Time Pad</a>, sachant que l&rsquo;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&rsquo;un header qui n&rsquo;était autre que la concaténation de l&rsquo;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&rsquo;outil RSA Tool 2, permettant non seulement de factoriser N mais aussi de retrouver l&rsquo;exposant privé (d). Une fois d obtenu, il suffisait d&rsquo;utiliser l&rsquo;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&rsquo;il y avait du <a href="http://fr.wikipedia.org/wiki/Bit_de_poids_faible" target="_blank">LSB</a> dans l&rsquo;air, mais nous n&rsquo;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&rsquo;il était physiquement impossible d&rsquo;atteindre un tel score, à moins d&rsquo;ê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&rsquo;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&rsquo;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&rsquo;absolu c&rsquo;est théoriquement envisageable, cela reste quand même assez incertain. Il fallait donc remarquer que l&rsquo;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&rsquo;épreuve.</p>
<h3>Failles applicatives</h3>
<p>La série d&rsquo;épreuve nommée  &laquo;&nbsp;Exploitation&nbsp;&raquo; consistait à télécharger une VM Linux et à exploiter les différentes failles qui s&rsquo;y trouvaient. Il s&rsquo;agissait d&rsquo;une série de binaires SUID comportant différentes failles applicatives. La première n&rsquo;était autre qu&rsquo;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&rsquo;é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&rsquo;exploitait en forgeant le paramètre d&rsquo;entrée de telle sorte à ce qu&rsquo;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&rsquo;on oublie ce genre de détail <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Le staff a d&rsquo;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&rsquo;il s&rsquo;agit de moi, je tiens vraiment à rappeler que le véritable vainqueur du challenge n&rsquo;est pas moi, mais bien l&rsquo;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&rsquo;é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&rsquo;hack, ainsi qu&rsquo;un sympathique routeur firewall Fortinet. Bref, de quoi s&rsquo;amuser un peu à Sysdream <img src='https://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&rsquo;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&rsquo;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&rsquo;outil pot de peinture appliqué (réglé avec un seuil nul) sur des zones aléatoires de l&rsquo;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&rsquo;est toujours le cas en ASCII (non étendu). Le LSB se confirmait de plus en plus&#8230; Ayant Python sous la main, j&rsquo;ai codé un petit tool permettant de parser l&rsquo;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&rsquo;Alice au Pays des Merveilles&#8230; Maintenant, Crashfr et Fluxius peuvent dormir tranquille sans être hantés <img src='https://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&rsquo;é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='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . C&rsquo;était la première fois que je me rendais à un événement de ce genre à l&rsquo;étranger.</p>
<p>J&rsquo;aurais toutefois quelques remarques / critiques concernant l&rsquo;événement :</p>
<ul>
<li>Nous avons trouvé assez peu réglo le fait que certaines équipes disposaient d&rsquo;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&rsquo;événement se termine si tôt (1h du mat), surtout avec un nom comme &laquo;&nbsp;Insomni&rsquo;hack&nbsp;&raquo;&#8230;</li>
</ul>
<p>J&rsquo;espère que le staff, s&rsquo;il lit ce billet, ne les prendra pas mal ; il s&rsquo;agit au contraire de conseils pour l&rsquo;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='https://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>https://www.segmentationfault.fr/securite-informatique/insomnihack2010-hzv-won/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Bypassing SEHOP on Windows 7</title>
		<link>https://www.segmentationfault.fr/securite-informatique/bypassing-sehop-on-windows-7/</link>
		<comments>https://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&rsquo;application, dans le but de rediriger le flux d&rsquo;exécution vers un shellcode. La protection SEHOP empêche ce type d&rsquo;exploitation en parcourant au préalable la chaîne des structures SEH et en s&rsquo;assurant qu&rsquo;elle soit valide. Jusqu&rsquo;à maintenant, elle était considérée par beaucoup comme inviolable. Microsoft ont d&rsquo;ailleurs décidé de l&rsquo;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&rsquo;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>https://www.segmentationfault.fr/securite-informatique/bypassing-sehop-on-windows-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exploitation de faille include avec les sessions PHP</title>
		<link>https://www.segmentationfault.fr/securite-informatique/exploitation-de-faille-include-avec-les-sessions-php/</link>
		<comments>https://www.segmentationfault.fr/securite-informatique/exploitation-de-faille-include-avec-les-sessions-php/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 19:05:43 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[PHP]]></category>

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

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=711</guid>
		<description><![CDATA[News éclair : je viens d&#8217;apprendre sur le blogs de Virtualabs que les photos de la Nuit du Hack 2009 sont en ligne. C&#8217;est par ici.]]></description>
			<content:encoded><![CDATA[<p>News éclair : je viens d&rsquo;apprendre sur le blogs de <a href="http://www.virtualabs.fr">Virtualabs </a>que les photos de la Nuit du Hack 2009 sont en ligne. <a href="http://www.nuitduhack.com/photos-nuit-du-hack-2009.htm">C&rsquo;est par ici</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://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>https://www.segmentationfault.fr/securite-informatique/rdtsc-hooking-linux/</link>
		<comments>https://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&rsquo;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&rsquo;horloge depuis le démarrage du processeur. En 2007, un chercheur d&rsquo;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&rsquo;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&rsquo;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&rsquo;autant plus que RDTSC est couramment utilisée dans des application ayant trait à la sécurité, comme les méthodes d&rsquo;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&rsquo;é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&rsquo;on l&rsquo;appelle. Je présente en premier lieu la théorie nécessaire pour l&rsquo;attaque, puis décris comment l&rsquo;implémenter sous Linux. Enfin, je détaille une difficulté majeure à laquelle on peut faire face sur les distributions récentes telles qu&rsquo;ArchLinux : le flag TIF_NOTSC.</p>
<h3>L&rsquo;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&rsquo;horloge. Ce compteur n&rsquo;est autre que le MSR IA32_TIME_STAMP_COUNTER (cf <a href="http://www.intel.com/products/processor/manuals/">manuel 3B d&rsquo;Intel</a>, section 18.11). Celui-ci fait 64 bits et est retourné dans EDX et EAX lors de l&rsquo;appel à RDTSC. Les applications classiques s&rsquo;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&rsquo;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&rsquo;application de quitter.</li>
</ul>
<p>Cependant, ce n&rsquo;est pas exactement comme cela qu&rsquo;est décrit l&rsquo;instruction RDTSC dans le <a href="http://www.intel.com/products/processor/manuals/">manuel 2B d&rsquo;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&rsquo;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&rsquo;index 13 dans l&rsquo;IDT (table des interruptions). L&rsquo;OS traite cette exception par une routine du noyau qui n&rsquo;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&rsquo;envoi d&rsquo;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&rsquo;est appeler notre fonction et non celle du noyau lors de l&rsquo;exception. Il va donc falloir patcher l&rsquo;IDT en remplaçant l&rsquo;adresse du handler 13 par le notre ; autrement dit, faire du IDT hooking.</p>
<p>L&rsquo;IDT recense des descripteurs explicités à la section 5.11 du manuel 3A d&rsquo;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&rsquo;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&rsquo;architecture x86, on constate que le champ Offset est découpé en deux parties : poids forts et poids faibles. C&rsquo;est ce champ qui pointe vers le handler à exécuter lors de l&rsquo;exception. Il suffit de remplacer sa valeur par l&rsquo;adresse d&rsquo;une de nos fonctions, et nous pourrons alors détourner le flux d&rsquo;exécution lors d&rsquo;un appel ring 3 à RDTSC.</p>
<h3>Trouver l&rsquo;IDT</h3>
<p>Pour pouvoir faire un hook de l&rsquo;IDT, il faut d&rsquo;abord savoir la trouver. En fait, il est nécessaire de préciser que pour les processeurs multi-coeur, il n&rsquo;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&rsquo;IDT référencée par un cœur, il suffit d&rsquo;utiliser l&rsquo;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&rsquo;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&rsquo;instruction SIDT n&rsquo;est pas toujours bien émulée par l&rsquo;hyperviseur et il se peut que la valeur qu&rsquo;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&rsquo;en utilise qu&rsquo;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&rsquo;addresse de l&rsquo;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&rsquo;appelle /boot/System.map26.</p>
<h3>Conception du handler</h3>
<p>Une bonne conception du nouveau handler d&rsquo;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&rsquo;un check de privilèges échoue (pour une bonne ou une mauvaise raison) dans l&rsquo;OS, autrement dit un sacré paquet de fois&#8230; Autant dire qu&rsquo;il est préférable de laisser l&rsquo;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&rsquo;instruction fautive est facile vu que l&rsquo;EIP a été empilé ; il suffit de le regarder, d&rsquo;examiner ce qu&rsquo;il pointe et de comparer cette valeur à l&rsquo;opcode de RDTSC : 0F 31, soit 0x310F en mot de 16 bits little endian. Si cela ne correspond pas, on saute sur le handler de base de l&rsquo;OS pour ne pas tout crasher.</p>
<p>Ce n&rsquo;est pas tout : les programmes ring 3 de l&rsquo;OS aussi utilisent RDTSC. Si nous leur rendons des valeurs comme 0&#215;11223344, ils risquent d&rsquo;avoir un comportement plutôt imprévisible, surtout s&rsquo;ils s&rsquo;en servent comme base de temps. J&rsquo;ai d&rsquo;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&rsquo;é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&rsquo;est venue à l&rsquo;esprit est d&rsquo;utiliser le PIDs du processus courant, en supposant que l&rsquo;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&rsquo;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&rsquo;il faut pour implémenter cette attaque sous Linux. La seule chose qu&rsquo;il nous manque, c&rsquo;est un moyen dé récupérer le PID du processus courant lorsque l&rsquo;on est dans un handler d&rsquo;interruption. Après lecture en diagonale du chapitre 7 d&rsquo;<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&rsquo;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&rsquo;elle ne marche en fait pas dans le contexte d&rsquo;un handler d&rsquo;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&rsquo;expression suivante : <code>current_thread_info()-&gt;task-&gt;pid</code>.</p>
<h3>Implémentation 1</h3>
<p>Nous pouvons maintenant implémenter l&rsquo;attaque. Je l&rsquo;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&rsquo;un descripteur d&rsquo;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&rsquo;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&rsquo;est de toutes façon pas masquable, il n&rsquo;y a pas de risque.</p>
<p>Le nouveau handler d&rsquo;interruption est codé à part dans un fichier assembleur. Il s&rsquo;agit en fait d&rsquo;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&rsquo;exception et la traiter si besoin en détournant RDTSC. On utilise son code de retour pour savoir si l&rsquo;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&rsquo;une part,on définit des structures correspondant à l&rsquo;état de la pile lors de l&rsquo;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&rsquo;Intel, vu que la pile croît des addresses hautes vers les basses. On récupère l&rsquo;EIP empilé, on déréférence ce pointeur et on compare le mot de 16 bits avec l&rsquo;opcode de RDTSC renversé (vu qu&rsquo;il se trouve en mémoire, donc en little-endian). On émule RDTSC su besoin, et on n&rsquo;oublie pas d&rsquo;incrémenter EIP afin de sauter par dessus l&rsquo;instruction lors du retour. On notera que le debug de cette fonction n&rsquo;est pas trivial, car il est impossible d&rsquo;utiliser des fonctions comme <code>printk()</code> à l&rsquo;intérieur.</p>
<p>Voici désormais la partie relative aux IOCTLs. Je n&rsquo;ai pas détaillé cette partie précédemment car elle fait plutôt partie d&rsquo;un choix d&rsquo;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&rsquo;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&rsquo;assembleur inline de GCC, notemment les doubles % nécessaires puisque l&rsquo;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&rsquo;Intel.</p>
<p>Lors du chargement du driver, il suffira de hooker l&rsquo;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&rsquo;adresse de l&rsquo;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&rsquo;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&rsquo;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&rsquo;implémentation précédente avec deux distributions ArchLinux de noyaux 2.6.29 et 2.6.30, j&rsquo;ai constaté qu&rsquo;ell ne marchait tout simplement pas. En faisant plusieurs tests, je constate que le handler de #GP est bien hooké, mais RDTSC ne l&rsquo;est pas du tout car le programme de test affiche toujours des valeurs normales. J&rsquo;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&rsquo;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&rsquo;activer ou non pour certains processus seulement. Il s&rsquo;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&rsquo;équivalent du flag TSD, mais dans le contexte de chaque processus. Il est possible de le définir avec l&rsquo;appel système <a href="http://www.kernel.org/doc/man-pages/online/pages/man2/prctl.2.html">prctl</a> en utilisant l&rsquo;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&rsquo;Ubuntu 9.04 ; je n&rsquo;ai pas encore bien saisi pourquoi ceuxi-ci sont effectivement appliqués sur ArchLinux. Le blog cité précédemment parle de l&rsquo;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='https://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&rsquo;est pas vraiment convenable car un hook se doit d&rsquo;ê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&rsquo;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&rsquo;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&rsquo;il n&rsquo;y a même plus besoin de modifier à la main CR4 à l&rsquo;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&rsquo;implémentation 2, sachant que celle-ci fonctionne aussi bien sur les deux distributions que j&rsquo;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&rsquo;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&rsquo;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&rsquo;envoyant au module par ioctl</li>
</ul>
</li>
<li>scripts/ contient trois scripts permettant d&rsquo;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&rsquo;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&rsquo;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&rsquo;anti-debug consiste à utiliser RDTSC pour estimer le temps passé entre deux instructions et le comparer à une valeur seuil. Une technique d&rsquo;anti-anti-debug peut donc être de hooker RDTSC et de retourner des valeurs plausibles à l&rsquo;application, en masquant le fait que celle-ci est en train de se faire déboguer. C&rsquo;est précisément ce que fait le plugin <a href="http://www.openrce.org/downloads/details/241/Olly_Advanced">Olly Advanced</a> d&rsquo;OllyDbg.</li>
<li><strong>Communication offusquée entre une application et un driver</strong> : Puisqu&rsquo;avec cette technique RDTSC est exécutée en ring 3 et provoque une exception #GP en ring 0, c&rsquo;est un moyen de donner la main à un driver afin qu&rsquo;il effectue des opérations &laquo;&nbsp;ni vu ni connu&nbsp;&raquo;, dans le sens ou il n&rsquo;y a aucun appel explicite vers fonction noyau dans l&rsquo;application ring 3.</li>
</ul>
<h3>Conclusion</h3>
<p>Cette technique n&rsquo;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&rsquo;éviter de l&rsquo;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&rsquo;OS fournit généralement des appels systèmes permettant d&rsquo;appeler RDTSC en ring 0 et de retourner sa valeur (cf <code>NtQueryPerformanceCounter()</code> sous Windows). Comme l&rsquo;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&rsquo;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&rsquo;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&rsquo;Reilly</li>
<li><a href="http://blog.cr0.org/2009/05/time-stamp-counter-disabling-oddities.html">CR0&prime;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>https://www.segmentationfault.fr/securite-informatique/rdtsc-hooking-linux/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
