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/README.md',
This commit is contained in:
parent
7deb6b0c3e
commit
a8640cf21c
@ -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)
|
||||
|
||||
@ -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 <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)
|
||||
|
||||
@ -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}}
|
||||
@ -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}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user