macOS Auto Start
Last updated
Last updated
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
이 섹션은 블로그 시리즈 Beyond the good ol' LaunchAgents를 기반으로 하며, 목표는 더 많은 자동 시작 위치를 추가하고 (가능한 경우), 최신 버전의 macOS (13.4)에서 어떤 기술이 여전히 작동하는지 나타내고 필요한 권한을 명시하는 것입니다.
여기에서는 샌드박스 우회에 유용한 시작 위치를 찾을 수 있으며, 이는 파일에 작성하고 기다리는 매우 일반적인 작업, 정해진 시간 또는 샌드박스 내에서 루트 권한 없이 일반적으로 수행할 수 있는 작업을 통해 무언가를 간단히 실행할 수 있게 해줍니다.
/Library/LaunchAgents
트리거: 재부팅
루트 필요
/Library/LaunchDaemons
트리거: 재부팅
루트 필요
/System/Library/LaunchAgents
트리거: 재부팅
루트 필요
/System/Library/LaunchDaemons
트리거: 재부팅
루트 필요
~/Library/LaunchAgents
트리거: 재로그인
~/Library/LaunchDemons
트리거: 재로그인
흥미로운 사실로, **launchd
**는 Mach-o 섹션 __Text.__config
에 내장된 속성 목록을 가지고 있으며, 여기에는 launchd가 시작해야 하는 다른 잘 알려진 서비스가 포함되어 있습니다. 또한, 이러한 서비스는 RequireSuccess
, RequireRun
및 RebootOnSuccess
를 포함할 수 있으며, 이는 반드시 실행되고 성공적으로 완료되어야 함을 의미합니다.
물론, 코드 서명 때문에 수정할 수 없습니다.
**launchd
**는 OX S 커널이 시작할 때 실행되는 첫 번째 프로세스이며 종료 시 마지막으로 종료되는 프로세스입니다. 항상 PID 1을 가져야 합니다. 이 프로세스는 다음의 ASEP plist에서 지정된 구성을 읽고 실행합니다:
/Library/LaunchAgents
: 관리자가 설치한 사용자별 에이전트
/Library/LaunchDaemons
: 관리자가 설치한 시스템 전체 데몬
/System/Library/LaunchAgents
: Apple에서 제공하는 사용자별 에이전트.
/System/Library/LaunchDaemons
: Apple에서 제공하는 시스템 전체 데몬.
사용자가 로그인하면 /Users/$USER/Library/LaunchAgents
및 /Users/$USER/Library/LaunchDemons
에 위치한 plist가 로그인한 사용자 권한으로 시작됩니다.
에이전트와 데몬의 주요 차이점은 에이전트는 사용자가 로그인할 때 로드되고 데몬은 시스템 시작 시 로드된다는 것입니다 (ssh와 같이 사용자가 시스템에 접근하기 전에 실행해야 하는 서비스가 있기 때문입니다). 또한 에이전트는 GUI를 사용할 수 있지만 데몬은 백그라운드에서 실행되어야 합니다.
사용자가 로그인하기 전에 실행되어야 하는 에이전트가 필요한 경우 이러한 것을 PreLoginAgents라고 합니다. 예를 들어, 로그인 시 보조 기술을 제공하는 데 유용합니다. 이들은 /Library/LaunchAgents
에서도 찾을 수 있습니다(예시를 보려면 여기를 참조하세요).
새로운 데몬 또는 에이전트 구성 파일은 다음 재부팅 후 또는 launchctl load <target.plist>
를 사용하여 로드됩니다. 확장자가 없는 .plist 파일을 로드하는 것도 가능합니다 launchctl -F <file>
(그러나 이러한 plist 파일은 재부팅 후 자동으로 로드되지 않습니다).
launchctl unload <target.plist>
를 사용하여 언로드하는 것도 가능합니다(지정된 프로세스는 종료됩니다).
에이전트 또는 데몬이 실행되지 않도록 방해하는 무언가(예: 오버라이드)가 없는지 확인하려면 다음을 실행하세요: sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist
현재 사용자에 의해 로드된 모든 에이전트와 데몬 목록:
plist가 사용자에 의해 소유되는 경우, 시스템 전체의 데몬 폴더에 있더라도 작업은 사용자로 실행됩니다. 이는 일부 권한 상승 공격을 방지할 수 있습니다.
**launchd
**는 커널에서 시작되는 첫 번째 사용자 모드 프로세스입니다. 프로세스 시작은 성공적이어야 하며 종료되거나 충돌할 수 없습니다. 이는 일부 종료 신호에 대해 보호됩니다.
launchd
가 가장 먼저 할 일 중 하나는 다음과 같은 모든 데몬을 시작하는 것입니다:
실행될 시간 기반의 타이머 데몬:
atd (com.apple.atrun.plist
): StartInterval
이 30분입니다.
crond (com.apple.systemstats.daily.plist
): 00:15에 시작하도록 StartCalendarInterval
이 설정되어 있습니다.
네트워크 데몬:
org.cups.cups-lpd
: SockType: stream
으로 TCP에서 수신하며 SockServiceName: printer
입니다.
SockServiceName은 /etc/services
의 포트 또는 서비스여야 합니다.
com.apple.xscertd.plist
: 포트 1640에서 TCP로 수신합니다.
특정 경로가 변경될 때 실행되는 경로 데몬:
com.apple.postfix.master
: 경로 /etc/postfix/aliases
를 확인합니다.
IOKit 알림 데몬:
com.apple.xartstorageremoted
: "com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...
Mach 포트:
com.apple.xscertd-helper.plist
: MachServices
항목에서 이름 com.apple.xscertd.helper
를 나타냅니다.
UserEventAgent:
이는 이전 것과 다릅니다. 특정 이벤트에 응답하여 launchd가 앱을 생성하게 합니다. 그러나 이 경우 관련된 주요 바이너리는 launchd
가 아니라 /usr/libexec/UserEventAgent
입니다. 이는 SIP 제한 폴더 /System/Library/UserEventPlugins/에서 플러그인을 로드하며, 각 플러그인은 XPCEventModuleInitializer
키에서 초기화기를 나타내거나, 이전 플러그인의 경우 Info.plist
의 FB86416D-6164-2070-726F-70735C216EC0
키 아래의 CFPluginFactories
사전에서 나타냅니다.
Writeup: https://theevilbit.github.io/beyond/beyond_0001/ Writeup (xterm): https://theevilbit.github.io/beyond/beyond_0018/
~/.zshrc
, ~/.zlogin
, ~/.zshenv.zwc
, ~/.zshenv
, ~/.zprofile
트리거: zsh로 터미널 열기
/etc/zshenv
, /etc/zprofile
, /etc/zshrc
, /etc/zlogin
트리거: zsh로 터미널 열기
루트 필요
~/.zlogout
트리거: zsh로 터미널 종료
/etc/zlogout
트리거: zsh로 터미널 종료
루트 필요
잠재적으로 더 많은 내용은: man zsh
~/.bashrc
트리거: bash로 터미널 열기
/etc/profile
(작동하지 않음)
~/.profile
(작동하지 않음)
~/.xinitrc
, ~/.xserverrc
, /opt/X11/etc/X11/xinit/xinitrc.d/
트리거: xterm으로 트리거될 것으로 예상되지만 설치되지 않았습니다. 설치 후에도 다음과 같은 오류가 발생합니다: xterm: DISPLAY is not set
zsh
또는 bash
와 같은 셸 환경을 시작할 때 특정 시작 파일이 실행됩니다. macOS는 현재 기본 셸로 /bin/zsh
를 사용합니다. 이 셸은 터미널 애플리케이션이 시작되거나 SSH를 통해 장치에 접근할 때 자동으로 접근됩니다. bash
와 sh
도 macOS에 존재하지만, 사용하려면 명시적으로 호출해야 합니다.
우리가 **man zsh
**로 읽을 수 있는 zsh의 매뉴얼 페이지에는 시작 파일에 대한 긴 설명이 있습니다.
지정된 악용을 구성하고 로그아웃 및 로그인하거나 심지어 재부팅하는 것이 앱을 실행하는 데 효과가 없었습니다. (앱이 실행되지 않았습니다. 아마도 이러한 작업이 수행될 때 실행 중이어야 할 것입니다.)
작성: https://theevilbit.github.io/beyond/beyond_0021/
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
트리거: 애플리케이션 재시작
재개할 모든 애플리케이션은 plist ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
안에 있습니다.
따라서 재개할 애플리케이션이 귀하의 애플리케이션을 실행하도록 하려면, 목록에 귀하의 앱을 추가하기만 하면 됩니다.
UUID는 해당 디렉토리를 나열하거나 ioreg -rd1 -c IOPlatformExpertDevice | awk -F'"' '/IOPlatformUUID/{print $4}'
를 사용하여 찾을 수 있습니다.
재개될 애플리케이션을 확인하려면 다음을 수행할 수 있습니다:
이 목록에 응용 프로그램을 추가하려면 다음을 사용할 수 있습니다:
~/Library/Preferences/com.apple.Terminal.plist
Trigger: 터미널 열기
**~/Library/Preferences
**에는 애플리케이션의 사용자 설정이 저장됩니다. 이러한 설정 중 일부는 다른 애플리케이션/스크립트 실행을 위한 구성을 포함할 수 있습니다.
예를 들어, 터미널은 시작 시 명령을 실행할 수 있습니다:
이 구성은 ~/Library/Preferences/com.apple.Terminal.plist
파일에 다음과 같이 반영됩니다:
그래서 시스템의 터미널 환경 설정의 plist가 덮어씌워질 수 있다면, open
기능을 사용하여 터미널을 열고 그 명령이 실행될 수 있습니다.
다음과 같이 CLI에서 추가할 수 있습니다:
어디서나
트리거: 터미널 열기
.terminal
스크립트를 생성하고 열면, 터미널 애플리케이션이 자동으로 호출되어 그 안에 표시된 명령을 실행합니다. 터미널 앱에 특별한 권한(예: TCC)이 있는 경우, 귀하의 명령은 해당 특별한 권한으로 실행됩니다.
다음으로 시도해 보세요:
You could also use the extensions .command
, .tool
, with regular shell scripts content and they will be also opened by Terminal.
터미널이 전체 디스크 접근 권한을 가지고 있다면 해당 작업을 완료할 수 있습니다 (실행된 명령은 터미널 창에 표시됩니다).
Writeup: https://theevilbit.github.io/beyond/beyond_0013/ Writeup: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882
/Library/Audio/Plug-Ins/HAL
루트 권한 필요
트리거: coreaudiod 또는 컴퓨터 재시작
/Library/Audio/Plug-ins/Components
루트 권한 필요
트리거: coreaudiod 또는 컴퓨터 재시작
~/Library/Audio/Plug-ins/Components
트리거: coreaudiod 또는 컴퓨터 재시작
/System/Library/Components
루트 권한 필요
트리거: coreaudiod 또는 컴퓨터 재시작
이전의 작성에 따르면 일부 오디오 플러그인을 컴파일하고 로드할 수 있습니다.
Writeup: https://theevilbit.github.io/beyond/beyond_0028/
/System/Library/QuickLook
/Library/QuickLook
~/Library/QuickLook
/Applications/AppNameHere/Contents/Library/QuickLook/
~/Applications/AppNameHere/Contents/Library/QuickLook/
QuickLook 플러그인은 파일 미리보기를 트리거할 때 실행될 수 있습니다 (Finder에서 파일을 선택한 상태에서 스페이스 바를 누름) 그리고 해당 파일 형식을 지원하는 플러그인이 설치되어 있어야 합니다.
자신의 QuickLook 플러그인을 컴파일하고 이전 위치 중 하나에 배치하여 로드한 후 지원되는 파일로 가서 스페이스를 눌러 트리거할 수 있습니다.
이것은 저에게 작동하지 않았습니다, 사용자 LoginHook나 루트 LogoutHook 모두에서 작동하지 않았습니다.
Writeup: https://theevilbit.github.io/beyond/beyond_0022/
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
와 같은 명령을 실행할 수 있어야 합니다
~/Library/Preferences/com.apple.loginwindow.plist
에 위치
이들은 더 이상 사용되지 않지만 사용자가 로그인할 때 명령을 실행하는 데 사용할 수 있습니다.
이 설정은 /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
에 저장됩니다.
삭제하려면:
The root user one is stored in /private/var/root/Library/Preferences/com.apple.loginwindow.plist
여기에서 sandbox bypass에 유용한 시작 위치를 찾을 수 있습니다. 이를 통해 파일에 작성하여 특정 프로그램 설치, "비정상적인" 사용자 행동이나 환경과 같은 그리 일반적이지 않은 조건을 기대하지 않고 간단히 실행할 수 있습니다.
Writeup: https://theevilbit.github.io/beyond/beyond_0004/
/usr/lib/cron/tabs/
, /private/var/at/tabs
, /private/var/at/jobs
, /etc/periodic/
직접 쓰기 접근을 위해 루트가 필요합니다. crontab <file>
을 실행할 수 있다면 루트가 필요하지 않습니다.
Trigger: 크론 작업에 따라 다릅니다.
현재 사용자의 크론 작업을 나열하려면:
You can also see all the cron jobs of the users in /usr/lib/cron/tabs/
and /var/at/tabs/
(needs root).
In MacOS 여러 폴더에서 특정 주기로 스크립트를 실행하는 것을 찾을 수 있습니다:
여기에서 정기적인 cron 작업, at 작업 (그리 많이 사용되지 않음) 및 주기적 작업 (주로 임시 파일 정리를 위해 사용됨)을 찾을 수 있습니다. 매일 주기적 작업은 예를 들어 다음과 같이 실행할 수 있습니다: periodic daily
.
사용자 cronjob을 프로그래밍 방식으로 추가하려면 다음을 사용할 수 있습니다:
Writeup: https://theevilbit.github.io/beyond/beyond_0002/
~/Library/Application Support/iTerm2/Scripts/AutoLaunch
Trigger: iTerm 열기
~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
Trigger: iTerm 열기
~/Library/Preferences/com.googlecode.iterm2.plist
Trigger: iTerm 열기
**~/Library/Application Support/iTerm2/Scripts/AutoLaunch
**에 저장된 스크립트가 실행됩니다. 예를 들어:
또는:
스크립트 ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
도 실행됩니다:
**~/Library/Preferences/com.googlecode.iterm2.plist
**에 위치한 iTerm2 환경설정은 iTerm2 터미널이 열릴 때 실행할 명령을 나타낼 수 있습니다.
이 설정은 iTerm2 설정에서 구성할 수 있습니다:
그리고 명령은 환경설정에 반영됩니다:
당신은 실행할 명령을 설정할 수 있습니다:
iTerm2 설정을 악용하여 임의의 명령을 실행할 수 있는 다른 방법이 있을 가능성이 높습니다.
Writeup: https://theevilbit.github.io/beyond/beyond_0007/
~/Library/Application\ Support/xbar/plugins/
트리거: xbar가 실행될 때
인기 있는 프로그램 xbar가 설치되어 있으면, **~/Library/Application\ Support/xbar/plugins/
**에 셸 스크립트를 작성할 수 있으며, 이는 xbar가 시작될 때 실행됩니다:
Writeup: https://theevilbit.github.io/beyond/beyond_0008/
~/.hammerspoon/init.lua
Trigger: Hammerspoon이 실행될 때
Hammerspoon은 macOS를 위한 자동화 플랫폼으로, LUA 스크립팅 언어를 활용하여 작동합니다. 특히, 완전한 AppleScript 코드의 통합과 셸 스크립트 실행을 지원하여 스크립팅 기능을 크게 향상시킵니다.
이 앱은 단일 파일 ~/.hammerspoon/init.lua
를 찾으며, 시작되면 스크립트가 실행됩니다.
샌드박스를 우회하는 데 유용: ✅
하지만 BetterTouchTool이 설치되어 있어야 함
TCC 우회: ✅
Automation-Shortcuts 및 Accessibility 권한을 요청함
~/Library/Application Support/BetterTouchTool/*
이 도구는 특정 단축키가 눌렸을 때 실행할 애플리케이션이나 스크립트를 지정할 수 있게 해줍니다. 공격자는 자신의 단축키 및 실행할 작업을 데이터베이스에 구성하여 임의의 코드를 실행하도록 만들 수 있습니다 (단축키는 단순히 키를 누르는 것일 수 있습니다).
???
특정 조건이 충족될 때 코드를 실행할 수 있는 워크플로를 생성할 수 있습니다. 공격자가 워크플로 파일을 생성하고 Alfred가 이를 로드하도록 만들 가능성이 있습니다 (워크플로를 사용하려면 프리미엄 버전을 구매해야 함).
Writeup: https://theevilbit.github.io/beyond/beyond_0006/
~/.ssh/rc
Trigger: ssh를 통한 로그인
/etc/ssh/sshrc
루트 권한 필요
Trigger: ssh를 통한 로그인
ssh를 켜려면 Full Disk Access가 필요합니다:
기본적으로, /etc/ssh/sshd_config
에서 PermitUserRC no
가 아닌 경우, 사용자가 SSH를 통해 로그인할 때 /etc/ssh/sshrc
및 ~/.ssh/rc
스크립트가 실행됩니다.
작성: https://theevilbit.github.io/beyond/beyond_0003/
~/Library/Application Support/com.apple.backgroundtaskmanagementagent
트리거: 로그인
**osascript
**를 호출하는 악용 페이로드 저장
/var/db/com.apple.xpc.launchd/loginitems.501.plist
트리거: 로그인
루트 권한 필요
시스템 환경설정 -> 사용자 및 그룹 -> 로그인 항목에서 사용자가 로그인할 때 실행될 항목을 찾을 수 있습니다. 명령줄에서 이를 나열하고 추가 및 제거하는 것이 가능합니다:
이 항목들은 파일 **~/Library/Application Support/com.apple.backgroundtaskmanagementagent
**에 저장됩니다.
로그인 항목은 **/var/db/com.apple.xpc.launchd/loginitems.501.plist
**에 구성을 저장하는 API SMLoginItemSetEnabled를 사용하여 표시될 수 있습니다.
(로그인 항목에 대한 이전 섹션을 확인하세요. 이것은 확장입니다.)
ZIP 파일을 로그인 항목으로 저장하면 **Archive Utility
**가 이를 열고, 예를 들어 ZIP이 **~/Library
**에 저장되고 **LaunchAgents/file.plist
**가 포함된 폴더가 백도어를 가지고 있다면, 해당 폴더가 생성됩니다(기본적으로는 생성되지 않음) 그리고 plist가 추가되어 사용자가 다음에 다시 로그인할 때 plist에 표시된 백도어가 실행됩니다.
또 다른 옵션은 사용자 HOME 안에 .bash_profile
및 .zshenv
파일을 생성하는 것입니다. 따라서 LaunchAgents 폴더가 이미 존재하면 이 기술이 여전히 작동합니다.
작성물: https://theevilbit.github.io/beyond/beyond_0014/
**at
**를 실행해야 하며 활성화되어 있어야 합니다.
at
작업은 특정 시간에 실행될 일회성 작업을 예약하기 위해 설계되었습니다. cron 작업과 달리 at
작업은 실행 후 자동으로 제거됩니다. 이러한 작업은 시스템 재부팅 간에도 지속되므로 특정 조건에서 잠재적인 보안 문제로 간주될 수 있습니다.
기본적으로 이들은 비활성화되어 있지만 root 사용자가 이들을 활성화할 수 있습니다:
이것은 1시간 후에 파일을 생성합니다:
atq:
를 사용하여 작업 대기열을 확인하십시오.
위에서 두 개의 작업이 예약된 것을 볼 수 있습니다. at -c JOBNUMBER
를 사용하여 작업의 세부 정보를 인쇄할 수 있습니다.
AT 작업이 활성화되지 않으면 생성된 작업이 실행되지 않습니다.
작업 파일은 /private/var/at/jobs/
에서 찾을 수 있습니다.
The filename contains the queue, the job number, and the time it’s scheduled to run. For example let’s take a loot at a0001a019bdcd2
.
a
- this is the queue
0001a
- job number in hex, 0x1a = 26
019bdcd2
- time in hex. It represents the minutes passed since epoch. 0x019bdcd2
is 26991826
in decimal. If we multiply it by 60 we get 1619509560
, which is GMT: 2021. April 27., Tuesday 7:46:00
.
If we print the job file, we find that it contains the same information we got using at -c
.
Writeup: https://theevilbit.github.io/beyond/beyond_0024/ Writeup: https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d
샌드박스를 우회하는 데 유용: ✅
그러나 **System Events
**에 연락하기 위해 인수와 함께 osascript
를 호출할 수 있어야 합니다.
TCC 우회: 🟠
데스크탑, 문서 및 다운로드와 같은 기본 TCC 권한이 있습니다.
/Library/Scripts/Folder Action Scripts
루트 권한 필요
Trigger: 지정된 폴더에 대한 접근
~/Library/Scripts/Folder Action Scripts
Trigger: 지정된 폴더에 대한 접근
Folder Actions는 폴더 내에서 항목을 추가하거나 제거하는 등의 변경 사항에 의해 자동으로 트리거되는 스크립트입니다. 이러한 작업은 다양한 작업에 활용될 수 있으며, Finder UI 또는 터미널 명령을 사용하여 다양한 방법으로 트리거될 수 있습니다.
Folder Actions를 설정하기 위해 다음과 같은 옵션이 있습니다:
Automator로 Folder Action 워크플로를 작성하고 서비스를 설치합니다.
폴더의 컨텍스트 메뉴에서 Folder Actions Setup을 통해 스크립트를 수동으로 첨부합니다.
OSAScript를 사용하여 System Events.app
에 Apple Event 메시지를 보내 프로그램적으로 Folder Action을 설정합니다.
이 방법은 시스템에 작업을 내장하는 데 특히 유용하며, 지속성을 제공합니다.
다음 스크립트는 Folder Action에 의해 실행될 수 있는 예입니다:
Folder Actions에서 위 스크립트를 사용 가능하게 하려면, 다음과 같이 컴파일하십시오:
스크립트가 컴파일된 후, 아래 스크립트를 실행하여 폴더 작업을 설정합니다. 이 스크립트는 폴더 작업을 전역적으로 활성화하고 이전에 컴파일된 스크립트를 데스크탑 폴더에 특별히 연결합니다.
설치 스크립트를 다음과 같이 실행하세요:
이 방법은 GUI를 통해 이 지속성을 구현하는 방법입니다:
이 스크립트는 실행될 것입니다:
다음으로 이동하십시오:
그런 다음, Folder Actions Setup
앱을 열고 감시할 폴더를 선택한 후, 귀하의 경우 **folder.scpt
**를 선택합니다 (제 경우에는 output2.scp라고 불렀습니다):
이제 Finder로 해당 폴더를 열면 스크립트가 실행됩니다.
이 구성은 base64 형식으로 **~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
**에 저장되었습니다.
이제 GUI 접근 없이 이 지속성을 준비해 보겠습니다:
**~/Library/Preferences/com.apple.FolderActionsDispatcher.plist
**를 /tmp
로 복사하여 백업합니다:
cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp
방금 설정한 Folder Actions를 제거합니다:
이제 빈 환경이 되었으니
백업 파일을 복사합니다: cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/
이 구성을 사용하기 위해 Folder Actions Setup.app를 엽니다: open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"
그리고 이것은 저에게는 작동하지 않았지만, 이것이 작성자의 지침입니다:(
작성자: https://theevilbit.github.io/beyond/beyond_0027/
~/Library/Preferences/com.apple.dock.plist
트리거: 사용자가 도크 내의 앱을 클릭할 때
도크에 나타나는 모든 애플리케이션은 plist 내에 지정되어 있습니다: ~/Library/Preferences/com.apple.dock.plist
다음과 같이 애플리케이션을 추가할 수 있습니다:
일부 소셜 엔지니어링을 사용하여 예를 들어 Google Chrome을 도크에서 가장하고 실제로 자신의 스크립트를 실행할 수 있습니다:
Writeup: https://theevilbit.github.io/beyond/beyond_0017
/Library/ColorPickers
루트 권한 필요
트리거: 색상 선택기 사용
~/Library/ColorPickers
트리거: 색상 선택기 사용
당신의 코드로 색상 선택기 번들을 컴파일하고 (예를 들어 이것을 사용할 수 있습니다) 생성자를 추가한 후 ( 스크린 세이버 섹션과 같이) 번들을 ~/Library/ColorPickers
에 복사합니다.
그런 다음 색상 선택기가 트리거되면 당신의 코드도 실행되어야 합니다.
당신의 라이브러리를 로드하는 바이너리가 매우 제한적인 샌드박스를 가지고 있다는 점에 유의하세요: /System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64
Writeup: https://theevilbit.github.io/beyond/beyond_0026/ Writeup: https://objective-see.org/blog/blog_0x11.html
샌드박스를 우회하는 데 유용함: 아니요, 자신의 앱을 실행해야 하기 때문입니다.
TCC 우회: ???
특정 앱
Finder Sync Extension이 있는 애플리케이션 예제 여기에서 찾을 수 있습니다.
애플리케이션은 Finder Sync Extensions
를 가질 수 있습니다. 이 확장은 실행될 애플리케이션 내부에 들어갑니다. 또한, 확장이 코드를 실행할 수 있으려면 유효한 Apple 개발자 인증서로 서명되어야 하며, 샌드박스화되어야 하고 (완화된 예외가 추가될 수 있지만) 다음과 같은 방식으로 등록되어야 합니다:
Writeup: https://theevilbit.github.io/beyond/beyond_0016/ Writeup: https://posts.specterops.io/saving-your-access-d562bf5bf90b
/System/Library/Screen Savers
루트 권한 필요
Trigger: 화면 보호기 선택
/Library/Screen Savers
루트 권한 필요
Trigger: 화면 보호기 선택
~/Library/Screen Savers
Trigger: 화면 보호기 선택
Xcode에서 새 프로젝트를 만들고 새 Screen Saver를 생성하기 위한 템플릿을 선택합니다. 그런 다음, 예를 들어 로그를 생성하기 위한 다음 코드를 추가합니다.
Build하고, .saver
번들을 **~/Library/Screen Savers
**로 복사합니다. 그런 다음, 화면 보호기 GUI를 열고 클릭하면 많은 로그가 생성되어야 합니다:
이 코드를 로드하는 바이너리의 권한 내에 **com.apple.security.app-sandbox
**가 있기 때문에, 당신은 일반 애플리케이션 샌드박스 안에 있게 됩니다.
Saver code:
writeup: https://theevilbit.github.io/beyond/beyond_0011/
~/Library/Spotlight/
트리거: Spotlight 플러그인에 의해 관리되는 확장자를 가진 새 파일이 생성됩니다.
/Library/Spotlight/
트리거: Spotlight 플러그인에 의해 관리되는 확장자를 가진 새 파일이 생성됩니다.
루트 권한 필요
/System/Library/Spotlight/
트리거: Spotlight 플러그인에 의해 관리되는 확장자를 가진 새 파일이 생성됩니다.
루트 권한 필요
Some.app/Contents/Library/Spotlight/
트리거: Spotlight 플러그인에 의해 관리되는 확장자를 가진 새 파일이 생성됩니다.
새 앱 필요
Spotlight는 macOS의 내장 검색 기능으로, 사용자가 컴퓨터의 데이터에 빠르고 포괄적으로 접근할 수 있도록 설계되었습니다. 이 빠른 검색 기능을 지원하기 위해 Spotlight는 독점 데이터베이스를 유지하고 대부분의 파일을 파싱하여 인덱스를 생성하여 파일 이름과 내용 모두를 통해 신속한 검색을 가능하게 합니다.
Spotlight의 기본 메커니즘은 **'메타데이터 서버'**를 의미하는 'mds'라는 중앙 프로세스를 포함합니다. 이 프로세스는 전체 Spotlight 서비스를 조정합니다. 이를 보완하기 위해 다양한 유지 관리 작업을 수행하는 여러 'mdworker' 데몬이 있으며, 다양한 파일 유형을 인덱싱하는 등의 작업을 수행합니다(ps -ef | grep mdworker
). 이러한 작업은 Spotlight가 다양한 파일 형식의 내용을 이해하고 인덱싱할 수 있도록 하는 Spotlight 가져오기 플러그인 또는 ".mdimporter 번들을 통해 가능해집니다.
플러그인 또는 .mdimporter
번들은 이전에 언급된 위치에 있으며, 새 번들이 나타나면 1분 이내에 로드됩니다(서비스를 재시작할 필요 없음). 이러한 번들은 어떤 파일 유형과 확장자를 관리할 수 있는지 표시해야 하며, 이 방식으로 Spotlight는 지정된 확장자를 가진 새 파일이 생성될 때 이를 사용합니다.
**모든 mdimporters
**를 찾는 것이 가능합니다:
예를 들어 /Library/Spotlight/iBooksAuthor.mdimporter는 이러한 유형의 파일(확장자 .iba
및 .book
등)을 구문 분석하는 데 사용됩니다:
다른 mdimporter
의 Plist를 확인하면 UTTypeConformsTo
항목을 찾지 못할 수도 있습니다. 이는 내장된 Uniform Type Identifiers (UTI)이기 때문이며, 확장자를 명시할 필요가 없습니다.
또한, 시스템 기본 플러그인은 항상 우선권을 가지므로, 공격자는 Apple의 mdimporters
에 의해 인덱싱되지 않은 파일에만 접근할 수 있습니다.
자신만의 importer를 만들려면 이 프로젝트에서 시작할 수 있습니다: https://github.com/megrimm/pd-spotlight-importer 그런 다음 이름, **CFBundleDocumentTypes
**를 변경하고 지원하고자 하는 확장자를 지원하도록 **UTImportedTypeDeclarations
**를 추가하고 이를 **schema.xml
**에 반영합니다.
그런 다음 GetMetadataForFile
함수의 코드를 변경하여 처리된 확장자를 가진 파일이 생성될 때 페이로드를 실행하도록 합니다.
마지막으로 **새로운 .mdimporter
**를 빌드하고 이전 위치 중 하나에 복사하면 로그를 모니터링하거나 **mdimport -L.
**을 확인하여 로드되었는지 확인할 수 있습니다.
더 이상 작동하지 않는 것 같습니다.
작성물: https://theevilbit.github.io/beyond/beyond_0009/
/System/Library/PreferencePanes
/Library/PreferencePanes
~/Library/PreferencePanes
더 이상 작동하지 않는 것 같습니다.
여기에서 샌드박스 우회에 유용한 시작 위치를 찾을 수 있으며, 이를 통해 루트로 파일에 작성하여 간단히 무언가를 실행할 수 있습니다. 또는 다른 이상한 조건이 필요합니다.
작성물: https://theevilbit.github.io/beyond/beyond_0019/
/etc/periodic/daily
, /etc/periodic/weekly
, /etc/periodic/monthly
, /usr/local/etc/periodic
루트 필요
트리거: 시간이 되었을 때
/etc/daily.local
, /etc/weekly.local
또는 /etc/monthly.local
루트 필요
트리거: 시간이 되었을 때
주기적 스크립트 (/etc/periodic
)는 /System/Library/LaunchDaemons/com.apple.periodic*
에 구성된 launch daemons 때문에 실행됩니다. /etc/periodic/
에 저장된 스크립트는 파일 소유자로서 실행되므로, 이는 잠재적인 권한 상승에는 작동하지 않습니다.
다른 주기적인 스크립트는 **/etc/defaults/periodic.conf
**에 표시된 대로 실행됩니다:
If you manage to write any of the files /etc/daily.local
, /etc/weekly.local
or /etc/monthly.local
it will be executed sooner or later.
Note that the periodic script will be executed as the owner of the script. So if a regular user owns the script, it will be executed as that user (this might prevent privilege escalation attacks).
Writeup: Linux Hacktricks PAM Writeup: https://theevilbit.github.io/beyond/beyond_0005/
Root always required
PAM은 지속성과 맬웨어에 더 중점을 두고 있기 때문에 macOS 내에서의 쉬운 실행에 대한 설명은 자세히 제공하지 않습니다. 이 기술을 더 잘 이해하려면 작성된 내용을 읽어보세요.
Check PAM modules with:
A persistence/privilege escalation technique abusing PAM은 /etc/pam.d/sudo 모듈을 수정하여 시작 부분에 다음 줄을 추가하는 것만큼 쉽습니다:
그래서 다음과 같은 모습이 될 것입니다:
그리고 따라서 sudo
를 사용할 수 있는 모든 시도는 작동할 것입니다.
이 디렉토리는 TCC에 의해 보호되므로 사용자가 접근 요청을 받는 것이 매우 가능성이 높습니다.
또 다른 좋은 예는 su입니다. 여기서 PAM 모듈에 매개변수를 제공하는 것도 가능하다는 것을 볼 수 있습니다(그리고 이 파일에 백도어를 걸 수도 있습니다):
Writeup: https://theevilbit.github.io/beyond/beyond_0028/ Writeup: https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65
샌드박스를 우회하는 데 유용: 🟠
하지만 루트 권한이 필요하고 추가 구성이 필요함
TCC 우회: ???
/Library/Security/SecurityAgentPlugins/
루트 권한 필요
플러그인을 사용하기 위해 권한 데이터베이스를 구성해야 함
사용자가 로그인할 때 실행되어 지속성을 유지하는 권한 플러그인을 생성할 수 있습니다. 이러한 플러그인을 만드는 방법에 대한 자세한 정보는 이전 작성물을 확인하세요(그리고 주의하세요, 잘못 작성된 플러그인은 당신을 잠글 수 있으며 복구 모드에서 맥을 정리해야 할 수 있습니다).
번들을 로드될 위치로 이동하십시오:
마지막으로 이 플러그인을 로드하기 위한 규칙을 추가하세요:
The **evaluate-mechanisms
**는 권한 부여 프레임워크에 권한 부여를 위한 외부 메커니즘을 호출해야 한다고 알립니다. 또한, **privileged
**는 루트에 의해 실행되도록 합니다.
Trigger it with:
그리고 staff 그룹은 sudo 접근 권한을 가져야 합니다 (확인을 위해 /etc/sudoers
를 읽으세요).
Writeup: https://theevilbit.github.io/beyond/beyond_0030/
/private/etc/man.conf
root 권한 필요
/private/etc/man.conf
: man이 사용될 때마다
설정 파일 **/private/etc/man.conf
**는 man 문서 파일을 열 때 사용할 바이너리/스크립트를 나타냅니다. 따라서 실행 파일의 경로를 수정하면 사용자가 문서를 읽기 위해 man을 사용할 때마다 백도어가 실행됩니다.
예를 들어 **/private/etc/man.conf
**에 설정:
그리고 /tmp/view
를 다음과 같이 생성합니다:
Writeup: https://theevilbit.github.io/beyond/beyond_0023/
/etc/apache2/httpd.conf
루트 권한 필요
트리거: Apache2가 시작될 때
/etc/apache2/httpd.conf
에서 모듈을 로드하도록 다음과 같은 줄을 추가할 수 있습니다:
이렇게 하면 컴파일된 모듈이 Apache에 의해 로드됩니다. 유일한 점은 유효한 Apple 인증서로 서명해야 하거나, 시스템에 새로운 신뢰할 수 있는 인증서를 추가하고 그것으로 서명해야 한다는 것입니다.
그런 다음, 필요하다면 서버가 시작될 것인지 확인하기 위해 다음을 실행할 수 있습니다:
Dylb에 대한 코드 예제:
Writeup: https://theevilbit.github.io/beyond/beyond_0031/
/etc/security/audit_warn
root 권한 필요
트리거: auditd가 경고를 감지할 때
auditd가 경고를 감지할 때마다 스크립트 **/etc/security/audit_warn
**이 실행됩니다. 따라서 여기에 페이로드를 추가할 수 있습니다.
You could force a warning with sudo audit -n
.
이것은 더 이상 사용되지 않으므로 해당 디렉토리에서 아무것도 발견되지 않아야 합니다.
StartupItem은 /Library/StartupItems/
또는 /System/Library/StartupItems/
내에 위치해야 하는 디렉토리입니다. 이 디렉토리가 설정되면 두 개의 특정 파일을 포함해야 합니다:
rc 스크립트: 시작 시 실행되는 셸 스크립트입니다.
plist 파일, 특히 StartupParameters.plist
라는 이름을 가진 파일로, 다양한 구성 설정을 포함합니다.
rc 스크립트와 StartupParameters.plist
파일이 StartupItem 디렉토리 내에 올바르게 배치되어야 시작 프로세스가 이를 인식하고 활용할 수 있습니다.
이 구성 요소를 제 macOS에서 찾을 수 없으므로 더 많은 정보는 작성물을 확인하세요.
작성물: https://theevilbit.github.io/beyond/beyond_0023/
Apple에 의해 도입된 emond는 개발이 미비하거나 아마도 포기된 것으로 보이는 로깅 메커니즘이지만 여전히 접근 가능합니다. Mac 관리자에게 특히 유용하지는 않지만, 이 불명확한 서비스는 위협 행위자에게 미세한 지속성 방법으로 작용할 수 있으며, 대부분의 macOS 관리자에게는 눈에 띄지 않을 가능성이 높습니다.
그 존재를 알고 있는 사람들에게 emond의 악의적인 사용을 식별하는 것은 간단합니다. 이 서비스의 시스템 LaunchDaemon은 단일 디렉토리에서 실행할 스크립트를 찾습니다. 이를 검사하기 위해 다음 명령을 사용할 수 있습니다:
Writeup: https://theevilbit.github.io/beyond/beyond_0018/
/opt/X11/etc/X11/xinit/privileged_startx.d
루트 권한 필요
트리거: XQuartz와 함께
XQuartz는 더 이상 macOS에 설치되지 않으므로, 더 많은 정보가 필요하면 작성물을 확인하세요.
루트로 설치하더라도 kext 설치가 너무 복잡해서 샌드박스를 우회하거나 지속성을 위해 고려하지 않을 것입니다 (익스플로잇이 없는 한).
KEXT를 시작 항목으로 설치하려면 다음 위치 중 하나에 설치해야 합니다:
/System/Library/Extensions
OS X 운영 체제에 내장된 KEXT 파일.
/Library/Extensions
서드파티 소프트웨어에 의해 설치된 KEXT 파일
현재 로드된 kext 파일을 나열하려면:
For more information about 커널 확장에 대한 이 섹션을 확인하세요.
Writeup: https://theevilbit.github.io/beyond/beyond_0029/
/usr/local/bin/amstoold
루트 권한 필요
명백히 /System/Library/LaunchAgents/com.apple.amstoold.plist
의 plist
가 이 바이너리를 사용하고 있었고 XPC 서비스가 노출되고 있었습니다... 문제는 바이너리가 존재하지 않았다는 것입니다. 그래서 그곳에 무언가를 배치하면 XPC 서비스가 호출될 때 당신의 바이너리가 호출됩니다.
이제 제 macOS에서 이걸 찾을 수 없습니다.
Writeup: https://theevilbit.github.io/beyond/beyond_0015/
/Library/Preferences/Xsan/.xsanrc
루트 권한 필요
트리거: 서비스가 실행될 때 (드물게)
명백히 이 스크립트를 실행하는 것은 그리 일반적이지 않으며, 제 macOS에서도 찾을 수 없었습니다. 더 많은 정보가 필요하면 writeup을 확인하세요.
이것은 최신 MacOS 버전에서 작동하지 않습니다
여기에 시작 시 실행될 명령어를 배치하는 것도 가능합니다. 예시로 일반 rc.common 스크립트:
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)