]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
mf check keys in lua-space
authormartin.holst@gmail.com <martin.holst@gmail.com@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Fri, 7 Jun 2013 09:26:56 +0000 (09:26 +0000)
committermartin.holst@gmail.com <martin.holst@gmail.com@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Fri, 7 Jun 2013 09:26:56 +0000 (09:26 +0000)
client/mf_default_keys.lua [new file with mode: 0644]
client/scripts/mfkeys.lua [new file with mode: 0644]

diff --git a/client/mf_default_keys.lua b/client/mf_default_keys.lua
new file mode 100644 (file)
index 0000000..cb58397
--- /dev/null
@@ -0,0 +1,153 @@
+
+    
+local _keys = {
+
+    --[[
+
+    These keys are from the pm3 c-codebase. 
+
+    --]]
+    'fffffffffff0', -- Default key (first key used by program if no user defined key)
+    '000000000000', -- Blank key
+    'a0a1a2a3a4a5', -- NFCForum MAD key
+    'b0b1b2b3b4b5',
+    'aabbccddeeff',
+    '4d3a99c351dd',
+    '1a982c7e459a',
+    'd3f7d3f7d3f7',
+    '714c5c886e97',
+    '587ee5f9350f',
+    'a0478cc39091',
+    '533cb6c723f6',
+    '8fd0a4f256e9',
+
+    
+    --[[
+    The data below is taken form the Slurp project, 
+    https://github.com/4ZM/slurp/blob/master/res/xml/mifare_default_keys.xml
+    released as GPLV3. 
+
+    --]]
+
+    '000000000000', -- Default key
+    'fffffffffff0', -- Default key
+    'b0b1b2b3b4b5', -- Key from mfoc
+    '4d3a99c351dd', -- Key from mfoc
+    '1a982c7e459a', -- Key from mfoc
+    'aabbccddeeff', -- Key from mfoc
+    '714c5c886e97', -- Key from mfoc
+    '587ee5f9350f', -- Key from mfoc
+    'a0478cc39091', -- Key from mfoc
+    '533cb6c723f6', -- Key from mfoc
+    '8fd0a4f256e9', -- Key from mfoc
+    -- Data from: http://pastebin.com/wcTHXLZZ
+    'a64598a77478', -- RKF SL Key A
+    '26940b21ff5d', -- RKF SL Key A
+    'fc00018778f7', -- RKF SL Key A
+    '00000ffe2488', -- RKF SL Key B
+    '5c598c9c58b5', -- RKF SL Key B
+    'e4d2770a89be', -- RKF SL Key B
+    -- Data from: http://pastebin.com/svGjN30Q
+    '434f4d4d4f41', -- RKF JOJO GROUP Key A
+    '434f4d4d4f42', -- RKF JOJO GROUP Key B
+    '47524f555041', -- RKF JOJO GROUP Key A
+    '47524f555042', -- RKF JOJO GROUP Key B
+    '505249564141', -- RKF JOJO PRIVA Key A
+    '505249564142', -- RKF JOJO PRIVA Key B
+    -- Data from: http://pastebin.com/d7sSetef
+    'fc00018778f7', -- RKF Rejskort Danmark Key A
+    '00000ffe2488', -- RKF Rejskort Danmark Key B
+    '0297927c0f77', -- RKF Rejskort Danmark Key A
+    'ee0042f88840', -- RKF Rejskort Danmark Key B
+    '722bfcc5375f', -- RKF Rejskort Danmark Key A
+    'f1d83f964314', -- RKF Rejskort Danmark Key B
+    -- Data from: http://pastebin.com/pvJX0xVS
+    '54726176656C', -- Transport Key A
+    '776974687573', -- Transport Key B
+    '4AF9D7ADEBE4', -- Directory and event log Key A
+    '2BA9621E0A36', -- Directory and event log Key B
+    -- Data from: http://pastebin.com/Dnnc5dFC
+    -- New cards are not encrypted (MF Ultralight)
+    'fc00018778f7', -- Västtrafiken Key A
+    '00000ffe2488', -- Västtrafiken Key B
+    '0297927c0f77', -- Västtrafiken Key A
+    'ee0042f88840', -- Västtrafiken Key B
+    '54726176656c', -- Västtrafiken Key A
+    '776974687573', -- Västtrafiken Key B
+    -- Data from: http://pastebin.com/y3PDBWR1
+    '000000000001',
+    'a0a1a2a3a4a5',
+    '123456789abc',
+    'b127c6f41436',
+    '12f2ee3478c1',
+    '34d1df9934c5',
+    '55f5a5dd38c9',
+    'f1a97341a9fc',
+    '33f974b42769',
+    '14d446e33363',
+    'c934fe34d934',
+    '1999a3554a55',
+    '27dd91f1fcf1',
+    'a94133013401',
+    '99c636334433',
+    '43ab19ef5c31',
+    'a053a292a4af',
+    '434f4d4d4f41',
+    '434f4d4d4f42',
+    '505249565441',
+    '505249565442',
+    -- Data from,:, http://pastebin.com/TUXj17K3
+    'fc0001877bf7', -- RKF ÖstgötaTrafiken Key A
+    '00000ffe2488', -- RKF ÖstgötaTrafiken Key B
+    '0297927c0f77', -- RKF ÖstgötaTrafiken Key A
+    'ee0042f88840', -- RKF ÖstgötaTrafiken Key B
+    '54726176656c', -- RKF ÖstgötaTrafiken Key A
+    '776974687573', -- RKF ÖstgötaTrafiken Key B
+
+    --[[
+    The keys below are taken from from https://code.google.com/p/mifare-key-cracker/downloads/list
+    --]]
+
+    'bd493a3962b6',
+    '010203040506',
+    '111111111111',
+    '222222222222',
+    '333333333333',
+    '444444444444',
+    '555555555555',
+    '666666666666',
+    '777777777777',
+    '888888888888',
+    '999999999999',
+    'aaaaaaaaaaaa',
+    'bbbbbbbbbbbb',
+    'cccccccccccc',
+    'dddddddddddd',
+    'eeeeeeeeeeee',
+    '0123456789ab',
+    '123456789abc',
+    'ffffffffffff', -- Default key
+}
+
+--[[
+    The keys above have just been pasted in, for completeness sake. They contain duplicates. 
+    We need to weed the duplicates out before we expose the list to someone who actually wants to use them
+    
+--]]
+
+local function uniq(list)
+    
+    local foobar = {}
+    --print("list length ", #list)
+    for _, value in pairs(list) do
+        value = value:lower()
+        if not foobar[value] then
+            foobar[value] = true
+            table.insert(foobar, value);
+        end
+    end
+    --print("final list length length ", #foobar)
+    return foobar
+end
+
+return uniq(_keys)
\ No newline at end of file
diff --git a/client/scripts/mfkeys.lua b/client/scripts/mfkeys.lua
new file mode 100644 (file)
index 0000000..135108f
--- /dev/null
@@ -0,0 +1,143 @@
+--[[
+       This is an example of Lua-scripting within proxmark3. This is a lua-side
+       implementation of hf mf chk  
+
+       This code is licensed to you under the terms of the GNU GPL, version 2 or,
+       at your option, any later version. See the LICENSE.txt file for the text of
+       the license.
+       
+       Copyright (C) 2013 m h swende <martin at swende.se>
+]]
+-- Loads the commands-library
+local cmds = require('commands')
+-- Load the default keys
+local keys = require('mf_default_keys')
+local desc = 
+("This script implements check keys. It utilises a large list of default keys (currently %d keys).\
+If you want to add more, just put them inside mf_default_keys.lua. "):format(#keys)
+
+local TIMEOUT = 10000 -- 10 seconds
+
+local function checkCommand(command)
+
+       --print("Sending this command : " .. tostring(command))
+       local usbcommand = command:getBytes()
+       core.SendCommand(usbcommand)
+       local result = core.WaitForResponseTimeout(cmds.CMD_ACK,TIMEOUT)
+       if result then
+               local count,cmd,arg0 = bin.unpack('LL',result)
+               if(arg0==1) then
+                       local count,arg1,arg2,data = bin.unpack('LLH511',result,count)
+                       key = data:sub(1,12)
+                       return key
+               else
+                       --print("Key not found...")
+                       return nil
+               end
+       else
+               print("Timeout while waiting for response. Increase TIMEOUT in keycheck.lua to wait longer")
+               return nil, "Timeout while waiting for device to respond"
+       end
+end
+
+
+function checkBlock(blockNo, keys, keyType)
+       -- The command data is only 512 bytes, each key is 6 bytes, meaning that we can send max 85 keys in one go. 
+       -- If there's more, we need to split it up
+       local start, remaining= 1, #keys
+       local packets = {}
+       while remaining > 0 do
+               local n,data = remaining, nil
+               if remaining > 85 then n = 85 end
+               local data = table.concat(keys,"",start,n)
+               --print("data",data)
+               --print("data len", #data)
+               print(("Testing block %d, keytype %d, with %d keys"):format(blockNo, keyType, n))
+               local command = Command:new{cmd = cmds.CMD_MIFARE_CHKKEYS, 
+                                                               arg1 = blockNo, 
+                                                               arg2 = keyType, 
+                                                               arg3 = n, 
+                                                               data = data}
+               local status = checkCommand(command)
+               if status then return status, blockNo end
+               start = start+n+1
+               remaining = remaining - n
+       end
+       return nil
+end
+
+-- A function to display the results
+local function displayresults(results)
+       local sector, blockNo, keyA, keyB,_
+
+       print("________________________________________")
+       print("|Sector|Block|     A      |      B     |")
+       print("|--------------------------------------|")
+
+       for sector,_ in pairs(results) do
+               blockNo, keyA, keyB = unpack(_)
+
+               print(("| %3d  | %3d |%s|%s|"):format(sector, blockNo, keyA, keyB ))
+       end
+       print("|--------------------------------------|")
+
+end
+-- A little helper to place an item first in the list
+local function placeFirst(akey, list)
+       akey  = akey:lower()
+       if list[1] == akey then 
+               -- Already at pole position
+               return list
+       end
+       local result = {akey}
+       --print(("Putting '%s' first"):format(akey))
+       for i,v in ipairs(list) do
+               if v ~= akey then 
+                       result[#result+1] = v
+               end
+       end
+       return result
+end
+
+local function main()
+
+       print(desc);
+
+       core.clearCommandBuffer()
+       local blockNo
+       local keyType = 0 -- A=0, B=1
+       local result = {}
+       for sector=1,40,1 do
+
+               --[[
+               The mifare Classic 1k card has 16 sectors of 4 data blocks each. The
+               first 32 sectors of a mifare Classic 4k card consists of 4 data blocks and the remaining
+               8 sectors consist of 16 data blocks. 
+               --]]
+               local blockNo = sector * 4 -1 
+               
+               if sector > 32 then
+                       blockNo = 32*4+ (sector-32)*16 -1
+               end
+
+               local keyA = checkBlock(blockNo, keys, 0)
+               if keyA then keys  = placeFirst(keyA, keys) end
+               keyA = keyA or ""
+
+               local keyB = checkBlock(blockNo, keys, 1)
+               if keyB then keys  = placeFirst(keyB, keys) end
+               keyB = keyB or ""
+
+               result[sector] = {blockNo, keyA, keyB }
+
+               -- Check if user aborted
+               if core.ukbhit() then
+                       print("Aborted by user")
+                       break
+               end
+       end
+       displayresults(result)
+end
+
+main()
+
Impressum, Datenschutz