hacktricks/mobile-pentesting/ios-pentesting/ios-custom-uri-handlers-deeplinks-custom-schemes.md
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00

23 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

कस्टम URL स्कीम ऐप्स को एक कस्टम प्रोटोकॉल के माध्यम से संचार करने की अनुमति देते हैं। एक ऐप को स्कीम को घोषित करना होगा और उन URL को संभालना होगा जो उन स्कीम का उपयोग करते हैं।

URL स्कीम आपके ऐप में एक संभावित हमला वेक्टर प्रदान करते हैं, इसलिए सुनिश्चित करें कि सभी URL पैरामीटरों की पुष्टि करें और अवैध URL को छोड़ दें। इसके अलावा, उपयोगकर्ता के डेटा को जोखिम में न डालने वाले क्रियाएँ को ही उपलब्ध कराएं।

उदाहरण के लिए, URI: myapp://hostname?data=123876123 ऐप्लिकेशन mydata (जिसने स्कीम mydata को रजिस्टर किया है) को होस्टनेम hostname के संबंधित क्रिया को बुलाएगा और मान 123876123 के साथ पैरामीटर data को भेजेगा।

एक संकटग्रस्त उदाहरण है Skype Mobile ऐप में बग, जिसे 2010 में खोजा गया था: Skype ऐप ने skype:// प्रोटोकॉल हैंडलर को रजिस्टर किया था, जिसने अन्य ऐप्स को अन्य Skype उपयोगकर्ताओं और फ़ोन नंबरों पर कॉल करने की अनुमति दी। दुर्भाग्य से, Skype ने कॉल करने से पहले उपयोगकर्ताओं से अनुमति नहीं मांगी, इसलिए किसी भी ऐप ने उपयोगकर्ता के ज्ञान के बिना विभिन्न नंबरों पर कॉल कर सकता था। हमलावर ने इस संक्रमण का उपयोग करके एक अदृश्य <iframe src="skype://xxx?call"></iframe> (जहां xxx को एक प्रीमियम नंबर से बदल दिया गया था) रखा, इसलिए किसी भी Skype उपयोगकर्ता ने अनजाने में एक खतरनाक वेबसाइट पर जाने पर प्रीमियम नंबर को कॉल किया।

आप ऐप्लिकेशन द्वारा रजिस्टर किए गए स्कीम को ऐप के Info.plist फ़ाइल में ढूंढ़ सकते हैं, CFBundleURLTypes के लिए खोज करके (उदाहरण iGoat-Swift से):

<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.iGoat.myCompany</string>
<key>CFBundleURLSchemes</key>
<array>
<string>iGoat</string>
</array>
</dict>
</array>

यहां ध्यान दें, कि दुष्ट एप्लिकेशन URIs को पुनः पंजीकृत कर सकते हैं जो पहले से ही एप्लिकेशन्स द्वारा पंजीकृत हो चुके होते हैं। इसलिए, यदि आप URIs के माध्यम से संवेदनशील जानकारी भेज रहे हैं (myapp://hostname?password=123456), तो एक दुष्ट एप्लिकेशन इस संवेदनशील जानकारी के साथ URI को अवरोधित कर सकती है।

इसके अलावा, इन URIs का इनपुट जांचा और स्वच्छ किया जाना चाहिए, क्योंकि यह दुष्ट मूलों से आ सकता है जो SQLInjections, XSS, CSRF, Path Traversals या अन्य संभावित सुरक्षा दुरुपयोग करने की कोशिश कर रहे हों।

एप्लिकेशन क्वेरी स्कीम पंजीकरण

ऐप्स canOpenURL: को कॉल करके लक्षित ऐप्लिकेशन उपलब्ध है या नहीं की जांच कर सकते हैं। हालांकि, यह विधि दुष्ट ऐप्लिकेशन द्वारा स्थापित ऐप्स की गणना करने के रूप में इस्तेमाल की जा रही थी, iOS 9.0 से URL स्कीम्स को भी घोषित किया जाना चाहिए, ऐप के Info.plist फ़ाइल में LSApplicationQueriesSchemes कुंजी और अधिकतम 50 URL स्कीम्स की एक सरणी जोड़कर।

<key>LSApplicationQueriesSchemes</key>
<array>
<string>url_scheme1</string>
<string>url_scheme2</string>
</array>

canOpenURL हमेशा NO लौटाएगा अविणियत योजनाओं के लिए, चाहे उपयुक्त ऐप स्थापित हो या न हो। हालांकि, यह प्रतिबंध केवल canOpenURL के लिए ही लागू होता है।

URL हैंडलिंग और मान्यता की परीक्षण

URL पथ कैसे बनाया और मान्यता कैसे की जाती है इसे निर्धारित करने के लिए, यदि आपके पास मूल स्रोत कोड है, तो आप निम्नलिखित विधियों की खोज कर सकते हैं:

  • application:didFinishLaunchingWithOptions: विधि या application:will-FinishLaunchingWithOptions:: यह निर्णय कैसे लिया जाता है और URL के बारे में जानकारी कैसे प्राप्त की जाती है, इसे सत्यापित करें।
  • application:openURL:options:: यह सत्यापित करें कि संसाधन कैसे खोला जा रहा है, अर्थात डेटा कैसे पार्स किया जा रहा है, विकल्प की सत्यापन करें, विशेष रूप से यदि कॉलिंग ऐप द्वारा पहुंच (sourceApplication) की अनुमति देनी चाहिए या नहीं। कस्टम URL योजना का उपयोग करते समय ऐप को उपयोगकर्ता की अनुमति भी चाहिए सकती है।

टेलीग्राम में चार अलग-अलग विधियों का उपयोग किया जाता है:

func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool {
self.openUrl(url: url)
return true
}

func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
annotation: Any) -> Bool {
self.openUrl(url: url)
return true
}

func application(_ app: UIApplication, open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
self.openUrl(url: url)
return true
}

func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
self.openUrl(url: url)
return true
}

अन्य ऐप्स के लिए URL अनुरोधों का परीक्षण

विधि openURL:options:completionHandler: और विचलित UIApplication की openURL: विधि जिम्मेदार हैं URL खोलने के लिए (अर्थात अन्य ऐप्स को अनुरोध भेजने / प्रश्न करने के लिए) जो वर्तमान ऐप के लिए स्थानीय हो सकता है या यह एक ऐसा हो सकता है जिसे एक अलग ऐप द्वारा प्रदान किया जाना चाहिए। यदि आपके पास मूल स्रोत कोड है, तो आप सीधे उन विधियों के उपयोग की खोज कर सकते हैं।

इसके अलावा, यदि आप जानना चाहते हैं कि क्या ऐप विशेष सेवाओं या ऐप्स को प्रश्न कर रहा है, और यदि ऐप विख्यात है, तो आप ऑनलाइन सामान्य URL schemes की खोज कर सकते हैं और उन्हें अपने greps (liOS ऐप स्कीमों की सूची) में शामिल कर सकते हैं।

egrep -nr "open.*options.*completionHandler" ./Telegram-iOS/
egrep -nr "openURL\(" ./Telegram-iOS/
egrep -nr "mt-encrypted-file://" ./Telegram-iOS/
egrep -nr "://" ./Telegram-iOS/

विचलित विधियों के लिए परीक्षण

इस तरह के विचलित विधियों की खोज करें जैसे:

उदाहरण के लिए, यहां हम उन तीनों को खोजते हैं:

$ rabin2 -zzq Telegram\ X.app/Telegram\ X | grep -i "openurl"

0x1000d9e90 31 30 UIApplicationOpenURLOptionsKey
0x1000dee3f 50 49 application:openURL:sourceApplication:annotation:
0x1000dee71 29 28 application:openURL:options:
0x1000dee8e 27 26 application:handleOpenURL:
0x1000df2c9 9 8 openURL:
0x1000df766 12 11 canOpenURL:
0x1000df772 35 34 openURL:options:completionHandler:
...

अनियमित URL को बुलाना

  • Safari: एक URL scheme को जल्दी से टेस्ट करने के लिए आप Safari में URL को खोल सकते हैं और देख सकते हैं कि ऐप कैसे व्यवहार करता है। उदाहरण के लिए, यदि आप tel://123456789 लिखते हैं तो Safari कोशिश करेगा कि वह नंबर को कॉल करना शुरू करे।
  • Notes App: कस्टम URL scheme को टेस्ट करने के लिए आप लिंक को लंबे समय तक दबा सकते हैं। उन्हें खोलने के लिए संपादन मोड से बाहर निकलना न भूलें। ध्यान दें कि आप केवल ऐप स्थापित होने पर ही कस्टम URL scheme वाले लिंक पर क्लिक या लंबे समय तक दबा सकते हैं, अगर नहीं हैं तो वे क्लिक करने योग्य लिंक के रूप में हाइलाइट नहीं होंगे।
  • IDB:
  • IDB शुरू करें, अपनी डिवाइस से कनेक्ट करें और लक्षित ऐप का चयन करें। आप IDB दस्तावेज़ीकरण में विवरण देख सकते हैं।
  • URL Handlers खंड में जाएं। URL schemes में, Refresh पर क्लिक करें, और बाएं ओर आपको टेस्ट हो रहे ऐप में परिभाषित सभी कस्टम schemes की सूची मिलेगी। आप इन schemes को खोलकर उन्हें लोड कर सकते हैं, दाएं ओर Open पर क्लिक करके। एक सादा URI scheme (उदाहरण के लिए, myURLscheme:// खोलकर) खोलकर आप छिपी हुई कार्यक्षमता (उदाहरण के लिए, एक डिबग विंडो) का पता लगा सकते हैं और स्थानीय प्रमाणीकरण को छलना कर सकते हैं।
  • Frida:

यदि आप केवल URL scheme को खोलना चाहते हैं तो आप इसे Frida का उपयोग करके कर सकते हैं:

$ frida -U iGoat-Swift

[iPhone::iGoat-Swift]-> function openURL(url) {
var UIApplication = ObjC.classes.UIApplication.sharedApplication();
var toOpen = ObjC.classes.NSURL.URLWithString_(url);
return UIApplication.openURL_(toOpen);
}
[iPhone::iGoat-Swift]-> openURL("tel://234234234")
true

इस उदाहरण में Frida CodeShare से लेखक ने गैर-सार्वजनिक API LSApplicationWorkspace.openSensitiveURL:withOptions: का उपयोग करके URL को खोलने के लिए किया है (SpringBoard ऐप से):

function openURL(url) {
var w = ObjC.classes.LSApplicationWorkspace.defaultWorkspace();
var toOpen = ObjC.classes.NSURL.URLWithString_(url);
return w.openSensitiveURL_withOptions_(toOpen, null);
}

ध्यान दें कि गैर-सार्वजनिक API का उपयोग ऐप स्टोर पर अनुमति नहीं है, इसलिए हम इन्हें टेस्ट भी नहीं करते हैं, लेकिन हमें अपने डायनामिक विश्लेषण के लिए उनका उपयोग करने की अनुमति है।

URL Schemes को फज़िलता करना

यदि ऐप URL के भागों को पार्स करता है, तो आप मेमोरी कोरप्शन बग्स का पता लगाने के लिए इनपुट फज़िलता भी कर सकते हैं।

ऊपर जो हमने सीखा है, उसे अब अपनी पसंद की भाषा में अपने खुद के फज़र बनाने के लिए उपयोग किया जा सकता है, जैसे Python में और Frida के RPC का उपयोग करके openURL को कॉल करें। वह फज़र निम्नलिखित कार्य करना चाहिए:

  • पेलोड उत्पन्न करें।
  • प्रत्येक के लिए openURL को कॉल करें।
  • यह जांचें कि क्या ऐप क्रैश रिपोर्ट (.ips) उत्पन्न करता है /private/var/mobile/Library/Logs/CrashReporter में।

FuzzDB परियोजना फज़िलता शब्दकोश प्रदान करती है जिसका आप पेलोड के रूप में उपयोग कर सकते हैं।

Frida का उपयोग करके फज़िलता करना

Frida के साथ इसे करना बहुत आसान है, आप इस ब्लॉग पोस्ट का उल्लेख कर सकते हैं जो iGoat-Swift ऐप (iOS 11.1.2 पर काम करता है) को फज़िलता करता है।

फज़र चलाने से पहले हमें इनपुट के रूप में URL schemes की आवश्यकता होती है। स्टेटिक विश्लेषण से हम जानते हैं कि iGoat-Swift ऐप निम्नलिखित URL scheme और पैरामीटर का समर्थन करता है: iGoat://?contactNumber={0}&message={0}.

$ frida -U SpringBoard -l ios-url-scheme-fuzzing.js
[iPhone::SpringBoard]-> fuzz("iGoat", "iGoat://?contactNumber={0}&message={0}")
Watching for crashes from iGoat...
No logs were moved.
Opened URL: iGoat://?contactNumber=0&message=0

संदर्भ

{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥