Flipper Zero NFC 駭客攻擊 - 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)
好吧,我們可以使用上一篇文章中的透明閱讀器來驗證我們的模擬器。所以,我們需要兩個腳蹼零點……但我沒有。不過,我有 Hydra NFC v2,它允許透明的讀取器設定。
我只需要使用 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 )進行實際測試。
就我而言,我只需選擇 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
使用 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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

Python在科學計算中的應用包括數據分析、機器學習、數值模擬和可視化。 1.Numpy提供高效的多維數組和數學函數。 2.SciPy擴展Numpy功能,提供優化和線性代數工具。 3.Pandas用於數據處理和分析。 4.Matplotlib用於生成各種圖表和可視化結果。
