Proxmark3 rdv4: оживляем "кирпич"
@webwareПостараюсь принести пользу этому замечательному ресурсу практической статьей.
Сравнительно недавно стал пользователем Proxmark3 rdv4 для тестирования СКУД - блестящего инструмента при проведении выездного пентеста, включающего преодоление физического периметра. Далее для краткости изложения буду его называть pm3
Спустя несколько месяцев экспериментов и успешных пентестов пришло понимание, что функционал устройства нужно расширять. Один из способов это сделать - установка альтернативной прошивки.
Шаг 1. Скачиваем и устанавливаем нужное ПО на ПК.
Совет 1. Доказано на практике (и не только мной), что вероятность получить "кирпич" близка к 100%. Но все поправимо!
Совет 2. Именно для rdv4 используйте или стандартную прошивку, или rfidresearchgroup. Важно!!! Не пробуйте ставить прошвку от айсмана. Во-первых получите кирпич. А даже если нет - часть методов не будет работать. Вторая рекомендованная мной прошивка от RfidResearchGroup сделана на ее основе и с участием разработчика.
Родная прошивка: Proxmark/proxmark3
Прошивка RfidResearchGroup RfidResearchGroup/proxmark3
В качестве рабочей машинки я использую ноутбук с Ubuntu 18.04. Соответственно, процесс установки ПО на комп описывать не буду - это максимально корректно и подробно описано у RfidResearchGroup по ссылке выше.
# установка дополнительных бибилотек sudo apt-get install p7zip git build-essential libreadline5 libreadline-dev libusb-0.1-4 libusb-dev libqt4-dev perl pkg-config wget libncurses5-dev gcc-arm-none-eabi # Клонируем прошивку, в данном случае - ОРИГИНАЛЬНАЯ git clone https://github.com/Proxmark/proxmark3.git # Заходим в директорию proxmark3 cd proxmark3 # Компилируем ПО make clean && make all
Шаг 2. Прошивка Proxmark3
После компиляции файлов на ПК вы дожны прошить сам pm3. Подразумевается, что это должно делаться автоматически вот этой командой:
client/proxmark3-flasher /dev/ttyACM0 -b bootrom/obj/bootrom.elf armsrc/obj/fullimage.elf
Где bootrom.elf - загрузчик pm3, а fullimage.elf - основная прошивка.
Помните, что оба файла генерируются при компиляции.
Если процесс прошел успешно, поздравляю! Перезагрузите pm3 и пользуйтесь. Если нет, то начинаем разбираться.
Команда для запуска ПО
./client/proxmark3 /dev/ttyACM0
Вариант 1. Ошибка в основной прошивке.
В данном случае все довольно просто и ситуация хорошо описано в мануалах. ПО якобы не видит pm3 и он не работает. Поскольку загрузчик в порядке, мы должны включить pm3 в "сервисном режиме" - с зажатой кнопкой.
После этого снова накатываем прошивку (лучше другую)
Вкратце алгоритм такой
- Отключаем pm3 (физически)
- Нажимаем и держим зажатой кнопку. НЕ ОТПУСКАЕМ!!!!!!!!!
- Включаем девайс в usb
- запускаем прошивку sudo client/flasher /dev/ttyACM0 armsrc/obj/fullimage.elf
- Ждем окончания
- Отпускаем кнопку
- Переподключаем pm3
Так же, судя по англоязычным форумам, ОЧЕНЬ часто встречается необходимость перезаписать правила. Мне это делать не пришлось, но у вас может быть эта проблема
make udev sudo udevadm control --reload-rules sudo adduser root dialout The user `root' is already a member of `dialout'. # Заново компилируем make clean && make all
После чего пытаемся прошить pm3
Вариант 2. Ошибка загрузчика.
Вот это уже проблемка. Вы получили классический "кирпич", который будем исправлять программированием через интерфейс JTAG.
Перелопатив туеву хучу официальных и неофициальных мануалов, комментариев на форумах и проч. предлагаю САМЫЙ простой и эффективный способ.
Шаг 3. Исправляем загрузчик через JTAG
Нам понадобятся сам pm3, любой Raspberry Pi и 5 проводков для соединения пинов Raspberry с разъемами pm3.
Да, я читал про программаторы Segger, BusPirate, The Shikra... и даже купил некоторые... Забудьте. Ничего кроме проблем по совершенно непонятныс причинам. Если вы пентестер, то почти наверняка у вас есть Raspberry. Все остальное - пустая трата времени и денег с непонятным результатом. Не повторяйте моих ошибок. Мауналы подвирают, прверено на личном опыте.
Важно! Пины на pm3 - очень маленькие дырочки. В моем комплекте и в ближайших "радиотеталях" не оказалось ничего подходящего. Найти такие коннекторы или «крокодильчики» быстро — не самая простая задача. К слову, на lab401 продается переходник за 35 евро. За эти деньги можно плюноуть и купить с Китая pm3 rdv3. Поэтому обошелся простой "скруткой". Будьте внимательны, чтобы не перехлестнуть оголенные провода.
Берем Rasperry Pi и ставим на него дополнительные пакеты и библиотеку Openocd
cd ~ sudo apt-get update sudo apt-get install git autoconf libtool make pkg-config libusb-1.0-0 libusb-1.0-0-dev git clone http://openocd.zylin.com/openocd cd openocd ./bootstrap ./configure --enable-sysfsgpio --enable-bcm2835gpio make sudo make install sudo cp -r tcl/ /usr/share/openocd
После подготовки rpi нужно соединить пины с pm3. Для моего Rpi3 model B v 1.2 правильная именно такая. Первые 13 рядов идентичны с шиной Raspberry Pi первой версии и нам нужны только вот эти пины:
14 - Grnd
22 - TMS
19 - TDI
21 - TDO
23 - TCK
Если есть желание, чуть подробнее про GPIO Raspberry Pi можете прочитать в этой статье: Raspberry Pi and OpenOCD
Возможно у меня кривые руки, но целая куча других публикаций и описаний не помогла.
ВАЖНО!!! Питание (разъём 3.3v на pm3) НЕ ТРОГАЕМ вообще. Используйте ТОЛЬКО штатное, подключив pm3 через кабель к usb-порту или зарядному устройству. Поверьте, это проще и значительно безопаснее.


Итак, теперь мы готовы к прошивке.
В директории /usr/share/openocd/scripts/target/ создайте файл конфигурации с названием at91sam7s512-buspirate.cfg.
В него запишите код, рекомендованный производителем pm3
# Ports
telnet_port 4444
gdb_port 3333
# Interface
source [find interface/sysfsgpio-raspberrypi.cfg]
# use combined on interfaces or targets that can’t set TRST/SRST separately
reset_config srst_only srst_pulls_trst
jtag newtap sam7x cpu -irlen 4 -ircapture 0x1 -irmask 0xf
#target create sam7x.cpu arm7tdmi -endian little -chain-position sam7x.cpu -variant arm7tdmi
target create sam7x.cpu arm7tdmi -endian little -chain-position sam7x.cpu
sam7x.cpu configure -event reset-init {
soft_reset_halt
mww 0xfffffd00 0xa5000004 # RSTC_CR: Reset peripherals
mww 0xfffffd44 0x00008000 # WDT_MR: disable watchdog
mww 0xfffffd08 0xa5000001 # RSTC_MR enable user reset
mww 0xfffffc20 0x00005001 # CKGR_MOR : enable the main oscillator
sleep 10
mww 0xfffffc2c 0x000b1c02 # CKGR_PLLR: 16MHz * 12/2 = 96MHz
sleep 10
mww 0xfffffc30 0x00000007 # PMC_MCKR : MCK = PLL / 2 = 48 MHz
sleep 10
mww 0xffffff60 0x00480100 # MC_FMR: flash mode (FWS=1,FMCN=72)
sleep 100
}
gdb_memory_map enable
#gdb_breakpoint_override hard
#armv4_5 core_state arm
sam7x.cpu configure -work-area-virt 0 -work-area-phys 0x00200000 -work-area-size 0x10000 -work-area-backup 0
flash bank sam7x512.flash.0 at91sam7 0 0 0 0 sam7x.cpu 0 0 0 0 0 0 0 18432
flash bank sam7x512.flash.1 at91sam7 0 0 0 0 sam7x.cpu 1 0 0 0 0 0 0 18432
Теперь скопируйте на rpi два файла:
Прошивка загрузчика, который обычно находится тут: proxmark3//bootrom/obj/bootrom.elf
Прошивка платы, обычно она находится тут: proxmark3/armsrc/obj/fullimage.elf
Итак, запускаем openocd
cd /usr/share/openocd/scripts/target/ sudo openocd -f at91sam7s512-buspirate.cfg

В другом окне терминала подключяемся по telnet и прошиваем:
telnet 127.0.0.1 4444 halt flash erase_sector 0 0 15 flash erase_sector 1 0 15 flash write_image "ПУТЬ ДО ПРОШИВКИ/fullimage.elf" flash write_image "ПУТЬ ДО ПРОШИВКИ/bootrom.elf" exit

Все! Теперь ваш pm3 полностью работоспособен, нужно только перезагрузить.
Таким образом можно залить любую прошивку и это ГОРАЗДО стабильнее работает, нежели штатным средствами.
Вкратце все, успехов!
Напоследок
Делайте все выспавшимся, на трезвую голову и без тремора рук. Последствия неверного соединения неизвестны и могут привести к повреждению микросхем.