IC卡密码**的几种方法: 1)使用默认的密码攻击,很多应用IC卡都没有更改默认密码,所以导致可以直接使用默认密码来尝试接入IC卡,常见的默认密码有: ffffffffffff 000000000000 a0a1a2a3a4a5 b0b1b2b3b4b5 aabbccddeeff 4d3a99c351dd 1a982c7e459a d3f7d3f7d3f7 714c5c886e97 587ee5f9350f a0478cc39091 533cb6c723f6 8fd0a4f256e9 FFzzzzzzzzzz A0zzzzzzzzzz 2)nested authentication 攻击(大家常说的验证漏洞攻击) 前面讲到每个扇区都有独立的密码,一些情况下,比如某饭卡,扇区3中存储着钱等数据,扇区3的更改了默认密码,扇区5中也存储着一些数据,扇区5也更改了密码,其他扇区没有更改默认密码。 我们要操作扇区3跟5,不知道密码怎么办? 使用nested authentication 攻击,这种攻击方式是在已知了16个扇区中任意一个扇区的密码之后,采用的攻击方式,可以获得其他扇区的密码。 我们前面都提到了,16个扇区的密码都是独立的,那么怎么能通过某个扇区的密码获得其他扇区的密码呢?如果可以,那说明扇区就不是独立的呀,有人会说,由于M1卡的加密算法被**了,我只能说那是还没有理解,具体算法不讲,只说明一下,算法只是使得猜解密码的时间变短,使得猜解密码成为可能。 这是什么样的原理呢?首先先了解,这是一个对等加密算法,也就是读卡器跟tag中都保存着同样的密码,也都是用同样的算法加密,然后看rfid的验证过程: 开始交互的时候,tag就已经把uid给reader说了,主要牵扯到防冲撞机制,之后才开始验证。 第一次验证时,读卡器首先验证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攻击必须要知道某一个扇区的密码,然后才能**其他扇区的密码,这个攻击方式,我倒觉得,加密传输跟扇区密码独立帮了很大的忙,如果每次nt都是明文发送,那还真没法**其他扇区了。 3)darkside攻击 假设某个IC卡的所有扇区都不存在默认密码怎么办?暴力**根本不可能,那这时候就是算法的问题导致的darkside攻击,我们照样不说具体算法什么漏洞之类,同样,我们考虑首先要把tag中的key相关的数据骗出来,也就是让tag发送出来一段加密的数据,我们通过这段加密的数据才能把key**出来,如果tag不发送加密的数据给我们,那没法**了。 前面我们也说了,第一次验证的时候tag会发送明文的随机数给读卡器,然后验证读卡器发送加密数据给tag,tag验证失败就停止,不会发送任何数据了,这样看,根本就没有办法**密码。 实际上经过研究人员大量的测试之后,发现算法还存在这样一个漏洞,当读卡器发送的加密数据中的某8bit全部正确的时候tag会给读卡器发送一个加密的4bit的数据回复NACK,其他任何情况下tag都会直接停止户。 那么这个4bit的加密的NACK就相当于把tag中的key带出来了,然后再结合算法的漏洞**出key,如果一个扇区的key**出来,就可以再使用nested authentication 攻击**其他扇区密码。 4)正常验证过程获得key 1-3都是通过一般的读卡器,把tag中的密码**出来,**的原理中,不管密码**算法的漏洞,实际上都是要让tag中发送出来一段密文。 那如果读卡器本身就保存有密码,卡也是授权的卡,也就是说卡和读卡器都是正确授权的,那么他们之间的加密数据交换就可以直接使用PM3等监控下来,然后通过“XOR效验与算Key”程序算出密码来。 这种情况下一般都是内部人员做案,或者把读卡器中的SAM偷出来,SAM实际上就是保存读卡器中密码的一个模块,然后通过另外的读卡器插入SAM,用正常的授权的卡刷卡,然后监控交换数据,从而算出密码。 5)另一个方面 前面4类方法基本上把目前的rfid卡**讲清楚了,文字太多,所以也就没有截图,还有一个地方大家不知道考虑了么? 我们提到的都是卡和读卡器之间的数据交换,这是加密的数据,但是有没有想过读卡器跟电脑相连这块,电脑中肯定没有加密芯片,所以这块肯定是明文传输,在某种环境中,比如通过电脑的控制程序导入密码(假设是二进制等不能直接观看的密码文件)到读卡器的时候,我们通过监控USB口(串口)数据通信,是不是就能明文看到密码呢? 截个图: 软件装载密码到读卡器 使用USB监控抓到的明文数据,包含了导入到读卡器中的密码明文。 常用工具说明: 1)mfoc mfocgui 以及目前网络上,淘宝上充斥的各类**工具都是基于nested authentication攻击原理,就是内置了一些默认密码,首先使用默认密码对每个扇区进行测试,如果某个扇区存在默认密码,然后就是用nested authentication攻击获得其他扇区的密码。 2)PM3的darkside攻击,Mfcuk等为darkside攻击工具,一个扇区密码都不知道的情况下**用的,由于**算法的原理本身就不是100%成功的,所以如果长时间**不出来,就停了重新换个nt,重新选个时间**,跟运气也有些关系。 不要别人几个小时,甚至几十分钟就**成功了,你几天都没有**出来,还一直傻傻的等,不如暂停换个nt,过一会再试。 3)Libnfc工具,目前用的比较多的是radiowar的nfcgui,radiowar网站上也说了,就是给nfc-list nfc-mfsetuid nfc-mfclassic 这三个工具写了个gui界面,你也可以使用命令行模式,或者你也可以自己写个gui界面调用这三个程序即可,这些都是操作卡或者读卡数据的工具,国内不同的IC卡读卡器都附带有一些读写卡程序,我用的一个比这个要方便的多
|