mirror of
https://github.com/carlospolop/hacktricks
synced 2025-01-05 17:58:50 +00:00
110 lines
10 KiB
Markdown
110 lines
10 KiB
Markdown
# iOS Universal Links
|
|
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** ЁЯТм [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** ЁЯРж [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
|
|
## Introduction
|
|
|
|
рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд▓рд┐рдВрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ **рд╕рд╣рдЬ рд░реАрдбрд╛рдпрд░реЗрдХреНрд╢рди** рдЕрдиреБрднрд╡ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реАрдзреЗ рдРрдк рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдЦреЛрд▓рддреЗ рд╣реИрдВ, рд╕рдлрд╛рд░реА рд░реАрдбрд╛рдпрд░реЗрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рд▓рд┐рдВрдХ **рд╡рд┐рд╢рд┐рд╖реНрдЯ** рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдРрдк рджреНрд╡рд╛рд░рд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреА рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ `apple-app-site-association` JSON рдлрд╝рд╛рдЗрд▓ рд╣реЛ, рдЬреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдФрд░ рдРрдк рдХреЗ рдмреАрдЪ рдПрдХ рд╕рддреНрдпрд╛рдкрд┐рдд рд▓рд┐рдВрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреА рд╣реИред рдпрджрд┐ рдРрдк рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рдлрд╛рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡реЗрдмрдкреЗрдЬ рдкрд░ рд▓реЗ рдЬрд╛рдПрдЧреА, рдРрдк рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдПред
|
|
|
|
рдкреЗрдирдЯреЗрд╕реНрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП, `apple-app-site-association` рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ рдХреА рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ **рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдкрдереЛрдВ** рдХреЛ рдкреНрд░рдХрдЯ рдХрд░ рд╕рдХрддреА рд╣реИ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЙрди рдкрдереЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реБрдП рдЬреЛ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред
|
|
|
|
### **Associated Domains Entitlement рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛**
|
|
|
|
рдбреЗрд╡рд▓рдкрд░реНрд╕ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд▓рд┐рдВрдХ рдХреЛ Xcode рдХреЗ Capabilities рдЯреИрдм рдореЗрдВ **Associated Domains** рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗ рдпрд╛ `.entitlements` рдлрд╝рд╛рдЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдбреЛрдореЗрди рдХреЗ рдЖрдЧреЗ `applinks:` рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИ:
|
|
```xml
|
|
<key>com.apple.developer.associated-domains</key>
|
|
<array>
|
|
<string>applinks:telegram.me</string>
|
|
<string>applinks:t.me</string>
|
|
</array>
|
|
```
|
|
For more comprehensive insights, refer to the [archived Apple Developer Documentation](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
|
|
|
|
If working with a compiled application, entitlements can be extracted as outlined in [this guide](extracting-entitlements-from-compiled-application.md).
|
|
|
|
### **рдПрдкреНрдкрд▓ рдРрдк рд╕рд╛рдЗрдЯ рдПрд╕реЛрд╕рд┐рдПрд╢рди рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛**
|
|
|
|
`apple-app-site-association` рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЙрди рдбреЛрдореЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдлрд╝рд╛рдЗрд▓ HTTPS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ `https://<domain>/apple-app-site-association` рдкрд░ рд╕реБрд▓рдн рд╣реИред [Apple App Site Association (AASA) Validator](https://branch.io/resources/aasa-validator/) рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
|
|
|
### **рдРрдк рдореЗрдВ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд▓рд┐рдВрдХ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛**
|
|
|
|
рдРрдк рдХреЛ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд▓рд┐рдВрдХ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рд╡рд┐рдзрд┐ [`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application) рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рдВрднрд╛рд▓реЗ рдЧрдП URLs рдХрд╛ рд╕реНрдХреАрдо HTTP рдпрд╛ HTTPS рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
|
|
|
|
#### **рдбреЗрдЯрд╛ рд╣реИрдВрдбрд▓рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдорд╛рдиреНрдпрдХрд░рдг**
|
|
|
|
рдЬрдм рдПрдХ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд▓рд┐рдВрдХ рдПрдХ рдРрдк рдЦреЛрд▓рддрд╛ рд╣реИ, рддреЛ рдПрдХ `NSUserActivity` рдСрдмреНрдЬреЗрдХреНрдЯ рдРрдк рдХреЛ URL рдХреЗ рд╕рд╛рде рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ URL рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕реЗ рдорд╛рдиреНрдп рдФрд░ рд╕рд╛рдл рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдореЛрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣рд╛рдБ Swift рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
|
|
```swift
|
|
func application(_ application: UIApplication, continue userActivity: NSUserActivity,
|
|
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
|
|
// Check for web browsing activity and valid URL
|
|
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
|
|
application.open(url, options: [:], completionHandler: nil)
|
|
}
|
|
|
|
return true
|
|
}
|
|
```
|
|
URLs рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдкрд╛рд░реНрд╕ рдФрд░ рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрджрд┐ рдЙрдирдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдкреВрдлрд┐рдВрдЧ рдпрд╛ рдЧрд▓рдд рдбреЗрдЯрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред `NSURLComponents` API рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
|
|
```swift
|
|
func application(_ application: UIApplication,
|
|
continue userActivity: NSUserActivity,
|
|
restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
|
|
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
|
|
let incomingURL = userActivity.webpageURL,
|
|
let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
|
|
let path = components.path,
|
|
let params = components.queryItems else {
|
|
return false
|
|
}
|
|
|
|
if let albumName = params.first(where: { $0.name == "albumname" })?.value,
|
|
let photoIndex = params.first(where: { $0.name == "index" })?.value {
|
|
// Process the URL with album name and photo index
|
|
|
|
return true
|
|
|
|
} else {
|
|
// Handle invalid or missing parameters
|
|
|
|
return false
|
|
}
|
|
}
|
|
```
|
|
Through **diligent configuration and validation**, developers can ensure that universal links enhance user experience while maintaining security and privacy standards.
|
|
|
|
## Tools
|
|
* [GetUniversal.link](https://getuniversal.link/): рдЖрдкрдХреА рдРрдк рдХреЗ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд▓рд┐рдВрдХ рдФрд░ AASA рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред AASA рдлрд╝рд╛рдЗрд▓ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЕрдкрдирд╛ рдбреЛрдореЗрди рджрд░реНрдЬ рдХрд░реЗрдВ рдпрд╛ рд▓рд┐рдВрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдбреИрд╢рдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдЙрдкрдХрд░рдг рдЖрдкрдХреЛ рдпрд╣ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ Apple рдЕрдЧрд▓реА рдмрд╛рд░ рдЖрдкрдХреА AASA рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрдм рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░реЗрдЧрд╛ред
|
|
|
|
## References
|
|
* [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0070/#static-analysis](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0070/#static-analysis)
|
|
* [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8)
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** ЁЯТм [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** ЁЯРж [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|