起因
小區(qū)門禁卡補辦一張要50太貴了,經(jīng)過一番研究,發(fā)現(xiàn) pn532 這個東東,于是 pdd 上 48 包郵剁了一套有外殼的 pn532 讀卡器,還附送了 4 個漂亮的卡通版 cuid 空白卡。當然店家還有手機端的軟件跟注冊碼附送,如果有安卓機,直接手機上就能完成,可是我手里沒得安卓機,只能在我的macbook上試驗了,所以就有了下面的過程,記錄一下。

準備
PN532 讀卡器,typc 轉(zhuǎn) usb 接口線
門禁卡
空白的 cuid 卡
Macpro 13 寸電腦一臺:系統(tǒng)版本 Mac OS 11
安裝驅(qū)動
我購買的這個 pn532 采用的 usb 轉(zhuǎn)串口的調(diào)試芯片是沁恒的 ch340 芯片,所以去官網(wǎng)找到對應(yīng)的 macos 驅(qū)動http://www.wch.cn/download/CH341SER_MAC_ZIP.html,下載并安裝。
安裝完成過后,在控制臺輸入
ls /dev/tty*可以看到類似/dev/tty.wchusbserial1340的設(shè)備,則說明已經(jīng)被正確掛載了,如果沒有設(shè)備,安裝驅(qū)動包里相關(guān)教程進行設(shè)置。ch340模塊測試:如果手里有其他的 ch340 usb 轉(zhuǎn)串口模塊,只需要把模塊的 rxd 與 txd 短接,然后控制臺輸入
screen /dev/tty.wchusbserial1340隨便按幾下鍵盤看看是不是在屏幕上有返回 ,理論上是按什么返回什么說明模塊驅(qū)動安裝成功
工具庫安裝
如果要讀取門禁卡信息,需要安裝設(shè)備相關(guān)的工具庫依賴,需要 libusb ,libnfc 這兩個庫,嫌編譯安裝麻煩,我直接使用 Homebrew 安裝了。
這兩個安裝完成后,將 pn532 與 mac 連接好,門禁卡放上,然后控制臺輸入nfc-list,這時候如果不出意外,應(yīng)該能讀取到門禁卡的數(shù)據(jù)了。然而我的顯示如下
nfc-list uses libnfc 1.8.0
0 device(s) found
解決方案:
控制臺輸入 LIBNFC_LOG_LEVEL=3 nfc-list 可以列出日志信息,大致如下
info libnfc.config Unable to open file: /usr/opt/local/etc/nfc/libnfc.conf
debug libnfc.config Unable to open directory: /usr/opt/local/etc/nfc/devices.d
debug libnfc.general log_level is set to 3
debug libnfc.general allow_autoscan is set to true
debug libnfc.general allow_intrusive_scan is set to false
debug libnfc.general 0 device(s) defined by user
...
從日志中可以看到,相關(guān)的配置文件沒有找到,去對應(yīng)的位置添加配置文件和目錄即可
我們需要修改 libnfc 配置文件開啟自動掃描,否則將無法正確識別到 NFC 設(shè)備。libnfc.conf 配置信息如下,
allow_autoscan = true
allow_intrusive_scan = true
配置信息修改完成后,還需要添加 devices.d 目錄,同時還需要在該目錄下添加 pn532 設(shè)備的配置信息
新建目錄
sudo mkdir -p /usr/opt/local/etc/nfc/devices.d
然后在 devices.d 目錄下添加配置文件 mypn532.conf
name = "My_PN532"
connstring = pn532_uart:/dev/tty.wchusbserial1340
allow_intrusive_scan = true
添加完成后,再次運行nfc-list 就能正常讀取到我們的門禁卡信息了
nfc-list uses libnfc 1.8.0
NFC device: My_PN532 opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): 4a f1 5e da
SAK (SEL_RES): 08
可以看到我的門禁卡的 SAK 是 08,是可以被破解復(fù)制的,如果為 20 的話,可能下面的方案就不太適合了
讀取并復(fù)制卡信息
- 先使用 mfoc 工具進行破解。
mfoc(Mifare Classic Offline Cracker)是一款基于 nested authentication 驗證漏洞破解含有默認 key 的 M1 卡的開源軟件,mfoc 軟件自帶了一些常用的默認 key 來進行破解,用戶也可以通過參數(shù)添加自定義的 key。
安裝命令 brew install mfoc 安裝后執(zhí)行命令
sudo mfoc -O bak.mfd
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
* UID size: single
* bit frame anticollision supported
UID (NFCID1): 4a f1 5e da
SAK (SEL_RES): 08
* Not compliant with ISO/IEC 14443-4
* Not compliant with ISO/IEC 18092
Fingerprinting based on MIFARE type Identification Procedure:
* MIFARE Classic 1K
* MIFARE Plus (4 Byte UID or 4 Byte RID) 2K, Security level 1
* SmartMX with MIFARE 1K emulation
Other possible matches based on ATQA & SAK values:
Try to authenticate to all sectors with default keys...
Symbols: '.' no key found, '/' A key found, '\' B key found, 'x' both keys found
[Key: ffffffffffff] -> [................]
[Key: a0a1a2a3a4a5] -> [................]
[Key: d3f7d3f7d3f7] -> [................]
[Key: 000000000000] -> [................]
[Key: b0b1b2b3b4b5] -> [................]
[Key: 4d3a99c351dd] -> [................]
[Key: 1a982c7e459a] -> [................]
[Key: aabbccddeeff] -> [................]
[Key: 714c5c886e97] -> [................]
[Key: 587ee5f9350f] -> [................]
[Key: a0478cc39091] -> [................]
[Key: 533cb6c723f6] -> [................]
[Key: 8fd0a4f256e9] -> [................]
...
如果最后運行沒有報錯,那么 mfoc 就已經(jīng)成功備份出門禁的數(shù)據(jù) bak.mfd 了,使用寫卡命令直接將備份文件寫入新卡即可。
如果 mfoc 報錯,說明你的門禁卡并沒有使用這些默認 key,就需要使用 mfcuk 進行嘗試破解了。
- 使用 mcuk 破解
mfcuk (MiFare Classic Universal toolKit) 是一款基于 dackside 攻擊原理破解全加密 M1 卡的開源軟件,mfcuk 通過算法的漏洞破解出第一個 key,如果某個扇區(qū)的 key 被破解出來,就可以再使用 mfoc 工具使用 nested authentication 攻擊破解其他扇區(qū)的密碼。
安裝命令 brew install mfcuk安裝后執(zhí)行命令
sudo mfcuk -C -R 0:A -s 250 -S 250 -v 3
破解過程很久,運氣好的據(jù)說半個小時就能破解出第一個 key 控制臺如下顯示
INFO: block 4 recovered KEY: 3c5d7f1e
得到第一個 key 之后,我就可以跟退出 mfcuk ,通過獲取到的 key,使用 mfoc 進行再次解密
sudo mfoc -k 3c5d7f1e -O bak.mfd
如果 mfcuk 破解的第一個 key 是正確的,mfoc 命令一般會在幾分鐘之內(nèi)完成整個 M1 卡所有扇區(qū)的破解,最終將成功生成導(dǎo)出備份文件。
寫入新卡
使用 libnfc 軟件包自帶的 nfc-mfclassic 命令進行寫卡
nfc-mfclassic 的相關(guān)參數(shù)如下
nfc-mfclassic --help
Usage: nfc-mfclassic f|r|R|w|W a|b u|U<01ab23cd> <dump.mfd> [<keys.mfd> [f]]
f|r|R|w|W - Perform format (f) or read from (r) or unlocked read from (R) or write to (w) or unlocked write to (W) card
*** format will reset all keys to FFFFFFFFFFFF and all data to 00 and all ACLs to default
*** unlocked read does not require authentication and will reveal A and B keys
*** note that unlocked write will attempt to overwrite block 0 including UID
*** unlocking only works with special Mifare 1K cards (Chinese clones)
a|A|b|B - Use A or B keys for action; Halt on errors (a|b) or tolerate errors (A|B)
u|U - Use any (u) uid or supply a uid specifically as U01ab23cd.
<dump.mfd> - MiFare Dump (MFD) used to write (card to MFD) or (MFD to card)
<keys.mfd> - MiFare Dump (MFD) that contain the keys (optional)
f - Force using the keyfile even if UID does not match (optional)
Examples:
Read card to file, using key A:
nfc-mfclassic r a u mycard.mfd
Write file to blank card, using key A:
nfc-mfclassic w a u mycard.mfd
Write new data and/or keys to previously written card, using key A:
nfc-mfclassic w a u newdata.mfd mycard.mfd
Format/wipe card (note two passes required to ensure writes for all ACL cases):
nfc-mfclassic f A u dummy.mfd keyfile.mfd f
nfc-mfclassic f B u dummy.mfd keyfile.mfd f
Read card to file, using key A and uid 0x01 0xab 0x23 0xcd:
nfc-mfclassic r a U01ab23cd mycard.mfd
因為我購買的是 cuid 空白卡,所以我使用的寫卡命令為nfc-mfclassic w a u bak.mfd 然后就可以去試試新復(fù)制的卡了。
最后
可以看到使用的工具都是利用了m1卡的漏洞進行破解,所以一張門禁卡能不能復(fù)制就要看這個門禁卡有沒有漏洞,如果是最近一兩年才新加裝的門禁系統(tǒng),估計已經(jīng)沒有這些漏洞可以利用了。
參考文獻
http://www.itdecent.cn/p/7a0bf015e06c