Diposting oleh: cuamckuuMengambil konten peta dan bekerja dengan tim EMV bisa menarik bukan hanya untuk tujuan penelitian. Ada beberapa jenis serangan pada kartu bank contactless, yang implementasinya akan dibahas di bawah pemotongan.
Pendahuluan
Tahun ini saya mendapat magang di Summer of Hack 2019 di Digital Security dan mengerjakan topik penelitian tentang kartu EMV tanpa kontak. Selama magang, ternyata lebih baik untuk mempelajari cara kerja kartu bank, dan untuk membuat utilitas baru untuk bekerja dengan kartu tanpa kontak. Peragaan mode pembacaan data dapat ditemukan di
sini .
Jenis Serangan
Kartu dan terminal berkomunikasi menggunakan standar EMV (Europay + MasterCard + VISA), yang dikembangkan untuk meningkatkan keamanan pembayaran. Dalam hal ini, tidak ada banyak vektor serangan pada kartu tanpa kontak. Artikel ini akan fokus pada hal berikut:
- Tautkan kartu orang lain di toko online
- Langkah bantu dalam rekayasa sosial
- DoS Contactless yang mengubah kartu menjadi batu bata
Serangan semacam itu dimungkinkan ketika berinteraksi dengan kartu sesuai dengan standar EMV. Banyak kartu memungkinkan Anda untuk dengan mudah membaca informasi pribadi pengguna, khususnya PAN, tanggal kedaluwarsa dan nama pemegang. Data baca cukup untuk memetakan kartu di beberapa toko online, misalnya, Amazon. Dan data pribadi yang diterima dapat digunakan untuk phishing yang lebih dipersonalisasi atau saat mengirim spam.
Dengan cara yang sama, serangan DoS diterapkan. Memanggil perintah-EMV yang diperlukan memungkinkan Anda untuk meluap konter transaksi internal atau mensimulasikan entri kode PIN yang salah, yang mengarah pada pemblokiran kartu.
Mengapa menemukan kembali roda?
Sebelum memulai pengembangan, diputuskan untuk mempelajari solusi yang ada. Secara khusus, mereka mempertimbangkan:
RFIDIOt / ChAP.py ,
Jaccal ,
nfcmillionaire ,
Conference PoC ,
script "Ruby" ,
aplikasi / libs Android .
Sebagian besar program yang ditinjau mencoba mensimulasikan operasi terminal POS dan menggunakan kamus dengan pengidentifikasi kartu yang didukung, oleh karena itu seringkali solusi semacam itu hanya akan berfungsi dengan Visa dan MasterCard.
Masalah lain adalah membaca sebagian kecil data daripada membuang dump penuh. Hampir semua program mencoba mengurai EMV sebanyak mungkin dengan cepat dan membuat kesalahan penguraian.
Jika ada masalah yang tidak ada atau tidak begitu jelas, maka kemungkinan besar kita berbicara tentang aplikasi / perpustakaan untuk Android, dan Anda membutuhkan ponsel dengan pembaca NFC, yang belum semua orang miliki.
Masalah yang dijelaskan dapat diselesaikan, untuk ini perlu:
- Deteksi jenis peta secara dinamis, alih-alih menggunakan kamus
- Tambahkan beberapa mode operasi untuk membaca file lengkap
- Jangan mencoba membongkar standar EMV dengan cepat
- Gunakan pembaca murah PN532 (~ $ 5)
Mengambil data dari kartu
Sudah ada artikel tentang Habré yang menjelaskan secara rinci proses interaksi antara kartu dan terminal (
satu ,
dua ,
tiga ), jadi saya akan mencoba untuk tidak mengulangi diri saya dan fokus pada bagian praktis.
Untuk berkomunikasi dengan kartu, kami akan menggunakan pembaca PN532 karena harga yang menyenangkan dan perpustakaan libnfc. Mulus turun ke bisnis. Data pada peta disusun sebagai berikut:
Lingkungan -> Aplikasi -> File -> Catatan.
Tujuan membaca adalah untuk mendapatkan data dari semua catatan, untuk ini Anda harus melalui rantai yang lengkap, dan pilihan lingkungan dan aplikasi hanya terjadi sekali pada awal komunikasi.
Proses yang sama dalam hal perintah EMV:
- SELECT PPSE // Pilih lingkungan non-kontak
- PILIH APLIKASI // Pilih aplikasi oleh AID
- READ RECORD // Tentukan file dan nomor rekaman
Perhatikan contoh pembentukan salah satu tim. Perintah pertama untuk memilih lingkungan tanpa kontak selalu sama dan terlihat seperti ini:
byte_t const command[] = { 0x40, 0x01,
Contoh tanggapan: 6F 23 84 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 A5 11 BF 0C 0E 61 0C 4F 07 A0 00 00 00 03 10 10 87 01 01 90 00
Untuk memanggil perintah selanjutnya, kita perlu menguraikan respons dari perintah sebelumnya.

Kami tertarik pada pengenal aplikasi AID. Kami menghafalnya dan membentuk kueri SELECT baru, tapi kali ini kami meneruskan AID yang diterima ke perintah SELECT, dan bukan PPSE, seperti pada perintah pertama.
Contoh: 00 A4 04 00 07 A0 00 00 00 03 10 10 00
Seperti disebutkan sebelumnya, penting untuk mendapatkan AID secara dinamis, daripada menggunakan kamus yang sudah disiapkan, maka aplikasi Anda mungkin dapat membaca berbagai jenis kartu, misalnya kartu MIR.
Setelah aplikasi dipilih, kita dapat membaca catatan yang diperlukan menggunakan perintah READ RECORD dan mengirimkan nomor file dan mencatat nomor sebagai parameter.
Contoh pembentukan tim:
(lebih lanjut tentang ini dapat ditemukan dalam standar. Buku EMV1. 11.2 READ RECORD) byte_t const sfi_param = (sfi << 3) | (1 << 2); byte_t const command[] = { 0x40, 0x01,
Contoh panggilan: 00 B2 02 14 00
Perhatikan bahwa byte tidak lengkap dialokasikan ke nomor file, masing-masing, mungkin ada 31 (2 ^ 5 - 1) file secara total, dan entri 255. File dari 1 sampai 10 dialokasikan untuk penyimpanan data internal, dan sisanya dialokasikan untuk penyimpanan log transaksi jika kartu mendukung logging.
Sekarang menggunakan dua loop bersarang, kita bisa mendapatkan data dari semua catatan peta dengan memanggil perintah READ RECORD untuk setiap pasangan. Proses pencarian dapat dipercepat secara signifikan jika Anda memperhatikan kata status yang dikembalikan oleh kartu (dua byte terakhir dari respons). Status dapat memberi tahu kami bahwa file tersebut tidak ada (SW = 0x6A82) atau tidak ada entri lebih lanjut dalam file ini (SW = 0x6A83).
Dalam praktiknya, ternyata masuk akal untuk mempertimbangkan hanya kasus file yang tidak ada, karena kadang-kadang ada kartu yang salah menggunakan kode status untuk entri yang hilang. Setelah membaca data, Anda dapat mengirimnya ke salah satu parser online, saya suka yang
ini .
Fragmen data yang diekstrak dari catatan peta:

Data baca cukup untuk memetakan kartu di beberapa toko online (terutama di toko asing), dan informasi yang diperoleh dapat digunakan untuk serangan yang lebih personal menggunakan rekayasa sosial.
Kami mengatur DoS tanpa kontak
Kami melanjutkan ke jenis serangan berikutnya. Setidaknya ada 2 metode implementasi untuk DoS-a.
Cara lambat
Untuk menerapkan metode lambat (serangan akan memakan waktu sekitar 4 menit), perlu untuk memenuhi sampai melimpahi konter transaksi kartu internal (ATC). Untuk melakukan ini, hubungi:
- SELECT PPSE // Pilih lingkungan non-kontak
- PILIH APLIKASI // Pilih aplikasi
- DAPATKAN DATA // Cari tahu berapa banyak yang tersisa sebelum ATC meluap
- DAPATKAN OPSI PENGOLAHAN // Mulai Transaksi
- ...
- DAPATKAN OPSI PENGOLAHAN // Ulangi transaksi hingga meluap
Pertimbangkan langkah-langkahnya secara lebih rinci. Pilihan lingkungan dan aplikasi tanpa kontak mirip dengan item dengan ekstraksi data, satu-satunya perbedaan adalah bahwa kali ini kita perlu memproses respon dari perintah APLIKASI SELECT.

Kami tertarik pada bidang PDOL, karena akan diperlukan untuk panggilan selanjutnya dari perintah GET PROSES OPSI, yang akan meningkatkan konter transaksi untuk setiap panggilan.
Di PDOL, kartu meminta informasi tentang terminal dan pembayaran dari kami.
Pada contoh di atas, peta meminta kita:
- 9F66 04 // Kualifikasi transaksi terminal (4 byte)
- 9F02 06 // Jumlah (6 byte)
- 9F37 04 // Nomor tak terduga (4 byte)
- 5F2A 02 // Kode Mata Uang Transaksi (2 byte)
Karena kami menerapkan DoS, bukan pembayaran nyata, kami tidak dapat khawatir tentang kebenaran nilai dan hanya menggunakan nilai yang disiapkan sebelumnya bahwa kartu akan menerima. Baca lebih lanjut tentang nilai yang diperlukan dalam standar.
(Buku EMV 3. Kamus Elemen Lampiran A Data).Untuk kenyamanan penggunaan praktis, saya kutip tabel:
Setelah membentuk data yang diminta oleh kartu, kami siap untuk memanggil GPO.
Contoh: 80 A8 00 00 12 83 10 79 00 40 80 00 00 00 10 00 00 82 3D DE 7A 01 24 00
Jawaban: 77 4F 82 02 20 00 94 0C 10 02 03 00 18 01 01 00 10 04 04 00 57 13 42 76 55 00 66 83 25 13 D2 00 52 01 14 89 36 20 00 00 1F 5F 20 02 20 2F 9F 10 07 06 01 11 03 80 20 00 9F 6C 02 30 00 9F 26 08 33 33 89 D5 70 A3 DF 37 9F 27 01 00 9F 36 02 02 48 90 00
Ulangi panggilan GPO 65.536 kali, dan kartu diblokir. Anda dapat mengurangi jumlah panggilan yang diperlukan dengan terlebih dahulu membaca nilai ATC saat ini menggunakan DAPATKAN DATA.
Cara cepat
Cara cepat jauh lebih mudah (dan lebih berbahaya), karena akan memakan waktu sekitar 2 detik untuk mengunci kartu, sehingga analisis detail detail implementasi akan tetap di belakang layar.
Metode ini mirip dengan yang sebelumnya, tetapi kali ini akan diperlukan untuk menurunkan penghitung upaya untuk memasukkan kode PIN, alih-alih meningkatkan penghitung transaksi. Nilai PIN dari Try Counter juga dapat diperoleh melalui GET DATA, tetapi dalam hal ini tidak akan ada peningkatan kecepatan yang signifikan.
Operasi yang Diperlukan:
- SELECT PPSE // Pilih lingkungan non-kontak
- PILIH APLIKASI // Pilih aplikasi
- DAPATKAN DATA // Cari tahu berapa banyak upaya untuk memasukkan PIN
- DAPATKAN OPSI PENGOLAHAN // Mulai Transaksi
- VERIFIKASI // Dan masukkan PIN yang salah
- ...
- VERIFIKASI // Sampai kartu diblokir
Ringkasan
Selama magang, dimungkinkan untuk membuat alat baru untuk bekerja dengan kartu bank tanpa kontak dan memecahkan beberapa masalah yang ada dalam solusi yang ada, dan menggunakan pembaca murah secara signifikan mengurangi biaya kit penelitian dan dapat membantu menarik orang baru untuk meneliti keamanan kartu bank tanpa kontak. Kode sumber untuk program
ini tersedia di Github .