JTAG i Flipper Zero: Naprawa Proxmark3

Marcin Węgłowski

Jeżeli ucegliłeś swojego Proxmarka3 lub pojawił się inny problem z jego programowaniem, nie martw się – możesz przywrócić go do życia za pomocą JTAG.

JTAG to jeden z najczęściej wykorzystywanych interfejsów do debugowania i testowania urządzeń wbudowanych (ang. embeded devices) – zarówno pod kątem bezpieczeństwa, jak i ogólnej diagnostyki.
W tym przewodniku pokażę Ci krok po kroku, jak naprawić Proxmark3 przy użyciu Flipper Zero jako narzędzia JTAG. Niezależnie od tego, czy masz do czynienia z błędnie przeprowadzonym flashowaniem czy uszkodzonym bootloaderem, opisany przeze mnie sposób pomoże Ci odzyskać urządzenie i – co chyba ważniejsze – nauczysz się praktycznego wykorzystania JTAGa na rzeczywistym przykładzie!

Jak to się zaczęło?

Pewnego późnego wieczoru będąc w biurze postanowiliśmy zaktualizować firmware w Proxmark3, który wykorzystujemy w różnych zadaniach związanych z testami penetracyjnymi i Red Teamingiem. Podczas flashowania pojawiło się mnóstwo czerwonych ostrzeżeń. Dałem o tym znać koledze, który przestraszył się i natychmiast wcisnął Ctrl + C na klawiaturze. Jak pewnie się domyślasz – nigdy nie powinieneś przerywać procesu aktualizacji firmware’u!

Upgrading the bootrom of your Proxmark can brick the device. Please exercise caution when upgrading the bootloader.

informacja z dokumentacji Proxmarka, której nie czytaliśmy

Nie było jednak lepszej okazji, aby pokazać Ci proces naprawy urządzeń poprzez porty diagnostyczne, takie jak JTAG!

Czym jest JTAG?

JTAG (Joint Test Action Group) to przemysłowy interfejs wykorzystywany do debugowania i testowania układów scalonych i systemów wbudowanych oraz programowania firmware’u. Pierwotnie zaprojektowany do testowania układów scalonych, dziś JTAG stał się kluczowym narzędziem do niskopoziomowego debugowania sprzętu i modyfikacji firmware’u, a nawet do analizy bezpieczeństwa.

JTAG używa protokołu komunikacji szeregowej, pozwalającego na bezpośrednią komunikację z CPU i pamięcią, omijając konieczność wykorzystania tradycyjnych metod programowania opartych na systemie operacyjnym, co czyni go niezastąpionym w naprawianiu zbrickowanych urządzeń, modyfikacji ich oprogramowania, czy też inżynierii wstecznej. Większość urządzeń Internet of Things posiada wyprowadzenia JTAG, które mogą występować w postaci pinów testowych lub dedykowanego złącza.

W kontekście naprawy Proxmark, JTAG daje bezpośredni dostęp do mikrokontrolera, umożliwiając: ponowne wgranie firmware’u, debugowanie problemów z bootowaniem oraz odzyskanie urządzenia ze stanu „uceglonego”. Dzięki takim narzędziom jak Flipper Zero, który obsługuje JTAG, możemy przywrócić Proxmark3 do życia bez konieczności używania profesjonalnych programatorów sprzętowych.

Dlaczego Flipper Zero? 🐬

Flipper Zero to wszechstronne, przenośne urządzenie do „hakowania”, które obsługuje JTAG, co czyni go świetnym narzędziem do naprawy uceglonych urządzeń (takich jak nasz Proxmark!). Oczywiście istnieje wiele dedykowanych programatorów JTAG, takich jak SEGGER J-Link, interfejsy oparte na FTDI lub inne programatory kompatybilne z OpenOCD. Mimo wszystko, Flipper Zero wyróżnia się dzięki: dostępności, wszechstronności oraz brak konieczność zastosowania dodatkowego sprzętu co sprawia, że jest łatwy w użytkowaniu. Ponadto jest na tyle popularny, że wielu entuzjastów wykorzystuje go do różnorodnych zadań związanych z bezpieczeństwem lub do debuggowania, zatem ma już go w swoim arsenale.

Naprawa Proxmark3

Naszym celem jest wgranie nowego firmware’u na Proxmark3 za pomocą JTAG. Flipper Zero z DAPLink będzie naszym narzędziem JTAG, a jako interfejsu użyjemy OpenOCD.

Co będzie potrzebne?

Sprzęt

  • Komputer z systemem Linux (my używamy Kali Linuxa)
  • Flipper Zero (pełniący funkcję adaptera JTAG, musi posiadać najnowszy firmware, aby obsługiwać JTAG)
  • Proxmark3 (uceglone urządzenie)
  • 6 przewodów (DuPont jumper wires)
  • Przewód USB-C (do podłączenia Flippera Zero do komputera)

Oprogramowanie

  • OpenOCD – open-source’owe narzędzie do interakcji z JTAG – pobierz tutaj (wersja dostępna w repozytoriach Linuxa jest często przestarzała) i skompiluj zgodnie z krokami opisanymi w kolejnym akapicie
  • aplikacja DAPLink na Flippera – po podłączeniu Flippera przez USB można zainstalować z lab.flipper.net
  • Proxmark Iceman firmware – gotowy obraz można pobrać tutaj w sekcji Latest Official Build.
  • Proxmark Iceman repository – zawiera konfiguracje dla mikrokontrolera AT91SAM7S. Pobierz repozytorium Iceman Proxmark3 za pomocą:
    git clone --depth=1 https://github.com/RfidResearchGroup/proxmark3

Kompilacja i instalacja OpenOCD

OpenOCD zazwyczaj jest dostępny w repozytoriach Linuxa, jednak często jest przestarzały. Dlatego lepiej pobrać i skompilować najnowszą wersję samodzielnie.

Najpierw zainstaluj wymagane zależności:

sudo apt update && sudo apt install -y build-essential libtool autoconf automake texinfo libusb-1.0-0-dev libftdi1-dev libhidapi-dev pkg-configCode language: CSS (css)

Przejdź na stronę SourceForge OpenOCD i pobierz najnowszą wersję. Następnie rozpakuj archiwum i otwórz terminal w katalogu, do którego zostały wyodrębnione pliki. Skorzystaj z poniższych poleceń, aby skompilować i zainstalować OpenOCD:

./configure CFLAGS="-O0 -Wno-error"
make
sudo make installCode language: JavaScript (javascript)

Używamy flagi CFLAGS="-Wno-error", która powoduje, że operacja wykona się pomimo ostrzeżeń – w przeciwnym razie część z nich może zostać potraktowana jako błędy uniemożliwiając wykonanie polecenia.

Teraz powinieneś być w stanie uruchomić openocd --version i otrzymać podobny output:

$ openocd --version
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.htmlCode language: JavaScript (javascript)

Konfiguracja reguł UDEV dla Proxmark3 i OpenOCD

sudo wget https://github.com/RfidResearchGroup/proxmark3/blob/master/driver/77-pm3-usb-device-blacklist-dialout.rules -O /etc/udev/rules.d/77-pm3-usb-device-blacklist-dialout.rules
sudo wget https://github.com/RfidResearchGroup/proxmark3/blob/master/driver/77-pm3-usb-device-blacklist-uucp.rules -O /etc/udev/rules.d/77-pm3-usb-device-blacklist-uucp.rules
sudo wget https://raw.githubusercontent.com/arduino/OpenOCD/refs/heads/master/contrib/60-openocd.rules -O /etc/udev/rules.d/60-openocd.rules
sudo udevadm control --reload-rules
sudo udevadm triggerCode language: JavaScript (javascript)

Podłączenie PC, FlipperZero i Proxmark3

Uruchom Flipper Zero i przejdź do: Apps → GPIO → DAP Link.

Przejdź do Config → Help and Pinout i przewiń w dół, aby zobaczyć pinout dla JTAGa. Podłącz przewody do Proxmarka, a następnie do Flippera, z wykluczeniem RST. Pamiętaj, żeby najpierw podłączyć GND, a 3.3 na samym końcu. Łącznie powinno być podłączonych 6 przewodów.

Podłącz Flipper Zero do komputera. Jeżeli wszystko zostało zrobione poprawnie, powinieneś zobaczyć, że /dev/ttyACMx jest podłączone. Jeżeli go nie widzisz to może świadczyć o tym, że urządzenia są źle połączone.

$ ls /dev | grep ACM
ttyACM0

Flashowanie Proxmark3 za pomocą OpenOCD i JTAG

Poniższe polecenie uruchomi połączenie JTAG (za pośrednictwem Flipper Zero) z Proxmark3:

openocd -f /usr/local/share/openocd/scripts/interface/cmsis-dap.cfg -c "transport select jtag" -f /home/kali/Downloads/proxmark3/tools/jtag_openocd/board-at91sam7s.cfgCode language: JavaScript (javascript)
  • f /usr/local/share/openocd/scripts/interface/cmsis-dap.cfg
    Ładuje plik konfiguracyjny OpenOCD dla interfejsu CMSIS-DAP.
    Flipper Zero obsługuje CMSIS-DAP w trybie JTAG, więc ten plik ustawia go jako adapter JTAG/SWD.
  • -c "transport select jtag"
    Flaga -c pozwala na wywołanie komendy przez OpenOCD. Wymusza użycie JTAG, zamiast domyślnego SWD (Serial Wire Debug), który jest często używany dla urządzeń ARM.
  • -f /home/kali/Downloads/proxmark3/tools/jtag_openocd/board-at91sam7s.cfg
    Ładuje konfigurację dla mikrokontrolera AT91SAM7S, który znajduje się w Proxmark3.
    Ten plik określa układ pamięci, konfigurację flashowania oraz procedury inicjalizacji, dzięki czemu Proxmark jest w stanie komunikować się z AT91SAM7S za pośrednictwem JTAG. Plik ten pochodzi z repozytorium Iceman fork dla Proxmark3. Pamiętaj, aby dostosować ścieżkę do rzeczywistej lokalizacji pliku w Twoim systemie.

Poniżej znajduje się output dla omawianej komendy:

$ openocd -f /usr/local/share/openocd/scripts/interface/cmsis-dap.cfg -c "transport select jtag" -f /home/kali/Downloads/proxmark3/tools/jtag_openocd/board-at91sam7s.cfg
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
jtag
Warn : Transport "jtag" was already selected
DEPRECATED! use 'adapter speed' not 'adapter_khz'
adapter speed: 1000 kHz

Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : Using CMSIS-DAPv2 interface with VID:PID=0x0483:0x5740, serial=DAP_Uticona
Info : CMSIS-DAP: SWD supported
Info : CMSIS-DAP: JTAG supported
Info : CMSIS-DAP: FW Version = 2.0.0
Info : CMSIS-DAP: Serial# = DAP_Uticona
Info : CMSIS-DAP: Interface Initialised (JTAG)
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 1 TDO = 1 nTRST = 0 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 1000 kHz
Info : cmsis-dap JTAG TLR_RESET
Info : cmsis-dap JTAG TLR_RESET
Info : JTAG tap: sam7x.cpu tap/device found: 0x3f0f0f0f (mfg: 0x787 (<unknown>), part: 0xf0f0, ver: 0x3)
Info : Embedded ICE version 1
Info : sam7x.cpu: hardware has 2 breakpoint/watchpoint units
Info : starting gdb server for sam7x.cpu on 3333
Info : Listening on port 3333 for gdb connectionsCode language: HTML, XML (xml)

Ważne jest dla nas to, że została otwarta usługa telnet na porcie 4444. Aby nawiązać połączenie z serwerem OpenOCD wykorzystamy polecenie telnet. Od razu możemy przystąpić do procesu wgrywania oprogramowania.

$ telnet localhost 4444
Trying ::1...
Connection failed: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> flash banks
#0 : sam7x.flash.0 (at91sam7) at 0x00100000, size 0x00040000, buswidth 0, chipwidth 0
#1 : sam7x.flash.1 (at91sam7) at 0x00140000, size 0x00040000, buswidth 0, chipwidth 0

> halt
> flash write_image /home/kali/Downloads/proxmark-prebuilt/recovery/proxmark3_recovery.bin 0x00100000
wrote 207476 bytes from file /home/kali/Downloads/proxmark-prebuilt/recovery/proxmark3_recovery.bin in 54.381119s (3.726 KiB/s)Code language: PHP (php)
  • Komenda flash banks została użyta do wylistowania wszystkich wykrytych i skonfigurowanych przez OpenOCD pamięci flash (ang. flash memory banks) na docelowym urządzeniu – w tym również adresów pamięci, które będą potrzebne do flashowania firmware’u.
  • halt zatrzymuje CPU wykorzystując JTAG lub SWD. Jest to konieczne przy debuggowaniu, flashowaniu lub modyfikowaniu stanu systemu.
  • flash write_image /home/kali/Downloads/proxmark-prebuilt/recovery/proxmark3_recovery.bin 0x00100000 – zapisuje obraz firmware’u (proxmark3_recovery.bin) pod wskazanym adresem (0x00100000 – uzyskaliśmy ten adres wykonując komendę flash banks).

Zakończenie działań

Po pomyślnym wgraniu obrazu odzyskiwania (ang. recovery image) na Proxmark3, możemy przywrócić jego pełną funkcjonalność. Odłącz Flipper Zero i zamiast niego podłącz Proxmark3 bezpośrednio do komputera, na którym wcześniej go używałeś. Wykonaj komendy pm3-flash-bootrom oraz pm3-flash-fullimage i uruchom Proxmark3 za pomocą komendy pm3.

» pm3-flash-bootrom
[=] Session log /home/marcin/.proxmark3/logs/log_20250212151658.txt
[+] loaded `/home/marcin/.proxmark3/preferences.json`
[+] About to use the following file:
[+]    /usr/local/bin/../share/proxmark3/firmware/bootrom.elf
[+] Loading ELF file /usr/local/bin/../share/proxmark3/firmware/bootrom.elf
[+] ELF file version Iceman/master/v4.19552-29-gb75818116-suspect 2024-11-29 13:24:02 da2aa137f

[+] Waiting for Proxmark3 to appear on /dev/ttyACM0
 🕑  59 found
[+] Entering bootloader...
[+] (Press and release the button only to abort)
[+] Trigger restart...
[+] Waiting for Proxmark3 to appear on /dev/ttyACM0
 🕑  49 found
[!!] 🚨 ====================== OBS ! ===========================================
[!!] 🚨 Note: Your bootloader does not understand the new CMD_BL_VERSION command
[!!] 🚨 It is recommended that you first update your bootloader alone,
[!!] 🚨 reboot the Proxmark3 then only update the main firmware


[!!] 🚨 ------------- Follow these steps -------------------

[!!] 🚨  1)   ./pm3-flash-bootrom
[!!] 🚨  2)   ./pm3-flash-fullimage
[!!] 🚨  3)   ./pm3

[=] ---------------------------------------------------

[=] Available memory on this board: UNKNOWN

[!!] 🚨 ====================== OBS ! ======================================
[!!] 🚨 Note: Your bootloader does not understand the new CHIP_INFO command
[=] Permitted flash range: 0x00100000-0x00140000
[+] Loading usable ELF segments:
[+]    0: V 0x00100000 P 0x00100000 (0x00000200->0x00000200) [R X] @0x94
[+]    1: V 0x00200000 P 0x00100200 (0x000014e0->0x000014e0) [R X] @0x298

[+] Flashing...
[+] Writing segments for file: /usr/local/bin/../share/proxmark3/firmware/bootrom.elf
[+]  0x00100000..0x001001ff [0x200 / 1 blocks]
. ok
[+]  0x00100200..0x001016df [0x14e0 / 11 blocks]
........... ok

[+] All done

[=] Have a nice day!

» pm3-flash-fullimage
[=] Session log /home/marcin/.proxmark3/logs/log_20250212151716.txt
[+] loaded `/home/marcin/.proxmark3/preferences.json`
[+] About to use the following file:
[+]    /usr/local/bin/../share/proxmark3/firmware/fullimage.elf
[+] Loading ELF file /usr/local/bin/../share/proxmark3/firmware/fullimage.elf
[+] ELF file version Iceman/master/v4.19552-29-gb75818116-suspect 2024-11-29 13:24:23 da2aa137f

[+] Waiting for Proxmark3 to appear on /dev/ttyACM0
 🕑  59 found
[+] Entering bootloader...
[+] (Press and release the button only to abort)
[+] Trigger restart...
[+] Waiting for Proxmark3 to appear on /dev/ttyACM0
 🕓  59 found
[=] Available memory on this board: 512K bytes

[=] Permitted flash range: 0x00102000-0x00180000
[+] Loading usable ELF segments:
[+]    1: V 0x00102000 P 0x00102000 (0x00059c54->0x00059c54) [R X] @0xb8
[+]    2: V 0x00200000 P 0x0015bc54 (0x00001de4->0x00001de4) [R X] @0x59d10
[=] Note: Extending previous segment from 0x59c54 to 0x5ba38 bytes

[+] Flashing...
[+] Writing segments for file: /usr/local/bin/../share/proxmark3/firmware/fullimage.elf
[+]  0x00102000..0x0015da37 [0x5ba38 / 734 blocks]
...................................................................
        @@@  @@@@@@@ @@@@@@@@ @@@@@@@@@@   @@@@@@  @@@  @@@
        @@! !@@      @@!      @@! @@! @@! @@!  @@@ @@!@!@@@
        !!@ !@!      @!!!:!   @!! !!@ @!@ @!@!@!@! @!@@!!@!
        !!: :!!      !!:      !!:     !!: !!:  !!! !!:  !!!
        :    :: :: : : :: :::  :      :    :   : : ::    : 
        .    .. .. . . .. ...  .      .    .   . . ..    . 
...................................................................
...................................................................
...................................................................
...................................................................
.............................. ok

[+] All done

[=] Have a nice day!

 » pm3
[=] Waiting for Proxmark3 to appear...

# ^ this actually took a while before everything started up, be patient

[=] Session log /home/marcin/.proxmark3/logs/log_20250212152551.txt
[+] loaded `/home/marcin/.proxmark3/preferences.json`
[+] Using UART port /dev/ttyACM0
[+] Communicating with PM3 over USB-CDC


  8888888b.  888b     d888  .d8888b.   
  888   Y88b 8888b   d8888 d88P  Y88b  
  888    888 88888b.d88888      .d88P  
  888   d88P 888Y88888P888     8888"  
  8888888P"  888 Y888P 888      "Y8b.  
  888        888  Y8P  888 888    888  
  888        888   "   888 Y88b  d88P 
  888        888       888  "Y8888P"    [ ☕ ]



  [ Fuel open source revolution! ]
     Patreon - https://www.patreon.com/iceman1001/


qt5ct: using qt5ct plugin
  [ Proxmark3 RFID instrument ]

    MCU....... AT91SAM7S512 Rev B
    Memory.... 512 KB ( 73% used )

    Client.... Iceman/master/v4.19552-29-gb75818116 2024-11-29 13:24:13
    Bootrom... Iceman/master/v4.19552-29-gb75818116-suspect 2024-11-29 13:24:02 
    OS........ Iceman/master/v4.19552-29-gb75818116-suspect 2024-11-29 13:24:23 
[-] ⛔ fail reading from flashmemory
    Target.... device / fw mismatch

[usb] pm3 --> Code language: PHP (php)

Jeśli wszystko poszło zgodnie z planem Proxmark3 powinien działać poprawnie i być gotowy do użycia! Na koniec, zanurzmy się nieco głębiej w temat JTAG i jego zastosowania w testach bezpieczeństwa.

Testowanie bezpieczeństwa z wykorzystaniem JTAG

JTAG to nie tylko narzędzie do debugowania, ale także potężny wektor ataku w testach penetracyjnych sprzętu. JTAG zapewnia niskopoziomowy dostęp do procesora, pamięci i peryferiów urządzenia, co pozwala omijać mechanizmy zabezpieczeń, wyciągać poufne dane i wstrzykiwać złośliwe oprogramowanie.

Jak JTAG jest wykorzystywany w testach penetracyjnych sprzętu

  1. Omijanie mechanizmów bezpieczeństwa
    Wiele urządzeń wbudowanych opiera się na zabezpieczeniach programowych (ang. software-based security), jednak JTAG może ominąć mechanizmy uwierzytelnienia poprzez bezpośrednią modyfikację pamięci i rejestrów. Atakujący może wyłączyć zabezpieczenia bootloadera, zmienić flagi bezpieczeństwa lub wymusić uruchomienie systemu w trybie z podniesionymi uprawnieniami.
  2. Ekstrakcja firmware’u i danych
    Dzięki JTAG można wyciągnąć firmware bezpośrednio z pamięci flash lub RAM. Jego analiza może pozwolić na odczytanie zaszytych haseł, kluczy szyfrujących lub innych wrażliwych danych.
  3. Modyfikacja działania urządzenia w czasie rzeczywistym
    JTAG pozwala na debugowanie w czasie rzeczywistym, co oznacza, że można zmieniać wartości rejestrów, modyfikować przepływ wykonania kodu lub wyłączyć mechanizmy bezpieczeństwa. Dzięki temu atakujący może ominąć mechanizmy uwierzytelniania (np. poprzez zmianę wartości flagi, która przyznaje dostęp administratora, bez znajomości hasła).
  4. Wstrzykiwanie i modyfikacja firmware’u
    Atakujący może wykorzystać JTAG do wgrania zmodyfikowanego firmware’u zastępując oryginalny kod. W ten sposób możliwe jest dodanie tylnej furtki (backdoor’a) lub wstrzyknięcie keyloggera. Celem tego typu ataku często są: routery, urządzenia IoT lub Smartcardy.

Przykłady realnych zastosowań JTAG w pentestingu

  • Urządzenia IoT & systemy wbudowane: urządzenia inteligentnych domów, routery czy systemy przemysłowe często mają otwarte interfejsy JTAG, co pozwala na ekstrakcję firmware’u i jego modyfikację.
  • Hackowanie samochodów: JTAG może zostać wykorzystany do analizy ECU (Electronic Control Unit) w pojazdach, umożliwiając manipulację firmware’em i wyciąganie kluczy szyfrujących.
  • Omijanie Secure Boot: Jeśli system zabezpieczający Secure Boot został źle wdrożony, JTAG może pozwolić na ominięcie mechanizmów weryfikacyjnych i uruchomienie nieautoryzowanego kodu.
  • Manipulacja modułami zabezpieczeń: JTAG może być używany do: wyłączania mechanizmów DRM, modyfikowania terminali płatniczych, czy też łamania sprzętowych mechanizmów szyfrowania.

Obrona przed atakami JTAG

Aby zabezpieczyć swoje urządzenia producenci mogliby:

  • Wyłączyć JTAG w urządzeniach produkcyjnych (można to zrobić poprzez „zworki” lub blokady programowe).
  • Wymuszenie uwierzytelniania JTAG (ograniczenie dostępu do JTAG poprzez mechanizmy kryptograficzne).
  • Fizyczne usunięcie lub ukrycie (np. pod chipami BGA) interfejsów JTAG.
  • Wykorzystanie układów wykrywających naruszenie zabezpieczeń, które wykrywałyby próbę podłączenia JTAG i automatycznie kasowały wrażliwe dane.

Podsumowanie

JTAG to broń obosieczna – jest nieoceniony w debugowaniu sprzętu i naprawianiu uceglonych urządzeń, jednak daje także atakującym możliwość omijania zabezpieczeń, ekstrakcji poufnych danych i wstrzykiwania złośliwego oprogramowania.

Author Photo
Marcin Węgłowski
Offensive Security Engineer

Czy Twoja firma jest bezpieczna w sieci?

Dołącz do grona naszych zadowolonych klientów i zabezpiecz swoją firmę przed cyberzagrożeniami już dziś!

Zostaw nam swoje dane kontaktowe, a nasz zespół skontaktuje się z Tobą, aby omówić szczegóły i dopasować ofertę do Twoich potrzeb. Dbamy o pełną dyskrecję i poufność Twoich danych, dlatego możesz nam zaufać.

Chciałbyś od razu zadać pytanie? Odwiedź naszą stronę kontaktową.