Mifare 门禁卡复制

背景知识

市场情况

现在中国市面上主要有两种门禁卡:
一种叫ID卡,是早期的非接触式电子标签,工作频段在 125kHz,芯片中只记录了一个ID号,不可以存储任何数据卡,无需任何权限即可读取。由于太容易复制已经基本退出市场。
另一种叫 MIFARE Classic,又叫 M1 卡,是 NXP 半导体公司的产品,属于IC卡的一种,由于成本低廉也是目前在中国市场上使用最广泛的门禁卡技术,使用场景包括且不限于门禁卡,还有饭卡、水卡等。工作频段在 13.56MHz,符合 ISO/IEC 14443 Type A (国内二代身份证是 Type B)标准,有数据存储空间并可反复擦写数据,数据读写都需要密码验证。

安全问题

从 1994 年就面世的 MIFARE Classic 已经算的上是一个古老的产品,在 2008 年就已经被宣告能用普通 PC 在几分钟之内通过与读卡器通信破解出密钥,2009 年更是公布了仅需卡片的离线破解。NXP 官方也已经建议使用更安全的 MIFARE PlusMIFARE DESFire。有兴趣的朋友可以看看 Black Hat 上的 slides:Hacking Mifare Classic Cards

基本结构

MIFARE Classic 一般使用的是 MIFARE Classic 1K, 拥有 1024 bytes 的存储空间,划分为 16 个 sector。每个 sector 再划分为 4 个 block,其中的最后一个 block 用于设置A、B两个密钥和控制访问权限的 Access Bits。每张卡的第一个 block 用于存储厂商数据,包括卡片 ID(官方名称叫 UID,注意不要和后文的 UID 卡弄混)和类型信息,出厂之后就不允许修改。Wiki 上有直观的布局图:MiFare Byte Layout.png

准备操作

确认门禁卡类型

通过外观等方式并无法有效辨别 ID/IC 卡,它们可能有着相同的造型和大小。最简单有效的方式是用支持 NFC 的 Android 手机安装 NFC TagInfo by NXP(iOS 上有同名 App,但没用),打开 App 后把门卡贴手机背面中部或上部。不出意外的话,在 IC Info 里会显示 MIFARE Classic (EV1) (MF1S50)。如果显示其他内容,就是其他类型的门禁卡;如果干脆没有任何响应,有可能是低频的 ID 卡;后两者都不在本文讨论的范围内。

硬件准备

NFC 模块和 USB 转 TTL 模块

如果你和我一样是玩票性质的话,可以购买PN532 NFC RFID 模块 V3 和 「CH340 USB 转 TTL 模块」,两个加起来大概 30 多元,也是本文所使用的硬件。如果想省事可以选 ACR122U 这种一体式的成品,价格 100 元左右,卖家会提供配套软件。当然还有一步到位的选择 Proxmark3,支持高低频卡,可通过配套软件实现破解、嗅探、模拟、复制等功能,被誉为 RFID 界的瑞士军刀,300 元左右就能入手。(上述标注价格均为无法确认质量的淘宝一般售价)

UID 卡

不同的门禁验证的内容也不一样。

  1. 对于只验证卡片 ID 的门禁(最不安全,对于已 root 的 Android 机能通过修改系统配置文件来模拟卡片 ID),需要一个叫 UID 卡的国产的神奇卡片。这种产品是生产厂家并没有按照规范来固化卡片 ID,从而在出厂后还能重复修改卡片 ID,每张不到 1 元。
  2. 对于只验证卡片内容的门禁,使用 NFC 模块配套赠送的白卡就行了。
  3. 对于同时验证卡片 ID 和内容的门禁,也是使用 UID 卡片。
  4. 另外还有少数其它的门禁,可能需要用 CUID/FUID 卡才行,每张大概 1-2 元,本文不涵盖这种情况

购买备注

  1. 大多数商家出售的 PN532 是无焊接的,有的商家会提供免费焊接服务,请注意咨询。如果你买不到焊接好的,也可以自己买套焊具享受动手乐趣。当然了,你还可以选择使用包括双手在内的辅助方式稳定连接🙂。
  2. 购买 USB 转 TTL 模块时注意避免 PL 2303 HX 型号,该型号的早期版本 Rev A 由于山寨问题已经被官方在新版本驱动中封杀,无法在 Win10 系统中自动安装驱动使用。如果你不幸购买到了此(山寨)版本,请使用1.5.0 (2011-10-21) 版本的驱动包或者询问卖家索取。
  3. 由于一般无法事先确认门禁类型,建议在购买 NFC 模块时一并购买 UID/CUID/FUID 卡。如果买 NFC 模块的店铺恰好没有 UID 卡,也可以先测试复制卡片内容失败后,再单独购买(淘宝上有 0.8 元包邮的 UID 卡🤔)。

软件准备

  • Windows 10 启用 WSL 后从商店安装 Kali Linux,用 apt 命令从源里安装 libnfc-binlibnfc-examples。如果碰到加密卡,还需要安装 mfocmfcuk
  • 其他 Linux 基本同上,不过源里可能没有 mfocmfcuk,需要自行下载源码编译。具体编译过程请参考官方 GitHub( mfocmfcuk),本文不再复述。Arch 用户可直接从 AUR 安装 libnfc-git mfoc-git mfcuk-git 啦。
  • Mac 用 brew 安装 libnfc mfoc mfcuk

操作步骤

我原本打算用 Linux 来操作的,上网一搜发现 WSL 绝赞的支持映射串口。所以本文以 PN532 + Windows 10 + WSL + Kali Linux为主,其他操作环境请注意变通。

连接 NFC 模块

用附带的杜邦线连接 NFC 模块和 USB 转 TTL 模块/线。注意不要接错了,否则通电后可能会烧毁芯片。

PN532USB 转 TTL 模块USB 转 TTL 线
GNDGND黑色
VCC5.0V红色
TXD/SDARXD白色
RXD/SCLTXD绿色

打开“设备管理器”,将 USB 插上电脑,等待 Windows 自动安装驱动。(PL 2303 HXA 注意先安装老版本驱动再插入 USB 模块)。驱动安装完成后,在“端口”里找到 USB 转 TTL 模块的端口号,例如 COM3

修改 /etc/nfc/libnfc.conf,在文件末尾加入:

allow_autoscan = false
device.name = "PN532"
device.connstring = "pn532_uart:/dev/ttyS3" #Linux 下为 /dev/ttyUSB0

执行 nfc-scan-device -v(需要 sudo,后文略) 确认 NFC 模块能正常识别。正常输出如下:

nfc-scan-device uses libnfc 1.7.1
1 NFC device(s) found:
- pn532_uart:/dev/ttyS3:
    pn532_uart:/dev/ttyS3
chip: PN532 v1.6
initator mode modulations: ISO/IEC 14443A (106 kbps), FeliCa (424 kbps, 212 kbps), ISO/IEC 14443-4B (106 kbps), Innovision Jewel (106 kbps), D.E.P. (424 kbps, 212 kbps, 106 kbps)
target mode modulations: ISO/IEC 14443A (106 kbps), FeliCa (424 kbps, 212 kbps), D.E.P. (424 kbps, 212 kbps, 106 kbps)

Dump 卡片

卡片基本信息

执行 nfc-poll,将门禁卡在 NFC 模块上贴一下,可以看到卡片信息输出如下:

nfc-poll uses libnfc 1.7.1
NFC reader: pn532_uart:/dev/ttyS3 opened
NFC device will poll during 30000 ms (20 pollings of 300 ms for 5 modulations)
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04
       UID (NFCID1): 01  23  45  67
      SAK (SEL_RES): 08
nfc_initiator_target_is_present: Target Released
Waiting for card removing...done.

从上可以看到卡片 ID 为 01 23 45 67,ATQA 为 00 04,SAK 为 08。如果 ATQA 和 SAK 不是这两个值,则门卡可能是其他类型,很有可能无法复制。

无密码卡

现在将卡放在 NFC 模块上,并执行 nfc-mfclassic r a dump.mfd 尝试无密码复制卡片数据,成功的输出如下:

NFC reader: pn532_uart:/dev/ttyS3 opened
Found MIFARE Classic card:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04
       UID (NFCID1): 01  23  45  67
      SAK (SEL_RES): 08
Guessing size: seems to be a 1024-byte card
Reading out 64 blocks |................................................................|
Done, 64 of 64 blocks read.
Writing data to file: dump.mfd ...Done.

如果能成功复制出所有数据,这就意味着卡片是没有任何密码保护的。
我们再用 xxd dump.mfd 确认下卡片内容。
如果除了前4行,其他的内容都和下面类似,则门禁可能是只校验卡片 ID 的低级门禁。

00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000070: ffff ffff ffff ff07 8069 0000 0000 0000  .........i......

部分加密卡

如果卡片有加密没法读出,我们就需要用到 mfoc 工具来尝试破解密钥了。它利用了在 2009 年研究出来的 offline nested attack,可以在拥有任意 sector 密码的情况下,猜解出其他 sector 的密码。如果卡片不是完全加密,仅需要几分钟就可以猜解出密钥。
我们执行 mfoc -O dump.mfd 开始破解,如果成功的话会提示以下内容,并将卡片内容和密钥一同显示出来。

Auth with all sectors succeeded, dumping keys to a file!

完全加密卡

如果门禁卡是全加密卡,上面使用 mfoc 就会有失败提示:

No sector encrypted with the default key has been found, exiting..

这时我们就需要用到 mfcuk 了。它利用了同样是 2009 年研究出的 Dark Side attack,利用认证协议上的漏洞来猜解密码,可能需要一个小时才能破解出密钥。当拿到其中一个密钥之后,就可以可上面部分加密卡一样,使用 mfoc 工具猜解其它的密钥。
先执行 mfcuk -C -R 0:A -s 250 -S 250,然后就是漫长的等待。当输出如下内容时,表示破解成功:

INFO: block 3 recovered KEY: 123456789ABC

将拿到的 Key 传给 mfoc,执行 mfoc -k 123456789ABC -O dump.mfd,就可破解出完整的卡片数据。

写入卡片

UID 卡放在 NFC 模块上,执行 nfc-mfclassic W a dump.mfd 即可写入卡片 ID 和卡片数据。参数中的 W 表示同时写入 ID 号(需要 UID 系列卡片),也可以用 w 仅写入卡片内容。如果手头没有 UID 卡,可以仅写入卡片内容试试看是不是仅校验卡内容的门禁。等数据写入成功后就可以拿着去测试啦~

小米手环3 模拟加密门禁卡

大致原理,先用将包含卡片 ID 的 block 0 写入到空白 UID 卡上,给手环复制。再写入加密卡片内容的其它部分到手环。
但需要注意的是,小米手环只模拟了 block 0 的卡号部分,而厂商代码是固定值且不可修改,所以碰到检查卡号和厂商的门禁就没用了。
占坑,等有手环了再说。 就当作课后习题留给大家自行尝试吧。

标签:NFC

已有 10 条评论

  1. 啊,我博客的主题已经这么不堪用了嘛,这糟糕的排版。
    是时候再写(挖)个(坑)新主题了。

    1. xiaoxie xiaoxie

      这是默认主题啊,还好

      1. 我是觉得之前的不堪用,所以现在换成了默认的😂

  2. sanbrother sanbrother

    感谢您的文章、我实践了、做出了全加密卡的模拟、并且做了教程、要不要试试啊?

    http://bbs.xiaomi.cn/t-34469927

  3. 所以最后是没有买小米手环3么(逃

  4. bubo fling bubo fling

    围观大佬的博客 .
    改天给大门换一套新锁具 .

  5. Morris Morris

    感谢大大无私分享,期待更多学习笔记!

  6. aachuanga aachuanga

    大佬,我想问一下,我买的白卡sak是88,而我复制的卡sak为08,能不能修改SAK,如何修改?

    1. 如果是 UID 系列的卡,这里的值是可以修改的。直接用 Dump 出来的文件写入即可。

  7. [...]https://blog.czbix.com/clone-MIFARE-Classic-card.html[...]

添加新评论