macOS Auto Start
이 섹션은 블로그 시리즈 Beyond the good ol' LaunchAgents를 기반으로 하며, 목표는 더 많은 자동 시작 위치를 추가하고, 최신 macOS 버전(13.4)에서 여전히 작동하는 기술을 나타내며 필요한 권한을 명시하는 것입니다.
샌드박스 우회
여기에서는 샌드박스 우회에 유용한 시작 위치를 찾을 수 있습니다. 이를 통해 파일에 작성하고 매우 일반적인 동작, 특정 시간 또는 루트 권한이 필요하지 않은 샌드박스 내부에서 일반적으로 수행할 수 있는 동작을 기다려 간단히 무언가를 실행할 수 있습니다.
Launchd
위치
/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를 사용할 수 있지만 데몬은 백그라운드에서 실행되어야 합니다.
사용자 로그인 전에 실행되어야 하는 경우가 있는데, 이를 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
현재 사용자에 의해 로드된 모든 에이전트와 데몬을 나열하십시오:
만약 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.plist
의CFPluginFactories
사전의FB86416D-6164-2070-726F-70735C216EC0
키 아래에서 초기화 프로그램을 나타냅니다.
셸 시작 파일
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를 통해 장치에 액세스할 때 자동으로 액세스됩니다. macOS에는 bash
와 sh
도 있지만 명시적으로 호출하여 사용해야 합니다.
우리가 **man zsh
**로 읽을 수 있는 zsh의 man 페이지에는 시작 파일에 대한 상세한 설명이 있습니다.
다시 열린 애플리케이션
지정된 악용을 구성하고 로그아웃 및 로그인 또는 심지어 재부팅을 해도 앱을 실행할 수 없었습니다. (앱이 실행되지 않았습니다. 아마도 이러한 작업이 수행될 때 실행 중이어야 할 수도 있습니다)
Writeup: 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
트리거: 터미널 열기
설명 및 공격
**~/Library/Preferences
**에는 사용자의 응용 프로그램 환경 설정이 저장됩니다. 이러한 환경 설정 중 일부는 다른 응용 프로그램/스크립트를 실행할 수 있는 구성을 보유할 수 있습니다.
예를 들어, 터미널은 시작 시 명령을 실행할 수 있습니다:
이 구성은 파일 **~/Library/Preferences/com.apple.Terminal.plist
**에 다음과 같이 반영됩니다:
그래서, 시스템의 터미널 환경 설정 파일(plist)이 덮어쓰여진다면, open
기능을 사용하여 터미널을 열고 해당 명령이 실행될 수 있습니다.
다음 명령을 사용하여 cli에서 이를 추가할 수 있습니다:
터미널 스크립트 / 다른 파일 확장자
위치
어디서나
트리거: 터미널 열기
설명 및 악용
만약 .terminal
스크립트를 생성하고 열면, 터미널 애플리케이션이 자동으로 호출되어 거기에 표시된 명령을 실행합니다. 터미널 앱에 특별한 권한(예: TCC)이 있는 경우, 해당 특별한 권한으로 명령이 실행됩니다.
다음과 함께 시도해보세요:
오디오 플러그인
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 또는 컴퓨터 재시작
설명
이전의 글들에 따르면 일부 오디오 플러그인을 컴파일하고 로드할 수 있습니다.
QuickLook 플러그인
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 플러그인은 파일 미리보기를 트리거할 때(파인더에서 파일을 선택한 상태에서 스페이스 바를 누름) 해당 파일 유형을 지원하는 플러그인이 설치되어 있으면 실행됩니다.
자체 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
에 저장됩니다.
삭제하려면:
루트 사용자는 **/private/var/root/Library/Preferences/com.apple.loginwindow.plist
**에 저장됩니다.
조건부 샌드박스 우회
여기에서는 샌드박스 우회에 유용한 시작 위치를 찾을 수 있습니다. 이를 통해 파일에 쓰기만으로 간단히 무언가를 실행할 수 있고, 특정 프로그램이 설치되어 있거나 "일반적이지 않은" 사용자 조치 또는 환경과 같이 특정하지 않은 조건을 기대할 필요가 없습니다.
크론
Writeup: https://theevilbit.github.io/beyond/beyond_0004/
위치
/usr/lib/cron/tabs/
,/private/var/at/tabs
,/private/var/at/jobs
,/etc/periodic/
직접 쓰기 액세스를 위해서는 루트가 필요함.
crontab <file>
을 실행할 수 있다면 루트가 필요하지 않음트리거: 크론 작업에 따라 다름
설명 및 악용
현재 사용자의 크론 작업을 나열하려면:
맥OS에서는 /usr/lib/cron/tabs/
및 **/var/at/tabs/
**에서 사용자의 모든 cron 작업을 볼 수 있습니다 (루트 권한 필요).
맥OS에서는 일정한 빈도로 스크립트를 실행하는 여러 폴더를 다음 위치에서 찾을 수 있습니다:
다음에서는 일반 cron 작업, at 작업 (거의 사용되지 않음) 및 주기적 작업 (주로 임시 파일을 정리하는 데 사용됨)을 찾을 수 있습니다. 매일 주기적 작업은 다음과 같이 실행할 수 있습니다: periodic daily
.
사용자 cron 작업을 프로그래밍 방식으로 추가하는 방법은 다음과 같습니다:
iTerm2
Writeup: https://theevilbit.github.io/beyond/beyond_0002/
위치
~/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
**에 저장된 스크립트가 실행됩니다. 예를 들어:
macOS Auto Start Locations
macOS provides several locations where programs can be configured to automatically start when a user logs in. These locations include:
Login Items: Found in System Preferences > Users & Groups > Login Items. Applications added here will launch when the user logs in.
Launch Agents: Located in
~/Library/LaunchAgents
and/Library/LaunchAgents
. These are used to run programs when a user logs in.Launch Daemons: Found in
/Library/LaunchDaemons
and/System/Library/LaunchDaemons
. These are used to start system-wide services.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.
스크립트 **~/Library/Application Support/iTerm2/Scripts/AutoLaunch.scpt
**도 실행됩니다:
iTerm2 환경 설정은 **~/Library/Preferences/com.googlecode.iterm2.plist
**에 위치하며, iTerm2 터미널이 열릴 때 실행할 명령을 나타낼 수 있습니다.
이 설정은 iTerm2 설정에서 구성할 수 있습니다:
그리고 해당 명령은 환경 설정에 반영됩니다:
다음과 같이 명령을 실행하도록 설정할 수 있습니다:
iTerm2 환경 설정을 남용하여 임의의 명령을 실행할 수 있는 다른 방법이 있을 가능성이 매우 높습니다.
xbar
Writeup: https://theevilbit.github.io/beyond/beyond_0007/
위치
~/Library/Application\ Support/xbar/plugins/
트리거: xbar가 실행될 때
설명
인기 있는 프로그램 xbar가 설치되어 있다면, **~/Library/Application\ Support/xbar/plugins/
**에 셸 스크립트를 작성하여 xbar가 시작될 때 실행될 수 있습니다:
Hammerspoon
설명: https://theevilbit.github.io/beyond/beyond_0008/
위치
~/.hammerspoon/init.lua
트리거: Hammerspoon이 실행될 때
설명
Hammerspoon은 macOS용 자동화 플랫폼으로, 작업에 LUA 스크립팅 언어를 활용합니다. 특히, 완전한 AppleScript 코드의 통합과 셸 스크립트의 실행을 지원하여 스크립팅 기능을 크게 향상시킵니다.
이 앱은 단일 파일인 ~/.hammerspoon/init.lua
를 찾고, 시작되면 해당 스크립트가 실행됩니다.
BetterTouchTool
위치
~/Library/Application Support/BetterTouchTool/*
이 도구는 일부 단축키가 눌렸을 때 실행할 애플리케이션 또는 스크립트를 지정할 수 있습니다. 공격자는 자신의 단축키 및 동작을 데이터베이스에서 실행하도록 구성하여 임의의 코드를 실행하게 할 수 있습니다 (단축키는 키를 누르는 것만으로도 가능합니다).
Alfred
위치
???
특정 조건이 충족될 때 코드를 실행할 수 있는 워크플로우를 생성할 수 있습니다. 공격자가 워크플로우 파일을 만들고 Alfred가 로드하도록 만들 수 있습니다 (워크플로우를 사용하려면 프리미엄 버전을 구매해야 함).
SSHRC
Writeup: https://theevilbit.github.io/beyond/beyond_0006/
위치
~/.ssh/rc
트리거: ssh를 통한 로그인
/etc/ssh/sshrc
루트 권한 필요
트리거: ssh를 통한 로그인
ssh를 켜려면 전체 디스크 액세스가 필요합니다:
설명 및 Exploitation
기본적으로 /etc/ssh/sshd_config
에서 PermitUserRC no
가 아닌 경우, 사용자가 SSH를 통해 로그인할 때 스크립트 /etc/ssh/sshrc
및 **~/.ssh/rc
**가 실행됩니다.
로그인 항목
Writeup: https://theevilbit.github.io/beyond/beyond_0003/
위치
~/Library/Application Support/com.apple.backgroundtaskmanagementagent
트리거: 로그인
Exploit 페이로드는 **
osascript
**를 호출하여 저장됨/var/db/com.apple.xpc.launchd/loginitems.501.plist
트리거: 로그인
루트 권한 필요
설명
시스템 환경설정 -> 사용자 및 그룹 -> 로그인 항목에서 사용자 로그인 시 실행되는 항목을 찾을 수 있습니다. 이를 목록화하고 명령줄에서 추가하거나 제거할 수 있습니다:
이러한 항목들은 ~/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
**을 실행해야 하며 활성화되어 있어야 함
설명
at
작업은 특정 시간에 실행되는 일회성 작업을 예약하는 데 사용됩니다. cron 작업과 달리 at
작업은 실행 후 자동으로 제거됩니다. 이러한 작업은 시스템 재부팅 후에도 지속되므로 특정 조건에서 보안 문제가 될 수 있습니다.
기본적으로 비활성화되어 있지만 루트 사용자는 다음과 같이 활성화할 수 있습니다: