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
128388c8bb
commit
3f3a1e1741
@ -769,6 +769,7 @@
|
|||||||
- [Ret2vDSO](binary-exploitation/rop-return-oriented-programing/ret2vdso.md)
|
- [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 - 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)
|
- [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)
|
- [Array Indexing](binary-exploitation/array-indexing.md)
|
||||||
- [Chrome Exploiting](binary-exploitation/chrome-exploiting.md)
|
- [Chrome Exploiting](binary-exploitation/chrome-exploiting.md)
|
||||||
- [Integer Overflow](binary-exploitation/integer-overflow.md)
|
- [Integer Overflow](binary-exploitation/integer-overflow.md)
|
||||||
|
|||||||
@ -4,6 +4,12 @@
|
|||||||
|
|
||||||
## **Introdução**
|
## **Introdução**
|
||||||
|
|
||||||
|
### Recursos relacionados
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
synology-encrypted-archive-decryption.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
Firmware é um software essencial que permite que dispositivos operem corretamente, gerenciando e facilitando a comunicação entre os componentes de hardware e o software com o qual os usuários interagem. Ele é armazenado em memória permanente, garantindo que o dispositivo possa acessar instruções vitais desde o momento em que é ligado, levando ao lançamento do sistema operacional. Examinar e potencialmente modificar o firmware é um passo crítico na identificação de vulnerabilidades de segurança.
|
Firmware é um software essencial que permite que dispositivos operem corretamente, gerenciando e facilitando a comunicação entre os componentes de hardware e o software com o qual os usuários interagem. Ele é armazenado em memória permanente, garantindo que o dispositivo possa acessar instruções vitais desde o momento em que é ligado, levando ao lançamento do sistema operacional. Examinar e potencialmente modificar o firmware é um passo crítico na identificação de vulnerabilidades de segurança.
|
||||||
|
|
||||||
## **Coleta de Informações**
|
## **Coleta de Informações**
|
||||||
@ -13,7 +19,7 @@ Firmware é um software essencial que permite que dispositivos operem corretamen
|
|||||||
- A arquitetura da CPU e o sistema operacional que ele executa
|
- A arquitetura da CPU e o sistema operacional que ele executa
|
||||||
- Especificações do bootloader
|
- Especificações do bootloader
|
||||||
- Layout de hardware e folhas de dados
|
- Layout de hardware e folhas de dados
|
||||||
- Métricas da base de código e locais de origem
|
- Métricas de código e locais de origem
|
||||||
- Bibliotecas externas e tipos de licença
|
- Bibliotecas externas e tipos de licença
|
||||||
- Históricos de atualização e certificações regulatórias
|
- Históricos de atualização e certificações regulatórias
|
||||||
- Diagramas arquitetônicos e de fluxo
|
- Diagramas arquitetônicos e de fluxo
|
||||||
@ -148,7 +154,7 @@ Com o sistema de arquivos extraído, a busca por falhas de segurança começa. A
|
|||||||
|
|
||||||
- **etc/shadow** e **etc/passwd** para credenciais de usuário
|
- **etc/shadow** e **etc/passwd** para credenciais de usuário
|
||||||
- Certificados e chaves SSL em **etc/ssl**
|
- Certificados e chaves SSL em **etc/ssl**
|
||||||
- Arquivos de configuração e scripts em busca de vulnerabilidades potenciais
|
- Arquivos de configuração e scripts para potenciais vulnerabilidades
|
||||||
- Binários incorporados para análise adicional
|
- Binários incorporados para análise adicional
|
||||||
- Servidores web e binários comuns de dispositivos IoT
|
- Servidores web e binários comuns de dispositivos IoT
|
||||||
|
|
||||||
@ -164,7 +170,7 @@ Tanto o código-fonte quanto os binários compilados encontrados no sistema de a
|
|||||||
|
|
||||||
## Emulando Firmware para Análise Dinâmica
|
## Emulando Firmware para Análise Dinâmica
|
||||||
|
|
||||||
O processo de emular firmware permite **análise dinâmica** tanto da operação de um dispositivo quanto de um programa individual. Essa abordagem pode enfrentar desafios com dependências de hardware ou arquitetura, mas transferir o sistema de arquivos raiz ou binários específicos para um dispositivo com arquitetura e endianness correspondentes, como um Raspberry Pi, ou para uma máquina virtual pré-construída, pode facilitar testes adicionais.
|
O processo de emular firmware permite a **análise dinâmica** tanto da operação de um dispositivo quanto de um programa individual. Essa abordagem pode enfrentar desafios com dependências de hardware ou arquitetura, mas transferir o sistema de arquivos raiz ou binários específicos para um dispositivo com arquitetura e endianness correspondentes, como um Raspberry Pi, ou para uma máquina virtual pré-construída, pode facilitar testes adicionais.
|
||||||
|
|
||||||
### Emulando Binários Individuais
|
### Emulando Binários Individuais
|
||||||
|
|
||||||
@ -188,7 +194,7 @@ Para binários ARM, o processo é semelhante, com o emulador `qemu-arm` sendo ut
|
|||||||
|
|
||||||
### Emulação de Sistema Completo
|
### Emulação de Sistema Completo
|
||||||
|
|
||||||
Ferramentas como [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) e outras, facilitam a emulação completa de firmware, automatizando o processo e auxiliando na análise dinâmica.
|
Ferramentas como [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) e outras, facilitam a emulação completa de firmware, automatizando o processo e ajudando na análise dinâmica.
|
||||||
|
|
||||||
## Análise Dinâmica na Prática
|
## Análise Dinâmica na Prática
|
||||||
|
|
||||||
@ -221,7 +227,7 @@ Fluxo de ataque típico:
|
|||||||
* Pegue-a do portal de download público do fornecedor, CDN ou site de suporte.
|
* Pegue-a do portal de download público do fornecedor, CDN ou site de suporte.
|
||||||
* Extraia-a de aplicativos móveis/escrita acompanhantes (por exemplo, dentro de um APK Android em `assets/firmware/`).
|
* Extraia-a de aplicativos móveis/escrita acompanhantes (por exemplo, dentro de um APK Android em `assets/firmware/`).
|
||||||
* Recupere-a de repositórios de terceiros, como VirusTotal, arquivos da Internet, fóruns, etc.
|
* Recupere-a de repositórios de terceiros, como VirusTotal, arquivos da Internet, fóruns, etc.
|
||||||
2. **Carregar ou servir a imagem para o dispositivo** através de qualquer canal de atualização exposto:
|
2. **Carregar ou servir a imagem para o dispositivo** via qualquer canal de atualização exposto:
|
||||||
* UI da Web, API de aplicativo móvel, USB, TFTP, MQTT, etc.
|
* UI da Web, API de aplicativo móvel, USB, TFTP, MQTT, etc.
|
||||||
* Muitos dispositivos IoT de consumo expõem endpoints HTTP(S) *não autenticados* que aceitam blobs de firmware codificados em Base64, decodificam-nos no lado do servidor e acionam a recuperação/atualização.
|
* Muitos dispositivos IoT de consumo expõem endpoints HTTP(S) *não autenticados* que aceitam blobs de firmware codificados em Base64, decodificam-nos no lado do servidor e acionam a recuperação/atualização.
|
||||||
3. Após o downgrade, explore uma vulnerabilidade que foi corrigida na versão mais nova (por exemplo, um filtro de injeção de comando que foi adicionado posteriormente).
|
3. Após o downgrade, explore uma vulnerabilidade que foi corrigida na versão mais nova (por exemplo, um filtro de injeção de comando que foi adicionado posteriormente).
|
||||||
@ -234,7 +240,7 @@ Host: 192.168.0.1
|
|||||||
Content-Type: application/octet-stream
|
Content-Type: application/octet-stream
|
||||||
Content-Length: 0
|
Content-Length: 0
|
||||||
```
|
```
|
||||||
No firmware vulnerável (rebaixado), o parâmetro `md5` é concatenado diretamente em um comando shell sem sanitização, permitindo a injeção de comandos arbitrários (aqui – habilitando o acesso root baseado em chave SSH). Versões posteriores do firmware introduziram um filtro básico de caracteres, mas a ausência de proteção contra rebaixamento torna a correção irrelevante.
|
No firmware vulnerável (rebaixado), o parâmetro `md5` é concatenado diretamente em um comando de shell sem sanitização, permitindo a injeção de comandos arbitrários (aqui – habilitando o acesso root baseado em chave SSH). Versões posteriores do firmware introduziram um filtro básico de caracteres, mas a ausência de proteção contra rebaixamento torna a correção irrelevante.
|
||||||
|
|
||||||
### Extraindo Firmware de Aplicativos Móveis
|
### Extraindo Firmware de Aplicativos Móveis
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,162 @@
|
|||||||
|
# Synology PAT/SPK Encrypted Archive Decryption
|
||||||
|
|
||||||
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Vários dispositivos Synology (DSM/BSM NAS, BeeStation, …) distribuem seu firmware e pacotes de aplicativos em **arquivos PAT / SPK criptografados**. Esses arquivos podem ser descriptografados *offline* com nada além dos arquivos de download públicos, graças a chaves codificadas embutidas dentro das bibliotecas de extração oficiais.
|
||||||
|
|
||||||
|
Esta página documenta, passo a passo, como o formato criptografado funciona e como recuperar completamente o **TAR** em texto claro que está dentro de cada pacote. O procedimento é baseado na pesquisa da Synacktiv realizada durante o Pwn2Own Irlanda 2024 e implementado na ferramenta de código aberto [`synodecrypt`](https://github.com/synacktiv/synodecrypt).
|
||||||
|
|
||||||
|
> ⚠️ O formato é exatamente o mesmo para os arquivos `*.pat` (atualização do sistema) e `*.spk` (aplicativo) – eles diferem apenas no par de chaves codificadas que são selecionadas.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Grab the archive
|
||||||
|
|
||||||
|
A atualização do firmware/aplicativo pode normalmente ser baixada do portal público da Synology:
|
||||||
|
```bash
|
||||||
|
$ wget https://archive.synology.com/download/Os/BSM/BSM_BST150-4T_65374.pat
|
||||||
|
```
|
||||||
|
## 2. Despeje a estrutura PAT (opcional)
|
||||||
|
|
||||||
|
`*.pat` imagens são, elas mesmas, um **pacote cpio** que incorpora vários arquivos (carregador de inicialização, kernel, rootfs, pacotes…). A ferramenta gratuita [`patology`](https://github.com/sud0woodo/patology) é conveniente para inspecionar esse wrapper:
|
||||||
|
```bash
|
||||||
|
$ python3 patology.py --dump -i BSM_BST150-4T_65374.pat
|
||||||
|
[…]
|
||||||
|
$ ls
|
||||||
|
DiskCompatibilityDB.tar hda1.tgz rd.bin packages/ …
|
||||||
|
```
|
||||||
|
Para `*.spk` você pode pular diretamente para o passo 3.
|
||||||
|
|
||||||
|
## 3. Extraia as bibliotecas de extração da Synology
|
||||||
|
|
||||||
|
A verdadeira lógica de descriptografia está em:
|
||||||
|
|
||||||
|
* `/usr/syno/sbin/synoarchive` → wrapper CLI principal
|
||||||
|
* `/usr/lib/libsynopkg.so.1` → chama o wrapper da interface do DSM
|
||||||
|
* `libsynocodesign.so` → **contém a implementação criptográfica**
|
||||||
|
|
||||||
|
Ambos os binários estão presentes no rootfs do sistema (`hda1.tgz`) **e** no init-rd comprimido (`rd.bin`). Se você tiver apenas o PAT, pode obtê-los desta forma:
|
||||||
|
```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. Recuperar as chaves codificadas (`get_keys`)
|
||||||
|
|
||||||
|
Dentro de `libsynocodesign.so`, a função `get_keys(int keytype)` simplesmente retorna duas variáveis globais de 128 bits para a família de arquivos solicitada:
|
||||||
|
```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** → Chave pública Ed25519 usada para verificar o cabeçalho do arquivo.
|
||||||
|
* **master_key** → Chave raiz usada para derivar a chave de criptografia por arquivo.
|
||||||
|
|
||||||
|
Você só precisa despejar essas duas constantes uma vez para cada versão principal do DSM.
|
||||||
|
|
||||||
|
## 5. Estrutura do cabeçalho e verificação de assinatura
|
||||||
|
|
||||||
|
`synoarchive_open()` → `support_format_synoarchive()` → `archive_read_support_format_synoarchive()` realiza o seguinte:
|
||||||
|
|
||||||
|
1. Ler mágica (3 bytes) `0xBFBAAD` **ou** `0xADBEEF`.
|
||||||
|
2. Ler little-endian 32-bit `header_len`.
|
||||||
|
3. Ler `header_len` bytes + a próxima **assinatura Ed25519 de 0x40 bytes**.
|
||||||
|
4. Iterar sobre todas as chaves públicas incorporadas até que `crypto_sign_verify_detached()` tenha sucesso.
|
||||||
|
5. Decodificar o cabeçalho com **MessagePack**, resultando em:
|
||||||
|
```python
|
||||||
|
[
|
||||||
|
data: bytes,
|
||||||
|
entries: [ [size: int, sha256: bytes], … ],
|
||||||
|
archive_description: bytes,
|
||||||
|
serial_number: [bytes],
|
||||||
|
not_valid_before: int
|
||||||
|
]
|
||||||
|
```
|
||||||
|
`entries` permite que o libarchive verifique a integridade de cada arquivo à medida que é descriptografado.
|
||||||
|
|
||||||
|
## 6. Derivar a sub-chave por arquivo
|
||||||
|
|
||||||
|
A partir do blob `data` contido no cabeçalho MessagePack:
|
||||||
|
|
||||||
|
* `subkey_id` = little-endian `uint64` no deslocamento 0x10
|
||||||
|
* `ctx` = 7 bytes no deslocamento 0x18
|
||||||
|
|
||||||
|
A chave de **stream** de 32 bytes é obtida com libsodium:
|
||||||
|
```c
|
||||||
|
crypto_kdf_derive_from_key(kdf_subkey, 32, subkey_id, ctx, master_key);
|
||||||
|
```
|
||||||
|
## 7. Backend **libarchive** personalizado da Synology
|
||||||
|
|
||||||
|
A Synology agrupa uma libarchive corrigida que registra um formato "tar" falso sempre que o magic é `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)
|
||||||
|
```
|
||||||
|
O `tar_hdr` descriptografado é um **cabeçalho TAR POSIX clássico**.
|
||||||
|
|
||||||
|
### 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
|
||||||
|
```
|
||||||
|
Cada **nonce de 0x18 bytes** é precedido ao bloco criptografado.
|
||||||
|
|
||||||
|
Uma vez que todas as entradas são processadas, libarchive produz um **`.tar`** perfeitamente válido que pode ser descompactado com qualquer ferramenta padrão.
|
||||||
|
|
||||||
|
## 8. Decrypt everything with 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` detecta automaticamente PAT/SPK, carrega as chaves corretas e aplica toda a cadeia descrita acima.
|
||||||
|
|
||||||
|
## 9. Armadilhas comuns
|
||||||
|
|
||||||
|
* Não troque `signature_key` e `master_key` – eles servem a propósitos diferentes.
|
||||||
|
* O **nonce** vem *antes* do texto cifrado para cada bloco (cabeçalho e dados).
|
||||||
|
* O tamanho máximo do bloco criptografado é **0x400000 + 0x11** (tag libsodium).
|
||||||
|
* Arquivos criados para uma geração do DSM podem mudar para chaves codificadas diferentes na próxima versão.
|
||||||
|
|
||||||
|
## 10. Ferramentas adicionais
|
||||||
|
|
||||||
|
* [`patology`](https://github.com/sud0woodo/patology) – analisar/dump arquivos PAT.
|
||||||
|
* [`synodecrypt`](https://github.com/synacktiv/synodecrypt) – descriptografar PAT/SPK/outros.
|
||||||
|
* [`libsodium`](https://github.com/jedisct1/libsodium) – implementação de referência de XChaCha20-Poly1305 secretstream.
|
||||||
|
* [`msgpack`](https://msgpack.org/) – serialização de cabeçalho.
|
||||||
|
|
||||||
|
## Referências
|
||||||
|
|
||||||
|
- [Extração de arquivos criptografados da Synology – Synacktiv (Pwn2Own IE 2024)](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html)
|
||||||
|
- [synodecrypt no GitHub](https://github.com/synacktiv/synodecrypt)
|
||||||
|
- [patology no GitHub](https://github.com/sud0woodo/patology)
|
||||||
|
|
||||||
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
@ -117,6 +117,28 @@ powershell C:**2\n??e*d.*? # notepad
|
|||||||
../linux-hardening/bypass-bash-restrictions/
|
../linux-hardening/bypass-bash-restrictions/
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
|
### Node.js `child_process.exec` vs `execFile`
|
||||||
|
|
||||||
|
Ao auditar back-ends em JavaScript/TypeScript, você frequentemente encontrará a API `child_process` do Node.js.
|
||||||
|
```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()` gera um **shell** (`/bin/sh -c`), portanto, qualquer caractere que tenha um significado especial para o shell (back-ticks, `;`, `&&`, `|`, `$()`, …) resultará em **injeção de comando** quando a entrada do usuário for concatenada na string.
|
||||||
|
|
||||||
|
**Mitigação:** use `execFile()` (ou `spawn()` sem a opção `shell`) e forneça **cada argumento como um elemento de array separado** para que nenhum shell esteja envolvido:
|
||||||
|
```javascript
|
||||||
|
const { execFile } = require('child_process');
|
||||||
|
execFile('/usr/bin/do-something', [
|
||||||
|
'--id_user', id_user,
|
||||||
|
'--payload', JSON.stringify(payload)
|
||||||
|
]);
|
||||||
|
```
|
||||||
|
Caso real: *Synology Photos* ≤ 1.7.0-0794 era explorável através de um evento WebSocket não autenticado que colocava dados controlados pelo atacante em `id_user`, que mais tarde eram incorporados em uma chamada `exec()`, alcançando RCE (Pwn2Own Irlanda 2024).
|
||||||
|
|
||||||
## Lista de Detecção de Força Bruta
|
## Lista de Detecção de Força Bruta
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
@ -125,7 +147,9 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_inject
|
|||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
|
- [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://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)
|
- [https://portswigger.net/web-security/os-command-injection](https://portswigger.net/web-security/os-command-injection)
|
||||||
|
- [Extração de arquivos criptografados da Synology – Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html)
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user