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