mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
298 lines
17 KiB
Markdown
298 lines
17 KiB
Markdown
# Analiza firmvera
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## **Uvod**
|
||
|
||
### Povezani resursi
|
||
|
||
|
||
{{#ref}}
|
||
synology-encrypted-archive-decryption.md
|
||
{{#endref}}
|
||
|
||
{{#ref}}
|
||
../../network-services-pentesting/32100-udp-pentesting-pppp-cs2-p2p-cameras.md
|
||
{{#endref}}
|
||
|
||
|
||
Firmver je osnovni softver koji omogućava uređajima da pravilno funkcionišu tako što upravlja i olakšava komunikaciju između hardverskih komponenti i softvera sa kojim korisnici interaguju. Smešten je u trajnoj memoriji, što osigurava da uređaj može pristupiti ključnim instrukcijama od trenutka uključenja, vodeći do pokretanja operativnog sistema. Ispitivanje i eventualna modifikacija firmvera predstavlja ključni korak u otkrivanju bezbednosnih ranjivosti.
|
||
|
||
## **Prikupljanje informacija**
|
||
|
||
**Prikupljanje informacija** je kritični početni korak u razumevanju sastava uređaja i tehnologija koje koristi. Ovaj proces obuhvata sakupljanje podataka o:
|
||
|
||
- CPU arhitekturi i operativnom sistemu koji pokreće uređaj
|
||
- specifikacijama bootloader-a
|
||
- rasporedu hardvera i datasheet-ovima
|
||
- metriki codebase-a i lokacijama izvornog koda
|
||
- eksternim bibliotekama i tipovima licenci
|
||
- istoriji ažuriranja i regulatornim sertifikatima
|
||
- arhitektonskim i flow dijagramima
|
||
- bezbednosnim procenama i identifikovanim ranjivostima
|
||
|
||
Za ovu svrhu, alati za **open-source intelligence (OSINT)** su neprocenjivi, kao i analiza dostupnih open-source softverskih komponenti kroz manuelne i automatizovane procese pregleda. Alati kao što su [Coverity Scan](https://scan.coverity.com) i [Semmle’s LGTM](https://lgtm.com/#explore) nude besplatnu statičku analizu koja se može iskoristiti za pronalaženje potencijalnih problema.
|
||
|
||
## **Preuzimanje firmvera**
|
||
|
||
Dobijanje firmvera može se pristupiti na različite načine, svaki sa sopstvenim nivoom složenosti:
|
||
|
||
- **Direktno** od izvora (developer-i, proizvođači)
|
||
- **Sastavljanje** iz datih instrukcija
|
||
- **Preuzimanje** sa zvaničnih support sajtova
|
||
- Korišćenjem **Google dork** upita za pronalaženje hostovanih firmware fajlova
|
||
- Direktnim pristupom **cloud storage**, sa alatima poput [S3Scanner](https://github.com/sa7mon/S3Scanner)
|
||
- Presretanjem **updates** putem man-in-the-middle tehnika
|
||
- **Ekstrakcijom** sa uređaja putem konekcija kao što su **UART**, **JTAG**, ili **PICit**
|
||
- **Snimanjem** update zahteva u komunikaciji uređaja
|
||
- Pronalaženjem i korišćenjem **hardcoded update endpoints**
|
||
- **Dump-ovanjem** iz bootloader-a ili mreže
|
||
- **Uklanjanjem i očitavanjem** čipa za skladištenje, kada sve ostalo zakaže, koristeći odgovarajuće hardverske alate
|
||
|
||
## Analiza firmvera
|
||
|
||
Sada kada **imate firmver**, potrebno je izvući informacije o njemu da biste znali kako da ga tretirate. Različiti alati koje možete koristiti za to:
|
||
```bash
|
||
file <bin>
|
||
strings -n8 <bin>
|
||
strings -tx <bin> #print offsets in hex
|
||
hexdump -C -n 512 <bin> > hexdump.out
|
||
hexdump -C <bin> | head # might find signatures in header
|
||
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
||
```
|
||
Ako ne nađete mnogo rezultata tim alatima, proverite **entropy** image-a sa `binwalk -E <bin>`; ako je entropy nizak, verovatno nije encrypted. Ako je entropy visok, verovatno je encrypted (ili na neki način compressed).
|
||
|
||
Pored toga, ove alate možete koristiti za ekstrakciju **files embedded inside the firmware**:
|
||
|
||
|
||
{{#ref}}
|
||
../../generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
|
||
{{#endref}}
|
||
|
||
Ili [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)) za pregled fajla.
|
||
|
||
### Dobijanje filesystem-a
|
||
|
||
Korišćenjem prethodno pomenutih alata kao što je `binwalk -ev <bin>` trebalo bi da budete u mogućnosti da **extract the filesystem**.\
|
||
Binwalk obično izdvaja sadržaj u **folder nazvan po tipu filesystem-a**, koji obično bude jedan od sledećih: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
|
||
|
||
#### Ručna ekstrakcija filesystem-a
|
||
|
||
Ponekad binwalk neće imati **magic byte of the filesystem in its signatures**. U tim slučajevima, koristite binwalk da **find the offset of the filesystem and carve the compressed filesystem** iz binarne datoteke i **manually extract** filesystem prema njegovom tipu koristeći korake ispod.
|
||
```
|
||
$ binwalk DIR850L_REVB.bin
|
||
|
||
DECIMAL HEXADECIMAL DESCRIPTION
|
||
----------------------------------------------------------------------------- ---
|
||
|
||
0 0x0 DLOB firmware header, boot partition: """"dev=/dev/mtdblock/1""""
|
||
10380 0x288C LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5213748 bytes
|
||
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
|
||
1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41
|
||
```
|
||
Pokrenite sledeću **dd command** koja vrši carving Squashfs filesystem-a.
|
||
```
|
||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||
|
||
8257536+0 records in
|
||
|
||
8257536+0 records out
|
||
|
||
8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s
|
||
```
|
||
Alternativno, sledeća komanda se takođe može izvršiti.
|
||
|
||
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
|
||
|
||
- Za squashfs (korišćen u primeru iznad)
|
||
|
||
`$ unsquashfs dir.squashfs`
|
||
|
||
Fajlovi će se nalaziti u direktorijumu `squashfs-root` nakon toga.
|
||
|
||
- CPIO arhive
|
||
|
||
`$ cpio -ivd --no-absolute-filenames -F <bin>`
|
||
|
||
- Za jffs2 datotečne sisteme
|
||
|
||
`$ jefferson rootfsfile.jffs2`
|
||
|
||
- Za ubifs datotečne sisteme sa NAND flash-om
|
||
|
||
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
|
||
|
||
`$ ubidump.py <bin>`
|
||
|
||
## Analiza firmvera
|
||
|
||
Kada se firmware dobije, važno ga je rastaviti kako bi se razumela njegova struktura i potencijalne ranjivosti. Ovaj proces podrazumeva korišćenje raznih alata za analizu i ekstrakciju korisnih podataka iz firmware image-a.
|
||
|
||
### Početni alati za analizu
|
||
|
||
Daje se skup komandi za početni pregled binarnog fajla (označenog kao `<bin>`). Ove komande pomažu u identifikaciji tipova fajlova, izdvajanja stringova, analizi binarnih podataka i razumevanju particija i detalja fajl-sistema:
|
||
```bash
|
||
file <bin>
|
||
strings -n8 <bin>
|
||
strings -tx <bin> #prints offsets in hexadecimal
|
||
hexdump -C -n 512 <bin> > hexdump.out
|
||
hexdump -C <bin> | head #useful for finding signatures in the header
|
||
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
|
||
```
|
||
Da bi se procenio status enkripcije image-a, proverava se **entropija** pomoću `binwalk -E <bin>`. Niska entropija ukazuje na odsustvo enkripcije, dok visoka entropija sugeriše moguću enkripciju ili kompresiju.
|
||
|
||
Za izdvajanje **ugrađenih fajlova**, preporučuju se alati i resursi kao što su dokumentacija **file-data-carving-recovery-tools** i **binvis.io** za inspekciju fajlova.
|
||
|
||
### Izdvajanje datotečnog sistema
|
||
|
||
Korišćenjem `binwalk -ev <bin>` obično se može izdvojiti datotečni sistem, često u direktorijum nazvan prema tipu datotečnog sistema (npr. squashfs, ubifs). Međutim, kada **binwalk** ne uspe da prepozna tip datotečnog sistema zbog nedostajućih magic bytes, neophodno je ručno izdvajanje. To podrazumeva korišćenje `binwalk` za pronalaženje offseta datotečnog sistema, a zatim komande `dd` za izdvajanje datotečnog sistema:
|
||
```bash
|
||
$ binwalk DIR850L_REVB.bin
|
||
|
||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||
```
|
||
Nakon toga, u zavisnosti od tipa datotečnog sistema (npr. squashfs, cpio, jffs2, ubifs), koriste se različite komande za ručno izdvajanje sadržaja.
|
||
|
||
### Analiza datotečnog sistema
|
||
|
||
Kada je datotečni sistem izdvojen, započinje potraga za sigurnosnim propustima. Obratite pažnju na nesigurne mrežne daemone, hardkodovane kredencijale, API endpoints, funkcionalnosti update servera, nekompajlirani kod, startup scripts i kompajlirane binarne fajlove za offline analizu.
|
||
|
||
**Ključne lokacije** i **stavke** koje treba pregledati uključuju:
|
||
|
||
- **etc/shadow** i **etc/passwd** za korisničke kredencijale
|
||
- SSL sertifikati i ključevi u **etc/ssl**
|
||
- Konfiguracioni i skript fajlovi za potencijalne ranjivosti
|
||
- Ugrađeni binarni fajlovi za dalju analizu
|
||
- Uobičajeni IoT device web serveri i binarni fajlovi
|
||
|
||
Nekoliko alata pomaže u otkrivanju osetljivih informacija i ranjivosti unutar datotečnog sistema:
|
||
|
||
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) i [**Firmwalker**](https://github.com/craigz28/firmwalker) za pretragu osetljivih informacija
|
||
- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) za sveobuhvatnu analizu firmvera
|
||
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go), i [**EMBA**](https://github.com/e-m-b-a/emba) za statičku i dinamičku analizu
|
||
|
||
### Sigurnosne provere kompajliranih binarnih fajlova
|
||
|
||
I izvorni kod i kompajlirani binarni fajlovi pronađeni u datotečnom sistemu moraju biti pažljivo pregledani zbog ranjivosti. Alati poput **checksec.sh** za Unix binarne i **PESecurity** za Windows binarne pomažu u identifikaciji nezaštićenih binarnih fajlova koji bi mogli biti iskorišćeni.
|
||
|
||
## Emulacija firmvera za dinamičku analizu
|
||
|
||
Proces emulacije firmvera omogućava **dynamic analysis** rada uređaja ili pojedinačnog programa. Ovaj pristup može naići na probleme zbog hardverskih ili arhitektonskih zavisnosti, ali prebacivanje root datotečnog sistema ili specifičnih binarnih fajlova na uređaj sa odgovarajućom arhitekturom i redosledom bajtova (endianness), kao što je Raspberry Pi, ili na unapred pripremljenu virtuelnu mašinu, može olakšati dalja testiranja.
|
||
|
||
### Emulacija pojedinačnih binarnih fajlova
|
||
|
||
Za ispitivanje pojedinačnih programa, ključno je identifikovati redosled bajtova (endianness) programa i CPU arhitekturu.
|
||
|
||
#### Primer za MIPS arhitekturu
|
||
|
||
Za emulaciju MIPS arhitekture binarnog fajla može se koristiti komanda:
|
||
```bash
|
||
file ./squashfs-root/bin/busybox
|
||
```
|
||
I da instalirate neophodne alate za emulaciju:
|
||
```bash
|
||
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
|
||
```
|
||
For MIPS (big-endian), `qemu-mips` is used, and for little-endian binaries, `qemu-mipsel` would be the choice.
|
||
|
||
#### Emulacija ARM arhitekture
|
||
|
||
Za ARM binarne fajlove proces je sličan — za emulaciju se koristi emulator `qemu-arm`.
|
||
|
||
### Emulacija celog sistema
|
||
|
||
Alati kao što su [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) i drugi olakšavaju potpunu emulaciju firmware-a, automatizuju proces i pomažu pri dinamičkoj analizi.
|
||
|
||
## Dinamička analiza u praksi
|
||
|
||
U ovoj fazi za analizu se koristi stvarno ili emulirano uređajno okruženje. Neophodno je zadržati pristup shell-u OS-a i filesystem-u. Emulacija možda neće savršeno oponašati interakcije sa hardverom, pa će povremeni restarti emulacije biti potrebni. Analiza bi trebalo da ponovo pregleda filesystem, iskoristi izložene web-stranice i mrežne servise, i istraži ranjivosti bootloader-a. Testovi integriteta firmware-a su ključni za otkrivanje potencijalnih backdoor ranjivosti.
|
||
|
||
## Tehnike runtime analize
|
||
|
||
Runtime analiza podrazumeva interakciju sa procesom ili binarnim fajlom u njegovom okruženju za izvršavanje, koristeći alate kao što su gdb-multiarch, Frida i Ghidra za postavljanje breakpoints-a i identifikovanje ranjivosti kroz fuzzing i druge tehnike.
|
||
|
||
## Binary Exploitation and Proof-of-Concept
|
||
|
||
Razvijanje PoC-a za identifikovane ranjivosti zahteva duboko razumevanje ciljne arhitekture i programiranje u niskonivou jezicima. Binary runtime protections u embedded systems su retke, ali kada postoje, tehnike poput Return Oriented Programming (ROP) mogu biti neophodne.
|
||
|
||
## Pripremljeni operativni sistemi za analizu firmware-a
|
||
|
||
Operativni sistemi kao što su [AttifyOS](https://github.com/adi0x90/attifyos) i [EmbedOS](https://github.com/scriptingxss/EmbedOS) pružaju unapred konfigurisana okruženja za firmware security testing, opremljena potrebnim alatima.
|
||
|
||
## Pripremljeni OS-ovi za analizu firmware-a
|
||
|
||
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS je distro namenjen da pomogne pri security assessment i penetration testing Internet of Things (IoT) uređaja. Štedi vreme pružajući unapred konfigurisano okruženje sa svim neophodnim alatima.
|
||
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Embedded security testing operating system zasnovan na Ubuntu 18.04, unapred opremljen alatima za firmware security testing.
|
||
|
||
## Firmware downgrade napadi i nesigurni mehanizmi ažuriranja
|
||
|
||
Čak i kada proizvođač implementira kriptografske provere potpisa za firmware image-ove, **zaštita protiv version rollback (downgrade) često se izostavlja**. Ako boot- ili recovery-loader samo verifikuje potpis ugrađenim javnim ključem, ali ne upoređuje *verziju* (ili monotoni brojač) image-a koji se flash-uje, napadač može legitimno instalirati **stariji, ranjiv firmware koji i dalje nosi važeći potpis** i tako ponovo uneti ranjivosti koje su već bile ispravljene.
|
||
|
||
Tipični tok napada:
|
||
|
||
1. **Obtain an older signed image**
|
||
* Preuzmite ga sa javnog download portala proizvođača, CDN-a ili stranice za podršku.
|
||
* Ekstrahujte ga iz pratećih mobilnih/desktop aplikacija (npr. unutar Android APK-a pod `assets/firmware/`).
|
||
* Preuzmite ga iz repozitorijuma trećih strana kao što su VirusTotal, internet arhive, forumi, itd.
|
||
2. **Upload or serve the image to the device** via any exposed update channel:
|
||
* Web UI, mobile-app API, USB, TFTP, MQTT, etc.
|
||
* Mnogi consumer IoT uređaji izlažu *unauthenticated* HTTP(S) endpoint-e koji prihvataju Base64-encoded firmware blob-ove, dekodiraju ih server-side i pokreću recovery/upgrade.
|
||
3. Nakon downgrade-a, iskoristite ranjivost koja je ispravljena u novijem izdanju (na primer filter za command-injection koji je dodat kasnije).
|
||
4. Opcionalno ponovo flash-ujte najnoviji image ili onemogućite update-e da biste izbegli otkrivanje nakon uspostavljanja persistencije.
|
||
|
||
### Primer: Command Injection nakon downgrade-a
|
||
```http
|
||
POST /check_image_and_trigger_recovery?md5=1; echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...' >> /root/.ssh/authorized_keys HTTP/1.1
|
||
Host: 192.168.0.1
|
||
Content-Type: application/octet-stream
|
||
Content-Length: 0
|
||
```
|
||
U ranjivom (downgraded) firmveru, parametar `md5` se direktno ubacuje u shell komandu bez sanitizacije, što omogućava injekciju proizvoljnih komandi (ovde – omogućavanje SSH key-based root access). Kasnije verzije firmvera su uvele osnovni filter karaktera, ali nedostatak zaštite od downgrade čini tu ispravku neefikasnom.
|
||
|
||
### Ekstrakcija firmvera iz mobilnih aplikacija
|
||
|
||
Mnogi proizvođači uključuju pune firmware slike u svoje prateće mobilne aplikacije kako bi aplikacija mogla ažurirati uređaj preko Bluetooth/Wi‑Fi. Ti paketi se obično čuvaju nešifrovani u APK/APEX pod putanjama kao što su `assets/fw/` ili `res/raw/`. Alati poput `apktool`, `ghidra` ili čak običnog `unzip` omogućavaju vam da izvučete potpisane slike bez fizičkog pristupa hardveru.
|
||
```
|
||
$ apktool d vendor-app.apk -o vendor-app
|
||
$ ls vendor-app/assets/firmware
|
||
firmware_v1.3.11.490_signed.bin
|
||
```
|
||
### Kontrolna lista za procenu logike ažuriranja
|
||
|
||
* Da li je transport/autentifikacija *update endpoint*-a adekvatno zaštićena (TLS + autentifikacija)?
|
||
* Da li uređaj upoređuje **version numbers** ili **monotonic anti-rollback counter** pre flashing-a?
|
||
* Da li se image verifikuje unutar secure boot chain (npr. signatures checked by ROM code)?
|
||
* Da li userland code izvodi dodatne sanity checks (npr. allowed partition map, model number)?
|
||
* Da li *partial* ili *backup* update tokovi ponovo koriste istu validation logic?
|
||
|
||
> 💡 Ako bilo šta od navedenog nedostaje, platforma je verovatno ranjiva na rollback attacks.
|
||
|
||
## Ranjiv firmware za praksu
|
||
|
||
To practice discovering vulnerabilities in firmware, use the following vulnerable firmware projects as a starting point.
|
||
|
||
- OWASP IoTGoat
|
||
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
|
||
- The Damn Vulnerable Router Firmware Project
|
||
- [https://github.com/praetorian-code/DVRF](https://github.com/praetorian-code/DVRF)
|
||
- Damn Vulnerable ARM Router (DVAR)
|
||
- [https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html](https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html)
|
||
- ARM-X
|
||
- [https://github.com/therealsaumil/armx#downloads](https://github.com/therealsaumil/armx#downloads)
|
||
- Azeria Labs VM 2.0
|
||
- [https://azeria-labs.com/lab-vm-2-0/](https://azeria-labs.com/lab-vm-2-0/)
|
||
- Damn Vulnerable IoT Device (DVID)
|
||
- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID)
|
||
|
||
## Reference
|
||
|
||
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
|
||
- [Exploiting zero days in abandoned hardware – Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
|
||
|
||
## Trening i certifikati
|
||
|
||
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|