zhangguanzhang's Blog

nfc 折腾笔记,ACR122U/proxmark3

字数统计: 3.1k阅读时长: 14 min
2022/04/23

近期折腾 nfc 相关,以后 nfc 的折腾也会更新在这个文章内

由来

以前买过 ACR122U ,想着帮人门禁解密导入手环挣点外快,没想到弄不开,然后群友送了个 proxmark3(pm3)我,折腾了下,做个笔记

折腾

卡片

卡片介绍,通常分为 IC 卡和 ID 卡:

  1. ID 卡一般低频,不可写入数据,只读卡号,还有 HID 卡(一些大厂工牌),卡表明有编号,里面一般是圆形线圈。
  2. IC 卡高频,大部分可以擦写,银行,交通,门禁,饭卡,工牌之类都用使用。RFID、NFC 属于 IC 卡,线圈一般是矩形。IC 卡我们破解啥的一般是下面几种类型相关:
类型 说明 频率 擦写情况
M1 NXP Mifare系列卡, 工作在高频(13.56Mhz),全称Mifare S50,是最常见的卡,出厂固化UID 13.56Mhz UID 部分不可擦写
M0 相当于M1卡的精简版,容量更小、功能更少,但价格更低 13.56Mhz UID 部分不可擦写
UID 全称Mifare UID Chinese magic card,国外叫做中国魔术卡,M1卡的变异版本,使用后门指令(magic指令),可修改UID(UID在block0分区),可以用来完整克隆M1卡的数据;但是现在新的读卡系统通过检测卡片对后门指令的回应,可以检测出UID卡,因此可以来拒绝UID卡的访问,来达到屏蔽复制卡的功能(即UID防火墙系统); 13.56Mhz UID 部分可擦写
CUID 为了避开UID防火墙系统,CUID卡应运而生,取消响应后门指令(magic指令),可修改UID,是目前市场上最常用的复制卡;但是现在貌似也有 CUID 卡的防火墙 13.56Mhz UID 部分可擦写
FUID FUID卡只能写一次UID,写完之后自动固化UID所在分区,就等同M1卡,目前任何防火墙系统都无法屏蔽,复制的卡几乎和原卡一模一样; 13.56Mhz 可擦写一次
UFUID 集UID卡和FUID卡的优点于一身,使用后门指令,可修改UID,再手动锁卡,变成M1卡。可先反复读写UID,确认数据无误,手动锁卡变成M1,解决了UID卡的UID防火墙屏蔽,也解决FUID的一次性写入容易写错的问题,且价格比FUID卡还便宜; 13.56Mhz 可擦写一次

判断是 M0卡(Mifare UltraLight),还是 M1卡(Mifare Classic 1k),可以通过 SAK 值判断。

产品 ATQA SAK UID长度
Mifare Mini 00 04 09 4 bytes
Mifare Classic 1k 00 04 08 4 bytes
Mifare Classic 4k 00 02 18 4 bytes
Mifare Ultraligh 00 44 00 4 bytes写
Mifare Plus 00 44 20 4 bytes

SAK 为 20 的是 CPU 模拟卡,基本无解,还有种 SAK 是 28的,是带 M1 数据的 cpu 模拟卡,只能读取 M1 的数据部分,不一定能模拟成功。

卡片数据存储介绍

M1(Mifare classic 1K) 卡片,即存储容量 1K = 1024Byte,有 16 个扇区,每个扇区有 4 个块,每个块 16 个字节:

1
2
3
4
5
6
7
8
9
10
11
0 扇区
0区块:00000000000000000000000000000000
1区块:00000000000000000000000000000000
2区块:00000000000000000000000000000000
3区块:FFFFFFFFFFFFFF078069FFFFFFFFFFFF

1 扇区
0区块:00000000000000000000000000000000
1区块:00000000000000000000000000000000
2区块:00000000000000000000000000000000
3区块:FFFFFFFFFFFFFF078069FFFFFFFFFFFF
  1. 0 扇区的 0 区块出厂赋予的,前 4 个字节是 UID,第 5 个字节是 UID,第 6 个字节是 SAK,包括后面的一起是厂商码,所有卡片的厂商码都无法修改。
  2. 除了 0 扇区以外,每个扇区的块0、块1、块2 为数据块,可用于存储数据。
  3. 每个扇区的块3为控制块,包括密码keyA,存取控制,密码keyB。存取控制的作用是控制对应扇区记录的读写权限与keyA和keyB的关系。由于每个扇区都有独立的key和存取控制,因此M1卡可以做到一卡多用互不干扰。

更多详情见 NFC手机模拟加密门禁卡 里的基础知识。

ACR122U

Linux 下面有个复制脚本,nfc-clone

1
apt-get install -y mfoc  libnfc-bin libnfc-bin libnfc-examples

ACR122U 上面的命令就可以驱动了:

1
2
3
4
5
6
7
8
$ nfc-list
nfc-list uses libnfc 1.7.1
error libnfc.driver.acr122_usb Unable to claim USB interface (Device or resource busy)
nfc-list: ERROR: Unable to open NFC device: acr122_usb:001:015
$ lsmod | grep pn533
pn533_usb 20480 0
pn533 36864 1 pn533_usb
nfc 110592 1 pn533

上面报错参考 nfc-tools/libnfc 解决:

1
2
3
4
5
6
7
8
$ cat > /etc/modprobe.d/blacklist-libnfc.conf
blacklist nfc
blacklist pn533
blacklist pn533_usb
$ sudo modprobe -rf pn533_usb
$ nfc-list
nfc-list uses libnfc 1.7.1
NFC device: ACS / ACR122U PICC Interface opened

读卡:

1
2
3
4
5
6
7
8
9
$ nfc-list
nfc-list uses libnfc 1.7.1
NFC device: ACS / ACR122U PICC Interface opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): xx xx 0f 7d
SAK (SEL_RES): 28
ATS: 78 80 90 02 20 90 00 00 00 00 00 xx xx 0f 7d

更多参考上面的脚本。

pm3

固件编译

官方固件仓库没看到更新,有名的就是 iceman(冰人)的 RfidResearchGroup/proxmark3

我是在我的 r2s 上用 docker 起特权容器玩的,apt 系列系统 ldd --version 看看 glibc 版本,大于等于 2.27,推荐起 ubuntu:18.04 容器编译:

1
2
3
4
5
6
7
8
# Linux系统中可能存在ModemManager,从而干扰系统和proxmark3的通信。
apt remove modemmanager
# 获取关闭
sudo systemctl stop ModemManager
sudo systemctl disable ModemManager

git clone https://github.com/RfidResearchGroup/proxmark3
docker run --name t1 --restart always -tid --privileged -v $PWD/proxmark3:/opt/proxmark3 -w /opt/proxmark3 ubuntu:18.04

开始编译的依赖:

1
2
3
if [ -f /etc/apt/sources.list ];then sed -ri 's/(deb|security|archive|ports).(debian.org|ubuntu.com)/mirrors.aliyun.com/g' /etc/apt/sources.list; fi && \
apt-get update && \
DEBIAN_FRONTEND=noninteractive apt install gcc g++ make autoconf pkg-config cmake git libbz2-dev libreadline-dev gcc-arm-none-eabi libssl-dev usbutils -y

编译之前看下 Makefile.platform.sample ,代码里默认是 pm3 rdv4 版本,就是 1k 多元带蓝牙的版本,我们一般是 pm3 GENERIC(右侧一个按钮,中间一个 usb 口,线圈内就 LF Antenna/Rreq: 125kHZ的版本),所以编译命令为:

1
2
3
make all PLATFORM=PM3GENERIC
# 单独编译客户端的话
# make client

我的 openwrt 能用是因为有很多模块,例如下面的:

1
2
3
4
5
6
7
8
9
10
11
12
$ opkg list-installed | grep -P 'cdc-|usb-'
kmod-usb-acm - 5.10.102-1
kmod-usb-core - 5.10.102-1
kmod-usb-net - 5.10.102-1
kmod-usb-net-cdc-eem - 5.10.102-1
kmod-usb-net-cdc-ether - 5.10.102-1
kmod-usb-net-cdc-ncm - 5.10.102-1
kmod-usb-net-rtl8152 - 5.10.102-1
kmod-usb-storage - 5.10.102-1
kmod-usb-storage-extras - 5.10.102-1
kmod-usb-storage-uas - 5.10.102-1
libusb-1.0-0 - 1.0.24-5

后续手机想操作 pm3 最好看下手机编译了 usb-acm 没,一般的官方 rom 都不会开这个的。

pm3 操作

pm3 无论啥时候插入 linux,dmesg 里都有下面信息:

1
2
[862180.046239] usb 2-1: USB disconnect, device number 3
[863606.280680] cdc_acm 2-1:1.0: ttyACM0: USB ACM device

ttyACM0 才是对的,否则就是你 Linux 没 USB-ACM 相关模块,有了后会多出一个字符设备 /dev/ttyACM0

刷写固件

上面的 make all 会编译固件和 client。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
./pm3-flash-fullimage 
[=] Session log /root/.proxmark3/logs/log_20220420.txt
[+] About to use the following file:
[+] /opt/proxmark3/client/../armsrc/obj/fullimage.elf
[+] Loading ELF file /opt/proxmark3/client/../armsrc/obj/fullimage.elf
[+] ELF file version Iceman/master/v4.14831-551-gda81c6806 2022-04-20 20:23:34 617717b0d

[+] Waiting for Proxmark3 to appear on /dev/ttyACM0
🕑 59 found
[+] Entering bootloader...
[+] (Press and release the button only to abort)
[+] Waiting for Proxmark3 to appear on /dev/ttyACM0
🕔 58 found
[=] Available memory on this board: 512K bytes

[=] Permitted flash range: 0x00102000-0x00180000
[+] Loading usable ELF segments:
[+] 1: V 0x00102000 P 0x00102000 (0x0004e974->0x0004e974) [R X] @0xb8
[+] 2: V 0x00200000 P 0x00150974 (0x00001ba1->0x00001ba1) [R X] @0x4ea30
[=] Note: Extending previous segment from 0x4e974 to 0x50515 bytes

[+] Flashing...
[+] Writing segments for file: /opt/proxmark3/client/../armsrc/obj/fullimage.elf
[+] 0x00102000..0x00152514 [0x50515 / 643 blocks]
...................................................................
@@@ @@@@@@@ @@@@@@@@ @@@@@@@@@@ @@@@@@ @@@ @@@
@@! !@@ @@! @@! @@! @@! @@! @@@ @@!@!@@@
!!@ !@! @!!!:! @!! !!@ @!@ @!@!@!@! @!@@!!@!
!!: :!! !!: !!: !!: !!: !!! !!: !!!
: :: :: : : :: ::: : : : : : :: :
. .. .. . . .. ... . . . . . .. .
...................................................................
...................................................................
...................................................................... ok

[+] All done

[=] Have a nice day!

连接 pm3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
$ ./pm3 --list
1: /dev/ttyACM0

$ ./client/proxmark3 /dev/ttyACM0
[=] Session log /root/.proxmark3/logs/log_20220420.txt
[+] loaded from JSON file /root/.proxmark3/preferences.json
[=] Using UART port /dev/ttyACM0
[=] Communicating with PM3 over USB-CDC


8888888b. 888b d888 .d8888b.
888 Y88b 8888b d8888 d88P Y88b
888 888 88888b.d88888 .d88P
888 d88P 888Y88888P888 8888"
8888888P" 888 Y888P 888 "Y8b.
888 888 Y8P 888 888 888
888 888 " 888 Y88b d88P
888 888 888 "Y8888P" [ ❄️ ]


[ Proxmark3 RFID instrument ]

MCU....... AT91SAM7S512 Rev B
Memory.... 512 Kb ( 58% used )

Client.... Iceman/master/v4.14831-551-gda81c6806 2022-04-20 22:00:05
Bootrom... Iceman/master/v4.14831-551-gda81c6806 2022-04-20 22:02:34
OS........ Iceman/master/v4.14831-551-gda81c6806 2022-04-20 22:04:23
Target.... PM3 GENERIC


[usb] pm3 --> hw version

[ Proxmark3 RFID instrument ]

[ CLIENT ]
Iceman/master/v4.14831-551-gda81c6806 2022-04-20 22:00:05 617717b0d
compiled with............. GCC 9.4.0
platform.................. Linux / aarch64
Readline support.......... present
QT GUI support............ absent
native BT support......... absent
Python script support..... absent
Lua SWIG support.......... present
Python SWIG support....... absent

[ PROXMARK3 ]
firmware.................. PM3 GENERIC

[ ARM ]
bootrom: Iceman/master/v4.14831-551-gda81c6806 2022-04-20 22:02:34 617717b0d
os: Iceman/master/v4.14831-551-gda81c6806 2022-04-20 22:04:23 617717b0d
compiled with GCC 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599]

[ FPGA ]
LF image 2s30vq100 2022-03-23 17:21:05
HF image 2s30vq100 2022-03-23 17:21:16
HF FeliCa image 2s30vq100 2022-03-23 17:21:27
HF 15 image 2s30vq100 2022-03-23 17:21:38

[ Hardware ]
--= uC: AT91SAM7S512 Rev B
--= Embedded Processor: ARM7TDMI
--= Internal SRAM size: 64K bytes
--= Architecture identifier: AT91SAM7Sxx Series
--= Embedded flash memory 512K bytes ( 58% used )

[usb] pm3 --> hw status
[#] Memory
[#] BigBuf_size............. 42760
[#] Available memory........ 42760
[#] Tracing
[#] tracing ................ 1
[#] traceLen ............... 0
[#] Current FPGA image
[#] mode.................... HF image 2s30vq100 2022-03-23 17:21:16
[#] LF Sampling config
[#] [q] divisor............. 95 ( 125.00 kHz )
[#] [b] bits per sample..... 8
[#] [d] decimation.......... 1
[#] [a] averaging........... yes
[#] [t] trigger threshold... 0
[#] [s] samples to skip..... 0
[#]
[#] LF T55XX config
[#] [r] [a] [b] [c] [d] [e] [f] [g]
[#] mode |start|write|write|write| read|write|write
[#] | gap | gap | 0 | 1 | gap | 2 | 3
[#] ---------------------------+-----+-----+-----+-----+-----+-----+------
[#] fixed bit length (default) | 31 | 20 | 18 | 50 | 15 | N/A | N/A |
[#] long leading reference | 31 | 20 | 18 | 50 | 15 | N/A | N/A |
[#] leading zero | 31 | 20 | 18 | 40 | 15 | N/A | N/A |
[#] 1 of 4 coding reference | 31 | 20 | 18 | 34 | 15 | 50 | 66 |
[#]
[#] HF 14a config
[#] [a] Anticol override.... std ( follow standard )
[#] [b] BCC override........ std ( follow standard )
[#] [2] CL2 override........ std ( follow standard )
[#] [3] CL3 override........ std ( follow standard )
[#] [r] RATS override....... std ( follow standard )
[#] Transfer Speed
[#] Sending packets to client...
[#] Time elapsed................... 500ms
[#] Bytes transferred.............. 295424
[#] Transfer Speed PM3 -> Client... 590848 bytes/s
[#] Various
[#] Max stack usage......... 4088 / 8480 bytes
[#] Debug log level......... 1 ( error )
[#] ToSendMax............... -1
[#] ToSend BUFFERSIZE....... 2308
[#] Slow clock.............. 30644 Hz
[#] Installed StandAlone Mode
[#] LF HID26 standalone - aka SamyRun (Samy Kamkar)
[#]

pm3 的操作
基础操作

上面连接后,进入到一个交互,交互里输入命令就行了,有点类似交换机和单片机里的 AT 指令,可以 help 查看命令,查看命令的帮助就 命令 --help命令 子命令 --help 依次类推,你搜到的很多文章都是老命令,根据固件里实际来。

lfhf 对应低频和高频命令,例如我们扫描 M1 卡片:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[usb] pm3 --> hf search
?? Searching for ISO14443-A tag...
[+] UID: XX XX 0F 7D
[+] ATQA: 00 04
[+] SAK: 28 [1]
[+] Possible types:
[+] SmartMX with MIFARE Classic 1K
[=] -------------------------- ATS --------------------------
[+] ATS: 10 78 80 90 02 20 90 00 00 00 00 00 XX XX 0F 7D [ ED 00 ]
[=] 10............... TL length is 16 bytes
[=] 78............ T0 TA1 is present, TB1 is present, TC1 is present, FSCI is 8 (FSC = 256)
[=] 80......... TA1 different divisors are NOT supported, DR: [], DS: []
[=] 90...... TB1 SFGI = 0 (SFGT = (not needed) 0/fc), FWI = 9 (FWT = 2097152/fc)
[=] 02... TC1 NAD is NOT supported, CID is supported

[=] -------------------- Historical bytes --------------------
[+] 20900000000000XXXX0F7D

[+] Prng detection: weak
[#] Auth error
[?] Hint: try `hf mf` commands


[+] Valid ISO 14443-A tag found

[=] Short AID search:
[?] Hint: try emv commands
嗅探

主要利用 sniff 命令嗅探,比如常见的 14a 卡片:

1
2
3
4
[usb] pm3 --> hf 14a sniff

[#] Starting to sniff。 Press PM3 Button to stop.

然后保持上电,拿去刷卡,pm3刷卡设备 ,多刷几下,等 pm3 两个灯交叉闪烁后常亮,按下 Button 按钮,pm3 客户端会显示:

1
[#] trace len = xxxx

此刻赶紧保存下:

1
2
[usb] pm3 --> data save -f xxx

分析:

1
[usb] pm3 --> trace list -t 14a

运气好能分析到 PWD-AUTH KEY ,然后破解,参考 【PM3】重置小米空气净化器滤芯。运气不好就无法嗅探。

破解的一些说明

  1. 把卡片解密后 dump 出来,dump 的数据是没加密的,再写入白卡,手机或者手环再读取白卡模拟
  2. 设备可以读取 dump 数据写入手机的 nfc 卡片里,但是最好不要这样做,很多手机的 nfc 是单独一块电路,不跟随刷机恢复出厂设置的,读写可能会损坏 nfc 相关硬件只有换主板了。
  3. 有些门禁设备是还校验厂商码的,这种就放弃吧,手机模拟白卡不会让写厂商码的,涉及到法律问题。
  4. 有些公司的 oa 软件支持添加电子工牌,实际添加行为是 oa 软件里点了添加后会给手机的钱包-nfc 添加一张模拟卡片,这个卡片是 cpu 模拟卡,SAK 显示 20,说明门禁联网的。

其他补充

  1. windows 我有安装串口驱动,但是下的 client 和 GUI 都无法通过 COM 口连上 pm3 ,进安全模式安装 官方的驱动 也不行。尝试过串口软件打开 com 口,看源码是 baud=115200 parity=N data=8 stop=1,但是还是不行
  2. 安卓客户端 AndProx/AndProx 因为我手机内核编译没开 USB_ACM 导致无法使用,termux 同样。
  3. 多看看 官方的 README.md

也有离线嗅探固件,我就不折腾了。

参考

CATALOG
  1. 1. 由来
  2. 2. 折腾
    1. 2.1. 卡片
    2. 2.2. 卡片数据存储介绍
    3. 2.3. ACR122U
    4. 2.4. pm3
      1. 2.4.1. 固件编译
      2. 2.4.2. pm3 操作
        1. 2.4.2.1. 刷写固件
        2. 2.4.2.2. pm3 的操作
          1. 2.4.2.2.1. 基础操作
          2. 2.4.2.2.2. 嗅探
    5. 2.5. 破解的一些说明
    6. 2.6. 其他补充
  3. 3. 参考