在我住的地方有一间洗衣房,每隔一个礼拜,我都会到这里来洗衣服。我们可以用不同的方式为洗衣服务付费:(冒牌)智能卡、硬币等等,住在不同的地方会有不同的付费方式。以我来说,我用的是一张(冒牌)智能卡,每当卡里没钱的时候都必须到管理员那里充值。

那张智能卡看起来是这个样子的:

之所以说这张卡是“冒牌”的,是因为正如你所见,它并不是一张真正的智能卡1。事实上,在它的白色塑料下面仅有六个触点(而不是八个)和一组信号总线。

白色塑料部分紧紧和卡的其他部分粘贴在一起,为了将它分离出来,我将整个卡放在丙酮2溶液中浸泡。几分钟之后,就可以不费吹灰之力将白色塑料部分去除了。

我很惊讶的看到在白色塑料下面有一个简单的EEPROM(电可擦只读存储器)3。随即我便意识到可以对它进行重放攻击,尽管我并不知道该如何进行下一步工作:保存数据、用它洗衣服、恢复之前数据。

从EEPROM芯片的LOGO可以识别和推断出其生产厂商是“National”:

71AR
93C46
M8

根据厂商信息我找到了类似的数据手册,然而却并非完全与我手中的型号一致。

因为我不想恶意攻击这张卡,所以我买了一个“Season2 interface”4,这个设备常用在通信窃听和对智能卡的MITM攻击上。我用8欧元购买的这个设备。

为了接入我的指令,即串行外设接口(SPI)的I/O,我焊了8个针脚在“Season2 interface”的背面。

因为有数据手册,我可以用万用表做个触点环路,用来推断智能卡每个触点的响应结果:

X——X(未分配)
Di——Sk
Do——CS
GND——VCC

在这里我长话短说,因为有很多过程与该话题相关性并不大。为了接入我的信号,我有用到“Bus Pirate”(BP)5串行总线接口,并且用OpenBench Logic Analyzer(OLA)6工具验证接入的信号是否正确。BP是一个很酷的硬件设备,它有一个解释器可以帮助我用正确的同步方式发送正确的信号,这样就可以我免去写程序的工作。因为我还没有完全对BP熟悉,所以用OLA来确保信号的正确性。根据数据操作手册,信号发送的序列是0y110+6比特地址。在几次尝试和错误之后,通过用5伏电压和raw3wire模式7发送类似以下的命令,我终于能够导出整个内存的数据:

]-^^_^ _^:6 r:1024[

事实上,通过查看内容数据的最长前缀,我发现内存数据其实是128个字节,看起来像下面这样:

READ:

0x03 0xE8 0x03 0xC8 0x03 0xD7 0x02 0xE9 0x00 0x00

0x00 0x04 0x03 0xEA 0x0B 0x5E 0x01 0xAA 0x0B 0x5E

0x00 0x00 0x0B 0x5E 0x00 0x00 0x00 0x00 0x00 0x00

0x03 0xE8 0x00 0x04 0x03 0xEA 0x0B 0x5E 0x01 0xAA

0x0B 0x5E 0x0B 0x5E 0x00 0x00 0x00 0x00 0x00 0x00

0x25 0xAE 0x15 0xB3 0x1A 0x0A 0x00 0x00 0x00 0x00

0x00 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

访问智能卡时的最小力度是2个字节(做个除法就可以)。一眼看上去,我根本不知道这些内存数据的含义是什么。所以我决定到洗衣房,将我的卡放到洗衣机内读取并付费使用下,费用是3欧元。然后我又导出整个内存数据并做了一个对比:

READ:

0x03 0xE8 0x03 0xC8 0x03 0xD7 0x02 0xE9 0x00 0x00

0x00 0x04 0x03 0xEA 0x0A 0x32 0x01 0xAA 0x0A 0x32

0x00 0x00 0x0A 0x32 0x00 0x00 0x00 0x00 0x00 0x00

0x03 0xE8 0x00 0x04 0x03 0xEA 0x0A 0x32 0x01 0xAA

0x0A 0x32 0x0A 0x32 0x00 0x00 0x00 0x00 0x00 0x00

0x25 0xAE 0x15 0xB3 0x1A 0x0A 0x00 0x00 0x00 0x00

0x00 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

注意上面0x0A 0x32

这个结果很有趣,内存数据中有六个地方以某种方式做了修改。但是0x0A32意味着什么?它代表2610,而在修改之前的数据是0x0B5E,代表2910。上文我曾说过我花费了3欧元,但我没有提到的是在使用之前我的卡内余额是29.10欧元。难以置信的是,内存数据在六个地方重写了数据。

下一步就是将9990(0x2706)写入到内存的这六个位置,然后测试是否有效。然而,根据数据操作手册,要写入内存数据就必须得设置WEN(Write Enable)模式8,所有的插脚引线都被去除,所以我没法做到这点。看来这不是一个好方法。我也曾经试过发送“Write”命令给智能卡,但没有成功。

当我寻找这个EEPROM芯片的数据操作手册时,我发现了Atmel公司的操作手册,但它的协议与该品牌产品相当类似。它有一个“可写”模式,是在每个程序模式之前发送序列指令0y10011XXXX。

如果我发送一个类似于这样的指令:

]-^_^^-^^^^^^^^[ ]-^_^-^ -^^^^^^ 0×12:2[ ]-^^_^ -^^^^^^ r:128[

正如我所期望的那样,奇迹再现,EEPROM的内存数据被正确的写入。这是个好消息,如此我可以修改上面内存中六个位置的数值。我甚至写了一个小脚本来做内存修改这件事,但基本上还是需要通过以下方式来做修改:

]-^_^^-^^^^^^^^[ ]-^_^-^ _^^^-^^^ 0×27 0×06[ : 7th word

]-^_^^-^^^^^^^^[ ]-^_^-^ _^^-^_^^-^ 0×27 0×06[ : 9th word

]-^_^^-^^^^^^^^[ ]-^_^-^ _^^-^_^-^^ 0×27 0×06[ : 11th word

]-^_^^-^^^^^^^^[ ]-^_^-^ _^-^_^^-^_^ 0×27 0×06[ : 18th word

]-^_^^-^^^^^^^^[ ]-^_^-^ _^-^_^-^_^^ 0×27 0×06[ : 20th word

]-^_^^-^^^^^^^^[ ]-^_^-^ _^-^_^-^_^-^ 0×27 0×06[ : 21th word

当然,以上指令可以用简短的方式来描述,为了说的清晰一些我还是不劳其烦的将它写出来。总的来说,我仅仅是将洗衣卡中的EEPROM中的六个区域数值修改9990(0×2706),让它认为是99.90欧元罢了,因为看起来它的机制就是这样的。现在回到洗衣房试试看它是否如我所期望的那样工作:

这仅仅是一个小小的黑客行为,但仍然很精彩。我不确定这家公司是否仍然在销售这种卡,或许他们现在已经更换了真正的智能卡。没有来自危险技术原型论坛(dangerous prototypes forum)的Ian和Sjaak的帮助我是无法完成这些的,所以最后在这里谢谢他们!

译者注:

1:智能卡:包含有微处理器、I/O接口和存储器,提供有数据运算、访问控制和存储功能的塑料卡片,其组成为基片(聚氯乙烯材质)、接触面(铜制薄片,触点一般为C1~C8共8个)、集成芯片(包含CPU、RAM、ROM、EPROM)。

2:丙酮:是一种有特殊气味的无色可燃液体,能溶解油、脂肪、树脂和橡胶等,也能溶解醋酸纤维素和硝酸纤维素,对人体有肝毒性,对黏膜也有刺激性。和浓过氧化氢在低温下可以合成TATP烈性炸药,因此作为制爆品被政府管制。

3:EEPROM:电子抹除式可复写只读存储器,是一种可以通过电子方式多次复写的半导体存储设备。有四种工作模式:读取模式、写入模式、擦出模式、校验模式,读取模式需要VCC低电压(+5V),写入模式需要通过VPP获取编程电压(+25V或+12V),并通过PGM编程脉冲写入数据。

4:Season2 interface:用来记录PC和任意符合ISO7815标准的智能卡读取组件数据的测试设备,无电源支持需要,并提供9针脚串行。软件应用可从网络下载。

5:Bus Pirate:一种常用的电子开源硬件工具,可用来与各类芯片做设计与编程交互。开发者可以用一系列终端作为各种具有硬件协议的设备与其的接口。

6:OpenBench Logic Analyzer:是一个基于FPGA(现场可编程门阵列)的逻辑分析设备,支持32个探针和100MHz探针信号以及高级追踪功能,是一个完全开源的硬件项目。

7:raw3wire模式:Bus Pirate设备下的3-wire协议,即具有三条信号线。

8:WEN模式:作者所用(冒牌)智能卡中的EEPROM的可写模式。以文中EEPROM为例,当提供VCC电压时,EEPROM处于不可写入状态。所有程序模式必须先以可写指令做开头。一旦可写指令被执行,程序就会得以存储直到不可写指令被执行或VCC电压被移除。

[感谢blue投递 via repoog]

源链接

Hacking more

...