hacktricks/mobile-pentesting/ios-pentesting/ios-custom-uri-handlers-deeplinks-custom-schemes.md

195 lines
23 KiB
Markdown
Raw Normal View History

2022-04-28 16:01:33 +00:00
<details>
<summary><strong>शून्य से नायक तक AWS हैकिंग सीखें</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> के साथ!</strong></summary>
2022-04-28 16:01:33 +00:00
HackTricks का समर्थन करने के अन्य तरीके:
2022-04-28 16:01:33 +00:00
* यदि आप **HackTricks में अपनी कंपनी का विज्ञापन देखना चाहते हैं** या **HackTricks को PDF में डाउनलोड करना चाहते हैं** तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
* [**आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें**](https://peass.creator-spring.com)
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) संग्रह
* 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) में **शामिल हों** या [**telegram group**](https://t.me/peass) या **Twitter** पर मुझे 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) **का अनुसरण करें**.
* [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos में PRs सबमिट करके अपनी हैकिंग ट्रिक्स साझा करें।
2022-04-28 16:01:33 +00:00
</details>
कस्टम URL स्कीम्स [एप्स को कस्टम प्रोटोकॉल के माध्यम से संवाद करने की अनुमति देती हैं](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW1). एक एप्लिकेशन को स्कीम्स के लिए समर्थन घोषित करना चाहिए और उन स्कीम्स का उपयोग करने वाले आने वाले URLs को संभालना चाहिए।
2021-05-21 16:38:18 +00:00
> URL स्कीम्स आपके एप्लिकेशन में एक संभावित हमले का मार्ग प्रदान करती हैं, इसलिए सुनिश्चित करें कि **सभी URL पैरामीटर्स को मान्य करें** और **किसी भी गलत बनाए गए URLs को अस्वीकार करें**. इसके अलावा, उपलब्ध **क्रियाओं** को सीमित करें जो **उपयोगकर्ता के डेटा के जोखिम में नहीं हैं**।
2021-05-21 16:38:18 +00:00
उदाहरण के लिए, URI: `myapp://hostname?data=123876123` **एप्लिकेशन** mydata को **आमंत्रित** करेगा (जिसने स्कीम `mydata` को **रजिस्टर** किया है) **क्रिया** के लिए जो **hostname** `hostname` से संबंधित है, **पैरामीटर** `data` के साथ मान `123876123` भेज रहा है।
2021-05-21 16:38:18 +00:00
एक संवेदनशील उदाहरण निम्नलिखित [Skype Mobile एप्लिकेशन में बग](http://www.dhanjani.com/blog/2010/11/insecure-handling-of-url-schemes-in-apples-ios.html) है, जो 2010 में खोजा गया था: Skype एप्लिकेशन ने `skype://` प्रोटोकॉल हैंडलर को रजिस्टर किया था, जिसने **अन्य एप्स को अन्य Skype उपयोगकर्ताओं और फोन नंबरों को कॉल करने की अनुमति दी**। दुर्भाग्यवश, Skype ने कॉल करने से पहले उपयोगकर्ताओं से अनुमति नहीं मांगी, इसलिए कोई भी एप्लिकेशन उपयोगकर्ता की जानकारी के बिना मनमाने नंबरों पर कॉल कर सकता था। हमलावरों ने इस कमजोरी का फायदा उठाया एक अदृश्य `<iframe src="skype://xxx?call"></iframe>` (जहां `xxx` को एक प्रीमियम नंबर से बदल दिया गया था) डालकर, इसलिए कोई भी Skype उपयोगकर्ता जो गलती से एक दुर्भावनापूर्ण वेबसाइट पर गया, उसने प्रीमियम नंबर पर कॉल किया।
2021-05-21 16:38:18 +00:00
आप एप्लिकेशन द्वारा **रजिस्टर की गई स्कीम्स** को एप्लिकेशन की **`Info.plist`** फाइल में **`CFBundleURLTypes`** की खोज करके पा सकते हैं (उदाहरण [iGoat-Swift](https://github.com/OWASP/iGoat-Swift) से):
2021-05-21 16:38:18 +00:00
```markup
<key>CFBundleURLTypes</key>
<array>
2023-11-06 08:38:02 +00:00
<dict>
<key>CFBundleURLName</key>
<string>com.iGoat.myCompany</string>
<key>CFBundleURLSchemes</key>
<array>
<string>iGoat</string>
</array>
</dict>
2021-05-21 16:38:18 +00:00
</array>
```
हालांकि, ध्यान दें कि **दुर्भावनापूर्ण एप्लिकेशन URIs को पुनः पंजीकृत कर सकते हैं** जो पहले से ही एप्लिकेशनों द्वारा पंजीकृत हैं। इसलिए, यदि आप **संवेदनशील जानकारी URIs के माध्यम से भेज रहे हैं** (myapp://hostname?password=123456) तो एक **दुर्भावनापूर्ण** एप्लिकेशन **संवेदनशील** **जानकारी** वाले URI को **अवरोधित** कर सकता है।
2021-05-21 16:38:18 +00:00
साथ ही, इन URIs के इनपुट की **जांच की जानी चाहिए और साफ किया जाना चाहिए,** क्योंकि यह **दुर्भावनापूर्ण** **मूल** से आ सकता है जो SQLInjections, XSS, CSRF, Path Traversals, या अन्य संभावित कमजोरियों का शोषण करने की कोशिश कर रहे हों।
2021-05-21 16:38:18 +00:00
## एप्लिकेशन क्वेरी स्कीम्स पंजीकरण
2021-05-21 16:38:18 +00:00
एप्लिकेशन [`canOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc) का उपयोग करके यह सत्यापित कर सकते हैं कि **लक्ष्य एप्लिकेशन उपलब्ध है**। हालांकि, चूंकि इस विधि का उपयोग दुर्भावनापूर्ण एप्लिकेशन द्वारा **स्थापित एप्लिकेशनों की गणना करने के तरीके के रूप में किया जा रहा था**, [iOS 9.0 से इसमें पास किए गए URL स्कीम्स को भी घोषित किया जाना चाहिए](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc#discussion) एप्लिकेशन की `Info.plist` फाइल में `LSApplicationQueriesSchemes` कुंजी जोड़कर और **50 URL स्कीम्स तक की एक सरणी**
2021-05-21 16:38:18 +00:00
```markup
<key>LSApplicationQueriesSchemes</key>
2023-11-06 08:38:02 +00:00
<array>
<string>url_scheme1</string>
<string>url_scheme2</string>
</array>
2021-05-21 16:38:18 +00:00
```
`canOpenURL` हमेशा अघोषित स्कीमों के लिए `NO` लौटाएगा, चाहे उचित ऐप स्थापित हो या न हो। हालांकि, यह प्रतिबंध केवल `canOpenURL` पर लागू होता है।
2021-05-21 16:38:18 +00:00
## URL हैंडलिंग और वैलिडेशन की जांच
2021-05-21 16:38:18 +00:00
URL पथ कैसे बनाया गया है और वैलिडेट किया गया है, यह निर्धारित करने के लिए, यदि आपके पास मूल स्रोत कोड है, तो आप **निम्नलिखित विधियों की खोज कर सकते हैं**:
2021-05-21 16:38:18 +00:00
* `application:didFinishLaunchingWithOptions:` विधि या `application:will-FinishLaunchingWithOptions:`: यह जांचें कि निर्णय कैसे किया जाता है और URL के बारे में जानकारी कैसे प्राप्त की जाती है।
* [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc): यह जांचें कि संसाधन को कैसे खोला जा रहा है, अर्थात् डेटा कैसे पार्स किया जा रहा है, [विकल्पों](https://developer.apple.com/documentation/uikit/uiapplication/openurloptionskey) की जांच करें, विशेष रूप से यदि कॉलिंग ऐप द्वारा पहुंच ([`sourceApplication`](https://developer.apple.com/documentation/uikit/uiapplication/openurloptionskey/1623128-sourceapplication)) की अनुमति दी जानी चाहिए या नहीं। ऐप को कस्टम URL स्कीम का उपयोग करते समय उपयोगकर्ता की अनुमति भी चाहिए हो सकती है।
2021-05-21 16:38:18 +00:00
Telegram में आप [चार अलग-अलग विधियों का उपयोग होते हुए पाएंगे](https://github.com/peter-iakovlev/Telegram-iOS/blob/87e0a33ac438c1d702f2a0b75bf21f26866e346f/Telegram-iOS/AppDelegate.swift#L1250):
2021-05-21 16:38:18 +00:00
```swift
func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool {
2023-11-06 08:38:02 +00:00
self.openUrl(url: url)
return true
2021-05-21 16:38:18 +00:00
}
func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
annotation: Any) -> Bool {
2023-11-06 08:38:02 +00:00
self.openUrl(url: url)
return true
2021-05-21 16:38:18 +00:00
}
func application(_ app: UIApplication, open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
2023-11-06 08:38:02 +00:00
self.openUrl(url: url)
return true
2021-05-21 16:38:18 +00:00
}
func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
2023-11-06 08:38:02 +00:00
self.openUrl(url: url)
return true
2021-05-21 16:38:18 +00:00
}
```
2023-11-06 08:38:02 +00:00
## अन्य ऐप्स के लिए URL अनुरोधों का परीक्षण
2021-05-21 16:38:18 +00:00
[`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc) विधि और [`UIApplication`](https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl?language=objc) की पुरानी `openURL:` विधि **URLs खोलने** (अर्थात् अन्य ऐप्स को अनुरोध भेजने / क्वेरी करने) के लिए जिम्मेदार हैं, जो मौजूदा ऐप के लोकल हो सकते हैं या फिर ऐसे हो सकते हैं जिन्हें अलग ऐप द्वारा प्रदान किया जाना चाहिए। यदि आपके पास मूल स्रोत कोड है तो आप सीधे उन विधियों के उपयोगों की खोज कर सकते हैं।
2021-05-21 16:38:18 +00:00
इसके अतिरिक्त, यदि आप यह जानने में रुचि रखते हैं कि क्या ऐप विशिष्ट सेवाओं या ऐप्स की क्वेरी कर रहा है, और यदि ऐप प्रसिद्ध है, तो आप सामान्य URL स्कीमों को ऑनलाइन खोज सकते हैं और उन्हें अपने **greps (l**[**ist of iOS app schemes**](https://ios.gadgethacks.com/how-to/always-updated-list-ios-app-url-scheme-names-paths-for-shortcuts-0184033/)**)** में शामिल कर सकते हैं।
2021-05-21 16:38:18 +00:00
```bash
egrep -nr "open.*options.*completionHandler" ./Telegram-iOS/
egrep -nr "openURL\(" ./Telegram-iOS/
egrep -nr "mt-encrypted-file://" ./Telegram-iOS/
egrep -nr "://" ./Telegram-iOS/
```
## पुरानी पद्धतियों के लिए परीक्षण
2021-05-21 16:38:18 +00:00
पुरानी पद्धतियों की खोज करें जैसे:
2021-05-21 16:38:18 +00:00
* [`application:handleOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622964-application?language=objc)
* [`openURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl?language=objc)
* [`application:openURL:sourceApplication:annotation:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application)
उदाहरण के लिए, यहाँ हम उन तीनों को पाते हैं:
2021-05-21 16:38:18 +00:00
```bash
$ 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:
...
```
## अनियमित URLs को कॉल करना
2021-05-21 16:38:18 +00:00
* **Safari**: एक URL स्कीम का त्वरित परीक्षण करने के लिए आप Safari पर URLs खोल सकते हैं और ऐप के व्यवहार को देख सकते हैं। उदाहरण के लिए, यदि आप `tel://123456789` लिखते हैं तो safari उस नंबर को कॉल करने का प्रयास करेगा।
* **Notes App**: कस्टम URL स्कीम्स का परीक्षण करने के लिए आपने जो लिंक्स लिखे हैं उन्हें लंबे समय तक दबाएं। याद रखें कि लिंक्स खोलने के लिए संपादन मोड से बाहर निकलना होगा। ध्यान दें कि आप कस्टम URL स्कीम्स सहित लिंक्स पर क्लिक या लंबे समय तक दबा सकते हैं केवल यदि ऐप स्थापित है, अन्यथा वे _क्लिक करने योग्य लिंक्स_ के रूप में हाइलाइट नहीं किए जाएंगे।
2021-05-21 16:38:18 +00:00
* [**IDB**](https://github.com/facebook/idb):
* IDB शुरू करें, अपने डिवाइस से कनेक्ट करें और लक्ष्य ऐप का चयन करें। आप [IDB दस्तावेज़ीकरण](https://www.idbtool.com/documentation/setup.html) में विवरण पा सकते हैं।
* **URL Handlers** अनुभाग पर जाएं। **URL स्कीम्स** में, **Refresh** पर क्लिक करें, और बाईं ओर आपको परीक्षण किए जा रहे ऐप में परिभाषित सभी कस्टम स्कीम्स की सूची मिलेगी। आप इन स्कीम्स को दाईं ओर **Open** पर क्लिक करके लोड कर सकते हैं। एक खाली URI स्कीम को सिर्फ खोलकर (उदाहरण के लिए, `myURLscheme://` खोलना), आप छिपे हुए कार्यक्षमता (जैसे, एक डीबग विंडो) का पता लगा सकते हैं और स्थानीय प्रमाणीकरण को बायपास कर सकते हैं।
2022-04-05 22:24:52 +00:00
* **Frida**:
2021-05-21 16:38:18 +00:00
यदि आप सिर्फ URL स्कीम खोलना चाहते हैं तो आप इसे Frida का उपयोग करके कर सकते हैं:
2021-05-21 16:38:18 +00:00
2023-11-06 08:38:02 +00:00
```javascript
$ frida -U iGoat-Swift
2021-05-21 16:38:18 +00:00
2023-11-06 08:38:02 +00:00
[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
```
2021-05-21 16:38:18 +00:00
इस उदाहरण में [Frida CodeShare](https://codeshare.frida.re/@dki/ios-url-scheme-fuzzing/) से लेखक ने SpringBoard ऐप से URLs खोलने के लिए गैर-सार्वजनिक API `LSApplicationWorkspace.openSensitiveURL:withOptions:` का उपयोग किया है:
2021-05-21 16:38:18 +00:00
2023-11-06 08:38:02 +00:00
```javascript
function openURL(url) {
var w = ObjC.classes.LSApplicationWorkspace.defaultWorkspace();
var toOpen = ObjC.classes.NSURL.URLWithString_(url);
return w.openSensitiveURL_withOptions_(toOpen, null);
}
```
2021-05-21 16:38:18 +00:00
> ध्यान दें कि गैर-सार्वजनिक APIs का उपयोग App Store पर अनुमति नहीं है, इसलिए हम इनका परीक्षण नहीं करते हैं लेकिन हमें अपने गतिशील विश्लेषण के लिए उनका उपयोग करने की अनुमति है।
2021-05-21 16:38:18 +00:00
## URL Schemes को Fuzzing करना
2021-05-21 16:38:18 +00:00
यदि ऐप URL के हिस्सों को पार्स करता है, तो आप मेमोरी करप्शन बग्स का पता लगाने के लिए इनपुट fuzzing भी कर सकते हैं।
2021-05-21 16:38:18 +00:00
जो हमने ऊपर सीखा है उसका उपयोग अब आप अपनी पसंद की भाषा में अपना खुद का fuzzer बनाने के लिए कर सकते हैं, जैसे Python में और [Frida's RPC](https://www.frida.re/docs/javascript-api/#rpc) का उपयोग करके `openURL` को कॉल कर सकते हैं। उस fuzzer को निम्नलिखित करना चाहिए:
2021-05-21 16:38:18 +00:00
* पेलोड्स जनरेट करना।
* प्रत्येक के लिए `openURL` को कॉल करना।
* जांचें कि ऐप `/private/var/mobile/Library/Logs/CrashReporter` में क्रैश रिपोर्ट (`.ips`) जनरेट करता है या नहीं।
2021-05-21 16:38:18 +00:00
[FuzzDB](https://github.com/fuzzdb-project/fuzzdb) प्रोजेक्ट पेलोड्स के रूप में उपयोग करने के लिए fuzzing शब्दकोश प्रदान करता है।
2021-05-21 16:38:18 +00:00
## **Frida का उपयोग करके Fuzzing**
2021-05-21 16:38:18 +00:00
Frida के साथ यह करना काफी आसान है, आप इस [ब्लॉग पोस्ट](https://grepharder.github.io/blog/0x03\_learning\_about\_universal\_links\_and\_fuzzing\_url\_schemes\_on\_ios\_with\_frida.html) को देख सकते हैं जो iGoat-Swift ऐप को fuzz करने का एक उदाहरण दिखाता है (iOS 11.1.2 पर काम कर रहा है)।
2021-05-21 16:38:18 +00:00
fuzzer चलाने से पहले हमें इनपुट के रूप में URL स्कीम्स की आवश्यकता होती है। स्थिर विश्लेषण से हम जानते हैं कि iGoat-Swift ऐप निम्नलिखित URL स्कीम और पैरामीटर्स का समर्थन करता है: `iGoat://?contactNumber={0}&message={0}`
2021-05-21 16:38:18 +00:00
```bash
$ 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
```
2023-11-06 08:38:02 +00:00
# संदर्भ
2021-05-21 16:38:18 +00:00
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
2021-05-21 16:38:18 +00:00
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert) के साथ शून्य से नायक तक AWS हैकिंग सीखें</strong></summary>
2022-04-28 16:01:33 +00:00
HackTricks का समर्थन करने के अन्य तरीके:
2022-04-28 16:01:33 +00:00
* यदि आप चाहते हैं कि आपकी **कंपनी का विज्ञापन HackTricks में दिखाई दे** या **HackTricks को PDF में डाउनलोड करें**, तो [**सदस्यता योजनाओं**](https://github.com/sponsors/carlospolop) की जाँच करें!
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) संग्रह
* 💬 [**Discord समूह**](https://discord.gg/hRep4RUj7f) में **शामिल हों** या [**telegram समूह**](https://t.me/peass) में शामिल हों या मुझे **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm) पर **फॉलो करें**.
* **HackTricks** के [**github रेपोज**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) में PRs सबमिट करके अपनी हैकिंग ट्रिक्स साझा करें.
2022-04-28 16:01:33 +00:00
</details>