---
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

## Mifare Memory Structure

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:儲存驗證資訊

每個驗證資訊區塊(通常稱為 Sector Trailer)包含:
- **Key A(6 Bytes)**:通常用來讀取或寫入資料
- **存取控制位元(3 Bytes)**:控制每個 Block 可允許的操作(讀取、寫入、遞增/遞減等)
- **未使用保留位元(1 Byte)**:通常固定為 0x69 或 0x00
- **Key B(6 Bytes)**:可用於額外驗證,或設計成僅能寫入、不允許讀取

## 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)