免责声明:本文仅供有能力的读者进行技术研究与探讨,本人在试验成功后已将卡片内数据改回。因阅读此文章而产生的一切后果与本人无关,一切责任由您自己承担。

警告:私自篡改 IC 卡内信息可能触犯法律,由于您自行改动您的卡片内的数据而引起的一切后果与本文作者无关。勿谓言之不预也。

0. 背景

学校公共洗衣机是用的是海尔的读卡洗衣机,与之配套的洗衣卡收费五十元,其中押金十元,内含十次洗衣次数,每次四元。

1. 原理

尝试用带 NFC 的手机(Galaxy S6)搭配 Mifare Classic Tool (链接为 Google Play,墙内可以使用 Apk Leecher 下载 Play 上的安装包) 读取洗衣卡发现其为 Mifare 1k 卡片。此卡片的加密早在2008年就被破解,只要有一个扇区未加密就可破解出其它所有扇区的密钥。

以下节选自 M1 卡技术手册

  1. M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也将16个扇区的64个块按绝对地址编号为0~63,存贮结构如下图所示:

  1. 第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。
  2. 每个扇区的块0、块1、块2为数据块,可用于存贮数据。

数据块可作两种应用:

- 用作一般的数据保存,可以进行**读、写**操作。
- 用作数据值,可以进行**初始化值、加值、减值、读值**操作。
  1. 每个扇区的块3为控制块,包括了密码A、存取控制、密码B。具体结构如下:

  1. 每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的。
    ……

2. 操作

如图,本卡中,所有区块的存取控制均为 FF 07 80 69 ,此值为 MF1 卡的出厂预设值,不必对照表格一步步解读,直接可以查得最后两位 69 无意义,前三位 FF 07 80 表示 0-2 三个块只要验证密码A或密码B即可读写。块3权限如下图:

即:只有验证密码A正确了,才能做以下操作:
· 修改密码A;
· 修改控制字;
· 修改密码B,读出密码B。

可以看出,卡中只有第5扇区第1块中有数据,且为循环数据,猜测剩余次数存在此段数据中。除5扇区外其他扇区的密码A密码B均为 FFFFFFFFFFFF,第5扇区密码A未知,密码B为 FFFFFFFFFFFF。猜测为防止直接复制卡而修改了密码A,因此我采用直接复制整张卡的方法并不能读出正确的5扇区密码A。读卡机可能只使用密码A与卡通信,故复制卡试验时读卡机报错。
前文提到该卡已被破解,使用电脑连接读卡器可以方便地暴力猜解或通过验证漏洞破解密码A。但读卡器太特么贵了,并不能买得起。所以我们就不复制卡了。
然而虽然因密码A未知而不能复制,在密码B为默认密码的条件下可以直接用手机 NFC 修改5扇区1块的数据,无需复制卡片。

在卡机上正常刷卡一次后再次读取数据并对比,可见每个循环节内只有一个字节被修改,确定这个字节代表的就是剩余次数。
经过比对得到如下已知的对应关系。其中有数据字串的行为实际读出,其他的行为推测得出。

剩余次数 数据字串 关键字节 前4位 后4位
10 F05A11EE00 5A 5 A
9 F06911EE00 69 6 9
8 78 7 8
7 87 8 7
6 F09611EE00 96 9 6
5 A5 A 5
4 F0B411EE00 B4 B 4
3 F0C311EE00 C3 C 3
2 D2 D 2
1 E1 E 1

规律很简单。直接修改此字节即可完成洗衣卡次数的修改。

3. 验证与收尾

用 Mifare Classic Tool 写入数据,在卡机上测试成功显示十次。成功。
没有测试10以上的次数,因为新卡买回来就是十次。然而理论上应该最多可以修改为15次。有空再测试。
因为 闲得蛋疼 追求极致,我斗胆测试了 0F ,居然成功显示了15次。

然后就脑洞大开,最前面的 F0 会不会也是数据位呢?
于是测试了 E10F

哈哈哈哈居然真的显示31次。
我有一种要玩坏的预感。理论上限应该是255次吧,然而洗衣机上只有三位数码管,最多只能显示到99.0。好吧那就试试99.0。
把99转换成十六进制是63,所以写入 96C3

作死成功,这实在是太E可赛艇了。θ..θ

将数据修改回去,避免产生法律纠纷。

此次修改严格来说并没有什么技术含量,这个洗衣卡硬件本身已经不安全,又使用弱口令,破解不费吹灰之力。然而洗衣服并不要多贵,破解它所获取的仅仅是 Mifare 卡片相关的知识。

此外,这种卡片是离线卡片,并没有服务器存储余额,因此可以破解。而公交卡、校园卡等卡片使用时会在线验证,与服务器上的余额数据比对,因此即使数据能读取修改,也无法真正修改余额,除非连人家的服务器一块儿黑了。

最后再次声明,本文仅用于技术学习与探讨。您阅读本文后进行的一切操作及其引起的后果与本文作者无关,本人不承担任何责任。

by Sykie Chen 2015.10.19 2015.10.23 mod