NFC手机模拟加密门禁卡

NFC手机模拟加密门禁卡

记录小米手机NFC模拟加密门禁卡,以及Proxmark3的使用。

0. 缘起

之前,小区用的门禁卡为非加密的门禁卡,使用小米手机系统自带的门卡模拟功能复制即可。
后来,小区门禁系统换了一家供应商,再使用之前的方法复制门禁卡,手机提示为加密卡,无法复制。

新的门禁系统,更安全了,也支持APP远程控制开门了,直到有一天门禁卡丢了,开始使用APP开门,发现这APP写得烂透了,十次有五次点击开门按钮无反应,需要反复退出、打开APP多次才能点击开门按钮成功,还有两次直接没了开门按钮,提示到物业管理处处理……
那个时候,我又开始怀念用手机刷门禁的快感了。。

1. 基础知识

于是,我开始查阅资料,基本确定了小米手机是还是可以通过其它方式模拟加密门禁卡的。
然后,资料查多了,记不到,又怕以后用到需要重新找,干脆水一篇博客记录下来。
如果熟悉NFC和IC卡,或者只想模拟加密门禁卡,并不关心原理,这章可以跳过,直接看下一章。

1.1 ID卡和IC卡

  • ID卡:全称身份识别卡(Identification Card),多为低频(125Khz),是一种不可写入的感应卡,含固定的编号,主要有台湾SYRIS的EM格式,美国HID、TI、MOTOROLA等各类ID卡。
  • IC卡:全称集成电路卡(Integrated Circuit Card),又称智能卡(Smart Card)。多为高频(13.56Mhz),可读写数据、容量大、有加密功能、数据记录可靠、使用更方便,如一卡通系统、消费系统等,目前主要有PHILIPS的Mifare系列卡。

主要区别:
ID卡,低频,不可写入数据,其记录内容(卡号)只可由芯片生产厂一次性写入,开发商只可读出卡号加以利用,无法根据系统的实际需要制订新的号码管理制度;
IC卡,高频,不仅可由授权用户读出大量数据,而且亦可由授权用户写入大量数据(如新的卡用户的权限、用户资料等),IC卡所记录内容可反复擦写;

IC卡由于其固有的信息安全、便于携带、比较完善的标准化等优点,在身份认证、银行、电信、公共交通、车场管理等领域正得到越来越多的应用,例如二代身份证、银行的电子钱包,电信的手机SIM卡、公共交通的公交卡、地铁卡、用于收取停车费的停车卡、小区门禁卡等;

以上图片来自淘宝商家,网上找了半天相关资料,发现淘宝商家解释得最清楚。

总结:
1.ID卡多为低频,IC多为高频;
2.IC卡整体上看比ID卡更有优势,市面上使用的大多数也是IC卡;
3.对于矩形白卡,里面为矩形线圈、表面没有编号的多为IC卡,里面为圆形线圈、表面有编号的多为ID卡;
4.对于异形卡,有编号的多为ID卡,最好使用带NFC的手机进行测试(目前手机NFC只能读高频13.56Mhz),IC卡会有反应;

1.2 接触式和非接触式IC卡

IC卡又可以分为接触式IC卡和非接触式IC卡。

  • 接触式IC卡:该类卡是通过IC卡读写设备的触点与IC卡的触点接触后进行数据的读写;
  • 非接触式IC卡:又称射频卡、感应式IC卡,该类卡与卡设备无电路接触,而是通过非接触式的读写技术进行读写(例如RFID、NFC),其内嵌芯片除了CPU、逻辑单元、存储单元外,增加了射频收发电路。该类卡一般用在使用频繁、信息量相对较少、可靠性要求较高的场合。

两者比较好区分,直接看卡上有无金属触点即可。

1.3 RFID和NFC

非接触式的读写技术常见的有两种:RFID技术和NFC技术。

  • RFID技术:
    1.通常应用在生产,物流,跟踪和资产管理上;
    2.根据频率划分包含低频、高频(13.56MHz)、超高频、微波等;
    3.作用距离取决于频率、读写器功率、读写器天线增益值、标签天线尺寸等,工作距离在几厘米到几十米不等;
    4.读写器和非接触卡可以是一对多关系,也可以说一对一关系;且读写器和非接触卡是两个实体,不能切换;

  • NFC技术:
    1.通常应用在门禁,公交卡,手机支付等领域;
    2.频率也是13.56MHz,且兼容大部分RFID高频相关标准(有些是不兼容);
    3.NFC作用距离较短,一般都是0~10厘米;
    4.读写器和标签几乎都是一对一关系;且支持读写模式和卡模式,可以作为读写器也可变为非接触卡;

总体来说,NFC是RFID的子集,但NFC有些新特性又是RFID所不具备的。

1.4 ID卡类型

ID卡,工作在低频(125Khz),根据卡内使用芯片的不同,有如下分类:

  • ID卡
    EM4XX系列,多为EM4100/EM4102卡,常用的固化ID卡,出厂固化ID,只能读不能写;常用于低成本门禁卡,小区门禁卡,停车场门禁卡;

  • ID白卡
    EM4305或T5577,可用来克隆ID卡,出厂为白卡,内部EEPROM可读可写,修改卡内EEPROM的内容即可修改卡片对外的ID号,达到复制普通ID卡的目的;
    T5577写入ID号可以变身成为ID卡,写入HID号可以变身HID卡,写入Indala卡号,可以变身Indala卡

  • HID卡
    全称HID ProxⅡ,美国常用的低频卡,可擦写,不与其他卡通用;

1.5 IC卡类型

IC卡中最常见的是NXP Mifare系列卡,工作在高频(13.56Mhz),根据卡内使用芯片的不同,有如下分类:

  • M1卡
    全称Mifare S50,是最常见的卡,出厂固化UID(UID即指卡号,全球唯一),可存储修改数据;常用于学生卡,饭卡,公交卡,门禁卡;

  • M0卡
    全称Mifare UltraLight,相当于M1卡的精简版,容量更小、功能更少,但价格更低,出厂固化UID,可存储修改数据;常用于地铁卡,公交卡;

以上两种固化了UID,为正规卡,接下来就是一些没有固化UID,即不正规的卡:

  • UID卡
    全称Mifare UID Chinese magic card,国外叫做中国魔术卡,M1卡的变异版本,使用后门指令(magic指令),可修改UID(UID在block0分区),可以用来完整克隆M1卡的数据;
    但是现在新的读卡系统通过检测卡片对后门指令的回应,可以检测出UID卡,因此可以来拒绝UID卡的访问,来达到屏蔽复制卡的功能(即UID防火墙系统);

  • CUID卡
    为了避开UID防火墙系统,CUID卡应运而生,取消响应后门指令(magic指令),可修改UID,是目前市场上最常用的复制卡;
    近两年,智能卡系统制造公司,根据CUID卡的特性研发出CUID卡防火墙,虽然现在(2019年)还不是很普及,但是总有一天CUID卡会和UID卡一样面临着淘汰;

  • FUID卡
    FUID卡只能写一次UID,写完之后自动固化UID所在分区,就等同M1卡,目前任何防火墙系统都无法屏蔽,复制的卡几乎和原卡一模一样;
    但缺点也相对明显,价格高、写坏卡率高,写错就废卡。

  • UFUID卡
    集UID卡和FUID卡的优点于一身,使用后门指令,可修改UID,再手动锁卡,变成M1卡。
    可先反复读写UID,确认数据无误,手动锁卡变成M1,解决了UID卡的UID防火墙屏蔽,也解决FUID的一次性写入容易写错的问题,且价格比FUID卡还便宜;

判断是M0卡(Mifare UltraLight),还是M1卡(Mifare Classic 1k),可以通过SAK值判断。

产品ATQASAKUID长度
Mifare Mini 00 04 09 4 bytes
Mifare Classic 1k 00 04 08 4 bytes
Mifare Classic 4k 00 02 18 4 bytes
Mifare Ultraligh 00 44 00 7 bytes
Mifare Plus 00 44 20 7 bytes

1.6 IC卡详细分析

1.6.1 IC卡存储器结构

以M1卡为例,介绍IC卡数据结构。
M1卡有从0到15共16个扇区,每个扇区配备了从0到3共4个数据段,每个数据段可以保存16字节的内容;
每个扇区中的段按照0~3编号,第4个段中包含KEYA(密钥A 6字节)、控制位(4字节)、KEYB(密钥B 6字节),每个扇区可以通过它包含的密钥A或者密钥B单独加密;

  • 厂商段
    每张M1卡都有一个全球唯一的UID号,这个UID号保存在卡的第一个扇区(0 扇区)的第一段(0 编号数据段),也称为厂商段。
    其中前4个字节是卡的UID,第5个字节是卡 UID 的校验位,剩下的是厂商数据。
    并且这个段在出厂之前就会被设置了写入保护,只能读取不能修改,前面各种能修改UID的卡,UID是没有设置保护的,也就是厂家不按规范生产的卡。
  • 数据段
    除了第0扇区外,其它每个扇区都把段0、段1、段2作为了数据段,用于保存数据。
    数据段的数据类型可以被区尾的控制位(Access Bits)配置为读/写段(用于譬如无线访问控制)或者值段(用于譬如电子钱包)。
    值段有固定的存储格式,只能在值段格式的写操作时产生,值段可以进行错误检测和纠正并备份管理,其有效命令包括读、写、加、减、传送、恢复,值段格式如下:

Value表示一个带符号4字节值,为了保证数据的正确性和保密性,值被保存了3次,两次直接保存,一次取反保存。该值先保存在0字节-3字节中,然后将取反的字节保存在4字节-7字节中,还保存了一次在8字节-11字节中。
Adr表示一个字节的地址,当执行备份管理时用于保存存储段的地址。地址字节保存了4次,取反和不取反各保存了2次。在执行加值、减值、恢复和传送等操作时,地址保持不变,它只能通过写命令改变。

  • 控制段
    每个扇区都有一个区尾控制段,它包括密钥A和密钥B(可选),以及本扇区四个段的访问控制位 (Access bits);访问控制位也可用于指出数据段的类型(为读/写段还是值段);控制段的存储格式如下:

如果不需要密钥B,那么区尾的最后6个字节可以作为数据字节,用户数据可以存储在区尾的第9个字节,这个字节具有和字节6、7、8一样的访问权限。

1.6.2 IC卡访问存储器

  • 数据段支持的操作
    根据使用的密钥和相应区尾访问条件的不同,数据段所支持的存储器操作也不同,存储器的操作类型如下:

可以看到只有作为值段时,才能加、减、传送、恢复。

  • 各区的访问位定义
    每个数据段和区尾的访问条件由3个位来定义,它们以取反和不取反的形式保存在区尾指定字节中。
    访问位控制了使用密钥A和B操作存储器的权限,当知道相关的密钥和当前的访问控制条件时,可以修改访问条件,各区的访问位定义如下:
  • 访问位在区尾的存储形式
  • 区尾的访问条件
    根据区尾(段 3)访问位的不同,访问条件可分为 “从不”、“密钥A”、“密钥B” 或“密钥A|B”(密钥A或密钥B),区尾的访问条件如下:

用灰色标明的行是密钥B可被读的访问条件,此时密钥B可以存放数据。
例如:当段3的访问条件C13C23C33=100时,表示:密钥 不可读(隐藏),验证密钥B正确后,可写(或更改);访问控制位在验证密钥A或密钥B正确后,可读不可写(写保护);密钥B不可读,在验证密钥 B 正确后可写;
又如:当段3的访问条件C13C23C33=110或者111时,除访问控制位需要在验证密钥A或密钥B正确后可读外,其他如访问控制位的改写,密钥 A,密钥 B 的读写权限均被锁死而无法访问;

  • 数据段的访问条件
    根据数据段(段 0-2 访问位的不同,访问条件可分为 “从不”、“密钥A ”、“密钥B ” 或“密钥A|B”(密钥A或密钥B)。
    相关访问位的设置定义了该段的应用(或者说数据段类型)以及所支持的应用命令,不同的数据段类型可以进行不同的访问操作。 读/写段可以进行读操作和写操作。值段可以进行加、减、传送和恢复的值操作。
    其中一种情况中(001)只能对不可再充电的卡进行读操作和减操作,另一种情况中(110)使用密钥B可以再充电。 厂商段无论设置任何的访问位都只是只读的, 数据段的访问条件如下:

如果密钥B可以在相应的区尾被读出,它就不能用于确认(在前面所有表中的灰色行)。如果读卡器要用这些(带灰色标记的)访问条件的密钥B确认任何段,卡会在确认后拒绝任何存储器访问操作。

1.6.3 举例说明

Mifare S50出厂时,访问控制字节(字节6-字节9)被初始化为“FF 07 80 69”,KEY A和KEY B的默认值为“FF FF FF FF FF FF” ;
字节6为FF,二进制为1111111;字节7为07,二进制为00000111;字节8为80,二进制为10000000,如下:

对照前面的访问位在区尾的存储形式图,可得知访问控制位为:
C10C20C30=000;C11C21C31=000;C12C22C32=000;C13C23C33=001。

C10C20C30、C11C21C31、C12C22C32对应数据段0、1、2,参考数据段的访问条件图即可得知该段三个数据区的访问权限;
C13C23C33对应区尾(段 3),参考区尾的访问条件图即可得知该段的访问权限;

块0控制位为:0 0 0 权限为:通过A或者B密码认证后可读,可写,可进行加值和减值操作;
块1控制位为:0 0 0 权限为:通过A或者B密码认证后可读,可写,可进行加值和减值操作;
块2控制位为:0 0 0 权限为:通过A或者B密码认证后可读,可写,可进行加值和减值操作;
块3控制位为:0 0 1 权限为:A密码不可读,验证A或者B密码后可改写A密码;验证A或者B密码后,可读可改写存取控制;验证A密码或者B密码后,可读可改写B密码;

这样每次换算还是有点麻烦,可以使用M1 S50卡控制字节生成工具快速换算:

最下面一行可以输入想解释的控制字,也可以根据上面的设置生成控制字;
最上面一行,左边是数据段0、1、2的访问控制位,右边是对应权限所需要的秘钥;
中间的一行,左边是区尾的访问控制位,右边是对应权限所需要的秘钥;

1.7 非加密IC卡和加密IC卡

非加密IC卡和加密IC卡的区别就是,非加密IC卡中所有扇区的KEYA和KEYB数值都是默认值FFFFFFFFFFFF;
而加密IC卡中,其中有扇区的KEYA和KEYB不等于FFFFFFFFFFFF,部分扇区加密的卡称半加密IC卡,所有扇区都加密的卡称全加密IC卡。

一般的读卡器,像手机的NFC,是读不到IC卡的加密数据的,需要用专门的工具,比如Proxmark3读取。

对于IC卡,除了对卡上数据加密,还有滚动码加密、服务器数据验证等技术。
因此,对IC卡的解密,更多的是门禁卡、签到卡、车库卡等的讨论,像公交卡、饭卡等涉及到资金问题的,基本都有服务器定期校验,得先搞定服务器再说,难度高还违法。

参考资料:
码农生活 篇二:IC卡门卡模拟探秘
IC卡简介【M1/S50,UID,CUID,FUID,UFUID复制卡介绍】
谈谈 Mifare Classic 破解
rfid-practice
Type A 卡存储结构与通信
Proxmark3 Easy破解门禁卡学习过程

2. 手机NFC模拟加密门禁卡

有了前面的知识,再来看现在我的加密门禁卡情况,手机能识别为加密卡,肯定是IC卡。

首先,加密卡在目前这个情况下是无法解密的,如果按照下面的操作失败,请参考下一章。
部分门禁系统只认证IC卡的UID,利用这一情况,可以试试复制门禁卡的UID,看运气能否打开门。

在已root的情况下,直接使用APP NFC卡模拟 便可读取加密卡的UID和非加密数据、并写UID到手机NFC里。
在未root的情况下,使用小米系统自带的门卡模拟功能,出于安全考虑,是不能对加密卡进行任何操作。手机的NFC,理论上可以读加密IC卡的UID,因此可以使用第三方软件MifareClassicTool读取UID,因为没有root,不能写手机NFC,但可以写IC卡,因此还需要一张CUID卡(不能使用UID卡),某宝上一块多一张,思路就是先读取加密卡的UID,再读取CUID卡的数据,然后将CUID卡的UID改为加密卡一样的UID,再将修改后的数据写回到CUID卡,最后用小米系统自带的门卡模拟功能,复制未加密的CUID卡即可。

  • 1.读取加密卡的UID
    打开软件Mifare Classic Tool,将加密门禁卡放到手机的NFC感应区域,识别到IC卡后,点击“工具”->“显示标签信息”,可以看到加密门禁卡的8个数字,4字节的UID。
    注意,在16进制里,每个数字为4位(2^4=16),8位(bits)为一字节(bytes),即两个数字组成一字节,这里8个数字,即为4字节(Bytes)。
    前8个数字,每个数字代表4位,8位为一字节,8个数字就是32位,即4字节
    接着打开“工具”->“BCC计算器”,输入UID,得到1位BBC(两个数字)校验数据。
  • 2.读取CUID卡数据
    将CUID卡放到手机的NFC感应区域,识别到IC卡后,点击“读标签”->“启动映射并读取标签”,即可得到CUID白卡的所有信息。
    接着修改第一行的前10个数字,改为加密门禁卡的UID(8个数字)和BCC(2个数字),一共10个数字,并点右上角保存图标保存。
  • 3.写数据到CUID卡
    再将CUID卡放到手机的NFC感应区域,识别到IC卡后,点击“写标签”,勾选“写转储(克隆)”->“显示选项”->“高级:使能厂商块写入”。
    再点击“选择转储”,选择刚才保存的数据,点击“选择转储”。

在弹出的选择写扇区界面,默认即可,点击“好的”,最后点击“启动映射并写转储数据”。

  • 4.NFC手机复制CUID卡
    最后,使用小米手机系统自带的门卡模拟功能,复制刚才写入新UID的CUID卡即可。

接着,就看运气吧,我小区的门禁系统就只认UID,搞定。

参考资料:
如何用小米NFC手机模拟加密卡(的部分功能)

3. Proxmark3解密门禁卡

先理一下技术原理:
1.对于未加密的IC卡,直接读出UID,写入空白卡即可;也就是我最开始那个门禁系统;
2.对于加密的IC卡,先读取UID,写入空白卡,如果门禁只认UID,也就可以了;也就是我现在的门禁系统;
3.越来越多的门禁,不再只看UID,还要看分区的加密数据,这个加密数据,一般的读卡器读不出来(比如手机NFC),需要Proxmark3、ACR122U等专业读卡器,利用漏洞把卡里的数据读取出来。这里读取出来时,就已经是16进制的数据了,一般门禁系统,把UID和加密数据直接写入新卡即可;
4.接着前面情况,如果不是门禁系统而是饭卡,余额的变化,就是加密数据在不断的变化,此时读取出来数据,对数据分析后,写入新数据,即实现了修改余额的效果,不过一般都有服务器定期验证,发现没有充卡记录但余额变化,迟早会发现问题;
5.如果是高级点的门禁,比如某些电梯卡,采用动码技术,卡前后的数据会发生变化,而且每次变化都没规律,复制后用新卡,原卡就不能再用了,否则原卡前后数据不一样,可能会被拉进黑名单锁卡;需要破解滚动码的加密规则,才能自由写卡;
6.Proxmark3、ACR122U都是工具,功能是利用IC卡漏洞,读取加密区域数据,同时也能写卡,具体的数据的修改规则,得自己研究;两个工具的区别是Proxmark3可以写高频和低频(IC卡和ID卡),而ACR122U只能读写高频(IC卡);
7.NXP Mifare系列卡,即便数据全加密,Proxmark3也能直接解出来;国产卡全加密后,需要先侦测个密码,再用Proxmark3才能解出来,这里的密码可以使用变色龙(ChameleonMini)去刷卡的地方侦测密码,成功率更高;
8.另外,进行学习研究是好事,在不危害他人利益的情况下方便自己问题也不大,危害他人利益肯定违法犯罪,切勿以身试法,参考此文进行犯罪的相关人员与本人无关;

常规IC卡破解流程如下:

Proxmark3是由Jonathan Westhues设计的开源硬件,主要用于他的硕士毕业论文。
现在某宝卖的Proxmark3,都是国内厂商参考源硬件制作出来,我手里这台Proxmark3 V5.0也是来自某宝,内存512K,双USB口,已刷好目前最新稳定版的冰人固件3.1.0。

Proxmark3除了官方的固件,还有不少第三方固件,这些固件中,以Iceman的固件最流行,除此之外,卖家送的资料里还有离线嗅探固件用于侦测密码,设计的双USB的用意,也是为此。

3.1 PM3常用指令(部分)

PM3 Universal GUI是客户端软件,用于Windows上向Proxmark3发送命令。

左上角需要选择对应的串口端口,左边是命令介绍,可以点击所需命令,将自动出现在输入框,点击Run则执行。

3.1.1 help主帮助命令

命令介绍
help 显示帮助
data 图形窗口/缓冲区数据操作等
exit 退出Proxmark3的终端环境
hf 高频相关命令
hw 硬件检测相关命令
lf 退出Proxmark3的终端环境等同exit

3.1.2 hw硬件检测相关命令

命令介绍
detectreader [‘l’/‘h’] –检测外部读卡器频率区域(选项“l”或“h”限制到低频LF或高频HF)
fpgaoff 设置FPGA为关闭
readmem 从芯片中读取10进制地址的存贮器
reset 重置Proxmark3
setlfdivisor <19 255="" -=""> – 在12Mhz/(基数+1)驱动LF天线
setmux – 设置ADC多路复用器为一个特定的值
tune 测量天线的调谐
version 显示Proxmark3的固件版本信息
status 显示Proxmark3状态信息
ping 测试Proxmark3连接是否正常

3.1.3 lf低频相关命令

命令介绍
cmdread <’0’> <’1’> <命令> [‘h’] – 在读取之前发送命令来调整LF读卡器周期(以微妙为单位)(’h’选项为134)
em4x EM4X卡类相关命令…
flexdemod 解调FlexPass样本
hid HID卡类相关命令…
indalademod [‘224’] –解调Indala样本的64位UID(选项’224’是224位)
indalaclone UID] [‘l’]– 克隆Indala到T55x7卡 (标签必须在天线上)(UID为16进制)(选项’l’表示224位UID)
read [‘h’] – 读取125/134 kHz的低频ID标签(选项’h’是134)
sim [GAP] – 从可选GAP的缓冲区模拟低频标签(以微秒为单位)
simbidir 模拟低频标签(在读卡器和标签之间双向传输数据)
simman <时钟> <比特率> [GAP] 模拟任意曼彻斯特低频标签
ti TI卡类相关命令…
hitag Hitag标签与应答相关…
vchdemod [‘clone’] - 解调VeriChip公司样本
t55xx T55xx卡类相关命令…
PCF7931 PCF7931卡类相关命令…

3.1.4 hf高频相关命令

命令介绍
14a ISO14443A卡的相关命令…
14b ISO14443B卡的相关命令…
15 ISO15693卡的相关命令…
epa 德国身份证的相关命令…
legic LEGIC卡的相关命令…
iclass ICLASS卡的相关命令…
mf MIFARE卡的相关命令…
tune 连续测量高频天线的调谐

支持的高频卡很多,最常用的是MIFARE卡,因此暂只详细介绍下MIFARE卡的命令。

  • hf mf(MIFARE卡的相关命令…)
命令介绍
dbg 设置默认调试模式
rdbl 读取MIFARE classic卡的区块数据
rdsc 读取MIFARE classic卡的扇区数据
dump 导出MIFARE classic卡的数据到二进制文件
restore 从二进制文件恢复数据到空白的MIFARE classic卡
wrbl 改写MIFARE classic卡的区块数据
chk 测试MIFARE classic卡的各个区块KEY A/B
darkside 基于PRNG漏洞,执行mifare “DarkSide”攻击操作
nested 测试嵌套认证漏洞,基于一个已知Key,获取都有扇区Keys
sniff 嗅卡片与读写器之间的通讯(等同于hf 14a snoop)
sim 模拟一个MIFARE卡片
eclr 清除仿真内存的各区块数据
eget 获取仿真内存的各区块数据
eset 设置仿真内存的各区块数据
eload 从导出的文件加载仿真数据
esave 导出保存仿真数据到文件
ecfill 利用仿真器的keys来填补仿真内存
ekeyprn 打印输出仿真内存中的keys
csetuid 直接设置可改UID卡的UID
csetblk 把对应区块数据写入UID卡
cgetblk 读取UID卡对应区块数据
cgetsc 读取UID卡对应扇区数据
cload 写入dump数据到UID卡
csave 保存UID卡数据到文件或者仿真内存

参考资料:
PM3常用命令

3.2 破解加密门禁卡

3.2.1 破解思路

  • 1.获得任意扇区的密钥(使用以下任一方法成功即可):
     a.PRNG漏洞攻击得0扇区密匙,对应命令:hf mf darkside
     b.默认密码扫描获得密匙,对应命令:hf mf chk *1 ? t d
     c.探读卡机和卡片交互数据获得密匙;
     d.模拟成M1卡刷卡后捕获密匙(挑读卡机,兼容性不好);

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
pm3 --> hf mf chk
Usage: hf mf chk [h] <block number>|<*card memory> <key type (A/B/?)> [t|d] [<key (12 hex symbols)>] [<dic (*.dic)>]
Options:
h this help
* all sectors based on card memory, other values then below defaults to 1k
0 - MINI(320 bytes)
1 - 1K
2 - 2K
4 - 4K
d write keys to binary file
t write keys to emulator memory
 
 
Examples:
hf mf chk 0 A 1234567890ab keys.dic -- target block 0, Key A
hf mf chk *1 ? t -- target all blocks, all keys, 1K, write to emul
hf mf chk *1 ? d -- target all blocks, all keys, 1K, write to file
 
pm3 --> hf mf chk *1 ? t d
No key specified, trying default keys
[ 0] ffffffffffff
[ 1] 000000000000
[ 2] a0a1a2a3a4a5
[ 3] b0b1b2b3b4b5
[ 4] c0c1c2c3c4c5
[ 5] d0d1d2d3d4d5
[ 6] aabbccddeeff
[ 7] 1a2b3c4d5e6f
[ 8] 123456789abc
[ 9] 010203040506
[10] 123456abcdef
[11] abcdef123456
[12] 4d3a99c351dd
[13] 1a982c7e459a
[14] d3f7d3f7d3f7
[15] 714c5c886e97
[16] 587ee5f9350f
[17] a0478cc39091
[18] 533cb6c723f6
[19] 8fd0a4f256e9
 
Time in checkkeys: 0 seconds
 
testing to read key B...
|---|----------------|---|----------------|---|
|sec|key A |res|key B |res|
|---|----------------|---|----------------|---|
|000| ------------ | 0 | ------------ | 0 |
|001| ------------ | 0 | ------------ | 0 |
|002| ------------ | 0 | ------------ | 0 |
|003| ------------ | 0 | ------------ | 0 |
|004| ------------ | 0 | ------------ | 0 |
|005| ------------ | 0 | ------------ | 0 |
|006| ------------ | 0 | ------------ | 0 |
|007| ------------ | 0 | ------------ | 0 |
|008| ------------ | 0 | ------------ | 0 |
|009| ------------ | 0 | ------------ | 0 |
|010| ------------ | 0 | ------------ | 0 |
|011| ------------ | 0 | ------------ | 0 |
|012| ------------ | 0 | ------------ | 0 |
|013| ------------ | 0 | ------------ | 0 |
|014| ------------ | 0 | ------------ | 0 |
|015| ------------ | 0 | ------------ | 0 |
|---|----------------|---|----------------|---|
Found keys have been transferred to the emulator memory
Printing keys to binary file hf-mf-4033B54A-key.bin...
Found keys have been dumped to file hf-mf-4033B54A-key.bin. 0xffffffffffff has been inserted for unknown keys.

 

hf mf chk *1 ? t d命令会使用默认密码扫描,含义如下:

1
2
3
4
*1: 第一个为检测块的编号,第二个为IC卡内存大小;
?: 检测秘钥是A还是B,或者两者;
t: 保存检测秘钥到Proxmark3内存;
d: 保存检测到秘钥到文件,默认文件名hf-mf-UID-key.bin

 

  • 2.利用MFOC漏洞,用已知扇区密匙求所有扇区密匙;

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
pm3 --> hf mf nested
Usage:
all sectors: hf mf nested <card memory> <block number> <key A/B> <key (12 hex symbols)> [t,d]
one sector: hf mf nested o <block number> <key A/B> <key (12 hex symbols)>
<target block number> <target key A/B> [t]
Options:
h this help
card memory - 0 - MINI(320 bytes), 1 - 1K, 2 - 2K, 4 - 4K, <other> - 1K
t transfer keys into emulator memory
d write keys to binary file `hf-mf-<UID>-key.bin`
 
Examples:
hf mf nested 1 0 A FFFFFFFFFFFF
hf mf nested 1 0 A FFFFFFFFFFFF t
hf mf nested 1 0 A FFFFFFFFFFFF d
hf mf nested o 0 A FFFFFFFFFFFF 4 A
 
pm3 --> hf mf nested 1 0 A FFFFFFFFFFFF d t
[+] Testing known keys. Sector count=16
 
[-] Chunk: 0.7s | found 31/32 keys (21)
[+] Time to check 20 known keys: 1 seconds
 
[+] enter nested attack
[+] target block: 4 key type: A -- found valid key [112233445566]
 
[-] Chunk: 0.7s | found 32/32 keys (1)
[+] time in nested: 2 seconds
 
[+] trying to read key B...
|---|----------------|---|----------------|---|
|sec|key A |res|key B |res|
|---|----------------|---|----------------|---|
|000| ffffffffffff | 1 | ffffffffffff | 1 |
|001| 112233445566 | 1 | ffffffffffff | 1 |
|002| ffffffffffff | 1 | ffffffffffff | 1 |
|003| ffffffffffff | 1 | ffffffffffff | 1 |
|004| ffffffffffff | 1 | ffffffffffff | 1 |
|005| ffffffffffff | 1 | ffffffffffff | 1 |
|006| ffffffffffff | 1 | ffffffffffff | 1 |
|007| ffffffffffff | 1 | ffffffffffff | 1 |
|008| ffffffffffff | 1 | ffffffffffff | 1 |
|009| ffffffffffff | 1 | ffffffffffff | 1 |
|010| ffffffffffff | 1 | ffffffffffff | 1 |
|011| ffffffffffff | 1 | ffffffffffff | 1 |
|012| ffffffffffff | 1 | ffffffffffff | 1 |
|013| ffffffffffff | 1 | ffffffffffff | 1 |
|014| ffffffffffff | 1 | ffffffffffff | 1 |
|015| ffffffffffff | 1 | ffffffffffff | 1 |
|---|----------------|---|----------------|---|
[+] saving keys to binary file hf-mf-4033B54A-key.bin...

 

hf mf nested 1 0 A FFFFFFFFFFFF d t命令用已知扇区密匙求所有扇区密匙,含义如下:

1
2
3
4
5
1: IC卡内存大小;
0: 块编号;
A: 秘钥类型;
d: 保存检测到秘钥到文件,默认文件名hf-mf-UID-key.bin
t: 保存检测秘钥到Proxmark3内存;

 

  • 3.用破解出的密匙把卡片数据读出导出电脑;

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
pm3 --> hf mf dump
|-----------------------------------------|
|------ Reading sector access bits...-----|
|-----------------------------------------|
|-----------------------------------------|
|----- Dumping all blocks to file... -----|
|-----------------------------------------|
[+] successfully read block 0 of sector 0.
[+] successfully read block 1 of sector 0.
[+] successfully read block 2 of sector 0.
[+] successfully read block 3 of sector 0.
[+] successfully read block 0 of sector 1.
[+] successfully read block 1 of sector 1.
[+] successfully read block 2 of sector 1.
[+] successfully read block 3 of sector 1.
[+] successfully read block 0 of sector 2.
[+] successfully read block 1 of sector 2.
[+] successfully read block 2 of sector 2.
[+] successfully read block 3 of sector 2.
[+] successfully read block 0 of sector 3.
[+] successfully read block 1 of sector 3.
[+] successfully read block 2 of sector 3.
[+] successfully read block 3 of sector 3.
[+] successfully read block 0 of sector 4.
[+] successfully read block 1 of sector 4.
[+] successfully read block 2 of sector 4.
[+] successfully read block 3 of sector 4.
[+] successfully read block 0 of sector 5.
[+] successfully read block 1 of sector 5.
[+] successfully read block 2 of sector 5.
[+] successfully read block 3 of sector 5.
[+] successfully read block 0 of sector 6.
[+] successfully read block 1 of sector 6.
[+] successfully read block 2 of sector 6.
[+] successfully read block 3 of sector 6.
[+] successfully read block 0 of sector 7.
[+] successfully read block 1 of sector 7.
[+] successfully read block 2 of sector 7.
[+] successfully read block 3 of sector 7.
[+] successfully read block 0 of sector 8.
[+] successfully read block 1 of sector 8.
[+] successfully read block 2 of sector 8.
[+] successfully read block 3 of sector 8.
[+] successfully read block 0 of sector 9.
[+] successfully read block 1 of sector 9.
[+] successfully read block 2 of sector 9.
[+] successfully read block 3 of sector 9.
[+] successfully read block 0 of sector 10.
[+] successfully read block 1 of sector 10.
[+] successfully read block 2 of sector 10.
[+] successfully read block 3 of sector 10.
[+] successfully read block 0 of sector 11.
[+] successfully read block 1 of sector 11.
[+] successfully read block 2 of sector 11.
[+] successfully read block 3 of sector 11.
[+] successfully read block 0 of sector 12.
[+] successfully read block 1 of sector 12.
[+] successfully read block 2 of sector 12.
[+] successfully read block 3 of sector 12.
[+] successfully read block 0 of sector 13.
[+] successfully read block 1 of sector 13.
[+] successfully read block 2 of sector 13.
[+] successfully read block 3 of sector 13.
[+] successfully read block 0 of sector 14.
[+] successfully read block 1 of sector 14.
[+] successfully read block 2 of sector 14.
[+] successfully read block 3 of sector 14.
[+] successfully read block 0 of sector 15.
[+] successfully read block 1 of sector 15.
[+] successfully read block 2 of sector 15.
[+] successfully read block 3 of sector 15.
[+] dumped 64 blocks (1024 bytes) to file hf-mf-4033B54A-data.bin

 

因为前面把秘钥保存到Proxmark3内存,这里就不需要指定秘钥文件,最后将生成hf-mf-UID-data.bin文件,里面就是IC卡的所有数据。

  • 4.放上UID/CUID空卡,把电脑中的数据写入卡中;
    Proxmark3不能识别、使用bin文件,需要转换成eml格式,可以使用PM3 Universal GUI提供的脚本转换。
    举例:
    1
    2
    3
    4
    5
    6
    pm3 --> script run dumptoemul.lua -i hf-mf-4033B54A-data.bin -o 4033B54A.eml
    [+] Executing: dumptoemul.lua, args '-i hf-mf-4033B54A-data.bin -o 4033B54A.eml '
     
    Wrote an emulator-dump to the file 4033B54A.eml
     
    [+] Finished

script run命令将运行scripts目录下对应脚本,后面接的参数由脚本决定,可以打开脚本看说明,dumptoemul.lua脚本参数含义如下:

1
2
i: 指定待转换的bin文件;
o: 指定生成的eml文件名;

 

之后便会得到一个eml文件。

注意,UID卡和CUID卡读写数据的流程存在差异,这里分开举例。
UID卡存在后门指令,无需知道秘钥即可实现读写。
CUID卡没有后门指令,验证对密码后才可修改内容,因此每次写CUID卡前,都需要按前面的方式先破解密码,才能利用密码写数据。
另外,如果不小心写错UID号的校验位,导致无法读卡,此时就无法修复,只能做废卡处理。
因此,如果是使用IC卡作为中介写到手环/手机,那么UID卡是最好的选择,无论怎么写,就算写错也能利用后门指令修复。如果是复制卡,卡作为最终目标,那么CUID不响应后门指令,可以通过UID防火墙,是不错的选择。

写UID卡:
前面得到了卡数据文件4033B54A.eml,现在将其写到UID卡里。
举例:

1
2
3
4
pm3 --> hf mf cload 4033B54A
................................................................
 
[+] Loaded 64 blocks from file: 4033B54A.eml

 

注命令里传入的待写uml文件,不需要文件扩展名。
写完之后没有任何回显提示,可以使用hf mf cgetsc 0读出分区数据,再进行对比。

写CUID卡:
举例:

1
2
3
4
5
6
7
8
9
pm3 --> hf mf wrbl
Usage: hf mf wrbl <block number> <key A/B> <key (12 hex symbols)> <block data (32 hex symbols)>
Examples:
hf mf wrbl 0 A FFFFFFFFFFFF 000102030405060708090A0B0C0D0E0F
 
pm3 --> hf mf wrbl 0 A FFFFFFFFFFFF 01020304040804006263646566676869
--block no:0, key type:A, key:FF FF FF FF FF FF
--data: 01 02 03 04 04 08 04 00 62 63 64 65 66 67 68 69
isOk:01

 

hf mf wrbl命令会根据传入的秘钥,修改数据:

1
2
3
4
0: 指定修改第0分区;
A: 指定秘钥为A类型;
FFFFFFFFFFFF: 指定该秘钥;
000102030405060708090A0B0C0D0E0F: 指定修改的数据;

 

使用PM3 Universal GUI这样一个一个修改数据,感觉很麻烦,应该有其它方法暂未发现。
也可以使用其它客户端软件,有些针对国情修改的傻瓜式操作,使用起来也很方便。
这样写完一个分区后,isOk显示为01表示修改成功,全部修改完后,可以重新读取出来,对比数据。

3.2.1 写手机/手环思路

前面,利用CUID卡和手机应用MifareClassicTool,实现了手机未root情况下,模拟出加密卡UID号,通过了门禁。
有些门禁,不仅检测UID卡号,还检测某分区的加密数据,这就需要往手机NFC里写入加密数据。
小米手机自带的门卡模拟功能有两种:一种是模拟实体门卡,只能模拟非加密卡,即就是复制非加密卡的UID;第二种是添加虚拟门卡,会生成一张UID随机的卡,需要去物业处写卡,即物业把该卡UID号加入系统,并写入加密数据。
要想复制加密卡到手机,这两种方法都不行,首先排除第二种,系统生成的UID随机的卡,该卡的UID是无法修改的。第一种方法,虽然能复制得到UID,但没法复制加密数据,但至少成功了一半。
使用第一种方法模拟出来的卡,虽然系统不能复制加密数据,但可以使用Proxmark3写入加密数据,也就实现了UID号和加密数据的复制。

因此,模拟加密卡的思路:
1.使用Proxmark3获取加密卡数据;
2.只写UID号到实体UID/CUID卡;
3.手机模拟该UID/CUID卡;(实现UID号的复制)
4.使用Proxmark3往手机模拟卡写入加密数据;(实现加密数据的复制)

1.使用Proxmark3获取加密卡数据
将加密门禁卡放在Proxmark3,参考前面3.2.1 破解思路,先用默认密码扫描,获得任意扇区的密钥,然后用已知扇区密匙求所有扇区密匙,利用所有秘钥得到所有数据并导出,最后转换成eml格式。
依次数据以下命令,获取加密卡数据:

1
2
3
4
hf mf chk *1 ? t d
hf mf nested 1 0 A FFFFFFFFFFFF d t
hf mf dump
script run dumptoemul.lua -i hf-mf-4033B54A-data.bin -o 4033B54A.eml

 

得到三个文件:
hf-mf-4033B54A-key.bin:秘钥文件;
hf-mf-4033B54A-data.bin:数据文件;
4033B54A.eml:数据文件eml格式(非必须);

2.只写UID号到实体UID卡
将UID卡放在Proxmark3上,建议使用UID卡,写错了也能使用后门指令恢复。
用文本查看软件,如Notepad++打开hf-mf-4033B54A-data.bin4033B54A.eml,复制第一行数据,我这里为4033b54a8c0804000164efbc1488f31d
输入以下命令,设置UID号到UID卡:

1
hf mf csetblk 0 4033b54a8c0804000164efbc1488f31d

 

输入以下命令,查看是否设置成功:

1
hf 14a info

 

显示出UID : 40 33 B5 4A,和前面的4033b54a8c0804000164efbc1488f31d对应上了,说明成功。

3.手机模拟该UID卡
使用小米手机自带的模拟实体门卡功能,模拟该UID卡。

4.使用Proxmark3往手机模拟卡写入加密数据
手机模拟前面复制的卡,然后放到放在Proxmark3上。
输入以下命令,将加密数据写到手机模拟卡里:

1
hf mf restore u 4033B54A

 

显示如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Restoring hf-mf-4033B54A-data.bin to card
Writing to block 0: 40 33 B5 4A 8C 08 04 00 01 64 EF BC 14 88 F3 1D
#db# Cmd Error: 04
#db# Write block error
isOk:00
Writing to block 1: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
isOk:01
Writing to block 2: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
isOk:01
Writing to block 3: FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF
isOk:01
Writing to block 4: B5 33 40 50 12 31 23 00 00 01 00 00 23 59 00 00
isOk:01
Writing to block 5: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
isOk:01
Writing to block 6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
……

 

可看到第0分区写入失败,其它分区写入成功,既没破坏0分区的UID号,又写入了加密数据,达到了目的。


 

知识共享许可协议
本文采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,欢迎转载,但转载请注明来自hceng blog,并保持转载后文章内容的完整。本人保留所有版权相关权利。
posted @ 2021-04-11 09:51  chenlife  阅读(6285)  评论(0编辑  收藏  举报