Rumah > pembangunan bahagian belakang > Tutorial Python > Flipper Zero NFC Hacking - pemakan meriam

Flipper Zero NFC Hacking - pemakan meriam

Barbara Streisand
Lepaskan: 2024-10-23 08:14:29
asal
1029 orang telah melayarinya

Flipper Zero NFC Hacking - cannon fooder

Dalam siaran sebelumnya, kami melihat cara melaksanakan pembaca telus dengan Flipper Zero. Bagaimana jika kita mengambil konsep yang sama tetapi kali ini untuk melaksanakan emulator kad telus? Kami boleh menggunakan Flipper Zero kami seperti meriam untuk menyerang kubu digital, seperti pembaca atau telefon pintar, dengan menghantar permintaan yang salah. Perintah cacat, perintah tidak dijangka dalam kitaran hayat, kabur, limpahan penimbal—langit adalah hadnya!

1 - Konteks

Sama seperti pembaca kad lutsinar, saya ingin berkomunikasi dengan Flipper menggunakan CLI bersiri dari komputer saya. Komputer mengendalikan semua logik, bermakna ia memutuskan tindak balas yang perlu diberikan bergantung pada arahan, menggunakan skrip Python, sebagai contoh.

Sekarang, mengenai pelaksanaan perintah emulator kad, pada asasnya ia adalah sejenis mod cermin berbanding pembaca:

  • Kami perlu mengesan apabila medan RF diaktifkan oleh terminal.
  • Kami perlu mengesan apabila medan RF dinyahaktifkan oleh terminal.
  • Kita perlu boleh menerima/menghantar bit ke terminal.
  • Kita perlu boleh menerima/menghantar bait ke terminal.

Kecuali ada butiran kecil yang merumitkan perkara. Ingat bahawa semasa komunikasi kad/pembaca, pembacalah yang bertindak sebagai tuan, bermakna pembacalah yang memulakan komunikasi dan menghantar arahan.

Jadi, jika kita mencipta emulator kad, ia mesti menunggu acara daripada pembaca. Anda boleh menganggapnya seperti pelayan, dengan pembaca bertindak sebagai pelanggan. Kami perlu memasukkan kod ini ke dalam Flipper Zero.

Baiklah, pertama sekali, mari kita buat imbasan ringkas tentang pertukaran komunikasi antara pembaca dan kad menggunakan ISO 14443-A.

2 - Pertukaran komunikasi antara pembaca dan kad menggunakan ISO 14443-A

Berikut ialah rajah yang meringkaskan pertukaran utama antara pembaca dan kad yang berkomunikasi melalui 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         |
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Sekarang persoalannya ialah, "Bagaimana kita melaksanakan semua ini pada Flipper?"

4 - Pelaksanaan Flipper Zero

Seperti dalam artikel saya sebelum ini, saya akan terus mengembangkan aplikasi fail/main/nfc/nfc_cli.c (lihat fail di cawangan saya).

Pertama, titik perkakasan pantas. Untuk pengurusan NFC, Flipper Zero menggunakan cip ST25R3916. Ini bagus kerana ia membolehkan kami mencipta kedua-dua pembaca tanpa sentuh dan emulator kad. Cip secara automatik mengendalikan penghantaran arahan yang terlibat daripada pengaktifan medan kepada antiperlanggaran. Apa yang perlu kita lakukan ialah menentukan ATQA, SAK, UID dan panjangnya yang ingin kita hantar semula.

Flipper menyediakan fungsi furi_hal_nfc_iso14443a_listener_set_col_res_data untuk mengendalikan semua ini.

Itulah sebabnya saya menambah 3 arahan pada NFC CLI Flipper untuk mengkonfigurasi elemen ini:

  • set_atqa
  • set_sak
  • set_uid

Dan sejurus sebelum memulakan emulasi, kami akan memanggil furi_hal_nfc_iso14443a_listener_set_col_res_data dengan parameter ini.

+----------------+                                  +----------------+
|   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         |
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Seterusnya, menetapkan Flipper Zero kepada mod emulator kad dilakukan menggunakan fungsi furi_hal_nfc_set_mode. Kali ini, kami menentukan mod FuriHalNfcModeListener, dan untuk teknologi, kami menggunakan nilai standard: FuriHalNfcTechIso14443a, FuriHalNfcTechIso14443b dan FuriHalNfcTechIso15693.

Akhir sekali, untuk memulakan emulasi, saya melaksanakan perintah run_emu, yang akan memulakan gelung tak terhingga menunggu pembaca berdekatan. Pemantauan acara dikendalikan oleh fungsi 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;
    }
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Seterusnya, acara boleh mengambil beberapa nilai bergantung pada perkara yang telah dikesan:

  • FuriHalNfcEventFieldOn menunjukkan bahawa pengaktifan medan telah dikesan.
  • FuriHalNfcEventFieldOff menunjukkan bahawa medan telah dimatikan.
  • Acara yang paling penting ialah FuriHalNfcEventRxEnd, yang menunjukkan bahawa arahan daripada terminal telah diterima. Pada ketika ini, kami perlu menghantar jawapan kami. Sekali lagi, adalah penting untuk ambil perhatian bahawa semua pengendalian penghantaran arahan, sehingga dan termasuk antiperlanggaran, dilakukan secara automatik. Jadi, pada dasarnya kita boleh mula memproses arahan seperti pilih, sebagai contoh.
FuriHalNfcEvent event = furi_hal_nfc_listener_wait_event(100);
Salin selepas log masuk
Salin selepas log masuk

5 - Mengendalikan penerimaan arahan dan menghantar respons

Sekarang, mari lihat cara mengendalikan penerimaan arahan dan menghantar respons.

    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) {
Salin selepas log masuk
  • Penerimaan data dikendalikan melalui furi_hal_nfc_listener_rx(rx_data, rx_data_size, &rx_bits);. Kami memaparkan data yang diterima menggunakan printf, yang menghantar respons kepada terminal yang disambungkan ke Flipper. Perkara penting untuk difahami ialah sebaik sahaja kami menerima arahan, kami mesti bertindak balas dengan cepat. Ini bermakna kita tidak boleh menulis respons secara manual dalam shell-ia akan terlambat. Inilah sebabnya satu-satunya cara untuk berkomunikasi dengan Flipper adalah dengan menggunakan skrip Python dengan penghantar yang menentukan respons yang akan diberikan untuk setiap arahan yang diterima.
  • Kemudian, terminal menghantar respons yang kami dapat semula menggunakan fungsi nfc_emu_get_resp(cli, rx_cmd). Bahagian ini agak rumit kerana, dalam arahan shell, anda biasanya tidak mempunyai pertukaran bolak-balik. Jadi, saya menggunakan fungsi cli_getc(cli) untuk membaca aksara.

    • Kadangkala, saya mendapat watak yang tidak diingini 0xA. Jika ia adalah watak pertama yang diterima, saya melangkaunya, kerana saya membaca watak demi watak.
    • Watak pertama menunjukkan sama ada Flipper Zero perlu mengira dan menambah CRC pada perintah itu sendiri (0x31 bermakna ya, jika tidak tidak).
    • Kemudian, saya membaca aksara jawapan dalam format rentetan heksadesimal. Apabila kita menerima aksara 0xA, ia menunjukkan penerimaan telah selesai.
  • Akhir sekali, kami menukar rentetan perenambelasan kepada tatasusunan uint8_t menggunakan unhexify(tmp, (uint8_t*)bit_buffer_get_data(rx_data), len);.

  • Jika perlu, kami menambah CRC menggunakan add_crc.

  • Akhir sekali, kami boleh menghantar respons kepada pembaca menggunakan:

    FuriHalNfcError r = furi_hal_nfc_listener_tx(rx_data, bit_buffer_get_size(rx_cmd));.

Dan sekarang, bagaimanakah kita hendak mengesahkan semua ini?

6 - Pengesahan emulasi kad

6.1 - Bagaimana ia bermula ... (Hydra NFC v2)

Flipper Zero NFC Hacking - cannon fooder

Nah, kami boleh menggunakan pembaca telus kami dari siaran sebelumnya untuk mengesahkan emulator kami. Jadi, kami memerlukan dua Flipper Zero... yang saya tidak ada. Walau bagaimanapun, saya mempunyai Hydra NFC v2, yang membolehkan persediaan pembaca telus.

Flipper Zero NFC Hacking - cannon fooder

Saya hanya perlu menggunakan skrip daripada 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         |
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ia sangat praktikal kerana ia membolehkan kami menghantar arahan satu demi satu untuk mengesahkan segala-galanya:

  • Menghantar REQA
  • Antiperlanggaran
  • Pilih
  • PPS
  • Menghantar TPDU

6.2 - Bagaimana ia selesai... (pembaca PC/SC).

Namun, pada hakikatnya, komunikasi agak rumit. Jadi, saya menggunakan pembaca PC/SC, ACR122U, untuk menghantar/menerima arahan APDU penuh, digabungkan dengan skrip Python (menggunakan pyscard ) untuk membuat ujian dunia sebenar.

Flipper Zero NFC Hacking - cannon fooder

Dalam kes saya, saya hanya memilih aplikasi 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;
    }
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Jadi sekarang, emulator kad perlu mengendalikan lebih banyak acara. Oleh itu, saya mencipta skrip Python di bawah untuk menguruskan kes ini. Terdapat banyak perkara yang perlu dijelaskan, seperti jenis TPDU yang berbeza (i-block, r-block, s-block), tetapi itu akan ada dalam catatan blog akan datang.

FuriHalNfcEvent event = furi_hal_nfc_listener_wait_event(100);
Salin selepas log masuk
Salin selepas log masuk

Dengan ini, ia berfungsi dengan baik, dan emulasinya sangat stabil. Saya boleh meletakkan atau mengalih keluar Flipper daripada pembaca dan menghantar arahan beberapa kali, dan ia berfungsi setiap kali. Sekali lagi, Flipper mempunyai pelaksanaan yang sangat baik bagi lapisan NFCnya, dan APInya membolehkan banyak fungsi dengan usaha yang minimum dalam pelaksanaannya.

Di bawah, anda mempunyai sampel output daripada skrip 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         |
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

6.3 Sedikit Proxmark juga

Flipper Zero NFC Hacking - cannon fooder

Menggunakan Proxmark 3 berguna untuk menyahpepijat komunikasi dalam mod menghidu: Saya meletakkannya di antara pembaca dan kad (yang boleh menjadi kad tulen atau Flipper), dan saya dapat menyemak pertukaran data.

    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;
    }
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Apa seterusnya?

Baik, apa seterusnya?

  • Pertama, saya boleh memberikan lebih banyak penjelasan tentang skrip Python emulasi kad.
  • Selain itu, saya harus melaksanakan cara untuk menghentikan emulasi kad apabila butang ditekan, kerana pada masa ini gelung menunggu acara tidak pernah selesai. Satu-satunya cara untuk keluar adalah dengan memulakan semula Flipper.
  • Selain itu, kami boleh melakukan beberapa perkara yang menyeronokkan dengan menggunakan kedua-dua pembaca telus dan emulator kad pada masa yang sama, contohnya, untuk melakukan serangan lelaki di tengah dan mengubah suai komunikasi secara langsung!

Atas ialah kandungan terperinci Flipper Zero NFC Hacking - pemakan meriam. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan