ホームページ  >  記事  >  バックエンド開発  >  Flipper Zero NFC ハッキング - 大砲の食べ物屋

Flipper Zero NFC ハッキング - 大砲の食べ物屋

Barbara Streisand
Barbara Streisandオリジナル
2024-10-23 08:14:29914ブラウズ

Flipper Zero NFC Hacking - cannon fooder

前の投稿では、Flipper Zero を使用して透明リーダーを実装する方法を説明しました。同じコンセプトを採用して、今度は透過的なカード エミュレータを実装したらどうなるでしょうか?フリッパー ゼロを大砲のように使用して、誤ったリクエストを送信することで、リーダーやスマートフォンなどのデジタル要塞を攻撃することができます。不正なコマンド、ライフサイクルで予期されないコマンド、ファジング、バッファ オーバーフローなど、限界はありません!

1 - コンテキスト

透明カード リーダーと同様に、コンピューターからシリアル CLI を使用して Flipper と通信したいと考えています。コンピューターはすべてのロジックを処理します。つまり、Python スクリプトなどを使用して、コマンドに応じてどのような応答を返すかを決定します。

次に、カード エミュレータ コマンドの実装についてですが、これは本質的に、リーダーと比較して一種のミラー モードです。

  • 端末によって RF フィールドがアクティブ化されたときを検出する必要があります。
  • 端末によって 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 - フリッパー ゼロの実装

前の記事と同様に、applications/main/nfc/nfc_cli.c ファイルの展開を続けます (ブランチにあるファイルを参照してください)。

まず、ハードウェアについて簡単に説明します。 NFC 管理には、Flipper Zero は ST25R3916 チップを使用します。これは、非接触リーダーとカード エミュレーターの両方を作成できるため、非常に優れています。チップは、フィールドのアクティブ化から衝突防止まで、関連するコマンドの送信を自動的に処理します。必要なのは、送り返す ATQA、SAK、UID、およびその長さを指定することだけです。

フリッパーは、これらすべてを処理する関数 furi_hal_nfc_iso14443a_listener_set_col_res_data を提供します。

そのため、Flipper の NFC CLI に 3 つのコマンドを追加して、これらの要素を設定しました。

  • set_atqa
  • set_sak
  • set_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 を使用して受信したデータを表示し、Flipper に接続されている端末に応答を送信します。 理解しておくべき重要なことは、コマンドを受信したらすぐに非常に迅速に対応しなければならないということです。これは、手動でシェルに応答を書き込むことができないことを意味します。手遅れになります。このため、Flipper と通信する唯一の方法は、受信したコマンドごとにどの応答を返すかを指定するディスパッチャーを備えた Python スクリプトを使用することです.
  • 次に、端末は関数 nfc_emu_get_resp(cli, rx_cmd) を使用して取得した応答を送信します。シェル コマンドでは通常、やり取りが行われないため、この部分は少し注意が必要です。そこで、関数 cli_getc(cli) を使用して文字を読み取ります。

    • 時々、不要な文字 0xA が表示されることがあります。最初に受け取った文字の場合は、一文字ずつ読むのでスキップします。
    • 最初の文字は、Flipper Zero が CRC を計算してコマンド自体に追加する必要があるかどうかを示します (0x31 は「はい」を意味し、それ以外の場合は「いいえ」を意味します)。
    • 次に、応答の文字を 16 進数の文字列形式で読み取ります。文字 0xA を受信すると、受信が完了したことを示します。
  • 最後に、unhexify(tmp, (uint8_t*)bit_buffer_get_data(rx_data), len); を使用して 16 進文字列を 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

前回の投稿の透過リーダーを使用して、エミュレータを検証できます。したがって、フリッパー ゼロが 2 つ必要になります...私は持っていません。ただし、私は 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         |

コマンドを 1 つずつ送信してすべてを検証できるため、非常に実用的です。

  • 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 ブロック、r ブロック、s ブロック) など、説明すべきことはたくさんありますが、それについては今後のブログ投稿で説明します。

FuriHalNfcEvent event = furi_hal_nfc_listener_wait_event(100);

これにより、非常にうまく動作し、エミュレーションは非常に安定しました。フリッパーをリーダーに配置したり、リーダーから取り外したりしてコマンドを複数回送信することができ、毎回機能します。もう一度言いますが、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 の使用は、スニッフィング モードでの通信のデバッグに役立ちました。Proxmark 3 をリーダーとカード (本物のカードまたはフリッパー) の間に置き、データ交換を確認することができました。

    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 Zero NFC ハッキング - 大砲の食べ物屋の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:Python での警告次の記事:Python での警告