Translated ['macos-hardening/macos-security-and-privilege-escalation/mac

This commit is contained in:
Translator 2023-10-12 16:21:40 +00:00
parent d0876c380f
commit 53cdf4858d
23 changed files with 497 additions and 172 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

View file

@ -149,6 +149,7 @@
* [macOS Defensive Apps](macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md)
* [macOS GCD - Grand Central Dispatch](macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md)
* [macOS Kernel & System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md)
* [macOS IOKit](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md)
* [macOS Kernel Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md)
* [macOS System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-system-extensions.md)
* [macOS Network Services & Protocols](macos-hardening/macos-security-and-privilege-escalation/macos-protocols.md)

View file

@ -6,7 +6,7 @@
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
@ -14,7 +14,7 @@
## Kernel XNU
El **núcleo de macOS es XNU**, que significa "X is Not Unix" (X no es Unix). Este núcleo está compuesto fundamentalmente por el **microkernel Mach** (que se discutirá más adelante) y elementos de la Distribución de Software Berkeley (**BSD**). XNU también proporciona una plataforma para **controladores de kernel a través de un sistema llamado I/O Kit**. El núcleo XNU forma parte del proyecto de código abierto Darwin, lo que significa que **su código fuente es de libre acceso**.
El **núcleo de macOS es XNU**, que significa "X is Not Unix" (X no es Unix). Este núcleo está compuesto fundamentalmente por el **microkernel Mach** (que se discutirá más adelante) y elementos de la **Distribución de Software Berkeley (BSD)**. XNU también proporciona una plataforma para **controladores de kernel a través de un sistema llamado I/O Kit**. El núcleo XNU forma parte del proyecto de código abierto Darwin, lo que significa que **su código fuente es de libre acceso**.
Desde la perspectiva de un investigador de seguridad o un desarrollador de Unix, **macOS** puede parecer bastante **similar** a un sistema **FreeBSD** con una interfaz gráfica elegante y una serie de aplicaciones personalizadas. La mayoría de las aplicaciones desarrolladas para BSD se pueden compilar y ejecutar en macOS sin necesidad de modificaciones, ya que las herramientas de línea de comandos familiares para los usuarios de Unix están presentes en macOS. Sin embargo, debido a que el núcleo XNU incorpora Mach, existen algunas diferencias significativas entre un sistema similar a Unix tradicional y macOS, y estas diferencias pueden causar problemas potenciales o proporcionar ventajas únicas.
@ -43,58 +43,97 @@ Además, **Mach y BSD mantienen modelos de seguridad diferentes**: el modelo de
### I/O Kit - Controladores
I/O Kit es el marco de **controladores de dispositivos orientado a objetos** de código abierto en el núcleo XNU y es responsable de la adición y gestión de **controladores de dispositivos cargados dinámicamente**. Estos controladores permiten agregar código modular al kernel de forma dinámica para su uso con diferentes hardware, por ejemplo. Se encuentran en:
I/O Kit es el marco de **controladores de dispositivos orientado a objetos** de código abierto en el núcleo XNU y es responsable de la adición y gestión de **controladores de dispositivos cargados dinámicamente**. Estos controladores permiten agregar código modular al kernel de forma dinámica para su uso con diferentes hardware, por ejemplo.
* `/System/Library/Extensions`
* Archivos KEXT integrados en el sistema operativo OS X.
* `/Library/Extensions`
* Archivos KEXT instalados por software de terceros
```bash
#Use kextstat to print the loaded drivers
kextstat
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
Index Refs Address Size Wired Name (Version) UUID <Linked Against>
1 142 0 0 0 com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
2 11 0 0 0 com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
3 170 0 0 0 com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
4 0 0 0 0 com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
5 175 0 0 0 com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
6 154 0 0 0 com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
7 88 0 0 0 com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
8 106 0 0 0 com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
9 2 0xffffff8003317000 0xe000 0xe000 com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
10 12 0xffffff8003544000 0x92000 0x92000 com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>
```
Hasta el número 9, los controladores enumerados se **cargan en la dirección 0**. Esto significa que no son controladores reales, sino **parte del kernel y no se pueden descargar**.
{% content-ref url="macos-iokit.md" %}
[macos-iokit.md](macos-iokit.md)
{% endcontent-ref %}
Para encontrar extensiones específicas, puedes usar:
```bash
kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id
kextfind -bundle-id -substring IOR #Search by substring in bundle-id
```
Para cargar y descargar extensiones del kernel, haz lo siguiente:
```bash
kextload com.apple.iokit.IOReportFamily
kextunload com.apple.iokit.IOReportFamily
```
### IPC - Comunicación entre Procesos
{% content-ref url="macos-ipc-inter-process-communication/" %}
[macos-ipc-inter-process-communication](macos-ipc-inter-process-communication/)
{% endcontent-ref %}
## Extensiones del Kernel de macOS
### Kernelcache
macOS es **muy restrictivo para cargar Extensiones del Kernel** (.kext) debido a los altos privilegios con los que se ejecutará el código. De hecho, por defecto es prácticamente imposible (a menos que se encuentre un bypass).
El **kernelcache** es una versión **precompilada y preenlazada del núcleo XNU**, junto con controladores de dispositivos esenciales y extensiones del kernel. Se almacena en un formato **comprimido** y se descomprime en la memoria durante el proceso de inicio. El kernelcache facilita un **inicio más rápido** al tener una versión lista para ejecutarse del kernel y controladores importantes disponibles, lo que reduce el tiempo y los recursos que de otro modo se gastarían en cargar y enlazar dinámicamente estos componentes durante el inicio.
En iOS se encuentra en **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** y en macOS se puede encontrar con **`find / -name kernelcache 2>/dev/null`**.
#### IMG4
El formato de archivo IMG4 es un formato de contenedor utilizado por Apple en sus dispositivos iOS y macOS para almacenar y verificar de manera segura los componentes del firmware (como el kernelcache). El formato IMG4 incluye un encabezado y varias etiquetas que encapsulan diferentes piezas de datos, incluyendo la carga útil real (como un kernel o un cargador de arranque), una firma y un conjunto de propiedades de manifiesto. El formato admite la verificación criptográfica, lo que permite al dispositivo confirmar la autenticidad e integridad del componente del firmware antes de ejecutarlo.
Por lo general, está compuesto por los siguientes componentes:
* **Carga útil (IM4P)**:
* A menudo comprimido (LZFSE4, LZSS, ...)
* Opcionalmente encriptado
* **Manifiesto (IM4M)**:
* Contiene la firma
* Diccionario adicional de clave/valor
* **Información de restauración (IM4R)**:
* También conocido como APNonce
* Evita la reproducción de algunas actualizaciones
* OPCIONAL: Por lo general, esto no se encuentra
Descomprimir el Kernelcache:
```bash
# pyimg4 (https://github.com/m1stadev/PyIMG4)
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
# img4tool (https://github.com/tihmstar/img4tool
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
#### Símbolos del Kernelcache
A veces Apple lanza **kernelcache** con **símbolos**. Puedes descargar algunos firmwares con símbolos siguiendo los enlaces en [https://theapplewiki.com](https://theapplewiki.com/).
### IPSW
Estos son los **firmwares** de Apple que puedes descargar desde [**https://ipsw.me/**](https://ipsw.me/). Entre otros archivos, contendrá el **kernelcache**.\
Para **extraer** los archivos, simplemente descomprímelo.
Después de extraer el firmware, obtendrás un archivo como: **`kernelcache.release.iphone14`**. Está en formato **IMG4**, puedes extraer la información interesante con:
* [**pyimg4**](https://github.com/m1stadev/PyIMG4)
{% code overflow="wrap" %}
```bash
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
{% endcode %}
* [**img4tool**](https://github.com/tihmstar/img4tool)
```bash
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
Puedes verificar los símbolos del kernelcache extraído con: **`nm -a kernelcache.release.iphone14.e | wc -l`**
Con esto ahora podemos **extraer todas las extensiones** o la **que te interese:**
```bash
# List all extensions
kextex -l kernelcache.release.iphone14.e
## Extract com.apple.security.sandbox
kextex -e com.apple.security.sandbox kernelcache.release.iphone14.e
# Extract all
kextex_all kernelcache.release.iphone14.e
# Check the extension for symbols
nm -a binaries/com.apple.security.sandbox | wc -l
```
## Extensiones del kernel de macOS
macOS es **muy restrictivo para cargar extensiones del kernel** (.kext) debido a los altos privilegios con los que se ejecutará el código. De hecho, por defecto es prácticamente imposible (a menos que se encuentre un bypass).
{% content-ref url="macos-kernel-extensions.md" %}
[macos-kernel-extensions.md](macos-kernel-extensions.md)
{% endcontent-ref %}
### Extensiones del Sistema de macOS
### Extensiones del sistema de macOS
En lugar de utilizar Extensiones del Kernel, macOS creó las Extensiones del Sistema, que ofrecen APIs a nivel de usuario para interactuar con el kernel. De esta manera, los desarrolladores pueden evitar el uso de extensiones del kernel.
En lugar de utilizar extensiones del kernel, macOS creó las extensiones del sistema, que ofrecen API de nivel de usuario para interactuar con el kernel. De esta manera, los desarrolladores pueden evitar el uso de extensiones del kernel.
{% content-ref url="macos-system-extensions.md" %}
[macos-system-extensions.md](macos-system-extensions.md)
@ -113,6 +152,6 @@ En lugar de utilizar Extensiones del Kernel, macOS creó las Extensiones del Sis
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>

View file

@ -0,0 +1,244 @@
# macOS IOKit
<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>
* Do you work in a **cybersecurity company**? Do you want to see your **company advertised in HackTricks**? Or do you want to have access to the **latest version of PEASS or download HackTricks in PDF**? Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our exclusive collection of [**NFTs**](https://opensea.io/collection/the-peass-family)
* Get the official [**PEASS and HackTricks swag**](https://peass.creator-spring.com)
* **Join the** [**💬**](https://emojipedia.org/speech-balloon/) **Discord group** or the [**telegram group**](https://t.me/peass) or **follow me** on **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live).
* **Share your hacking tricks by sending PR to** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **and** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## Información básica
IOKit es el marco de controladores de dispositivos de código abierto, orientado a objetos, en el kernel XNU y es responsable de la adición y gestión de controladores de dispositivos cargados dinámicamente. Estos controladores permiten agregar código modular al kernel de forma dinámica para su uso con diferentes hardware, por ejemplo.
Los controladores de IOKit básicamente **exportan funciones desde el kernel**. Estos tipos de parámetros de función están **predefinidos** y se verifican. Además, al igual que XPC, IOKit es solo otra capa **encima de los mensajes Mach**.
El código del kernel IOKit XNU es de código abierto por Apple en [https://github.com/apple-oss-distributions/xnu/tree/main/iokit](https://github.com/apple-oss-distributions/xnu/tree/main/iokit). Además, los componentes de IOKit en el espacio de usuario también son de código abierto [https://github.com/opensource-apple/IOKitUser](https://github.com/opensource-apple/IOKitUser).
Sin embargo, **no hay controladores de IOKit** de código abierto. De todos modos, de vez en cuando una versión de un controlador puede venir con símbolos que facilitan su depuración. Consulta cómo [**obtener las extensiones de controlador desde el firmware aquí**](./#ipsw)**.**
Está escrito en **C++**. Puedes obtener símbolos C++ desenmascarados con:
```bash
# Get demangled symbols
nm -C com.apple.driver.AppleJPEGDriver
# Demangled symbols from stdin
c++filt
__ZN16IOUserClient202222dispatchExternalMethodEjP31IOExternalMethodArgumentsOpaquePK28IOExternalMethodDispatch2022mP8OSObjectPv
IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
```
{% hint style="danger" %}
Las funciones expuestas de IOKit podrían realizar verificaciones de seguridad adicionales cuando un cliente intenta llamar a una función, pero tenga en cuenta que las aplicaciones suelen estar limitadas por el sandbox con respecto a las funciones de IOKit con las que pueden interactuar.
{% endhint %}
## Controladores
En macOS se encuentran en:
* **`/System/Library/Extensions`**
* Archivos KEXT integrados en el sistema operativo OS X.
* **`/Library/Extensions`**
* Archivos KEXT instalados por software de terceros.
En iOS se encuentran en:
* **`/System/Library/Extensions`**
```bash
#Use kextstat to print the loaded drivers
kextstat
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
Index Refs Address Size Wired Name (Version) UUID <Linked Against>
1 142 0 0 0 com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
2 11 0 0 0 com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
3 170 0 0 0 com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
4 0 0 0 0 com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
5 175 0 0 0 com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
6 154 0 0 0 com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
7 88 0 0 0 com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
8 106 0 0 0 com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
9 2 0xffffff8003317000 0xe000 0xe000 com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
10 12 0xffffff8003544000 0x92000 0x92000 com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>
```
Hasta el número 9, los controladores enumerados se **cargan en la dirección 0**. Esto significa que no son controladores reales, sino **parte del kernel y no se pueden descargar**.
Para encontrar extensiones específicas, puedes usar:
```bash
kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id
kextfind -bundle-id -substring IOR #Search by substring in bundle-id
```
Para cargar y descargar extensiones del kernel, haz lo siguiente:
```bash
kextload com.apple.iokit.IOReportFamily
kextunload com.apple.iokit.IOReportFamily
```
## IORegistry
El **IORegistry** es una parte crucial del marco de trabajo IOKit en macOS e iOS que sirve como una base de datos para representar la configuración y el estado del hardware del sistema. Es una **colección jerárquica de objetos que representan todo el hardware y los controladores** cargados en el sistema, y sus relaciones entre sí.&#x20;
Puedes obtener el IORegistry utilizando la línea de comandos **`ioreg`** para inspeccionarlo desde la consola (especialmente útil para iOS).
```bash
ioreg -l #List all
ioreg -w 0 #Not cut lines
ioreg -p <plane> #Check other plane
```
Puedes descargar **`IORegistryExplorer`** desde **Xcode Additional Tools** en [**https://developer.apple.com/download/all/**](https://developer.apple.com/download/all/) e inspeccionar el **IORegistry de macOS** a través de una interfaz **gráfica**.
<figure><img src="../../../.gitbook/assets/image (695).png" alt="" width="563"><figcaption></figcaption></figure>
En IORegistryExplorer, se utilizan "planos" para organizar y mostrar las relaciones entre diferentes objetos en el IORegistry. Cada plano representa un tipo específico de relación o una vista particular de la configuración de hardware y controladores del sistema. Aquí tienes algunos de los planos comunes que puedes encontrar en IORegistryExplorer:
1. **Plano IOService**: Este es el plano más general, muestra los objetos de servicio que representan controladores y nubs (canales de comunicación entre controladores). Muestra las relaciones proveedor-cliente entre estos objetos.
2. **Plano IODeviceTree**: Este plano representa las conexiones físicas entre dispositivos a medida que se conectan al sistema. Se utiliza a menudo para visualizar la jerarquía de dispositivos conectados a través de buses como USB o PCI.
3. **Plano IOPower**: Muestra objetos y sus relaciones en términos de administración de energía. Puede mostrar qué objetos están afectando el estado de energía de otros, útil para depurar problemas relacionados con la energía.
4. **Plano IOUSB**: Enfocado específicamente en dispositivos USB y sus relaciones, muestra la jerarquía de concentradores USB y dispositivos conectados.
5. **Plano IOAudio**: Este plano representa dispositivos de audio y sus relaciones dentro del sistema.
6. ...
## Ejemplo de código de comunicación del controlador
El siguiente código se conecta al servicio IOKit `"YourServiceNameHere"` y llama a la función dentro del selector 0. Para ello:
* primero llama a **`IOServiceMatching`** y **`IOServiceGetMatchingServices`** para obtener el servicio.
* Luego establece una conexión llamando a **`IOServiceOpen`**.
* Y finalmente llama a una función con **`IOConnectCallScalarMethod`** indicando el selector 0 (el selector es el número asignado a la función que deseas llamar).
```objectivec
#import <Foundation/Foundation.h>
#import <IOKit/IOKitLib.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Get a reference to the service using its name
CFMutableDictionaryRef matchingDict = IOServiceMatching("YourServiceNameHere");
if (matchingDict == NULL) {
NSLog(@"Failed to create matching dictionary");
return -1;
}
// Obtain an iterator over all matching services
io_iterator_t iter;
kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to get matching services");
return -1;
}
// Get a reference to the first service (assuming it exists)
io_service_t service = IOIteratorNext(iter);
if (!service) {
NSLog(@"No matching service found");
IOObjectRelease(iter);
return -1;
}
// Open a connection to the service
io_connect_t connect;
kr = IOServiceOpen(service, mach_task_self(), 0, &connect);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to open service");
IOObjectRelease(service);
IOObjectRelease(iter);
return -1;
}
// Call a method on the service
// Assume the method has a selector of 0, and takes no arguments
kr = IOConnectCallScalarMethod(connect, 0, NULL, 0, NULL, NULL);
if (kr != KERN_SUCCESS) {
NSLog(@"Failed to call method");
}
// Cleanup
IOServiceClose(connect);
IOObjectRelease(service);
IOObjectRelease(iter);
}
return 0;
}
```
Hay **otras** funciones que se pueden utilizar para llamar a funciones de IOKit aparte de **`IOConnectCallScalarMethod`** como **`IOConnectCallMethod`**, **`IOConnectCallStructMethod`**...
## Reversando el punto de entrada del controlador
Puedes obtener estos, por ejemplo, desde una [**imagen de firmware (ipsw)**](./#ipsw). Luego, cárgalo en tu descompilador favorito.
Puedes comenzar a descompilar la función **`externalMethod`** ya que esta es la función del controlador que recibirá la llamada y llamará a la función correcta:
<figure><img src="../../../.gitbook/assets/image (696).png" alt="" width="315"><figcaption></figcaption></figure>
<figure><img src="../../../.gitbook/assets/image (697).png" alt=""><figcaption></figcaption></figure>
Esa horrible llamada demanglada significa:
{% code overflow="wrap" %}
```cpp
IOUserClient2022::dispatchExternalMethod(unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
```
{% endcode %}
Observa cómo en la definición anterior falta el parámetro **`self`**, la definición correcta sería:
{% code overflow="wrap" %}
```cpp
IOUserClient2022::dispatchExternalMethod(self, unsigned int, IOExternalMethodArgumentsOpaque*, IOExternalMethodDispatch2022 const*, unsigned long, OSObject*, void*)
```
{% endcode %}
En realidad, puedes encontrar la definición real en [https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388):
```cpp
IOUserClient2022::dispatchExternalMethod(uint32_t selector, IOExternalMethodArgumentsOpaque *arguments,
const IOExternalMethodDispatch2022 dispatchArray[], size_t dispatchArrayCount,
OSObject * target, void * reference)
```
Con esta información puedes reescribir Ctrl+Right -> `Editar firma de función` y establecer los tipos conocidos:
<figure><img src="../../../.gitbook/assets/image (702).png" alt=""><figcaption></figcaption></figure>
El nuevo código descompilado se verá así:
<figure><img src="../../../.gitbook/assets/image (703).png" alt=""><figcaption></figcaption></figure>
Para el siguiente paso necesitamos haber definido la estructura **`IOExternalMethodDispatch2022`**. Es de código abierto en [https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176](https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176), puedes definirla así:
<figure><img src="../../../.gitbook/assets/image (698).png" alt=""><figcaption></figcaption></figure>
Ahora, siguiendo `(IOExternalMethodDispatch2022 *)&sIOExternalMethodArray` puedes ver muchos datos:
<figure><img src="../../../.gitbook/assets/image (704).png" alt="" width="563"><figcaption></figcaption></figure>
Cambia el tipo de datos a **`IOExternalMethodDispatch2022:`**
<figure><img src="../../../.gitbook/assets/image (705).png" alt="" width="375"><figcaption></figcaption></figure>
después del cambio:
<figure><img src="../../../.gitbook/assets/image (707).png" alt="" width="563"><figcaption></figcaption></figure>
Y como ahora sabemos que tenemos una **matriz de 7 elementos** (verifica el código descompilado final), haz clic para crear una matriz de 7 elementos:
<figure><img src="../../../.gitbook/assets/image (708).png" alt="" width="563"><figcaption></figcaption></figure>
Después de crear la matriz puedes ver todas las funciones exportadas:
<figure><img src="../../../.gitbook/assets/image (709).png" alt=""><figcaption></figcaption></figure>
{% hint style="success" %}
Si recuerdas, para **llamar** una función **exportada** desde el espacio de usuario no necesitamos llamar al nombre de la función, sino al **número de selector**. Aquí puedes ver que el selector **0** es la función **`initializeDecoder`**, el selector **1** es **`startDecoder`**, el selector **2** es **`initializeEncoder`**...
{% endhint %}
<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>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live).
* **Comparte tus trucos de hacking enviando PR a** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **y** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
</details>

View file

@ -18,24 +18,28 @@ Mach utiliza **tareas** como la **unidad más pequeña** para compartir recursos
La comunicación entre tareas se realiza a través de la Comunicación entre Procesos de Mach (IPC), utilizando canales de comunicación unidireccionales. Los **mensajes se transfieren entre puertos**, que actúan como **colas de mensajes** gestionadas por el kernel.
Cada proceso tiene una **tabla IPC**, donde es posible encontrar los **puertos Mach del proceso**. El nombre de un puerto Mach es en realidad un número (un puntero al objeto del kernel).
Un proceso también puede enviar un nombre de puerto con algunos derechos **a una tarea diferente**, y el kernel hará que esta entrada aparezca en la **tabla IPC de la otra tarea**.
Los derechos de puerto, que definen las operaciones que una tarea puede realizar, son clave en esta comunicación. Los posibles **derechos de puerto** son:
* **Derecho de recepción**, que permite recibir mensajes enviados al puerto. Los puertos de Mach son colas MPSC (multiple-producer, single-consumer), lo que significa que solo puede haber **un derecho de recepción para cada puerto** en todo el sistema (a diferencia de las tuberías, donde varios procesos pueden tener descriptores de archivo para el extremo de lectura de una tubería).
* **Derecho de recepción**, que permite recibir mensajes enviados al puerto. Los puertos Mach son colas MPSC (multiple-producer, single-consumer), lo que significa que solo puede haber **un derecho de recepción para cada puerto** en todo el sistema (a diferencia de las tuberías, donde varios procesos pueden tener descriptores de archivo para el extremo de lectura de una tubería).
* Una **tarea con el derecho de recepción** puede recibir mensajes y **crear derechos de envío**, lo que le permite enviar mensajes. Originalmente, solo la **propia tarea tiene el derecho de recepción sobre su puerto**.
* **Derecho de envío**, que permite enviar mensajes al puerto.
* El derecho de envío se puede **clonar** para que una tarea que posea un derecho de envío pueda clonar el derecho y **concedérselo a una tercera tarea**.
* El derecho de envío se puede **clonar**, por lo que una tarea que posee un derecho de envío puede clonar el derecho y **concedérselo a una tercera tarea**.
* **Derecho de envío único**, que permite enviar un mensaje al puerto y luego desaparece.
* **Derecho de conjunto de puertos**, que denota un _conjunto de puertos_ en lugar de un solo puerto. Desencolar un mensaje de un conjunto de puertos desencola un mensaje de uno de los puertos que contiene. Los conjuntos de puertos se pueden utilizar para escuchar varios puertos simultáneamente, de manera similar a `select`/`poll`/`epoll`/`kqueue` en Unix.
* **Nombre muerto**, que no es un derecho de puerto real, sino simplemente un marcador de posición. Cuando se destruye un puerto, todos los derechos de puerto existentes para el puerto se convierten en nombres muertos.
**Las tareas pueden transferir derechos de ENVÍO a otros**, lo que les permite enviar mensajes de vuelta. **Los derechos de ENVÍO también se pueden clonar, por lo que una tarea puede duplicar y dar el derecho a una tercera tarea**. Esto, combinado con un proceso intermediario conocido como el **servidor de arranque**, permite una comunicación efectiva entre tareas.
**Las tareas pueden transferir derechos de ENVÍO a otros**, lo que les permite enviar mensajes de vuelta. Los **derechos de ENVÍO también se pueden clonar**, por lo que una tarea puede duplicar y dar el derecho a una tercera tarea. Esto, combinado con un proceso intermediario conocido como el **servidor de arranque**, permite una comunicación efectiva entre tareas.
#### Pasos:
Como se menciona, para establecer el canal de comunicación, está involucrado el **servidor de arranque** (**launchd** en Mac).
1. La tarea **A** inicia un **nuevo puerto**, obteniendo un **derecho de RECEPCIÓN** en el proceso.
2. La tarea **A**, al ser la titular del derecho de RECEPCIÓN, **genera un derecho de ENVÍO para el puerto**.
2. La tarea **A**, siendo la titular del derecho de RECEPCIÓN, **genera un derecho de ENVÍO para el puerto**.
3. La tarea **A** establece una **conexión** con el **servidor de arranque**, proporcionando el **nombre del servicio del puerto** y el **derecho de ENVÍO** a través de un procedimiento conocido como registro de arranque.
4. La tarea **B** interactúa con el **servidor de arranque** para ejecutar una **búsqueda de arranque para el servicio**. Si tiene éxito, el **servidor duplica el derecho de ENVÍO** recibido de la tarea A y **lo transmite a la tarea B**.
5. Al adquirir un derecho de ENVÍO, la tarea **B** es capaz de **formular** un **mensaje** y enviarlo **a la tarea A**.
@ -51,13 +55,37 @@ Para estos servicios predefinidos, el **proceso de búsqueda difiere ligeramente
* La tarea **A** (el servicio) realiza un **registro de arranque**. Aquí, el servidor de arranque crea un derecho de ENVÍO, lo retiene y **transfiere el derecho de RECEPCIÓN a la tarea A**.
* launchd duplica el **derecho de ENVÍO y lo envía a la tarea B**.
Sin embargo, este proceso solo se aplica a las tareas predefinidas del sistema. Las tareas que no son del sistema aún funcionan como se describe originalmente, lo que podría permitir la suplantación.
Sin embargo, este proceso solo se aplica a las tareas predefinidas del sistema. Las tareas que no son del sistema aún operan como se describe originalmente, lo que podría permitir la suplantación.
### Enumerar puertos
To enumerate ports on a target system, you can use various tools and techniques. One common method is to use a port scanning tool like Nmap. Nmap allows you to scan a range of IP addresses and identify open ports on those systems.
To perform a basic port scan using Nmap, you can use the following command:
```
nmap <target_ip>
```
Replace `<target_ip>` with the IP address of the system you want to scan. This command will scan the most common ports and display the results.
You can also specify a range of ports to scan using the `-p` option. For example, to scan ports 1 to 1000, you can use the following command:
```
nmap -p 1-1000 <target_ip>
```
Nmap provides various options and scan types that you can explore to customize your port scanning process. It is important to note that port scanning can be considered intrusive and may be illegal or against the terms of service in certain situations. Always ensure you have proper authorization before performing any port scanning activities.
```bash
lsmp -p <pid>
```
Puedes instalar esta herramienta en iOS descargándola desde [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)
### Ejemplo de código
Observa cómo el **receptor** **asigna** un puerto, crea un **derecho de envío** para el nombre `org.darlinghq.example` y lo envía al **servidor de inicio** mientras el receptor solicita el **derecho de envío** de ese nombre y lo utiliza para **enviar un mensaje**.
Observa cómo el **emisor** **asigna** un puerto, crea un **derecho de envío** para el nombre `org.darlinghq.example` y lo envía al **servidor de inicio** mientras que el emisor solicitó el **derecho de envío** de ese nombre y lo utilizó para **enviar un mensaje**.
{% tabs %}
{% tab title="receptor.c" %}
{% tab title="receiver.c" %}
```c
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
// gcc receiver.c -o receiver
@ -160,6 +188,16 @@ int main(int argc, char** argv) {
return 1;
}
// Receive a response from the server
kr = mach_msg(msg, MACH_RCV_MSG, 0, msg->msgh_size, server_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
if (kr != KERN_SUCCESS) {
printf("Failed to receive message: %s\n", mach_error_string(kr));
return 1;
}
// Print the response
printf("Received message: %s\n", buffer);
return 0;
}
```
@ -495,7 +533,7 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
En macOS, los **hilos** pueden ser manipulados a través de **Mach** o utilizando la API de **pthread** de tipo **posix**. El hilo que generamos en la inyección anterior fue generado utilizando la API de Mach, por lo que **no es compatible con posix**.
Fue posible **inyectar un shellcode simple** para ejecutar un comando porque no era necesario trabajar con APIs compatibles con posix, solo con Mach. Inyecciones **más complejas** requerirían que el hilo también sea compatible con posix.
Fue posible **inyectar un shellcode simple** para ejecutar un comando porque no era necesario trabajar con APIs compatibles con posix, solo con Mach. Inyecciones **más complejas** requerirían que el hilo también sea **compatible con posix**.
Por lo tanto, para **mejorar el hilo**, se debe llamar a **`pthread_create_from_mach_thread`**, que creará un pthread válido. Luego, este nuevo pthread podría **llamar a dlopen** para **cargar una dylib** del sistema, por lo que en lugar de escribir nuevo shellcode para realizar diferentes acciones, es posible cargar bibliotecas personalizadas.
@ -777,7 +815,7 @@ else
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
./inject <pid-of-mysleep> </path/to/lib.dylib>
```
### Secuestro de hilos a través del puerto de tarea <a href="#paso-1-secuestro-de-hilos" id="paso-1-secuestro-de-hilos"></a>
### Secuestro de hilo a través del puerto de tarea <a href="#paso-1-secuestro-de-hilo" id="paso-1-secuestro-de-hilo"></a>
En esta técnica se secuestra un hilo del proceso:
@ -789,7 +827,7 @@ En esta técnica se secuestra un hilo del proceso:
### Información básica
XPC, que significa Comunicación entre Procesos de XNU (el kernel utilizado por macOS), es un marco para la **comunicación entre procesos** en macOS e iOS. XPC proporciona un mecanismo para realizar **llamadas de método seguras y asíncronas entre diferentes procesos** en el sistema. Es parte del paradigma de seguridad de Apple, que permite la **creación de aplicaciones con privilegios separados** donde cada **componente** se ejecuta con **solo los permisos necesarios** para realizar su trabajo, limitando así el daño potencial de un proceso comprometido.
XPC, que significa Comunicación Interproceso XNU (el kernel utilizado por macOS), es un marco para la **comunicación entre procesos** en macOS e iOS. XPC proporciona un mecanismo para realizar **llamadas de método seguras y asíncronas entre diferentes procesos** en el sistema. Es parte del paradigma de seguridad de Apple, que permite la **creación de aplicaciones con privilegios separados** donde cada **componente** se ejecuta con **solo los permisos necesarios** para realizar su trabajo, limitando así el daño potencial de un proceso comprometido.
Para obtener más información sobre cómo funciona esta **comunicación** y cómo **puede ser vulnerable**, consulta:
@ -797,7 +835,7 @@ Para obtener más información sobre cómo funciona esta **comunicación** y có
[macos-xpc](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/)
{% endcontent-ref %}
## MIG - Generador de Interfaz Mach
## MIG - Generador de interfaz Mach
MIG fue creado para **simplificar el proceso de creación de código de IPC de Mach**. Básicamente, **genera el código necesario** para que el servidor y el cliente se comuniquen con una definición dada. Aunque el código generado puede ser feo, un desarrollador solo necesitará importarlo y su código será mucho más simple que antes.
@ -819,7 +857,7 @@ Para obtener más información, consulta:
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).

View file

@ -45,7 +45,7 @@ Swift tiene su propia **convención de llamada** que se puede encontrar en [**ht
### **Instrucciones Comunes**
Las instrucciones de ARM64 generalmente tienen el **formato `opcode dst, src1, src2`**, donde **`opcode`** es la **operación** que se va a realizar (como `add`, `sub`, `mov`, etc.), **`dst`** es el registro **destino** donde se almacenará el resultado, y **`src1`** y **`src2`** son los registros **fuente**. También se pueden usar valores inmediatos en lugar de registros fuente.
Las instrucciones de ARM64 generalmente tienen el **formato `opcode dst, src1, src2`**, donde **`opcode`** es la **operación** que se va a realizar (como `add`, `sub`, `mov`, etc.), **`dst`** es el registro **destino** donde se almacenará el resultado, y **`src1`** y **`src2`** son los registros **fuente**. También se pueden utilizar valores inmediatos en lugar de registros fuente.
* **`mov`**: **Mover** un valor de un **registro** a otro.
* Ejemplo: `mov x0, x1` — Esto mueve el valor de `x1` a `x0`.
@ -59,23 +59,23 @@ Las instrucciones de ARM64 generalmente tienen el **formato `opcode dst, src1, s
* Ejemplo: `stp x0, x1, [x2]` — Esto almacena `x0` y `x1` en las ubicaciones de memoria en `x2` y `x2 + 8`, respectivamente.
* **`add`**: **Sumar** los valores de dos registros y almacenar el resultado en un registro.
* Ejemplo: `add x0, x1, x2` — Esto suma los valores en `x1` y `x2` y almacena el resultado en `x0`.
* **`sub`**: **Restar** los valores de dos registros y almacenar el resultado en un registro.
* **`sub`**: **Resta** los valores de dos registros y almacena el resultado en un registro.
* Ejemplo: `sub x0, x1, x2` — Esto resta el valor en `x2` de `x1` y almacena el resultado en `x0`.
* **`mul`**: **Multiplicar** los valores de **dos registros** y almacenar el resultado en un registro.
* **`mul`**: **Multiplica** los valores de **dos registros** y almacena el resultado en un registro.
* Ejemplo: `mul x0, x1, x2` — Esto multiplica los valores en `x1` y `x2` y almacena el resultado en `x0`.
* **`div`**: **Dividir** el valor de un registro por otro y almacenar el resultado en un registro.
* **`div`**: **Divide** el valor de un registro por otro y almacena el resultado en un registro.
* Ejemplo: `div x0, x1, x2` — Esto divide el valor en `x1` por `x2` y almacena el resultado en `x0`.
* **`bl`**: **Branch with link**, utilizado para **llamar** a una **subrutina**. Almacena la **dirección de retorno en `x30`**.
* **`bl`**: **Branch with link**, se utiliza para **llamar** a una **subrutina**. Almacena la **dirección de retorno en `x30`**.
* Ejemplo: `bl myFunction` — Esto llama a la función `myFunction` y almacena la dirección de retorno en `x30`.
* **`blr`**: **Branch with Link to Register**, utilizado para **llamar** a una **subrutina** donde el destino está **especificado** en un **registro**. Almacena la dirección de retorno en `x30`.
* **`blr`**: **Branch with Link to Register**, se utiliza para **llamar** a una **subrutina** donde el destino está **especificado** en un **registro**. Almacena la dirección de retorno en `x30`.
* Ejemplo: `blr x1` — Esto llama a la función cuya dirección está contenida en `x1` y almacena la dirección de retorno en `x30`.
* **`ret`**: **Retorno** de una **subrutina**, típicamente utilizando la dirección en **`x30`**.
* **`ret`**: **Retorna** de una **subrutina**, típicamente utilizando la dirección en **`x30`**.
* Ejemplo: `ret` — Esto retorna de la subrutina actual utilizando la dirección de retorno en `x30`.
* **`cmp`**: **Comparar** dos registros y establecer banderas de condición.
* **`cmp`**: **Compara** dos registros y establece las banderas de condición.
* Ejemplo: `cmp x0, x1` — Esto compara los valores en `x0` y `x1` y establece las banderas de condición en consecuencia.
* **`b.eq`**: **Branch if equal**, basado en la instrucción `cmp` previa.
* Ejemplo: `b.eq label` — Si la instrucción `cmp` previa encontró dos valores iguales, esto salta a `label`.
* **`b.ne`**: **Branch if Not Equal**. Esta instrucción verifica las banderas de condición (que fueron establecidas por una instrucción de comparación previa), y si los valores comparados no son iguales, salta a una etiqueta o dirección.
* **`b.eq`**: **Branch if equal**, basado en la instrucción `cmp` anterior.
* Ejemplo: `b.eq label` — Si la instrucción `cmp` anterior encontró dos valores iguales, esto salta a `label`.
* **`b.ne`**: **Branch if Not Equal**. Esta instrucción verifica las banderas de condición (que fueron establecidas por una instrucción de comparación anterior), y si los valores comparados no son iguales, salta a una etiqueta o dirección.
* Ejemplo: Después de una instrucción `cmp x0, x1`, `b.ne label` — Si los valores en `x0` y `x1` no son iguales, esto salta a `label`.
* **`cbz`**: **Compare and Branch on Zero**. Esta instrucción compara un registro con cero, y si son iguales, salta a una etiqueta o dirección.
* Ejemplo: `cbz x0, label` — Si el valor en `x0` es cero, esto salta a `label`.
@ -83,11 +83,11 @@ Las instrucciones de ARM64 generalmente tienen el **formato `opcode dst, src1, s
* Ejemplo: `cbnz x0, label` — Si el valor en `x0` no es cero, esto salta a `label`.
* **`adrp`**: Calcula la **dirección de página de un símbolo** y la almacena en un registro.
* Ejemplo: `adrp x0, symbol` — Esto calcula la dirección de página de `symbol` y la almacena en `x0`.
* **`ldrsw`**: **Cargar** un valor firmado de **32 bits** desde la memoria y **extenderlo a 64 bits**.
* **`ldrsw`**: **Carga** un valor firmado de **32 bits** desde la memoria y lo **extiende a 64 bits**.
* Ejemplo: `ldrsw x0, [x1]` — Esto carga un valor firmado de 32 bits desde la ubicación de memoria apuntada por `x1`, lo extiende a 64 bits y lo almacena en `x0`.
* **`stur`**: **Almacenar un valor de registro en una ubicación de memoria**, utilizando un desplazamiento desde otro registro.
* **`stur`**: **Almacena un valor de registro en una ubicación de memoria**, utilizando un desplazamiento desde otro registro.
* Ejemplo: `stur x0, [x1, #4]` — Esto almacena el valor en `x0` en la dirección de memoria que es 4 bytes mayor que la dirección actual en `x1`.
* &#x20;**`svc`** : Realizar una **llamada al sistema**. Significa "Supervisor Call". Cuando el procesador ejecuta esta instrucción, **cambia del modo de usuario al modo kernel** y salta a una ubicación específica en la memoria donde se encuentra el código de manejo de llamadas al sistema del kernel.
* &#x20;**`svc`** : Realiza una **llamada al sistema**. Significa "Supervisor Call". Cuando el procesador ejecuta esta instrucción, **cambia del modo de usuario al modo kernel** y salta a una ubicación específica en la memoria donde se encuentra el código de manejo de llamadas al sistema del kernel.
* Ejemplo:&#x20;
```armasm
@ -98,33 +98,49 @@ svc 0 ; Realiza la llamada al sistema.
### **Prólogo de la función**
1. **Guardar el registro de enlace y el puntero de marco en la pila**:
1. **Guarda el registro de enlace y el puntero de marco en la pila**:
{% code overflow="wrap" %}
```armasm
stp x29, x30, [sp, #-16]! ; almacena el par x29 y x30 en la pila y decrementa el puntero de pila
```
{% endcode %}
2. **Configurar el nuevo puntero de marco**: `mov x29, sp` (configura el nuevo puntero de marco para la función actual)
3. **Asignar espacio en la pila para variables locales** (si es necesario): `sub sp, sp, <tamaño>` (donde `<tamaño>` es el número de bytes necesarios)
2. **Configura el nuevo puntero de marco**: `mov x29, sp` (configura el nuevo puntero de marco para la función actual)
3. **Asigna espacio en la pila para variables locales** (si es necesario): `sub sp, sp, <size>` (donde `<size>` es el número de bytes necesarios)
### **Epílogo de la función**
1. **Desasignar variables locales (si se asignaron)**: `add sp, sp, <tamaño>`
2. **Restaurar el registro de enlace y el puntero de marco**:
1. **Desasigna las variables locales (si se asignaron)**: `add sp, sp, <size>`
2. **Restaura el registro de enlace y el puntero de marco**:
{% code overflow="wrap" %}
```armasm
ldp x29, x30, [sp], #16 ; carga el par x29 y x30 desde la pila e incrementa el puntero de pila
```
{% endcode %}
3. **Retornar**: `ret` (devuelve el control al llamador utilizando la dirección en el registro de enlace)
3. **Retorna**: `ret` (devuelve el control al llamador utilizando la dirección en el registro de enlace)
## macOS
### syscalls
### Llamadas al sistema BSD
Consulta [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master).
Consulta [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master). Las llamadas al sistema BSD tendrán **x16 > 0**.
### Trampas de Mach
Consulta [**syscall\_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall\_sw.c.auto.html). Las trampas de Mach tendrán **x16 < 0**, por lo que debes llamar a los números de la lista anterior con un **signo menos**: **`_kernelrpc_mach_vm_allocate_trap`** es **`-10`**.
También puedes consultar **`libsystem_kernel.dylib`** en un desensamblador para encontrar cómo llamar a estas llamadas al sistema (y a las llamadas al sistema BSD).
```bash
# macOS
dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
# iOS
dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64
```
{% hint style="success" %}
A veces es más fácil verificar el código **descompilado** de **`libsystem_kernel.dylib`** que verificar el **código fuente** porque el código de varias llamadas al sistema (BSD y Mach) se genera mediante scripts (verificar comentarios en el código fuente), mientras que en la dylib se puede encontrar qué se está llamando.
{% endhint %}
### Shellcodes

View file

@ -22,7 +22,7 @@ Los principales beneficios de XPC incluyen:
1. **Seguridad**: Al separar el trabajo en diferentes procesos, cada proceso puede recibir solo los permisos que necesita. Esto significa que incluso si un proceso está comprometido, tiene una capacidad limitada para causar daño.
2. **Estabilidad**: XPC ayuda a aislar los bloqueos en el componente donde ocurren. Si un proceso se bloquea, se puede reiniciar sin afectar al resto del sistema.
3. **Rendimiento**: XPC permite una fácil concurrencia, ya que diferentes tareas se pueden ejecutar simultáneamente en diferentes procesos.
3. **Rendimiento**: XPC permite una fácil concurrencia, ya que diferentes tareas pueden ejecutarse simultáneamente en diferentes procesos.
La única **desventaja** es que **separar una aplicación en varios procesos** que se comunican a través de XPC es **menos eficiente**. Pero en los sistemas actuales esto apenas se nota y los beneficios son mayores.
@ -94,6 +94,19 @@ Apple también permite que las aplicaciones **configuren algunos derechos y cóm
[macos-xpc-authorization.md](macos-xpc-authorization.md)
{% endcontent-ref %}
## Espía XPC
Para espiar los mensajes XPC, puedes usar [**xpcspy**](https://github.com/hot3eed/xpcspy) que utiliza **Frida**.
```bash
# Install
pip3 install xpcspy
pip3 install xpcspy --no-deps # To not make xpcspy install Frida 15 and downgrade your Frida installation
# Start sniffing
xpcspy -U -r -W <bundle-id>
## Using filters (i: for input, o: for output)
xpcspy -U <prog-name> -t 'i:com.apple.*' -t 'o:com.apple.*' -r
```
## Ejemplo de código en C
{% tabs %}
@ -302,54 +315,18 @@ return 0;
# xyz.hacktricks.svcoc.plist
Este archivo de propiedad de la lista de servicios de macOS (plist) se utiliza para definir los servicios que se ejecutan en segundo plano en un proceso separado. Los servicios se comunican entre sí utilizando el marco XPC (Interfaz de comunicación entre procesos).
Este archivo de propiedad de la lista de servicios de macOS (plist) se utiliza para definir los servicios que se ejecutan en segundo plano en un sistema macOS. Los servicios se definen utilizando el formato XPC (Interfaz de Comunicación entre Procesos) y se pueden utilizar para la comunicación entre procesos en macOS.
## Ubicación del archivo
El archivo plist contiene una serie de claves y valores que definen el servicio y su comportamiento. Algunas de las claves comunes incluyen:
El archivo `xyz.hacktricks.svcoc.plist` se encuentra en la siguiente ubicación en macOS:
- `Label`: El nombre único del servicio.
- `ProgramArguments`: Los argumentos del programa que se ejecutará como parte del servicio.
- `MachServices`: Los servicios Mach que el servicio puede utilizar para la comunicación entre procesos.
- `Sockets`: Los sockets que el servicio puede utilizar para la comunicación entre procesos.
```
/Library/LaunchDaemons/xyz.hacktricks.svcoc.plist
```
Para aprovecharse de un archivo plist de servicio, un atacante puede modificar el archivo para ejecutar su propio código malicioso en el contexto del servicio. Esto puede permitir al atacante obtener privilegios elevados en el sistema o realizar otras acciones maliciosas.
## Contenido del archivo
El archivo plist contiene información sobre el servicio, incluyendo su nombre, ruta de ejecución, argumentos y más. Aquí hay un ejemplo de cómo se ve el contenido del archivo:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>xyz.hacktricks.svcoc</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/python</string>
<string>/path/to/script.py</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
```
## Modificación del archivo
Para modificar el archivo `xyz.hacktricks.svcoc.plist`, se puede utilizar un editor de texto o la utilidad `plutil` en la línea de comandos. Asegúrese de tener privilegios de administrador para realizar cambios en el archivo.
## Reinicio del servicio
Después de realizar cambios en el archivo plist, se debe reiniciar el servicio para que los cambios surtan efecto. Esto se puede hacer utilizando el comando `launchctl` en la línea de comandos:
```
sudo launchctl unload /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist
sudo launchctl load /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist
```
Esto detendrá y reiniciará el servicio `xyz.hacktricks.svcoc`.
Es importante asegurarse de que los archivos plist de servicio estén correctamente configurados y protegidos para evitar posibles abusos y ataques de escalada de privilegios.
{% endtab %}
```xml
@ -395,62 +372,57 @@ sudo rm /Library/LaunchDaemons/xyz.hacktricks.svcoc.plist /tmp/oc_xpc_server
```
## Cliente dentro de un código Dylb
The Dylb code allows the creation of a client that can communicate with a server using the XPC mechanism in macOS. This client code can be embedded within an application or script to establish a connection with the server and exchange messages.
The Dylb code allows the creation of a client that can communicate with a server using the XPC framework in macOS. This client code can be embedded within an application to establish inter-process communication (IPC) with the server.
To create a client inside a Dylb code, follow these steps:
1. Import the necessary modules:
```python
import os
import sys
from Foundation import NSXPCConnection, NSXPCInterface
1. Import the necessary frameworks:
```objective-c
#import <Foundation/Foundation.h>
#import <xpc/xpc.h>
```
2. Define the server interface:
```python
server_interface = NSXPCInterface.interfaceWithProtocol_(YourServerProtocol)
```
Replace `YourServerProtocol` with the protocol defined for the server.
2. Define the XPC connection and event handler:
```objective-c
static xpc_connection_t connection;
static dispatch_queue_t queue;
3. Create the connection to the server:
```python
connection = NSXPCConnection.alloc().initWithMachServiceName_options_(YourServerMachServiceName, 0)
```
Replace `YourServerMachServiceName` with the Mach service name of the server.
4. Set the server interface for the connection:
```python
connection.setRemoteObjectInterface_(server_interface)
void eventHandler(xpc_object_t event) {
// Handle incoming events from the server
// ...
}
```
5. Define the completion handler for the connection:
```python
def connection_handler():
# Handle connection completion
pass
3. Implement the client code:
```objective-c
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Create the XPC connection
connection = xpc_connection_create_mach_service("com.example.server", queue, XPC_CONNECTION_MACH_SERVICE_PRIVILEGED);
connection.setInvalidationHandler_(connection_handler)
// Set the event handler
xpc_connection_set_event_handler(connection, ^(xpc_object_t event) {
eventHandler(event);
});
6. Establish the connection:
```python
connection.resume()
// Resume the connection
xpc_connection_resume(connection);
// Send messages to the server
// ...
// Run the main loop
dispatch_main();
}
return 0;
}
```
7. Use the connection to send messages to the server:
```python
# Example message sending
connection.remoteObjectProxy().yourServerMethodWithCompletion_(yourParameter, completionHandler)
```
Replace `yourServerMethodWithCompletion_` with the method you want to call on the server, and `yourParameter` with the appropriate parameter for the method.
4. Customize the code as needed, such as adding message sending functionality or handling server responses.
8. Handle the server's response in the completion handler:
```python
def completionHandler(response):
# Handle server response
pass
```
Remember to replace `"com.example.server"` with the actual Mach service name of the server you want to communicate with.
By following these steps, you can create a client inside a Dylb code that can communicate with a server using the XPC mechanism in macOS.
By embedding this client code within your application, you can establish IPC with a server using the XPC framework in macOS. This allows for secure and efficient communication between processes.
```objectivec
// gcc -dynamiclib -framework Foundation oc_xpc_client.m -o oc_xpc_client.dylib
// gcc injection example:

View file

@ -78,17 +78,17 @@ Parece que era posible utilizar la herramienta [**img4tool**](https://github.com
```bash
img4tool -e in.img4 -o out.bin
```
Sin embargo, no he podido compilarlo en M1.
Sin embargo, no he podido compilarlo en M1. También puedes usar [**pyimg4**](https://github.com/m1stadev/PyIMG4), pero el siguiente script no funciona con esa salida.
Entonces, podrías usar un script como [**este**](https://gist.github.com/xpn/66dc3597acd48a4c31f5f77c3cc62f30) para extraer datos.
Luego, puedes usar un script como [**este**](https://gist.github.com/xpn/66dc3597acd48a4c31f5f77c3cc62f30) para extraer datos.
A partir de esos datos, puedes verificar las aplicaciones con un valor de **restricciones de inicio de `0`**, que son las que no tienen restricciones ([**ver aquí**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056) para saber qué significa cada valor).
A partir de esos datos, puedes verificar las aplicaciones con un valor de **restricciones de inicio de `0`**, que son las que no están restringidas ([**ver aquí**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056) para saber qué significa cada valor).
<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>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres que tu **empresa sea anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**

View file

@ -153,11 +153,22 @@ Para iniciar una aplicación con un **perfil de sandbox específico**, puedes us
```bash
sandbox-exec -f example.sb /Path/To/The/Application
```
El archivo `touch.sb` es un archivo de política de sandbox para macOS. Define las restricciones de seguridad para la aplicación `touch`. El sandbox es un mecanismo de seguridad que limita los recursos y las acciones que una aplicación puede realizar en el sistema operativo. Esto ayuda a prevenir posibles vulnerabilidades y protege el sistema de posibles ataques.
El archivo `touch.sb` contiene una política de sandboxing para restringir los privilegios de la aplicación `touch`. Esta política asegura que la aplicación solo tenga acceso a los recursos y funcionalidades permitidos, evitando así posibles vulnerabilidades y ataques de escalada de privilegios.
El archivo `touch.sb` contiene reglas que especifican los permisos y las restricciones para la aplicación `touch`. Estas reglas definen qué recursos puede acceder la aplicación, como archivos, directorios, redes y servicios del sistema. También especifica las acciones que la aplicación puede realizar, como leer, escribir o ejecutar archivos.
La política de sandboxing establece las siguientes restricciones:
Al utilizar el archivo `touch.sb`, se puede restringir el acceso de la aplicación `touch` a ciertos recursos y acciones, lo que ayuda a proteger el sistema contra posibles abusos o ataques maliciosos. Es importante configurar adecuadamente las reglas de sandbox para garantizar la seguridad del sistema y prevenir posibles vulnerabilidades.
- Acceso solo lectura a los archivos en el directorio `/usr/share/doc`.
- Acceso de escritura solo a los archivos en el directorio `/tmp`.
- Acceso solo lectura a los archivos en el directorio `/usr/share/man`.
- Acceso solo lectura a los archivos en el directorio `/usr/share/locale`.
- Acceso solo lectura a los archivos en el directorio `/usr/share/terminfo`.
- Acceso solo lectura a los archivos en el directorio `/usr/share/misc`.
- Acceso solo lectura a los archivos en el directorio `/usr/share/zoneinfo`.
- Acceso solo lectura a los archivos en el directorio `/usr/share/ssl`.
- Acceso solo lectura a los archivos en el directorio `/usr/share/curl`.
- Acceso solo lectura a los archivos en el directorio `/usr/share/zsh`.
Estas restricciones garantizan que la aplicación `touch` solo pueda leer y escribir en los directorios y archivos especificados, limitando su capacidad para acceder a otros recursos del sistema operativo. Esto ayuda a prevenir posibles ataques y protege la integridad y seguridad del sistema.
```scheme
(version 1)
(deny default)
@ -218,9 +229,13 @@ macOS almacena los perfiles de sandbox del sistema en dos ubicaciones: **/usr/sh
Y si una aplicación de terceros tiene la autorización _**com.apple.security.app-sandbox**_, el sistema aplica el perfil **/System/Library/Sandbox/Profiles/application.sb** a ese proceso.
### Depurar y Bypass Sandbox
### **Perfil de Sandbox de iOS**
**Los procesos no nacen aislados en el sandbox en macOS: a diferencia de iOS**, donde el sandbox se aplica por el kernel antes de que se ejecute la primera instrucción de un programa, en macOS **un proceso debe elegir colocarse en el sandbox.**
El perfil predeterminado se llama **container** y no tenemos la representación de texto SBPL. En memoria, este sandbox se representa como un árbol binario de Permitir/Denegar para cada permiso del sandbox.
### Depurar y Bypass del Sandbox
**Los procesos no nacen aislados en macOS: a diferencia de iOS**, donde el sandbox se aplica por el kernel antes de que se ejecute la primera instrucción de un programa, en macOS **un proceso debe elegir colocarse en el sandbox.**
Los procesos se aíslan automáticamente desde el espacio de usuario cuando se inician si tienen la autorización: `com.apple.security.app-sandbox`. Para obtener una explicación detallada de este proceso, consulta: