Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / практический хакинг.pdf
Скачиваний:
24
Добавлен:
19.04.2024
Размер:
31.35 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Wrote an emulator-dump to the file CEA0B6B4.eml

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

m

-----Finished

w Click

 

 

 

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

e

 

 

 

 

p

df

-

 

 

 

g

.c

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

x cha

 

 

 

 

 

Параметр -i определяет входной файл (в нашем случае dumpdata. bin), а параметр -o указывает выходной файл.

Эти скрипты могут быть очень полезны, когда у вас есть физиче- ский доступ к IoT-устройству с поддержкой RFID только на ограни- ченный период времени, и вы хотите автоматизировать большое ко- личество операций тестирования.

Пользовательские сценарии использования RFID-фаззинга

Вэтомразделемыпокажемвам,какиспользоватьмеханизмскриптов Proxmark3длявыполненияпростойоперациифаззинганаосновему- таций против считывателя RFID.Фаззеры итеративно или случайным образом генерируют входные данные для целевого устройства, что можетпривести к проникновению в устройство в обход защиты.Вме- сто того чтобы пытаться найти известные дефекты в системе с под- держкой RFID, вы можете использовать этот процесс для выявления новых уязвимостей в реализации.

Фаззеры на основе мутаций генерируют входные данные, изменяя начальное значение, которое обычно является нормальными данны- ми, обычно применяемыми в системе. В нашем случае это началь- ное значение может быть действительной меткой RFID, которую мы успешно клонировали.Мы создадим сценарий,который автоматизи- рует процесс подключения к считывателю RFID в качестве этой ле- гальнойметки,азатемсгенерируетнедопустимые,неожиданныеили случайные данные в блоках его памяти. Когда считыватель пытается обработать искаженные данные, может выполняться непредвиден- ный поток кода, что приводит к сбою приложения или устройства. Ошибки и исключения могут помочь вам найти опасные лазейки в приложении для считывания RFID.

Мы нацелимся на встроенный считыватель RFID на устройстве An- droid и программное обеспечение, которое получает данные RFIDметок. (Вы можете найти множество приложений для чтения RFID

вAndroid Play Store, которые можно использовать в качестве потен- циальных целей.) Напишем код фаззинга на языке Lua. Вы можете найти полный исходный код в репозитории книги. Дополнительная информация о Lua также приводится в главе 5.

Для начала сохраните следующую скелетную заготовку скрипта

впапкеProxmark3client/scripts,используяимяfuzzer.lua.Этотскрипт,

у которого нет никаких функций, теперь будет появляться в списке, когда вы используете команду script list:

File: fuzzer.lua author = "Book Authors"

Радио ближнего действия: взлом rFID  307

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

desc = "This is a script for simple fuzzing of NFC/RFID implementations"

function main(args) end

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

main()

Затемдополните скрипт,чтобы он использовал Proxmark3для под- делки легальной метки и установления соединения со считывателем. Мы будем использоватьметку,которую мы уже прочитали,экспорти- ровали в файл .bin с помощью­ команды dump и преобразовали в файл

.eml с помощью­ сценария dumptoemul. Предположим, этот файл на-

зывается CEA0B6B4.eml.

Сначала создадим локальную переменную tag для хранения дан- ных метки:

local tag = {}

Затем мы создаем функцию load_seed_tag(),которая загружаетсо- храненные данные из файла CEA0B6B4.eml в память эмулятора Prox- mark3, а также в ранее созданную локальную переменную с именем tag:

function load_seed_tag() print("Loading seed tag...").

core.console("hf mf eload CEA0B6B4") os.execute('sleep 5')

local infile = io.open("CEA0B6B4.eml", "r") if infile == nil then

print(string.format("Could not read file %s",tostring(input)))

end

local t = infile:read("*all") local i = 0

for line in string.gmatch(t, "[^\n]+") do

if string.byte(line,1) ~= string.byte("+",1) then tag[i] = line

i = i + 1

end

end

end

Чтобы загрузить файл .eml в память Proxmark3, используем пара- метр eload .Вы можете использовать команды Proxmark3,указав их в качестве аргументов в вызове функции core.console(). Следующая часть функции вручную считывает файл, анализирует строки и до- бавляет содержимое в переменную tag . Как мы уже говорили, ино- гда команде eload не удается с первого раза передать данные из всех сохраненных секторов в память Proxmark3, поэтому вам, возможно, придется использовать их неоднократно.

308  Глава 10

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Наш упрощенный фаззер изменит начальное значение перемен-

 

 

 

 

 

m

 

w Click

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

ной tag, поэтому нам нужно напиcать функцию, которая создает слуd-f-x chan

.c

 

 

 

.

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

e

 

чайные изменения в памяти исходной метки.Используем локальную

 

 

 

 

 

 

переменную с именем charset для хранения доступных шестнадца-

 

 

 

 

 

 

теричных символов, которые мы можем использовать для внесения

 

 

 

 

 

 

этих изменений:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

local charset = {} do

 

 

 

 

 

 

 

 

 

 

 

for c = 48, 57

do table.insert(charset, string.char(c)) end

 

 

 

 

 

 

 

 

 

 

 

for c = 97, 102

do table.insert(charset, string.char(c)) end

 

 

 

 

 

 

 

 

 

 

 

end

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Чтобы заполнить переменную charset мы выполняем итерацию представления ASCII символов от 0 до 9 и от a до f. Затем создаем функцию randomize(), которая использует символы, хранящиеся в предыдущей переменной, для создания мутаций в эмулируемом теге:

function randomize(block_start, block_end)

local block = math.random(block_start, block_end) local position = math.random(0,31)

local value = charset[math.random(1,16)]

print("Randomizing block " .. block .. " and position " .. position)

local string_head = tag[block]:sub(0, position) local string_tail = tag[block]:sub(position+2) tag[block] = string_head .. value .. string_tail

print(tag[block])

core.console(„hf mf eset „ .. block .. „ „ .. tag[block]) os.execute('sleep 5')

end

Точнее, эта функция случайным образом выбирает блок памяти метки и позицию в каждом выбранном блоке , а затем вводит но- вую мутацию, заменяя этот символ случайным значением из на- бора символов. Затем мы обновляем память Proxmark3 с помощью­ команды hf mf eset .

Далее создаем функцию с именем fuzz(),которая многократно ис- пользует функцию randomize() для создания новой мутации в исход- ных данных метки и эмулирует метку для считывателя RFID:

function fuzz()

core.clearCommandBuffer() core.console("hf mf dbg 0")

os.execute('sleep 5')

while not core.ukbhit() do randomize(0,63)

Радио ближнего действия: взлом rFID  309

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

core.console("hf mf sim *1 u CEA0B6B4") end

print("Aborted by user")

end

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Функция fuzz() также использует вызов API core.clearCommandBuffer() для удаления всех оставшихся команд из очереди команд Proxmark3 и команду hf mf dbg для отключения сообщений отлад- ки.Она выполняетфаззингнесколько раз,используя цикл while,пока пользователь не нажмет аппаратную кнопку Proxmark3. Мы обнару- живаем это с помощью­ вызова API core.ukbhit() . Мы реализуем симуляцию метки с помощью­ команды hf mf sim .

Затем добавляем функции к исходному каркасу скрипта в fuzzer. luaименяемфункциюmain,добавляявызовфункцийload_seed_tag()

и fuzz():

File: fuzzer.lua author = "Book Authors"

desc = "This is a script for simple fuzzing of NFC/RFID implementations"

…Previous functions.. function main(args)

load_seed_tag() fuzz()

end main()

Чтобы начать фаззинг, поместите антенну Proxmark3 рядом со считывателем RFID, который обычно находится на задней панели устройства Android (рис. 10.9).

Затем выполните команду script run fuzzer:

proxmark3> script run fuzzer

Loading seed tag...

...........................................................

Loaded 64 blocks from file: CEA0B6B4.eml #db# Debug level: 0

Randomizing block 6 and byte 19 00000000000000000008000000000000

mf sim cardsize: 1K, uid: ce a0 b6 b4 , numreads:0, flags:2 (0x02) Randomizing block 5 and byte 8

636f6dfe600000000000000000000000

mf sim cardsize: 1K, uid: ce a0 b6 b4 , numreads:0, flags:2 (0x02) Randomizing block 5 and byte 19

636f6dfe600000000004000000000000

...

Вывод должен содержать точную мутацию, которая происходит при каждом обмене данными со считывателем.При каждом установ-

310  Глава 10

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ленномсоединениисчитывательбудетпытатьсяизвлечьипроанали-

 

 

 

 

 

m

w Click

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

зировать измененные данные метки. В зависимости от мутации этиdf-x chan

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

e

 

входные данные могут влиять на поведение считывателя, приводя к непредсказуемому поведению илидаже к сбоям приложения.В худ- шем случае дверной замок с поддержкой RFID, на котором установ- лено программное обеспечение для контроля доступа, может выйти из строя при получении измененных входных данных, что позволит любому человеку свободно открыть дверь.

Рис.10.9.Фаззинг считывателя RFID на устройстве Android

Мы можем оценить работу нашего фаззера экспериментально. Можно оценить количество возможных опасных ошибок, подсчиты- ваявыявленныесбоипривводеданных.Обратитевнимание,чтоэтот скрипт представляет собой упрощенный фаззер, который следует наивному подходу: он использует простые случайные числа для соз- даниямутацийвзаданныхвходныхданных.Поэтомумынеожидаем, чтоонбудеточеньэффективнымпривыявлениисбоевпрограммного обеспечения. Менее наивные решения могли бы использовать улуч- шенные мутации, отображать протокол для детального фаззинга или даже использовать программный анализ и инструменты для взаимо- действия с большим количеством считывателей. Это потребует тща- тельного изучения документации и постоянного улучшения фаззера. Дляэтогопопробуйтепродвинутыеинструментыфаззинга,такиекак

American Fuzzy Lop (AFL) или libFuzzer. Эта задача выходит за рамки книги,и мы оставляем ее в качестве упражнения,которое вы должны выполнить самостоятельно.

Радио ближнего действия: взлом rFID  311