
前言
我们不管是在小区里还是公司里,都可能会使用过门禁卡,比如乘坐电梯需要刷工牌才使用,而且只能去特定的楼层。生活中还有很多地方用到过IC卡,商铺的会员卡、交通的公交卡等等。关于IC、ID卡的基础、本节不做详细叙述,只介绍M1的IC卡如何去分析并尝试破解。
M1卡介绍
MIFARE CLASSIC是恩智浦半导体开发的可用于非接触式智能卡,我们一般称为M1卡,是非接触式IC卡的一种。符合ISO/IEC 14443A类标准。
有S20,S50(M1),S70几种规格,主要是根据存储器容量划分,存储器容量分别为320B,1K,4K,直观体现就是S50只有16个扇区,而S70有40个扇区,适用的场景不同。
卡片构成
MF1 S50卡片本身是塑料,里面有一块芯片和几匝线圈。集成电路芯片内含1 Kbyte EEPROM、RF接口和数字控制单元。能量和数据通过天线传输,卡中天线为几匝线圈,直接连接到芯片上。不再需要额外的组件。
- RF接口:调制解调器、检波器、时钟发生器、上电复位、稳压器
- 防冲突:读写范围内的几张卡可以逐一选定和操作,防止干扰。
- 认证:在所有存储器操作之前进行认证过程,保证必须通过各块指定的密钥才能访问该块。
- 控制和算术逻辑单元:数值以特定的冗余格式存储,可以增减。
- 加密单元:域验证的CRYPTO1 数据流加密,保证数据交换的安全。
- EEPROM: 1 Kbyte,分16区,每区4块。每一块有16字节,这就是数据存储的模块。
特性
- 非接触数据传输并提供能源(不需电池)
- 工作距离:可达100mm (取决于天线尺寸结构)
- 工作频率:13.56 MHz
- 快速数据传输:106 kbit/s
- 高度数据完整性保护:16 Bit CRC,奇偶校验,位编码,位计数
- RF接口(ISO/IEC 14443A):根据非接触式智能卡标准实现。两个方向的数据通信在每一帧的开始只有一个起始位。每个字节一位校验位(奇校验)。选择块的最低(LSB)的字节最选传输,最大帧长度为163位(16字节数据+ 2 CRC字节= 16´2´9 + 9 + 1起始位)。
- EEPROM:1 Kbyte,分为16个区,每区4个块,每块16字节。
- 用户可定义内存块的读写条件
- 数据耐久性10年
- 写入耐久性100.000次
- 防卡绕:智能防干扰功能允许同时又多张卡在现场工作。防干扰算法分别选择每一张卡,并确保选定的卡正确执行交易,不会受到现场另一张卡的干扰。
- 安全性:相互三轮认证(ISO/IEC DIS9798-2),带重现攻击保护的射频通道数据加密,每区(每应用)两个密钥,支持密钥分级的多应用场合,每卡一个唯一序列号,在运输过程中以传输密钥保护对EEPROM的访问权
- 非接触能源和数据传递:在MIFARE卡中,芯片连接到一个几匝的天线线圈上,并嵌入塑料中,形成了一个无源的非接触卡。不需要电池。当卡接近读写器天线时,高速的RF通讯接口将以106 kBit/s 的速率传输数据。
安全与保护
数据完整性
以下机制在非接触通讯过程中于读卡器和卡片之间实现,卡片确保数据正确性:
- 每个数据块有16位CRC
- 为每个字节奇偶校验位
- 位数检查
- 位编码区分"1","0"和"无信息"
- 监测信道(协议序列和位流分析)
三轮认证
- 卡从指定扇区的尾块读出密钥和访问权限,并产生4字节随机数发送给读卡器。
- 读卡器使用密钥加密收到的随机数,把加密结果连同字节产生的随机数一起发送给卡(共8字节)
- 卡使用第1轮中读出的密钥验证读卡器返回的加密数据,如正确则把收到的随机数加密后发送给读卡器,否则不发送数据。
执行流程
包括三部分,分别是初始化及选择过程,认证过程以及数据操作过程
呼叫:读卡器发送REQA/WUPA命令,卡返回ATQA的过程
防冲突循环:在防冲突循环过程中将读取卡片的ID,如果存在多张卡,则通过ID进行区别,并选择一张卡进一步处理,其他卡回到IDLE状态等待REQA/WUPA命令。
选卡:读写器发送SELECT,卡返回SAK的过程,SAK指示当前卡是否支持14443-4协议和UID是否完整。
三轮认证:选卡后,读卡器指定后续读写的存储器位置,并用相应的密钥进行三轮认证。认证成功后,所有的存储器操作都是加密的。
存储器操作
认证后可执行下列操作:
读块
写块
减值:减少数值块内的值,并将结果保存在数据寄存器中。
加值:增加数值块内的值,并将结果保存在数据寄存器中。
恢复:将数据块内容移入数据寄存器中。
转存:将数据寄存器的内容写入数值块。
存储器组织
厂商代码块:位于第1区的第一块(块0),它含有集成电路制造商数据。出于安全和系统需求,此块是制造商在生产过程中编程后写保护的,只允许读取。
如果是4字节UID,则0~3字节为序列号,第4字节为校验字节(异或值),第5字节为卡片容量,第6、7字节为卡片类型。
数据块:各区均有3个16字节的块用于存储数据(区0只有两个数据块以及一个只读的厂商代码块)。
数据块可以通过读写控制位设置为:
读写块,例如用于非接触门禁管理。
数值块,例如用于电子钱包,另有可直接控制存储值的命令,如增值、减值。(有效命令:read,write,increment,decrement,restore,transfer),有固定的数据格式,以便于错误检测、纠错和备份管理。数值块只能通过以数值块格式的写操作生成。
数据分析
数值:4字节数值。数值的最低字节存储在最低地址字节。负值以标准的2的补码形式存储。出于数据完整性和安全原因,数值存储三次,两次不取反,一次取反。
地址(Adr):1字节地址,当进行备份管理时,可用于保块的地址。地址保存四次。两次取反,两次不取反。在increment、decrement、restore和transfer操作中,地址保存不变。它只能通过write命令更改。
举例:
对于10进制数1234567,地址17来说:10进制:1234567 -> 16进制:0012d687
低字节存储在第0字节,高字节为第3字节,可以理解为从右->左写。
补码,也就是取反值,先将16进制:0012d687 -> 转换成2进制:00000000000100101101011010000111
注意这里是32位的,少的位数需要用0来补齐,
再将1和0互换,得到2进制:11111111111011010010100101111000 -> 16进制: ffed2978
同理地址10进制:17 -> 16进制:11,这里是8位,所以转换成2进制就是00010001,取反就是11101110转换成16进制:ee
结果如下图:
上面说的数值块,接下来看下尾块
尾块:
各区均有一个尾块,存有密钥A和B(可选)。卡片发行时,所有的密钥被设置为FFFFFFFFFFFF。如果读密钥的权限不满足则读出的密钥值全为0。该区四个块的读写条件,存储在字节6-9。
读写控制位也指定了数据块的类型(读写块或数值块)。
如果不需要密钥B,块3的最后6字节可以用作数据字节。
尾块的字节9可用于用户数据。因为此字节享有与字节6、7、8相同的读写权限。
如下图所示:
存储器操作
对指定块可以执行的存储器操作取决于所用的密钥和存储在相应尾块中的读写条件。
读写条件:
每个数据块和尾块的读写条件均由3个bit定义,并以非取反和取反形式保存在各个区的尾块中。
读写控制位管理着使用密钥A和B读写的权限。如果知道相关的密钥,并且当前读写条件允许,读写条件是可以更改的。
控制位组成
其中,右下标代表块,横杠代表取反,比如C13则是块3的C1值。
尾块访问条件:
根据尾块的访问控制位,对于key的读/写访问的权限包括:never、keyA、keyB或者keyA|B。通过上面得到的值,在下表中找到对应部分,注意:下图是尾块的权限控制,所以是C13C23C33的值。
数据块的权限控制,C10~2、C20~2、C30~2的值对照下图
数据块的访问控制条件
对数据块(块0至2)的读写访问取决于其访问控制位,分为"禁止"、"KEY A"、"KEY B"、"KEY A|KEY B"
相关访问控制位的设置确定了其用途以及相应的可用命令。
读写块:允许读、写操作。
数值块:运行另外的数值操作——加值、减值、转存和恢复。在用于非充值卡的一种情况('001')下,只能够读和减值。在另一种情况('110')下,可以用key B充值。
制造厂商块:只读,不受访问控制位设置的影响。
密钥管理:在传输配置状态下,必须用Key A认证。
举例:
卡片发行时的控制字节为:FF078069
转换成2进制:
FF:11111111->取反:00000000
07:00000111->部分取反:00001000
80:10000000->不取反:10000000
得到:
C10 C20 C30=000,块0的读、写、增、减、恢复、传送的权限都是keyA或者keyB
C11 C21 C31=000,块1的读、写、增、减、恢复、传送的权限都是keyA或者keyB
C12 C22 C32=000,块2的读、写、增、减、恢复、传送的权限都是keyA或者keyB
C13 C23 C33=001,块3的keyA读权限never,keyA的写权限、Access bits和keyB的读写权限都是keyA
例子1:
C11 C21 C31=010,即块1的读权限为keyA|keyB,写、增、减、恢复、传送的权限为never。修改尾块的值为:FFFFFFFFFFFFDF078200FFFFFFFFFFFF
例子2:
C1X C2X C3X=111,即数据块的所有权限都为never,尾块的读控制字节权限为keyA|B,其他都为never。修改尾块的值为:FFFFFFFFFFFF00F0FF00FFFFFFFFFFFF
实际演示
***如果要获取卡中的数据,只能通过卡中的给的权限,比如获取扇区9的数值,条件是通过keyA的值,那么只有在知道keyA后才能获取里面存放的数据。所以一般都是通过暴力破解,利用密码字典来获取数值。
读卡器工具:PM设备系列(某宝有)
当然少不了一些辅助工具
控制字节辅助工具:
数据分析工具:
演示:
我们通过读卡工具,将爆破到的数据保存为dump格式,然后拖入分析工具
注意,上文中的数据格式等等是通用格式,实际上每个制造商都有自己的规则,需要实际分析
可以看到,这里通过特征分析出是金博梯控,梯号往往代表的是几幢,01就是1幢
通过楼层码得到允许访问的楼层
如果要修改楼层,可以通过转换得到16进制数据,这边我们添加4,5层
将得到的值再写入dump文件中
再写入卡中就完成了访问楼层的修改。
总结
在实际操作中,各个制造商有自己的数据写入规则,工具并不是万能的,往往需要多张卡多种结果之间进行对比,分析出转换规律,除了明文的数据,也有加密的数据,不解密开是无法破解的,这种加密数据就需要各个厂商特定的读卡设备了。
本篇文章只供兴趣爱好者研究学习,非法篡改数据属于违法行为,请遵守相关法律。