
Apple MacOS Screen Sharing मनमानी फ़ाइल पढ़ना/लिखना -> RCE
काफी समय बाद, हमें MacOS पर RCE मिला है।
मूल रूप से @osxreverser द्वारा खोजा गया, और बाद में bynar.io द्वारा विस्तारित किया गया। कुछ और जानकारी के लिए https://blog.calif.io/p/no-country-for-old-passwords देखें।
यह मुख्य रूप से @panchocosil के काम से लिया गया है (ठीक है, Claude...), जिन्होंने एक Read-only PoC प्रकाशित किया था। @HORKimhab का रिपो थोड़ा बकवास लगता है, खासकर वह get-svn.sh जो बाद में सप्लाई चेन हमले का एक प्रयास लगता है।
खैर, मैं write को काम करवाने में सक्षम हुआ और उससे 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 भी होता है)।
चूँकि read 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 मिल जाता है!
मज़ेदार बात है।