From a8640cf21c38b98cac170ec3c05418a0055b4408 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 13 Aug 2025 22:35:36 +0000 Subject: [PATCH] Translated ['src/hardware-physical-access/firmware-analysis/README.md', --- src/SUMMARY.md | 1 + .../firmware-analysis/README.md | 48 +++--- .../synology-encrypted-archive-decryption.md | 162 ++++++++++++++++++ src/pentesting-web/command-injection.md | 30 +++- 4 files changed, 217 insertions(+), 24 deletions(-) create mode 100644 src/hardware-physical-access/firmware-analysis/synology-encrypted-archive-decryption.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index bb1d3f659..0c1f23d74 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -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) diff --git a/src/hardware-physical-access/firmware-analysis/README.md b/src/hardware-physical-access/firmware-analysis/README.md index 5a77d6951..d69b86c96 100644 --- a/src/hardware-physical-access/firmware-analysis/README.md +++ b/src/hardware-physical-access/firmware-analysis/README.md @@ -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) та [Semmle’s LGTM](https://lgtm.com/#explore), пропонують безкоштовний статичний аналіз, який можна використовувати для виявлення потенційних проблем. +Для цієї мети **інструменти відкритої інформації (OSINT)** є безцінними, як і аналіз будь-яких доступних компонентів відкритого програмного забезпечення через ручні та автоматизовані процеси перевірки. Інструменти, такі як [Coverity Scan](https://scan.coverity.com) та [Semmle’s 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 strings -n8 @@ -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) diff --git a/src/hardware-physical-access/firmware-analysis/synology-encrypted-archive-decryption.md b/src/hardware-physical-access/firmware-analysis/synology-encrypted-archive-decryption.md new file mode 100644 index 000000000..fe5f7d1fb --- /dev/null +++ b/src/hardware-physical-access/firmware-analysis/synology-encrypted-archive-decryption.md @@ -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}} diff --git a/src/pentesting-web/command-injection.md b/src/pentesting-web/command-injection.md index 236e0f2d4..6211875ee 100644 --- a/src/pentesting-web/command-injection.md +++ b/src/pentesting-web/command-injection.md @@ -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}}