--- title: 114 社團博覽會 門禁卡挑戰 tags: - 社團博覽會 - RFID - Mifare Classic --- ## 挑戰說明 你是一名滲透測試工程師,這次公司委派你來執行社交工程演練。你因緣際會下拿到了一張高權限的門禁卡,發現是臭名昭彰的 Mifare Classic 型號的卡片。心想:「天啊!這不就是白給的免費 KPI 嗎?」。 你將要複製一張門禁卡,嘗試突破社辦的門禁機制。 ## 複製門禁卡 一般而言,門禁系統主要依靠卡片的 **UID(唯一識別碼)** 進行身分認證。 - **普通門禁卡**:UID 是固定的,無法更改。 - **中國製「魔術卡」**:可修改 UID,因此出現了偽造與複製的可能。 - **常見的白卡**:ID 卡、CUID Gen 2。 :::info ※ 企鵝白卡是 CUID Gen 2 ::: ### 複製門禁卡的基本流程 1. **讀取原卡 UID** 使用以下指令讀取欲複製卡片的 UID,並記錄下來: ```bash hf mf info ``` 2. **讀取白卡 Block 0** 對空白卡進行讀取,並保存 Block 0 的資料: ```bash hf mf rdbl --blk 0 ``` 3. **修改白卡資料** 將 Block 0 的前 5 Bytes(4 Bytes UID + 1 Byte BCC)修改為原卡 UID 與對應 BCC 值。 - 範例: - 原卡 UID = `DE AD BE EF`, BCC = `22` - 修改後資料: ``` deadbeef220804006263646566676869 < uid ><><>< >< manufacture > ``` 4. **寫入修改後的資料** 將更新過的 Block 0 資料重新寫入白卡: ```bash hf mf wrbl --blk 0 -k ffffffffffff -d deadbeef220804006263646566676869 --force hf mf wrbl --blk 0 -k <key A> -d <data> --force ``` ## Mifare ![](https://swf.com.tw/images/books/arduino/RFID/RFID_principle.png) ## Mifare Memory Structure ![圖片](https://hackmd.io/_uploads/H1L_08rqxx.png) BCC 一定要算對,算錯的話 CUID Gen2 就會鎖卡。 $$ \text{BCC} = \text{UID}[0] \oplus \text{UID}[1] \oplus \text{UID}[2] \oplus \text{UID}[3] $$ 線上計算機:https://nric.biz/mifare-bcc-generator.php Mifare 類型的門禁卡記憶體由 sector(區段)與 block(區塊)組成。 - 一張卡片包含 16 個 sector(編號 0 ~ 15) - 每個 sector 包含 4 個 block(編號 0 ~ 3) **Sector 與 Block 的配置** - **Sector 0(特殊)** - Block 0:卡片製造資訊(包含 UID 與其他資料) - Block 1、2:可存放使用者資料 - Block 3:儲存驗證資訊(A/B Key 與控制位元) - **Sector 1 ~ 15** - Block 0、1、2:可存放使用者資料 - Block 3:儲存驗證資訊 ![](https://swf.com.tw/images/books/arduino/RFID/mifare_memorry_map.png) 每個驗證資訊區塊(通常稱為 Sector Trailer)包含: - **Key A(6 Bytes)**:通常用來讀取或寫入資料 - **存取控制位元(3 Bytes)**:控制每個 Block 可允許的操作(讀取、寫入、遞增/遞減等) - **未使用保留位元(1 Byte)**:通常固定為 0x69 或 0x00 - **Key B(6 Bytes)**:可用於額外驗證,或設計成僅能寫入、不允許讀取 ![](https://swf.com.tw/images/books/arduino/RFID/access_key.png) ## Proxmark3 常用指令說明 ### 自動偵測卡片類型 ```shell auto ``` ### 指令結構 ```shell hf mf <子指令> ``` * **hf**:high frequency(高頻,13.56 MHz) * **mf**:mifare(針對 Mifare 系列卡片) ### `hf mf` 子指令列表 * `info`:顯示卡片基本資訊 * `chk`:檢查金鑰(驗證是否能讀取指定 sector/block) * `rdbl`:讀取單一 block 的資料 * `wrbl`:寫入單一 block 的資料 * `rdsc`:讀取整個 sector 的資料 ### 範例 讀取 Block 0 的資料 ```shell hf mf rdbl --blk 0 -k ffffffffffff ``` 讀取 Sector 0 的資料 ```shell hf mf rdsc -s 0 -k ffffffffffff ``` 將 Block 0 寫入全 `00` ```shell hf mf wrbl --blk 0 -k ffffffffffff -d 00000000000000000000000000000000 ``` 修改卡片 UID(覆寫 Block 0) ```shell hf mf wrbl --blk 0 -k ffffffffffff -d deadbeef220804006263646566676869 ``` ## 參考資料 - [Mifare RFID-RC522模組實驗(一):讀取Mifare RFID卡的UID識別碼](https://swf.com.tw/?p=930) - [Mifare RFID-RC522模組實驗(二):C語言的結構(struct)與類型定義(typedef)說明](https://swf.com.tw/?p=936) - [Mifare RFID-RC522模組實驗(三):讀取與寫入資料](https://swf.com.tw/?p=941) - [Mifare RFID-RC522模組實驗(四):Mifare RFID的門禁系統實驗](https://swf.com.tw/?p=1027) - [SITCON 2021:RFID 硬體資安實戰](https://docs.google.com/presentation/d/1lkqBsTXZg8GDRcJM7XvAXn7BACtiFTur/edit?slide=id.p1#slide=id.p1) - [MIFARE Classic EV1 spec](https://www.nxp.com/docs/en/data-sheet/MF1S50YYX_V1.pdf) - [proxmark3:Iceman fork](https://github.com/RfidResearchGroup/proxmark3) - [NFC 資安實戰 - 興大資訊社社課](https://taichunmin.idv.tw/blog/2022-12-12-nchuit-nfc.html) - [Arduino MFRC522 写Cuid ](https://blog.nnwk.net/article/115) - [Study of vulnerabilities in MIFARE Classic cards](https://www.sidechannel.blog/en/mifare-classic-2/) - [HITCON2010 - MIFARE Classic:Completely Broken](https://hitcon.org/download/2010/11_MIFARE%20Classic%20IS%20Completely%20Broken.pdf) - [Hacking Mifare Classic Cards](https://www.blackhat.com/docs/sp-14/materials/arsenal/sp-14-Almeida-Hacking-MIFARE-Classic-Cards-Slides.pdf)