一卡通(M1卡)破解过程记录——获取扇区密钥

前些日子在研究学校的一卡通安全,在此记录一下一卡通破解的全过程,仅用作学习交流,切勿用于违法用途

其他几篇: 一卡通(M1卡)破解过程记录——准备篇              理论篇             数据分析篇

一般淘宝卖的pm3都送比较高级的windows下的GUI软件,这个软件使用比较傻瓜化而且一般附带教程,我在这里不再介绍详细的使用过程,假设你的pm3是自己组装的或者没有附带国产软件,那你可以在Proxmark3的Github找到配套的命令行软件,Linux下编译好用Terminal运行即可

半加密M1卡攻击方法

现在我们已经确定智能卡类型为M1卡,根据M1卡的存储结构可知其每个扇区的块3中存放了密钥,这些密钥控制着M1卡其他数据的读写权限,因此我们的首要任务是获取卡内扇区的密钥。目前国内大部分M1卡都只加密了部分扇区,为半加密卡,对半加密卡的攻击方法相对简单,因此拿到M1卡后我们首先测试半加密M1卡的攻击方法。

暴力破解法

M1卡属于被动式智能卡,电源由读卡器提供,与读卡器断开连接后就无法保存数据,也不存在尝试多次密钥错误后锁死卡片的可能,所以针对这一特性我们可以使用暴力破解法,更换密钥循环测试直到扇区验证通过。但是读卡器与卡片的通信有延时,枚举某一扇区的密钥A或密钥B共有248即281474976710656种可能性‬,假设每次验证密钥需要1ms时间,也需要8296年才能暴力破解出一个扇区的一种密钥,在M1卡的加密算法被公开之前,穷举每一位去暴力破解M1卡密钥是不可能的。当M1卡的算法被攻破后,很多发卡商的M1卡都受到了攻击,攻击者利用获得密钥构建了密钥库,而由于M1卡的密钥不能像网络账户一样随时更换,很多发卡商又使用了统一的密钥,因此可以通过遍历已有密钥库中密钥的方式来解开一部分M1卡的密钥。对于那些未受到密钥泄露影响的M1卡,即使知道了Crypto-1算法,再配合高性能计算机辅助运算,仍需要几十个小时的时间才能解开非典型密钥,所以一般只用暴力破解的方式扫描扇区默认密钥或弱密钥作为其他攻击方法的辅助。

默认密钥扫描

M1卡出厂时使用统一的默认密钥,密钥A和密钥B的值均为FFFFFFFFFFFF,控制位为FF087069,也有一部分制造商使用自己的简单密钥作为出厂密钥。发卡商为了便利通常使用厂家提供的默认密钥,或者仅仅将包含重要数据的扇区修改密钥。对M1卡的扇区进行默认密钥扫描有助于我们提高破解的效率,并且可用来判断该卡是否为全加密卡,若未扫描到默认密钥则直接使用嗅探手段获取密钥。

使用“hf mf chk *4 ? t”命令开始扫描,该命令使用12个全球通用的默认密钥扫描0-39扇区,若事先知道所用数据在多少扇区及对应的密钥类型,可以修改指令来缩短扫描时间。扫描大概需要1分钟时间,完成后可以看到除了10-15扇区外其他扇区的密钥均为FFFFFFFFFFFF,这说明10-15扇区存放了一卡通的关键数据,这6个扇区就是后续数据分析研究的重点对象。

                                   一卡通(M1卡)破解过程记录——获取扇区密钥_第1张图片

嵌套认证攻击

嵌套认证攻击即验证漏洞攻击,是获取M1卡密钥的最常用方法,它利用M1卡与读卡器三轮认证过程中的漏洞来实现知一密而求全密。三轮认证的过程中读卡器与M1卡使用的是对称加密算法,读卡器与M1卡中均存有相同的密钥,加解密过程也是一致的,这就给我们提供了还原密钥的可能性。

 

当进行三轮认证时,卡片和读卡器在会生成伪随机数并对其加解密,如果使用错误密钥对伪随机数的验证就会失败,这说明数据的加解密与扇区密钥是相关的。而在M1卡中每个扇区的密钥又是独立的,一次三轮认证通过后处理完扇区数据后就会转到另一个扇区重复三轮认证,此时使用新扇区的密钥参与加密运算出伪随机数。国外研究人员测试后发现了该过程中M1卡的重大缺陷,标签在通过第一次三轮认证后就会将其他扇区的数据加密后发送给读卡器,扇区中块3用来存放密钥,获取了加密后的扇区数据就等于获取了加密后的密钥信息。此时,我们可以使用获得的加密信息辅助暴力破解,大大降低了对48位密钥的搜索空间,缩短了获取密钥的时间成本。

该方法实施的前提是已知某扇区密钥A或密钥B的一种,否则M1卡无法与读卡器完成三轮认证。在默认密钥扫描过程中我们已经得知了除10-15扇区外的所有扇区密钥,此时通过Proxmark3执行“hf mf nested 1 0 A FFFFFFFFFFFF”,使用已获得的0扇区密钥A进行嵌套认证攻击。桂电一卡通使用的M1 4k卡扇区结构与1k卡不同,Proxmark3难以预测到认证过程的随机数,因此无法一步被nested攻击方式破解所有扇区,必须使用单已知密钥对单未知密钥的Hardnested方式。执行“hf mf hardnested 1 0 A FFFFFFFFFFFF 40 A”,即使用已知的0扇区密钥爆破40块所属扇区,结果“a1fbf4d6489b”就是10扇区的密钥A。对其他扇区的爆破也同理,爆破期间会占用大量CPU资源来运算,不同的电脑配置所需时间也不同,一般来说,爆破单扇区未知密钥的时间应在5分钟内,在这期间还未成功就应尝试通过其他方式获取密钥。

                    一卡通(M1卡)破解过程记录——获取扇区密钥_第2张图片

全加密M1卡的攻击方法

目前市面上也存在一些安全性相对较高的M1卡,发卡商在发卡前对M1卡的每个扇区都做了加密处理。若我们使用半加密M1卡的攻击方式未获取到任何扇区的密钥,说明该卡是各扇区使用强密钥的全加密卡。对全加密M1卡我们可用针对性地攻击方法获取其某扇区密钥,然后便可以使用半加密卡的攻击方式获取密钥。

Darkside攻击

M1卡的数据被分为若干个1bit位的块加密传输给读卡器,当读卡器发送或接收1条信息时,密钥流会位移相应的大小来和卡片保持同步。研究人员截取并重放M1卡与读卡器之间交互的部分数据发现其存在这样一个漏洞:当读卡器发送的加密数据中的某8bit部分全部正确而其他内容出错时,M1卡会给读卡器发送一个加密的4bit的数据作为NACK,而在测试其他任何情况下都会直接停止会话。

我们知道在M1卡通信数据的加密过程中使用了M1卡对应扇区的密钥,因此获取到这个4bit的否定应答就相当于获取到了该扇区密钥的相关信息,结合算法的漏洞可以破解出某个扇区的密钥,知道一个扇区的密钥,就可以使用其嵌套认证攻击得到其他扇区的密钥了。

          一卡通(M1卡)破解过程记录——获取扇区密钥_第3张图片

终端执行“hf mf mifare”指令,Darkside攻击结果显示卡片无法使用Darkside攻击,因为其不返回NACK。这说明桂电一卡通使用的M1卡芯片是修复了这一算法缺陷后的版本,其去除了流密钥算法设计中本不该有的反馈机制,此时我们只能通过使用其他方法获取扇区密钥。

嗅探还原密钥

嗅探是破解全扇区加密卡的主要方法,原理是使用硬件对M1卡与已授权的读卡器的交互过程窃听获取数据。如图所示,将嗅探设备方式M1卡和已授权读卡器之间,对M1卡嗅探设备伪装为已授权读卡器,发送身份验证请求,同时对读读卡器伪装为M1卡,发送从M1卡获取的信息,这样嗅探设备便同时与M1卡和已授权的读卡器建立了会话,从而达到窃听交互信息的目的。

                                              一卡通(M1卡)破解过程记录——获取扇区密钥_第4张图片 

我们使用Proxmark3嗅探时先将桂电一卡通固定在设备的高频天线上,终端输入“hf 14a snoop”命令开启对ISO-14443 A型卡的嗅探功能,此时将Proxmark3放在自动贩卖机的识别区域,待自动贩卖机成功识别后拿开设备,重复几次确保收集到足够多的数据后结束嗅探,此时终端已获取到嗅探的结果。我们浏览M1卡开发文档可知基于M1卡的RFID系统在工作时会使用一套专业指令,如图所示。

                                 一卡通(M1卡)破解过程记录——获取扇区密钥_第5张图片

嗅探的目的是为了获取一卡通的扇区密钥,所以我们首要关注其身份验证指令。用于身份验证的指令有两个,一个以60开头表示使用密钥A验证,另一个以61开头表示使用密钥B验证。我们可以直观的看到嗅探结果中哪些数据是由标签发出的,哪些数据是由读卡器发出的。三轮认证中的读卡器首先像标签发送身份验证请求,因此在所有读卡器发出的数据中筛选好以60和61开头的部分,这部分即为读卡器发出的身份验证请求指令,如图所示。

               一卡通(M1卡)破解过程记录——获取扇区密钥_第6张图片

观察“60 2c 9b 90”的前几行数据,标签首先发送“0200”,根据前面的卡类型测试可知这是M1 4k卡的AQTA值,告诉读卡器标签类型,读卡器接收后发送一个“9320”请求标签返回UID值,标签发送4个字节的UID“4d b0 1c eb”及其BCC校验值“0a”,读卡器使用“93 70”命令选择卡片UID,“0b 87”是该指令的CRC校验位,用于卡片判断接收到的命令是否正确。标签核验通过后同意命令,读卡器执行“60 2c 9b 90”,“60 2c”即验证0x2c块的密钥A,“9b 90”为该命令的CRC校验位。此时M1卡与读卡器开始三轮认证,标签发送的“98 64 de 8a”为随机数Nt的明文,“90 d6 81 88 6d 38 1d 00”是读卡器对随机数Nt及Nr加密得到的结果,标签收到加密Nr返回给读卡器。

现在我们得到了一卡通与读卡器对2c块进行三轮认证的数据,M1卡在生成密钥时会混合卡片UID计算,因此我们将卡片UID和三轮认证过程的数据对应填入Crypto-1逆向工具箱中运算。因为认证成功的2c块属于10扇区,这样我们就得到了10扇区的密钥A“A1FBF4D6489B”。

                                               一卡通(M1卡)破解过程记录——获取扇区密钥_第7张图片

在得到10扇区密钥后该卡便由全加密卡变为了半加密卡,此时可以继续使用嗅探的方式获得更多扇区的密钥,也可以使用前文中对半加密M1卡的嵌套认证攻击来获取其全卡密钥。

导出M1卡扇区数据

入侵M1卡扇区的意义在于获取其中的数据,M1卡的数据是其中最有价值的部分,使用Proxmark3获取到全卡密钥后,我们就可以导出卡的数据分析研究。终端使用“hf mf dump”指令,此时Proxmark3将使用前面破解扇区密钥过程中生成的dump.key 文件读卡并将数据生成为一个名为“dumpdata.bin”的二进制文件,但Proxmark3并不能直接识别该文件,为了分析数据及改写一卡通的便利性,我们将此文件放到Windows系统下使用WinHex进行后续操作,自此我们已成功完成对于M1卡扇区的入侵,利用前文的方法可以获取市面上任何一种M1卡的扇区密钥,也就是说,只要我们拥有M1卡的短期控制权,就可侵入卡扇区获取所有数据。

你可能感兴趣的:(信息安全)