出于对SIM卡的兴趣做了一些硬件Hacking [翻译]

原文:http://prosauce.org/blog/2011/12/11/sim-card-curiosity-and-a-little-hardware-hacking.html

几个月前我对手机移动网络的Layer 2/3 协议(以及它们的实现)产生了兴趣。我像一个年轻的学生一样想”人们如果能在硬件通信中使用中间人攻击那么我就可以欺骗别人的SIM卡来免费上网“继而我快速的想到了SIM卡hacking。不。额,不不。它真的没那么简单。

于是我通过谷歌发现了两点,1)德国人喜欢他们的SIM/Smart 卡技术,2)SparkFun 是一个很棒的网站。在这让我试着跟着我的思维过程,让我来揭开...我大脑中出现的第一个问题是如何在SIM卡通信中实现中间人攻击?第一步:我能窃听SIM卡到调制解调器的通信吗?幸运的是我有一些无人机实验留下来的一些东西,具体的来说是一个usbma和几个MiniPCIe调制解调器

sim-hacking-attempt-usbma-150x150.jpg - 大小: 11.43 KB - 尺寸: 150 x 150 - 点击打开新窗口浏览全图
所以我从SIM I/O连接引脚上焊了一根线到板子上(usbma)。第二步:我疯狂的谷歌想找到是否有可能使用串口(RS232)来读取SIM I/O。为什么呢?我从 s7ephen's presentation 这里了解到大多数硬件协议都可以通过串口读取。好消息,SIM I/O输出是一个TTL协议,他可以采用MAX232集成电路(IC)转换(从-15,-5 t到 5,15V)为串行(-15,-5.5,15V)
sim-hacking-attempt-sim.gif - 大小: 1.27 KB - 尺寸: 98 x 116 - 点击打开新窗口浏览全图
太酷了,但是这他妈能说明什么(what the hell does that mean)。好吧,我从一个来自UDel's CVORG研究小组搞硬件的朋友给了我一些帮助,让我看一本书和刚开始的那些电子套件(我猜是这么翻译)。他们向我保证这是一个非常简单的项目,失败的机会很小。我会告诉他们所谓的失败的机会很小!

如果你继续下去,这有一些链接:

>翻开SIM卡概述: Wolfgang Rankl - 有一些智能卡的东西 (一些德国人的)

>做(干,括弧笑)! Make: Electronics Book

>SparkFun: Beginning Embedded Electronics - 电池盒

我已经在我的无人机实验中变成的一个巨大的fan(风扇?不明觉厉),所以这次购物非常的爽!

OK,我们回来继续。电子套件里面将提供一个制作原型用的面包板,一个DIY的电源和一些连接导线。然而,使用MAX232集成电路你可以随意布线,但是在这种情况下,建议参考 Wolfgang的网站,你会发现更多好玩的东西。MAX232集成电路,5个1uF的电容和一个RS232母座适配器。幸运的是这些东西你可以直接从SparkFun这个网站上买到。或者你可以直接购买一个MAX232套件(逛商场),我们这是学习(翻译成:生命在于折腾更好,笑)。DIY吧。把这些加入购物车:

>一个 MAX232 集成短路

>5 个 1uF/25V (Wolfgang 说是 1uF,它们应该也能很好的工作) 电容

>9个引脚的RS232母座

根据SparkFun的教程提示,在电路开始的时候构建供电。在Wolfgang的网站上你应该可以了解到所有将SIM转换成MAX32-RS232的知识和图解。这一切看起来似乎很酷很新鲜,但是在真正开始破解硬件的时候这些却是微不足道的。这个设定只是允许你能够tap(??)和有可能在SIM卡和调制解调器的通信之间进行注入(如果你添加一根RX线)。我们现在不能弄坏任何东西。

sim-hacking-attempt-breadboard.png - 大小: 575.07 KB - 尺寸: 632 x 388 - 点击打开新窗口浏览全图
在上图中,我使用从SparkFun网站获得的面包板作为电路的开头一部分,左边是我根据他们的教程做的供电装置。中间是我的带3G调制解调器模块的USBMA板,用一根导线从SIM卡的数据I/O引脚引出来。这根线连接到右边MAX232的TX输入端,这样可以将信号从RS232读取到右边。注意,USBMA通电并通过串行电缆连接到我的电脑。

我使用AT&T作为载体,并通过虚拟机与调制解调器之间重复的诱导固件加载和连接测试。这能够为我在了解调制解调器与SIM卡之间通信机制时创造条件。

一些SIM卡Hacking的历史

SIM卡Hacking就目前来说并不是那么简单。这可能只是失败主义者的观点总而言之,如果你想伪造一张SIM卡,你必须先有一个ID(IMSI)和一个安全码(Ki)。(该死的)通信运营商必须通过发送一个随机码(随机数)来确认SIM使用了正确的Ki进行加密。(运营商早就知道你的IMSI和Ki,因为最开始就是他们写进去的)。这个密钥生成/验证(或散列)算法被称之为A5/A8s,实现这个算法被称之为COMP128,它有多个版本。在旧的SIM卡中使用的是COMP128v1(我们通常谈论的GSM pre-GPRS,pre-2002),Ki码可以通过64->54字节进行暴力破解。谷歌告诉我,目前还没有COMP128v2/3破解的真实案例。我发现唯一一篇有用的文章是Rafzar写的。据说是通过酸(试剂)清洗和逻辑分析仪对SIM卡的微控制器进行逆向工程。

还在等什么?居然有IC运行在SIM卡里面?没戏!

选择性的查看和阅读(以下链接):

>IASSC, Berkeley - GSM Cloning (article, includes crypto information)

>Charles Brookson - How to Clone GSM SIM (from 2005)

>Citizen Engineer - SIM Card Hacking (video)

>THC - SIM Toolkit Research Group (Wiki)

>Ivan "e1" Buetler - Smart Card APDU Analysis (Blackhat 2008)

>CCC - CCC will clone D2 card customers (article, German)

>Billy Brumley - COMP128 Walkthrough (class slides)

>Steve Hulton - Intercepting GSM Traffic (Blackhat DC 2008)

思考中....

我对欺骗别人的SIM卡来实现移动网络匿名感兴趣。然而,使用现金支付的AT&T GoPhone极有可能只是一个幌子。它不可能花钱为你隐藏你的位置。偷偷用别人的SIM卡将会解决钱的问题,但是你仍然不能快速的从提供者那里隐藏你的位置(这段翻译的比较烂)。

我的下一步将是在SIM卡和调制解调器之间添加一个复制器进行中间人攻击来实现访问和控制他们的规则。实际是上:我想了解更多东西!我将结束我之前使用pyserial捕获到的东西:

傻逼代码(Stupid code):

import serial, sys, os
 
class SIMtap(object):
    """customized class that accepts a serial port which is tapping a SIM->Modem"""
    def __init__(self, dev):
        """Basic init method"""
        self.dev = dev
        # Open the serial device at SIM's clock of 3.75MHz
        self.__serial = serial.Serial(dev, 9600, parity=serial.PARITY_EVEN, rtscts=2)
        self.__buffer = ""
        self.__prevBuffer = ""
        if not self.__serial.isOpen():
            print "[SIMtap]", "error opening dev", self.dev
            return 1
         
    def read(self):
        c = self.__serial.read(1)
        self.__buffer += c
        return c
 
def usage():
    print "%s: serial_device" % sys.argv[0]
    print "\twindows: COMx"
    print "\tlinux: /dev/ttyXXX"
     
if __name__ == '__main__':
    if len(sys.argv) < 2:
        usage()
        exit(1)
    st = SIMtap(sys.argv[1])
     
    n = 0
    while os.path.exists("simio%s.bin" % str(n)):
        n += 1
    if n &amp;gt; 0:
        prev= open("simio%s.bin" % str(n-1), 'r')
        st.__prevBuffer= prev.readline()
    output= open("simio%s.bin" % str(n), "w", 0)
 
    i = 0
    matching = ""
    while(1):
        i += 1
        if not i % 100:
            print ""
        c = st.read()
        output.write(c)
        output.flush()
        sys.stdout.write(c.encode("hex"))
        sys.stdout.flush()
        if c.encode("hex") == st.__prevBuffer[i-1].encode("hex"):
            matching += c
            print "\nMatched (%i bytes): %s" % (len(matching), matching.encode("hex"))
        else:
            matching = ""
     
    output.close()
保存的联系人列表的输出数据:
a000f200fc00fd0000e0fe1000dafea000fafefd00ff0000800f406f3a040e1a0000f000fefb0f7fffffff1111111 111f1c000fdf800e0a41000dafea40000ef0000fd000030ff8b00440106f900fa00ff00ff000000e833c77011fe00 fd00f000fe5400991f00ff7ffcff7800ffe0f000f840f80084f800fc7800ff00fe00fd0400207ff8ff3c00ff3c00f fff00ffff0f00ffff00f800ffff00ff00900000dc00c000ff00f800ff0f00ff0f00ffff00ffff0f00ff80f800ffff 00ff0000fc00f03f00ff7800ff3c00ffff00ffff1e00ff00f8f0ffff0f00ff000000ee008100ff00f8fff000fff00 0ff3c00ffff00ffffff00fffff8ff000d00ff00e000fff000ffff00ffff00f8ffff00ff00f800ff0f00ffff00ff00 fe00fddc001eff7f00ff00f8ffff00ff7800ffffff1e00ff0f00ff0008ffffffffffffffffffffffffffa020dcfff fffffffffffffffffffffff0a04ffffffffffffffffffffffffffff9000dcebffffffffffffffffffffffffffffff a020dcffffffffffffffffffff9000dc0dffffffffffffffffffffffffffa0dc20dcfffffffffffffffffffffffff fff0ffcffffffffffffffffffffffffffffff90c0dcfcffffffffffffffffffffffffffff9000d4dcffffffffffff ffffffffffffffa00420dcffffffffffffffffffffffffffff9000dc13ffffffffffffffffffffffff

在上面的代码中我做了一个检查的用来与之前捕获的数据进行匹配,因为我怀疑可能捕获到噪音。我确实发现了一些噪音,这在我的硬件破解(步骤)列表里面是一个已解决的问题。经过6次捕获之后,我发现有一部分保持不变。但是我无法使用输出的数据与APDU 或者 AT的指令相匹配。我做了一个相同的I/O tap mod(额...),捕获到了输出了一个已知的APDU命令,issued by me(?)。工作正常了。我想知道发送的其他数据到底是啥?(他们是AT 和 APDU命令的规则?

--------------------------------------------------------------------------------------------------------------------------------------------------------------

后记:文章中对SIM卡的数据读取并不是说的非常清楚,但是在操作过程中的一些思路倒是可以借鉴。尤其是在多次捕获数据进行比对和检查确定是否有噪音产生。在硬件hacking中,噪音产生是经常发生的事情,如果不注意这个经常会浪费相当多的时间去调试。主要思想仍然是使用的中间人攻击的方式来做数据捕获。文中有多处博主也不知该如何翻译,有些地方翻译的也是比较牵强,盆友们提可以出来我好做修正。


本文链接:https://www.92ez.com/?action=show&id=39
!!! 转载请先联系non3gov@gmail.com授权并在显著位置注明作者和原文链接 !!! 小黑屋
提示:技术文章有一定的时效性,请先确认是否适用你当前的系统环境。

上一篇: GSM Sniffer 多频点嗅探脚本
下一篇: H4ck33D – hacking a 433MHz Remote Control [翻译]

访客评论
#1
回复 best 2015-02-27, 8:21 PM
越来越深奥了。。。。。
发表评论

评论内容 (必填):