9.1 KiB
macOS Dirty NIB
Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!
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!
- Obtenez le merchandising officiel PEASS & HackTricks
- Découvrez La Famille PEASS, notre collection d'NFTs exclusifs
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez moi sur Twitter 🐦 @carlospolopm.
- Partagez vos astuces de hacking en soumettant des PR aux dépôts github HackTricks et HackTricks Cloud.
Cette technique a été reprise du post https://blog.xpnsec.com/dirtynib/
Informations de base
Les fichiers NIB sont utilisés dans l'écosystème de développement d'Apple pour définir les éléments de l'interface utilisateur (UI) et leurs interactions au sein d'une application. Créés avec l'outil Interface Builder, ils contiennent des objets sérialisés comme des fenêtres, des boutons et des champs de texte, qui sont chargés au moment de l'exécution pour présenter l'UI conçue. Bien qu'encore utilisés, Apple a évolué vers la recommandation des Storyboards pour une représentation plus visuelle du flux UI d'une application.
{% hint style="danger" %} De plus, les fichiers NIB peuvent également être utilisés pour exécuter des commandes arbitraires et si un fichier NIB est modifié dans une application, Gatekeeper permettra toujours d'exécuter l'application, donc ils peuvent être utilisés pour exécuter des commandes arbitraires à l'intérieur des applications. {% endhint %}
Injection Dirty NIB
D'abord, nous devons créer un nouveau fichier NIB, nous utiliserons XCode pour la majeure partie de la construction. Nous commençons par ajouter un Objet à l'interface et définir la classe sur NSAppleScript :
Pour l'objet, nous devons définir la propriété source
initiale, ce que nous pouvons faire en utilisant les Attributs d'Exécution Définis par l'Utilisateur :
Cela met en place notre gadget d'exécution de code, qui va juste exécuter AppleScript sur demande. Pour déclencher réellement l'exécution de l'AppleScript, nous allons juste ajouter un bouton pour l'instant (vous pouvez bien sûr être créatif avec cela ;). Le bouton sera lié à l'objet Apple Script
que nous venons de créer, et va invoquer le sélecteur executeAndReturnError:
:
Pour les tests, nous utiliserons simplement l'Apple Script de :
set theDialogText to "PWND"
display dialog theDialogText
Et si nous exécutons cela dans le débogueur XCode et appuyons sur le bouton :
Avec notre capacité à exécuter du code AppleScript arbitraire à partir d'un NIB, nous avons ensuite besoin d'une cible. Choisissons Pages pour notre démo initiale, qui est bien sûr une application Apple et ne devrait certainement pas être modifiable par nous.
Nous allons d'abord faire une copie de l'application dans /tmp/
:
cp -a -X /Applications/Pages.app /tmp/
Ensuite, nous lancerons l'application pour éviter tout problème avec Gatekeeper et permettre la mise en cache des éléments :
open -W -g -j /Applications/Pages.app
Après avoir lancé (et tué) l'application pour la première fois, nous devrons remplacer un fichier NIB existant par notre fichier DirtyNIB. À des fins de démonstration, nous allons simplement remplacer le NIB du panneau À propos afin de pouvoir contrôler l'exécution :
cp /tmp/Dirty.nib /tmp/Pages.app/Contents/Resources/Base.lproj/TMAAboutPanel.nib
Une fois que nous avons écrasé le nib, nous pouvons déclencher l'exécution en sélectionnant l'élément de menu About
:
Si nous examinons Pages de plus près, nous constatons qu'il dispose d'un droit d'accès privé permettant d'accéder aux Photos d'un utilisateur :
Nous pouvons donc mettre notre POC à l'épreuve en modifiant notre AppleScript pour voler des photos de l'utilisateur sans demande de confirmation :
{% code overflow="wrap" %}
use framework "Cocoa"
use framework "Foundation"
set grabbed to current application's NSData's dataWithContentsOfFile:"/Users/xpn/Pictures/Photos Library.photoslibrary/originals/6/68CD9A98-E591-4D39-B038-E1B3F982C902.gif"
grabbed's writeToFile:"/Users/xpn/Library/Containers/com.apple.iWork.Pages/Data/wtf.gif" atomically:1
{% endcode %}
{% hint style="danger" %} Exemple de fichier .xib malveillant qui exécute du code arbitraire. {% endhint %}
Créez votre propre DirtyNIB
Contraintes de lancement
Elles empêchent l'exécution d'applications en dehors de leurs emplacements attendus, donc si vous copiez une application protégée par des contraintes de lancement dans /tmp
, vous ne pourrez pas l'exécuter.
Trouvez plus d'informations dans cet article.
Cependant, en analysant le fichier /System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4
, vous pouvez toujours trouver des applications qui ne sont pas protégées par des contraintes de lancement et vous pourriez donc toujours injecter des fichiers NIB dans des emplacements arbitraires dans ces applications (consultez le lien précédent pour apprendre à trouver ces applications).
Protections supplémentaires
À partir de macOS Somona, il existe des protections empêchant d'écrire à l'intérieur des applications. Cependant, il est toujours possible de contourner cette protection si, avant d'exécuter votre copie du binaire, vous changez le nom du dossier Contents :
- Prenez une copie de
CarPlay Simulator.app
dans/tmp/
- Renommez
/tmp/Carplay Simulator.app/Contents
en/tmp/CarPlay Simulator.app/NotCon
- Lancez le binaire
/tmp/CarPlay Simulator.app/NotCon/MacOS/CarPlay Simulator
pour le mettre en cache avec Gatekeeper - Remplacez
NotCon/Resources/Base.lproj/MainMenu.nib
par notre fichierDirty.nib
- Renommez en
/tmp/CarPlay Simulator.app/Contents
- Lancez
CarPlay Simulator.app
à nouveau
{% hint style="success" %}
Il semble que cela ne soit plus possible car macOS empêche la modification des fichiers à l'intérieur des paquets d'applications.
Ainsi, après avoir exécuté l'application pour la mettre en cache avec Gatekeeper, vous ne pourrez pas modifier le paquet.
Et si vous changez par exemple le nom du répertoire Contents en NotCon (comme indiqué dans l'exploit), puis exécutez le binaire principal de l'application pour la mettre en cache avec Gatekeeper, cela déclenchera une erreur et n'exécutera pas.
{% endhint %}
Apprenez le hacking AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!
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!
- Obtenez le merchandising officiel PEASS & HackTricks
- Découvrez La Famille PEASS, notre collection d'NFTs exclusifs
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez moi sur Twitter 🐦 @carlospolopm.
- Partagez vos astuces de hacking en soumettant des PR aux dépôts github HackTricks et HackTricks Cloud.