首页
论坛
专栏
课程

[原创]从NFC卡破解分析看ACR122U读写原理

2018-7-29 09:47 14819

[原创]从NFC卡破解分析看ACR122U读写原理

2018-7-29 09:47
14819

       本文介绍一个NFC卡简单破解的全部流程,并对破解过程中的读写原理进行探讨。在逆向分析中,我们会接触多种多样的工具,在使用工具的同时,希望大家思考一下原理,便于更深入的进行了解和学习。

注:本文内容仅做技术研究,请勿用于非法用途,否则后果自负

目录:

        0x1.工具及卡片介绍

        0x2.卡片信息读取

        0x3.卡片数据分析及修改

        0x4.卡片信息写入


接下来步入正题,先从背景介绍开始。之前购得ACR122U之后闲置了一段时间,最近办理了一张餐饮消费会员卡,于是忍不住拿来分析一下。


0x1.工具及卡片介绍

先说一下会员卡,该卡片是M1卡。

所谓的M1芯片,是指菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号,截止到2013年11月4日,已经有国产芯片与其兼容,利用PVC封装M1芯片、感应天线,然后压制成型后而制作的卡即是智能卡行业所说的M1卡。



工具是读写器硬件设备ACR122U以及配套的用于读写的PC软件。

    ACR122U NFC读写器是一款基于13.56 MHz非接触(RFID)技术开发出来的连机非接触式智能卡读写器。它符合ISO/IEC18092近场通信(NFC)标准,支持Mifare®卡、ISO 14443 A类和B类卡、以及全部四种NFC标签。

为了确定该读写器的主芯片,将其拆解,确认读写的主芯片为NXP(恩智浦)的PN532:




0x2.卡片信息读取

    0x2.1  卡片信息读取

该设备的提供的读取程序为M1卡服务程序:



电脑安装驱动以后,连接读卡器,卡片靠近读卡器,选择读卡器后,点击开始破解,即可等待破解完成。完成后我们就可以拿到M1卡的二进制文件信息,文件扩展名为dump,大小为1KB。

下图为读取到的dump文件及分析结果标注:



我们先了解一下M1卡的存储结构,M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,存储结构如图所示:
                                                   

其中第0扇区用于存储卡片的UID信息以及厂商写入的信息,一般不需要我们分析修改;
每个扇区的块0、块1、块2为数据块,可以用于存储数据;
块3位控制块,由密码A、存取控制(控制字)、密码B组成,且每个扇区的密码和存取控制都是独立的,即 每个扇区都有自己的密码。
FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF
//     密码A      |   存取控制    |    密码B
接下来我们看一下我们读取到的数据,将dump文件使用十六进制编辑器打开


第0扇区我们暂不理会,显然,数据基本存储在第10扇区与第11扇区,且两个扇区的控制块是相同的,后续我们着重分析这两个扇区。

    0x2.2  PN532读写过程
对于PN532而言,读取过程又是怎样的呢?我们先来了解一下PN532。
         PN532由NXP出品,是一款高度集成的载波的13.56MHz传输模块,基于80C51内核有40KROM、1KRAM。 使用不同的固件支持13.56MHz频段的无线协议。
这里我们介绍一下ACR122U对M1卡的读写卡流程:
// 【初学者仅作了解】

//  1.唤醒PN532
 PC->PN532: 55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 03 FD D4 14 01 17 00
 PN532->PC: 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00
//  唤醒的数据包头为固定格式

//  2.获取卡UID
PC->PN532: 00 00 FF 04 FC D4 4A 02 00 E0 00

//   析:
//   04 -> 代表有四个数据分别是 D4 4A 02 00
//   FC -> 这是04的补码 
//   4A -> 命令
//   02 -> 卡数量,0--2
//   00 -> 波特率 106K
//   E0 -> 校验位  D4+4A+02+00=0x0120  取后两位20的补码为E0

 PN532->PC:  00 00 FF 00 FF 00 
                       00 00 FF 0C F4 D5 4B 01 01 00 04 08 04 86 7D C9 56 06 00 

//    析:
//    00 00 FF 00 FF 00  -> ACK
//    00 00 FF 0C F4 
//    D5                -> PN532 到 MCU
//    4B                -> 响应命令
//    01                 -> 目标卡1
//    01                 -> 目标卡数量,最大为0x02,最小为0
//    00 04            -> ATQ
//    08                 -> 卡容量 08=1K
//    04                 -> 4个字节UID
//    86 7D C9 56 -> UID
//    06 00            -> DCS+POST

//  3.秘钥验证

PC->PN532:  00 00 FF 0F F1 D4 40 01 60 07 FF FF FF FF FF FF 86 7D C9 56 C2 00

//     析:
//     40   -> 命令
//     01   -> 卡1
//     60   -> 密钥验证命令
//     07   -> 块号
//     FF FF FF FF FF FF -> 密钥
//     86 7D C9 56   -> UID 
//     C2   -> 检验位

 PN532->PC: 00 00 FF 00 FF 00 
                      00 00 FF 03 FD D5 41 00 EA 00 
//    析: 41 00   -> 正确状态

//  4.开始读卡

PC->PN532: 00 00 FF 05 FB D4 40 01 30 06 B5 00 //读第6块
PC->PN532: 00 00 FF 05 FB D4 40 01 30 07 B4 00 //读第7块
PC->PN532: 00 00 FF 05 FB D4 40 01 30 08 B3 00 //读第8块 
//     析:   
//     40   -> 命令
//     01   -> 卡1
//     30   -> 读卡命令
//     06   -> 块号
      
PN532->PC: 00 00 FF 00 FF 00      //ACK
                     00 00 FF 13 ED D5 41 00 00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF 01 00  //7块

PN532->PC: 00 00 FF 00 FF 00 //ACK
                     00 00 FF 13 ED D5 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 EA 00     //6块

//        析:
//        41 00   -> 正确
//        41 03   -> 错误

//  5.写卡操作
PC->PN532: 00 00 ff 15 EB D4 40 01 A0 06 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F CD 00

//     析:
//     40   -> 命令
//     01   -> 卡1
//     A0   -> 写卡命令
//     06   -> 块号
//     00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F    -> 16字节数据
//     CD  -> 校验和

PN532->PC: 00 00 00 FF 00 FF 00 
                     00 00 FF 03 FD D5 41 00 EA 00
//        析:
//        41 00   -> 正确
PN532读写过程均已经介绍,卡片信息写入时仅介绍操作,不再赘述原理。

0x3.卡片数据分析及修改

分析过程我们需要取多组数据,进行分析来确认不同数据所代表的的意义,此处我们仅分析第10及第11两个扇区。



根据上图内容,我们可以看到,10扇区的块0没有数据,10扇区块2和11扇区块0相同,11扇区的块1和块2相同,所以我们仅仅分析10扇区块1,11扇区块0和块1。

接下来我们对比不同余额时对应的数据:

//  余额319.4

#  扇区10块1
01 00 01 00 00 05 FD 20 05 04 00 00 6D B7 00 51
#  扇区11块0及块1
17 10 30 00 00 00 00 00 00 00 00 00 00 00 00 57
00 00 00 26 00 00 7C C4 FF FF 83 3B 00 00 00 22

//  余额298.6

#  扇区10块1
01 00 01 00 00 05 FD 20 05 04 00 00 6D B7 00 51
#  扇区11块0及块1
17 10 30 00 00 00 00 00 00 00 00 00 00 00 00 57
00 00 00 27 00 00 74 A4 FF FF 8B 5B 00 00 00 23
根据数据结果,我们可以看出,在消费后,只有11扇区块1(块2相同)发生了变化。
其中余额319.4及298.6,以分为单位是31940和29860,转化为十六进制为 0x7CC4和0x74A4,恰好可以与11扇区中块1中的数据对应。
//  余额298.6

#  扇区11块1
00 00 00 27 00 00 74 A4 FF FF 8B 5B 00 00 00 23

#  27和23为计数,每消费一次增加1
#  00 00 74 A4 为余额数据
#  FF FF 8B 5B 为余额校验数据,为余额取反

我们继续看下扇区10块1

//  余额298.6

#  扇区10块1
01 00 01 00 00 05 FD 20 05 04 00 00 6D B7 00 51

#卡片上印刷的卡号为28087,对应十六进制为0x6DB7,恰好与扇区10块1对应
至此数据基本分析完毕,我们来尝试写入看结果如何。

0x4.卡片信息写入

我们把余额改为600,也就是60000分,十六进制为0xEA60,取反为0x159F,修改如下:
//  余额298.6修改为600

#  扇区11块1,修改前
00 00 00 27 00 00 74 A4 FF FF 8B 5B 00 00 00 23

#  扇区11块1,修改前
00 00 00 27 00 00 EA 60 FF FF 15 9F 00 00 00 23
修改后保存dump文件,使用MiFare Card Programming工具将其写入到卡中


需要注意的是,每个扇区需要有本身对应的密码才可以写入。

【补充】
写入更改后的余额后,测试可正常消费,为避免因卡号记录追溯到用户信息,可以更改卡号信息,即扇区10块1中的6DB7可以更改,更改后需要同时更改块1的末尾数据,因为末尾的数据51为校验位,是块1的前15位数据取和后获得的值,请大家根据情况自行理解分析,此处不作赘述。

PS: 相关问题已反馈商家,请大家在学习技术的同时,不要让利益污染了技术。




看雪线上公开课第01期《安全编码之SQL注入》,周日下午14:00,提前报名免费参与!

最后于 2019-1-11 19:30 被kanxue编辑 ,原因:
打赏 + 4.00
打赏次数 2 金额 + 4.00
 
赞赏  yjmwxwx   +2.00 2019/03/05
赞赏  junkboy   +2.00 2018/07/29
最新回复 (32)
crzayboy 2018-7-29 12:32
2
0
标记,学习一下
junkboy 2018-7-29 13:09
3
0
支持
黯夏子风 3 2018-7-29 13:15
4
0
junkboy 支持
感谢
kanxue 8 2018-7-29 16:34
5
0
感谢分享!
不知世事 1 2018-7-29 17:52
6
0
MARK
聖blue 2018-7-29 23:14
7
0
Vn小帆 2018-7-30 09:28
8
0
硬件设备充值之后都是用这种办法写入数据的么?
黯夏子风 3 2018-7-30 09:37
9
0
Vn小帆 硬件设备充值之后都是用这种办法写入数据的么?
卡还有CPU卡等多种类型,校验方式还有滚动码或者联网验证等方式,文章所分析的是比较简单的场景
Vn小帆 2018-7-30 09:48
10
0
黯夏子风 卡还有CPU卡等多种类型,校验方式还有滚动码或者联网验证等方式,文章所分析的是比较简单的场景
本来想找个来改数据的  后来想想 别人不会那么傻  会做联网校验的
wx_- 2018-7-30 10:06
11
0
hxdqq 2018-7-30 10:12
12
0
MARK
nig 4 2018-8-4 22:03
13
0
好东西,写的详细。留存
newmean 2018-8-8 18:15
14
0
最后一张图,从数据上看Key应该是6661而图上写成了6662不知道是否手误写错了?
黯夏子风 3 2018-8-8 19:08
15
0
newmean 最后一张图,从数据上看Key应该是6661而图上写成了6662不知道是否手误写错了?
手误,已更正
._701660 2018-8-19 02:48
16
0
吧软件也给了吧
兰色情坏 2018-8-21 13:29
17
0
起步阶段的文章写的很详细,对于初学者一目了然
yegu 2018-8-21 14:11
18
0
黯夏子风 感谢[em_1]
好像重要环节没讲到,
1.在不知道M1扇区密钥的情况下,是怎么破解出密钥,原理?
2.如果M1所有的扇区的密钥都被修改了(不为默认全0xFF或全0x00)的情况下,按你的方法是否还可以破解出所有扇区的密钥?
瀚海云烟 1 2018-8-21 14:17
19
0
mark,慢慢学习
kingdog 2018-8-28 09:46
20
0
秘钥破解原理是什么?
黯夏子风 3 2018-8-29 13:55
21
0
yegu 好像重要环节没讲到, 1.在不知道M1扇区密钥的情况下,是怎么破解出密钥,原理? 2.如果M1所有的扇区的密钥都被修改了(不为默认全0xFF或全0x00)的情况下,按你的方法是否还可以破解出所有扇 ...
1. 一般采用简单秘钥验证某扇区秘钥正确后,利用M1卡的验证漏洞进行非简单密码扇区的秘钥破解
2. 如果所有扇区秘钥均被修改,则验证漏洞无法直接利用,一般采用暴力破解某扇区秘钥后,再行利用验证漏洞进行其他扇区秘钥的破解
黯夏子风 3 2018-8-29 14:00
22
0
kingdog 秘钥破解原理是什么?
卡与读卡器之间第一次建立通信时,会发送随机数,但产生的随机数并非是真的随机数,而是伪随机。
所以一般可以利用默认密码验证出某扇区秘钥后,利用该漏洞从其他扇区的加密后的伪随机数中得到对应扇区秘钥
想猫的鱼 2018-9-4 15:52
23
0
佩服佩服!
川美 2018-11-23 21:08
24
0
标记,学习一下 ,手环的蓝牙接口有研究没
大道在我 2018-11-23 22:36
25
0
问下怎么知道666164696c38就是秘钥的?
junkboy 2019-1-11 20:10
26
0
#寻宝大战#祝看雪19岁快乐!
bklih 2020-1-14 12:35
27
0
我在哪裡可以得到那些工具?
黑洛 1 2020-1-14 14:16
28
0
感谢分享
向量 2020-2-12 14:15
29
0
弱弱的问一下,m1不是属于ic卡么,为啥也算nfc卡呢?
wx_韓暐 2020-2-15 10:52
30
0
我就想知道,导出的二进制文件,怎么打开为十六进制
wx_韓暐 2020-2-15 11:01
31
0
向量 弱弱的问一下,m1不是属于ic卡么,为啥也算nfc卡呢?
ic卡属于nfc哦,nfc可以读取
wx_韓暐 2020-2-15 11:02
32
0
bklih 我在哪裡可以得到那些工具?
百度都可以找到,设备可以去淘宝买,价格不会超过200
黯夏子风 3 3小时前
33
0
wx_韓暐 我就想知道,导出的二进制文件,怎么打开为十六进制
可以用010Editor
游客
登录 | 注册 方可回帖
返回