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!
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:
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.
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 |
Sekarang persoalannya ialah, "Bagaimana kita melaksanakan semua ini pada Flipper?"
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:
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 |
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; }
Seterusnya, acara boleh mengambil beberapa nilai bergantung pada perkara yang telah dikesan:
FuriHalNfcEvent event = furi_hal_nfc_listener_wait_event(100);
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) {
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.
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?
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.
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 |
Ia sangat praktikal kerana ia membolehkan kami menghantar arahan satu demi satu untuk mengesahkan segala-galanya:
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.
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; }
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);
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 |
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; }
Baik, apa seterusnya?
Atas ialah kandungan terperinci Flipper Zero NFC Hacking - pemakan meriam. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!