Comment lire la cnie et le passeport biometrique (fil technique)

farid_h

<defunct>
Contributeur
Pour focusser la discussion uniquement sur les aspects techniques, j'ouvre un nouveau fil. J'espere qu'on aura une discussion dans le style xda-developers. Merci de s'abstenir de devier du sujet. :)

Alors, pour resumer la discussion precedente, il s'agit de voir ce qu'on peut extraire comme informations d'une CNIE ou d'un passeport marocain, ou, plus generalement d'une carte avec une puce RFID. Si vous avez une carte pareille mais pas de documents marocains, vous etes quand meme invites a experimenter et a repliquer ce qu'on fait ici: les principes de base sont probablement semblables, meme si les details vont etre differents.

Ces cartes marocaines sont compatibles avec le standard ISO/IEC 14443 Type A, comme je viens de decouvrir/confirmer. Il faut donc d'abord obtenir un lecteur. J'ai choisi un SCM SCL3711 qui ne coute que 39 Euros, et qui est compatible avec Linux, mon systeme de developpement.

Pour suivre la discussion suivante, il faut aussi de la litterature technique. J'utilise ce livre (telecharchez le tant que le lien est actif), et je fais reference aux page de la 4eme edition. Le format de reference est "page xxx(yyy)" xxx est le numero de la page du livre, et yyy est le numero de la page dans le fichier PDF (plus facile a y naviger avec certains programmes).

Dans les extraits qui suivent, je vais parfois afficher des infos que les divers programmes donnent, mais je vais aussi parfois changer ces infors par des 'XX', si je pense que ces infos sont sensibles ou personnelles. Je ne vais bien evidament pas exposer ma vie privee ici, n'est-ce pas? ;)

Okay, let's start...
 

farid_h

<defunct>
Contributeur
1. La cle SCL3711 est automatiquement reconnue par le kernel quand on la connecte:

Code:
$ dmesg:
[  185.669444] usb 2-2: new full-speed USB device number 15 using xhci_hcd
[  185.889143] usb 2-2: New USB device found, idVendor=04e6, idProduct=5591
[  185.889151] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  185.889155] usb 2-2: Product: SCL3711-NFC&RW
[  185.889158] usb 2-2: Manufacturer: SCM Micro
[  186.922270] nfc: nfc_init: NFC Core ver 0.1
[  186.922288] NET: Registered protocol family 39
[  186.925698] pn533 2-2:1.0: NFC: NXP PN533 firmware ver 2.7 now attached
[  186.928457] usbcore: registered new interface driver pn533

C'est un bon signe.

Attention: j'utilise le kernel suivant:

Code:
$ uname -rm
4.4.0-45-generic x86_64

2. Installer libnfc

Sous Linux Mint (un derivat de Debian), il suffit d'installer des packages de libnfc; pas besoin de recompiler libnfc de source. La bibliotheque libnfc contient du support pour le chipset pn533 qui est dans le SCL3711. Alors:

Code:
$ sudo apt-get install libnfc-bin libnfc-dev libnfc-examples libnfc-pn53x-examples

Setting up libnfc5:amd64 (1.7.1-4) ...
Setting up libnfc-bin (1.7.1-4) ...
Setting up libnfc-dev:amd64 (1.7.1-4) ...
Setting up libnfc-examples (1.7.1-4) ...
Setting up libnfc-pn53x-examples (1.7.1-4) ...

(... la suite ...)
 

farid_h

<defunct>
Contributeur
3. Detecter le SCL3711 avec un programme

J'assume que le SCL3711 est deja insere dans un port USB (sinon vous n'aurez pas vu le message du kernel dans 'dmesg' plus haut).

3.1 Desactiver le kernel module pn533

Pour acceder au SCL3711, il faut bien sur un programme. Nous allons utiliser deux programmes qui ont ete installes dans l'etappe 2. comme faisant partie des packages libnfc. Mais attention, ca ne marchera que lorsque nous desactiverons le module kernel pn533 qui monopolise le SCL3711 lui meme, car ces programmes assument le controle complet du lecteur et ne veulent pas d'interference de la part du kernel.

Alors, cette commande est super importante:

Code:
$ sudo modprobe -r pn533

Il faut aussi la repeter a chaque foi qu'on reboot. On peut verifier que ca a marche en faisant un

Code:
$ lsmod | grep pn533

et en s'assurant que rien ne s'affiche comme reponse. Le module pn533 ne doit pas etre loaded.

3.2 Tester la connexion entre libnfc et le SCL3711

Apres avoir deconnecte le kernel module pn533, nous pouvons tester la presence du SCL3711 avec le programm 'nfc-scan-device' qui a ete installe lors de l'installation des packages libnfc:

Code:
$ sudo nfc-scan-device -v
nfc-scan-device uses libnfc 1.7.1
1 NFC device(s) found:
- SCM Micro / SCL3711-NFC&RW:
    pn53x_usb:002:016
chip: PN533 v2.7
initator mode modulations: ISO/IEC 14443A (106 kbps), FeliCa (424 kbps, 212 kbps), ISO/IEC 14443-4B
(847 kbps, 424 kbps, 212 kbps, 106 kbps), Innovision Jewel (106 kbps), D.E.P. (424 kbps, 212 kbps,
106 kbps) target mode modulations: ISO/IEC 14443A (106 kbps), FeliCa (424 kbps, 212 kbps), D.E.P.
(424 kbps, 212 kbps, 106 kbps)

Ca marche donc bien: libnfc arrive a communiquer avec le lecteur SCL3711 et son chipset PN533. Ce chipset support les divers protocols affiches, y compris celui qui nous inrteresse, ISO/IEC 14443A (106 kbps), comme nous allons voir plus tard.

(... la suite ...)
 

farid_h

<defunct>
Contributeur
4. Detecter la presence d'un carte RFID

Pour detecter la presence de cartes RFID comme la CNIE, le passeport, ou autres cartes avec des puces RFID/NFC, nous utilisons le programme 'nfc-list' qui fait lui aussi parti du package 'libnfc'.

Nous essayons d'abord 'nfc-list' sans mettre de carte RFID a proximite du lecteur:

Code:
$ sudo nfc-list
nfc-list uses libnfc 1.7.1
NFC device: SCM Micro / SCL3711-NFC&RW opened

Une petite LED s'allume 0.5 seconds sur le lecteur, puis s'eteind, et nous revenons au prompt. Ca veut dire que le lecteur n'a pas detecte de cartes RFID a proximite.

Maintenant, si je met ma CNIE sur le SCL3711, et que je repete la commande, ca donne ceci:

Code:
$ sudo nfc-list
nfc-list uses libnfc 1.7.1
NFC device: SCM Micro / SCL3711-NFC&RW opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04
       UID (NFCID1): XX  XX  XX  XX
      SAK (SEL_RES): 20
		ATS: 78  b3  a0  02  XX  XX  XX  XX  XX  XX  XX  XX  XX  XX  XX

(j'ai remplace certains chiffres hexadecimaux dont je ne sais pas s'ils contiennent des donnees personnelles et/ou sensitives par des 'XX').

On peut repeter l'experience avec le passeport vert:

Code:
$ sudo nfc-list
nfc-list uses libnfc 1.7.1
NFC device: SCM Micro / SCL3711-NFC&RW opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04
       UID (NFCID3): XX  XX  XX  XX
      SAK (SEL_RES): 20
		ATS: 78  77  95  02  XX  XX  XX  XX  XX  XX  XX  XX  XX  XX  XX  XX  XX

(... la suite ...)
 

farid_h

<defunct>
Contributeur
4.1 Interpretation des resultats

Pour interpreter les resultats, j'ai consulte "le livre" (cf. plus haut), et tire les conclusions suivantes:

1. les deux cartes sont de type ISO/IEC 14443, Type A (bon, pas besoin de livre, nfc-list le dit directement). Bon, nous arrivons a nous connecter, ca marche donc sur les layers 1, 2.

2. le code SAK 20 signifie que les cartes supportent ISO/IEC 14443-4 (table 10.7 page 314(348), figure 10.32 page 313(347)). D'ou un ATS. Ce standard 14443-4 est important, car on a dans ce cas la pas besoin de deviner pas mal de commandes proprietaires. Ca laisse esperer qu'on arrivera a extraire certaines infos sans trop d'efforts d'investigations.

3. l'UID de la CNIE reste identique; celle de ma carte allemande est randomisee. Cette UID est une UID de protocole entre carte et lecteur. Je ne sais pas s'il y a une relation entre cette UID et le nimiro d'la carte. Par precaution, je ne l'affiche pas ici, au cas ou il y aurait un algorithme reversible qui permettrait de convertir cette UID statique en numero de CIN (on ne sait jamais...).

4. Les bytes marques XX dans ATS sont des "characters historiques" definits dans ISO/IEC 7816-4 dans un format TLV compact, et definissent les autres capacites de la carte. C'est possible qu'il existe aussi un fichier ATR avec un FID 2F01 code ASN.1 avec des characteres historiques supplementaires definissant beaucoup d'autres donnees sur la carte, systeme d'operation etc... page 211(246). Les autres bytes affiches sont des parametres de transmission, genre timing entre les frames, combien il faut attendre entre response et next request, etc... Comment acceder a ce fichier (s'il existe)? Je ne sais pas encore... Ou trouver ISO/IEC 7816-4?

Pour avancer davantage, il faut maintenant regarder ce que le standard ISO/IEC 14443-4 contient, et comment envoyer des commandes de ce standard a ces cartes via des programmes de libnfc (il y a une shell pour envoyer des commandes si j'ai bien compris, ou il faut ecrire un petit programme en C qui utilise la bibliotheque libnfc pour le faire).
 

farid_h

<defunct>
Contributeur
5. Une application de libnfc: extraire la photo du passeport

Pour extraire la photo du passeport biometrique, j'ai installe le programme 'mrtdreader' (pour "Machine-Readable Travel Document Reader") qui existe en source code sur GitHub:

https://github.com/rubund/mrtdreader

et aussi comme package. J'ai ete paresseux et j'ai installe le package (mais je vais tirer la version GitHub plus tard pour le modifier et extraire plus d'infos que simplement la photo... si possible):

Code:
$ sudo apt-get install mrtdreader

C'est un tout petit programme.

Pour l'utiliser, j'ai place mon passeport vert (et autres passeports aussi, ca marche egalement avec eux) sur le SCL3711, et j'ai lance la commande suivante:

Code:
$ sudo mrtdreader -p XXXXXXXXX -b YYMMDD -e YYMMDD

Il faut ici remplacer 'XXXXXXXXX' par le numero du passeport, le 'YYMMDD' apres le '-b' par la date de naissance dans ce format precis, et le 'YYMMDD' apres le -e par la date d'expiration du passeport dans ce format precis. Avec ces infos, 'mrtdreader' arrivera a s'authentifier avec la puce du passeport, et a demander le fichier contenant l'image. Voici ce qui se passe (j'ai 'XX-er tout, car je ne sais pas ce qui est sensitif):

Code:
NFC device: SCM Micro / SCL3711-NFC&RW opened
Target found!
======================
Challenge successful!
======================

Getting EF.COM... done
File content: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
File size: 28
Found: EF_DG1
Found: EF_DG2
Found: EF_DG3
Found: EF_DG11
Found: EF_DG12
Found: EF_DG13
Found: EF_DG14
Found: EF_DG15

Getting EF.SOD... done
File content: (XXX ... tres longue liste ... XXX)
File size: XXXX
Getting EF.DG1... done
P<MARXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File size: XX

Getting EF.DG2 which contains the image... done
Saving image to image.jp2... done

Voila! Il suffit maintenant de voir l'image 'image.jp2' avec par exemple 'gimp'. :)

Le source code n'extrait que EF.DG1 et EF.DG2 et ne sauvegarde que EF.DG2, mais c'est facile de le changer...

A noter que tous les passeports ne sont pas egaux. Mon passeport allemand ne contient pas autant de fichiers EF_DG? que le passeport marocain:

Code:
Found: EF_DG1
Found: EF_DG2
Found: EF_DG3
Found: EF_DG14

La suite: investiger comment 'mrtdreader' extrait ces fichiers, s'informer sur le standard ISO/IEC 14443-4, etc... et voir ce qu'on peut extraire de plus du passeport, et si on arrive a communiquer sur layer-7 avec a CNIE.

A vous maintenant! (je continue bien sur de m'eduquer sur le sujet et d'experimenter).
 
@farid_h tu expliques super bien les choses, tu devrais tenter une carrière dans l'enseignement
(je déconne tu gagnes que dalle :D)

je suis curieux de tenter l'experience sur ma machine ubuntu, juste pour voir ce que les marocains ont stocké comme info dans ces documents

Merci bcp pour le partage :cool:

PS: est ce qu'il est possible de modifier ces informations? :p
 
Pour un projet, j'avais l'idée que les utilisateurs s'identifie via leur carte d'identité belge. J'avais même trouvé un script sur un site étatique. Je vais tenter de le retrouver quand je rentre.
 

Arijj

Good things come to those who wait.
VIB
Merci @farid_h d'avoir mis autant d'effort pour nous faire découvrir les mystères de la CIN marocaine, j'aimerais bien essayer de lire ma propre carte mais je dois me procurer un lecteur tout d'abord. Quoique je n'arrive pas encore à saisir comment on peut utiliser les informations pour définir la nationalité.

@Kuzan Si c'est possible de modifier les informations que contient la carte, ça deviendrait dangereux :rolleyes:


P.S : Pour des informaticiens c'est super simple, par contre, je ne comprends même pas où je devrais écrire les commandes :p
 

farid_h

<defunct>
Contributeur
@zozo357, dans le fil connexe, j'avais deniche un lien sur l'eID belge. Peut etre que tu peux commencer a chercher a partir de la? Ils ont certainement documente cette fonction pour les developpeurs de logiciels qui veulent utiliser cette fonction.

Pour l'eID allemande, j'ai trouve ca comme infos techniques

https://www.bsi.bund.de/DE/Themen/D...TechnRichtlinien/trundschutzprofile_node.html

Je ne connais pas le degre d'interoperabilite/compatibilite des systemes eID belges et allemands. Si j'ai bien compris, ces systemes sont pour l'instant encore des systemes purement nationaux. Il y a un desir d'harmoniser ces eID, au moins au niveau de l'UE, mais pour ca, les experts et juristes gouvernementaux discutent encore les criteres communs dans des conferences standardisatrices. Ca risquera de durer encore tres longtemps.
 

farid_h

<defunct>
Contributeur
Pour des informaticiens c'est super simple, par contre, je ne comprends même pas où je devrais écrire les commandes :p

Pour comprendre comment ca va se passer (d'apres le stade actuel de ma lecture encore en progres):

- la smartcard n'est pas une simple carte-memoire. C'est un mini-ordinateur (microcontroller) entier.

- pour acceder au contenu des infos dans la memoire de la carte, il faut passer imperativement par le processeur en envoyant des commandes precises. Le processeur va verifier qu'on a le droit d'acceder a l'info, et va la delivrer si ok.

- pour avoir une idee des commandes: rappelez vous les commandes AT pour modems? Les microcontrolleurs acceptent un code semblable (mais different) assez cryptique, et surtout binaire et tres compact (pour economiser de la superficie et de l'energie sur la puce de la carte).

- il y a des codes proprietaires et des codes standardises (c.a.d. predefinis). Nous allons essayer d'envoyer dss codes standardises et voir ce qui se passera. Pour ca, il faut decortiquer les standards utilises, et comprendre l'encodage comme par ex. TLV-compact, ASN.1, etc... Du moins, si on veut creer les bytes des commandes manuellement (methode low-level), ce qui sera incontournable si on veut hacker (cf. si dessous).

- exemple de codes (je suppose): LIRE SECTEUR #, LOGIN, etc...

- Le microcontrolleur implemente une state machine. Il faut parfois envoyer des commandes dans un ordre precis. Par ex. d'abord s'authentifier, puis demander un directory, puis demander un fichier par numero d'index du directory, etc...

- On envoie des commandes ou bien low-level avec libnfc en envoyant les bytes de ces commandes vers le microcontroller (via une fonction de libnfc), ou, si le microcontroller accepte des commandes standardisees, on peut envoyer ces commandes high-level (de nouveau en invoquand une fonction de libnfc). Je veux dire par la: ou on fait l'equivalent de plusieurs putc() (low-level), ou on invoque l'equivalent d'un get_file_by_name("somename") (high-level).

- On essaye d'abord avec les fonctions high-level de haute abstraction; mais si elles ne marchent pas avec la CNIE, il faudra essayer d'autres commandes du ou des standard/s. Et pour ca, il faudra composer les bytes de ces commandes manuellement et les envoyer low-level.

- Via libnfc, on reccupere les reponses (parfois fragmentees, parfois des codes d'erreur) de la carte, et on reagit en consequence.

Bon, pour tout ca, il faut se familiariser avec le langage de commandes et avec les interna de ces smartcards. C'est pour ca que je prefere pour l'instant de lire "le livre" avant de continuer le hacking.

Pour ceux qui preferent essayer directement (hands-on):

- modifiez mrtdreader, particulierement mrtdreader.c pour extraire et sauvegarder les autres EF?_DG.
- consultez et familiarisez vous avec l'API de libnfc:

http://www.libnfc.org/api/
 
Dernière édition:

farid_h

<defunct>
Contributeur
Petite explication sur mrtdreader. Vous avez remarque qu'il faut donner le numero du passeport, la date de naissance et la date d'expiration comme parametres pour pouvoire extraire la photo. Si vous avez essaye de modifier une de ces donnees (une lettre suffit), le challenge ne va pas fonctionner, et le progrmme n'arrivera pas a extraire la photo.

Qu'est-ce qu'on apprend de ca? (Enfin, c'est ce que j'assume pour l'instant... je ne suis pas 100% sur)

- la photo est certes sauvegardee sur la memoire de la puce du passeport, mais pas accessible directement.

- pour y acceder, le processeur a besoin d'une cle cryptographique derivee de ces 3 informations (ou plus exactement, de la ligne lisible machinellement en bas du passeport qui contient ces memes infos avec des checksums).

- mrtdreader collecte ces infos et les transmet a la bibliotheque qui les envoie au microcontroller du passeport. La state machine du passeport ne va permettre le transfert de la photo qu'apres avoir recu la ou les commandes avec ces donnees supplementaires du challenge.

Tout ca montre la difference fondamentale d'une smartcard et d'une carte de memoire normale.

Oh, en passant, pourquoi est-ce qu'on ne peut pas extraire la photo directement? Je suppose que c'est intentionnel. On ne veut pas que des hackers se balladent dans, disons, des metros, et autres endroits ou il y a beaucoup de gens tres proches les uns des autres, et arrivent a extraire les infos des passeports des gens autour d'eux sans qu'ils le sachent. Hors, pour acceder au contenu comme par ex. la photo, il faut ces 3 infos; mais pour ca, le hacker doit deja ouvrir physiquement le passeport et lire ces infos (ou les photographier et analyser immediatement(!) pendant que la victime est encore en immediate vicinite), ce qui n'est presque jamais praticable.
 
Dernière édition:

farid_h

<defunct>
Contributeur
Correction message #12:

Apres avoir survole l'API de libnfc... il n'y a que des low-level fonctions pour envoyer et recevoir des bytes vers et de la carte:

http://www.libnfc.org/api/group__initiator.html

Les high-level fonctions qui encapsulent les commandes ISO/IEC 14443-4 et autres ne sont pas dans libnfc. Peut etre avec un peu de chance dans d'autres bibliotheques open source (GitHub?), sinon, il faudra en ecrire une nous memes, a partir de ces standards, contenant les commandes dont nous allons avoir besoin... (beaucoup de travail meticuleux de recherche dans les standards, verification avec les cartes, ajouter dans cette bibliotheque).

Edit; mrtdreader nous donne deja un petit(?) head start, car arriver a lire l'equivalent d'un fichier, c'est deja tres high-level, niveau abstraction. Pour y arriver, il fallait certainement envoyer plusieurs commandes primitives successives.. A verifier!
 
Dernière édition:

farid_h

<defunct>
Contributeur
Update important: Une liste de commandes qu'on pourrait envoyer a la smartcard se trouve dans le standard ISO/IEC 7816-4 (Interindustry Commands for Interchange)

http://www.embedx.com/pdfs/ISO_STD_7816/info_isoiec7816-4{ed2.0}en.pdf

Version browsable en ligne aussi ici:

http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4.aspx

Est-ce que la CNIE acceptera ces commandes, et est-ce qu'il faut d'abord s'authentifier avec une cle secrete dont nous ne disposons pas, ca, c'est pas encore sur. A essayer (plus tard). Mais c'est deja un pas en avant. Ces bytes qui composent ces commandes sont probablement a envoyer avec une fonction de l'API de libnfc que j'ai poste plus haut.

Edit: Exercice: Interpreter les bytes historiques de l'ATS (ceux que j'ai XX-er plus haut dans le message #4), en se referrant a ce standard 7816-4. Voici le lien direct vers la section sur les bytes historiques. Bien sur, vous devrez utiliser les bytes historiques de l'ATS de votre propre CNIE. ;)
 
Dernière édition:

farid_h

<defunct>
Contributeur
Il faudra voir ce que les commandes de cette categorie donnent... en particulier:

- "READ BINARY",
- "READ RECORD(S)",
- "GET DATA",
- "SELECT FILE",

Pour s'identifier, il faudra investiger les commandes:

- "VERIFY"
- "INTERNAL AUTHENTICATE"
- "EXTERNAL AUTHENTICATE"
- "GET CHALLENGE"

En general, dans la description d'une commande, le terme APDU signifie Application-PDU, c.a.d. les bytes a transferrer a la carte.

Mais attention, il faut lire le reste du standard aussi, sinon, c'est incomprehensible.
 

farid_h

<defunct>
Contributeur
Pour tester des commandes en envoyant des APDUs, on peut le faire manuellement en ecrivant un programme en C (ou C++) et en invocant la fonction de libnfc que j'ai mentionne plus haut...

... ou, alternativement, on peut utiliser la Smart Card Shell 3, une solution basee sur Java, JavaScript etc. C'est une question de gout et de preferences personnelles. Je n'ai pas encore essaye, ni l'une, ni l'autre.

A propos, le site Open Smart Card Development Platform de la Smart Card Shell 3 contient aussi des infos sur d'autres sujets, comme par ex. sur les passeports ICAO.

A explorer...
 

Arijj

Good things come to those who wait.
VIB
Merci bien @farid_h pour cette explication détaillée, bien que je trouve que c'est un niveau un peu avancé pour un nul en informatique, comme tu l'as dis, je dois me familiariser d'abord avec le langage de commande pour un peu comprendre comment ça marche.

J'essayerai de relire ce que t'as écrit un peu plus tard.
 

farid_h

<defunct>
Contributeur
Prends tout le temps necessaire @Arijj. Moi aussi, j'ai besoin de temps pour lire/digerer le livre et ces standards, les APIs etc avant de continuer avec les tests. Et cette semaine, mon daytime job me prend beaucoup plus de temps que d'habitude... Ca ne presse pas. ;)
 

Arijj

Good things come to those who wait.
VIB
Prends tout le temps necessaire @Arijj. Moi aussi, j'ai besoin de temps pour lire/digerer le livre et ces standards, les APIs etc avant de continuer avec les tests. Et cette semaine, mon daytime job me prend beaucoup plus de temps que d'habitude... Ca ne presse pas. ;)
:cool:
Comprendre certains langage informatique m'aidera à avancer?
 

farid_h

<defunct>
Contributeur
:cool:
Comprendre certains langage informatique m'aidera à avancer?
Pas vraiment. C'est plus une question de comprendre les standards et d'experimenter. Si tu utilises libnfc, tu devras connaitre C, si tu preferes jouer avec la Smart Card Shell 3, c'est Java. Mais le langage est secondaire... Ce qui compte, c'est de decortiquer les documents, savoir quels bytes envoyer, et si on recoit des reponses, comment interpreter les bytes qu'on recoit (la aussi faut lire les documents). Le C/Java n'est que l'outil pour envoyer/recevoir ces bytes a/de la carte.

Mais avant tout, lis le livre, ou au moins le plus de chapitres possibles. Meme si ton anglais n'est que moyen, fais l'effort: tu decouvriras un monde tres interessant. Rien que ca vaut deja le temps investi. Si tu ne comprends pas certaines choses, demandes les ici en mentionnant la page.
 

Arijj

Good things come to those who wait.
VIB
Pas vraiment. C'est plus une question de comprendre les standards et d'experimenter. Si tu utilises libnfc, tu devras connaitre C, si tu preferes jouer avec la Smart Card Shell 3, c'est Java. Mais le langage est secondaire... Ce qui compte, c'est de decortiquer les documents, savoir quels bytes envoyer, et si on recoit des reponses, comment interpreter les bytes qu'on recoit (la aussi faut lire les documents). Le C/Java n'est que l'outil pour envoyer/recevoir ces bytes a/de la carte.

Mais avant tout, lis le livre, ou au moins le plus de chapitres possibles. Meme si ton anglais n'est que moyen, fais l'effort: tu decouvriras un monde tres interessant. Rien que ca vaut deja le temps investi. Si tu ne comprends pas certaines choses, demandes les ici en mentionnant la page.
Ok, c'est le livre que tu as mis en lien?

Merci :cool:
 

farid_h

<defunct>
Contributeur
Okay, apres une semaine bien pleine d'autres choses, je compte continuer la lecture du livre ce weekend...

Est-ce que l'un de vous a deja obtenu un lecteur et a essaye de repliquer les tests en haut? Ou essaye autre chose? Ca a donne quoi?
 

farid_h

<defunct>
Contributeur
Pour utiliser la Smart Card Shell 3, il faut installer un driver PC/SC proprietaire pour le lecteur SCL3711. Cette procedure un peu compliquee est la suivante (pour Linux).

1. Installer les pre-requisites

Code:
$ sudo apt-get install libudev-dev

2. Installer pcsclite

Code:
$ git clone git://anonscm.debian.org/pcsclite/PCSC.git
$ cd PCSC
$ ./bootstrap
$ ./configure
$ make
$ sudo make install

3. Installer le driver proprietaire PC/SC qui complette pcsclite:

Code:
$ wget http://www.scm-pc-card.de/file/driver/Readers_Writers/scl3711_-_linux_64-bit_driver.gz
$ tar -xvpf scl3711_-_linux_64-bit_driver.gz
$ cd sclgeneric_2.09_linux_64bit
$ less ReadmeFirst.txt
$ sudo ./install.sh

4. Demarrer le daemon pcscd:

- S'assurer que le lecteur SCL3711 est branche.
- S'assurer que pn533 n'est pas charge (avec lsmod | grep pn533, voir plus haut)

Code:
$ sudo /usr/local/sbin/pcscd

La LED du lecteur s'allume.

5. Verifier que pcscd a demarre:

Code:
$ ps ax | grep pcscd
24140 pts/1    S+     0:00 man pcscd
24429 pts/3    Sl     0:00 /usr/local/sbin/pcscd
24438 pts/3    S+     0:00 grep --color=auto pcscd

(... la suite ...)
 

farid_h

<defunct>
Contributeur
6. Telecharger Smart Card Shell 3

- Pour rappel, la page d'accueil de Smart Card Shell 3.
- Page de telechargement. Telecharger le fichier .jar.
- Si necessaire et pas encore fait, installer un JDK java 8, par exemple openjdk8 ou Java 8 de Sun: "sudo apt-get install openjdk8"
- S'assurer que Java est installe:

Code:
$ /usr/bin/java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-8u111-b14-2ubuntu0.16.04.2-b14)
OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode)

Executer le fichier .jar:

Code:
$ /usr/bin/java -jar scsh3.12.267.jar

L'installation donne ceci:

153876 153878 153879 153880 153881

(... la suite ...)
 

Pièces jointes

  • scsh3-install-1.png
    scsh3-install-1.png
    170.4 KB · Affichages: 13
  • scsh3-install-2.png
    scsh3-install-2.png
    17.8 KB · Affichages: 11
  • scsh3-install-3.png
    scsh3-install-3.png
    19.9 KB · Affichages: 11
  • scsh3-install-4.png
    scsh3-install-4.png
    19.7 KB · Affichages: 10
  • scsh3-install-5.png
    scsh3-install-5.png
    12.1 KB · Affichages: 11
Dernière édition:

farid_h

<defunct>
Contributeur
7. Demarrer Smart Card Shell 3

Attention: Il faut la demarrer en tant que 'root', sinon elle ne detecte pas le lecteur!

Avant de la demarrer, il faut que le daemon pcscd tourne (voir plus haut). Verifiez que la LED du lecteur est allumee...

Code:
$ sudo ~/CardContact/scsh3/scsh3gui

Au premier demarrage, il faut creer un workspace. Regardez aussi comment le lecteur SCL3711 est reconnu. Il faut le selecter...

153885
153886
153887
153888

(... la suite ...)
 

Pièces jointes

  • scsh3-start-1.png
    scsh3-start-1.png
    34.4 KB · Affichages: 11
  • scsh3-start-2.png
    scsh3-start-2.png
    19.6 KB · Affichages: 10
  • scsh3-start-3.png
    scsh3-start-3.png
    31.5 KB · Affichages: 10
  • scsh3-start-4.png
    scsh3-start-4.png
    26.4 KB · Affichages: 12

farid_h

<defunct>
Contributeur
8. Explorer le contenu d'un carte d'identite (supportee):

- Placer une carte d'identitee ou passeport ICAO sur le lecteur
- Dans la Smart Card Shell 3, choisir le menu: File / Run Script et dans le file selector choisir tools / explore.js
- Lire le contenu des diverses parties de la carte...

Avec la CNIE, ca donne ceci (voir images attachees):

153892 153893

Apparament, la logique dans explore.js n'arrive pas (encore) a decoder le protocole de cette carte. On peut aussi choisir le tab 'trace' pour voir plus de bytes...

Avec ma carte d'identite allemande qui est explicitement supportee par explore.js, j'obtiend un bel arbre avec beaucoup d'attributs / fichiers que j'arrive a visionner un apres l'autre. Je ne vais bien evidament pas afficher les screenshots correspondants ici, ca se comprend de soi. J'essayerais plus tard avec d'autres pieces d'identite, y compris les passeports. Surtout pour les passeports qui doivent etre standardises, ca va etre plus interessant... ou pas.

Juste une petite astuce: quand on execute explore.js, il faut a chaque foi selecter le folder "tools", sinon meme avec un pre-selected "explore.js", il ne la retrouve plus...
 

Pièces jointes

  • scsh3-explore-1.png
    scsh3-explore-1.png
    56.6 KB · Affichages: 13
  • scsh3-explore-2.png
    scsh3-explore-2.png
    72.4 KB · Affichages: 15

farid_h

<defunct>
Contributeur
Explications: explore.js arrive a decoder les fields de certaines cartes, mais pas toutes (et pas la CNIE). Pour ca, il faut hacker et modifier explore.js... ou plus exactement, les libraries OpenSCDP qui se cachent derriere... (le truc qu'il fallait installer avant d'installer scsh3).

Mais peut etre que la CNIE n'est pas compatible avec ce standard. Dans ce cas la, ca deviendra plus complique jusqu'a impossible. Peut etre qu'on peut hacker avec scsh3, ou peut etre qu'il faudra utiliser libnfc directement (dans ce cas la ne pas oublier 'sudo killall pcscd' auparavant, car les deux ne sont pas compatibles). A suivre...
 

farid_h

<defunct>
Contributeur
Okay, la suite...

Pour lire les passeports avec Smart Card Shell 3, il faut installer des scripts supplementaires:

9. Installer des scripts supplementaires:

Des scripts supplementaires pour scsh3 se trouvent ici. Nous sommes particulierement interesse aux scripts ICAO, notamment icao/explore.js (un autre explore.js que celui que nous avons utilises plus haut).

Alors, installons cette collection de scripts, la ou nous avons deja installe scsh3:

Code:
$ cd ~/CardContact/scsh3
$ git clone https://github.com/CardContact/scsh-scripts.git

Cela cree un directory/folder scsh-scripts en dessous de CardContact/scsh3 qui sera aussi visible quand on execute le menu File / Run script de scsh3.

Pour tester le passeport (vert, rouge, bleu...), ouvrez le fichier scsh-scripts/icao/explore.js avec un editeur de votre choix (vi, emacs, nano, ... peu importe), et cherchez au debut du fichier les deux lignes qui commencent avec var mrzlist = et celle qui commence avec var mrz2 = . Il faudra changer ces deux lignes comme suit:

Code:
var mrzlist = [ "L898902C<3UTO6908061F9406236ZE184226B<<<<<14", 
                "WG30004036UTO6007078M0511014<<<<<<<<<<<<<<06",
                "votre-mrz-ici",
                "autres-mrz-ici (optionnel)",
];

var mrz2 = mrzlist[2];

La MRZ est la deuxieme ligne en bas de votre passeport. Il faut la mettre exactement de la meme maniere dans ce fichier comme elle est ecrite sur votre passeport. Il ne faut pas devier d'une seule lettre et d'un seul symbole. C'est un mot de passe!

Si vous voulez tester d'autres passeports, vous pouvez ajouter d'autres MRZ a cette liste en 4eme, 5eme etc... position.

La deuxieme variable mrz2 indique quelle ligne est a tester. Dans l'exemple si dessus, mrz2 pointe sur mrzlist[2], c.a.d. sur la 3eme ligne (ca compte a partir de 0 biensur), donc votre MRZ.

Si vous avez tout bien fait, sauvegardez le fichier, et redemarrez scsh3gui avec sudo. Placez votre passeport sur le lecteur, et executez ensuite ce script avec File / Run script et selectez scsh-scripts/icao/explore.js.

Si tout se passe bien, vous verrez ceci:

153895
 

Pièces jointes

  • scsh3-icao.png
    scsh3-icao.png
    76.8 KB · Affichages: 16

farid_h

<defunct>
Contributeur
Je vous dis rapidement ce qui se trouve sur le passeport marocain:

- EF.DG1: les deux dernieres lignes en bas du passeport (machine readable zone)
- EF.DG2: l'image (a extraire avec le script dumpmrtd.js apres y avoir edite le MRZ)
- EF.DG3: empreintes digitales (fichier non-lisible, code 6982 security condition not satisfied: uniquement pour personnel autorise)
- EF.DG4: l'iris de l'oeil (fichier non-present, code 6A82 file not found)
- EF.DG5: portrait affiche (?) (fichier non-present)
- EF.DG6: RFU (?) (fichier non present)
- EF.DG7: signature (fichier non present)
- EF.DG8: data features (?) (fichier non present)
- EF.DG9: structure features (?) (fichier non present)
- EF.DG10: substance features (?) (fichier non present)
- EF.DG11: Nom, Prenom, Nimiro-dla-carte(CIN), Lieu de naissance, Adresse, Date de naissance, (autres infos que je dois decoder)
- EF.DG12: Autorite qui a accorde le passeport (par ex. le Consulat), date de creation du passeport,
- EF.DG13: Informations supplementaires: infos binaires, nationalite en plaintext: "Marocaine". Le reste est decompose en plusieurs categories, mais c'est binaire.
- EF.DG14: Informations biometriques (binaires). Peut etre (tres probablement) dans un format standardise.
- EF.DG15: Une cle publique (a voir dans le standard ICAO a quoi elle sert)
- EF.DG16: Personne a notifier (fichier non-disponible).

Le reste est une liste de Hashs (signes?) des EF.DG*, et un signe de l'autorite de certification, je crois...

Donc rien de particulierement interessant.
 

farid_h

<defunct>
Contributeur
La MRZ est la deuxieme ligne en bas de votre passeport.

Pour ceux qui ont essaye et que ca n'a pas marche... c'est peut etre parce que je ne me suis pas exprime clairement. Il faut mettre la derniere ligne de la page plastifiee du passeport ici, c.a.d. la deuxieme ligne de la MRZ, de la zone lisible machinellement par scanner optique. Donc la ligne avec entre autres le numero du passeport et date d'expiration; et pas la ligne avec nom et prenom qui est en dessus.
 

farid_h

<defunct>
Contributeur
Pourquoi est-ce qu'il est si facile de lire le passeport mais pas la CNIE?

Tous les passeports doivent obligatoirement etre lisibles par les logiciels aux postes de frontieres du monde entier. C'est pour ca que l'interface pour acceder aux informations des passeports, le genre d'informations, la structure logique (fichiers), les codes de reponse de la puce etc. sont standardises (ICAO). Grace a cette standardisation, il est possible d'extraire ces informations et de les interpreter avec un programme, comme ce que nous avons vu plus haut.

La CNIE et autres cartes d'identites nationales n'obeissent pas a un standard international comme les passeports. Chaque pays a son systeme national et definit une structure particuliere des donnees, ou les trouver, comment y acceder, comment les interpreter, comment interpreter les codes-reponses etc. Certains pays (comme l'Allemagne, cf liens plus haut ou dans le fil connexe) ont publiquement documente l'interface pour acceder aux infos de ces cartes qui ne sont pas secretes -- dans ce cas la, on peut programmer un script comme pour les passeports ICAO pour y acceder --; d'autres pays comme le Maroc n'ont pas publie cette interface, auquel cas on ne peut qu'essayer manuellement avec des commandes comme READ BINARY d'extraire des infos au hasard, et si on obtiend des donnees, de les interpreter heuristiquement, pour ensuite extraire d'autres infos... Ca, ca sera un travail de detectives. Une forme de reverse-engineering.

Donc, la prochaine etappe est d'abord de voir comment scsh3 et icao/explore.js envoient des commandes low-level au passeport pour extraire des fichiers (READ BINARY); puis d'essayer de repliquer et de modifier ces commandes pour extraire et lire les reponses de la CNIE. Pour ca, le tab "Trace" va etre tres utile. Pour interpreter les bytes, il faut avoir lu et compris le standard ISO/IEC 7816-4, cf. liens plus haut.
 

Sanid

Je ne suis pas là !
VIB
Pourquoi est-ce qu'il est si facile de lire le passeport mais pas la CNIE?

Tous les passeports doivent obligatoirement etre lisibles par les logiciels aux postes de frontieres du monde entier. C'est pour ca que l'interface pour acceder aux informations des passeports, le genre d'informations, la structure logique (fichiers), les codes de reponse de la puce etc. sont standardises (ICAO). Grace a cette standardisation, il est possible d'extraire ces informations et de les interpreter avec un programme, comme ce que nous avons vu plus haut.

La CNIE et autres cartes d'identites nationales n'obeissent pas a un standard international comme les passeports. Chaque pays a son systeme national et definit une structure particuliere des donnees, ou les trouver, comment y acceder, comment les interpreter, comment interpreter les codes-reponses etc. Certains pays (comme l'Allemagne, cf liens plus haut ou dans le fil connexe) ont publiquement documente l'interface pour acceder aux infos de ces cartes qui ne sont pas secretes -- dans ce cas la, on peut programmer un script comme pour les passeports ICAO pour y acceder --; d'autres pays comme le Maroc n'ont pas publie cette interface, auquel cas on ne peut qu'essayer manuellement avec des commandes comme READ BINARY d'extraire des infos au hasard, et si on obtiend des donnees, de les interpreter heuristiquement, pour ensuite extrairevd'autres infos... Ca, ca sera un travail de detectives. Une forme de reverse-engineering.

Donc, la prochaine etappe est d'abord de voir comment scsh3 et icao/explore.js envoient des commandes low-level au passeport pour extraire des fichiers (READ BINARY); puis d'essayer de repliquer et de modifier ces commandes pour extraire et lire les reponses de la CNIE. Pour ca, le tab "Trace" va etre tres utile. Pour interpreter les bytes, il faut avoir lu et compris le standard ISO/IEC 7816-4, cf. liens plus haut.
Salam
Tu t'es intéressé aux aspects juridiques d'un reverse-engineering des informations contenues dans la CNIE ?
Que risques tu à le faire et surtout le publier ?
 

farid_h

<defunct>
Contributeur
Salam
Tu t'es intéressé aux aspects juridiques d'un reverse-engineering des informations contenues dans la CNIE ?
Que risques tu à le faire et surtout le publier ?
Excellente question!

S'il y a des juristes ici, un avis serait le bienvenu.

Techniquement, si on envoie une commande a une smart card, et que celle-ci repond, n'est-ce pas implicitement aussi une autorisation? Autrement, il faudrait s'authentifier avec une cle, et comme je ne cherche pas a reverse-engineerer des cles, je n'essaye que d'acceder a des infos publiques que la carte aurait de toutes facons devoilees sur demande.

Mais t'as raison, il faudra voir ce que la legislation sur la CNIE dit concretement. Si quelqu'un trouve un lien, merci de le poster ici. ;)
 
Haut