poniedziałek, 3 czerwca 2024

Proxmark 3 Easy - Mifare Magic Card Gen 1A

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:

  1. [usb] pm3 --> hf 14a reader
  2. [+]  UID: 1A A1 3A 1F
  3. [+] ATQA: 00 04
  4. [+]  SAK: 08 [2]

  1. [usb] pm3 --> hf search
  2. [|] Searching for ISO14443-A tag...
  3. [+]  UID: 1A A1 3A 1F
  4. [+] ATQA: 00 04
  5. [+]  SAK: 08 [2]
  6. [+] Possible types:
  7. [+]    MIFARE Classic 1K
  8. [=] proprietary non iso14443-4 card found, RATS not supported
  9. [+] Magic capabilities : Gen 1a
  10. [+] Prng detection: weak
  11. [#] Auth error
  12. [?] Hint: try `hf mf` commands
  13.  
  14. [+] Valid ISO 14443-A tag found

Tutaj widać, że rozpoznana została karta jako Gen 1A. 

Odczytajmy dane z sektora 0 bloku 0:

  1. [usb] pm3 --> hf mf cgetblk --blk 0
  2.  
  3. [=]   # | sector 00 / 0x00                                | ascii
  4. [=] ----+-------------------------------------------------+-----------------
  5. [=]   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:

  1. [usb] pm3 --> hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d a6b59831ba0804006263646566676869
  2.  
  3. [=] Targeting Sector 0 / Block 0 - Manufacturer block
  4. [=] Read the helptext for details before writing to this block
  5. [=] You must use param `--force` to write to this block
  6.  
  7. //------------------------------------------------------
  8.  
  9. [usb] pm3 --> hf mf wrbl --blk 0 -k FFFFFFFFFFFF -d a6b59831ba0804006263646566676869 --force
  10. [=] Writing block no 0, key A - FFFFFFFFFFFF
  11. [=] data: A6 B5 98 31 BA 08 04 00 62 63 64 65 66 67 68 69
  12. [-] Write ( fail )
  13. [?] Maybe access rights? Try specify keytype `hf mf wrbl -b ...` instead

Wobec tego należy wykorzystać komend csetblk: 

  1. [usb] pm3 --> hf mf csetblk --blk 0 -d a6b59831ba0804006263646566676869
  2. [=] 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: 

  1. hf mf csetuid - Zapis UID
  2. hf mf csetblk - Zapis całego bloku danych
  3. hf mf cgetblk - Odczyt bloku
  4. hf mf cgetsc - odczyt sektora
  5. hf mf cload - Zapis danych do karty,
  6. hf mf csave - Odczyt danych z karty do pliku, emulatora