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

本教程演示如何使用Python處理Zipf定律這一統計概念,並展示Python在處理該定律時讀取和排序大型文本文件的效率。 您可能想知道Zipf分佈這個術語是什麼意思。要理解這個術語,我們首先需要定義Zipf定律。別擔心,我會盡量簡化說明。 Zipf定律 Zipf定律簡單來說就是:在一個大型自然語言語料庫中,最頻繁出現的詞的出現頻率大約是第二頻繁詞的兩倍,是第三頻繁詞的三倍,是第四頻繁詞的四倍,以此類推。 讓我們來看一個例子。如果您查看美國英語的Brown語料庫,您會注意到最頻繁出現的詞是“th

本文解釋瞭如何使用美麗的湯庫來解析html。 它詳細介紹了常見方法,例如find(),find_all(),select()和get_text(),以用於數據提取,處理不同的HTML結構和錯誤以及替代方案(SEL)

處理嘈雜的圖像是一個常見的問題,尤其是手機或低分辨率攝像頭照片。 本教程使用OpenCV探索Python中的圖像過濾技術來解決此問題。 圖像過濾:功能強大的工具圖像過濾器

本文比較了Tensorflow和Pytorch的深度學習。 它詳細介紹了所涉及的步驟:數據準備,模型構建,培訓,評估和部署。 框架之間的關鍵差異,特別是關於計算刻度的

Python是數據科學和處理的最愛,為高性能計算提供了豐富的生態系統。但是,Python中的並行編程提出了獨特的挑戰。本教程探討了這些挑戰,重點是全球解釋

本教程演示了在Python 3中創建自定義管道數據結構,利用類和操作員超載以增強功能。 管道的靈活性在於它能夠將一系列函數應用於數據集的能力,GE

Python 對象的序列化和反序列化是任何非平凡程序的關鍵方面。如果您將某些內容保存到 Python 文件中,如果您讀取配置文件,或者如果您響應 HTTP 請求,您都會進行對象序列化和反序列化。 從某種意義上說,序列化和反序列化是世界上最無聊的事情。誰會在乎所有這些格式和協議?您想持久化或流式傳輸一些 Python 對象,並在以後完整地取回它們。 這是一種在概念層面上看待世界的好方法。但是,在實際層面上,您選擇的序列化方案、格式或協議可能會決定程序運行的速度、安全性、維護狀態的自由度以及與其他系

Python的statistics模塊提供強大的數據統計分析功能,幫助我們快速理解數據整體特徵,例如生物統計學和商業分析等領域。無需逐個查看數據點,只需查看均值或方差等統計量,即可發現原始數據中可能被忽略的趨勢和特徵,並更輕鬆、有效地比較大型數據集。 本教程將介紹如何計算平均值和衡量數據集的離散程度。除非另有說明,本模塊中的所有函數都支持使用mean()函數計算平均值,而非簡單的求和平均。 也可使用浮點數。 import random import statistics from fracti


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Dreamweaver Mac版
視覺化網頁開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

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