搜索
首页后端开发Python教程Flipper Zero NFC 黑客攻击 - cannon fooder

Flipper Zero NFC Hacking - cannon fooder

在上一篇文章中,我们了解了如何使用 Flipper Zero 实现透明阅读器。如果我们采用相同的概念,但这次实现一个透明的卡模拟器呢?我们可以像大炮一样使用 Flipper Zero,通过发送错误的请求来攻击数字堡垒,例如阅读器或智能手机。格式错误的命令、生命周期中不期望的命令、模糊测试、缓冲区溢出——没有极限!

1 - 背景

就像透明读卡器一样,我想从我的计算机使用其串行 CLI 与 Flipper 进行通信。计算机处理所有逻辑,这意味着它根据命令决定给出什么响应,例如使用 Python 脚本。

现在,关于卡片模拟器命令的实现,与读卡器相比,它本质上是一种镜像模式:

  • 我们需要检测终端何时激活射频场。
  • 我们需要检测终端何时停用 RF 场。
  • 我们需要能够向终端接收/发送位。
  • 我们需要能够向终端接收/发送字节。

除了一个让事情变得复杂的小细节。请记住,在卡/读卡器通信期间,读卡器充当主机,这意味着它是发起通信并发送命令的人。

因此,如果我们要创建一个卡片模拟器,它必须等待来自读卡器的事件。您可以将其视为服务器,而读者则充当客户端。我们需要将其编码到 Flipper Zero 中。

好吧,首先,让我们快速回顾一下使用 ISO 14443-A 的读卡器和卡之间的通信交换。

2 - 使用 ISO 14443-A 的读卡器和卡之间的通信交换

下面的图表总结了读卡器和通过 ISO 14443-A 进行通信的卡之间的主要交换。

+----------------+                                  +----------------+
|   Reader       |                                  |   Card         |
+----------------+                                  +----------------+
        |                                                  |
    Field activation                                       |
        |                                                  |
        | --- REQA (Request Command Type A) -------------> |
        |                   26                             |
        |                                                  |
        | |
        |                                                  |
        | |
        |                                                  |
        | |
        | E0 50 BC A5                                      |
        |                                                  |
        | |    
        | D0 73 87                                         |
        |                                                  |
        | |
        | 0200A404000E325041592E5359532E444446303100E042   |
        |                                                  |
        | 



<p>现在的问题是,“我们如何在 Flipper 上实现所有这些?”</p>

<h2>
  
  
  4 - Flipper 零实施
</h2>

<p>和我之前的文章一样,我将继续扩展文件applications/main/nfc/nfc_cli.c(请参阅我的分支上的文件)。</p>

<p>首先,一个快速的硬件点。对于 NFC 管理,Flipper Zero 使用 ST25R3916 芯片。这很棒,因为它允许我们创建非接触式读卡器和卡模拟器。该芯片自动处理发送从现场激活到防碰撞所涉及的命令。我们需要做的就是指定 ATQA、SAK、UID 及其要发回的长度。</p>

<p>Flipper 提供了函数 furi_hal_nfc_iso14443a_listener_set_col_res_data 来处理所有这些。</p>

<p>这就是为什么我向 Flipper 的 NFC CLI 添加了 3 个命令来配置这些元素:</p>
  • set_atqa
  • set_sak
  • 设置_uid

在开始仿真之前,我们将使用这些参数调用 furi_hal_nfc_iso14443a_listener_set_col_res_data。

+----------------+                                  +----------------+
|   Reader       |                                  |   Card         |
+----------------+                                  +----------------+
        |                                                  |
    Field activation                                       |
        |                                                  |
        | --- REQA (Request Command Type A) -------------> |
        |                   26                             |
        |                                                  |
        | |
        |                                                  |
        | |
        |                                                  |
        | |
        | E0 50 BC A5                                      |
        |                                                  |
        | |    
        | D0 73 87                                         |
        |                                                  |
        | |
        | 0200A404000E325041592E5359532E444446303100E042   |
        |                                                  |
        | 



<p>接下来,使用函数 furi_hal_nfc_set_mode 将 Flipper Zero 设置为卡模拟器模式。这次,我们指定模式 FuriHalNfcModeListener,对于技术,我们使用标准值:FuriHalNfcTechIso14443a、FuriHalNfcTechIso14443b 和 FuriHalNfcTechIso15693。</p>

<p>最后,为了开始模拟,我实现了命令 run_emu,它将启动一个无限循环,等待附近的读取器。事件监听由函数furi_hal_nfc_listener_wait_event处理。<br>
</p>

<pre class="brush:php;toolbar:false">    if(g_NfcTech == FuriHalNfcTechIso14443a) {
        furi_hal_nfc_iso14443a_listener_set_col_res_data(g_uid, g_uid_len, g_atqa, g_sak);
        fdt = ISO14443_3A_FDT_LISTEN_FC;
    }

接下来,事件可以根据检测到的内容采用多个值:

  • FuriHalNfcEventFieldOn 表示已检测到场激活。
  • FuriHalNfcEventFieldOff 表示该字段已关闭。
  • 最重要的事件是FuriHalNfcEventRxEnd,它表示已收到来自终端的命令。此时,我们需要发送响应。再次强调,命令发送的所有处理(包括防冲突)都是自动完成的。因此,我们基本上可以开始处理像 select 这样的命令。
FuriHalNfcEvent event = furi_hal_nfc_listener_wait_event(100);

5 - 处理命令的接收并发送响应

现在,让我们看看如何处理命令的接收和发送响应。

    while(true) {
        FuriHalNfcEvent event = furi_hal_nfc_listener_wait_event(100);
        if(event == FuriHalNfcEventTimeout) {
            if(cli_cmd_interrupt_received(cli)) {
                break;
            }
        }
        if(event & FuriHalNfcEventAbortRequest) {
            break;
        }
        if(event & FuriHalNfcEventFieldOn) {
            printf("on\r\n");
        }
        if(event & FuriHalNfcEventFieldOff) {
            furi_hal_nfc_listener_idle();
            printf("off\r\n");
        }
        if(event & FuriHalNfcEventListenerActive) {
            // Nothing
        }
        if(event & FuriHalNfcEventRxEnd) {
  • 数据接收通过furi_hal_nfc_listener_rx(rx_data, rx_data_size, &rx_bits);处理。我们使用 printf 显示接收到的数据,该 printf 将响应发送到连接到 Flipper 的终端。 需要理解的重要一点是,一旦我们收到命令,我们必须非常迅速地做出反应。这意味着我们无法在 shell 中手动编写响应——那就太晚了。这就是为什么与 Flipper 通信的唯一方法是使用带有调度程序的 Python 脚本,该调度程序指定对每个收到的命令给出哪个响应.
  • 然后,终端发送一个响应,我们使用函数 nfc_emu_get_resp(cli, rx_cmd) 检索该响应。这部分有点棘手,因为在 shell 命令中,通常不会进行来回交换。所以,我使用函数 cli_getc(cli) 来读取一个字符。

    • 有时,我会收到不需要的字符 0xA。如果这是收到的第一个字符,我会跳过它,因为我会逐个字符地阅读。
    • 第一个字符指示 Flipper Zero 是否应该计算并将 CRC 添加到命令本身(0x31 表示是,否则表示否)。
    • 然后,我以十六进制字符串格式读取响应的字符。当我们收到字符0xA时,表示接收完成。
  • 最后,我们使用 unhexify(tmp, (uint8_t*)bit_buffer_get_data(rx_data), len); 将十六进制字符串转换为 uint8_t 数组。

  • 如有必要,我们使用 add_crc 添加 CRC。

  • 最后,我们可以使用以下方式将回复发送给读者:

    FuriHalNfcError r = furi_hal_nfc_listener_tx(rx_data, bit_buffer_get_size(rx_cmd));.

现在,我们如何验证这一切?

6 - 卡模拟验证

6.1 - 它是如何开始的......(Hydra NFC v2)

Flipper Zero NFC Hacking - cannon fooder

好吧,我们可以使用上一篇文章中的透明阅读器来验证我们的模拟器。所以,我们需要两个脚蹼零点……但我没有。不过,我有 Hydra NFC v2,它允许透明的读取器设置。

Flipper Zero NFC Hacking - cannon fooder

我只需要使用 pynfc 中的脚本。

+----------------+                                  +----------------+
|   Reader       |                                  |   Card         |
+----------------+                                  +----------------+
        |                                                  |
    Field activation                                       |
        |                                                  |
        | --- REQA (Request Command Type A) -------------> |
        |                   26                             |
        |                                                  |
        | |
        |                                                  |
        | |
        |                                                  |
        | |
        | E0 50 BC A5                                      |
        |                                                  |
        | |    
        | D0 73 87                                         |
        |                                                  |
        | |
        | 0200A404000E325041592E5359532E444446303100E042   |
        |                                                  |
        | 



<p>它非常实用,因为它允许我们一一发送命令来验证一切:</p>

  • 发送 REQA
  • 防碰撞
  • 选择
  • PPS
  • 发送 TPDU

6.2 - 它是如何完成的...(PC/SC 阅读器)。

然而,实际上,沟通要复杂一些。因此,我使用 PC/SC 读卡器 ACR122U 来发送/接收完整的 APDU 命令,并结合 Python 脚本(使用 pyscard )进行实际测试。

Flipper Zero NFC Hacking - cannon fooder

就我而言,我只需选择 PPSE 应用程序即可。

    if(g_NfcTech == FuriHalNfcTechIso14443a) {
        furi_hal_nfc_iso14443a_listener_set_col_res_data(g_uid, g_uid_len, g_atqa, g_sak);
        fdt = ISO14443_3A_FDT_LISTEN_FC;
    }

所以现在,卡片模拟器需要处理更多的事件。因此,我在下面创建了一个 Python 脚本来管理这种情况。有很多东西需要解释,例如不同类型的 TPDU(i-block、r-block、s-block),但这将在以后的博客文章中介绍。

FuriHalNfcEvent event = furi_hal_nfc_listener_wait_event(100);

这样就很好用了,仿真也极其稳定。我可以将 Flipper 从读卡器上放置或移除,并多次发送命令,而且每次都有效。 Flipper 再次出色地实现了 NFC 层,并且其 API 允许在实现过程中以最少的工作量实现大量功能。

下面是 Python 脚本的输出示例。

+----------------+                                  +----------------+
|   Reader       |                                  |   Card         |
+----------------+                                  +----------------+
        |                                                  |
    Field activation                                       |
        |                                                  |
        | --- REQA (Request Command Type A) -------------> |
        |                   26                             |
        |                                                  |
        | |
        |                                                  |
        | |
        |                                                  |
        | |
        | E0 50 BC A5                                      |
        |                                                  |
        | |    
        | D0 73 87                                         |
        |                                                  |
        | |
        | 0200A404000E325041592E5359532E444446303100E042   |
        |                                                  |
        | 



<h3>
  
  
  6.3 还有一点 Proxmark
</h3>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/172964254814325.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Flipper Zero NFC Hacking - cannon fooder"></p>

<p>使用 Proxmark 3 对于调试嗅探模式下的通信非常有用:我将其放置在读卡器和卡(可以是正品卡或 Flipper)之间,并且我能够检查数据交换。<br>
</p>

<pre class="brush:php;toolbar:false">    if(g_NfcTech == FuriHalNfcTechIso14443a) {
        furi_hal_nfc_iso14443a_listener_set_col_res_data(g_uid, g_uid_len, g_atqa, g_sak);
        fdt = ISO14443_3A_FDT_LISTEN_FC;
    }

接下来怎么办?

很好,下一步是什么?

  • 首先,我可以对卡片模拟 Python 脚本进行更多解释。
  • 此外,我应该实现一种在按下按钮时停止卡模拟的方法,因为当前事件等待循环永远不会完成。退出的唯一方法是重新启动 Flipper。
  • 此外,我们还可以通过同时使用透明读卡器和卡模拟器来做一些有趣的事情,例如,执行中间人攻击并实时修改通信!

以上是Flipper Zero NFC 黑客攻击 - cannon fooder的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Python的执行模型:编译,解释还是两者?Python的执行模型:编译,解释还是两者?May 10, 2025 am 12:04 AM

pythonisbothCompileDIntered。

Python是按线执行的吗?Python是按线执行的吗?May 10, 2025 am 12:03 AM

Python不是严格的逐行执行,而是基于解释器的机制进行优化和条件执行。解释器将代码转换为字节码,由PVM执行,可能会预编译常量表达式或优化循环。理解这些机制有助于优化代码和提高效率。

python中两个列表的串联替代方案是什么?python中两个列表的串联替代方案是什么?May 09, 2025 am 12:16 AM

可以使用多种方法在Python中连接两个列表:1.使用 操作符,简单但在大列表中效率低;2.使用extend方法,效率高但会修改原列表;3.使用 =操作符,兼具效率和可读性;4.使用itertools.chain函数,内存效率高但需额外导入;5.使用列表解析,优雅但可能过于复杂。选择方法应根据代码上下文和需求。

Python:合并两个列表的有效方法Python:合并两个列表的有效方法May 09, 2025 am 12:15 AM

有多种方法可以合并Python列表:1.使用 操作符,简单但对大列表不内存高效;2.使用extend方法,内存高效但会修改原列表;3.使用itertools.chain,适用于大数据集;4.使用*操作符,一行代码合并小到中型列表;5.使用numpy.concatenate,适用于大数据集和性能要求高的场景;6.使用append方法,适用于小列表但效率低。选择方法时需考虑列表大小和应用场景。

编译的与解释的语言:优点和缺点编译的与解释的语言:优点和缺点May 09, 2025 am 12:06 AM

CompiledLanguagesOffersPeedAndSecurity,而interneterpretledlanguages provideeaseafuseanDoctability.1)commiledlanguageslikec arefasterandSecureButhOnderDevevelmendeclementCyclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesandentency.2)cransportedeplatectentysenty

Python:对于循环,最完整的指南Python:对于循环,最完整的指南May 09, 2025 am 12:05 AM

Python中,for循环用于遍历可迭代对象,while循环用于条件满足时重复执行操作。1)for循环示例:遍历列表并打印元素。2)while循环示例:猜数字游戏,直到猜对为止。掌握循环原理和优化技巧可提高代码效率和可靠性。

python concatenate列表到一个字符串中python concatenate列表到一个字符串中May 09, 2025 am 12:02 AM

要将列表连接成字符串,Python中使用join()方法是最佳选择。1)使用join()方法将列表元素连接成字符串,如''.join(my_list)。2)对于包含数字的列表,先用map(str,numbers)转换为字符串再连接。3)可以使用生成器表达式进行复杂格式化,如','.join(f'({fruit})'forfruitinfruits)。4)处理混合数据类型时,使用map(str,mixed_list)确保所有元素可转换为字符串。5)对于大型列表,使用''.join(large_li

Python的混合方法:编译和解释合并Python的混合方法:编译和解释合并May 08, 2025 am 12:16 AM

pythonuseshybridapprace,ComminingCompilationTobyTecoDeAndInterpretation.1)codeiscompiledtoplatform-Indepententbybytecode.2)bytecodeisisterpretedbybythepbybythepythonvirtualmachine,增强效率和通用性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。