首页
社区
课程
招聘
[翻译]用不到10美元成本,自己DIY一个Proxmark设备
发表于: 2018-2-1 12:59 9393

[翻译]用不到10美元成本,自己DIY一个Proxmark设备

2018-2-1 12:59
9393

(写在前面:翻译这篇文章实在有点力不从心,作者可能太极客,文章的逻辑不太强,语言指代有时候也不明确。我自己对于NFC也不是特别懂,还请大家将就着看,有疑惑请参照原文:6a6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2H3k6h3&6@1k6i4y4@1M7r3q4J5N6r3&6W2M7Y4y4Q4x3X3g2U0L8$3#2Q4x3V1k6K6k6h3y4#2M7X3W2@1P5g2)9J5k6r3u0D9L8$3N6Q4x3V1k6T1N6h3W2D9k6r3W2F1k6#2)9J5k6r3S2S2L8r3k6Q4x3X3c8S2i4K6u0V1M7s2u0G2P5r3#2S2M7X3E0Q4x3X3c8X3L8%4u0Q4x3X3b7I4x3q4)9J5c8R3`.`.

Proxmark是一款出色的设备,我们机构有一些。 但对于NFC(近场通讯)业余爱好者来说,Proxmark有些过于昂贵,而可用的仿制设备则更少。但如果你有些焊接技能,通过学习下面的方法,用大约10美元的元件,便可以构造出一款NFC标签模拟器。


本篇文章将展示如何逆向构建ISO-14443A标准的协议,以查看哪里存在可利用的弱点。 我们创建了一个能够模拟Mifare标签的设备,尽管其加密技术存在已知的弱点,但它们通常被认为是具有严格和模糊访问控制的黑盒子。 我打算在加密层之外找到弱点,因为这些都是完全开放的。



本项目中,我决定不用这种平台下的任何传统调试装置来开发这个设备。这包括一个传统的USB NFC读写器,如下所示:

1c2K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2S2L8h3q4*7L8$3&6Q4x3X3g2U0L8#2)9J5k6i4g2C8i4K6u0r3h3h3!0K6L8$3!0Q4x3X3c8m8b7#2t1I4x3U0u0g2i4K6u0V1b7$3!0F1N6r3q4U0N6r3I4W2M7%4y4Q4x3X3c8d9k6h3q4V1k6i4u0Q4x3X3b7#2P5p5#2A6k6X3q4J5k6g2)9J5c8X3c8H3i4K6u0r3b7U0l9H3c8#2W2b7d9g2A6s2y4W2)9J5c8Y4u0W2k6W2)9K6c8s2y4J5i4K6g2X3x3g2)9#2k6U0k6Q4x3@1k6A6k6g2)9K6c8q4g2f1c8U0S2Q4x3U0k6S2L8i4m8Q4x3@1u0I4K9h3c8Q4x3@1b7I4y4e0p5$3x3o6l9&6y4o6V1H3i4K6t1$3j5h3#2H3i4K6y4n7M7%4u0Q4x3@1b7^5i4K6u0V1y4W2)9J5y4X3q4E0M7q4)9K6b7X3E0W2P5i4N6G2M7X3c8K6i4K6y4p5L8X3k6U0i4K6u0n7M7X3g2S2k6r3g2J5


我也决定不用Proxmark3或Chameleon Mini这种更倾向服务于安全专业人士的工具:

73dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6N6r3!0J5k6g2)9J5k6i4u0&6M7$3y4U0i4K6u0W2j5$3!0E0i4K6u0r3M7s2u0G2k6s2g2U0N6s2y4Q4x3V1k6F1k6i4N6Q4x3X3c8H3M7X3!0^5L8h3q4J5K9K6y4Q4x3X3c8C8K9i4b7`.

474K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2C8K9h3y4C8M7%4c8S2M7Y4c8W2M7W2)9J5k6h3y4G2L8g2)9J5c8Y4m8J5L8$3A6W2j5%4c8K6i4K6u0r3x3e0V1^5x3o6l9%4z5o6f1#2y4g2)9J5c8X3y4Z5j5h3#2W2L8r3g2G2L8X3#2A6L8X3W2Q4x3X3c8S2i4K6u0V1N6X3g2J5M7$3q4@1K9h3I4W2i4K6u0V1L8X3k6U0i4K6u0V1j5$3q4J5k6q4)9J5k6r3g2E0N6h3I4S2N6r3!0J5i4K6u0V1j5h3&6V1i4K6u0V1L8h3)9`.


在开发过程中,我发现了一个类似的项目(网址如下),它使用了可能已经改编的类似硬件。尽管这个项目有一些很好的想法,但我还是想从头开始设计。

0deK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2F1L8$3&6S2L8W2)9J5k6h3&6W2N6q4)9J5c8U0t1H3x3e0y4Q4x3V1j5I4x3g2)9J5c8Y4y4A6L8i4m8D9k6g2)9J5k6r3&6X3j5#2)9J5k6h3S2@1L8h3H3`.


我想自己开发的原因是,尽管这些工具在性能上肯定非常优越,同时可以根据用户的需要随时修改。但仅仅使用这些工具,并不能让我得到与自己从头开发设备相同的见解。


调试本项目的关键装置是我的Hobby Components Logic Analyzer和RTL-SDR。 对于编程和开发,我使用了Arduino来编写成为项目核心的ATTiny84,并使用了STM32f401re开发板进行调试(后面会说明为什么必须这样做)。



在开发过程中,我发现必须通过带外数据的方式来分析读写器中的命令 。 读取器本身无法直接访问这些信息,因为它的USB实现完全是作为HID(人机界面设备)进行设置的,对设备上的NFC硬件访问受限。 我决定了使用我信任的RTL-SDR来获取必要信息是最佳选择。 在过去,RTL-SDR已被证明能够查看NFC数据包,因此我觉得可以创建一个应用程序来执行此操作。


最初,我使用了我早前的一个项目,它允许用户查看SDR IQ样本及其幅度,并使用传统的逻辑分析软件对其进行分析:

5abK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6u0M7$3E0#2M7X3W2Q4x3V1k6d9g2p5I4e0c8q4u0Q4x3X3c8@1L8#2)9J5k6q4m8#2L8s2y4W2N6X3W2W2N6H3`.`.


关于这个项目首先要注意的是,标准的RTL-SDR无法调谐到NFC读写器使用的相同频率,即13.56Mhz。但是,它不仅可以调谐到它的谐波频率之一 - 27.12Mhz ,同时我们在调谐至该频率并通过运行分析仪后发现,读写器的传输易于用标准进行查看,因此编写应用程序将其解码用于分析很简单。但可惜的是,由于使用了传输和调制方案(稍后会详细介绍),RTL-SDR标签的响应将不可见。考虑到这一信息,我创建了一个采样频率为27.12Mhz,采样率为1.695Mhz的应用程序(选择此采样率是因为它处于RTL-SDR的允许采样率范围内,并且也是读写器数据率的倍数)。从这里输出的数据中,我可以解析出读写器的命令,以便查看它们进行调试,最终创建这个小工具:

fbbK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6u0M7$3E0#2M7X3W2Q4x3V1k6d9g2p5I4e0c8q4u0Q4x3X3c8z5c8V1x3`.


不幸的是,由于这个工具只能分析读写器的命令,而不能分析标签的命令,所以在之后的调试中,特别是调试加密层时,还是有问题。通过使用逻辑分析仪来跟踪命令和响应,可以缓解这些问题。



我决定使用ATTiny84作为设备的核心MCU(微控制器),因为它可以很容易地使用外部时钟,具有相当大的程序空间,并且还具有板载EEPROM。 为了以正确的频率工作,我使用了一个13.56Mhz的晶体,配合适当的电容来匹配它,并且为了接收来自读写器的命令,我使用了一个谐振电感耦合器:

835K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6W2L8W2)9J5k6i4N6A6K9$3W2H3k6h3c8A6j5g2)9J5k6h3!0J5k6#2)9J5c8Y4N6A6K9$3W2Q4x3V1k6d9k6i4y4G2L8X3q4F1N6q4)9#2k6X3W2F1k6s2g2U0N6r3W2$3k6g2)9#2k6X3y4G2N6i4m8D9K9h3&6Y4


馈入一个包络检测器

88fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6W2L8W2)9J5k6i4N6A6K9$3W2H3k6h3c8A6j5g2)9J5k6h3!0J5k6#2)9J5c8Y4N6A6K9$3W2Q4x3V1k6q4L8Y4k6W2L8r3!0H3k6g2)9#2k6X3c8W2N6r3g2U0N6r3!0J5


然后将其连接到GPIO输入引脚以接收信号。


使用该芯片有一个关键的弱点,那就是外部晶振的引脚与UART使用的引脚相同。 由于我为了实现在线串行编程器而安装的Arduino 不能通过任何其他方法进行调试,因此必须通过不同引脚上的任何调试字符串将时钟输出到STM32f401re板,该板再将其转换为UART。因为基于软件的UART 在这些频率上太不一致了。

为了减少噪音,我在电源和接地引脚之间增加了电解电容和超级电容。


然后将它汇总到以下原型电路板中:


低级NFC协议非常简单。 读写器和标签使用两种不同的编码方案进行通信。

读写器使用一种称为修改米勒的编码方案,定义如下:

•      0比特跟着0比特:传输的前四分之一是低位,之后都是高位。

•      1比特:传输的前二分之一是高位,之后四分之一是低位,再之后都是高位。

•      1比特跟着1比特:整个传输都是高位。


用于发送命令的编码示例如下:


当读写器与标签进行通信时,会降低提供给标签用以通信的功率。 这种编码方案是专门设计用于当电源被禁用时,让标签有足够的剩余电力来处理交易。

标签使用了一种更传统的无线电通信编码 - 曼彻斯特编码。


该协议使用从高位到低位的设置来编码1,或者从低位到高位的设置来编码0.为了使用这个协议进行通信,它使用了所谓的“负载调制”。 这调制了一个信号,以便在发送给标签的功率上产生阻力,读写器可以将其理解为响应。


有关这些编码方案的更多信息,请查看:d89K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4u0S2k6r3W2G2i4K6u0V1k6h3I4W2j5%4c8J5L8$3&6A6j5%4y4Q4x3X3g2U0L8$3#2Q4x3V1k6A6L8X3k6G2i4K6u0r3N6$3W2J5k6h3I4W2M7%4y4Q4x3V1k6F1k6X3y4Q4x3V1k6F1k6h3q4J5i4K6u0V1k6X3W2W2L8r3c8Q4x3X3c8U0L8$3#2E0N6h3&6A6j5$3q4@1K9h3!0F1M7#2)9J5k6r3#2G2k6s2g2D9j5i4c8A6L8$3&6Q4x3X3c8J5k6W2)9J5k6s2y4A6k6$3&6S2L8q4)9J5k6r3W2F1N6r3g2J5k6X3q4U0k6g2)9J5k6i4m8Z5M7q4)9J5k6b7`.`.

数据包由帧开始位,随后是帧的一个字节,以及基于字节中置位和未置位位数的奇偶校验位构成。 字节按顺序发送,先传送最低有效位,例如下面的命令:

上面的命令是REQA命令,用于请求任何新的读写器响应标签。


命令由标签发送和响应,以便在两个设备之间进行通信的状态机进行处理:


由于在ATTiny上实现协议产生了一些问题,我进行了一些迭代处理,其中最关键的是时钟漂移。 一般情况下对于ATTiny来说,时钟漂移会有很大的问题,因此,我最初试图纯粹使用时钟和间隔来实现协议,以便为发送的修改的密勒比特接收一个位掩码,比如:

只有60%的情况下通信能顺利完成。这是不够的,因为读写器会一直认为标签被移除,然后重新引入场。

由于这个原因,我们将定时器与GPIO中断一起使用,并检查每次引脚设置为低电平之间的时间,从而允许有足够的时钟漂移量,同时仍然获得完整的通信。


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

最后于 2019-1-26 17:03 被admin编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (5)
雪    币: 371
活跃值: (94)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
mark
2018-2-1 14:10
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mark
2018-2-1 16:20
0
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
辛苦了
2018-2-3 13:58
0
雪    币: 2653
活跃值: (3648)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
啥时候我才能财务自由,就可以玩些乱七八糟的东西了
2018-2-6 16:23
0
雪    币: 1507
活跃值: (265)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
哈哈,这个门槛低,可以玩起~
2018-2-12 07:48
0
游客
登录 | 注册 方可回帖
返回