hacktricks/mobile-pentesting/ios-pentesting/ios-app-extensions.md

22 KiB

iOS ऐप एक्सटेंशन्स

AWS हैकिंग सीखें शुरुआत से लेकर एक्सपर्ट तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

सामग्री कॉपी की गई https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions से

ऐप एक्सटेंशन्स ऐप्स को अन्य ऐप्स या सिस्टम के साथ इंटरैक्ट करते समय यूजर्स को कस्टम फंक्शनैलिटी और कंटेंट प्रदान करने देते हैं। कुछ उल्लेखनीय हैं:

  • कस्टम कीबोर्ड: iOS सिस्टम कीबोर्ड को कस्टम कीबोर्ड से बदल देता है जिसका उपयोग सभी ऐप्स में किया जा सकता है।
  • शेयर: एक शेयरिंग वेबसाइट पर पोस्ट करें या दूसरों के साथ कंटेंट शेयर करें।
  • टुडे: जिसे विजेट्स भी कहा जाता है, वे नोटिफिकेशन सेंटर के टुडे व्यू में कंटेंट प्रदान करते हैं या त्वरित कार्य करते हैं।

उदाहरण के लिए, यूजर होस्ट ऐप में टेक्स्ट सेलेक्ट करता है, "शेयर" बटन पर क्लिक करता है और सूची से एक "ऐप" या एक्शन चुनता है। इससे कंटेनिंग ऐप का ऐप एक्सटेंशन ट्रिगर होता है। ऐप एक्सटेंशन अपना व्यू होस्ट ऐप के संदर्भ में प्रदर्शित करता है और होस्ट ऐप द्वारा प्रदान की गई आइटम्स का उपयोग करता है, इस मामले में चयनित टेक्स्ट, एक विशिष्ट कार्य करने के लिए (उदाहरण के लिए, इसे एक सोशल नेटवर्क पर पोस्ट करना)। इस Apple App Extension Programming Guide से ली गई यह तस्वीर इसे बहुत अच्छे से सारांशित करती है:

सुरक्षा विचार

सुरक्षा की दृष्टि से यह ध्यान देना महत्वपूर्ण है कि:

  • एक ऐप एक्सटेंशन कभी भी अपने कंटेनिंग ऐप के साथ सीधे संवाद नहीं करता (आमतौर पर, जब ऐप एक्सटेंशन चल रहा होता है तो कंटेनिंग ऐप चल नहीं रहा होता)।
  • एक ऐप एक्सटेंशन और होस्ट ऐप इंटर-प्रोसेस संचार के माध्यम से संवाद करते हैं
  • एक ऐप एक्सटेंशन का कंटेनिंग ऐप और होस्ट ऐप बिलकुल भी संवाद नहीं करते
  • एक टुडे विजेट (और कोई अन्य ऐप एक्सटेंशन प्रकार नहीं) NSExtensionContext क्लास के openURL:completionHandler: मेथड को कॉल करके सिस्टम से अपने कंटेनिंग ऐप को खोलने के लिए कह सकता है।
  • कोई भी ऐप एक्सटेंशन और इसका कंटेनिंग ऐप एक निजी रूप से परिभाषित साझा कंटेनर में साझा डेटा तक पहुंच सकते हैं
  • ऐप एक्सटेंशन्स कुछ APIs तक पहुंच नहीं सकते, उदाहरण के लिए, HealthKit।
  • वे AirDrop का उपयोग करके डेटा प्राप्त नहीं कर सकते लेकिन डेटा भेज सकते हैं।
  • कोई लंबे समय तक चलने वाले बैकग्राउंड कार्य अनुमति नहीं हैं लेकिन अपलोड या डाउनलोड शुरू किए जा सकते हैं।
  • ऐप एक्सटेंशन्स iOS डिवाइस पर कैमरा या माइक्रोफोन तक पहुंच नहीं सकते (iMessage ऐप एक्सटेंशन्स को छोड़कर)।

स्टैटिक विश्लेषण

यह जांचना कि ऐप में ऐप एक्सटेंशन्स हैं या नहीं

यदि आपके पास मूल स्रोत कोड है तो आप Xcode (cmd+shift+f) का उपयोग करके NSExtensionPointIdentifier की सभी घटनाओं की खोज कर सकते हैं या "Build Phases / Embed App extensions" में देख सकते हैं:

वहां आप .appex के बाद सभी एम्बेडेड ऐप एक्सटेंशन्स के नाम पा सकते हैं, अब आप प्रोजेक्ट में व्यक्तिगत ऐप एक्सटेंशन्स को नेविगेट कर सकते हैं।

यदि मूल स्रोत कोड नहीं है:

ऐप बंडल (IPA या इंस्टॉल्ड ऐप) के अंदर सभी फाइलों में NSExtensionPointIdentifier के लिए Grep करें:

$ grep -nr NSExtensionPointIdentifier Payload/Telegram\ X.app/
Binary file Payload/Telegram X.app//PlugIns/SiriIntents.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/Share.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/NotificationContent.appex/Info.plist matches
Binary file Payload/Telegram X.app//PlugIns/Widget.appex/Info.plist matches
Binary file Payload/Telegram X.app//Watch/Watch.app/PlugIns/Watch Extension.appex/Info.plist matches

आप SSH के माध्यम से भी पहुँच सकते हैं, ऐप बंडल को ढूँढ सकते हैं और सभी अंदर के PlugIns की सूची बना सकते हैं (वे डिफ़ॉल्ट रूप से वहाँ रखे जाते हैं) या इसे objection के साथ कर सकते हैं:

ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # cd PlugIns
/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/
Telegram X.app/PlugIns

ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # ls
NSFileType      Perms  NSFileProtection    Read    Write     Name
------------  -------  ------------------  ------  -------   -------------------------
Directory         493  None                True    False     NotificationContent.appex
Directory         493  None                True    False     Widget.appex
Directory         493  None                True    False     Share.appex
Directory         493  None                True    False     SiriIntents.appex

हम अब वही चार ऐप एक्सटेंशन देख सकते हैं जो हमने Xcode में पहले देखे थे।

समर्थित डेटा प्रकारों का निर्धारण

यह होस्ट ऐप्स के साथ साझा किए जा रहे डेटा के लिए महत्वपूर्ण है (उदाहरण के लिए Share या Action Extensions के माध्यम से)। जब उपयोगकर्ता होस्ट ऐप में किसी डेटा प्रकार का चयन करता है और यह यहां परिभाषित डेटा प्रकारों से मेल खाता है, तो होस्ट ऐप एक्सटेंशन की पेशकश करेगा। UIActivity के माध्यम से डेटा साझा करने और यहां के अंतर को देखना महत्वपूर्ण है जहां हमें दस्तावेज़ प्रकारों को परिभाषित करना था, UTIs का उपयोग करके भी। इसके लिए ऐप को एक्सटेंशन की आवश्यकता नहीं होती है। केवल UIActivity का उपयोग करके डेटा साझा करना संभव है।

ऐप एक्सटेंशन की Info.plist फ़ाइल का निरीक्षण करें और NSExtensionActivationRule के लिए खोज करें। वह कुंजी समर्थित डेटा को निर्दिष्ट करती है और उदाहरण के लिए, समर्थित आइटमों की अधिकतम संख्या भी। उदाहरण के लिए:

<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>10</integer>
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
</dict>

केवल यहाँ प्रस्तुत डेटा प्रकार और जिनका MaxCount 0 नहीं है, उन्हें समर्थन दिया जाएगा। हालांकि, एक तथाकथित प्रेडिकेट स्ट्रिंग का उपयोग करके अधिक जटिल फिल्टरिंग संभव है जो दिए गए UTIs का मूल्यांकन करेगा। इसके बारे में अधिक विस्तृत जानकारी के लिए कृपया Apple App Extension Programming Guide देखें।

मुख्य ऐप के साथ डेटा साझा करने की जांच

याद रखें कि ऐप एक्सटेंशन और उनके मुख्य ऐप्स के पास एक दूसरे के कंटेनरों तक सीधी पहुंच नहीं होती है। हालांकि, डेटा साझा करना सक्षम किया जा सकता है। यह "App Groups" और NSUserDefaults API के माध्यम से किया जाता है। Apple App Extension Programming Guide से इस चित्र को देखें:

गाइड में भी उल्लेखित है, यदि ऐप एक्सटेंशन NSURLSession क्लास का उपयोग करके पृष्ठभूमि अपलोड या डाउनलोड करने के लिए करता है, तो ऐप को एक साझा कंटेनर सेट अप करना चाहिए, ताकि एक्सटेंशन और उसके मुख्य ऐप दोनों ही स्थानांतरित डेटा तक पहुंच सकें।

यह सत्यापित करना कि ऐप ऐप एक्सटेंशन के उपयोग को प्रतिबंधित करता है या नहीं

विशिष्ट प्रकार के ऐप एक्सटेंशन को अस्वीकार करना संभव है, निम्नलिखित विधि का उपयोग करके:

हालांकि, यह वर्तमान में केवल "कस्टम कीबोर्ड" ऐप एक्सटेंशन के लिए संभव है (और जब कीबोर्ड के माध्यम से संवेदनशील डेटा को संभालने वाले ऐप्स का परीक्षण करते समय सत्यापित किया जाना चाहिए जैसे कि बैंकिंग ऐप्स)।

डायनामिक विश्लेषण

स्रोत कोड के बिना ज्ञान प्राप्त करने के लिए हम निम्नलिखित कर सकते हैं:

  • साझा किए जा रहे आइटमों का निरीक्षण करना
  • शामिल ऐप एक्सटेंशन की पहचान करना

साझा किए जा रहे आइटमों का निरीक्षण करना

इसके लिए हमें डेटा उत्पन्न करने वाले ऐप में NSExtensionContext - inputItems को हुक करना चाहिए।

पिछले उदाहरण के अनुसार टेलीग्राम का उपयोग करते हुए हम अब एक टेक्स्ट फाइल पर "Share" बटन का उपयोग करेंगे (जो एक चैट से प्राप्त हुई थी) ताकि उसके साथ नोट्स ऐप में एक नोट बनाया जा सके:

यदि हम एक ट्रेस चलाते हैं, तो हमें निम्नलिखित आउटपुट दिखाई देगा:

(0x1c06bb420) NSExtensionContext - inputItems
0x18284355c Foundation!-[NSExtension _itemProviderForPayload:extensionContext:]
0x1828447a4 Foundation!-[NSExtension _loadItemForPayload:contextIdentifier:completionHandler:]
0x182973224 Foundation!__NSXPCCONNECTION_IS_CALLING_OUT_TO_EXPORTED_OBJECT_S3__
0x182971968 Foundation!-[NSXPCConnection _decodeAndInvokeMessageWithEvent:flags:]
0x182748830 Foundation!message_handler
0x181ac27d0 libxpc.dylib!_xpc_connection_call_event_handler
0x181ac0168 libxpc.dylib!_xpc_connection_mach_event
...
RET: (
"<NSExtensionItem: 0x1c420a540> - userInfo:
{
NSExtensionItemAttachmentsKey =     (
"<NSItemProvider: 0x1c46b30e0> {types = (\n \"public.plain-text\",\n \"public.file-url\"\n)}"
);
}"
)

हम यहाँ देख सकते हैं कि:

  • यह XPC के माध्यम से अंतर्निहित रूप से हुआ, विशेष रूप से यह NSXPCConnection के माध्यम से लागू किया गया है जो libxpc.dylib फ्रेमवर्क का उपयोग करता है।
  • NSItemProvider में शामिल UTIs public.plain-text और public.file-url हैं, बाद वाला NSExtensionActivationRule में शामिल है जो Telegram के "Share Extension" के Info.plist से है।

संलग्न ऐप एक्सटेंशन की पहचान करना

आप यह भी पता लगा सकते हैं कि कौन सा ऐप एक्सटेंशन आपके अनुरोधों और प्रतिक्रियाओं की देखभाल कर रहा है, NSExtension - _plugIn को हुक करके:

हम फिर से वही उदाहरण चलाते हैं:

(0x1c0370200) NSExtension - _plugIn
RET: <PKPlugin: 0x1163637f0 ph.telegra.Telegraph.Share(5.3) 5B6DE177-F09B-47DA-90CD-34D73121C785
1(2) /private/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35
/Telegram X.app/PlugIns/Share.appex>

(0x1c0372300)  -[NSExtension _plugIn]
RET: <PKPlugin: 0x10bff7910 com.apple.mobilenotes.SharingExtension(1.5) 73E4F137-5184-4459-A70A-83
F90A1414DC 1(2) /private/var/containers/Bundle/Application/5E267B56-F104-41D0-835B-F1DAB9AE076D
/MobileNotes.app/PlugIns/com.apple.mobilenotes.SharingExtension.appex>

जैसा कि आप देख सकते हैं, दो ऐप एक्सटेंशन शामिल हैं:

  • Share.appex टेक्स्ट फाइल भेज रहा है (public.plain-text और public.file-url).
  • com.apple.mobilenotes.SharingExtension.appex जो टेक्स्ट फाइल प्राप्त करेगा और उसे प्रोसेस करेगा।

यदि आप XPC के अंतर्गत क्या हो रहा है, इसके बारे में और जानना चाहते हैं, तो हम "libxpc.dylib" से आंतरिक कॉल्स पर नजर डालने की सलाह देते हैं। उदाहरण के लिए आप frida-trace का उपयोग कर सकते हैं और फिर आपको जो मेथड्स अधिक रोचक लगें उनमें गहराई से जाने के लिए स्वचालित रूप से उत्पन्न स्टब्स का विस्तार कर सकते हैं।

Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

  • यदि आप चाहते हैं कि आपकी कंपनी का विज्ञापन HackTricks में दिखाई दे या HackTricks को PDF में डाउनलोड करें, तो SUBSCRIPTION PLANS देखें!
  • official PEASS & HackTricks swag प्राप्त करें।
  • The PEASS Family की खोज करें, हमारा विशेष NFTs संग्रह।
  • 💬 Discord group या telegram group में शामिल हों या Twitter पर मुझे 🐦 @carlospolopm का पालन करें
  • HackTricks के github repos और HackTricks Cloud में PRs सबमिट करके अपनी हैकिंग ट्रिक्स साझा करें।