進監獄全攻略:Mifare1 Card破解

補充新聞:

程序員黑餐館系統 給自己飯卡里充錢 ,技術是雙刃劍,小心,小心!

前言
從M1卡的驗證漏洞被發現到現今,破解設備層出不窮,所以快速傻瓜式一鍵破解不是本文的重點,年輕司機將從本文中獲得如下技能。

如果你想簡單快速的上手,你可以選擇ACR122-like,Proxmark3等容易購買到的操作簡單的設備,或者有個帶有NFC功能並安裝有安卓Mifare Classic Tool (MCT)軟件的手機也是個不錯的選擇。
本文基於樹莓派加RC522,PN532模塊試驗,如果你是剛入門的Geek愛好者不妨讀讀本文,我將簡明地敘述SPI接口協議和部分RC522驅動代碼。
本文破解皆指針對Mifare Classic卡獲得KeyA,KeyB,實現扇區數據讀取。
本文旨在拋磚引玉,才疏學淺,如有錯誤還請不吝賜教。
M1卡結構
Mifare是NXP公司生產的一系列遵守ISO14443A標準的射頻卡,包括Mifare S50、Mifare S70、Mifare UltraLight、Mifare Pro、Mifare Desfire等。Mifare S50的容量爲1K字節,常被稱爲Mifare Standard,又被叫做Mifare 1,是遵守ISO14443A標準的卡片中應用最爲廣泛、影響力最大的的一員。S50的卡類型(ATQA)是0004H。
在這裏插入圖片描述
在帶有NFC功能的手機上使用MCT讀取空白卡Mifare Classic 1k(S50),我們可以直觀地看到卡片的存儲結構。
在這裏插入圖片描述
在這裏插入圖片描述
M1卡有從0到15共16個扇區(Sectors),並且每個扇區都有獨立的密碼,每個扇區配備了從0到3共4個塊(Block),16個扇區的64個塊按絕對地址編號爲0~63,每個塊可以保存16字節byte的內容,共有16X4X16=1024byte。

每個扇區的第4段用來保存KeyA,KeyB和控制位(ACs控制讀寫權限)。

0扇區0塊是特殊的數據塊,用於存放製造商代碼,包括芯片序列號,此塊只讀。
在這裏插入圖片描述
SPI接口
SPI串行外設接口(Serial Peripheral Interface)是一種高速的,全雙工,同步的通信總線,SPI通信以主(master)從(slave)方式,這種模式通常有一個主設備和一個或多個從設備,需要至少4根線,事實上3根也可以(單向傳輸時)。也是所有基於SPI的設備共有的,它們是SDI(數據輸入MISO)、SDO(數據輸出MOSI)、SCLK(時鐘SCK)、CS(SS片選)。

CS是控制芯片是否被選中的,也就是說只有片選信號爲預先規定的使能信號時(高電位或低電位),對此芯片的操作纔有效。

通訊是通過兩個雙向移位寄存器進行數據交換。SPI是串行通訊協議,數據是一位一位傳輸的(總是先發送或接收高字節MSB數據)。SCLK提供時鐘脈衝,在通過 SDO線輸出時,數據在時鐘上升沿或下降沿時改變,在緊接着的下降沿或上升沿被讀取,完成一位bit數據傳輸。因此,至少需要8次時鐘信號的改變才能完成8位數據1byte的傳輸。
在這裏插入圖片描述
在這裏插入圖片描述
SPI協議是一種如何傳輸數據的方式,在集成了SPI硬件控制器的樹莓派中我們不需要會複雜的軟件模擬SPI,我們只要會使用相關庫bcm2835發送和接收數據就行了。就像是流水線上的履帶運輸機,我們要做的只是把貨物放在上面(而不是還要想辦法怎麼搭建運輸機),當然我們還得知道怎麼放,下面我們學習RC522模塊的控制。

MFRC522
幾個重要特性

支持ISO 14443A/MIFARE
64字節的發送和接收FIFO緩衝區
3V電源電壓
支持SPI,I2C,UART接口
如何與M1卡通信?

Request standard/all。在上電覆位Power-On Reset(POR)後,M1卡發送ATQA碼(卡片類型碼,如00 04h 代表MF1S503yX)迴應REQA請求或者喚醒WUPA命令。
防衝突機制。如果讀卡器感應區存在多張卡,他們需要以自己的標識符(發送4字節的SN和1字節校驗)來區分並且只有被選中的一張卡才能進行下一步操作。
選卡。讀卡器使用選卡命令選擇一張卡作爲驗證和存儲相關操作,卡片返回選擇應答SAK碼(卡片容量)。
3次互相驗證。在選卡之後,讀卡器指定存儲地址,使用相應的密碼完成3次互相驗證步驟。驗證通過之後所有的存儲操作都是加密的。
存儲器操作。
讀(Read):讀數據塊

寫(Write):寫數據塊

減值(Decrement):減少數據塊內的數值,並將結果保存在臨時內部數據寄存器中

加值(Increment):增加數據塊內的數值,並將結果保存在數據寄存器中

轉存(Restore):將臨時內部數據寄存器的內容寫入數值塊

暫停(Halt ):將卡置於暫停上作狀態
在這裏插入圖片描述
幾個重要的寄存器

FIF0DataReg,FIFO緩衝區的輸入和輸出數據總線連接到FIFODataReg寄存器,通過寫FIFODataReg寄存器來講一個字節的數據存入FIFO緩衝區,之後內部FIFO緩衝區寫指針加1。

主要的狀態指示寄存器包括ComIrqReg、Er-rorReg、Status2Reg和FIFOLevelReg等。

(更多詳細內容請查看芯片手冊,這也是必須的)
在這裏插入圖片描述
通信流程)

讀寫操作

寫卡分兩步驟

Step A:查詢塊狀態。

命令碼(0xA0) 塊地址
若塊準備好,則MIFARE卡返回4比特應答。若值爲1010,則可進行下一步操作;若值非1010,則表示塊未準備好,必須等待直至塊準備好爲止。

Step B:寫數據。

數據字節(16字節) CRC(2字節)
若寫入成功,則MIFARE卡返回4比特應答,值仍爲1010;若非lOl0,則表示寫入失敗。

讀卡

指令格式

命令碼(0x30) 塊地址
若執行成功,則MIFARE卡返回18字節應答比特。需要注意的是,其中只有16字節是讀取的塊數據,另外2個字節爲填充字節。若字節數不爲18,則可判斷讀卡操作錯誤。

* 函 數 名:write
 * 功能描述:寫塊數據
 * 輸入參數:blockAddr--塊地址;writeData--向塊寫16字節數據
unsigned char write(unsigned char blockAddr, unsigned char *writeData)
{
  unsigned char status;
  unsigned int recvBits;
  unsigned char i;
  unsigned char buff[18];
 
  buff[0] = PICC_WRITE;
  buff[1] = blockAddr;//塊地址0-63
  calculateCRC(buff, 2, &buff[2]);
//發送指令
  status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);
 
//這裏判斷返回狀態
  if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
    status = MI_ERR;
  //準備16byte數據
  if (status == MI_OK){
    for (i=0; i<16; i++)    //?FIFO?16Byte?? Datos a la FIFO 16Byte escribir
      buff[i] = *(writeData+i);
    //計算校驗位
calculateCRC(buff, 16, &buff[16]);
//發送數據
    status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);
    if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A))
      status = MI_ERR;
  }
  return status;
}

感覺怎麼說都有種說不清的感覺,多花點時間對着庫文件和MFRC522 Datasheet強擼吧騷年!

如果上面說的太複雜,下面就請拿上你的樹莓派和RC522模塊開始我們愉快簡單的動手吧。

步驟

安裝bcm2835庫,開啓樹莓派SPI接口並測試是否可用
樹莓派與RC522連線
根據庫文件和通信流程編寫程序
測試
安裝bcm2835庫

bcm2835

樹莓派上博通bcm2835芯片 C語言庫

This is a C library for Raspberry Pi (RPi). It provides access to GPIO and other IO functions on the Broadcom BCM 2835 chip, allowing access to the GPIO pins on the 26 pin IDE plug on the RPi board so you can control and interface with various external devices.

安裝
# 下載最新版庫文件, 類似bcm2835-1.xx.tar.gz, 然後:
tar zxvf bcm2835-1.xx.tar.gz
cd bcm2835-1.xx
./configure
make
sudo make check
sudo make install


Raspberry Pi 2 (RPI2)

在樹莓派上啓用SPI接口(新版系統不用修改黑名單之類的配置文件)

sudo raspi-config

under Advanced Options – A5 SPI
在這裏插入圖片描述
Reboot.

顯示已載入系統的模塊

root@pi2:~# lsmod
Module                Size Used by
joydev                 9194 0
evdev                 11650 2
cfg80211             499234 0
rfkill                 21397 2 cfg80211
8192cu               555405 0
snd_bcm2835           23163 0
snd_pcm               95441 1 snd_bcm2835
snd_timer             22396 1 snd_pcm
snd                   68368 3 snd_bcm2835,snd_timer,snd_pcm
spi_bcm2835             8032 0 //表示開啓
i2c_bcm2708             5740 0
bcm2835_gpiomem         3823 0
bcm2835_wdt             4133 0
uio_pdrv_genirq         3718 0
uio                   10230 1 uio_pdrv_genirq
i2c_dev                 6578 0
ipv6                  367607 24

查看SPI設備(這裏出現spidev0.0設備表示SPI已開啓)

root@pi2:~# ls /dev/sp*

/dev/spidev0.0 /dev/spidev0.1

The Raspberry Pi GPIO pins used for SPI are:

    P1-19 (MOSI)
    P1-21 (MISO)
    P1-23 (CLK)
    P1-24 (CE0)
    P1-26 (CE1)

測試SPI接口

http://www.airspayce.com/mikem/bcm2835/spi_8c-example.html

將MISO和MOSI連接,運行程序你將接收到發送的數據。

spi.c
Shows how to use SPI interface to transfer a byte to and from an SPI device

// spi.c
//
// Example program for bcm2835 library
// Shows how to interface with SPI to transfer a byte to and from an SPI device
//
// After installing bcm2835, you can build this 
// with something like:
// gcc -o spi spi.c -l bcm2835
// sudo ./spi
//
// Or you can test it before installing with:
// gcc -o spi -I ../../src ../../src/bcm2835.c spi.c
// sudo ./spi
//
// Author: Mike McCauley
// Copyright (C) 2012 Mike McCauley
// $Id: RF22.h,v 1.21 2012/05/30 01:51:25 mikem Exp $
#include <bcm2835.h>
#include <stdio.h>
int main(int argc, char **argv)
{
// If you call this, it will not actually access the GPIO
// Use for testing
// bcm2835_set_debug(1);
if (!bcm2835_init())
{
printf("bcm2835_init failed. Are you running as root??\n");
return 1;
}
if (!bcm2835_spi_begin())
{
printf("bcm2835_spi_begin failedg. Are you running as root??\n");
return 1;
}
bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST); // The default
bcm2835_spi_setDataMode(BCM2835_SPI_MODE0); // The default
bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536); // The default
bcm2835_spi_chipSelect(BCM2835_SPI_CS0); // The default
bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW); // the default
// Send a byte to the slave and simultaneously read a byte back from the slave
// If you tie MISO to MOSI, you should read back what was sent
uint8_t send_data = 0x23;
uint8_t read_data = bcm2835_spi_transfer(send_data);
printf("Sent to SPI: 0x%02X. Read back from SPI: 0x%02X.\n", send_data, read_data);
if (send_data != read_data)
printf("Do you have the loopback from MOSI to MISO connected?\n");
bcm2835_spi_end();
bcm2835_close();
return 0;
}

代碼測試
在這裏插入圖片描述

樹莓派連線RC522

Pins
Name	Pin #	Pin name
SDA	24	GPIO8
SCK	23	GPIO11
MOSI	19	GPIO10
MISO	21	GPIO9
IRQ	None	None
GND	Any	Any Ground
RST	22	GPIO25
3.3V	1	3V3
附PI2 GPIO圖

在這裏插入圖片描述
在這裏插入圖片描述
使用樹莓派RC522 C語言庫,庫和示例程序下載地址

讀寫卡片流程

findCard 尋卡 -> anticoll 放衝突檢測 -> selectTag 選卡 -> auth 驗證密碼 -> read/write 讀寫

#include "mfrc522.c"

#include <stdio.h>

#include <string.h>

int main(){

int i,count;

unsigned char s;

unsigned char id[10];

unsigned char key[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};

unsigned char uid[5]; //4字節卡序列號,第5字節爲校驗字節

unsigned char str[MAX_LEN];

unsigned char wData[16] = {'h','a','c','k','e','d',' ','b','y',' ','r','u','o'};

int isTrue = 1;

if (!bcm2835_init()) return -1;

init();

while(isTrue){

if (findCard(0x52,&s) == MI_OK){

if ( anticoll(id) == MI_OK){

memcpy(uid,id,5);

printf("CARD UID:");

for(i = 0;i < 5;i++)

printf("%x",uid[i]);

printf("\n");

}else {

printf("FindCard ERR.\n");

}

//select Card

selectTag(uid);


//auth

if(auth(0x60,4,key,uid) == MI_OK){

//write data

if(write(4,wData) == MI_OK){

printf("Write data success!\n");

//isTrue = false;

}


//read data

if(read(4,str) == MI_OK){

printf("Hex:");

for(i = 0;i < 16;i++)

printf("%x",str[i]);

printf("\n");

printf("Data:%s\n",str);

}

}else{

printf("Auth faild.\n");

}

}

halt();

}

bcm2835_spi_end();

bcm2835_close();

return 0;

在這裏插入圖片描述
其他庫

MFRC522-python

一個在樹莓派上使用MFRC522接口的的類。

https://github.com/mxgxw/MFRC522-python

上面講了很多沒用的細節,如果你想急於求破,你應該先看這章。

使用PN532 NFC模塊
在這裏插入圖片描述
Near field communication (NFC) is a set of standards for smart phones and similar devices to establish radio communication with each other by touching them together or bringing them into close proximity, usually no more than a few centimeters.

Feature

Small dimension and easy to embed into your project
Support I2C, SPI and HSU (High Speed UART), easy to change between those modes
Support RFID reading and writing, P2P communication with peers, NFC with Android phone
RFID reader/writer supports:
Mifare 1k, 4k, Ultralight, and DesFire cards
ISO/IEC 14443-4 cards such as CD97BX, CD light, Desfire, P5CN072 (SMX)
Innovision Jewel cards such as IRT5001 card
FeliCa cards such as RCS_860 and RCS_854
Up to 5cm~7cm reading distance
On-board level shifter, Standard 5V TTL for I2C and UART, 3.3V TTL SPI
Arduino compatible, plug in and play with our shield
這裏我們使用I2C接口將樹莓派與PN532連接,安裝mfoc,mfcuk(Mifare Classic DarkSide Key Recovery Tool)破解軟件。

mfoc程序基於nested authentication驗證漏洞破解含有默認密碼的M1卡的其他KEY。

mfcuk程序基於dackside原理破解全加密卡。

兩款軟件都基於libnfc庫開發,所以我們還需要安裝libnfc庫。

Libnfc庫下載地址

http://nfc-tools.org/index.php?title=Libnfc

Libnfc:configuration(接口配置)

http://nfc-tools.org/index.php?title=Libnfc:configuration

安裝文檔(使用libnfc-1.7.1.tar.bz2包能成功讀取到設備,github上clone的安裝找不到設備)

http://www.jamesrobertson.eu/blog/2016/feb/08/using-a-pn532-nfc-rfid-reader-with-the-raspberry-pi.html
在這裏插入圖片描述
安裝mfoc,mfcuk

https://github.com/nfc-tools/

git clone https://github.com/nfc-tools/mfoc.git

cd mfoc/

autoreconf -vis

./configure

make

make install

#mfoc -O test.mfd //使用默認key嘗試破解

#mfoc -f key.txt -O test.mfd //使用key字典

mfcuk -C -R 0:A -v 2

參考資料
http://blog.sina.com.cn/s/blog_9ed067ad0100z47e.html

http://blog.sina.com.cn/s/blog_683b6e4f0102vtfm.html

http://www.cnblogs.com/lubiao/p/4716965.html?ptvd

http://www.fuzzysecurity.com/tutorials/rfid/2.html

http://www.cs.ru.nl/~flaviog/publications/Attack.MIFARE.pdf

http://www.cs.ru.nl/~flaviog/publications/Dismantling.Mifare.pdf

http://www.cs.ru.nl/~flaviog/publications/Pickpocketing.Mifare.pdf在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章