首页 > 代码库 > 一次对路边饮用水RFID供应机的跑路玩法
一次对路边饮用水RFID供应机的跑路玩法
"如何成为一个合格的硬件白帽子? 答案: 一个有聪明大脑的你 要有归纳类比和善于用GOOGLE的能力(百度?放弃吧) 善于翻阅和查询相关开发文档和强大的跑路能力。"
WARNING!!! 本文具有相当的攻击性以及复现性,仅供技术参考与教学用途研究,切勿用于非法用途,参考此文进行犯罪的相关人员与本人无关。
——免责声明。参考刑法修正案:构成非法提供控制计算机信息系统的程序、工具罪,两罪量刑都是三年以下有期徒刑或者拘役,并处或者单处罚金,情节严重的,处三年以上七年以下有期徒刑,并处罚金。非法获取计算机信息系统数据罪
这次我们要用到的工具:ProxMark3 镇楼宝图在此:
No.2开始搞事。
为了打发漫长而炎热的假期,回到了祖父家避暑,结果发现原本破败荒芜的家属大院内多了一台纯净水供应设备,而祖父也刚好办了一张卡,华山这几天温度热的要死,我竟然神奇的把黑色连到从北京坑到了华山美其名曰避暑然而,连续五天温度过了42度,无形装逼最为致命。现在家里面无聊到爆,于是总是再找点事情做,048 049玩烂了。于是拿出了随身携带的战术包中的Proxmark3 hackrf 等工具 玩烂了RTL8187 HACKRF出问题 于是在一个炎热的午后去打水,发现了那张水卡。踏破铁鞋无觅处得来全不费工夫,不要怂,就是干。征得物业同意之后开始测试这个水机的认证系统。
过程· 首先拿出手电筒对着M1卡片照射看其中线圈结构。结果发现是正方形线圈,按照经验是13.56MHZ的高频卡,于是话不多说直接上工具,是经proxmark3的检测,结果印证了是Mifare Classic 1k的卡
上手过程按照国际惯例先扫了扫默认密码区,结果发现密码区防护做的相当的好,每个M1卡都有一个唯一的序列号,我们称为“UID”,是32位的,也就是4个字节。
注:其中每个data 数据区为一个“块”。这样我们可以计算一下:16b* 4(块)*16(扇区)=1024B 就是1K。
第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化锁死,不可更改。原来在实验室见过一个厂商代码没有锁死的M1 被我玩了好久。。。。。
在全扇区加密时,通常用前三个“块”(0,1,2号块)存放数据,用最后一个”块“(3号块)存放密码。
其中密码分为A密码和B密码:前6个字节存放A密码,中间4字节为控制字段,后6字节存放B密码。
· M1卡是典型的高频卡,工作频率为13.56MHz,一般调频(FM)收音机接收的广播频率在87MHz到108MHz之间。而我们常说的路由器工作在2.4GHZ中。这个时候注意一个小科普,很多人分不清5G路由和5GLTE。导致很多人认为5G路由就是5G通讯技术的路由,这里进行一个更正 .一般路由是工作在2.4GHZ 频段下面的通讯信号,而所谓的5G路由是工作频率在5.8GHZ下的路由器。而5GLTE指的是第五代通讯技术,而逆向工程最好的方法就是了解他的基础结构,我们来看一下M1卡的工作通讯机制
言归正传,来看看M1卡的通讯通信速率:106KBPS,也就是说可以在10毫秒的时间内完成读写内容。
工作半径:100mm。大约在100mm以内的距离,可以使用读卡器对m1卡进行操作(一般写距离小于读距离)。
在使用proxmark3对M1卡进行破解时 ,我先用了默认密码扫描,结果发现卡的安全是很好的,没有默认密码
于是使用了有卡嗅探,网上很多人都在用proxmark3去暴力破解或者RPNG漏洞利用,对于proxmark3来说真的是大材小用。Proxmark3可以通过抓取卡与读卡器之间的通讯来解开相应的密码
准备1个充电宝 和1跟 双头usb供电线数据线淘宝一大把
和原来一样正常连接电脑。打开窗口(下图)
一切正常之后 你输入 hf 14a snoop这时主板会亮一个灯
再拨了主机上的USB口
到电梯那里去刷卡.(把 PM3天线 放 卡片 和 卡机 之间)
让天线 夹到卡与读卡器之间
不同角度的刷卡 多刷几次
刷到主板上的灯全灭了
拿 回来直接连接上电脑
打开软件
再输入 hf list 14a
查看监听数据
如果监听到完整数据后
通过软件直接算出来就可以了
这就是完整的数据
这是激卡 04 00
9320 是要卡返回卡号
93 70 是选择卡号
这三个就是 密码了 (当然是加密的) 通过软件可以算出密码
破解中间我们可以看下M1卡的通讯工作流程图以更加好的了解工作原理:
破解M1卡的破解算法已经烂大街了,我们可以利用M1卡已知的PRNG 漏洞来爆破出其他几个扇区的密码最后读出数据。保存数据后后我又过去进行了一次消费,用来进行数据对比(卡中金额有变动
· 的话数据也有变动。)对比数据:然后发现数据存储在14块、15块。16块有数据但是没有变动,初步猜测是用户识别信息。其他区块都是空的。也是够了。
上手逆向在上手逆向之前我们要认识一下CRC冗余校验和奇偶校验以及异或校验,累加校验等
举个例子:循环冗余码CRC(Cyclic Redundancy Code)又称多项式码.
任何一个由二进制数位串组成的代码,都可以惟一地与一个只含有0和1两个系数的多项式建立一一对应的关系.例如,代码1010111对应的多项式为X6+X4+X2+X+1,多项式X5+X3+X2+X+1对应的代码为10111.
CRC码在发送端编码和接收端检验时,都可以利用事先约定的生成多项式G(X)来得到.设G(X)中最高位X的次方为Xr,信息位为K(X);则CRC码=Xr乘以K(X)再除以G(X).
比如:信息位K(X)=X6+X4+X3+1既1011001,生成多项式G(X)=11001既X4+X3+1(可得Xr=X4)
则CRC码=X4* (X6+X4+X3+1)/(X4+X3+1)=X10+X8+X7+X4/(X4+X3+1)=10110010000/11001
得到的余数就是CRC码
注:以上除法用的是模2除法,是一种不考虑减法借位的运算.既0-0=0,0-1=1,1-0=1,1-1=0
每个块的前八组HEX和后八组HEX中,数据基本相同 ,而变动数据是红框部位,后面的因为相同忽略不计。然后经过详细的观察和运算发现:
当方框中划出的数据用FF做异或运算后,得出的数值刚好与箭头所指数据相同
A4异或FF 等于5B
答案很明显了 使用的是异或校验运算。我刷掉了1.5元而校验值是箭头指向的数据减去金额,而M1卡数据写入机制是倒序的。也就是说金额数据是14 A4/14 08 我们用校验位减去相应金额再转化为十六进制即我们想要的数据:
e31400001cebff ffe314000014eb14eb
爆破原理深源揭秘不法分子爆破M1卡的方式。
使用技术手段完成M1卡破解的方式有4种:
1.暴力破解
即便是暴力破解,也需要先得到确切的明文和对应的码流。这大约要进行1536次认证过程,用时在一秒钟之内。不过还要进行离线暴力破解,估计在36分钟可完成。但是需要专用的硬件设备。
2.以读卡器的挑战值做变量
这里说的读卡器实际上指的是用来模拟读卡器的攻击工具,下个攻击亦如此。这种攻击又可称选择密文攻击,想法用工具控制被攻击的卡每次在认证时产生同一挑战值,而读卡端则回应不同值。这种攻击需要大约28500次的认证过程,用时约15分钟,然后计算密钥,用时约一分钟。
3.卡的挑战值做变量
第三种攻击与攻击2类似,但需要使自己的工具的挑战值为常数,而令卡的挑战值数不断变化。需要预制一个384 GB的状态表。要进行4096次认证。大约用时2分钟。
4.嵌套认证攻击
第四种攻击假设攻击者已知了至少一个扇区的密钥,他可以根据漏洞得到其它密钥的32位,然后对其它16位进行穷举攻击。只需3次认证(时间可以忽略不计)。离线攻击计算时间约为一秒。
M1卡的存储器组织 M1卡存储详细解说。1024 x 8 bit EEPROM存储器分为16区,每区4块,每块16字节。
在擦处后的状态下,EEPROM的单元读为逻辑“0”,写后的状态下读为“1”。
块内字节编号 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
扇区 | 块 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 说明 | ||
15 | 3 | KEY A | 控制位 | KEY B | 扇区15尾块 | |||||||||||||||
2 | 数据 | |||||||||||||||||||
1 | 数据 | |||||||||||||||||||
0 | 数据 | |||||||||||||||||||
14 | 3 | KEY A | 控制位 | KEY B | 扇区14尾块 | |||||||||||||||
2 | 数据 | |||||||||||||||||||
1 | 数据 | |||||||||||||||||||
0 | 数据 | |||||||||||||||||||
::: | ::: | |||||||||||||||||||
1 | 3 | KEY A | 控制位 | KEY B | 扇区1尾块 | |||||||||||||||
2 | 数据 | |||||||||||||||||||
1 | 数据 | |||||||||||||||||||
0 | 数据 | |||||||||||||||||||
0 | 3 | KEY A | 控制位 | KEY B | 扇区0尾块 | |||||||||||||||
2 | 数据 | |||||||||||||||||||
1 | 数据 | |||||||||||||||||||
0 | 制造商占用块 |
3.6.1 厂商代码块
这是第1区的第1块(块0)。它含有集成电路制造商数据。出于安全和系统需求,此块是制造商在生产过程中编程后写保护的。
3.6.2 数据块
各区均有3个16字节的块用于存储数据(区0只有两个数据块以及一个只读的厂商代码块)。
数据块可以通过读写控制位设置为:
· 读写块,例如用于非接触门禁管理
· 数值块,例如用于电子钱包,另有可直接控制存储值的命令,如增值、减值。
在任何存储器操作之前必须执行认证命令。
3.6.2.1数值块
数值块具有电子钱包功能(有效命令:read, write, increment,decrement, restore, transfer)。
数值块有固定的数据格式,以便于错误检测、纠错和备份管理。
数值块只能通过以数值块格式的写操作生成:
· 数值:有符号4字节数值。数值的最低字节存储在最低地址字节。负值以标准的2的补码形式存储。出于数据完整性和安全原因,数值存储三次,两次不取反,一次取反。
· 地址(Adr):1字节地址,当进行备份管理时,可用于保存块的地址。地址保存四次。两次取反,两次不取反。在increment、decrement、restore和transfer 操作中,地址保持不变。它只能通过write命令更改。
字节号 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
说明 | 数值 | 数值 | 数值 | Adr | Adr | Adr | Adr |
3.6.3 尾块(块3)
各区均有一个尾块,存有:
· 密钥A和B(可选),读时返回逻辑“0”。
· 该区四个块的读写条件,存储在字节6至9 。读写控制位也指定了数据块的类型(读写块或数值块)。
如果不需要密钥B,块3的最后6字节可以用作数据字节。
尾块的字节9可用于用户数据。因为此字节享有与字节6、7、8相同的读写权限。
字节号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
说明 | 密钥A | 读写条件 | 密钥B(可选) |
3.7 存储器读写
必须如前所述,先选定卡并通过认证,才能执行存储器操作。
存储器操作 | ||
---|---|---|
操作 | 说明 | 使用块型 |
读 | 读存储器块 | 读写、数值和尾块 |
写 | 写存储器块 | 读写、数值和尾块 |
增值 | 增加块的内容,并将结果存入内部寄存器 | 数值 |
减值 | 减少块的内容,并将结果存入内部寄存器 | 数值 |
转存 | 将内部寄存器内容写入块中 | 数值 |
恢复 | 将块中内容写入内部寄存器 | 数值 |
对指定块可以执行的存储器操作取决于所用的密钥和存储在相应尾块中的读写条件。
3.7.1 读写条件
每个数据块和尾块的读写条件均由3个bit定义,并以非取反和取反形式保存在各个区的尾块中。
读写控制位管理着使用密钥A和B读写存储器的权限。如果知道相关的密钥,并且当前读写条件允许,读写条件是可以更改的。
读写控制位 | 有效命令 | 块 | 说明 | |
---|---|---|---|---|
C13 C23 C33 | read, write | ? | 3 | 尾块 |
C12 C22 C32 | read, write, increment, decrement, transfer, restore | ? | 2 | 数据块 |
C11 C21 C31 | read, write, increment, decrement, transfer, restore | ? | 1 | 数据块 |
C10 C20 C30 | read, write, increment, decrement, transfer, restore | ? | 0 | 数据块 |
注意:在每一次存储器读写时,内部逻辑会验证存储条件的格式。如果发现个是错误,这个区将被永久性锁死。
注意:在下列说明中,读写控制位是仅以非取反形式表述的。
MF1的内部逻辑保证了命令只有在通过认证后才被执行。
3.7.2 尾块的读写条件
对密钥和控制位的读写取决于尾块(块3)的访问控制位,分为“禁止”、“KEY A”、“KEY B”和“KEY A|B”( KEY A或KEY B)。
访问控制位 | 所控制的访问对象 | 注释 | |||||||
---|---|---|---|---|---|---|---|---|---|
KEY A | 访问控制位 | KEY B | |||||||
C1 | C2 | C3 | 读 | 写 | 读 | 写 | 读 | 写 | |
0 | 0 | 0 | 禁止 | Key A | Key A | Key B | Key A | Key A | Key B可读 |
0 | 1 | 0 | 禁止 | 禁止 | Key A | 禁止 | Key A | 禁止 | Key B可读 |
1 | 0 | 0 | 禁止 | Key B | Key A|B | 禁止 | 禁止 | Key B | |
1 | 1 | 0 | 禁止 | 禁止 | Key A|B | 禁止 | 禁止 | 禁止 | |
0 | 0 | 1 | 禁止 | Key A | Key A | Key A | Key A | Key A | Key B可读传输配置状态 |
0 | 1 | 1 | 禁止 | Key B | Key A|B | Key B | 禁止 | Key B | |
1 | 0 | 1 | 禁止 | 禁止 | Key A|B | Key B | 禁止 | 禁止 | |
1 | 1 | 1 | 禁止 | 禁止 | Key A|B | 禁止 | 禁止 | 禁止 |
注:灰色行为key B可读并可用于存储数据的访问控制条件。
尾块和key A被预定义为传输配置状态。因为在传输配置状态下key B可读,新卡必须用key A认证。
因为访问控制位本身也可以禁止访问,所以个人化时应当特别小心。
3.7.3 数据块的访问控制条件
对数据块(块0至2)的读写访问取决于其访问控制位,分为“禁止”、“KEY A”、“KEY B”和“kEY A|B”( KEY A或KEY B)。相关访问控制位的设置确定了其用途以及相应的可用命令。
· 读写块:允许读、写操作。
· 数值块:运行另外的数值操作——加值、减值、转存和恢复。在用于非充值卡的一种情况(‘001’)下,只能够读和减值。在另一种情况(‘110‘)下,可以用key B充值。
· 制造厂商块:只读,不受访位控制位设置的影响!
· 密钥管理:在传输配置状态下,必须用key A 认证。
访问控制位 | 所控制的访问操作 | 用途 | |||||
---|---|---|---|---|---|---|---|
C1 | C2 | C3 | 读 | 写 | 加值 | 减值转存恢复 | |
0 | 0 | 0 | key A|B1 | key A|B1 | key A|B1 | key A|B1 | 传输配置状态 |
0 | 1 | 0 | key A|B1 | key B1 | 禁止 | 禁止 | 读写块 |
1 | 0 | 0 | key A|B1 | key B1 | 禁止 | 禁止 | 读写块 |
1 | 1 | 0 | key A|B1 | key B1 | key B1 | key A|B1 | 数值块 |
0 | 0 | 1 | key A|B1 | 禁止 | 禁止 | key A|B1 | 数值块 |
0 | 1 | 1 | key B1 | key B1 | 禁止 | 禁止 | 读写块 |
1 | 0 | 1 | key B1 | 禁止 | 禁止 | 禁止 | 读写块 |
1 | 1 | 1 | 禁止 | 禁止 | 禁止 | 禁止 | 读写块 |
1 如果相应扇区尾块Key B可读,则不得用作认证(前表中所有灰色行)。
后果:如果读写器试图用灰色行的访问控制条件以Key B认证任何扇区的任何块,卡将在认证后拒绝所有后续存储器访问。
Ps:突发奇想可以用M1卡当数据存储解密玩。
一次对路边饮用水RFID供应机的跑路玩法