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

This commit is contained in:
Translator 2025-08-13 22:35:36 +00:00
parent 7deb6b0c3e
commit a8640cf21c
4 changed files with 217 additions and 24 deletions

View File

@ -769,6 +769,7 @@
- [Ret2vDSO](binary-exploitation/rop-return-oriented-programing/ret2vdso.md)
- [SROP - Sigreturn-Oriented Programming](binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/README.md)
- [SROP - ARM64](binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/srop-arm64.md)
- [Synology Encrypted Archive Decryption](hardware-physical-access/firmware-analysis/synology-encrypted-archive-decryption.md)
- [Array Indexing](binary-exploitation/array-indexing.md)
- [Chrome Exploiting](binary-exploitation/chrome-exploiting.md)
- [Integer Overflow](binary-exploitation/integer-overflow.md)

View File

@ -1,12 +1,18 @@
# Аналіз ПЗ
# Firmware Analysis
{{#include ../../banners/hacktricks-training.md}}
## **Вступ**
## **Introduction**
ПЗ є основним програмним забезпеченням, яке дозволяє пристроям працювати правильно, керуючи та полегшуючи зв'язок між апаратними компонентами та програмним забезпеченням, з яким взаємодіють користувачі. Воно зберігається в постійній пам'яті, що забезпечує доступ пристрою до важливих інструкцій з моменту його увімкнення, що призводить до запуску операційної системи. Аналіз та потенційне модифікування ПЗ є критичним кроком у виявленні вразливостей безпеки.
### Related resources
## **Збір інформації**
{{#ref}}
synology-encrypted-archive-decryption.md
{{#endref}}
Прошивка є основним програмним забезпеченням, яке дозволяє пристроям працювати правильно, керуючи та полегшуючи зв'язок між апаратними компонентами та програмним забезпеченням, з яким взаємодіють користувачі. Вона зберігається в постійній пам'яті, що забезпечує доступ пристрою до важливих інструкцій з моменту його ввімкнення, що призводить до запуску операційної системи. Аналіз та потенційне модифікування прошивки є критичним кроком у виявленні вразливостей безпеки.
## **Gathering Information**
**Збір інформації** є критично важливим початковим кроком у розумінні складу пристрою та технологій, які він використовує. Цей процес включає збір даних про:
@ -19,27 +25,27 @@
- Архітектурні та потокові діаграми
- Оцінки безпеки та виявлені вразливості
Для цієї мети **інструменти відкритих даних (OSINT)** є безцінними, як і аналіз будь-яких доступних компонентів відкритого програмного забезпечення через ручні та автоматизовані процеси перевірки. Інструменти, такі як [Coverity Scan](https://scan.coverity.com) та [Semmles LGTM](https://lgtm.com/#explore), пропонують безкоштовний статичний аналіз, який можна використовувати для виявлення потенційних проблем.
Для цієї мети **інструменти відкритої інформації (OSINT)** є безцінними, як і аналіз будь-яких доступних компонентів відкритого програмного забезпечення через ручні та автоматизовані процеси перевірки. Інструменти, такі як [Coverity Scan](https://scan.coverity.com) та [Semmles LGTM](https://lgtm.com/#explore), пропонують безкоштовний статичний аналіз, який можна використовувати для виявлення потенційних проблем.
## **Отримання ПЗ**
## **Acquiring the Firmware**
Отримання ПЗ можна здійснити різними способами, кожен з яких має свій рівень складності:
Отримання прошивки можна здійснити різними способами, кожен з яких має свій рівень складності:
- **Безпосередньо** від джерела (розробників, виробників)
- **Створення** його з наданих інструкцій
- **Створення** її з наданих інструкцій
- **Завантаження** з офіційних сайтів підтримки
- Використання **Google dork** запитів для знаходження розміщених файлів ПЗ
- Використання **Google dork** запитів для знаходження розміщених файлів прошивки
- Доступ до **хмарного сховища** безпосередньо, за допомогою інструментів, таких як [S3Scanner](https://github.com/sa7mon/S3Scanner)
- Перехоплення **оновлень** за допомогою технік "людина посередині"
- **Витягування** з пристрою через з'єднання, такі як **UART**, **JTAG** або **PICit**
- **Сниффінг** запитів на оновлення в межах зв'язку пристрою
- **Перехоплення** запитів на оновлення в межах зв'язку пристрою
- Виявлення та використання **жорстко закодованих кінцевих точок оновлень**
- **Скидання** з завантажувача або мережі
- **Видалення та читання** чіпа пам'яті, коли всі інші способи не спрацювали, використовуючи відповідні апаратні інструменти
## Аналіз ПЗ
## Analyzing the firmware
Тепер, коли ви **маєте ПЗ**, вам потрібно витягти інформацію про нього, щоб знати, як з ним працювати. Різні інструменти, які ви можете використовувати для цього:
Тепер, коли ви **маєте прошивку**, вам потрібно витягти інформацію про неї, щоб знати, як з нею працювати. Різні інструменти, які ви можете використовувати для цього:
```bash
file <bin>
strings -n8 <bin>
@ -144,7 +150,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
Після витягування файлової системи починається пошук вразливостей безпеки. Увага приділяється небезпечним мережевим демонів, жорстко закодованим обліковим даним, API-інтерфейсам, функціональності серверів оновлень, некомпільованому коду, скриптам запуску та скомпільованим двійковим файлам для офлайн-аналізу.
**Ключові місця** та **елементи**, які потрібно перевірити, включають:
**Ключові місця** та **елементи** для перевірки включають:
- **etc/shadow** та **etc/passwd** для облікових даних користувачів
- SSL сертифікати та ключі в **etc/ssl**
@ -180,7 +186,7 @@ file ./squashfs-root/bin/busybox
```bash
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
```
Для MIPS (big-endian) використовується `qemu-mips`, а для little-endian бінарних файлів вибір буде `qemu-mipsel`.
Для MIPS (big-endian) використовується `qemu-mips`, а для little-endian бінарних файлів вибирається `qemu-mipsel`.
#### Емуляція архітектури ARM
@ -192,11 +198,11 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
## Динамічний аналіз на практиці
На цьому етапі використовується реальне або емульоване середовище пристрою для аналізу. Важливо підтримувати доступ до оболонки ОС та файлової системи. Емуляція може не ідеально відтворювати взаємодію з апаратним забезпеченням, що потребує періодичних перезапусків емуляції. Аналіз має повторно перевіряти файлову систему, експлуатувати відкриті веб-сторінки та мережеві сервіси, а також досліджувати вразливості завантажувача. Тести цілісності прошивки є критично важливими для виявлення потенційних вразливостей бекдору.
На цьому етапі використовується реальне або емульоване середовище пристрою для аналізу. Важливо підтримувати доступ до оболонки ОС та файлової системи. Емуляція може не ідеально відтворювати взаємодію з апаратним забезпеченням, що потребує періодичних перезапусків емуляції. Аналіз має повторно перевіряти файлову систему, експлуатувати відкриті веб-сторінки та мережеві сервіси, а також досліджувати вразливості завантажувача. Тести цілісності прошивки є критично важливими для виявлення потенційних вразливостей бекдорів.
## Техніки аналізу в режимі виконання
## Техніки аналізу в реальному часі
Аналіз в режимі виконання передбачає взаємодію з процесом або бінарним файлом у його операційному середовищі, використовуючи інструменти, такі як gdb-multiarch, Frida та Ghidra для встановлення точок зупинки та виявлення вразливостей через фуззинг та інші техніки.
Аналіз в реальному часі передбачає взаємодію з процесом або бінарним файлом у його операційному середовищі, використовуючи інструменти, такі як gdb-multiarch, Frida та Ghidra для встановлення точок зупинки та виявлення вразливостей через фуззинг та інші техніки.
## Експлуатація бінарних файлів та доказ концепції
@ -234,11 +240,11 @@ Host: 192.168.0.1
Content-Type: application/octet-stream
Content-Length: 0
```
У вразливому (зниженому) прошивці параметр `md5` безпосередньо конкатенується в команду оболонки без санітизації, що дозволяє ін'єкцію довільних команд (тут увімкнення доступу до root через SSH за допомогою ключа). Пізніші версії прошивки впровадили базовий фільтр символів, але відсутність захисту від зниження версії робить виправлення недійсним.
У вразливому (зниженому) прошивці параметр `md5` безпосередньо конкатенується в команду оболонки без санітизації, що дозволяє ін'єкцію довільних команд (тут увімкнення доступу до root через SSH з використанням ключа). Пізніші версії прошивки впровадили базовий фільтр символів, але відсутність захисту від зниження версії робить виправлення недійсним.
### Витягування прошивки з мобільних додатків
Багато постачальників об'єднують повні образи прошивки всередині своїх супутніх мобільних додатків, щоб додаток міг оновлювати пристрій через Bluetooth/Wi-Fi. Ці пакети зазвичай зберігаються незашифрованими в APK/APEX під шляхами, такими як `assets/fw/` або `res/raw/`. Інструменти, такі як `apktool`, `ghidra` або навіть простий `unzip`, дозволяють вам витягувати підписані образи, не торкаючись фізичного обладнання.
Багато постачальників об'єднують повні образи прошивки всередині своїх супутніх мобільних додатків, щоб додаток міг оновлювати пристрій через 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
@ -248,7 +254,7 @@ firmware_v1.3.11.490_signed.bin
* Чи адекватно захищений транспорт/автентифікація *кінцевої точки оновлення* (TLS + автентифікація)?
* Чи порівнює пристрій **номери версій** або **монотонний анти-ролбек лічильник** перед прошивкою?
* Чи перевіряється образ у безпечному завантажувальному ланцюзі (наприклад, підписи перевіряються кодом ROM)?
* Чи перевіряється образ у безпечному ланцюзі завантаження (наприклад, підписи перевіряються кодом ROM)?
* Чи виконує код користувацького простору додаткові перевірки (наприклад, дозволена карта розділів, номер моделі)?
* Чи використовують *часткові* або *резервні* потоки оновлення ту ж саму логіку валідації?
@ -256,7 +262,7 @@ firmware_v1.3.11.490_signed.bin
## Вразливе ПЗ для практики
Щоб практикуватися у виявленні вразливостей у ПЗ, використовуйте наступні вразливі проекти ПЗ як відправну точку.
Щоб практикуватися у виявленні вразливостей у прошивці, використовуйте наступні вразливі проекти прошивки як відправну точку.
- OWASP IoTGoat
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)

View File

@ -0,0 +1,162 @@
# Synology PAT/SPK Encrypted Archive Decryption
{{#include ../../banners/hacktricks-training.md}}
## Огляд
Кілька пристроїв Synology (DSM/BSM NAS, BeeStation тощо) розповсюджують своє програмне забезпечення та пакети додатків у **зашифрованих архівах PAT / SPK**. Ці архіви можна розшифрувати *офлайн* лише за допомогою публічних файлів завантаження завдяки вбудованим у офіційні бібліотеки розпакування жорстко закодованим ключам.
Ця сторінка документує, крок за кроком, як працює зашифрований формат і як повністю відновити відкритий текст **TAR**, що знаходиться всередині кожного пакета. Процедура базується на дослідженнях Synacktiv, проведених під час Pwn2Own Ireland 2024, і реалізована в інструменті з відкритим кодом [`synodecrypt`](https://github.com/synacktiv/synodecrypt).
> ⚠️ Формат абсолютно однаковий для архівів `*.pat` (оновлення системи) та `*.spk` (додаток) вони лише відрізняються парою жорстко закодованих ключів, які вибираються.
---
## 1. Завантажте архів
Оновлення програмного забезпечення/додатків зазвичай можна завантажити з публічного порталу Synology:
```bash
$ wget https://archive.synology.com/download/Os/BSM/BSM_BST150-4T_65374.pat
```
## 2. Вивантажте структуру PAT (необов'язково)
`*.pat` зображення є **cpio пакетом**, який вміщує кілька файлів (завантажувач, ядро, rootfs, пакети…). Безкоштовна утиліта [`patology`](https://github.com/sud0woodo/patology) зручна для перевірки цього обгортання:
```bash
$ python3 patology.py --dump -i BSM_BST150-4T_65374.pat
[…]
$ ls
DiskCompatibilityDB.tar hda1.tgz rd.bin packages/ …
```
Для `*.spk` ви можете безпосередньо перейти до кроку 3.
## 3. Витягніть бібліотеки витягання Synology
Справжня логіка розшифровки знаходиться в:
* `/usr/syno/sbin/synoarchive` → основна обгортка CLI
* `/usr/lib/libsynopkg.so.1` → викликає обгортку з інтерфейсу DSM
* `libsynocodesign.so` → **містить криптографічну реалізацію**
Обидва бінарні файли присутні в кореневій файловій системі (`hda1.tgz`) **і** в стиснутому init-rd (`rd.bin`). Якщо у вас є тільки PAT, ви можете отримати їх таким чином:
```bash
# rd.bin is LZMA-compressed CPIO
$ lzcat rd.bin | cpio -id 2>/dev/null
$ file usr/lib/libsynocodesign.so
usr/lib/libsynocodesign.so: ELF 64-bit LSB shared object, ARM aarch64, …
```
## 4. Відновлення жорстко закодованих ключів (`get_keys`)
Всередині `libsynocodesign.so` функція `get_keys(int keytype)` просто повертає дві 128-бітні глобальні змінні для запитуваної архівної родини:
```c
case 0: // PAT (system)
case 10:
case 11:
signature_key = qword_23A40;
master_key = qword_23A68;
break;
case 3: // SPK (applications)
signature_key = qword_23AE0;
master_key = qword_23B08;
break;
```
* **signature_key** → Ed25519 публічний ключ, що використовується для перевірки заголовка архіву.
* **master_key** → Кореневий ключ, що використовується для отримання ключа шифрування для кожного архіву.
Вам потрібно скинути ці два константи лише один раз для кожної основної версії DSM.
## 5. Структура заголовка та перевірка підпису
`synoarchive_open()``support_format_synoarchive()``archive_read_support_format_synoarchive()` виконує наступне:
1. Прочитати магічне число (3 байти) `0xBFBAAD` **або** `0xADBEEF`.
2. Прочитати 32-бітне `header_len` у малому порядку.
3. Прочитати `header_len` байтів + наступний **0x40-байтовий Ed25519 підпис**.
4. Ітерація по всіх вбудованих публічних ключах, поки `crypto_sign_verify_detached()` не завершиться успішно.
5. Декодувати заголовок за допомогою **MessagePack**, отримуючи:
```python
[
data: bytes,
entries: [ [size: int, sha256: bytes], … ],
archive_description: bytes,
serial_number: [bytes],
not_valid_before: int
]
```
`entries` пізніше дозволяє libarchive перевіряти цілісність кожного файлу під час його розшифровки.
## 6. Виведення підключа ключа для архіву
З `data` блобу, що міститься в заголовку MessagePack:
* `subkey_id` = little-endian `uint64` за зсувом 0x10
* `ctx` = 7 байт за зсувом 0x18
32-байтовий **ключ потоку** отримується за допомогою libsodium:
```c
crypto_kdf_derive_from_key(kdf_subkey, 32, subkey_id, ctx, master_key);
```
## 7. Кастомний **libarchive** бекенд Synology
Synology включає патчений libarchive, який реєструє фальшивий формат "tar", коли магічне число дорівнює `0xADBEEF`:
```c
register_format(
"tar", spk_bid, spk_options,
spk_read_header, spk_read_data, spk_read_data_skip,
NULL, spk_cleanup, NULL, NULL);
```
### spk_read_header()
```
- Read 0x200 bytes
- nonce = buf[0:0x18]
- cipher = buf[0x18:0x18+0x193]
- crypto_secretstream_xchacha20poly1305_init_pull(state, nonce, kdf_subkey)
- crypto_secretstream_xchacha20poly1305_pull(state, tar_hdr, …, cipher, 0x193)
```
Розшифрований `tar_hdr` є **класичним заголовком POSIX TAR**.
### spk_read_data()
```
while (remaining > 0):
chunk_len = min(0x400000, remaining) + 0x11 # +tag
buf = archive_read_ahead(chunk_len)
crypto_secretstream_xchacha20poly1305_pull(state, out, …, buf, chunk_len)
remaining -= chunk_len - 0x11
```
Кожен **0x18-байтовий nonce** додається перед зашифрованим фрагментом.
Після обробки всіх записів libarchive створює абсолютно дійсний **`.tar`**, який можна розпакувати за допомогою будь-якого стандартного інструменту.
## 8. Розшифруйте все за допомогою synodecrypt
```bash
$ python3 synodecrypt.py SynologyPhotos-rtd1619b-1.7.0-0794.spk
[+] found matching keys (SPK)
[+] header signature verified
[+] 104 entries
[+] archive successfully decrypted → SynologyPhotos-rtd1619b-1.7.0-0794.tar
$ tar xf SynologyPhotos-rtd1619b-1.7.0-0794.tar
```
`synodecrypt` автоматично виявляє PAT/SPK, завантажує правильні ключі та застосовує повний ланцюг, описаний вище.
## 9. Загальні помилки
* Не **міняйте** `signature_key` та `master_key` вони виконують різні функції.
* **nonce** йде *перед* шифротекстом для кожного блоку (заголовок і дані).
* Максимальний розмір зашифрованого фрагмента становить **0x400000 + 0x11** (мітка libsodium).
* Архіви, створені для одного покоління DSM, можуть перейти на інші жорстко закодовані ключі в наступному випуску.
## 10. Додаткові інструменти
* [`patology`](https://github.com/sud0woodo/patology) парсити/вивантажувати архіви PAT.
* [`synodecrypt`](https://github.com/synacktiv/synodecrypt) розшифровувати PAT/SPK/інше.
* [`libsodium`](https://github.com/jedisct1/libsodium) референсна реалізація XChaCha20-Poly1305 secretstream.
* [`msgpack`](https://msgpack.org/) серіалізація заголовків.
## Посилання
- [Extraction of Synology encrypted archives Synacktiv (Pwn2Own IE 2024)](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html)
- [synodecrypt on GitHub](https://github.com/synacktiv/synodecrypt)
- [patology on GitHub](https://github.com/sud0woodo/patology)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -31,7 +31,7 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful
```
### **Обхід** обмежень
Якщо ви намагаєтеся виконати **произвольні команди всередині linux машини**, вам буде цікаво прочитати про ці **обходи:**
Якщо ви намагаєтеся виконати **произвольні команди всередині linux машини**, вам буде цікаво прочитати про ці **Обходи:**
{{#ref}}
../linux-hardening/bypass-bash-restrictions/
@ -75,7 +75,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod
```
### Часова ексфільтрація даних
Витягування даних: по одному символу
Витягування даних: символ за символом
```
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
real 0m5.007s
@ -87,7 +87,7 @@ real 0m0.002s
user 0m0.000s
sys 0m0.000s
```
### DNS на основі ексфільтрації даних
### DNS based data exfiltration
На основі інструменту з `https://github.com/HoLyVieR/dnsbin`, також розміщеного на dnsbin.zhack.ca
```
@ -117,6 +117,28 @@ powershell C:**2\n??e*d.*? # notepad
../linux-hardening/bypass-bash-restrictions/
{{#endref}}
### Node.js `child_process.exec` проти `execFile`
Коли ви перевіряєте бекенди JavaScript/TypeScript, ви часто будете стикатися з API Node.js `child_process`.
```javascript
// Vulnerable: user-controlled variables interpolated inside a template string
const { exec } = require('child_process');
exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(payload)}'`, (err, stdout) => {
/* … */
});
```
`exec()` створює **shell** (`/bin/sh -c`), тому будь-який символ, який має спеціальне значення для shell (зворотні лапки, `;`, `&&`, `|`, `$()`, …) призведе до **впровадження команди**, коли введення користувача конкатенується в рядок.
**Зменшення ризику:** використовуйте `execFile()` (або `spawn()` без параметра `shell`) і надайте **кожен аргумент як окремий елемент масиву**, щоб shell не був залучений:
```javascript
const { execFile } = require('child_process');
execFile('/usr/bin/do-something', [
'--id_user', id_user,
'--payload', JSON.stringify(payload)
]);
```
Справжній випадок: *Synology Photos* ≤ 1.7.0-0794 був вразливим через неавтентифіковану подію WebSocket, яка вставляла дані, контрольовані зловмисником, у `id_user`, що пізніше було вбудовано в виклик `exec()`, досягаючи RCE (Pwn2Own Ireland 2024).
## Список виявлення грубої сили
{{#ref}}
@ -125,7 +147,9 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_inject
## Посилання
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection)
- [https://portswigger.net/web-security/os-command-injection](https://portswigger.net/web-security/os-command-injection)
- [Extraction of Synology encrypted archives Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html)
{{#include ../banners/hacktricks-training.md}}