---
# System prepended metadata

title: 114 社團博覽會 門禁卡挑戰
tags: [RFID, 社團博覽會, Mifare Classic]

---

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