AD

[留备]IC卡的攻击方式

针对IC的攻击目的,其实是为了读取及修改IC卡内记录的数据。回顾IC的结构,16个扇区,4个数据块,每个扇区的第4数据块存储keyA和keyB,(还有一个控制字节什么的,等我搞懂了再说)负责对扇区的读和写操作。第0扇区的第1个数据块,存储IC卡的UID号(UID号码一般不可写,因为这个是卡的识别,但有可写UID卡的存在,但这部分可写UID的可以认为是不合格卡,因为按照标准UID是必须不可写的)

再回顾一下IC卡的验证/使用流程,一般情况会先验证UID的准确性,即该IC卡是否是允许范围内的IC卡,然后再依据keyA和keyB对卡内数据进行进一步操作,可以认为是多重的认证,这两种验证方法可以同时使用,也可以单独使用。

下面讲一下针对IC卡的攻击:

1.针对IC卡对UID的认证,在没有keyA和keyB的情况,任何读卡器均可以读取IC卡的UID,然后可以写入到一张“不合格(可写UID)”的IC卡中。

2.针对keyA和keyB的攻击主要有两种:

2.1默认密码攻击

IC卡在出厂时会有默认密码,很多在使用IC卡的时候,没有修改默认密码。可以采用穷举的方法尝试常见密码,具体如下:
ffffffffffff
a0a1a2a3a4a5
b0b1b2b3b4b5
aabbccddeeff
4d3a99c351dd
1a982c7e459a
d3f7d3f7d3f7
714c5c886e97
587ee5f9350f
a0478cc39091
533cb6c723f6
8fd0a4f256e9

2.2 验证漏洞(nested authentication)攻击

利用IC卡的验证漏洞,获取keyA和keyB。该攻击方式是利用已知16个扇区中任意1个或几个扇区的密码之后,使用攻击方式,获得其他扇区的密码。

目前,国际上在智能IC卡上应用得较多的加密解密算法是DES算法、RSA算法及DSA算法。(DES对等加密,RSA非对等公钥加密,DSA非对称数字签名算法)

DES属于对等加密算法,也就是读卡器跟tag中都保存着同样的密码,也都是用同样的算法加密,然后看rfid的验证过程:开始交互的时候,tag就已经把uid给reader说了,主要牵扯到防冲撞机制,之后才开始验证。

20130420003158_32532[1]


20130420003206_80685[1]


第一次验证时,读卡器首先验证0扇区的密码,tag给读卡器发送一个随机数nt(明文),然后读卡器通过跟密码相关的加密算法加密nt,同时自己产生一个随机数nr,(密文)发送给tag,tag用自己的密码解密之后,如果解密出来的nt就是自己之前发送的nt,则认为正确,然后通过自己的密码相关的算法加密读卡器的随机数nr(密文)发送给读卡器,读卡器解密之后,如果跟自己之前发送的随机数nr相同,则认为验证通过,之后所有的数据都通过此算法加密传输。

首先记住这里面只有第一次的nt是明文,之后都是密文,而且nt是tag发送的,也就是验证过程中,tag是主动先发随机数的。我们破解的时候,读卡器中肯定没有密码(如果有就不用破解了),那么tag发送一个nt给读卡器之后,读卡器用错误的密码加密之后发送给tag,tag肯定解密错误,然后验证中断,这个过程中,我们只看到tag发送的明文随机数,tag根本没有把自己保存的密码相关的信息发送出来,那怎么破解呢?

所以,要已知一个扇区的密码,第一次验证的时候,使用这个扇区验证成功之后,后面所有的数据交互都是密文,读其他扇区数据的时候,也需要验证,也是tag首先发送随机数nt,这个nt是个加密的数据,我们前面也说过每个扇区的密码是独立的,那么加密实际上就是通过tag这个扇区的密码相关的算法加密的nt,这个数据中就包含了这个扇区的密码信息,所以我们才能够通过算法漏洞继续分析出扇区的密码是什么。

这也是为什么nested authentication攻击必须要知道某一个扇区的密码,然后才能破解其他扇区的密码。

2.3  darkside攻击

假设某个IC卡的所有扇区都不存在默认密码怎么办?暴力破解根本不可能,可以使用因为算法问题导致的darkside攻击,我们照样不说具体算法什么漏洞之类,同样,我们考虑首先要把tag中的key相关的数据骗出来,也就是让tag发送出来一段加密的数据,我们通过这段加密的数据才能把key破解出来,如果tag不发送加密的数据给我们,那没法破解了。

只有IC卡类别当中NXP公司所发布的MIFARE
CLASSIC系列(S50/S70)存在该类问题,可以使用DarkSide攻击方法。

前面我们也说了,第一次验证的时候tag会发送明文的随机数给读卡器,然后验证读卡器发送加密数据给tag,tag验证失败就停止,不会发送任何数据了,这样看,根本就没有办法破解密码。

实际上经过研究人员大量的测试之后,发现算法还存在这样一个漏洞,当读卡器发送的加密数据中的某8bit全部正确的时候tag会给读卡器发送一个加密的4bit的数据回复NACK,其他任何情况下tag都会直接停止交互。

那么这个4bit的加密的NACK就相当于把tag中的key带出来了,然后再结合算法的漏洞破解出key,如果一个扇区的key破解出来,就可以再使用nested authentication 攻击破解其他扇区密码。

2.4  正常验证过程获得key

2.1-2.3都是通过一般的读卡器,把tag中的密码破解出来,破解的原理中,不管密码破解算法的漏洞,实际上都是要让tag中发送出来一段密文。

那如果读卡器本身就保存有密码,卡也是授权的卡,也就是说卡和读卡器都是正确授权的,那么他们之间的加密数据交换就可以直接使用PM3等监控下来,然后通过“XOR效验与算Key”程序算出密码来。

这种情况下一般都是内部人员做案,或者把读卡器中的SAM偷出来,SAM实际上就是保存读卡器中密码的一个模块,然后通过另外的读卡器插入SAM,用正常的授权的卡刷卡,然后监控交换数据,从而算出密码。

2.5  终端交互数据获取

卡和读卡器之间的数据交换,是加密的数据,但是读卡器跟电脑链接这块,因为电脑中没有加密芯片,所以肯定是明文传输,在某种环境中,比如通过电脑的控制程序导入密码(假设是二进制等不能直接观看的密码文件)到读卡器的时候,我们通过监控USB口(串口)数据通信,是不是就能明文看到密码呢?

20130420003216_82025[1]


软件装载密码到读卡器

20130420003224_23579[1]


使用USB监控抓到的明文数据,包含了导入到读卡器中的密码明文。

再想想各类电影中,对门禁,会拆开门禁,监听嗅探门禁和后端服务器之间的数据流,获取密码,是有一定道理的。

 

评论

此博客中的热门博文

简单粗暴导出小米便签

我——终于一个人了

多种方法绕过POWERSHELL的执行策略