17 KiB
macOSの自動起動場所
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。
以下は、ユーザーの操作なしにバイナリが実行される可能性のあるシステム上の場所です。
Launchd
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>/Users/username/malware</string>
</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
にも見つけることができます(こちらに例があります)。
{% hint style="info" %} 新しいデーモンまたはエージェントの設定ファイルは、次回の再起動後または launchctl load <target.plist>
を使用してロードされます。また、launchctl -F <file>
を使用して拡張子なしで.plistファイルをロードすることも可能です(ただし、これらのplistファイルは自動的に再起動後にロードされません)。
launchctl unload <target.plist>
を使用してアンロードすることも可能です(それによって指定されたプロセスは終了します)。
エージェントまたはデーモンが実行されるのを妨げる(オーバーライドなど)何もないことを確認するには、次のコマンドを実行します:sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist
{% endhint %}
現在のユーザーによってロードされているすべてのエージェントとデーモンをリストアップします:
launchctl list
Cron
以下のコマンドで、現在のユーザーのcronジョブをリストします。
crontab -l
ユーザーのすべてのcronジョブは、**/usr/lib/cron/tabs/
と/var/at/tabs/
**で確認できます(root権限が必要です)。
MacOSでは、特定の頻度でスクリプトを実行するいくつかのフォルダが見つかります。
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
以下では、通常のcronジョブ、あまり使用されないatジョブ、および一時ファイルのクリーニングに主に使用される定期ジョブを見つけることができます。たとえば、デイリーの定期ジョブは次のように実行できます:periodic daily
。
定期スクリプト(/etc/periodic
)は、/System/Library/LaunchDaemons/com.apple.periodic*
に設定されたランチデーモンのために実行されます。スクリプトが特権を昇格させるために/etc/periodic/
に保存されている場合、それはファイルの所有者として実行されることに注意してください。
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
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
詳細については、カーネル拡張に関するこのセクションを参照してください。
ログインアイテム
システム環境設定 -> ユーザーとグループ -> ログインアイテムでは、ユーザーがログインするときに実行されるアイテムを見つけることができます。
これらをリストアップしたり、コマンドラインから追加や削除することが可能です。
#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"'
これらのアイテムは、ファイル/Users//Library/Application Support/com.apple.backgroundtaskmanagementagentに保存されています。
At
「Atタスク」は、特定の時間にタスクをスケジュールするために使用されます。
これらのタスクはcronと異なり、一度だけ実行された後に削除される一時的なタスクです。ただし、システムの再起動後も残り続けるため、潜在的な脅威として排除することはできません。
デフォルトでは無効化されていますが、rootユーザーはこれらを有効化することができます。
sudo launchctl load -F /System/Library/LaunchDaemons/com.apple.atrun.plist
これにより、13:37にファイルが作成されます。
echo hello > /tmp/hello | at 1337
ログイン/ログアウトフック
これらは非推奨ですが、ユーザーがログインする際にコマンドを実行するために使用することができます。
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
この設定は/Users/$USER/Library/Preferences/com.apple.loginwindow.plist
に保存されています。
defaults read /Users/$USER/Library/Preferences/com.apple.loginwindow.plist
{
LoginHook = "/Users/username/hook.sh";
MiniBuddyLaunch = 0;
TALLogoutReason = "Shut Down";
TALLogoutSavesState = 0;
oneTimeSSMigrationComplete = 1;
}
削除するには:
defaults delete com.apple.loginwindow LoginHook
前の例では、LoginHookを作成して削除しましたが、LogoutHookも作成することができます。
rootユーザーの場合、それは/private/var/root/Library/Preferences/com.apple.loginwindow.plist
に保存されます。
Emond
Appleはemondというログ記録メカニズムを導入しました。これは完全に開発されなかったようで、Appleは他のメカニズムのために放棄した可能性がありますが、それは利用可能なままです。
このあまり知られていないサービスは、Macの管理者にはあまり役に立たないかもしれませんが、脅威の存在する者にとっては、macOSの管理者のほとんどが知らない永続性メカニズムとして使用する非常に良い理由となるでしょう。 emondの悪用を検出することは難しくありません。なぜなら、サービスのためのSystem LaunchDaemonはスクリプトを実行する場所を1つだけ探しに行くからです:
ls -l /private/var/db/emondClients
{% hint style="danger" %} あまり使用されていないため、そのフォルダ内のすべてのものは疑わしいものと見なすべきです {% endhint %}
スタートアップアイテム
{% hint style="danger" %} これは非推奨ですので、以下のディレクトリには何も見つかるべきではありません。 {% endhint %}
StartupItemは、次の2つのフォルダのいずれかに配置されるディレクトリです。/Library/StartupItems/
または/System/Library/StartupItems/
これらの2つの場所のいずれかに新しいディレクトリを配置した後、そのディレクトリ内に2つのアイテムをさらに配置する必要があります。これらの2つのアイテムは、rcスクリプトといくつかの設定を保持するplistです。このplistは「StartupParameters.plist」と呼ばれる必要があります。
{% tabs %} {% tab title="StartupParameters.plist" %}
<?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>
{% tab title="superservicename" %}スーパーサービス名
#!/bin/sh
. /etc/rc.common
StartService(){
touch /tmp/superservicestarted
}
StopService(){
rm /tmp/superservicestarted
}
RestartService(){
echo "Restarting"
}
RunService "$1"
{% endtab %} {% endtabs %}
/etc/rc.common
{% hint style="danger" %} これは最新のMacOSバージョンでは機能しません {% endhint %}
ここには**起動時に実行されるコマンドを配置することもできます。**通常の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
}
プロファイル
設定プロファイルは、ユーザーに特定のブラウザの設定、DNSプロキシの設定、またはVPNの設定を使用させることができます。その他にも、悪用される可能性のある多くのペイロードが存在します。
以下のコマンドを実行して、それらを列挙することができます。
ls -Rl /Library/Managed\ Preferences/
その他の持続性の技術とツール
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを発見しましょう。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。