1 PM3介绍

proxmark3是一款开源的RFID安全研究平台黑色按钮从图中我们可以看到左上方有一颗黑色按钮,这个按钮就是Proxmark3的功能键,主要用于启动嗅探模式以及停止进程功能,其中内置高频和低频天线,能够识别和读取大部分的RFID卡片,并且国产的PM3还可以通过转接头等工具和手机等智能设备进行连接,从而实现跨平台的使用。

2 RFID破解

前面对ID与IC之间的差别进行比较时得知,ID卡内的卡号读取无任何权限,易于仿制.IC卡内所记录数据的读取,写入均需相应的密码认证,甚至卡片内每个区均有不同的密码保护,全面保护数据安全。所以这里对于RFID卡片的破解主要目标就是IC卡。

这里我们使用典型的飞利浦公司的16扇区64扇块M1卡作为实验对象,首先看一下这种卡片内部的数据存储形式。

常用的M1卡主要有荷兰恩智浦(NXP)公司生产的S50 和S70,都是属于MifareClassic家族的。以S50为例,国内兼容的最好的厂家是上海复旦微电子生产的FM11RF08芯片,区别是NXP原装S50芯片的前15个扇区的密码块的控制位是:FF078069,最后1个扇区的密码快的控制位是:FF0780BC。

国产复旦FM11RF08芯片的所有扇区的所有控制位均为:FF078069,其次看芯片第0扇区第0块的代码,从第10位开始看,如果后面是08040062636就是复旦的芯片,如果后面是08040023569就是贝岭芯片。

MifareClassic 1k共有16个扇区,分别为0-15个扇区;每个扇区有4块,分别为0-3块,每个块有32个字符;0扇区的0块为只读块,只存储厂商代码和UID号。

其他每个扇区的前3块为数据库,最后一块为密码块。密码块的前12个字符为A区密码,中间8个字符为控制位,后面12个字符为B区密码。

控制位主要是读卡器在验证卡的时候所用到的,不同的控制位表示不同的验证方式。

结合上图,我们可以来计算一下MifareClassic 1K的真实容量,首先1扇区的0块为只读,所有扇区的3块都是固定的没有容量,那么真实容量就是:

32(每个块的容量)×3(每个扇区可写的块)×16(共16个扇区)-32(除去0扇区0块)=1504字节

1504字节比1k多出了480个字节,所以MifareClassic 1K 的真实容量将近1.5K

默认口令破解

IC卡在制造时制造厂商为了方便会将除0扇区之外的扇区的所有密码默认设置为FFFFFFFFFFFF,这就是IC卡片的默认密码,我们可以使用PM3对卡片的默认密码进行爆破。

早期的PM3要把高频天线连接到Proxmark3的天线接口,并且连接完成之后要查看一下天线与PM3连接之后的工作电压是否正常;国产的PM3工具在设计时就将高频天线和低频天线安装到一起,在使用时只需要实用工具对其电压等进行探测是否正常。由于PM3是一款开源的硬件产品,最早在2000左右就已经开始有人开始对其进行研究,所以现在相对的技术已经非常成熟,在外文资料中经常会看到一个PM3对应的利用工具,这个工具分为两种,一种是命令行下的利用工具,另外一种是英文的可视化图形界面。

但是这两款软件都有其对应的缺陷,在经过国人的二次开发之后推出了PM3 GUI版的利用工具。

软件中继承了绝大多数常见的软件,能够对RFID进行快速攻击。

首先使用数据线将PM3与电脑连接,并在设备管理器中查找相对应的串口。

连接成功后检测工作电压

将IC卡放置在高频卡读卡器位置,天线电压发生变化

高频天线电压下降非常明显,这就说明我们现在所持有的卡片为高频IC卡,下面尝试对器破解,首先先读取卡片类型。

什么是proprietary non-iso14443a card found,RATS not supported?

有时候Proxmark3在读取部分MIFARE Classic卡UID的信息时,因为无法得到RATS的返回信息,会判断为非ISO14443a标准的卡.国内有太多MIFARE Classic类的卡,并不是NXP出产的,所以Proxmark3就会出现了这样子的提示!

同时还会提示是否是中国后门卡,这也是因为IC可修改UID的卡片是中国人首先研究出来的,所以被统称为中国后门卡。后面我们会有详细的介绍。

通常当我们拿到相关的卡的时候,我们应该先用chk命令去检测一下测试卡是否存在出厂时遗留的默认Key,因为使用默认的Key导致恶意用户可以使用其进行卡的信息读取以及修改。

已知的部分默认Key列表

nffffffffffff

nb0b1b2b3b4b5

n000000000000

na0a1a2a3a4a5

naabbccddeeff

n714c5c886e97

na0478cc39091

PM3程序中内置了一个默认密码列表,并会自动阐释使用者以列表中的密码进行探测。

并且通过默认密码扫描功能成功读取了除1扇区和2扇区的山区密码

这是利用嵌套认证漏洞使用任何一个扇区的已知密匙,获取所有扇区的密匙,此漏洞成功率较高,这个漏洞也被称作知一密求全密,我们现在已经知道其中的几个扇区的默认密码,使用PM3的知一密求全密的功能对扇区1、2进行破解

成功破解出1、2扇区的密码。

利用PRNG漏洞破解

MIFARE Classic采用的是Crypto-1私有加密算法,其算法的特点就是对称式的密码算法或者说是私钥密码系统。其主要组成部分是伪随机数发生器(PRNG)、48位的线性反馈移位寄存器(LFSR)以及非线性函数。由于算法当中的Filter Function的设计出现缺陷,导致改变线性反馈移位寄存器的后8位数值就有可能得到所对应的Keystream。这个缺陷类似于802.11b WEP算法,不同的明文有极高的可能性被相同的Keystream,使得整个加密算法出现了漏洞。

Proxmark3基于PRNG的安全缺陷是进行随机数碰撞,利用PRNG的安全缺陷我们可以很快速地得到对应的密钥,从而进行进一步的破解操作。

如果我们无法进行基于PRNG的安全缺陷破解的时候,很大可能是因为卡类增加了对应的机制(增加了防碰撞机制)以及修复了漏洞。

命令:hfmf mifare当输入命令后,需要耐心等待,整个过程花费的时间有快有慢。

结果出现后,首先要判断的是Found invaidKey还是Found vaidkey,如果是invaidkey的话,就是代表基于PRNG的漏洞出现的Key是错误的,并非正确的Key来的。但是最起码可以证明卡是存在PRNG漏洞的。接下来就是记住数值当中的Nt,这个数值将会被利用来进行第二次的PRNG漏洞的攻击测试

命令:hfmf mifareNT值

当输入命令后,窗口会再次进入进度状态,依然请记住耐心等待结果,并且如需停止,请按黑色按钮

因为基于PRNG的漏洞进行的破解,所以有时候会出现多次Nt的循环,这是很正常的结果,我们需要不断的利用Nt去进行真正Key的破解。整个过程是漫长而乏味的

RFID伪造

前面提到过中国后门卡,这里给大家讲解一下中国后门卡的原理的发展。

在早期RFID技术开始兴起时,卡片的价格还比较高昂,随着后期这项技术的关注程度越来越高,中国的很多厂商也考试对这项技术进行研究,并很快研究出了和M1系列卡片功能一致且价格极其低廉的卡片,但是后期有一部分人发现这种卡片在使用时有的需要实现相同功能,但是卡片又没有办法复制,所以就开始研究一种能够复制UID的卡片,并在后期成功研制出能够进行复制的卡片,这就是早期的CUID卡,这种卡片能够在正常使用时间内无限次的修改卡片的UID,并能够实现和市场上流通的卡片相同的功能。

后来很多厂商发现了这一问题,开始研究如何对后门卡进行预防,随后出现一大批能够检测中国后门卡的方案,其中大部分方案都是利用中国后门卡的自身的功能对其中的uid进行修改测试,如果机器判断能够修改UID,即停止对这张卡进行服务。

后来研究人员又对后门卡进行升级,然后推出了FUID卡,这种卡片和CUID卡相类似,但是它有一个特性就是在出场之后只能对其UID进行一次修改,一次修改完毕之后机会将0扇区锁死,无法再次修改,这种方案成功绕过了场上的检测机制。ID卡片的发展机制与之类似。

下面进行IC卡的复制实战,首先将卡中数据全部读取并写入到编辑区

放上空白的S50卡片,并点击克隆到空白S50卡片,待写入成功之后即可将数据写入到空白卡中。并能够使用复制之后的卡片进行河源卡一样的操作。

RFID嗅探

RFID嗅探也是一种非常常见的RFID攻击方式,对于一些卡片我们无法使用默认密码或者PRNG漏洞攻破其密码,但是我们仍然可以使用嗅探的方式对其进行攻击,从而嗅探出密码。

点击GUI软件中的现场有卡嗅探按钮,或者在命令行下输入hf 14a snoop

然后将卡片读卡器和PM3按照如下顺序进行放置

待嗅探完成之后按下PM3左侧按钮,并在命令行下输入hf list 14a命令查看嗅探结果。

并使用工具计算出扇区密码

——by laohei

无线安全技术交流:QQ:2834283053

【原创】Proxmark3系列教程1——PM3用法的更多相关文章

  1. [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)

    关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下pro ...

  2. [原创]K8_Delphi源码免杀系列教程

    [原创]K8_Delphi源码免杀系列教程[2014] 虽是2014年的,但免杀思路方法并未过时 比如函数动态调用\代码注释法等至今依然有效 链接:https://pan.baidu.com/s/1H ...

  3. 【原创】【2】rich editor系列教程。了解document.execommand操作,保存丢失的range,实时反馈样式给工具栏

    [原创][2]rich editor系列教程.了解document.execommand操作,保存丢失的range,实时反馈样式给工具栏 索引目录:http://www.cnblogs.com/hen ...

  4. Linux Shell系列教程之(九)Shell判断 if else 用法

    本文是Linux Shell系列教程的第(九)篇,更多shell教程请看:Linux Shell系列教程 判断语句是每个语言都必不可少的关键语法,Shell命令当然也不例外.今天就给大家介绍下Shel ...

  5. [转]Android Studio系列教程六--Gradle多渠道打包

    转自:http://www.stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ Android Studio系列教程六--Grad ...

  6. Linux Shell系列教程之(十五) Shell函数简介

    本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell系列教程 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高 ...

  7. Linux Shell系列教程之(十四) Shell Select教程

    本文是Linux Shell系列教程的第(十四)篇,更多Linux Shell教程请看:Linux Shell系列教程 在上一篇文章:Linux Shell系列教程之(十三)Shell分支语句case ...

  8. Linux Shell系列教程之(十三)Shell分支语句case … esac教程

    本文是Linux Shell系列教程的第(十三)篇,更多Linux Shell教程请看:Linux Shell系列教程 分支语句非常实用,基本上高级语言都支持分支语句(python 没有),大多数都使 ...

  9. Android Studio系列教程六--Gradle多渠道打包

    Android Studio系列教程六--Gradle多渠道打包 2015 年 01 月 15 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzh ...

随机推荐

  1. Confluence 6 升级以后

    7. 拷贝你的数据库驱动 如果你现在使用的是 Oracle 或者 MySQL 数据库的话,你讲要重新拷贝 jdbc 驱动的 jar 文件到你已经存在的 Confluence 安装目录中 conflue ...

  2. selenium在scrapy中的使用、UA池、IP池的构建

    selenium在scrapy中的使用流程 重写爬虫文件的构造方法__init__,在该方法中使用selenium实例化一个浏览器对象(因为浏览器对象只需要被实例化一次). 重写爬虫文件的closed ...

  3. 【Java】【11】String数组和List相互转换

    正文: 1,String[]转List String[] strs = {"aa", "bb", "cc"}; //String数组 //方 ...

  4. 基于gensim的LDA主题模型实现 一键式函数打包

    def genlda(textlist,n): ticks = str(time.time()).replace('.','')[-6:-1] nn=str(n) dictionary = corpo ...

  5. 图书馆管理系统(C语言)

    /* 实现的功能 * @ 1. 录入图书的信息 * @ 2. 给定图书的编号,显示该图书的详细信息 * @ 3. 给定作者的姓名,可以显示该作者所有的书 * @ 4. 给定出版社,可以显示该出版社出版 ...

  6. .NET反射简单应用———遍历枚举字段

    反射(Reflection)是一个非常强大的工具,可以用来查看和遍历类型和类型成员的元数据:动态创建类型实例,动态调用所创建的实例方法.字段.属性:迟绑定方法和属性.此次要介绍的是使用反射查看类型成员 ...

  7. 出发a链接里面的div,a链接不进行跳转

    HTML <a href="http://www.baidu.com" style="display: inline-block; width: 100%; hei ...

  8. Angular2+ 编译后部署到服务器上页面刷新404问题

    原因:NG2+ 会默认不显示URL后面的文件名 解决方案:使用LocationStrategy方式,然后把URL后的# 替换成index.html# app.module.ts import {Has ...

  9. aop表达式

    任意公共方法的执行: execution(public * *(..)) 任何一个以“set”开始的方法的执行: execution(* set*(..)) AccountService 接口的任意方 ...

  10. 手把手教你如何使用Cocos2d Console 进行html5项目发布

    手把手教你如何使用Cocos2d Console 进行html5项目发布   1.首先需要先安装Cocos2d Console运行需要的工具. 详情参见 这篇文章 http://www.cocoach ...