最近两周对接触型IC卡很感兴趣,就动手实践了一下,最终实现的效果是通过破解IC卡口令实现对数据修改,然后就可以随意洗衣服喽~
IC卡从数据传递方式上划分为接触型和非接触型两种。接触型的卡片表面有金属贴片,用于连接卡内芯片和外界器具(洗衣机,电表,打水器)。而非接触性的卡片则是通过射频信号与器具进行信息传递。IC卡本身是无源的,需要依靠外部器具提供的能量驱动内部电路。
时下更流行是非接触型的IC卡或称射频卡,如公交一卡通、校园一卡通。从时间上来说射频卡出现的更迟,常搭载CPU使得其更为智能,拥有更复杂的数据处理能力。随着M1破解的新闻,有关于射频卡的破解讨论就遍地开花了。不过现实中,射频卡的破解要考虑的不仅仅是卡片自身,比如校园一卡通的数据在服务端也有记录,单方面的数据修改可能使卡被锁。
接触型的IC卡经历了从单纯的数据存取卡,加密卡,CPU卡的演变,其应用范围也很广,至今一些单位,校园,小区的洗衣卡,电卡仍沿用着接触型IC卡,只是被掩盖在射频卡的光芒之中,变得不那么起眼了而已。直观上感觉由于其出现的较早,安全性缺陷可能更为显著,所以对于IC卡的DIY活动就从接触型IC入手了。
为此,首先要入手的就是读卡器:查看卡内数据是了解IC卡信息最直观的桥梁(我使用的是ACR38读卡器,这类使用U口连接电脑的读卡器免去了笔记本没有串口滋生的烦恼)。读卡器配套的软件和SDK实例代码很多,但尝试了一圈觉得CardTool是最靠谱的一个工具。接触式IC卡有很多种,他们的存储空间不尽相同,控制指令各有千秋,加密与否不能一概而论,时序逻辑千差万别,读卡器也只能兼容常见的类型的IC卡,难免有漏网之鱼。读卡器能够产生操作IC卡所需要的时序逻辑电平(发出IC卡所需要的控制字)以读取或修改卡内数据。
电脑操作读卡器需要控制字,读卡器操作IC卡也需要控制字,这一前一后的两种控制字要区分开来加以看待。读卡器的控制字只有一套,写在读卡器配套的手册中,并在SDK中实现了通过U口发送这些控制字的函数。而IC卡的控制字有很多套,因卡而异,需要到该种类型IC卡的手册中查询(这部分对用户透明,属于读卡器操心的事儿)。本次操刀的IC卡类型是SLE4442,西门子公司的加密卡产品,该类型的卡片还算比较常见,我用的洗衣卡,电卡,打电动的会员卡都属于此类型。
如何判断IC卡类型是眼下亟待解决的事儿,我认为可以有三种方法:
1.使用CardTool时,类型挨个试,看哪个能正常操作卡片,最初对IC卡了解有限,所以就用此法土法校验了一下。随便选择一种类型,然后点击重置,根据返回的标识信息,就能判断选择是否正确了,选择正确时,重置操作会返回卡片类型标识特征字。
2.如果没有读卡器,仅根据外观判断也是可行的,taobao上各商家销售的接触式IC卡样图是主要的参考依据,比对金属片的花纹划痕就很容易确定卡类型。
3.幸运的话,有些卡背面就有写自己的类型
一旦确定了类型,就可以使用CardTool配合读卡器对卡片进行操作了。在此之前先介绍一下我使用SLE4442的加密卡,所谓加密是指卡片的写操作权限受口令保护。卡片存储区域包含3个部分,应用存储区,口令存储区,和写保护控制区,前两个区域是要重点关注的。
应用存储区大小为256字节,其中前32个字节存放西门子的厂商信息,我手头的这些SLE4442的该区域数据内容完全相同。下图表示在重置后发出读指令(FF B0 00 00 00 20,这是读卡器的控制字),读取卡片前32个字节的内容,返回了32个字节和9000(表示操作未产生错误)。
前32个字节受写保护,一次写入无法修改(从硬件上烧断熔丝来阻止重写操作)。应用存储区的33-256字节就是不同单位使用卡片时自行定制的了,通常包含的数据可以有:卡标识(说明卡的用途),余额,次数,身份ID,校验值…随卡使用者所需功能变化万象。
口令存储区包含卡片三个字节的口令,以及一个字节口令尝试次数计数器(允许最多错误3次,超过就锁卡)。每次口令尝试失败都会导致计数器数值减少,口令校验成功会把计数器恢复初始最大次数。
卡片应用区的数据可以被任意读取,不受限制,但修改数据的操作前需要先通过口令验证,否则写操作是无效的。SLE4442默认口令是FF FF FF(不过你放心,卡片使用者都会更改的)。口令校验成功前如果发出读命令去读口令存储区,返回当前计数器的数值和三个零,校验过后读出来的内容是计数器数值和三个字节的口令值。
在刚拿到读卡器的时折腾半天并读出来卡数据时就已经很兴奋了~终于窥探到这个小片子里面的东西了哈。读洗衣卡的内容如下:
由于洗衣卡所存储的数据很少,也没有经过什么变换,另找一张洗衣卡对比,就一下发现了数据的规律。
90 72 4c 69 66 74 91 02 应该是洗衣卡的一种标识,表明这张卡是洗衣卡而不是干其他的,把它插进其他设备就不会误读。里面可能还包含公寓楼信息等,但不管怎样,对于我们楼这个字段是固定值,不操心它具体含义了。
FF FF 00 00 00 00 00 00 00 00 这个数据是洗衣卡剩余次数的标识,10个字节全为0代表还剩余10次,全是FF就说明剩余次数为0了,现在8个0就表示剩余8次。如果能修改这个0的个数不就能改变洗衣卡剩余次数了吗,那洗衣服这档子事儿以后就可以摆脱楼管拖拉换卡的困扰了~
至此,任务已经很明晰了,就是更改卡内的数据,所要更改的内容也是确定的,即10个0。但目前没有口令的情况下,这还只是个设想。抱着侥幸的态度还是先试了一次FF FF FF口令,返回给我的是骤减的计数器数值。由于洗衣机肯定能发出正确口令给卡片,所以只要插一下洗衣机计数器就回归最大值了。
破解口令的第一个思路就有了,每次尝试一个口令,然后再插一次洗衣机。三个字节的口令空间是2^8*2^8*2^8,4000万个口令吧,根据生日定理,要尝试2^12才能达到50%的口令破解概率。这个方法也不是没有可行性,只是技术含量稍微低了一点。
另外从网上搜罗了两个想法,需要借助硬件电路实现一些部件。
千言万语,消化理解,一言蔽之:
●
- 搭线侦听卡片和洗衣机的通信过程
- 思路二是双卡联立,一张插入洗衣机,另一场插入读卡器,然后通过读插在洗衣机里的卡内容直接获取到卡口令。
此处建议先看一下这两个思路的原文【http://topic.csdn.net/u/20071110/15/cfc7e731-8e43-4c95-ad73-840c5dcfdc64.html】,很短,说的很还算很明确。特别是思路二看了很动心,当时我连电路简图都画好了急于动身呢~
不过两搭的硬件电路包含各种开关导线电阻焊接,没准还得单片机示波器啊,而且在卡上焊接多少会在金属片上留下点点银斑,到归还卡片的时候就不太好解释了,下面两张图是参考链接中制作读卡器的达人们焊接的效果图,和本例无关。
再说身边也没有这种复杂硬件平台条件,更不想去其他人的实验室搞这个不太仗义的事儿。就在google寻寻觅觅冷冷清清凄凄惨惨戚戚,看有没有一些现成的装备能简化这个硬件平台的搭建。期间居然直接找到了SLE4442的口令破解器,介绍说把卡插到上面就能立刻显示出口令内容,广告都打到国外各种IC技术论坛上面了,不过基本都是零回复。我琢磨着这破解器可能利用SLE4442的什么隐藏的陷门控制字直接查看到口令的,但设备不菲且不随便销售,况且用它哪还有破解这个口令的乐趣呢。
直到Logic Sniffer (基本就是逻辑分析仪) 这么个词儿闪现眼前时候,突然让我看到搭线真挺的可行性。示波器干嘛的应该都清楚,逻辑分析仪功能类似,只不过只能显示数字信号。一般电子电路实验室都有这两个东西,好一点的上个百万价位都不足为奇。但搜到了Logic Sniffer【http://dangerousprototypes.com/open-logic-sniffer/】,就意味着民间原来也有人做了一些功能简单的逻辑分析仪,能采样触点的高低电平并实时传递给电脑。到taobao上还真找到了不少这种简易的分析仪,价位都在几十几百的,算可以接受,遂订了一台。
至此综合前两种思路(前面思路略微冗余,还是抽练着理解一下的好,不然就绕晕了),制定的口令破解策略如下:
把逻辑分析仪连到卡片,再插到洗衣机,然后电脑采样到卡片和洗衣机的通信数据电平,分析数据就可以看到洗衣机发送验证口令的数据阶段了。思路再简单不过了,现在就是要解决这个电路的搭建问题了:尽量不用焊接和复杂的工具,手头能有的东西就最好了;要保证侦听成功率高,即接触不良的情况尽量避免;还要保证整体设备轻便,开坦克抢银行就有点囧了。
整个制作过程经过了很多尝试,透明胶,502,双面胶,剪刀,钳子…在此省点笔墨,都是体力活熟练工,等真动手了就知道它的难度了。导线来自于一个鼠标,如下图所示
拆了取出U线,然后分离内部的四条线就能拿来当导线了,剩下的部分插电脑上还能在红线上产生5V电平,可以用来测试逻辑分析仪的工作状态。第一个图是首个比较成功的连线效果,然后是是最终完美版的连线效果。
有以下两点是制作中心得:
●
- 鼠标线中的导线特别的细,剥线的时候像我这样用剪刀的就需要特别的细腻,稍有不慎就把铜线弄断了
- 根据上面两个图应该注意连接时钟那根线要很细才行,不能保留外面的胶皮。导线太粗会把卡和洗衣机的读卡触点挤开,触点无法到接触卡片就不能正常通信了。
线接好后就可以插入读卡器试试效果了,读卡器工作正常就说明你的接线没有影响到读卡器和卡片的通信,再接上逻辑分析仪看看是否能侦听到通信数据,下图所示的通信为读数据的过程。
准备工作就绪,现在只需要把卡插到洗衣机就能截获和洗衣机的通信了。这一天凌晨5点我就爬起来,保证洗衣房无人干扰。我,电脑,逻辑分析仪,卡片来到洗衣机面前。截获到数据就赶紧跑回来分析这些电平序列。实际的电平远不如上图用读卡器产生的序列那样完美,时钟电平经常会被数据电平的下降沿给拉下来,去伪存真时和逆向一段加花的汇编一样很需要耐心的。
再稍微说两句关于控制字的事儿,截获的时序需要参考SLE4442手册而不是读卡器的手册(这是我最初犯的错误)。每个指令都在时钟高电平时数据下降沿后开始,数据从低位到高位的顺序发送。发送的命令格式为 一个字节指令类型 一个字节地址 一个字节数据,然后时钟高电平数据电平上升沿代表本次命令结束,随后数据线上就会产生命令的反馈。
我们关注的指令类型为0x33,用于校验口令。发送命令格式为
1
2
3
|
0x33 0x01 s1 0x33 0x02 s2 0x33 0x03 s3 |
洗衣机会依次发送该数据包到卡片,其中s1 s2 s3拼在一起就是那三个字节的口令了!
下图是电平的分析,不过前提是先在浩如烟海的数据流中找到该序列,这就是一段慢慢‘F7’的过程了。去伪存真的工作我用红色补全了(本来应该是符合手册上的理想状态电平序列,只是世事左右了他们)~
高电平后数据下降沿代表命令开始。发送的命令前两个字节为0x33 0x01 说明是在验证口令第一个字节。接下来的一个字节内容如下图,为0x66,这就是口令的第一个字节。
下面再寻觅到第二个字节验证片段0x33 0x02 0x04 所以口令第二个字节是0x04
第三个字节的分析不防自己动手试试吧:
到此就分析出了卡口令,插入读卡器,输入口令就能够修改数据了。洗衣卡内的数据结构很简单在不需要洗衣机内源程序的情况下也能辨析这些数据的含义。仅依靠卡口令保护是不能胜任数据篡改的。
既然方法已经成形就顺便对电卡也测试了一下,电卡内的数据就复杂的多了,包含很多字段,通过到卡务中心给卡充钱,到电表处划卡,补办新卡等各个操作环节我记录到很多组卡内数据情况,对比分析也辨识出一些字段的含义。如下所示
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
|
A2 13 10 91 FF FF 81 15 FF FF FF FF FF FF FF FF FF FF FF FF FF D2 76 00 00 04 00 FF FF FF FF FF sle4442的厂商信息 68 03 11 01 31 44 43 62 电表号 02[00 02 05 00]15 4D 16 卡内有205度电 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 80 15 00 00 15 00 18 电表余额 02 00 17 87 00 00 00 00 00 00 62 16 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00 02 FF FF FF FF FF FF FF FF FF FF FF FF FF |
电卡相比洗衣卡难度大大提升了,首先电表锁在一个小黑屋,需要到楼管处借钥匙和电卡才能打开小黑屋去充电,且不能耽搁太久还钥匙和卡,不然鬼知道你拿他们干什么去了。所以我只好把用完就赶紧把钥匙和电卡归还,但在此之前我已经复制了该卡的数据到一张空白的SLE4442卡内,并且留着小黑屋的门没锁。
这次需要在没有原卡的情况下去获取卡口令了,方法和前面洗衣卡比较类似,初始随便给卡设个口令,然后侦听电表和卡片的通信。电表会先尝试口令的第一个字节,发现不对就停止了口令尝试,每次侦听只能获取一个字节的口令。然后把对应的口令字节设置到卡内,保证下一次比对时该位正确以换取下一位的比对通信包。加之线路接触不良,整晚跑了20几趟小黑屋才算是最终获取了全部的口令字节。从下图看电卡的时序电平比洗衣机稍好但也赶不上读卡器的优美平稳。
有了口令就能够修改余额字段了,改完插到电表上,未果。看来仅修改余额字段是解决不了问题的,可能其他字段还有校验功能。电表是一卡一表,而不是洗衣机那种一机多卡形式。无状态的卡片只要每次都还原数据内容和口令,与前一次相同就能不断重复使用(比如对于洗衣卡,即使不知道数据含义,但只要每次还原内容,就能保证总有剩余次数)。但电卡和电表可以有状态字段存在,即每次通信会在电表和电卡内留有一个状态,由于不知道怎样通过一个状态计算下一个状态并填写到卡内,所以卡数据就不会被电表认可。如何计算卡下一状态字段恐怕也就卡务中心充电的电脑才知道。如果需要进一步分析就需要能够拿到电表内或者卡务中心充电电脑内的程序了,这事儿就比较困难了。毕竟不打算以此谋取私利,只是想研究下大概原理图个乐呵,所以还是就此hold住了~
参考
读取SLE4442内的数据:
http://dangerousprototypes.com/2009/08/31/bus-pirate-sle4442-smart-card-update/
http://hackaday.com/2008/11/25/how-to-read-a-fedex-kinkos-smart-card-sle4442/
SLE4442中文手册:
http://wenku.baidu.com/view/a792c4335a8102d276a22ff1.html
有人悄悄话问我ACR38SDK中文的哪有下载,其实你随便找家卖家淘宝店跟店长索要都能拿到~你买产品当然人家应该给你提供软件了
不过还是在此提供一下我使用的版本吧: http://pan.baidu.com/share/link?shareid=23817&uk=1006929398