IC 卡介绍
上篇文章我们已经介绍了 ID 卡的工作原理与破解方法. 这篇文章在此介绍 IC 卡的原理及破解方法. IC 不同于 ID 卡的是其卡内数据不仅仅是一串写死的 ID 序列号, 其内部有扇区以储存 IC 卡内包含的大量数据, 且可经过反复擦写. 即 IC 卡可支持读取与写入. IC 卡可以分为: 接触式 IC 卡, 非接触式 IC 卡和双界面 IC 卡.
M1 卡介绍
这次我们主要介绍的是非接触式 IC 卡. M1 卡就是非接触式 IC 卡中应用最广泛的卡. M1 卡就是 Mifare 非接触式感应卡, M1 卡数据保存期为 10 年, 可改写 10 万次, 读无限次. 无电源, 自带天线, 工作频率为 13.56MHZ.M1 卡内含加密控制逻辑和通讯逻辑电路. M1 卡主要有两种, 一种是 S50 和一种是 S70. 主要应用: 门禁, 考勤, 会议签到, 身份识别, 物流, 工业自动化, 各种会员卡, 如售饭, 地铁, 公交代币卡, 俱乐部等电子消费, 电子门票, 动物识别, 目标跟踪, 洗衣管理, 各种一卡通等等.
M1 卡存储空间
M1 卡分为 16 个扇区, 每个扇区为 4 块, 每块 16 个字节, 以块为存取单位. 每个扇区的块 0, 块 1, 块 2 为数据块, 可用于存储数据. 而每个扇区的块 3 为控制块, 包括密码 keyA, 存取控制, 密码 keyB. 存取控制的作用是控制对应扇区记录的读写权限与 keyA 和 keyB 的关系. 由于每个扇区都有独立的 key 和存取控制, 因此 M1 卡可以做到一卡多用互不干扰.
每一张 M1 卡的 0 扇区 0 块都称作绝对地址块, 这一串是在卡片出厂时厂商赋予的, 代表着这张卡独立的身份识别信息. 绝对地址块的内容已被固化, 无法更改.
M1 卡控制位计算
以下为控制位的结构, 前 6 位为密钥 A, 中间 4 位存取控制, 后 6 位密钥 B.4 位控制位中前 3 位是真实的控制位, 第 4 位是备用控制位, 一般用不上, 因此我们可以只分析前 3 位.
三个控制位以正和反两种形式存在于存取控制字节中, 决定了该块的访问权限. 1 个字节等于 8 个比特, 而一个扇区有 4 个块, 每个块有 3 个控制位, 以下是控制位以比特形式的结构图,_b 表示取反存储, 这边用红色字体已标出.
以 FF078069 默认控制位为例, 我们将 FF078069 的 16 进制转化为 2 进制如下:
FF=11 1 1 1 1 1 1;07= 0 0 0 0 0 1 1 1;80=1 0 0 0 0 0 0 0 ;69 = 忽略
将以上的 2 进制数填入表格:
将取反的数再次取反以获得原来的控制位:
存取控制中每个块都的三个控制位定义如下, 同时填入上表数据:
块 0, 块 1, 块 2 控制位均是 000, 存取控制权限可对应以下表:
块 3 控制位 001, 存取控制对应如下表:
可见块 0, 块 1, 块 2 通过密钥 A 或者密钥 B 认证后可读, 可写, 可进行加值和减值操作. 块 3 密钥 A 不可读, 但可通过认证密钥 A 或 B 修改. 验证密钥 A 或者密钥 B 后, 可读可改写存取控制. 验证密钥 A 或者密钥 B 后, 可读可改写 B 密码.
综上, 存取控制 FF078069 极不安全, 我们可以自定义存取控制进行修改, 只要利用上述步骤将想要的控制位列出逆向推回去即可.
M1 卡认证原理
这里介绍 M1 卡的认证原理即三轮认证. 三轮认证是保障 M1 卡安全的重要手段, 整个过程采用 Crypto-1 算法加密. 以下是三轮认证的过程.
读写器指定要访问的区, 向卡发送身份验证请求, 并选择密钥 A 或 B.
卡从位块读取密钥和存取控制条件. 然后, 卡向读写器发送明文 4 字节随机数 Nt.(第一轮)
读写器利用密钥和随机数 Nt 计算生成一个新随机数 Nr, 并将两个随机数一起加密为 8 个字节的数据发送给卡片.(第二轮).
卡解密得到 Nt 与 Nr, 验证 Nt, 若通过再一次加密 Nr 并发送给读卡器 (第三轮).
读写器解密得到 Nr, 验证通过.
三轮认证在其原理上是可靠的, 但是外国研究人员发现了该算法伪随机数生成的漏洞, 使得加解密所用到的伪随机数可被正确预测, 从而逆向计算出了三轮认证中的扇区密钥. 该漏洞的利用在后面会讲到.
M1 卡破解
对 M1 卡进行复制, 修改的前提是破解出扇区读写对应的 key, 这边介绍几种 key 破解方式.
暴力破解法
暴力破解法原理简单, 在此不再赘述, 在 pm3 终端输入 hf mf rdbl 00 A FFFFFFFFFFFF 或 hf mf rdsc 00 A FFFFFFFFFFFF 命令, 意思是使用 keyA 密码 FFFFFFFFFFFF 读取 00 块 / 00 扇区数据.
默认密码破解法
使用 hf mf chk *4 ? t 命令, pm3 会采用全球通用的 12 个默认密码进行扫描, 原理也较为简单, 在此不再赘述.
嵌套认证攻击
上部分我们讲到, 三次认证过程本身合理安全, 但除了其伪随机数可被预测外, 还包含了一个重要漏洞. 卡片在通过第一次三轮认证后就会将其他扇区的数据加密后发送给读卡器, 每个扇区中块 3 用来存放密钥, 获取了加密后的扇区数据就等于获取了加密后的密钥信息. 此时, 我们可以使用获得的加密信息辅助暴力破解, 大大降低了对 48 位密钥的搜索空间, 缩短了获取密钥的时间成本. 这个漏洞利用的前提是必须获得一个扇区的 keyA 或 keyB, 也就是我们常讲的 "知一密求全密".
命令: hf mf nested1 0 A FFFFFFFFFFFF, 已知 0 扇区密钥 A 为 FFFFFFFFFFFF, 进行嵌套认证攻击.
Prng 攻击
M1 卡传输数据时会分为若干个 1bit 的块加密传输给读卡器. 而当读卡器发送的加密数据中的某 8bit 部分全部正确而其他内容错误时, M1 卡会给读卡器发送一个加密的 4bit 的否定响应, 而这 4bit 的响应有助于我们不断枚举卡内数据, 结合算法的漏洞可以破解出某个扇区的密钥, 之后再进行知一密求全密等. 终端输入 hf mf darkside 命令进行, 但是该漏洞仅针对部分全加密卡, 我这边的卡漏洞都已修复.
嗅探密钥
上图讲到没有 Prng 漏洞, 建议我们进行嗅探攻击. 嗅探攻击原理是使用硬件对卡片和读卡器见进行中间人攻击, 目的在于获取卡片与读卡器三次认证中出传输的数据和 UID 号, 再对 Crypto-1 算法进行逆向破解出真正的密钥. 将全加密卡降为半加密卡, 再进行嵌套认证攻击.
终端输入 hf 14a snoop 开始嗅探, 将 PM3 高频天线放置读卡机之上, 让读卡机正常读卡. 如果 Reader 正常工作, Proxmark3 就能监听到正常通信数据, 此时绿色灯亮. 保持嗅探状态多读取几次, 板子上红色灯与绿色灯会交替变亮, 等到绿, 黄灯都是亮的状态时可以停止嗅探. 嗅探完成后, 连接 PM3, 按下 button 等待指示灯都暗掉, 输入命令 hf list 14a 即可列出数据.
PM3 的文档告诉我们, 60 表示 keyA 进行身份验证, 61 表示用 keyB 进行身份验证. 因此我们在获得大量数据的第一步是寻找 60 或 61 开头的数据.
以下为搜索到的 keyA 数据, 我们可以分析卡片与读卡器之间的对话.
04 00: 卡片表明了自己的类型.
93 20: 读卡器请求卡片发送自己的 UID 号.
7e b4 60 d2 78: 卡片发送自己的卡号.
60 03 6e 49: 验证 03 块的 keyA 密钥, 6e49 为该命令 CRC 校验位 (忽略).
88 fd b7 42: 随机数 Nt
3c df c7 d1 8c 6de4 65: 加密后的 Nt 和 Nr.
88d2 60 5a: 解密后的随机数 Nr.
将以上信息输入 Crypto-1 算法的逆向软件中, 得出该块最终的 key. 之后可利用嵌套认证攻击, 得出全部密钥.
M1 卡复制
前文说到, 每一张 M1 卡的 0 扇区 0 块都是出厂时厂商赋予的绝对地址块, 我们无法在 M1 卡内直接修改它. 假设有一家公司的一卡通是通过绝对地址块进行索引, 将其他数据存储在后台数据库的话, 我们有办法进行攻击吗? 说到这不得不提一下 M1 卡的复制子卡 --UID 卡, FUID 卡, CUID 卡.
UID 卡
UID 卡是一种 IC 卡, 卡片的绝对地址块可以任意修改, 重复修改, 此卡可以修改任意扇区, 作为 M1 复制的子卡, 主要应用在 IC 卡复制上, 但一些刷卡设备会检测卡片的 00 块是否可重写, 以此判断是否为复制卡而屏蔽, 这时就需要用 FUID 或 CUID 代替.
FUID 卡
FUID 是最早出来避免检测的特殊芯片, 但 FUID 卡一旦写入, 备份的 dump 文件便固化了, 成为一张普通的 M1 卡, 丧失了 UID 卡的特点, 专门对升级的防复卡和防复读头. FUID 卡的防屏蔽作用目前为止仍是最好的, 但他的缺点是成本太高, 无法重复利用.
CUID 卡
CUID 卡可无限次修改 0 扇区, 一般都可以替代 FUID 卡. 无需锁卡自动起防屏蔽作用, 可重复擦写使用无废卡, 不会像 FUID 锁死后才起到防屏蔽作用, 更不会因为锁卡而变成一次性卡, 无法更改卡内数据成为废卡. 但仍有被检测出来的几率, 所以建议先使用 CUID 再使用 FUID.
综上, 我们可以利用 M1 卡的复制进行攻击, 如某公司以卡内 00 块为识别码进行索引, 那么可以复制修改 00 块, 冒用他人身份通过门禁, 饭卡消费等. 另外如水卡等将金额信息写入扇区内的, 假如我们无法成功分析扇区内信息, 也可记录下水卡某一时刻金额, 消费后再将记录时刻的数据写入, 就达到了将金额变回记录时刻数值的效果.
实战扇区分析
这里拿到一张金博电梯的电梯卡, AB 密码均是 FFFFFFFFFFFF, 因此我们直接获取到了扇区数据, 我将有数据的一块扇区放到 Excel 中便于我们观察. 如图:
事实上及时我们获取到了扇区数据也不一定可以完美破解, 有些厂商会将明码存于扇区中, 有些则是加密后的暗码, 需要破解其算法才行, 但难度较大且需要大量的样本. 幸好, 我拿到的这张电梯卡厂商并没有设置成暗码, 给了我们可趁之机.
现在我们需要猜一下卡内可能会存在什么数据, 首先是电梯楼层的权限, 小区的楼号. 前两天我的电梯卡过期了, 保安把我的卡在读卡机上刷了改了一下于是就可以, 并且问了我的房号. 所以我怀疑里面还包含日期和房号信息.
A3:E3 和 F3:J3 我感觉像某个日期 2022/1/1/00:00 和 2022/02/28/23:59, 尤其是后者我怀疑是到期时间, 那么前者应该是开卡时间, 至于为什么开卡年份是 2022 暂未想明白, 可能系统只校验过期时间, 或者系统的时间就是 2022 年. 于是 3 行就没有其它数据了, 暂时排除.
我的房号是 513, 在里面搜索发现 M2:N2=05 0D, 分别转换为 10 进制就是 513, 那么楼层数和楼号一定在前面.
我的楼号是 1 幢, 楼层权限应该是 1 楼, 5 楼, 3 楼 (物业所在楼层). 首先我定位在 3B=01, 这应该是我的楼号, 一般通卡的楼层是 00 或 FF, 于是我将其改为 00.
楼层的位置我找了很久和 1,3,5 有关的数据, 如何用 16 进制储存楼层信息这个问题困扰我. 最后定位在 2J=15. 将 15 转换成 2 进制是 0 0 0 1 0 1 0 1, 正好第 1,3,5 个是 1. 那么将其改成 FF:1 1 1 1 1 1 1 1 就可以所有楼层都有权限 (很简单吧). 我这幢楼有 10 多楼, 那么以此类推将 I2 和 H2 均改成 FF. 最后我修改后的扇区如下:
结论
以上为 M1 卡的工作原理与破解原理. 所以我个人建议 IC 卡的安全分以下几个要点:
扇区不使用暗码或滚动码代替明码储存. 如有条件将金额等敏感数据存于后台数据库, 根据卡号进行索引.
不使用默认或弱密钥, 每一个扇区的 keyA 与 keyB 均设置不同, 做到一卡一密, 且修复卡的 Prng 漏洞.
不使用默认的存取控制 FF078069, 根据需求合理设置安全的控制位, 否则容易扇区锁死. 推荐 08 77 8F 69(块 012 keyAB 均可读, 仅 keyB 可写. 块 3 keyA 和 keyB 均不可读, 只能用 keyB 写入. 控制字节 keyAB 均可读, 只有 keyB 可写.
升级更新读卡器, 识别基础 UID 与 CUID 复制卡.
完善管理制度, 提高人员安全意识, 不将卡片随意给予他人.
来源: http://www.tuicool.com/articles/R3MJ7bJ