W tym poście chciałbym opisać w jaki sposób zmodyfikować sektor zerowy na karcie Mifare Magic Gen 1A.
O różnicach pomiędzy rożnymi typami kart Mifare Magic można przeczytać tutaj.
Karta Mifare Classic Magic Card Gen1. Główna różnica pomiędzy tą kartą a standardową kartą mifare jest możliwość zapisania danych w sektorze 0, bloku 0. Można zapisywać i odczytywać bloki na karcie bez konieczności autoryzacji dostępu do sektora.
Do zapisu danych wykorzystam czytnik Proxmark 3 Easy.
Na samym początku zacznę od wyszukania karty w polu:
- [usb] pm3 --> hf 14a reader
- [+] UID: 1A A1 3A 1F
- [+] ATQA: 00 04
- [+] SAK: 08 [2]
- [usb] pm3 --> hf search
- [|] Searching for ISO14443-A tag...
- [+] UID: 1A A1 3A 1F
- [+] ATQA: 00 04
- [+] SAK: 08 [2]
- [+] Possible types:
- [+] MIFARE Classic 1K
- [=] proprietary non iso14443-4 card found, RATS not supported
- [+] Magic capabilities : Gen 1a
- [+] Prng detection: weak
- [#] Auth error
- [?] Hint: try `hf mf` commands
- [+] Valid ISO 14443-A tag found
Tutaj widać, że rozpoznana została karta jako Gen 1A.
Odczytajmy dane z sektora 0 bloku 0:
- [usb] pm3 --> hf mf cgetblk --blk 0
- [=] # | sector 00 / 0x00 | ascii
- [=] ----+-------------------------------------------------+-----------------
- [=] 0 | 1A A1 3A 1F 9E 08. 04 00 62 63 64 65 66 67 68 69 | ..:.....bcdefghi
Wprowadzenie danych do bloku 0, standardowymi komendami, nie będzie działać poprawnie:
- [usb] pm3 --> hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d a6b59831ba0804006263646566676869
- [=] Targeting Sector 0 / Block 0 - Manufacturer block
- [=] Read the helptext for details before writing to this block
- [=] You must use param `--force` to write to this block
- //------------------------------------------------------
- [usb] pm3 --> hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d a6b59831ba0804006263646566676869 --force
- [=] Writing block no 0, key A - FFFFFFFFFFFF
- [=] data: A6 B5 98 31 BA 08 04 00 62 63 64 65 66 67 68 69
- [-] Write ( fail )
- [?] Maybe access rights? Try specify keytype `hf mf wrbl -b ...` instead
Wobec tego należy wykorzystać komend csetblk:
- [usb] pm3 --> hf mf csetblk --blk 0 -d a6b59831ba0804006263646566676869
- [=] Writing block number: 0 data:A6B59831BA0804006263646566676869
Przy nagrywaniu numeru na kartę, należy pamiętać o strukturze bloku 0 (Numer seryjny, BCC, dane producenta), a zwłaszcza o BCC. Tak aby czytnik chciał przeczytać kartę. Gdy ustawimy błędne wartości to nie wyrządzimy wielkiej szkody. Ponieważ wersja Gen1 pozwala na wielokrotne zmienianie danych w bloku. Więc jeśli coś zostanie błędnie wprowadzone do karty, to zawsze można wykonać przeprogramowanie.
W celu obliczenia BCC można wykorzystać następujący kalkulator.
BCC jest to XOR obliczany z numeru seryjnego. W tym przypadku z 4 bajtów danych.
Czytnik Proxmark pozwala na wywołanie kilku komend dotyczących tego typu kart:
- hf mf csetuid - Zapis UID
- hf mf csetblk - Zapis całego bloku danych
- hf mf cgetblk - Odczyt bloku
- hf mf cgetsc - odczyt sektora
- hf mf cload - Zapis danych do karty,
- hf mf csave - Odczyt danych z karty do pliku, emulatora