搜尋
首頁後端開發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

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境