首頁 > 後端開發 > Python教學 > Flipper Zero NFC 駭客攻擊 - cannon fooder

Flipper Zero NFC 駭客攻擊 - cannon fooder

Barbara Streisand
發布: 2024-10-23 08:14:29
原創
1030 人瀏覽過

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                             |
        |                                                  |
        | <------------ ATQA (Answer to Request Type A) ---|
        | 04 00
        |                                                  |
        | --- ANTICOLLISION Command ---------------------->|
        |                                                  |
        | <------------ UID (Unique Identifier) -----------|
        |                                                  |
        | --- SELECT [UID] Command ----------------------->|
        |                                                  |
        | <------------ SAK (Select Acknowledge) ----------|
        |                                                  |
        | --- RATS (Request for Answer To Select) -------->|
        | E0 50 BC A5                                      |
        |                                                  |
        | <------------ ATS (Answer To Select) ------------|
        | 0A 78 80 82 02 20 63 CB   A3 A0 92 43            |
        |                                                  |
        | ---- [Opt] PPS (Proto and Parameter Selection) ->|    
        | D0 73 87                                         |
        |                                                  |
        | <------------ [PPS Response] --------------------|
        | D0 73 87                                         |
        |                                                  |
        | --- TPDU [Encapsulated APDU Command] ----------->|
        | 0200A404000E325041592E5359532E444446303100E042   |
        |                                                  |
        | <------------ TPDU [Encapsulated APDU Response] -|
        | 00a404000e325041592e5359532e444446303100         |
登入後複製
登入後複製
登入後複製
登入後複製

現在的問題是,「我們如何在 Flipper 上實現所有這些?」

4 - Flipper 零實施

和我之前的文章一樣,我將繼續擴展檔案applications/main/nfc/nfc_cli.c(請參閱我的分支上的檔案)。

首先,一個快速的硬體點。對於 NFC 管理,Flipper Zero 使用 ST25R3916 晶片。這很棒,因為它允許我們創建非接觸式讀卡機和卡片模擬器。此晶片會自動處理發送從現場啟動到防碰撞所涉及的命令。我們需要做的就是指定 ATQA、SAK、UID 及其要發回的長度。

Flipper 提供了函數 furi_hal_nfc_iso14443a_listener_set_col_res_data 來處理所有這些。

這就是為什麼我在 Flipper 的 NFC CLI 中加入了 3 個指令來設定這些元素:

  • set_atqa
  • set_sak
  • 設定_uid

在開始模擬之前,我們將使用這些參數來呼叫 furi_hal_nfc_iso14443a_listener_set_col_res_data。

+----------------+                                  +----------------+
|   Reader       |                                  |   Card         |
+----------------+                                  +----------------+
        |                                                  |
    Field activation                                       |
        |                                                  |
        | --- REQA (Request Command Type A) -------------> |
        |                   26                             |
        |                                                  |
        | <------------ ATQA (Answer to Request Type A) ---|
        | 04 00
        |                                                  |
        | --- ANTICOLLISION Command ---------------------->|
        |                                                  |
        | <------------ UID (Unique Identifier) -----------|
        |                                                  |
        | --- SELECT [UID] Command ----------------------->|
        |                                                  |
        | <------------ SAK (Select Acknowledge) ----------|
        |                                                  |
        | --- RATS (Request for Answer To Select) -------->|
        | E0 50 BC A5                                      |
        |                                                  |
        | <------------ ATS (Answer To Select) ------------|
        | 0A 78 80 82 02 20 63 CB   A3 A0 92 43            |
        |                                                  |
        | ---- [Opt] PPS (Proto and Parameter Selection) ->|    
        | D0 73 87                                         |
        |                                                  |
        | <------------ [PPS Response] --------------------|
        | D0 73 87                                         |
        |                                                  |
        | --- TPDU [Encapsulated APDU Command] ----------->|
        | 0200A404000E325041592E5359532E444446303100E042   |
        |                                                  |
        | <------------ TPDU [Encapsulated APDU Response] -|
        | 00a404000e325041592e5359532e444446303100         |
登入後複製
登入後複製
登入後複製
登入後複製

接下來,使用函數 furi_hal_nfc_set_mode 將 Flipper Zero 設定為卡片模擬器模式。這次,我們指定模式 FuriHalNfcModeListener,對於技術,我們使用標準值:FuriHalNfcTechIso14443a、FuriHalNfcTechIso14443b 和 FuriHalNfcTechIso15693。

最後,為了開始模擬,我實作了指令 run_emu,它將啟動一個無限循環,等待附近的讀取器。事件監聽由函式furi_hal_nfc_listener_wait_event處理。

    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                             |
        |                                                  |
        | <------------ ATQA (Answer to Request Type A) ---|
        | 04 00
        |                                                  |
        | --- ANTICOLLISION Command ---------------------->|
        |                                                  |
        | <------------ UID (Unique Identifier) -----------|
        |                                                  |
        | --- SELECT [UID] Command ----------------------->|
        |                                                  |
        | <------------ SAK (Select Acknowledge) ----------|
        |                                                  |
        | --- RATS (Request for Answer To Select) -------->|
        | E0 50 BC A5                                      |
        |                                                  |
        | <------------ ATS (Answer To Select) ------------|
        | 0A 78 80 82 02 20 63 CB   A3 A0 92 43            |
        |                                                  |
        | ---- [Opt] PPS (Proto and Parameter Selection) ->|    
        | D0 73 87                                         |
        |                                                  |
        | <------------ [PPS Response] --------------------|
        | D0 73 87                                         |
        |                                                  |
        | --- TPDU [Encapsulated APDU Command] ----------->|
        | 0200A404000E325041592E5359532E444446303100E042   |
        |                                                  |
        | <------------ TPDU [Encapsulated APDU Response] -|
        | 00a404000e325041592e5359532e444446303100         |
登入後複製
登入後複製
登入後複製
登入後複製

它非常實用,因為它允許我們一一發送命令來驗證一切:

  • 寄 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                             |
        |                                                  |
        | <------------ ATQA (Answer to Request Type A) ---|
        | 04 00
        |                                                  |
        | --- ANTICOLLISION Command ---------------------->|
        |                                                  |
        | <------------ UID (Unique Identifier) -----------|
        |                                                  |
        | --- SELECT [UID] Command ----------------------->|
        |                                                  |
        | <------------ SAK (Select Acknowledge) ----------|
        |                                                  |
        | --- RATS (Request for Answer To Select) -------->|
        | E0 50 BC A5                                      |
        |                                                  |
        | <------------ ATS (Answer To Select) ------------|
        | 0A 78 80 82 02 20 63 CB   A3 A0 92 43            |
        |                                                  |
        | ---- [Opt] PPS (Proto and Parameter Selection) ->|    
        | D0 73 87                                         |
        |                                                  |
        | <------------ [PPS Response] --------------------|
        | D0 73 87                                         |
        |                                                  |
        | --- TPDU [Encapsulated APDU Command] ----------->|
        | 0200A404000E325041592E5359532E444446303100E042   |
        |                                                  |
        | <------------ TPDU [Encapsulated APDU Response] -|
        | 00a404000e325041592e5359532e444446303100         |
登入後複製
登入後複製
登入後複製
登入後複製

6.3 還有一點 Proxmark

Flipper Zero NFC Hacking - cannon fooder

使用 Proxmark 3 對於調試嗅探模式下的通訊非常有用:我將其放置在讀卡機和卡片(可以是正品卡或 Flipper)之間,並且我能夠檢查資料交換。

    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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板