Translated ['binary-exploitation/common-binary-protections-and-bypasses/

This commit is contained in:
Translator 2024-04-23 19:37:48 +00:00
parent 0abde02f81
commit 8207cc7ccf
4 changed files with 263 additions and 61 deletions

View file

@ -725,6 +725,7 @@
* [Ret2plt](binary-exploitation/common-binary-protections-and-bypasses/aslr/ret2plt.md)
* [Ret2ret & Reo2pop](binary-exploitation/common-binary-protections-and-bypasses/aslr/ret2ret.md)
* [CET & Shadow Stack](binary-exploitation/common-binary-protections-and-bypasses/cet-and-shadow-stack.md)
* [Libc Protections](binary-exploitation/common-binary-protections-and-bypasses/libc-protections.md)
* [Memory Tagging Extension (MTE)](binary-exploitation/common-binary-protections-and-bypasses/memory-tagging-extension-mte.md)
* [No-exec / NX](binary-exploitation/common-binary-protections-and-bypasses/no-exec-nx.md)
* [PIE](binary-exploitation/common-binary-protections-and-bypasses/pie/README.md)

View file

@ -0,0 +1,94 @@
# Libc 보호 기능
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
HackTricks를 지원하는 다른 방법:
* **회사를 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)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **HackTricks****HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
</details>
## 청크 정렬 강제
**Malloc**은 메모리를 **8바이트(32비트) 또는 16바이트(64비트) 그룹**으로 할당합니다. 이는 32비트 시스템에서 청크의 끝이 **0x8**에 맞춰지고, 64비트 시스템에서는 **0x0**에 맞춰져야 함을 의미합니다. 이 보안 기능은 각 청크가 특정 위치에서 올바르게 **정렬**되어 있는지 확인하고 나서 해당 위치에서 포인터를 사용하기 전에 체크합니다.
### 보안 이점
64비트 시스템에서 청크 정렬을 강제함으로써 Malloc의 보안이 크게 향상됩니다. 이는 가짜 청크를 배치할 수 있는 위치가 **16개 중 1개로 제한**되기 때문에 공격을 복잡하고 성공적으로 실행하기 어렵게 만듭니다. 특히 사용자가 입력 값을 제어할 수 있는 상황에서 공격을 더 복잡하고 성공하기 어렵게 만듭니다.
* **\_\_malloc\_hook에 대한 Fastbin 공격**
Malloc의 새로운 정렬 규칙은 `__malloc_hook`을 이용한 고전적인 공격을 방지합니다. 이전에 공격자는 청크 크기를 조작하여 **이 함수 포인터를 덮어쓰고** **코드 실행**을 얻을 수 있었습니다. 이제 엄격한 정렬 요구 사항으로 인해 이러한 조작이 더 이상 유효하지 않아져서 일반적인 공격 경로를 차단하고 전반적인 보안을 향상시킵니다.
## fastbins 및 tcache에서의 포인터 Mangling
**포인터 Mangling**은 메모리 관리 작업에서 **fastbin 및 tcache Fd 포인터**를 보호하는 보안 강화 기능입니다. 이 기술은 메모리 정보 누출이 필요 없거나 알려진 위치에 직접적으로 메모리 위치를 조작하는 일부 메모리 악용 전술을 방지하는 데 도움이 됩니다.
이 기술의 핵심은 난독화 공식입니다:
**`New_Ptr = (L >> 12) XOR P`**
* **L**은 포인터의 **저장 위치**입니다.
* **P**는 실제 **fastbin/tcache Fd 포인터**입니다.
저장 위치(L)를 XOR 연산 전에 오른쪽으로 12비트 이동시키는 이유는 중요합니다. 이 조작은 일반적으로 시스템 아키텍처 제약으로 인해 예측 가능한 메모리 주소의 가장 낮은 12비트에 내재된 취약성을 해결합니다. 비트를 이동함으로써 예측 가능한 부분을 제거하여 새로운, 난독화된 포인터의 무작위성을 향상시키고 이러한 비트의 예측 가능성에 의존하는 악용에 대비합니다.
이 난독화된 포인터는 프로그램이 사용하는 주소를 무작위로 바꾸는 **주소 공간 레이아웃 무작위화 (ASLR)**에서 제공되는 기존의 무작위성을 활용합니다. 이는 공격자가 프로세스의 메모리 레이아웃을 예측하기 어렵게 만들기 위해 프로그램이 사용하는 주소를 무작위로 바꾸는 기술입니다.
**난독화된 포인터를 해제하여 원래 주소를 검색하는 것은** 동일한 XOR 연산을 사용하여 수행됩니다. 여기서 난독화된 포인터는 공식에서 P로 취급되며 변경되지 않은 저장 위치(L)와 XOR 연산을 수행하면 원래 포인터가 공개됩니다. 이 난독화 및 해독의 대칭성은 시스템이 메모리 포인터를 효율적으로 인코딩하고 디코딩할 수 있도록 하면서 메모리 포인터를 조작하는 공격에 대한 보안을 크게 향상시킵니다.
### 보안 이점
포인터 난독화는 힙 관리에서의 **부분 및 전체 포인터 덮어쓰기를 방지**하고 보안을 크게 향상시킵니다. 이 기능은 여러 가지 방법으로 악용 기술에 영향을 미칩니다:
1. **바이트 바이트 상대적 덮어쓰기 방지**: 이전에 공격자는 정확한 주소를 알지 못해도 **힙 청크를 다른 위치로 리디렉션**할 수 있는 일부 포인터의 일부를 변경할 수 있었습니다. 이러한 상대적 덮어쓰기는 더 이상 힙 누출 없이는 **브루트 포싱이 필요**하며, 이는 성공 가능성을 크게 줄입니다.
2. **Tcache Bin/Fastbin 공격의 어려움 증가**: fastbin 또는 tcache 항목을 조작하여 함수 포인터(예: `__malloc_hook`)를 덮어쓰는 일반적인 공격이 방해됩니다. 예를 들어, 공격은 LibC 주소를 누출하고 tcache bin에 청크를 해제한 다음 Fd 포인터를 `__malloc_hook`로 리디렉션하여 임의의 코드 실행을 수행할 수 있습니다. 포인터 난독화로 인해 이러한 포인터는 올바르게 난독화되어야 하므로 **정확한 조작을 위해 힙 누출이 필요**하며, 이로써 악용 장벽이 높아집니다.
3. **비힙 위치에서의 힙 누출 요구**: 비힙 영역(스택, .bss 섹션 또는 PLT/GOT)에 가짜 청크를 만드는 것은 이제 포인터 난독화가 필요하기 때문에 이제 **힙 누출이 필요**합니다. 이는 LibC 주소를 조작하는 것과 유사하게 이러한 영역을 악용하는 복잡성을 증가시킵니다.
4. **힙 주소 누출이 더 어려워짐**: 포인터 난독화는 fastbin 및 tcache bin의 Fd 포인터를 힙 주소 누출 소스로 사용하는 유용성을 제한합니다. 그러나 정렬되지 않은, 작은 및 큰 bin의 포인터는 여전히 난독화되지 않았으므로 주소 누출에 사용할 수 있습니다. 이 변화로 인해 공격자는 이러한 bin을 탐색하여 악용 가능한 정보를 찾아야 하지만 일부 기술은 여전히 누출 전에 포인터를 해독할 수 있을 수 있지만 제약이 따릅니다.
### **힙 누출로 포인터 해독**
{% hint style="danger" %}
프로세스에 대한 자세한 설명을 보려면 [**여기에서 원본 게시물을 확인**](https://maxwelldulin.com/BlogPost?post=5445977088)하세요.
{% endhint %}
### 알고리즘 개요
포인터를 난독화하고 해독하는 데 사용되는 공식은 다음과 같습니다:&#x20;
**`New_Ptr = (L >> 12) XOR P`**
여기서 **L**은 저장 위치이고 **P**는 Fd 포인터입니다. **L**을 오른쪽으로 12비트 이동하여 XOR 연산을 수행하면 **P**의 가장 상위 12비트를 획득하게 됩니다. 이는 **XOR**의 특성 때문에 비트가 자신과 XOR되면 0이 출력되기 때문입니다.
**알고리즘의 주요 단계:**
1. **가장 상위 비트의 초기 누출**: 이동된 **L**을 **P**와 XOR하여 **P**의 상위 12비트를 획득합니다. 이동된 **L**의 부분은 0이 되므로 **P**의 해당 비트는 변경되지 않습니다.
2. **포인터 비트 복구**: XOR가 역으로 가능하므로 결과와 하나의 피연산자를 알면 다른 피연산자를 계산할 수 있습니다. 이 속성은 알려진 비트 세트를 알고 있는 상태에서 난독화된 포인터의 일부와 연속적으로 XOR하여 **P**의 전체 비트 세트를 추론하는 데 사용됩니다.
3. **반복적인 해독**: 이 과정은 이전 단계에서 발견된 **P**의 비트를 사용하여 난독화된 포인터의 다음 세그먼트를 해독하는 데 반복됩니다. 모든 비트가 복구될 때까지 이 과정을 반복합니다.
4. **결정론적 비트 처리**: 이동으로 인해 **L**의 마지막 12비트는 손실되지만 결정론적이며 후처리로 복원할 수 있습니다.
이 알고리즘의 구현은 여기에서 찾을 수 있습니다: [https://github.com/mdulin2/mangle](https://github.com/mdulin2/mangle)
## 포인터 가드
포인터 가드는 glibc에서 사용되는 익스플로잇 방지 기술로, 특히 `atexit()`와 같은 라이브러리 호출에 의해 등록된 함수 포인터를 보호하는 데 사용됩니다. 이 보호는 포인터를 스레드 데이터(`fs:0x30`)에 저장된 비밀과 XOR 연산 및 비트 회전을 적용하여 포인터를 섞는 것을 포함합니다. 이 메커니즘은 함수 포인터를 덮어쓰는 공격자로부터 제어 흐름을 탈취하는 것을 방지하기 위한 것입니다.
### **리크를 사용한 포인터 가드 우회**
1. **포인터 가드 작업 이해:** 포인터의 섞기 작업은 `PTR_MANGLE` 매크로를 사용하여 수행되며, 이 매크로는 포인터를 64비트 비밀로 XOR 연산한 다음 0x11 비트를 왼쪽으로 회전시킵니다. 원래 포인터를 복구하기 위한 역 연산은 `PTR_DEMANGLE`에서 처리됩니다.
2. **공격 전략:** 이 공격은 알려진 평문 접근 방식에 기반하며, 공격자는 섞인 포인터의 원본과 섞인 버전을 알아야만 섞는 데 사용된 비밀을 추론할 수 있습니다.
3. **알려진 평문 활용:**
* **고정 함수 포인터 식별:** glibc 소스 코드를 조사하거나 `__libc_pthread_functions`와 같은 초기화된 함수 포인터 테이블을 살펴봄으로써 공격자는 예측 가능한 함수 포인터를 찾을 수 있습니다.
* **비밀 계산:** `__pthread_attr_destroy`와 같은 알려진 함수 포인터와 해당 함수 포인터 테이블에서의 섞인 버전을 사용하여, 섞인 포인터를 역 회전(오른쪽 회전)하고 그 포인터의 주소와 XOR 연산하여 비밀을 계산할 수 있습니다.
4. **대체 평문:** 공격자는 알려진 값(예: 0 또는 -1)으로 포인터를 섞어서 메모리에서 식별 가능한 패턴을 생성하는지 확인하여, 이러한 패턴이 메모리 덤프에서 발견될 때 비밀을 노출시킬 수 있습니다.
5. **실제 적용:** 비밀을 계산한 후, 공격자는 libc 기본 주소를 알고 임의의 메모리 위치를 읽을 수 있는 다중 스레드 응용 프로그램에서 포인터를 제어적으로 조작하여 포인터 가드 보호를 우회할 수 있습니다.
## 참고 자료
* [https://maxwelldulin.com/BlogPost?post=5445977088](https://maxwelldulin.com/BlogPost?post=5445977088)
* [https://blog.infosectcbr.com.au/2020/04/bypassing-pointer-guard-in-linuxs-glibc.html?m=1](https://blog.infosectcbr.com.au/2020/04/bypassing-pointer-guard-in-linuxs-glibc.html?m=1)

View file

@ -2,15 +2,15 @@
<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에 광고되길 원하거나** **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) 컬렉션
- **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
- **HackTricks****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) 컬렉션
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
* **HackTricks****HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
</details>
@ -24,11 +24,11 @@ macOS **설치 프로그램 패키지**(.pkg 파일로도 알려짐)는 macOS에
<figure><img src="../../../.gitbook/assets/Pasted Graphic.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption></figcaption></figure>
- **Distribution (xml)**: 사용자 정의 (제목, 환영 텍스트 등) 및 스크립트/설치 확인
- **PackageInfo (xml)**: 정보, 설치 요구 사항, 설치 위치, 실행할 스크립트 경로
- **Bill of materials (bom)**: 파일 목록 및 파일 권한으로 설치, 업데이트 또는 제거
- **Payload (CPIO 아카이브 gzip 압축)**: PackageInfo의 `install-location`에 설치할 파일
- **Scripts (CPIO 아카이브 gzip 압축)**: 임시 디렉토리로 추출된 사전 및 사후 설치 스크립트 및 기타 리소스.
* **Distribution (xml)**: 사용자 정의 (제목, 환영 텍스트 등) 및 스크립트/설치 확인
* **PackageInfo (xml)**: 정보, 설치 요구 사항, 설치 위치, 실행할 스크립트 경로
* **Bill of materials (bom)**: 파일 목록을 설치, 업데이트 또는 제거하고 파일 권한을 포함
* **Payload (CPIO 아카이브 gzip 압축)**: PackageInfo의 `install-location`에 설치할 파일
* **Scripts (CPIO 아카이브 gzip 압축)**: 임시 디렉토리로 추출된 사전 및 사후 설치 스크립트 및 기타 리소스.
```bash
# Tool to directly get the files inside a package
pkgutil —expand "/path/to/package.pkg" "/path/to/out/dir"
@ -46,27 +46,31 @@ cpio -i < Scripts
DMG 파일 또는 Apple 디스크 이미지는 Apple의 macOS에서 사용되는 파일 형식입니다. DMG 파일은 기본적으로 **마운트 가능한 디스크 이미지**이며(자체 파일 시스템을 포함), 일반적으로 압축되고 때로는 암호화된 원시 블록 데이터를 포함합니다. DMG 파일을 열면 macOS가 **물리적 디스크처럼 마운트**하여 해당 내용에 액세스할 수 있게 됩니다.
{% hint style="danger" %}
**`.dmg`** 설치 프로그램은 **다양한 형식을** 지원하므로, 과거에는 취약점을 포함한 일부 파일이 **커널 코드 실행**을 얻기 위해 **악용**되었음을 유의하십시오.
{% endhint %}
### 계층 구조
<figure><img src="../../../.gitbook/assets/image (12) (2).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (222).png" alt=""><figcaption></figcaption></figure>
DMG 파일의 계층 구조는 내용에 따라 다를 수 있습니다. 그러나 응용 프로그램 DMG의 경우 일반적으로 다음 구조를 따릅니다:
- 최상위: 이것은 디스크 이미지의 루트입니다. 일반적으로 응용 프로그램과 macOS의 Applications 폴더로의 링크를 포함합니다.
- 응용 프로그램 (.app): 이것은 실제 응용 프로그램입니다. macOS에서 응용 프로그램은 일반적으로 응용 프로그램을 구성하는 많은 개별 파일과 폴더를 포함하는 패키지입니다.
- 응용 프로그램 링크: 이것은 macOS의 Applications 폴더로의 바로 가기입니다. 이것의 목적은 응용 프로그램을 설치하기 쉽게 만드는 것입니다. .app 파일을 이 바로 가기로 끌어다 놓아 응용 프로그램을 설치할 수 있습니다.
- 응용 프로그램 링크: 이것은 macOS의 Applications 폴더로의 바로 가기입니다. 이것의 목적은 응용 프로그램을 설치하기 쉽게 만드는 것입니다. .app 파일을 이 바로 가기로 끌어다 응용 프로그램을 설치할 수 있습니다.
## pkg 용을 통한 권한 상승
## pkg 용을 통한 권한 상승
### 공용 디렉토리에서 실행
예를 들어, 사전 또는 사후 설치 스크립트가 **`/var/tmp/Installerutil`**에서 실행되고 있으면, 공격자는 해당 스크립트를 제어하여 실행될 때마다 권한을 상승시킬 수 있습니다. 또 다른 유사한 예는 다음과 같습니다:
예를 들어 사전 또는 사후 설치 스크립트가 **`/var/tmp/Installerutil`**에서 실행되고 있고, 공격자가 해당 스크립트를 제어할 수 있다면, 실행될 때마다 권한을 상승시킬 수 있습니다. 또 다른 유사한 예는 다음과 같습니다:
<figure><img src="../../../.gitbook/assets/Pasted Graphic 5.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/Pasted Graphic 5.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption><p><a href="https://www.youtube.com/watch?v=kCXhIYtODBg">https://www.youtube.com/watch?v=kCXhIYtODBg</a></p></figcaption></figure>
### 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
@ -74,7 +78,7 @@ DMG 파일의 계층 구조는 내용에 따라 다를 수 있습니다. 그러
```
### 마운트를 통한 실행
만약 설치 프로그램이 `/tmp/fixedname/bla/bla`에 쓴다면, **noowners**로 `/tmp/fixedname` 위에 **마운트를 생성**할 수 있어 설치 중 **어떤 파일이든 수정**하여 설치 과정을 악용할 수 있습니다.
만약 설치 프로그램이 `/tmp/fixedname/bla/bla`에 쓴다면, **소유자 없이** `/tmp/fixedname` 위에 **마운트를 생성**하여 설치 중에 **어떤 파일이든 수정**할 수 있습니다.
이러한 예시로는 **CVE-2021-26089**가 있으며, 이는 **주기적 스크립트를 덮어쓰고** 루트로 실행하는 것을 성공했습니다. 자세한 정보는 다음 발표를 참고하세요: [**OBTS v4.0: "Mount(ain) of Bugs" - Csaba Fitzl**](https://www.youtube.com/watch?v=jSYPazD4VcE)
@ -82,15 +86,16 @@ DMG 파일의 계층 구조는 내용에 따라 다를 수 있습니다. 그러
### 빈 페이로드
**`.pkg`** 파일에 **설치 전 및 후 스크립트**만 포함하여 생성할 수 있습니다.
**`.pkg`** 파일에 **설치 전 및 설치 후 스크립트**만 생성하는 것이 가능합니다.
### Distribution xml에 JS
### Distribution xml에 JS 삽입
패키지의 **distribution xml** 파일에 **`<script>`** 태그를 추가하여 해당 코드가 실행되고 **`system.run`**을 사용하여 명령을 **실행**할 수 있습니다:
패키지의 **distribution xml** 파일에 **`<script>`** 태그를 추가하여 해당 코드가 실행되고 **`system.run`**을 사용하여 **명령을 실행**할 수 있습니다:
<figure><img src="../../../.gitbook/assets/image (14).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (1040).png" alt=""><figcaption></figcaption></figure>
## 참고 자료
* [**DEF CON 27 - Unpacking Pkgs A Look Inside Macos Installer Packages And Common Security Flaws**](https://www.youtube.com/watch?v=iASSG0\_zobQ)
* [**OBTS v4.0: "The Wild World of macOS Installers" - Tony Lambert**](https://www.youtube.com/watch?v=Eow5uNHtmIg)
* [**DEF CON 27 - Unpacking Pkgs A Look Inside MacOS Installer Packages**](https://www.youtube.com/watch?v=kCXhIYtODBg)

View file

@ -2,15 +2,15 @@
<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 전문가)</strong></a><strong>!</strong></summary>
HackTricks를 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* **회사가 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) 컬렉션
* **💬 [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 저장소에 기여하세요.
* **💬 [Discord 그룹](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>
@ -21,34 +21,34 @@ HackTricks를 지원하는 다른 방법:
* **읽기** - 디렉토리 항목을 **열거**할 수 있음
* **쓰기** - 디렉토리에 **파일을 삭제/쓰기**할 수 있으며 **빈 폴더를 삭제**할 수 있음.
* 그러나 **쓰기 권한**이 없으면 **비어 있지 않은 폴더를 삭제/수정**할 수 없음.
* **폴더 이름을 수정**할 수 없음(소유하지 않은 경우).
* **실행** - 디렉토리를 **탐색**할 수 있음 - 이 권한이 없으면 해당 디렉토리 내의 파일 또는 하위 디렉토리에 액세스할 수 없음.
* 소유권이 없으면 **폴더 이름을 수정**할 수 없음.
* **실행** - 디렉토리를 **탐색**할 수 있음 - 이 권한이 없으면 해당 디렉토리 내의 파일이나 하위 디렉토리에 액세스할 수 없음.
### 위험한 조합
**루트가 소유한 파일/폴더를 덮어쓰는 방법**, 하지만:
**루트가 소유한 파일/폴더를 덮어쓰는 방법**, 그러나:
* 경로에서 하나의 **디렉토리 소유자**가 사용자인 경우
* 경로에서 하나의 **디렉토리 소유자**가 **쓰기 액세스**를 가진 **사용자 그룹**인 경우
* 경로에서 하나의 상위 **디렉토리 소유자**가 사용자인 경우
* 경로에서 하나의 상위 **디렉토리 소유자**가 **쓰기 액세스**를 가진 **사용자 그룹**인 경우
* 사용자 **그룹**이 **파일**에 **쓰기** 액세스 권한을 가짐
이전 조합 중 하나로 공격자는 특권 임의 쓰기를 얻기 위해 예상 경로에 **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로 설정됩니다. 따라서, 다른 xattr이 쓰여지는 것을 방지하는 ACL이 있는 zip 파일로 응용 프로그램을 압축했다면... quarantine xattr이 응용 프로그램에 설정되지 않았습니다:
[**소스 코드**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html)에서 볼 수 있듯이, xattr인 **`com.apple.acl.text`**에 저장된 ACL 텍스트 표현은 압축 해제된 파일에서 ACL로 설정됩니다. 따라서, ACL을 포함하는 zip 파일로 응용 프로그램을 압축하고 다른 xattr이 기록되지 않도록 하는 경우... 격리 xattr이 응용 프로그램에 설정되지 않았습니다:
자세한 정보는 [**원본 보고서**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/)를 확인하십시오.
@ -146,9 +146,9 @@ ditto -c -k del test.zip
ditto -x -k --rsrc test.zip .
ls -le test
```
(이 작업이 작동하더라도 샌드박스는 quarantine xattr을 먼저 작성합니다)
(Note that even if this works the sandbox write the quarantine xattr before)
정말 필요하지는 않지만 그냥 두겠습니다.
실제로 필요하지는 않지만 그냥 거기에 둡니다:
{% content-ref url="macos-xattr-acls-extra-stuff.md" %}
[macos-xattr-acls-extra-stuff.md](macos-xattr-acls-extra-stuff.md)
@ -202,15 +202,15 @@ ls -le test
...
</dict>
```
터미널에서 리소스의 서명을 계산하는 것이 가능합니다:
다음과 같이 CLI에서 리소스의 서명을 계산할 수 있습니다:
{% code overflow="wrap" %}
```bash
openssl dgst -binary -sha1 /System/Cryptexes/App/System/Applications/Safari.app/Contents/Resources/AppIcon.icns | openssl base64
```
## dmg 파일 시스템 마운트
## dmg 파일 시스템 장착
사용자는 사용자 정의 dmg를 생성하여 기존 폴더 위에도 마운트할 수 있습니다. 다음은 사용자가 사용자 정의 내용을 포함한 사용자 정의 dmg 패키지를 만드는 방법입니다:
사용자는 기존 폴더 위에도 사용자 정의 dmg를 장착할 수 있습니다. 다음은 사용자가 사용자 정의 내용을 포함한 사용자 정의 dmg 패키지를 만드는 방법입니다:
```bash
# Create the volume
hdiutil create /private/tmp/tmp.dmg -size 2m -ov -volname CustomVolName -fs APFS 1>/dev/null
@ -233,8 +233,8 @@ 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와 직접 통신하는 것이 가능합니다.
일반적으로 macOS는 `com.apple.DiskArbitration.diskarbitrationd` Mach 서비스와 통신하여 디스크를 마운트합니다(`/usr/libexec/diskarbitrationd`에서 제공). LaunchDaemons plist 파일에 `-d` 매개변수를 추가하고 다시 시작하면 `/var/log/diskarbitrationd.log`에 로그를 저장합니다.\
그러나 `hdik``hdiutil`과 같은 도구를 사용하여 `com.apple.driver.DiskImages` kext와 직접 통신할 수 있습니다.
## 임의 쓰기
@ -242,11 +242,11 @@ hdiutil create -srcfolder justsome.app justsome.dmg
스크립트가 **쉘 스크립트**로 해석될 수 있다면 매일 트리거될 **`/etc/periodic/daily/999.local`** 쉘 스크립트를 덮어쓸 수 있습니다.
다음과 같이 이 스크립트**가짜** 실행할 수 있습니다: **`sudo periodic daily`**
다음과 같이 이 스크립트의 실행을 **가짜**로 만들 수 있습니다: **`sudo periodic daily`**
### 데몬
임의의 **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">
@ -263,23 +263,19 @@ hdiutil create -srcfolder justsome.app justsome.dmg
</dict>
</plist>
```
### 스크립트 생성
루트로 실행하고 싶은 **명령어**를 포함한 스크립트 `/Applications/Scripts/privesc.sh`를 생성하세요.
### Sudoers 파일
**임의 쓰기 권한**이 있다면, **`/etc/sudoers.d/`** 폴더 내에 **sudo** 권한을 부여하는 파일을 생성할 수 있습니다.
**임의 쓰기** 권한이 있다면 **`/etc/sudoers.d/`** 폴더 내에 **sudo** 권한을 부여하는 파일을 생성할 수 있습니다.
### 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)). 이것 또한 권한 상승으로 작동할 수 있습니다.
렇게 하면 나에게 쓰기 가능한 파일을 생성할 수 있습니다. 이 파일은 루트 소유이지만 나에게 쓰기 권한이 있습니다 ([**여기에서 코드 확인**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew\_lpe.sh)). 이것 또한 권한 상승으로 작동할 수 있습니다:
```bash
DIRNAME=/usr/local/etc/periodic/daily
@ -291,20 +287,126 @@ MallocStackLogging=1 MallocStackLoggingDirectory=$DIRNAME MallocStackLoggingDont
FILENAME=$(ls "$DIRNAME")
echo $FILENAME
```
## POSIX 공유 메모리
**POSIX 공유 메모리**는 POSIX 호환 운영 체제에서 프로세스가 공통 메모리 영역에 액세스할 수 있게 하여 다른 프로세스 간 통신 방법보다 빠른 통신을 가능하게 합니다. 이는 `shm_open()`을 사용하여 공유 메모리 객체를 생성하거나 열고, `ftruncate()`를 사용하여 크기를 설정하고, `mmap()`을 사용하여 프로세스의 주소 공간에 매핑하는 과정을 포함합니다. 프로세스는 이후 이 메모리 영역에서 직접 읽고 쓸 수 있습니다. 동시 액세스를 관리하고 데이터 손상을 방지하기 위해 종종 뮤텍스나 세마포어와 같은 동기화 메커니즘을 사용합니다. 마지막으로, 프로세스는 `munmap()``close()`를 사용하여 공유 메모리를 언맵하고 닫은 후, 선택적으로 `shm_unlink()`를 사용하여 메모리 객체를 제거할 수 있습니다. 이 시스템은 여러 프로세스가 공유 데이터에 빠르게 액세스해야 하는 환경에서 효율적이고 빠른 IPC에 특히 효과적입니다.
<details>
<summary>생산자 코드 예시</summary>
```c
// gcc producer.c -o producer -lrt
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *name = "/my_shared_memory";
const int SIZE = 4096; // Size of the shared memory object
// Create the shared memory object
int shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
if (shm_fd == -1) {
perror("shm_open");
return EXIT_FAILURE;
}
// Configure the size of the shared memory object
if (ftruncate(shm_fd, SIZE) == -1) {
perror("ftruncate");
return EXIT_FAILURE;
}
// Memory map the shared memory
void *ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (ptr == MAP_FAILED) {
perror("mmap");
return EXIT_FAILURE;
}
// Write to the shared memory
sprintf(ptr, "Hello from Producer!");
// Unmap and close, but do not unlink
munmap(ptr, SIZE);
close(shm_fd);
return 0;
}
```
</details>
<details>
<summary>소비자 코드 예시</summary>
```c
// gcc consumer.c -o consumer -lrt
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *name = "/my_shared_memory";
const int SIZE = 4096; // Size of the shared memory object
// Open the shared memory object
int shm_fd = shm_open(name, O_RDONLY, 0666);
if (shm_fd == -1) {
perror("shm_open");
return EXIT_FAILURE;
}
// Memory map the shared memory
void *ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0);
if (ptr == MAP_FAILED) {
perror("mmap");
return EXIT_FAILURE;
}
// Read from the shared memory
printf("Consumer received: %s\n", (char *)ptr);
// Cleanup
munmap(ptr, SIZE);
close(shm_fd);
shm_unlink(name); // Optionally unlink
return 0;
}
```
</details>
## macOS Guarded Descriptors
**macOS 보호된 디스크립터**는 macOS에 도입된 보안 기능으로, 사용자 응용 프로그램에서 **파일 디스크립터 작업**의 안전성과 신뢰성을 향상시킵니다. 이러한 보호된 디스크립터는 파일 디스크립터에 특정 제한 또는 "가드"를 연결하여 커널에서 강제하는 방법을 제공합니다.
이 기능은 **무단 파일 액세스** 또는 **경쟁 조건**과 같은 특정 유형의 보안 취약점을 방지하는 데 특히 유용합니다. 이러한 취약점은 예를 들어 스레드가 파일 설명에 액세스하고 **다른 취약한 스레드에게 액세스 권한을 부여**하거나 파일 디스크립터가 취약한 자식 프로세스에 **상속**될 때 발생합니다. 이 기능과 관련된 일부 함수는 다음과 같습니다:
* `guarded_open_np`: 가드가 있는 FD 열기
* `guarded_close_np`: 닫기
* `change_fdguard_np`: 설명자에 대한 가드 플래그 변경 (가드 보호 제거 포함)
## 참고 자료
* [https://theevilbit.github.io/posts/exploiting\_directory\_permissions\_on\_macos/](https://theevilbit.github.io/posts/exploiting\_directory\_permissions\_on\_macos/)
<details>
<summary><strong>제로부터 히어로가 되기까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 영웅까지 AWS 해킹 배우기!</summary>
HackTricks를 지원하는 다른 방법:
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
* **회사가 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을 제출하세요.
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**팔로우**하세요.
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
</details>