
Apple MacOS Screen Sharing における任意ファイル読み取り/書き込み -> RCE
久しぶりに、MacOS で RCE が出ました。
元々は @osxreverser によって発見され、後に bynar.io によって拡張されました。詳細は https://blog.calif.io/p/no-country-for-old-passwords を参照してください。
これは主に、読み取り専用の PoC を公開した @panchocosil(いや、Claude...)の作業に由来しています。@HORKimhab のリポジトリは少し怪しいようです。特に get-svn.sh は後からサプライチェーン攻撃を仕掛ける試みのように見えます。
とにかく、私は書き込みを機能させることができ、そこから RCE に至りました。
usage: exploit.py [-h] [-w LOCAL] [-m MODE] [-p PORT] [-u USER] [-r RETRIES] [-t TIMEOUT] [-o FILE] ip [path]
-o を使用すると、読み取ったファイルをローカルファイルに書き出せます。バイナリに役立ちます。-w はローカルファイルを [path] に書き込むためのものです。ある程度可能です。MacOS では、ファイルではなくディレクトリに対して読み取りを実行すると、ディレクトリの生の内容(その中のすべてのファイル)がダンプされます。つまり、ファイルをリストできなくても問題はありません。
まずは少し偵察をします。python3 exploit.py <ip_addr> /Library/Preferences/com.apple.loginwindow.plist でログイン中のユーザーのユーザー名が取得できます。次に、/User/<username>/.ssh/ を読み取って、ssh も有効であることを願いましょう(通常、VNC が有効な場合、SSH も有効です)。
読み取りは root 権限で行われ、TCC を無視するため(私の理解では)、ブラウザの履歴や(おそらく?)クッキーをそのままダンプできます。通常、それで十分です。
どのような場合でも、/Library/LaunchDaemons/ に書き込んで再起動を待てば、永続化が得られます。しかしもちろん、私たちはせっかちなので、もっと良い方法があります。
上書きできる既存のレコードがよくあります。例えば、/Library/PrivilegedHelperTools/com.microsoft.autoupdate.helper、us.zoom.ZoomDaemon、com.microsoft.teams.TeamsUpdaterDaemon は一般的にインストールされているのが確認されます。
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AbandonProcessGroup</key>
<true/>
<key>Label</key>
<string>com.microsoft.EdgeUpdater.wake.system</string>
<key>LimitLoadToSessionType</key>
<string>System</string>
<key>ProgramArguments</key>
<array>
<string>/Library/Application Support/Microsoft/EdgeUpdater/Current/EdgeUpdater.app/Contents/MacOS/EdgeUpdater</string>
<string>--wake-all</string>
<string>--enable-logging</string>
<string>--vmodule=*/components/update_client/*=2,*/chrome/updater/*=2</string>
<string>--system</string>
</array>
<key>StartInterval</key>
<integer>3600</integer>
</dict>
</plist>
これを見ると、/Library/Application Support/Microsoft/EdgeUpdater/Current/EdgeUpdater.app/Contents/MacOS/EdgeUpdater にあるバイナリが一定間隔で実行されることがわかります。
その後、そのバイナリを置き換えれば、launchctl を操作する必要すらなく、RCE が得られます!
楽しいですね。