« SE5 IdO sécurité des objets 2025/2026 b2 » : différence entre les versions

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche
Ligne 304 : Ligne 304 :
* Erreur AP <code>cipher not configured</code> : corriger en posant `authentication ... version 2` côté SSID et <code>encryption mode ciphers aes-ccm</code> côté radio.
* Erreur AP <code>cipher not configured</code> : corriger en posant `authentication ... version 2` côté SSID et <code>encryption mode ciphers aes-ccm</code> côté radio.


== <span style="color:#34495E;font-weight: bold; font-size: 130%">Partie 2 : Casse d'objets connectés : Alarme incendie (IoT)</span> ==
== <span style="color:#34495E;font-weight: bold; font-size: 130%">Partie 2 : Casse d'objets connectés (IoT)</span> ==
L'objectif est d'intercepter les communications HTTPS de l'application mobile Nedis SmartLife pour récupérer la localKey de l'alarme incendie. Nous avons exploré une approche logicielle par virtualisation avant de passer à l'approche matérielle.
L'objectif est d'intercepter les communications HTTPS de l'application mobile **Nedis SmartLife** pour récupérer la `localKey` de l'alarme.


=== <span style="color:#6369e6;font-weight: bold;">1. Approche Logicielle : Virtualisation Android</span> ===
=== <span style="color:#6369e6;font-weight: bold;">1. Approche Logicielle : Virtualisation Android</span> ===


Le but était de monter une machine virtuelle Android, d'y installer l'application cible, d'obtenir les droits root, et d'injecter le certificat système pour permettre l'interception SSL (Man-in-the-Middle). Le fait d'etre root permet principalement d'avoir le certificat en certificat système car, sur les versions plus récentes que celui de la tablette utilisée précédemment, on ne peut pas ajouter de certificats sans qu'il soit considéré comme un certificat user. Cela empêcherai ce que l'on veut faire.
Nous avons exploré plusieurs méthodes de virtualisation pour obtenir un environnement Android capable de faire tourner l'application tout en étant **root** pour injecter notre certificat d'interception.


==== Phase 1 : Tentatives via QEMU ====
==== Phase 1 : VM Android x86 sur Xen ====
J'ai d'abord tenté d'émuler Android "à la main" via QEMU/KVM en utilisant plusieurs images ISO (Android x86 versions 6 à 9). Cette méthode légère permettait théoriquement un contrôle total sur les paramètres de lancement.
Première tentative avec une image ISO Android-x86 directement sur l'hyperviseur de la salle de TP.


Commandes utilisées pour les différents tests :
'''Configuration Réseau (Lien avec le Cisco) :'''
Pour que cette VM puisse communiquer avec notre infrastructure (VLAN, Accès Internet via notre passerelle), nous avons dû modifier la configuration réseau pour la lier au pont `bridgeStudents` et lui attribuer une IP statique dans notre plage.
 
Modification du fichier <code>/etc/network/interfaces</code> (ou configuration via console selon la version) :
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
# Test basique en mode user net
auto eth0
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw
iface eth0 inet static
    address 172.16.9.150
    netmask 255.255.255.0
    gateway 172.16.9.1
    dns-nameservers 172.16.9.1
</syntaxhighlight>
 
; Problème rencontré : L'application ne se lance pas
L'installation de l'OS fonctionne, le réseau fonctionne, l'APK Nedis se télécharge, mais **l'application crashe immédiatement** au lancement.


# Boot sur ISO pour installation
; Analyse technique (Pourquoi ça plante ?)
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom android-x86-9.0.iso -boot d
Pour comprendre, nous avons analysé le fichier APK lui-même en le convertissant en archive ZIP pour explorer son contenu.
<syntaxhighlight lang="bash">
# Renommage pour extraction
mv nedis-smartlife.apk nedis-smartlife.zip
unzip nedis-smartlife.zip -d analyse_apk


# Tentative avancée (USB passthrough et CPU host)
# Inspection des bibliothèques natives
qemu-system-x86_64 \
ls -R analyse_apk/lib/
    -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
</syntaxhighlight>
</syntaxhighlight>


; Bilan des tests QEMU
; Résultat de l'analyse :
: Malgré de multiples tentatives avec différentes ISOs, nous avons rencontré des blocages systématiques rendant l'exploitation impossible :
Le dossier <code>lib/</code> ne contient que des sous-dossiers <code>armeabi-v7a</code> et <code>arm64-v8a</code>.
:* Absence de services Google  : Impossible d'installer l'application via le Store.
* **Conclusion :** L'application est compilée avec des instructions natives pour processeurs **ARM**.
:* Incompatibilité de version : Les images Android 4.x/5.x étaient trop anciennes pour l'APK Nedis.
* **Cause du crash :** Notre VM tourne sur une architecture **x86_64**. Sans bibliothèques compatibles (x86) ni traducteur binaire (libhoudini) fonctionnel, l'application ne peut pas s'exécuter.
:* Crash à l'installation d'APK : Certaines images refusaient l'installation manuelle (`adb install`).
:* Impossibilité de Root : Les versions récentes (Android 9+) verrouillaient la partition système en lecture seule (Read-Only), empêchant l'injection du certificat CA.


==== Phase 2 : Android Studio ====
==== Phase 2 : Tentatives d'Émulation QEMU (Ligne de commande) ====
Face aux échecs de QEMU, nous sommes passés à Android Studio pour bénéficier d'émulateurs (AVD) officiels et plus stables.
Pour pallier le problème d'architecture ou de version, nous avons testé l'émulation brute via QEMU.


'''1. Installation et Configuration'''
'''1. Tentative d'émulation ARM (Android 4.4)'''
L'archive officielle a été décompressée et installée localement dans le répertoire utilisateur pour contourner les restrictions de droits des machines de TP.
Sur conseil, nous avons tenté d'émuler une architecture ARM pour être compatible avec les librairies de l'application.
<syntaxhighlight lang="bash">
sudo apt install qemu-system-arm
# Lancement de l'image Android 4.4 ARM
</syntaxhighlight>
* **Résultat :** L'architecture est bonne, mais la version d'Android (4.4 KitKat) est **trop ancienne**. L'application Nedis requiert une API plus récente (Android 6.0+) et refuse de s'installer.


'''2. Tentatives d'émulation x86 diverses'''
Nous avons enchaîné les tests avec différentes ISOs Android via QEMU (x86_64) pour trouver une version compatible.
Commandes utilisées :
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
# Installation
# Test standard
sudo mv ~/Downloads/android-studio ~/
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw
sudo chown -R kelbachi ~/android-studio
 
# Installation depuis ISO
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom android-x86-9.0.iso -boot d


# Lancement
# Configuration avancée (USB, CPU Host)
~/android-studio/bin/studio.sh
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
</syntaxhighlight>
</syntaxhighlight>


Le SDK s'est installé dans : <code>/home/kelbachi/Android/Sdk/</code>.
; Bilan des tests QEMU :
Aucune VM n'a été exploitable pour des raisons variées :
* Pas de Google Play Services (impossible de télécharger l'app).
* Version trop ancienne.
* Impossibilité de passer root sur les versions récentes.


'''2. Création de l'AVD et Problème d'Architecture'''
==== Phase 3 : La Réussite avec Android Studio ====
Nous sommes passés à **Android Studio** pour créer un émulateur (AVD) stable et récent.


Nous avons tenté de créer un émulateur Pixel 6 Pro.
'''1. Installation'''
* Premier essai (Image ARM) : Nous avons naïvement sélectionné une image système ARM64 pour correspondre à l'architecture native des téléphones.
<syntaxhighlight lang="bash">
* Erreur bloquante :
# Décompression et déplacement dans /opt ou ~/
<code>AVD's CPU Architecture 'arm64' is not supported by the QEMU2 emulator on x86_64 host</code>
tar -xvf android-studio-*.tar.gz
* Solution : Nous avons dû basculer sur une image **Google APIs x86_64 (Android 10 / API 29)**.
sudo mv android-studio /opt/
/opt/android-studio/bin/studio.sh
</syntaxhighlight>
Le SDK s'installe dans <code>~/Android/Sdk/</code>.


'''3. Installation de l'application Nedis'''
'''2. Création de l'AVD (Attention à l'architecture)'''
* Tentative initiale avec une image **Pixel 4 / Android 10 ARM64**.
* **Erreur :** <code>AVD's CPU Architecture 'arm64' is not supported by the QEMU2 emulator on x86_64 host</code>. L'émulation ARM sur x86 est trop lente ou non supportée par défaut.
* **Correction :** Choix d'une image **Google APIs x86_64** (Android 12 / API 31).


L'APK officiel ne fonctionnant pas sur l'architecture x86 (car compilé pour ARM), nous avons récupéré une version compatible via Aptoide (lien : <code>https://nedis-smartlife.en.aptoide.com/app</code>). Sur l'image x86_64, l'application se lance correctement.
'''3. Installation de l'application'''
L'APK officiel du Play Store ne fonctionnant pas toujours sur émulateur, nous avons récupéré l'APK compatible via Aptoide (<code>https://nedis-smartlife.en.aptoide.com/app</code>). L'installation fonctionne.


==== Phase 3 : La bataille du Certificat (Root & Système) ====
'''4. Root et Injection du Certificat (Succès avec Magisk)'''
Pour intercepter le HTTPS, le certificat CA doit être placé dans <code>/system/etc/security/cacerts/</code>. Cela requiert les droits d'écriture sur la partition système.
Pour injecter le certificat système sur Android 12 (où la partition <code>/system</code> est en lecture seule via dm-verity), nous avons utilisé **Magisk** et un script d'automatisation (RootAVD).


'''Tentative 1 : ADB Root standard'''
Commandes et procédure :
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
# Préparation du hash du certificat
# Commandes ADB classiques (insuffisantes seules)
openssl x509 -inform PEM -subject_hash_old -in ca.crt
# Hash obtenu : 9de4c2c8 -> fichier 9de4c2c8.0
 
# Tentative d'injection
adb root
adb root
adb shell avbctl disable-verification # Tentative de désactiver Verified Boot
adb shell avbctl disable-verification
adb reboot
adb reboot
adb wait-for-device root
adb wait-for-device root
adb remount
adb remount
adb push 9de4c2c8.0 /system/etc/security/cacerts/
</syntaxhighlight>
</syntaxhighlight>


; Résultat : ÉCHEC
L'injection directe via <code>adb push</code> échouait (`Read-only file system`).
: <code>adb: error: failed to copy '9de4c2c8.0' to '/system/etc/security/cacerts/': remote write failed: Read-only file system</code>
**Solution :** Installation d'un module Magisk spécifique via le script RootAVD. Ce module monte le certificat en "overlay" au démarrage, contournant la protection en écriture.
: Sur les images "Production" (Google Play), **dm-verity** empêche toute modification de la partition système, même en root.
 
'''Tentative 2 : Démarrage en mode Writable'''
Nous avons tenté de forcer le montage en écriture via les options de l'émulateur en ligne de commande :
 
<syntaxhighlight lang="bash">
~/Android/Sdk/emulator/emulator -avd Pixel_6_Pro_API_29 -writable-system -no-snapshot
</syntaxhighlight>
 
; Résultat : ÉCHEC PARTIEL
: Cette commande permet théoriquement l'écriture, mais nécessite une image système spécifique (non-"Google Play") et rend l'émulateur instable. De plus, les modifications ne sont pas persistantes au redémarrage suivant, rendant l'installation du certificat inopérante pour une interception durable.
 
'''Tentative 3 : Magisk'''
 
Une solution technique consisterait à utiliser Magisk et un module pour monter le certificat en "overlay" au démarrage (contournant le problème du Read-Only). Cependant, la complexité de l'installation de Magisk sur un émulateur AVD dans l'environnement restreint des salles de TP n'a pas permis d'aboutir à une solution stable.
 
=== <span style="color:#6369e6;font-weight: bold;">Conclusion de l'approche logicielle</span> ===
Malgré l'exploration de QEMU et Android Studio, les sécurités modernes d'Android (en particulier le verrouillage de la partition système en Read-Only et l'absence de bibliothèques ARM sur les images x86) rendent l'approche logicielle extrêmement complexe à mettre en œuvre dans le temps imparti.


'''Nous n'avons donc pas de VM Android fonctionnelle pour l'interception.''' Nous pivotons vers l'approche matérielle (Hardware Hacking) pour extraire les informations directement depuis l'électronique de l'alarme.
; Résultat Final :
* La VM est **Rootée**.
* Le certificat CA est **reconnu par le système**.
* L'application Nedis **se lance**.
* Nous pouvons désormais intercepter le trafic HTTPS.


=== <span style="color:#6369e6;font-weight: bold;">2. Approche Matérielle (Hardware Hacking)</span> ===
=== <span style="color:#6369e6;font-weight: bold;">2. Approche Matérielle (Hardware Hacking)</span> ===
(Suite du TP : Analyse UART, lecture des trames, etc.)
En parallèle de l'approche logicielle, nous avons mené une analyse matérielle directe sur le circuit de l'alarme...

Version du 24 janvier 2026 à 21:24

🌐 TP Infrastructure Réseau 🛜

Introduction

Ce wiki documente la mise en place d’une petite infrastructure réseau pédagogique pour le TP 2025/2026.

L’objectif est de déployer un serveur virtuel sur capbreton, d’y terminer un VLAN privé (ici 409 car je suis a la Zabeth 09), puis d’implanter les services exigés : DHCP, DNS (forwarder + zone locale d’interception), NAT/mascarade, et redirection réseau pour l’HTTP.

Des choix techniques sont explicités à chaque étape (pourquoi tel fichier, telle option, tel service), afin d’argumenter les décisions et permettre la reproductibilité.

Serveur virtuel (17/09)

La VM est créée sur Xen depuis capbreton avec une unique interface reliée à bridgeStudents, conformément au sujet (routage par 172.26.145.251 côté salles projets).

xen-create-image \
  --hostname=SE5.kelbachi \
  --dhcp \
  --bridge=bridgeStudents \
  --dir=/usr/local/xen \
  --size=10GB \
  --dist=daedalus \
  --memory=2G \
  --force
Pourquoi cette commande ?
--bridge=bridgeStudents impose l’unique attachement réseau demandé ; --dist=daedalus assure une base Devuan stable (ifupdown classique) ; les ressources (2 Gio RAM/10 Gio disque) suffisent pour DHCP/DNS/NAT.

Démarrage et accès console :

xl create -c /etc/xen/SE5.kelbachi.cfg
# Ctrl+] pour détacher la console sans éteindre

Adresse routée (réseau des salles projets)

Configuration statique avec passerelle 172.26.145.251. On choisit une IP libre dans la plage fournie (exemple 172.26.145.109/24).

# /etc/network/interfaces (extrait)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 172.26.145.109/24
    gateway 172.26.145.251
    dns-nameservers 1.1.1.1 8.8.8.8
Pourquoi une IP statique ?
Le sujet exige un adressage maîtrisé côté salles projets et une route par défaut vers le routeur NAT de la salle. C’est la base pour que la VM accède à Internet et puisse, ensuite, NATer les clients WiFi.

Interface privée (VLAN 409)

Le réseau privé associé à X=09 est 172.16.9.0/24. La VM termine ce VLAN avec l’adresse 172.16.9.1/24 (gateway & DNS pour les clients). Dans notre mise en place, l’interface privée est eth1.

# /etc/network/interfaces (complément)
auto eth1
iface eth1 inet static
    address 172.16.9.1/24

Vérifications :

ip a
ip r
ping -c3 172.26.145.251
ping -c3 8.8.8.8

Point d’accès Cisco – SSID WPA2-PSK (29/09)

Connexion console série (9600 8N1, sans control flow) avec Minicom. Après habilitation, création d’un SSID attaché au VLAN 409.

dot11 ssid SE5-SSID09
  vlan 409
  authentication open
  authentication key-management wpa version 2
  wpa-psk ascii Cisco2025
  exit

interface dot11radio 0
  encryption mode ciphers aes-ccm
  ssid SE5-SSID09
  station-role root
  no shutdown

Nous laissons de cote cette partie car elle n'est pas bloquante pour la suite du TP.

Serveur DHCP (29/09)

Distribution automatisée d’adresses 172.16.9.100–200 aux clients du VLAN 409, avec routeur et DNS pointant vers la VM.

Installation :

apt-get update
apt-get install -y isc-dhcp-server

Configuration :

# /etc/dhcp/dhcpd.conf
default-lease-time 600;
max-lease-time 7200;
authoritative;

subnet 172.16.9.0 netmask 255.255.255.0 {
  range 172.16.9.100 172.16.9.200;
  option routers 172.16.9.1;
  option domain-name-servers 172.16.9.1;
}

Mascarade (NAT) – Accès Internet (29/09)

Activation du routage IPv4 et NAT du réseau 172.16.9.0/24 vers eth0.

sysctl -w net.ipv4.ip_forward=1
sed -i 's/^#\?net\.ipv4\.ip_forward.*/net.ipv4.ip_forward=1/' /etc/sysctl.conf

iptables -t nat -F
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.9.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.9.0/24 -j MASQUERADE

iptables -t nat -L -n -v
Pourquoi la mascarade ?
Les clients WiFi utilisent des adresses privées. Le NAT traduit leurs paquets pour qu’ils sortent avec l’IP de la VM côté salles projets.
Sans NAT, pas d’Internet pour le VLAN 409.

Persistance :

apt-get install -y iptables-persistent
netfilter-persistent save

Interception de flux (04/10)

Redirection par DNS (zone locale)

On implémente une zone primaire sur la VM pour rediriger picoctf.org et tous ses sous-domaines vers la VM. Service BIND sous Devuan : nom de service systemd = named.

Déclaration :

# /etc/bind/named.conf.local
zone "picoctf.org" {
    type master;
    file "/etc/bind/db.picoctf.org";
};

Zone :

$TTL  200
@  IN SOA ns.picoctf.org. admin.picoctf.org. (
    2025100403 ; Serial
    3600       ; Refresh
    1800       ; Retry
    604800     ; Expire
    86400 )    ; Minimum

        IN NS  ns.picoctf.org.
ns      IN A   172.16.9.1
@       IN A   172.16.9.1
www     IN CNAME ns

Options (écoute VLAN) :

# /etc/bind/named.conf.options (extrait)
options {
  directory "/var/cache/bind";
  recursion yes;
  allow-query { 172.16.9.0/24; 127.0.0.1; };
  forwarders { 1.1.1.1; 8.8.8.8; };
  listen-on { 172.16.9.1; 127.0.0.1; };
  dnssec-validation auto;
};

Service & vérifs :

systemctl enable named
systemctl restart named
named-checkconf
named-checkzone picoctf.org /etc/bind/db.picoctf.org
dig @127.0.0.1 picoctf.org +short
dig @127.0.0.1 www.picoctf.org +short
dig @127.0.0.1 test.picoctf.org +short   # wildcard
Screenshot from 2025-10-04 08-33-01.png

Redirection réseau

Mise en place d’une REDIRECT pour capter le HTTP et le diriger vers un service local.

# Table nat propre
iptables -t nat -F

# Interception HTTP
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 8080

# NAT format TP (409)
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.9.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -s 172.16.9.0/24 -j MASQUERADE

iptables -t nat -L -n -v

Serveur Apache sécurisé (08/10)

Dans cette partie, l’objectif est de mettre en place un serveur web sécurisé en HTTPS avec un certificat signé par une autorité locale. J'utilise ici le domaine d’exemple picoctf.org, déjà intercepté par notre DNS.

1. Création d’un certificat auto-signé

Avant toute chose, je génère un certificat auto-signé permettant à Apache de servir du HTTPS localement.

openssl req -x509 -nodes -days 365 \
  -newkey rsa:2048 \
  -keyout /etc/ssl/apache/apache-selfsigned.key \
  -out /etc/ssl/apache/apache-selfsigned.crt \
  -subj "/C=FR/ST=Nord/L=Lille/O=Polytech/CN=picoctf.org"

2. Configuration d’Apache2

Je crée un nouveau fichier de configuration HTTPS dans /etc/apache2/sites-available/secure-site.conf.

<VirtualHost *:443>
    ServerName picoctf
    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/apache2/sites-available/apache.crt
    SSLCertificateKeyFile /etc/apache2/sites-available/apache.key

    # Logs SSL
    ErrorLog ${APACHE_LOG_DIR}/ssl-error.log
    CustomLog ${APACHE_LOG_DIR}/ssl-access.log combined
</VirtualHost>

# HTTP vers HTTPS
<VirtualHost *:80>
    ServerName picoctf.org
    Redirect permanent / https://picoctf.org/
</VirtualHost>

Cette configuration active le service sur le port 443 et redirige automatiquement les connexions HTTP vers HTTPS.

3. Création d’une autorité de certification locale

Afin de simuler un certificat signé par une autorité de confiance, je crée une CA interne appelée "Certif".

openssl req -x509 -new -nodes \
  -keyout ca.key -sha256 -days 365 \
  -out ca.crt -subj "/CN=Certif"

4. Signature du certificat Apache avec l’autorité locale

Je commence par créer une demande de signature (CSR) pour le serveur Apache :

openssl req -new -newkey rsa:2048 -nodes \
  -keyout apache.key -out apache.csr \
  -subj "/CN=picoctf.org"

Puis je signe cette requête avec notre autorité Certif :

openssl x509 -req -in apache.csr \
  -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out apache.crt -days 365 -sha256

Je remplace ensuite dans la configuration Apache les fichiers de certificat auto-signés par ceux nouvellement générés :
- /etc/apache2/sites-available/apache.crt
- /etc/apache2/sites-available/apache.key

Redémarrage du service :

a2enmod ssl
a2ensite secure-site.conf
systemctl reload apache2

Machine virtuelle Android

Lorsque je tente d’accéder à https://picoctf.org depuis un appareil Android récent, le certificat de l’autorité “Certif” n’est pas reconnu.

Screenshot from 2025-10-10 15-30-32.png

Pour contourner cela, il est possible d’installer une ancienne machine Android (par exemple sous Android 4.x), où l’ajout manuel d’une autorité de certification est encore possible.

Sur cette Android, après quelques ajustements réseau, il est possible d’importer le certificat racine Certif et ainsi naviguer vers le faux site picoctf.org.

Appareil Android physique (08/10)

Enfin, le même test a été reproduit sur la tablette Android 4.4 de mon camarade, une version qui permet encore l’ajout d’autorités de certification manuellement.

En important le fichier `ca.crt` dans les paramètres de sécurité, le site `https://picoctf.org` devient totalement “sécurisé” : le navigateur affiche le cadenas vert , confirmant que la connexion est chiffrée et que le certificat est reconnu par le système.

Screenshot 2025-10-08-10-04-04.png

Screenshot 2025-10-08-09-21-51.png

Problèmes rencontrés

  • Console Cisco muette : causée par le flow control. Solution : désactiver hardware & software flow control dans minicom (9600, 8N1, /dev/ttyUSB0).
  • Erreur AP cipher not configured : corriger en posant `authentication ... version 2` côté SSID et encryption mode ciphers aes-ccm côté radio.

Partie 2 : Casse d'objets connectés (IoT)

L'objectif est d'intercepter les communications HTTPS de l'application mobile **Nedis SmartLife** pour récupérer la `localKey` de l'alarme.

1. Approche Logicielle : Virtualisation Android

Nous avons exploré plusieurs méthodes de virtualisation pour obtenir un environnement Android capable de faire tourner l'application tout en étant **root** pour injecter notre certificat d'interception.

Phase 1 : VM Android x86 sur Xen

Première tentative avec une image ISO Android-x86 directement sur l'hyperviseur de la salle de TP.

Configuration Réseau (Lien avec le Cisco) : Pour que cette VM puisse communiquer avec notre infrastructure (VLAN, Accès Internet via notre passerelle), nous avons dû modifier la configuration réseau pour la lier au pont `bridgeStudents` et lui attribuer une IP statique dans notre plage.

Modification du fichier /etc/network/interfaces (ou configuration via console selon la version) :

auto eth0
iface eth0 inet static
    address 172.16.9.150
    netmask 255.255.255.0
    gateway 172.16.9.1
    dns-nameservers 172.16.9.1
Problème rencontré
L'application ne se lance pas

L'installation de l'OS fonctionne, le réseau fonctionne, l'APK Nedis se télécharge, mais **l'application crashe immédiatement** au lancement.

Analyse technique (Pourquoi ça plante ?)

Pour comprendre, nous avons analysé le fichier APK lui-même en le convertissant en archive ZIP pour explorer son contenu.

# Renommage pour extraction
mv nedis-smartlife.apk nedis-smartlife.zip
unzip nedis-smartlife.zip -d analyse_apk

# Inspection des bibliothèques natives
ls -R analyse_apk/lib/
Résultat de l'analyse

Le dossier lib/ ne contient que des sous-dossiers armeabi-v7a et arm64-v8a.

  • **Conclusion :** L'application est compilée avec des instructions natives pour processeurs **ARM**.
  • **Cause du crash :** Notre VM tourne sur une architecture **x86_64**. Sans bibliothèques compatibles (x86) ni traducteur binaire (libhoudini) fonctionnel, l'application ne peut pas s'exécuter.

Phase 2 : Tentatives d'Émulation QEMU (Ligne de commande)

Pour pallier le problème d'architecture ou de version, nous avons testé l'émulation brute via QEMU.

1. Tentative d'émulation ARM (Android 4.4) Sur conseil, nous avons tenté d'émuler une architecture ARM pour être compatible avec les librairies de l'application.

sudo apt install qemu-system-arm
# Lancement de l'image Android 4.4 ARM
  • **Résultat :** L'architecture est bonne, mais la version d'Android (4.4 KitKat) est **trop ancienne**. L'application Nedis requiert une API plus récente (Android 6.0+) et refuse de s'installer.

2. Tentatives d'émulation x86 diverses Nous avons enchaîné les tests avec différentes ISOs Android via QEMU (x86_64) pour trouver une version compatible. Commandes utilisées :

# Test standard
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw

# Installation depuis ISO
qemu-system-x86_64 -net nic -net user -m 1024 -enable-kvm -display sdl -drive file=android.img,format=raw -cdrom android-x86-9.0.iso -boot d

# Configuration avancée (USB, CPU Host)
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
Bilan des tests QEMU

Aucune VM n'a été exploitable pour des raisons variées :

  • Pas de Google Play Services (impossible de télécharger l'app).
  • Version trop ancienne.
  • Impossibilité de passer root sur les versions récentes.

Phase 3 : La Réussite avec Android Studio

Nous sommes passés à **Android Studio** pour créer un émulateur (AVD) stable et récent.

1. Installation

# Décompression et déplacement dans /opt ou ~/
tar -xvf android-studio-*.tar.gz
sudo mv android-studio /opt/
/opt/android-studio/bin/studio.sh

Le SDK s'installe dans ~/Android/Sdk/.

2. Création de l'AVD (Attention à l'architecture)

  • Tentative initiale avec une image **Pixel 4 / Android 10 ARM64**.
  • **Erreur :** AVD's CPU Architecture 'arm64' is not supported by the QEMU2 emulator on x86_64 host. L'émulation ARM sur x86 est trop lente ou non supportée par défaut.
  • **Correction :** Choix d'une image **Google APIs x86_64** (Android 12 / API 31).

3. Installation de l'application L'APK officiel du Play Store ne fonctionnant pas toujours sur émulateur, nous avons récupéré l'APK compatible via Aptoide (https://nedis-smartlife.en.aptoide.com/app). L'installation fonctionne.

4. Root et Injection du Certificat (Succès avec Magisk) Pour injecter le certificat système sur Android 12 (où la partition /system est en lecture seule via dm-verity), nous avons utilisé **Magisk** et un script d'automatisation (RootAVD).

Commandes et procédure :

# Commandes ADB classiques (insuffisantes seules)
adb root
adb shell avbctl disable-verification
adb reboot
adb wait-for-device root
adb remount

L'injection directe via adb push échouait (`Read-only file system`).

    • Solution :** Installation d'un module Magisk spécifique via le script RootAVD. Ce module monte le certificat en "overlay" au démarrage, contournant la protection en écriture.
Résultat Final
  • La VM est **Rootée**.
  • Le certificat CA est **reconnu par le système**.
  • L'application Nedis **se lance**.
  • Nous pouvons désormais intercepter le trafic HTTPS.

2. Approche Matérielle (Hardware Hacking)

En parallèle de l'approche logicielle, nous avons mené une analyse matérielle directe sur le circuit de l'alarme...